gwenhywfar 5.14.1
tm2c_list1.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_list1.h"
16#include "tm2c_misc.h"
17
18#include <gwenhywfar/debug.h>
19
20#include <ctype.h>
21
22
26
30
34
38
39
40
41
42
44{
45 int rv;
46
47 _addGetByMemberProtoType(tb, ty, tm);
48 rv=_addGetByMemberImplementation(tb, ty, tm);
49 if (rv<0) {
50 DBG_INFO(NULL, "here (%d)", rv);
51 return rv;
52 }
53
54 return 0;
55}
56
57
58
60{
61 int rv;
62
65 if (rv<0) {
66 DBG_INFO(NULL, "here (%d)", rv);
67 return rv;
68 }
69
70 return 0;
71}
72
73
74
76{
77 int rv;
78
79 _addSortByMemberProtoType(tb, ty, tm);
81
84 if (rv<0) {
85 DBG_INFO(NULL, "here (%d)", rv);
86 return rv;
87 }
88
89 return 0;
90}
91
92
93
94
95
96
98{
99 GWEN_BUFFER *tbuf;
100 const char *s;
102 TYPEMAKER2_TYPE *mty;
103
106 assert(mty);
107
108 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
109
111 if (s)
112 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
113 _addGetByMemberDeclaration(ty, tm, tbuf);
114 GWEN_Buffer_AppendString(tbuf, ";\n");
115
117 GWEN_Buffer_free(tbuf);
118}
119
120
121
123{
124 GWEN_BUFFER *tbuf;
125 TYPEMAKER2_TYPE *mty;
126 const char *sTypeId;
127 const char *sTypePrefix;
128 const char *sMemberName;
129
131 assert(mty);
132
134 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
135 sMemberName=Typemaker2_Member_GetName(tm);
136
137 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
138
139 _addGetByMemberDeclaration(ty, tm, tbuf);
140 GWEN_Buffer_AppendString(tbuf, "{\n");
141
142 GWEN_Buffer_AppendArgs(tbuf, " %s *p_struct;\n\n", sTypeId);
143 GWEN_Buffer_AppendString(tbuf, " assert(p_list);\n");
144 GWEN_Buffer_AppendArgs(tbuf, " p_struct = %s_List_First(p_list);\n", sTypePrefix);
145 GWEN_Buffer_AppendString(tbuf, " while(p_struct) {\n");
146 GWEN_Buffer_AppendString(tbuf, " int p_rv;\n");
147 GWEN_Buffer_AppendString(tbuf, "\n");
148
149 GWEN_Buffer_AppendString(tbuf, " ");
150 if (1) {
151 GWEN_BUFFER *dstbuf;
152 GWEN_BUFFER *srcbuf;
153 int rv;
154
155 srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
156 GWEN_Buffer_AppendString(srcbuf, "p_cmp");
157
158 dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
159 GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
160
162 GWEN_Buffer_GetStart(srcbuf),
163 GWEN_Buffer_GetStart(dstbuf),
164 tbuf);
165 GWEN_Buffer_free(srcbuf);
166 GWEN_Buffer_free(dstbuf);
167 if (rv<0) {
168 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
169 GWEN_Buffer_free(tbuf);
170 return rv;
171 }
172 GWEN_Buffer_AppendString(tbuf, "\n");
173 }
174
175
176 GWEN_Buffer_AppendString(tbuf, " if (p_rv == 0)\n");
177 GWEN_Buffer_AppendString(tbuf, " return p_struct;\n");
178 GWEN_Buffer_AppendArgs(tbuf, " p_struct = %s_List_Next(p_struct);\n", sTypePrefix);
179 GWEN_Buffer_AppendString(tbuf, " }\n");
180
181 GWEN_Buffer_AppendString(tbuf, " return NULL;\n");
182 GWEN_Buffer_AppendString(tbuf, "}\n");
183
185 GWEN_Buffer_free(tbuf);
186
187 return 0;
188}
189
190
191
193{
194 TYPEMAKER2_TYPE *mty;
195 const char *sTypeId;
196 const char *sTypePrefix;
197 const char *sMemberName;
198 const char *sMemberTypeId;
199
201 assert(mty);
202
204 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
205 sMemberName=Typemaker2_Member_GetName(tm);
206 sMemberTypeId=Typemaker2_Type_GetIdentifier(mty);
207
209 "%s *%s_List_GetBy%c%s(const %s_LIST *p_list, ",
210 sTypeId,
211 sTypePrefix,
212 toupper(*sMemberName),
213 sMemberName+1,
214 sTypeId);
217 GWEN_Buffer_AppendArgs(tbuf, " const %s *", sMemberTypeId);
218 else
219 GWEN_Buffer_AppendArgs(tbuf, "%s ", sMemberTypeId);
220 GWEN_Buffer_AppendString(tbuf, "p_cmp)");
221}
222
223
224
226{
227 const char *sTypeId;
228 const char *sTypePrefix;
229
231 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
232
234 "%s_LIST *%s_List_dup(const %s_LIST *p_src)",
235 sTypeId,
236 sTypePrefix,
237 sTypeId);
238}
239
240
241
242
243
244
246{
247 GWEN_BUFFER *tbuf;
248 const char *s;
250
252
253 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
254
256 if (s)
257 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
258 _addListDupDeclaration(ty, tbuf);
259 GWEN_Buffer_AppendString(tbuf, ";\n");
260
262 GWEN_Buffer_free(tbuf);
263}
264
265
266
268{
269 GWEN_BUFFER *tbuf;
270 const char *sTypeId;
271 const char *sTypePrefix;
272
274 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
275
276 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
277
278 _addListDupDeclaration(ty, tbuf);
279 GWEN_Buffer_AppendString(tbuf, " {\n");
280
281 GWEN_Buffer_AppendArgs(tbuf, " %s_LIST *p_dest;\n", sTypeId);
282 GWEN_Buffer_AppendArgs(tbuf, " %s *p_elem;\n", sTypeId);
283 GWEN_Buffer_AppendString(tbuf, "\n");
284 GWEN_Buffer_AppendString(tbuf, " assert(p_src);\n");
285 GWEN_Buffer_AppendArgs(tbuf, " p_dest=%s_List_new();\n", sTypePrefix);
286 GWEN_Buffer_AppendArgs(tbuf, " p_elem=%s_List_First(p_src);\n", sTypePrefix);
287 GWEN_Buffer_AppendString(tbuf, " while(p_elem) {\n");
288 GWEN_Buffer_AppendArgs(tbuf, " %s *p_cpy;\n\n", sTypeId);
289 GWEN_Buffer_AppendArgs(tbuf, " p_cpy=%s_dup(p_elem);\n", sTypePrefix);
290 GWEN_Buffer_AppendArgs(tbuf, " %s_List_Add(p_cpy, p_dest);\n", sTypePrefix);
291 GWEN_Buffer_AppendArgs(tbuf, " p_elem=%s_List_Next(p_elem);\n", sTypePrefix);
292 GWEN_Buffer_AppendString(tbuf, " }\n");
293 GWEN_Buffer_AppendString(tbuf, "\n");
294
295 GWEN_Buffer_AppendString(tbuf, " return p_dest;\n");
296 GWEN_Buffer_AppendString(tbuf, "}\n");
297
299 GWEN_Buffer_free(tbuf);
300
301 return 0;
302}
303
304
305
306
307
308
309
311{
312 GWEN_BUFFER *tbuf;
313 const char *s;
315 TYPEMAKER2_TYPE *mty;
316
319 assert(mty);
320
321 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
322
324 if (s)
325 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
326 _addSortByMemberDeclaration(ty, tm, tbuf);
327 GWEN_Buffer_AppendString(tbuf, ";\n");
328
330 GWEN_Buffer_free(tbuf);
331}
332
333
334
336{
337 GWEN_BUFFER *tbuf;
338 TYPEMAKER2_TYPE *mty;
339 const char *sTypeId;
340 const char *sTypePrefix;
341 const char *sMemberName;
342
344 assert(mty);
345
347 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
348 sMemberName=Typemaker2_Member_GetName(tm);
349
350 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
351
352 _addSortByMemberDeclaration(ty, tm, tbuf);
353 GWEN_Buffer_AppendString(tbuf, "{\n");
354
355 GWEN_Buffer_AppendArgs(tbuf, " %s_LIST_SORT_FN oldSortFn;\n", sTypeId);
356 GWEN_Buffer_AppendString(tbuf, "\n");
357 GWEN_Buffer_AppendArgs(tbuf, " oldSortFn=%s_List_SetSortFn(p_list, %s_List_Compare_%c%s);\n",
358 sTypePrefix, sTypePrefix, toupper(*sMemberName), sMemberName+1);
359 GWEN_Buffer_AppendArgs(tbuf, " %s_List_Sort(p_list, p_ascending);\n", sTypePrefix);
360 GWEN_Buffer_AppendArgs(tbuf, " %s_List_SetSortFn(p_list, oldSortFn);\n", sTypePrefix);
361 GWEN_Buffer_AppendString(tbuf, "}\n");
362
364 GWEN_Buffer_free(tbuf);
365}
366
367
368
370{
371 TYPEMAKER2_TYPE *mty;
372 const char *sTypeId;
373 const char *sTypePrefix;
374 const char *sMemberName;
375
377 assert(mty);
378
380 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
381 sMemberName=Typemaker2_Member_GetName(tm);
382
384 "void %s_List_SortBy%c%s(%s_LIST *p_list, int p_ascending)",
385 sTypePrefix,
386 toupper(*sMemberName),
387 sMemberName+1,
388 sTypeId);
389}
390
391
392
394{
395 GWEN_BUFFER *tbuf;
396
397 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
398
399 GWEN_Buffer_AppendString(tbuf, "static ");
400 _addCompareMemberDeclaration(ty, tm, tbuf);
401 GWEN_Buffer_AppendString(tbuf, ";\n");
402
404 GWEN_Buffer_free(tbuf);
405}
406
407
408
410{
411 GWEN_BUFFER *tbuf;
412 TYPEMAKER2_TYPE *mty;
413 const char *sMemberName;
414
416 assert(mty);
417
418 sMemberName=Typemaker2_Member_GetName(tm);
419
420 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
421
422 _addCompareMemberDeclaration(ty, tm, tbuf);
423 GWEN_Buffer_AppendString(tbuf, "{\n");
424 GWEN_Buffer_AppendString(tbuf, " int p_rv;\n");
425 GWEN_Buffer_AppendString(tbuf, "\n");
426
427 if (1) {
428 GWEN_BUFFER *dstbuf;
429 GWEN_BUFFER *srcbuf;
430 int rv;
431
432 srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
433 GWEN_Buffer_AppendArgs(srcbuf, "p_a->%s", sMemberName);
434
435 dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
436 GWEN_Buffer_AppendArgs(dstbuf, "p_b->%s", sMemberName);
437
439 GWEN_Buffer_GetStart(srcbuf),
440 GWEN_Buffer_GetStart(dstbuf),
441 tbuf);
442 GWEN_Buffer_free(srcbuf);
443 GWEN_Buffer_free(dstbuf);
444 if (rv<0) {
445 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
446 GWEN_Buffer_free(tbuf);
447 return rv;
448 }
449 GWEN_Buffer_AppendString(tbuf, "\n");
450 }
451
452 GWEN_Buffer_AppendString(tbuf, " if (p_ascending)\n");
453 GWEN_Buffer_AppendString(tbuf, " return p_rv;\n");
454 GWEN_Buffer_AppendString(tbuf, " else\n");
455 GWEN_Buffer_AppendString(tbuf, " return -p_rv;\n");
456 GWEN_Buffer_AppendString(tbuf, "}\n");
457
459 GWEN_Buffer_free(tbuf);
460
461 return 0;
462}
463
464
465
467{
468 TYPEMAKER2_TYPE *mty;
469 const char *sTypeId;
470 const char *sTypePrefix;
471 const char *sMemberName;
472
474 assert(mty);
475
477 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
478 sMemberName=Typemaker2_Member_GetName(tm);
479
481 "int GWENHYWFAR_CB %s_List_Compare_%c%s(const %s *p_a, const %s *p_b, int p_ascending)",
482 sTypePrefix,
483 toupper(*sMemberName),
484 sMemberName+1,
485 sTypeId,
486 sTypeId);
487}
488
489
#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
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_LOGDOMAIN
Definition logger.h:32
static int _addListDupImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_list1.c:267
static void _addCompareMemberDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_list1.c:466
static void _addGetByMemberDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_list1.c:192
int TM2C_BuildList1Dup(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_list1.c:59
static int _addCompareMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_list1.c:409
static void _addListDupDeclaration(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
Definition tm2c_list1.c:225
static void _addSortByMemberProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_list1.c:310
static void _addSortByMemberDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_list1.c:369
int TM2C_BuildList1GetByMember(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_list1.c:43
static void _addSortByMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_list1.c:335
static void _addListDupProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_list1.c:245
int TM2C_BuildList1SortByMember(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_list1.c:75
static int _addGetByMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_list1.c:122
static void _addCompareMemberProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_list1.c:393
static void _addGetByMemberProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_list1.c:97
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_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_CompareFn(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
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:467
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
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition tm_type.h:21
@ TypeMaker2_Type_Array
Definition tm_type.h:79
@ TypeMaker2_Type_Pointer
Definition tm_type.h:78
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER