gwenhywfar  5.10.1
tm2c_getter.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Thu Jul 02 2009
3  copyright : (C) 2018 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * Please see toplevel file COPYING for license details *
8  ***************************************************************************/
9 
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13 
14 
15 #include "tm2c_getter.h"
16 
17 #include <gwenhywfar/debug.h>
18 
19 #include <ctype.h>
20 
21 
22 
27 
28 
29 
30 
31 
33 {
34  TYPEMAKER2_MEMBER_LIST *tml;
35  uint32_t flags;
36 
37  flags=Typemaker2_Type_GetFlags(ty);
38 
39  /* probably add getter for signalObject */
41  _addSignalObjects(tb, ty);
42 
43 
45  if (tml) {
47 
48  tm=Typemaker2_Member_List_First(tml);
49  while (tm) {
51  int rv;
52 
53  rv=_addMemberProtoTypes(tb, ty, tm);
54  if (rv<0) {
55  DBG_INFO(NULL, "here (%d)", rv);
56  return rv;
57  }
58 
59  _addMemberImplementation(tb, ty, tm);
60  }
61 
62  tm=Typemaker2_Member_List_Next(tm);
63  }
64  }
65 
66  return 0;
67 }
68 
69 
70 
72 {
73  GWEN_BUFFER *tbuf;
75  const char *sTypeId;
76  const char *sTypePrefix;
77  const char *sApi;
78 
81  sTypePrefix=Typemaker2_Type_GetPrefix(ty);
83 
84  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
85 
86  /* prototype */
87  if (sApi && *sApi)
88  GWEN_Buffer_AppendArgs(tbuf, "%s ", sApi);
89 
91  "GWEN_SIGNALOBJECT *%s_GetSignalObject(const %s *p_struct);\n",
92  sTypePrefix, sTypeId);
93 
95  GWEN_Buffer_Reset(tbuf);
96 
97  /* implementation */
99  "GWEN_SIGNALOBJECT *%s_GetSignalObject(const %s *p_struct) {\n",
100  sTypePrefix, sTypeId);
101 
102  GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
103  GWEN_Buffer_AppendString(tbuf, " return p_struct->_signalObject;\n");
104 
105  GWEN_Buffer_AppendString(tbuf, "}\n");
106 
108  GWEN_Buffer_free(tbuf);
109 }
110 
111 
112 
114 {
116  TYPEMAKER2_TYPE *mty;
117  GWEN_BUFFER *tbuf;
118  const char *sApi;
119 
122 
124  assert(mty);
125 
126  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
127 
128  /* apidoc */
130  "/** Getter.\n"
131  " * Use this function to get the member \"%s\" (see @ref %s_%s)\n*/\n",
135 
136  /* prototype */
138  GWEN_Buffer_AppendArgs(tbuf, "%s ", sApi);
139 
140  _addFunctionDeclaration(ty, tm, tbuf);
141 
142  GWEN_Buffer_AppendString(tbuf, ";\n");
143 
144  switch (Typemaker2_Member_GetAccess(tm)) {
147  break;
150  break;
153  break;
156  break;
157  default:
158  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid access type");
159  GWEN_Buffer_free(tbuf);
160  return GWEN_ERROR_BAD_DATA;
161  }
162  GWEN_Buffer_free(tbuf);
163 
164  return 0;
165 }
166 
167 
168 
170 {
171  TYPEMAKER2_TYPE *mty;
172  GWEN_BUFFER *tbuf;
173 
175  assert(mty);
176 
177  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
178 
179  _addFunctionDeclaration(ty, tm, tbuf);
180 
181  GWEN_Buffer_AppendString(tbuf, "{\n");
182 
183  GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
184  GWEN_Buffer_AppendArgs(tbuf, " return p_struct->%s;\n", Typemaker2_Member_GetName(tm));
185 
186  GWEN_Buffer_AppendString(tbuf, "}\n");
187 
189 
190  GWEN_Buffer_free(tbuf);
191 }
192 
193 
194 
196 {
197  TYPEMAKER2_TYPE *mty;
198  const char *sTypeId;
199  const char *sTypePrefix;
200  const char *sMemberName;
201  const char *s;
202 
203  sTypeId=Typemaker2_Type_GetIdentifier(ty);
204  sTypePrefix=Typemaker2_Type_GetPrefix(ty);
205  sMemberName=Typemaker2_Member_GetName(tm);
206 
208  assert(mty);
209 
210 
211  /* determine and write return type */
212  /* const return value? */
216  GWEN_Buffer_AppendString(tbuf, "const ");
217 
218  /* enum return value? */
220  TYPEMAKER2_ENUM *te;
221  const char *s;
222 
224  assert(te);
226  if (s && *s)
227  GWEN_Buffer_AppendString(tbuf, s);
228  else {
230  GWEN_Buffer_AppendString(tbuf, s);
231  }
232  }
233  else {
235  GWEN_Buffer_AppendString(tbuf, s);
236  }
237 
238  GWEN_Buffer_AppendString(tbuf, " ");
239 
240  /* pointer return value? */
243  GWEN_Buffer_AppendString(tbuf, "*");
244 
245  /* function name */
246  GWEN_Buffer_AppendArgs(tbuf, "%s_Get%c%s(", sTypePrefix, toupper(*sMemberName), sMemberName+1);
247 
249  GWEN_Buffer_AppendString(tbuf, "const ");
250 
251  GWEN_Buffer_AppendArgs(tbuf, "%s *p_struct)", sTypeId);
252 }
253 
254 
255 
256 
257 
static int _addMemberProtoTypes(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_getter.c:113
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:133
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:467
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:237
TYPEMAKER2_ENUM * Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:485
#define NULL
Definition: binreloc.c:300
int TM2C_BuildGetter(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_getter.c:32
static void _addFunctionDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_getter.c:195
#define GWEN_LOGDOMAIN
Definition: logger.h:35
#define TYPEMAKER2_TYPEFLAGS_WITH_SLOTS
Definition: tm_type.h:63
uint32_t Typemaker2_Member_GetGetFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:281
struct TYPEMAKER2_ENUM TYPEMAKER2_ENUM
Definition: tm_enum.h:24
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
#define TYPEMAKER2_FLAGS_OMIT
Definition: tm_type.h:41
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:196
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
int Typemaker2_Member_GetAccess(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:347
#define TYPEMAKER2_TYPEFLAGS_WITH_SIGNALS
Definition: tm_type.h:62
#define TYPEMAKER2_FLAGS_NOCONSTOBJECT
Definition: tm_type.h:45
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:543
void Typemaker2_Builder_AddProtectedDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:188
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
static void _addMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_getter.c:169
#define TYPEMAKER2_FLAGS_CONST
Definition: tm_type.h:33
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
#define TYPEMAKER2_FLAGS_ENUM
Definition: tm_type.h:38
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:641
static void _addSignalObjects(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_getter.c:71
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:204
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition: tm_type.h:21
void Typemaker2_Builder_AddPublicDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:172
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
void Typemaker2_Builder_AddLibraryDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:180
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
int Typemaker2_Type_GetType(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:171
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:341
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
const char * Typemaker2_Enum_GetType(const TYPEMAKER2_ENUM *p_struct)
Definition: tm_enum.c:192
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989