gwenhywfar  5.10.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 
29 static void _addListDupDeclaration(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf);
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 
63  _addListDupProtoType(tb, ty);
64  rv=_addListDupImplementation(tb, ty);
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);
80  _addCompareMemberProtoType(tb, ty, tm);
81 
83  rv=_addCompareMemberImplementation(tb, ty, tm);
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 
133  sTypeId=Typemaker2_Type_GetIdentifier(ty);
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 
203  sTypeId=Typemaker2_Type_GetIdentifier(ty);
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 
230  sTypeId=Typemaker2_Type_GetIdentifier(ty);
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 
273  sTypeId=Typemaker2_Type_GetIdentifier(ty);
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 
346  sTypeId=Typemaker2_Type_GetIdentifier(ty);
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 
379  sTypeId=Typemaker2_Type_GetIdentifier(ty);
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 
476  sTypeId=Typemaker2_Type_GetIdentifier(ty);
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 
int Typemaker2_Builder_Invoke_CompareFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
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
static void _addSortByMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_list1.c:335
#define NULL
Definition: binreloc.c:300
static void _addCompareMemberDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_list1.c:466
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:196
int TM2C_BuildList1Dup(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_list1.c:59
static void _addListDupProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_list1.c:245
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:543
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
static void _addGetByMemberDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_list1.c:192
static int _addGetByMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_list1.c:122
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
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
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition: tm_type.h:21
static void _addListDupDeclaration(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
Definition: tm2c_list1.c:225
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
int TM2C_BuildList1SortByMember(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_list1.c:75
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
static void _addCompareMemberProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_list1.c:393
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
static int _addCompareMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_list1.c:409
int TM2C_BuildList1GetByMember(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_list1.c:43
static void _addGetByMemberProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_list1.c:97
static int _addListDupImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_list1.c:267
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
static void _addSortByMemberDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_list1.c:369
static void _addSortByMemberProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_list1.c:310
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989