gwenhywfar  5.10.1
tm2c_setter.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_setter.h"
16 #include "tm2c_misc.h"
17 
18 #include <gwenhywfar/debug.h>
19 
20 #include <ctype.h>
21 
22 
23 
31 
32 
33 
34 
36 {
37  TYPEMAKER2_MEMBER_LIST *tml;
38 
40  if (tml) {
42 
43  tm=Typemaker2_Member_List_First(tml);
44  while (tm) {
46  TYPEMAKER2_TYPE *mty;
47  int rv;
48 
50  assert(mty);
51 
52  rv=_addSetterPrototype(tb, ty, tm);
53  if (rv<0) {
54  DBG_INFO(NULL, "here (%d)", rv);
55  return rv;
56  }
57 
59  /* add special functions for flags */
60  rv=_addFlagFnsPrototype(tb, ty, tm);
61  if (rv<0) {
62  DBG_INFO(NULL, "here (%d)", rv);
63  return rv;
64  }
65  }
66 
67  rv=_addSetterImplementation(tb, ty, tm);
68  if (rv<0) {
69  DBG_INFO(NULL, "here (%d)", rv);
70  return rv;
71  }
72 
74  _addFlagFnsImplementation(tb, ty, tm);
75  } /* if not OMIT */
76 
77  tm=Typemaker2_Member_List_Next(tm);
78  }
79  }
80 
81  return 0;
82 }
83 
84 
85 
87 {
89  TYPEMAKER2_TYPE *mty;
90  GWEN_BUFFER *tbuf;
91  const char *s;
92 
93  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
94 
97  assert(mty);
98 
99  /* prototype */
101  "/** Setter.\n"
102  " * Use this function to set the member \"%s\" (see @ref %s_%s)\n*/\n",
106 
109  GWEN_Buffer_AppendString(tbuf, s);
110  GWEN_Buffer_AppendString(tbuf, " ");
111  }
112 
113  _addSetterFnDeclaration(ty, tm, tbuf);
114  GWEN_Buffer_AppendString(tbuf, ";\n");
115 
116  switch (Typemaker2_Member_GetAccess(tm)) {
119  break;
122  break;
125  break;
128  break;
129  default:
130  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid access type");
131  GWEN_Buffer_free(tbuf);
132  return GWEN_ERROR_BAD_DATA;
133  }
134  GWEN_Buffer_free(tbuf);
135 
136  return 0;
137 }
138 
139 
140 
142 {
143  TYPEMAKER2_TYPE *mty;
144  const char *s;
145 
147 
150  "void %s_Set%c%s(%s *p_struct, ",
152  toupper(*s),
153  s+1,
155 
157  TYPEMAKER2_ENUM *te;
158  const char *s;
159 
161  assert(te);
163  if (!(s && *s))
165  GWEN_Buffer_AppendArgs(tbuf, "%s p_src", s);
166  }
171  GWEN_Buffer_AppendString(tbuf, "const ");
172  GWEN_Buffer_AppendArgs(tbuf, "%s *p_src", Typemaker2_Type_GetIdentifier(mty));
173  }
174  else {
176  }
177  GWEN_Buffer_AppendString(tbuf, ")");
178 }
179 
180 
181 
183 {
184  TYPEMAKER2_TYPE *mty;
185  GWEN_BUFFER *tbuf;
186  int rv;
187 
188  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
189 
191  assert(mty);
192 
193  /* implementation */
194  _addSetterFnDeclaration(ty, tm, tbuf);
195  GWEN_Buffer_AppendString(tbuf, "{\n");
196 
197  GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
198 
200  rv=TM2C_AddReleaseOldValueCode(tb, ty, tm, tbuf);
201  if (rv<0) {
202  DBG_INFO(NULL, "here (%d)", rv);
203  GWEN_Buffer_free(tbuf);
204  return rv;
205  }
206  } /* if own */
207 
208 
210  rv=_addDupNewValueCode(tb, ty, tm, tbuf);
211  if (rv<0) {
212  DBG_INFO(NULL, "here (%d)", rv);
213  GWEN_Buffer_free(tbuf);
214  return rv;
215  }
216  }
217  else {
218  rv=_addAssignNewValueCode(tb, ty, tm, tbuf);
219  if (rv<0) {
220  DBG_INFO(NULL, "here (%d)", rv);
221  GWEN_Buffer_free(tbuf);
222  return rv;
223  }
224  }
225 
226  GWEN_Buffer_AppendString(tbuf, "}\n");
228  GWEN_Buffer_free(tbuf);
229 
230  return 0;
231 }
232 
233 
234 
236 {
237  TYPEMAKER2_TYPE *mty;
238  GWEN_BUFFER *srcbuf;
239  int rv;
240 
242  assert(mty);
243 
245  GWEN_Buffer_AppendArgs(tbuf, " if (p_struct->%s) {\n", Typemaker2_Member_GetName(tm));
246 
247  /* invoke free */
248  srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
249  GWEN_Buffer_AppendArgs(srcbuf, "p_struct->%s", Typemaker2_Member_GetName(tm));
250 
251  GWEN_Buffer_AppendString(tbuf, " ");
253  GWEN_Buffer_GetStart(srcbuf),
254  NULL, /* no dest */
255  tbuf);
256  if (rv<0) {
257  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
258  GWEN_Buffer_free(srcbuf);
259  return rv;
260  }
261  GWEN_Buffer_AppendString(tbuf, "\n");
262  GWEN_Buffer_free(srcbuf);
263 
264 
266  GWEN_Buffer_AppendString(tbuf, " }\n");
267  }
268 
269  return 0;
270 }
271 
272 
273 
275 {
276  TYPEMAKER2_TYPE *mty;
277  GWEN_BUFFER *dstbuf;
278  int rv;
279 
281  assert(mty);
282 
284  GWEN_Buffer_AppendString(tbuf, " if (p_src) {\n");
285 
286  /* dup */
287  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
288  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", Typemaker2_Member_GetName(tm));
289  GWEN_Buffer_AppendString(tbuf, " ");
290  rv=Typemaker2_Builder_Invoke_DupFn(tb, ty, tm, "p_src", GWEN_Buffer_GetStart(dstbuf), tbuf);
291  GWEN_Buffer_free(dstbuf);
292  if (rv<0) {
293  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
294  return rv;
295  }
296  GWEN_Buffer_AppendString(tbuf, "\n");
297 
299  GWEN_Buffer_AppendString(tbuf, " }\n");
300  GWEN_Buffer_AppendString(tbuf, " else {\n");
301  GWEN_Buffer_AppendArgs(tbuf, " p_struct->%s=NULL;\n", Typemaker2_Member_GetName(tm));
302  GWEN_Buffer_AppendString(tbuf, " }\n");
303  }
304 #if 0
305  else {
306  rv=_addAssignNewValueCode(tb, ty, tm, tbuf);
307  if (rv<0) {
308  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
309  return rv;
310  }
311  }
312 #endif
313  GWEN_Buffer_AppendString(tbuf, "\n");
314 
315  return 0;
316 }
317 
318 
319 
321 {
322  TYPEMAKER2_TYPE *mty;
323  GWEN_BUFFER *dstbuf;
324  int rv;
325 
327  assert(mty);
328 
329  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
330  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", Typemaker2_Member_GetName(tm));
331 
332  GWEN_Buffer_AppendString(tbuf, " ");
333  rv=Typemaker2_Builder_Invoke_AssignFn(tb, ty, tm, "p_src", GWEN_Buffer_GetStart(dstbuf), tbuf);
334  GWEN_Buffer_free(dstbuf);
335  if (rv<0) {
336  DBG_INFO(NULL, "here (%d)", rv);
337  return rv;
338  }
339  GWEN_Buffer_AppendString(tbuf, "\n");
340 
341  return 0;
342 }
343 
344 
345 
346 
348 {
350  TYPEMAKER2_TYPE *mty;
351  GWEN_BUFFER *tbuf;
352  const char *sApi;
353  const char *s;
354 
355  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
356 
359  assert(mty);
360 
362 
364 
366  "/** Add flags.\n"
367  " * Use this function to add flags to member \"%s\" (see @ref %s_%s)\n*/\n",
372  GWEN_Buffer_AppendArgs(tbuf, "%s ", sApi);
374  "void %s_Add%c%s(%s *p_struct, %s p_src);\n",
376  toupper(*s),
377  s+1,
380 
382  "/** Add flags.\n"
383  " * Use this function to add flags to member \"%s\" (see @ref %s_%s)\n*/\n",
388  GWEN_Buffer_AppendArgs(tbuf, "%s ", sApi);
390  "void %s_Sub%c%s(%s *p_struct, %s p_src);\n",
392  toupper(*s),
393  s+1,
396 
397  switch (Typemaker2_Member_GetAccess(tm)) {
400  break;
403  break;
406  break;
409  break;
410  default:
411  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid access type");
412  GWEN_Buffer_free(tbuf);
413  return GWEN_ERROR_BAD_DATA;
414  }
415  GWEN_Buffer_free(tbuf);
416 
417  return 0;
418 }
419 
420 
421 
423 {
424  TYPEMAKER2_TYPE *mty;
425  GWEN_BUFFER *tbuf;
426  const char *s;
427 
428  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
429 
431  assert(mty);
432 
434 
436  "void %s_Add%c%s(%s *p_struct, %s p_src) {\n"
437  " assert(p_struct);\n"
438  " p_struct->%s|=p_src;\n"
439  "}\n",
441  toupper(*s),
442  s+1,
445  s);
446  GWEN_Buffer_AppendString(tbuf, "\n\n");
447 
449  "void %s_Sub%c%s(%s *p_struct, %s p_src) {\n"
450  " assert(p_struct);\n"
451  " p_struct->%s&=~p_src;\n"
452  "}\n",
454  toupper(*s),
455  s+1,
458  s);
459  GWEN_Buffer_AppendString(tbuf, "\n\n");
460 
461 
463  GWEN_Buffer_free(tbuf);
464 }
465 
466 
467 
468 
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:133
#define TYPEMAKER2_FLAGS_WITH_FLAGS
Definition: tm_type.h:49
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
int Typemaker2_Builder_Invoke_DupFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
TYPEMAKER2_ENUM * Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:485
int TM2C_BuildSetter(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_setter.c:35
#define NULL
Definition: binreloc.c:300
#define GWEN_LOGDOMAIN
Definition: logger.h:35
#define TYPEMAKER2_FLAGS_DUP
Definition: tm_type.h:35
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
int Typemaker2_Builder_Invoke_DestructFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
#define TYPEMAKER2_FLAGS_OMIT
Definition: tm_type.h:41
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
static int _addDupNewValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_setter.c:274
static int _addAssignNewValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_setter.c:320
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 int _addSetterImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_setter.c:182
static int _addFlagFnsPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_setter.c:347
int _addReleaseOldValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_setter.c:235
#define TYPEMAKER2_FLAGS_CONST
Definition: tm_type.h:33
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
#define TYPEMAKER2_FLAGS_OWN
Definition: tm_type.h:31
#define TYPEMAKER2_FLAGS_ENUM
Definition: tm_type.h:38
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:641
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
static void _addFlagFnsImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_setter.c:422
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
static int _addSetterPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_setter.c:86
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_Member_GetSetFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:259
int Typemaker2_Builder_Invoke_AssignFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
int TM2C_AddReleaseOldValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_misc.c:23
static void _addSetterFnDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_setter.c:141
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