gwenhywfar  5.10.1
tm_builder.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Thu Jul 02 2009
3  copyright : (C) 2009 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 "tm_builder_p.h"
16 #include "tm_member.h"
17 
18 #include <gwenhywfar/debug.h>
19 #include <gwenhywfar/misc.h>
20 
21 #include <assert.h>
22 #include <errno.h>
23 #include <string.h>
24 #include <ctype.h>
25 
26 
27 
28 /* ------------------------------------------------------------------------------------------------
29  * forward declarations
30  * ------------------------------------------------------------------------------------------------
31  */
32 
33 
34 static void setCharValueWithTypePrefix(GWEN_DB_NODE *db, const char *prefix, const char *varName, const char *value);
36  TYPEMAKER2_TYPE *ty,
38  GWEN_DB_NODE *db,
39  int withTypePrefix);
40 
41 
42 /* ------------------------------------------------------------------------------------------------
43  * implementations
44  * ------------------------------------------------------------------------------------------------
45  */
46 
47 
48 
50 
51 
52 
54 {
56 
59 
60  tb->declarationsPublic=GWEN_StringList_new();
61  tb->declarationsLibrary=GWEN_StringList_new();
62  tb->declarationsProtected=GWEN_StringList_new();
63  tb->declarationsPrivate=GWEN_StringList_new();
64  tb->code=GWEN_StringList_new();
65 
66  return tb;
67 }
68 
69 
70 
72 {
73  if (tb) {
75 
76  GWEN_StringList_free(tb->declarationsPublic);
77  GWEN_StringList_free(tb->declarationsLibrary);
78  GWEN_StringList_free(tb->declarationsProtected);
79  GWEN_StringList_free(tb->declarationsPrivate);
80  GWEN_StringList_free(tb->code);
81  free(tb->fileNamePublic);
82  free(tb->fileNameLibrary);
83  free(tb->fileNameProtected);
84  free(tb->fileNamePrivate);
85  free(tb->fileNameCode);
86  free(tb->destFolder);
87  GWEN_FREE_OBJECT(tb);
88  }
89 }
90 
91 
92 
94 {
95  assert(tb);
96  return tb->declarationsPublic;
97 }
98 
99 
100 
102 {
103  assert(tb);
104  return tb->declarationsLibrary;
105 }
106 
107 
108 
110 {
111  assert(tb);
112  return tb->declarationsProtected;
113 }
114 
115 
116 
118 {
119  assert(tb);
120  return tb->declarationsPrivate;
121 }
122 
123 
124 
126 {
127  assert(tb);
128  return tb->code;
129 }
130 
131 
132 
134 {
135  assert(tb);
136  return tb->typeManager;
137 }
138 
139 
140 
142 {
143  assert(tb);
144  tb->typeManager=tm;
145 }
146 
147 
148 
149 void Typemaker2_Builder_AddDeclaration(TYPEMAKER2_BUILDER *tb, int access, const char *s)
150 {
151  switch (access) {
154  break;
157  break;
160  break;
163  break;
164  default:
165  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid access type");
166  break;
167  }
168 }
169 
170 
171 
173 {
174  assert(tb);
175  GWEN_StringList_AppendString(tb->declarationsPublic, s, 0, 0);
176 }
177 
178 
179 
181 {
182  assert(tb);
183  GWEN_StringList_AppendString(tb->declarationsLibrary, s, 0, 0);
184 }
185 
186 
187 
189 {
190  assert(tb);
191  GWEN_StringList_AppendString(tb->declarationsProtected, s, 0, 0);
192 }
193 
194 
195 
197 {
198  assert(tb);
199  GWEN_StringList_AppendString(tb->declarationsPrivate, s, 0, 0);
200 }
201 
202 
203 
205 {
206  assert(tb);
207  GWEN_StringList_AppendString(tb->code, s, 0, 0);
208 }
209 
210 
211 
213 {
214  assert(tb);
215  return tb->fileNamePublic;
216 }
217 
218 
219 
221 {
222  assert(tb);
223  free(tb->fileNamePublic);
224  if (s)
225  tb->fileNamePublic=strdup(s);
226  else
227  tb->fileNamePublic=NULL;
228 }
229 
230 
231 
233 {
234  assert(tb);
235  return tb->fileNameLibrary;
236 }
237 
238 
239 
241 {
242  assert(tb);
243  free(tb->fileNameLibrary);
244  if (s)
245  tb->fileNameLibrary=strdup(s);
246  else
247  tb->fileNameLibrary=NULL;
248 }
249 
250 
251 
253 {
254  assert(tb);
255  return tb->fileNameProtected;
256 }
257 
258 
259 
261 {
262  assert(tb);
263  free(tb->fileNameProtected);
264  if (s)
265  tb->fileNameProtected=strdup(s);
266  else
267  tb->fileNameProtected=NULL;
268 }
269 
270 
271 
273 {
274  assert(tb);
275  return tb->fileNamePrivate;
276 }
277 
278 
279 
281 {
282  assert(tb);
283  free(tb->fileNamePrivate);
284  if (s)
285  tb->fileNamePrivate=strdup(s);
286  else
287  tb->fileNamePrivate=NULL;
288 }
289 
290 
291 
293 {
294  assert(tb);
295  return tb->fileNameCode;
296 }
297 
298 
299 
301 {
302  assert(tb);
303  free(tb->fileNameCode);
304  if (s)
305  tb->fileNameCode=strdup(s);
306  else
307  tb->fileNameCode=NULL;
308 }
309 
310 
311 
313 {
314  assert(tb);
315  return tb->sourceFileName;
316 }
317 
318 
319 
321 {
322  assert(tb);
323  free(tb->sourceFileName);
324  if (s)
325  tb->sourceFileName=strdup(s);
326  else
327  tb->sourceFileName=NULL;
328 }
329 
330 
331 
333 {
334  assert(tb);
335  return tb->destFolder;
336 }
337 
338 
339 
341 {
342  assert(tb);
343  free(tb->destFolder);
344  if (s)
345  tb->destFolder=strdup(s);
346  else
347  tb->destFolder=NULL;
348 }
349 
350 
351 
353 {
354  assert(tb);
355  tb->buildFn=fn;
356 }
357 
358 
359 
361 {
362  assert(tb);
363  if (tb->buildFn)
364  return tb->buildFn(tb, ty);
365  else
367 }
368 
369 
370 
372  TYPEMAKER2_TYPE *ty,
373  TYPEMAKER2_MEMBER *tm,
374  const char *src,
375  const char *dst)
376 {
377  GWEN_DB_NODE *db;
378  const char *s;
379 
380  db=GWEN_DB_Group_new("vars");
381 
382  if (tb->typeManager) {
383  s=Typemaker2_TypeManager_GetApiDeclaration(tb->typeManager);
384  if (s && *s)
386  else
388  }
389 
390  /* set some type vars */
391  if (ty) {
392  TYPEMAKER2_TYPE *bty;
393  TYPEMAKER2_MEMBER_LIST *tml;
394 
396  if (s && *s)
397  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "struct_type", s);
398 
400  if (s && *s)
401  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "struct_prefix", s);
402 
404  if (bty) {
406  if (s && *s)
407  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "basetype_type", s);
408 
410  if (s && *s)
411  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "basetype_prefix", s);
412  }
413 
415  if (tml) {
416  TYPEMAKER2_MEMBER *tmm;
417 
418  tmm=Typemaker2_Member_List_First(tml);
419  while (tmm) {
420  /* write members with prefix */
421  addMemberInfoToCallDb(tb, ty, tmm, db, 1);
422  tmm=Typemaker2_Member_List_Next(tmm);
423  }
424  }
425  }
426 
427  /* set some member vars */
428  if (tm)
429  /* write specific member without prefix */
430  addMemberInfoToCallDb(tb, ty, tm, db, 0);
431 
432  /* set src and dst */
433  if (src && *src)
435  if (dst && *dst)
437 
438  /* set some fixed vars */
439  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "retval", "p_rv");
441  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "buffer", "p_buffer");
442 
443  return db;
444 }
445 
446 
447 
450  TYPEMAKER2_MEMBER *tm,
451  GWEN_DB_NODE *db,
452  int withTypePrefix)
453 {
454  const char *s;
455  const char *prefix=NULL;
456  char numbuf[32];
457  TYPEMAKER2_TYPE *mty;
458 
460  if (withTypePrefix)
461  prefix=s;
462 
463  if (s && *s) {
464  GWEN_BUFFER *tbuf;
465 
466  setCharValueWithTypePrefix(db, prefix, "name", s);
467 
468  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
469  GWEN_Buffer_AppendByte(tbuf, toupper(*s));
470  GWEN_Buffer_AppendString(tbuf, s+1);
471  setCharValueWithTypePrefix(db, prefix, "nameWithCapital", GWEN_Buffer_GetStart(tbuf));
472  GWEN_Buffer_free(tbuf);
473  }
474 
476  if (s && *s)
477  setCharValueWithTypePrefix(db, prefix, "element_name", s);
478  else
479  /* default behaviour is to use the name "element" for list members in GWEN_DBs */
480  setCharValueWithTypePrefix(db, prefix, "element_name", "element");
481 
483 
485 
487  /* set field number for toObject/fromObject */
489  if (s && *s)
490  setCharValueWithTypePrefix(db, prefix, "fieldid", s);
491  }
492 
493  /* maxlen */
494  snprintf(numbuf, sizeof(numbuf)-1, "%d", Typemaker2_Member_GetMaxLen(tm));
495  setCharValueWithTypePrefix(db, prefix, "maxlen", numbuf);
496 
497  /* set basetype stuff */
499  assert(mty);
500  if (mty) {
501  TYPEMAKER2_TYPE *bty;
502 
503  setCharValueWithTypePrefix(db, prefix, "member_type", Typemaker2_Type_GetIdentifier(mty));
504  setCharValueWithTypePrefix(db, prefix, "member_prefix", Typemaker2_Type_GetPrefix(mty));
505 
507  if (bty) {
508  setCharValueWithTypePrefix(db, prefix, "member_basetype_type", Typemaker2_Type_GetIdentifier(bty));
509  setCharValueWithTypePrefix(db, prefix, "member_basetype_prefix", Typemaker2_Type_GetPrefix(bty));
510  }
511  }
512 
513  /* set enum-specific stuff */
515  TYPEMAKER2_ENUM *te;
516 
518  if (te) {
519  setCharValueWithTypePrefix(db, prefix, "enum_fromstring_fn", Typemaker2_Enum_GetFromStringFn(te));
520  setCharValueWithTypePrefix(db, prefix, "enum_tostring_fn", Typemaker2_Enum_GetToStringFn(te));
521  }
522  }
523 }
524 
525 
526 
527 void setCharValueWithTypePrefix(GWEN_DB_NODE *db, const char *prefix, const char *varName, const char *value)
528 {
529  if (value) {
530  if (prefix && *prefix) {
531  GWEN_BUFFER *tbuf;
532 
533  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
534  GWEN_Buffer_AppendString(tbuf, prefix);
535  GWEN_Buffer_AppendString(tbuf, ".");
536  GWEN_Buffer_AppendString(tbuf, varName);
538  GWEN_Buffer_free(tbuf);
539  }
540  else {
542  }
543  }
544 }
545 
546 
547 
549  GWEN_DB_NODE *db,
550  GWEN_BUFFER *dbuf)
551 {
552  const char *p;
553 
554  p=s;
555  while (*p) {
556  if (*p=='$') {
557  p++;
558  if (*p=='$')
559  GWEN_Buffer_AppendByte(dbuf, '$');
560  else if (*p=='(') {
561  const char *pStart;
562 
563  p++;
564  pStart=p;
565  while (*p && *p!=')')
566  p++;
567  if (*p!=')') {
568  DBG_ERROR(GWEN_LOGDOMAIN, "Unterminated variable name in code");
569  return GWEN_ERROR_BAD_DATA;
570  }
571  else {
572  int len;
573  char *name;
574  const char *v;
575 
576  len=p-pStart;
577  if (len<1) {
578  DBG_ERROR(GWEN_LOGDOMAIN, "Empty variable name in code");
579  return GWEN_ERROR_BAD_DATA;
580  }
581  name=(char *) malloc(len+1);
582  assert(name);
583  memmove(name, pStart, len);
584  name[len]=0;
585  v=GWEN_DB_GetCharValue(db, name, 0, NULL);
586  if (v) {
587  free(name);
588  GWEN_Buffer_AppendString(dbuf, v);
589  }
590 #if 0 /* just replace with empty value */
591  else {
592  GWEN_Buffer_AppendString(dbuf, " [__VALUE OF ");
593  GWEN_Buffer_AppendString(dbuf, name);
594  GWEN_Buffer_AppendString(dbuf, " WAS NOT SET__] ");
595  free(name);
596  }
597 #endif
598  }
599  }
600  else {
601  DBG_ERROR(GWEN_LOGDOMAIN, "Bad variable string in code");
602  return GWEN_ERROR_BAD_DATA;
603  }
604  p++;
605  }
606  else {
607  if (*p=='#') {
608  /* let # lines begin on a new line */
609  GWEN_Buffer_AppendByte(dbuf, '\n');
610  GWEN_Buffer_AppendByte(dbuf, *p);
611 
612  /* skip introducing cross and copy all stuff until the next cross
613  * upon which wa inject a newline (to make the preprocessor happy)
614  */
615  p++;
616  while (*p && *p!='#') {
617  GWEN_Buffer_AppendByte(dbuf, *p);
618  p++;
619  }
620  if (*p=='#') {
621  GWEN_Buffer_AppendByte(dbuf, '\n');
622  p++;
623  }
624  }
625  else if (*p=='\\') {
626  /* check for recognized control escapes */
627  if (tolower(p[1])=='n') {
628  GWEN_Buffer_AppendByte(dbuf, '\n');
629  p+=2; /* skip introducing backslash and control character */
630  }
631  else if (tolower(p[1])=='t') {
632  GWEN_Buffer_AppendByte(dbuf, '\t');
633  p+=2; /* skip introducing backslash and control character */
634  }
635  else if (tolower(p[1])=='\\') {
636  GWEN_Buffer_AppendByte(dbuf, '\\');
637  p+=2; /* skip introducing backslash and control character */
638  }
639  else {
640  /* no known escape character, just add literally */
641  GWEN_Buffer_AppendByte(dbuf, *p);
642  p++;
643  }
644  }
645  else {
646  GWEN_Buffer_AppendByte(dbuf, *p);
647  p++;
648  }
649  }
650  }
651 
652  return 0;
653 }
654 
655 
656 
657 #define INVOKE_FN(macro_var1) \
658  int Typemaker2_Builder_Invoke_##macro_var1##Fn(TYPEMAKER2_BUILDER *tb, \
659  TYPEMAKER2_TYPE *ty, \
660  TYPEMAKER2_MEMBER *tm, \
661  const char *src, \
662  const char *dst, \
663  GWEN_BUFFER *dbuf) { \
664  if (tm) { \
665  TYPEMAKER2_TYPE *mty; \
666  TYPEMAKER2_CODE *tc; \
667  const char *s=NULL; \
668  \
669  mty=Typemaker2_Member_GetTypePtr(tm); \
670  if (mty==NULL) { \
671  DBG_ERROR(GWEN_LOGDOMAIN, "No type pointer for member"); \
672  return GWEN_ERROR_NO_DATA; \
673  } \
674  tc=Typemaker2_Type_FindCodeForMember(mty, tm, __STRING(macro_var1));\
675  if (tc) \
676  s=Typemaker2_Code_GetCode(tc); \
677  if (s && *s) { \
678  GWEN_DB_NODE *db; \
679  int rv; \
680  \
681  db=Typemaker2_Builder_CreateDbForCall(tb, ty, tm, src, dst); \
682  if (db==NULL) { \
683  DBG_INFO(GWEN_LOGDOMAIN, "here"); \
684  return GWEN_ERROR_BAD_DATA; \
685  } \
686  \
687  if (0) { \
688  GWEN_Buffer_AppendString(dbuf, "/* function \""); \
689  GWEN_Buffer_AppendString(dbuf, __STRING(macro_var1)); \
690  GWEN_Buffer_AppendString(dbuf, "\" of type \""); \
691  GWEN_Buffer_AppendString(dbuf, Typemaker2_Type_GetName(mty)); \
692  GWEN_Buffer_AppendString(dbuf, "\" */\n"); \
693  } \
694  rv=Typemaker2_Builder_ReplaceVars(s, db, dbuf); \
695  GWEN_DB_Group_free(db); \
696  if (rv<0) { \
697  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); \
698  return rv; \
699  } \
700  return 0; \
701  } \
702  else { \
703  DBG_INFO(GWEN_LOGDOMAIN, "No code for type [%s]", \
704  Typemaker2_Type_GetName(mty)); \
705  return 0; \
706  } \
707  } \
708  else { \
709  DBG_ERROR(GWEN_LOGDOMAIN, "No member information"); \
710  return GWEN_ERROR_NO_DATA; \
711  } \
712  }
713 
714 
715 INVOKE_FN(Construct);
716 INVOKE_FN(Destruct);
717 INVOKE_FN(Assign);
718 INVOKE_FN(Dup);
719 INVOKE_FN(Compare);
720 INVOKE_FN(ToDb);
721 INVOKE_FN(FromDb);
722 INVOKE_FN(ToXml);
723 INVOKE_FN(FromXml);
724 INVOKE_FN(ToObject);
725 INVOKE_FN(FromObject);
726 INVOKE_FN(ToHashString);
727 
728 
729 
730 
732  TYPEMAKER2_TYPE *ty,
733  const char *fileName,
734  GWEN_STRINGLIST *sl,
735  int acc)
736 {
738  FILE *f;
739 
740  f=fopen(fileName, "w");
741  if (f==NULL) {
742  DBG_ERROR(GWEN_LOGDOMAIN, "fopen(%s): %s (%d)",
743  fileName,
744  strerror(errno),
745  errno);
746  return GWEN_ERROR_IO;
747  }
748 
749  fprintf(f,
750  "/**********************************************************\n"
751  " * This file has been automatically created by \"typemaker2\"\n"
752  " * from the file \"%s\".\n"
753  " * Please do not edit this file, all changes will be lost.\n"
754  " * Better edit the mentioned source file instead.\n"
755  " **********************************************************/\n"
756  "\n",
758 
759  if (acc==TypeMaker2_Access_Unknown) {
760  const char *s;
761  TYPEMAKER2_HEADER_LIST *hl;
762 
763  fprintf(f, "#ifdef HAVE_CONFIG_H\n# include <config.h>\n#endif\n\n");
764 
765  s=tb->fileNamePrivate;
766  if (s==NULL)
767  s=tb->fileNameLibrary;
768  if (s==NULL)
769  s=tb->fileNameProtected;
770  if (s==NULL)
771  s=tb->fileNamePublic;
772  if (s) {
773  fprintf(f, "#include \"%s\"\n\n", s);
774  }
775 
776  /* add some needed headers */
777  fprintf(f, "#include <gwenhywfar/misc.h>\n");
778  fprintf(f, "#include <gwenhywfar/debug.h>\n");
779 
780  /* write code headers */
781  fprintf(f, "\n");
782  fprintf(f, "/* code headers */\n");
784  if (hl) {
786 
787  h=Typemaker2_Header_List_First(hl);
788  while (h) {
791  fprintf(f, "#include <%s>\n", Typemaker2_Header_GetFileName(h));
792  else
793  fprintf(f, "#include \"%s\"\n", Typemaker2_Header_GetFileName(h));
794  }
795  h=Typemaker2_Header_List_Next(h);
796  }
797  }
798  fprintf(f, "\n");
799  }
800  else {
801  GWEN_BUFFER *xbuf;
802  char *p;
803  const char *s;
804 
805  xbuf=GWEN_Buffer_new(0, 256, 0, 1);
807  GWEN_Buffer_AppendString(xbuf, s);
808  GWEN_Buffer_AppendString(xbuf, "_");
809  s=strrchr(fileName, GWEN_DIR_SEPARATOR);
810  if (s && *s)
811  GWEN_Buffer_AppendString(xbuf, s+1);
812  else
813  GWEN_Buffer_AppendString(xbuf, fileName);
814  p=GWEN_Buffer_GetStart(xbuf);
815  while (*p) {
816  if (!isalnum(*p))
817  *p='_';
818  else
819  *p=toupper(*p);
820  p++;
821  }
822  fprintf(f, "#ifndef %s\n", GWEN_Buffer_GetStart(xbuf));
823  fprintf(f, "#define %s\n\n", GWEN_Buffer_GetStart(xbuf));
824 
825  s=NULL;
826  switch (acc) {
828  s=tb->fileNamePrivate;
829  if (s)
830  break;
832  s=tb->fileNameLibrary;
833  if (s)
834  break;
836  s=tb->fileNameProtected;
837  if (s)
838  break;
840  s=tb->fileNamePublic;
841  if (s)
842  break;
843  default:
844  break;
845  }
846 
847  if (s) {
848  fprintf(f, "#include \"%s\"\n\n", s);
849  }
850 
851  fprintf(f, "\n");
852  fprintf(f, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n");
853  GWEN_Buffer_free(xbuf);
854  }
855 
857  while (se) {
858  const char *s;
859 
861  if (s)
862  fprintf(f, "%s\n", s);
863 
865  }
866 
867  if (acc==TypeMaker2_Access_Unknown) {
868  TYPEMAKER2_HEADER_LIST *hl;
869 
870  /* write codeEnd headers */
871  fprintf(f, "\n");
872  fprintf(f, "/* code headers */\n");
874  if (hl) {
876 
877  h=Typemaker2_Header_List_First(hl);
878  while (h) {
881  fprintf(f, "#include <%s>\n", Typemaker2_Header_GetFileName(h));
882  else
883  fprintf(f, "#include \"%s\"\n", Typemaker2_Header_GetFileName(h));
884  }
885  h=Typemaker2_Header_List_Next(h);
886  }
887  }
888  fprintf(f, "\n");
889  }
890 
891  if (acc!=TypeMaker2_Access_Unknown) {
892  fprintf(f, "#ifdef __cplusplus\n}\n#endif\n\n");
893  fprintf(f, "#endif\n\n");
894  }
895 
896  if (fclose(f)) {
897  DBG_ERROR(GWEN_LOGDOMAIN, "fclose(%s): %s (%d)",
898  fileName,
899  strerror(errno),
900  errno);
901  return GWEN_ERROR_IO;
902  }
903 
904  return 0;
905 }
906 
907 
908 
910  TYPEMAKER2_TYPE *ty,
911  const char *fileName)
912 {
913  FILE *f;
914 
915  f=fopen(fileName, "w");
916  if (f==NULL) {
917  DBG_ERROR(GWEN_LOGDOMAIN, "fopen(%s): %s (%d)",
918  fileName,
919  strerror(errno),
920  errno);
921  return GWEN_ERROR_IO;
922  }
923 
924  fprintf(f, "<?xml?>\n");
925  fprintf(f, "\n");
926  fprintf(f, "<tm2>\n");
927 
928  fprintf(f, " <typedef id=\"%s\" type=\"pointer\" lang=\"c\" extends=\"struct_base\">\n",
930 
931  fprintf(f, " <identifier>%s</identifier>\n", Typemaker2_Type_GetName(ty));
932  fprintf(f, " <prefix>%s</prefix>\n", Typemaker2_Type_GetPrefix(ty));
933 
934  fprintf(f, " </typedef>\n");
935  fprintf(f, "</tm2>\n");
936 
937  if (fclose(f)) {
938  DBG_ERROR(GWEN_LOGDOMAIN, "fclose(%s): %s (%d)",
939  fileName,
940  strerror(errno),
941  errno);
942  return GWEN_ERROR_IO;
943  }
944 
945  return 0;
946 }
947 
948 
949 
951  TYPEMAKER2_TYPE *ty,
952  const char *fileName)
953 {
954  FILE *f;
955 
956  f=fopen(fileName, "w");
957  if (f==NULL) {
958  DBG_ERROR(GWEN_LOGDOMAIN, "fopen(%s): %s (%d)",
959  fileName,
960  strerror(errno),
961  errno);
962  return GWEN_ERROR_IO;
963  }
964 
965  fprintf(f, "<?xml?>\n");
966  fprintf(f, "\n");
967  fprintf(f, "<tm2>\n");
968 
969  fprintf(f, " <typedef id=\"%s_LIST\" type=\"pointer\" lang=\"c\" extends=\"list1_base\" "
970  "basetype=\"%s\">\n",
973 
974  fprintf(f, " <identifier>%s_LIST</identifier>\n", Typemaker2_Type_GetName(ty));
975  fprintf(f, " <prefix>%s_List</prefix>\n", Typemaker2_Type_GetPrefix(ty));
976 
977  fprintf(f, " </typedef>\n");
978  fprintf(f, "</tm2>\n");
979 
980  if (fclose(f)) {
981  DBG_ERROR(GWEN_LOGDOMAIN, "fclose(%s): %s (%d)",
982  fileName,
983  strerror(errno),
984  errno);
985  return GWEN_ERROR_IO;
986  }
987 
988  return 0;
989 }
990 
991 
992 
994  TYPEMAKER2_TYPE *ty,
995  const char *fileName)
996 {
997  FILE *f;
998 
999  f=fopen(fileName, "w");
1000  if (f==NULL) {
1001  DBG_ERROR(GWEN_LOGDOMAIN, "fopen(%s): %s (%d)",
1002  fileName,
1003  strerror(errno),
1004  errno);
1005  return GWEN_ERROR_IO;
1006  }
1007 
1008  fprintf(f, "<?xml?>\n");
1009  fprintf(f, "\n");
1010  fprintf(f, "<tm2>\n");
1011 
1012  fprintf(f, " <typedef id=\"%s_LIST2\" type=\"pointer\" lang=\"c\" extends=\"list2_base\" "
1013  "basetype=\"%s\">\n",
1016 
1017  fprintf(f, " <identifier>%s_LIST2</identifier>\n", Typemaker2_Type_GetName(ty));
1018  fprintf(f, " <prefix>%s_List2</prefix>\n", Typemaker2_Type_GetPrefix(ty));
1019 
1020  fprintf(f, " </typedef>\n");
1021  fprintf(f, "</tm2>\n");
1022 
1023  if (fclose(f)) {
1024  DBG_ERROR(GWEN_LOGDOMAIN, "fclose(%s): %s (%d)",
1025  fileName,
1026  strerror(errno),
1027  errno);
1028  return GWEN_ERROR_IO;
1029  }
1030 
1031  return 0;
1032 }
1033 
1034 
1035 
1037  TYPEMAKER2_TYPE *ty,
1038  const char *fileName)
1039 {
1040  FILE *f;
1041 
1042  f=fopen(fileName, "w");
1043  if (f==NULL) {
1044  DBG_ERROR(GWEN_LOGDOMAIN, "fopen(%s): %s (%d)",
1045  fileName,
1046  strerror(errno),
1047  errno);
1048  return GWEN_ERROR_IO;
1049  }
1050 
1051  fprintf(f, "<?xml?>\n");
1052  fprintf(f, "\n");
1053  fprintf(f, "<tm2>\n");
1054 
1055  fprintf(f, " <typedef id=\"%s_TREE\" type=\"pointer\" lang=\"c\" extends=\"tree_base\" "
1056  "basetype=\"%s\">\n",
1059 
1060  fprintf(f, " <identifier>%s_TREE</identifier>\n", Typemaker2_Type_GetName(ty));
1061  fprintf(f, " <prefix>%s_Tree</prefix>\n", Typemaker2_Type_GetPrefix(ty));
1062 
1063  fprintf(f, " </typedef>\n");
1064  fprintf(f, "</tm2>\n");
1065 
1066  if (fclose(f)) {
1067  DBG_ERROR(GWEN_LOGDOMAIN, "fclose(%s): %s (%d)",
1068  fileName,
1069  strerror(errno),
1070  errno);
1071  return GWEN_ERROR_IO;
1072  }
1073 
1074  return 0;
1075 }
1076 
1077 
1078 
1080  TYPEMAKER2_TYPE *ty,
1081  const char *fileName)
1082 {
1083  FILE *f;
1084 
1085  f=fopen(fileName, "w");
1086  if (f==NULL) {
1087  DBG_ERROR(GWEN_LOGDOMAIN, "fopen(%s): %s (%d)",
1088  fileName,
1089  strerror(errno),
1090  errno);
1091  return GWEN_ERROR_IO;
1092  }
1093 
1094  fprintf(f, "<?xml?>\n");
1095  fprintf(f, "\n");
1096  fprintf(f, "<tm2>\n");
1097 
1098  fprintf(f, " <typedef id=\"%s_TREE2\" type=\"pointer\" lang=\"c\" extends=\"tree_base\" "
1099  "basetype=\"%s\">\n",
1102 
1103  fprintf(f, " <identifier>%s_TREE2</identifier>\n", Typemaker2_Type_GetName(ty));
1104  fprintf(f, " <prefix>%s_Tree2</prefix>\n", Typemaker2_Type_GetPrefix(ty));
1105 
1106  fprintf(f, " </typedef>\n");
1107  fprintf(f, "</tm2>\n");
1108 
1109  if (fclose(f)) {
1110  DBG_ERROR(GWEN_LOGDOMAIN, "fclose(%s): %s (%d)",
1111  fileName,
1112  strerror(errno),
1113  errno);
1114  return GWEN_ERROR_IO;
1115  }
1116 
1117  return 0;
1118 }
1119 
1120 
1121 
1123  TYPEMAKER2_TYPE *ty,
1124  const char *fileName)
1125 {
1126  FILE *f;
1127 
1128  f=fopen(fileName, "w");
1129  if (f==NULL) {
1130  DBG_ERROR(GWEN_LOGDOMAIN, "fopen(%s): %s (%d)",
1131  fileName,
1132  strerror(errno),
1133  errno);
1134  return GWEN_ERROR_IO;
1135  }
1136 
1137  fprintf(f, "<?xml?>\n");
1138  fprintf(f, "\n");
1139  fprintf(f, "<tm2>\n");
1140 
1141  fprintf(f, " <typedef id=\"%s_IDMAP\" type=\"pointer\" lang=\"c\" extends=\"idmap_base\" "
1142  "basetype=\"%s\">\n",
1145 
1146  fprintf(f, " <identifier>%s_IDMAP</identifier>\n", Typemaker2_Type_GetName(ty));
1147  fprintf(f, " <prefix>%s_IdMap</prefix>\n", Typemaker2_Type_GetPrefix(ty));
1148 
1149  fprintf(f, " </typedef>\n");
1150  fprintf(f, "</tm2>\n");
1151 
1152  if (fclose(f)) {
1153  DBG_ERROR(GWEN_LOGDOMAIN, "fclose(%s): %s (%d)",
1154  fileName,
1155  strerror(errno),
1156  errno);
1157  return GWEN_ERROR_IO;
1158  }
1159 
1160  return 0;
1161 }
1162 
1163 
1164 
1165 
1166 
1168 {
1169  const char *fname;
1170 
1171  if (GWEN_StringList_Count(tb->declarationsPublic)) {
1172  fname=tb->fileNamePublic;
1173  if (fname==NULL || *fname==0) {
1174  const char *s;
1175  char *t;
1176  GWEN_BUFFER *tbuf;
1177 
1179  if (s==NULL || *s==0) {
1181  if (s==NULL || *s==0) {
1182  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1183  return GWEN_ERROR_BAD_DATA;
1184  }
1185  }
1186  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1187  if (tb->destFolder) {
1188  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1190  }
1191  GWEN_Buffer_AppendString(tbuf, s);
1192  t=GWEN_Buffer_GetStart(tbuf);
1193  while (*t) {
1194  *t=tolower(*t);
1195  t++;
1196  }
1197  GWEN_Buffer_AppendString(tbuf, ".h");
1198  fname=GWEN_Buffer_GetStart(tbuf);
1200  GWEN_Buffer_free(tbuf);
1201  }
1202  }
1203 
1204  if (GWEN_StringList_Count(tb->declarationsLibrary)) {
1205  fname=tb->fileNameLibrary;
1206  if (fname==NULL || *fname==0) {
1207  const char *s;
1208  char *t;
1209  GWEN_BUFFER *tbuf;
1210 
1212  if (s==NULL || *s==0) {
1214  if (s==NULL || *s==0) {
1215  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1216  return GWEN_ERROR_BAD_DATA;
1217  }
1218  }
1219  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1220  if (tb->destFolder) {
1221  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1223  }
1224  GWEN_Buffer_AppendString(tbuf, s);
1225  t=GWEN_Buffer_GetStart(tbuf);
1226  while (*t) {
1227  *t=tolower(*t);
1228  t++;
1229  }
1230  GWEN_Buffer_AppendString(tbuf, "_l.h");
1231  fname=GWEN_Buffer_GetStart(tbuf);
1233  GWEN_Buffer_free(tbuf);
1234  }
1235  }
1236 
1237  if (GWEN_StringList_Count(tb->declarationsProtected)) {
1238  fname=tb->fileNameProtected;
1239  if (fname==NULL || *fname==0) {
1240  const char *s;
1241  char *t;
1242  GWEN_BUFFER *tbuf;
1243 
1245  if (s==NULL || *s==0) {
1247  if (s==NULL || *s==0) {
1248  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1249  return GWEN_ERROR_BAD_DATA;
1250  }
1251  }
1252  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1253  if (tb->destFolder) {
1254  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1256  }
1257  GWEN_Buffer_AppendString(tbuf, s);
1258  t=GWEN_Buffer_GetStart(tbuf);
1259  while (*t) {
1260  *t=tolower(*t);
1261  t++;
1262  }
1263  GWEN_Buffer_AppendString(tbuf, "_be.h");
1264  fname=GWEN_Buffer_GetStart(tbuf);
1266  GWEN_Buffer_free(tbuf);
1267  }
1268  }
1269 
1270  if (GWEN_StringList_Count(tb->declarationsPrivate)) {
1271  fname=tb->fileNamePrivate;
1272  if (fname==NULL || *fname==0) {
1273  const char *s;
1274  char *t;
1275  GWEN_BUFFER *tbuf;
1276 
1278  if (s==NULL || *s==0) {
1280  if (s==NULL || *s==0) {
1281  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1282  return GWEN_ERROR_BAD_DATA;
1283  }
1284  }
1285  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1286  if (tb->destFolder) {
1287  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1289  }
1290  GWEN_Buffer_AppendString(tbuf, s);
1291  t=GWEN_Buffer_GetStart(tbuf);
1292  while (*t) {
1293  *t=tolower(*t);
1294  t++;
1295  }
1296  GWEN_Buffer_AppendString(tbuf, "_p.h");
1297  fname=GWEN_Buffer_GetStart(tbuf);
1299  GWEN_Buffer_free(tbuf);
1300  }
1301  }
1302 
1303  if (GWEN_StringList_Count(tb->code)) {
1304  fname=tb->fileNameCode;
1305  if (fname==NULL || *fname==0) {
1306  const char *s;
1307  char *t;
1308  GWEN_BUFFER *tbuf;
1309 
1311  if (s==NULL || *s==0) {
1313  if (s==NULL || *s==0) {
1314  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1315  return GWEN_ERROR_BAD_DATA;
1316  }
1317  }
1318  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1319  if (tb->destFolder) {
1320  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1322  }
1323  GWEN_Buffer_AppendString(tbuf, s);
1324  t=GWEN_Buffer_GetStart(tbuf);
1325  while (*t) {
1326  *t=tolower(*t);
1327  t++;
1328  }
1329  GWEN_Buffer_AppendString(tbuf, ".c");
1330  fname=GWEN_Buffer_GetStart(tbuf);
1332  GWEN_Buffer_free(tbuf);
1333  }
1334  }
1335 
1336  return 0;
1337 }
1338 
1339 
1340 
1342 {
1343  const char *fname;
1344  int rv;
1345 
1347  if (rv<0) {
1348  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1349  return rv;
1350  }
1351 
1353  if (GWEN_StringList_Count(tb->declarationsPublic)) {
1354  fname=tb->fileNamePublic;
1355  assert(fname);
1356 
1357  rv=Typemaker2_Builder_WriteFile(tb, ty, fname, tb->declarationsPublic,
1359  if (rv<0) {
1360  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1361  return rv;
1362  }
1363  }
1364 
1365  if (GWEN_StringList_Count(tb->declarationsLibrary)) {
1366  fname=tb->fileNameLibrary;
1367  assert(fname);
1368 
1369  rv=Typemaker2_Builder_WriteFile(tb, ty, fname, tb->declarationsLibrary,
1371  if (rv<0) {
1372  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1373  return rv;
1374  }
1375  }
1376 
1377  if (GWEN_StringList_Count(tb->declarationsProtected)) {
1378  fname=tb->fileNameProtected;
1379  assert(fname);
1380 
1381  rv=Typemaker2_Builder_WriteFile(tb, ty, fname, tb->declarationsProtected,
1383  if (rv<0) {
1384  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1385  return rv;
1386  }
1387  }
1388 
1389  if (GWEN_StringList_Count(tb->declarationsPrivate)) {
1390  fname=tb->fileNamePrivate;
1391  assert(fname);
1392 
1393  rv=Typemaker2_Builder_WriteFile(tb, ty, fname, tb->declarationsPrivate,
1395  if (rv<0) {
1396  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1397  return rv;
1398  }
1399  }
1400 
1401  if (GWEN_StringList_Count(tb->code)) {
1402  fname=tb->fileNameCode;
1403  assert(fname);
1404 
1405  rv=Typemaker2_Builder_WriteFile(tb, ty, fname, tb->code,
1407  if (rv<0) {
1408  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1409  return rv;
1410  }
1411  }
1412  }
1413 
1414  /* write typedef file */
1416  if (1) {
1417  const char *s;
1418  char *t;
1419  GWEN_BUFFER *tbuf;
1420 
1422  if (s==NULL || *s==0) {
1423  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1424  return GWEN_ERROR_BAD_DATA;
1425  }
1426  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1427  if (tb->destFolder) {
1428  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1430  }
1431  GWEN_Buffer_AppendString(tbuf, s);
1432  t=GWEN_Buffer_GetStart(tbuf);
1433  while (*t) {
1434  *t=tolower(*t);
1435  t++;
1436  }
1437  GWEN_Buffer_AppendString(tbuf, ".tm2");
1438  fname=GWEN_Buffer_GetStart(tbuf);
1439  rv=Typemaker2_Builder_WriteTypedefFile(tb, ty, fname);
1440  GWEN_Buffer_free(tbuf);
1441  if (rv<0) {
1442  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1443  return rv;
1444  }
1445  }
1446 
1447  /* write typedef file for list1 */
1449  const char *s;
1450  char *t;
1451  GWEN_BUFFER *tbuf;
1452 
1454  if (s==NULL || *s==0) {
1455  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1456  return GWEN_ERROR_BAD_DATA;
1457  }
1458  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1459  if (tb->destFolder) {
1460  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1462  }
1463  GWEN_Buffer_AppendString(tbuf, s);
1464  t=GWEN_Buffer_GetStart(tbuf);
1465  while (*t) {
1466  *t=tolower(*t);
1467  t++;
1468  }
1469  GWEN_Buffer_AppendString(tbuf, "_list.tm2");
1470  fname=GWEN_Buffer_GetStart(tbuf);
1472  GWEN_Buffer_free(tbuf);
1473  if (rv<0) {
1474  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1475  return rv;
1476  }
1477  }
1478 
1479  /* write typedef file for list2 */
1481  const char *s;
1482  char *t;
1483  GWEN_BUFFER *tbuf;
1484 
1486  if (s==NULL || *s==0) {
1487  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1488  return GWEN_ERROR_BAD_DATA;
1489  }
1490  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1491  if (tb->destFolder) {
1492  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1494  }
1495  GWEN_Buffer_AppendString(tbuf, s);
1496  t=GWEN_Buffer_GetStart(tbuf);
1497  while (*t) {
1498  *t=tolower(*t);
1499  t++;
1500  }
1501  GWEN_Buffer_AppendString(tbuf, "_list2.tm2");
1502  fname=GWEN_Buffer_GetStart(tbuf);
1504  GWEN_Buffer_free(tbuf);
1505  if (rv<0) {
1506  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1507  return rv;
1508  }
1509  }
1510 
1511  /* write typedef file for tree */
1513  const char *s;
1514  char *t;
1515  GWEN_BUFFER *tbuf;
1516 
1518  if (s==NULL || *s==0) {
1519  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1520  return GWEN_ERROR_BAD_DATA;
1521  }
1522  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1523  if (tb->destFolder) {
1524  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1526  }
1527  GWEN_Buffer_AppendString(tbuf, s);
1528  t=GWEN_Buffer_GetStart(tbuf);
1529  while (*t) {
1530  *t=tolower(*t);
1531  t++;
1532  }
1533  GWEN_Buffer_AppendString(tbuf, "_tree.tm2");
1534  fname=GWEN_Buffer_GetStart(tbuf);
1535  rv=Typemaker2_Builder_WriteTypedefFile_Tree(tb, ty, fname);
1536  GWEN_Buffer_free(tbuf);
1537  if (rv<0) {
1538  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1539  return rv;
1540  }
1541  }
1542 
1543  /* write typedef file for tree2 */
1545  const char *s;
1546  char *t;
1547  GWEN_BUFFER *tbuf;
1548 
1550  if (s==NULL || *s==0) {
1551  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1552  return GWEN_ERROR_BAD_DATA;
1553  }
1554  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1555  if (tb->destFolder) {
1556  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1558  }
1559  GWEN_Buffer_AppendString(tbuf, s);
1560  t=GWEN_Buffer_GetStart(tbuf);
1561  while (*t) {
1562  *t=tolower(*t);
1563  t++;
1564  }
1565  GWEN_Buffer_AppendString(tbuf, "_tree2.tm2");
1566  fname=GWEN_Buffer_GetStart(tbuf);
1568  GWEN_Buffer_free(tbuf);
1569  if (rv<0) {
1570  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1571  return rv;
1572  }
1573  }
1574 
1575  /* write typedef file for idmap */
1577  const char *s;
1578  char *t;
1579  GWEN_BUFFER *tbuf;
1580 
1582  if (s==NULL || *s==0) {
1583  DBG_ERROR(GWEN_LOGDOMAIN, "Type has no name");
1584  return GWEN_ERROR_BAD_DATA;
1585  }
1586  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
1587  if (tb->destFolder) {
1588  GWEN_Buffer_AppendString(tbuf, tb->destFolder);
1590  }
1591  GWEN_Buffer_AppendString(tbuf, s);
1592  t=GWEN_Buffer_GetStart(tbuf);
1593  while (*t) {
1594  *t=tolower(*t);
1595  t++;
1596  }
1597  GWEN_Buffer_AppendString(tbuf, "_idmap.tm2");
1598  fname=GWEN_Buffer_GetStart(tbuf);
1600  GWEN_Buffer_free(tbuf);
1601  if (rv<0) {
1602  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1603  return rv;
1604  }
1605  }
1606  }
1607 
1608  return 0;
1609 }
1610 
1611 
1612 
1614 {
1615  int rv;
1616 
1618  if (rv<0) {
1619  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1620  return rv;
1621  }
1622 
1623  if (GWEN_StringList_Count(tb->declarationsPublic))
1624  fprintf(stdout, "%s\n", tb->fileNamePublic);
1625 
1626  if (GWEN_StringList_Count(tb->declarationsLibrary))
1627  fprintf(stdout, "%s\n", tb->fileNameLibrary);
1628 
1629  if (GWEN_StringList_Count(tb->declarationsProtected))
1630  fprintf(stdout, "%s\n", tb->fileNameProtected);
1631 
1632  if (GWEN_StringList_Count(tb->declarationsPrivate))
1633  fprintf(stdout, "%s\n", tb->fileNamePrivate);
1634 
1635  if (GWEN_StringList_Count(tb->code))
1636  fprintf(stdout, "%s\n", tb->fileNameCode);
1637 
1638  return 0;
1639 }
1640 
1641 
1642 
1643 
1644 
int Typemaker2_Header_GetType(const TYPEMAKER2_HEADER *th)
Definition: tm_header.c:90
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE2
Definition: tm_type.h:71
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:133
#define INVOKE_FN(macro_var1)
Definition: tm_builder.c:657
void Typemaker2_Builder_SetFileNameProtected(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:260
void Typemaker2_Builder_SetSourceFileName(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:320
void Typemaker2_Builder_SetBuildFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_BUILDER_BUILD_FN fn)
Definition: tm_builder.c:352
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
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:237
const char * Typemaker2_Enum_GetFromStringFn(const TYPEMAKER2_ENUM *p_struct)
Definition: tm_enum.c:210
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
void Typemaker2_Builder_SetFileNameCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:300
const char * Typemaker2_Header_GetFileName(const TYPEMAKER2_HEADER *th)
Definition: tm_header.c:68
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
GWEN_STRINGLIST * Typemaker2_Builder_GetProtectedDeclarations(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:109
int Typemaker2_Builder_WriteTypedefFile_IdMap(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
Definition: tm_builder.c:1122
#define GWEN_DIR_SEPARATOR_S
const char * Typemaker2_Builder_GetFileNamePrivate(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:272
TYPEMAKER2_HEADER_LIST * Typemaker2_Type_GetHeaders(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:650
const char * Typemaker2_Member_GetFieldId(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:171
int(* TYPEMAKER2_BUILDER_BUILD_FN)(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm_builder.h:35
TYPEMAKER2_ENUM * Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:485
void Typemaker2_Builder_SetFileNameLibrary(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:240
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
int Typemaker2_Header_GetLocation(const TYPEMAKER2_HEADER *th)
Definition: tm_header.c:108
void Typemaker2_Builder_free(TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:71
int Typemaker2_Builder_DetermineOutFileNames(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm_builder.c:1167
TYPEMAKER2_TYPE * Typemaker2_Type_GetBaseTypePtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:623
#define TYPEMAKER2_BUILDER_WRITEFILE_FLAGS_WRITE_TYPE
Definition: tm_builder.h:23
#define GWEN_LOGDOMAIN
Definition: logger.h:35
int Typemaker2_Builder_WriteTypedefFile_List1(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
Definition: tm_builder.c:950
void Typemaker2_Builder_SetTypeManager(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPEMANAGER *tm)
Definition: tm_builder.c:141
int Typemaker2_Builder_WriteTypedefFile(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
Definition: tm_builder.c:909
struct TYPEMAKER2_HEADER TYPEMAKER2_HEADER
Definition: tm_header.h:19
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_Member_GetMaxLen(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:369
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
#define GWEN_ERROR_IO
Definition: error.h:123
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
void Typemaker2_Builder_SetDestFolderName(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:340
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:196
void Typemaker2_Builder_SetFileNamePrivate(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:280
int Typemaker2_Builder_ReplaceVars(const char *s, GWEN_DB_NODE *db, GWEN_BUFFER *dbuf)
Definition: tm_builder.c:548
static void addMemberInfoToCallDb(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_DB_NODE *db, int withTypePrefix)
const char * Typemaker2_Member_GetPresetValue(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:414
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
const char * Typemaker2_Builder_GetFileNameLibrary(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:232
void Typemaker2_Builder_AddDeclaration(TYPEMAKER2_BUILDER *tb, int access, const char *s)
Definition: tm_builder.c:149
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
int Typemaker2_Builder_Build(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm_builder.c:360
const char * Typemaker2_Builder_GetFileNamePublic(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:212
const char * Typemaker2_Builder_GetSourceFileName(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:312
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:245
GWEN_STRINGLIST * Typemaker2_Builder_GetPrivateDeclarations(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:117
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
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE
Definition: tm_type.h:60
const char * Typemaker2_Builder_GetFileNameProtected(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:252
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:971
int Typemaker2_Builder_WriteTypedefFile_Tree(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
Definition: tm_builder.c:1036
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
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
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
const char * Typemaker2_Type_GetName(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:127
int Typemaker2_Builder_WriteFile(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName, GWEN_STRINGLIST *sl, int acc)
Definition: tm_builder.c:731
const char * Typemaker2_Member_GetDefaultValue(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:388
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:204
const char * Typemaker2_Builder_GetFileNameCode(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:292
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:427
#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
int Typemaker2_Builder_WriteTypedefFile_List2(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
Definition: tm_builder.c:993
#define TYPEMAKER2_TYPEFLAGS_WITH_IDMAP
Definition: tm_type.h:59
void Typemaker2_Builder_SetFileNamePublic(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:220
#define GWEN_ERROR_NOT_SUPPORTED
Definition: error.h:109
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
#define GWEN_DIR_SEPARATOR
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
GWEN_STRINGLIST * Typemaker2_Builder_GetCode(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:125
static void setCharValueWithTypePrefix(GWEN_DB_NODE *db, const char *prefix, const char *varName, const char *value)
Definition: tm_builder.c:527
#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_Builder_GetDestFolderName(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:332
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
TYPEMAKER2_BUILDER * Typemaker2_Builder_new()
Definition: tm_builder.c:53
int Typemaker2_Builder_PrintFileNames(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm_builder.c:1613
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:173
GWEN_STRINGLIST * Typemaker2_Builder_GetPublicDeclarations(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:93
GWEN_STRINGLIST * Typemaker2_Builder_GetLibraryDeclarations(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:101
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
const char * Typemaker2_Enum_GetToStringFn(const TYPEMAKER2_ENUM *p_struct)
Definition: tm_enum.c:204
int Typemaker2_Builder_WriteTypedefFile_Tree2(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
Definition: tm_builder.c:1079
const char * Typemaker2_Member_GetElementName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:127
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition: stringlist.c:50
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:341
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST2
Definition: tm_type.h:57
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
#define TYPEMAKER2_BUILDER_WRITEFILE_FLAGS_WRITE_DEFS
Definition: tm_builder.h:22
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
#define TYPEMAKER2_FLAGS_VOLATILE
Definition: tm_type.h:32
int Typemaker2_Builder_WriteFiles(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, uint32_t writeFlags)
Definition: tm_builder.c:1341
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
const char * Typemaker2_Type_GetBaseFileName(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:221
GWEN_DB_NODE * Typemaker2_Builder_CreateDbForCall(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst)
Definition: tm_builder.c:371
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1
Definition: tm_type.h:56