gwenhywfar 5.14.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
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 ");
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
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition buffer.c:1087
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define GWEN_ERROR_BAD_DATA
Definition error.h:121
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_LOGDOMAIN
Definition logger.h:32
int TM2C_AddReleaseOldValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_misc.c:23
static int _addDupNewValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
int _addReleaseOldValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
static void _addFlagFnsImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
int TM2C_BuildSetter(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_setter.c:35
static int _addAssignNewValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
static int _addSetterPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_setter.c:86
static void _addSetterFnDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
static int _addSetterImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
static int _addFlagFnsPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:204
void Typemaker2_Builder_AddPublicDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:172
void Typemaker2_Builder_AddLibraryDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:180
void Typemaker2_Builder_AddProtectedDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:188
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:196
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition tm_builder.c:133
int Typemaker2_Builder_Invoke_DestructFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
int Typemaker2_Builder_Invoke_DupFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition tm_builder.h:26
int Typemaker2_Builder_Invoke_AssignFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
const char * Typemaker2_Enum_GetType(const TYPEMAKER2_ENUM *p_struct)
Definition tm_enum.c:192
struct TYPEMAKER2_ENUM TYPEMAKER2_ENUM
Definition tm_enum.h:24
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:467
uint32_t Typemaker2_Member_GetSetFlags(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:259
TYPEMAKER2_ENUM * Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:485
int Typemaker2_Member_GetAccess(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:347
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:237
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:83
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition tm_member.h:21
int Typemaker2_Type_GetType(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:171
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:585
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:607
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:683
#define TYPEMAKER2_FLAGS_DUP
Definition tm_type.h:35
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition tm_type.h:21
#define TYPEMAKER2_FLAGS_CONST
Definition tm_type.h:33
#define TYPEMAKER2_FLAGS_ENUM
Definition tm_type.h:38
@ TypeMaker2_Access_Private
Definition tm_type.h:89
@ TypeMaker2_Access_Library
Definition tm_type.h:88
@ TypeMaker2_Access_Protected
Definition tm_type.h:87
@ TypeMaker2_Access_Public
Definition tm_type.h:86
@ TypeMaker2_Type_Array
Definition tm_type.h:79
@ TypeMaker2_Type_Pointer
Definition tm_type.h:78
#define TYPEMAKER2_FLAGS_OMIT
Definition tm_type.h:41
#define TYPEMAKER2_FLAGS_WITH_FLAGS
Definition tm_type.h:49
#define TYPEMAKER2_FLAGS_OWN
Definition tm_type.h:31
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER