gwenhywfar  5.10.1
tm_typemanager.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 "tm_typemanager_p.h"
16 
17 #include <gwenhywfar/debug.h>
18 #include <gwenhywfar/misc.h>
19 #include <gwenhywfar/directory.h>
20 
21 #include <assert.h>
22 #include <ctype.h>
23 
24 
25 
26 #define TM_TYPEMANAGER_XMLFLAGS (\
27  GWEN_XML_FLAGS_DEFAULT | \
28  GWEN_XML_FLAGS_HANDLE_HEADERS | \
29  GWEN_XML_FLAGS_HANDLE_OPEN_HTMLTAGS \
30  )
31 
32 
33 
34 
36 {
38 
40 
41  tym->typeList=Typemaker2_Type_List_new();
42  tym->folders=GWEN_StringList_new();
43  tym->lang=strdup("c");
44 
45 
46  return tym;
47 }
48 
49 
50 
52 {
53  if (tym) {
54  Typemaker2_Type_List_free(tym->typeList);
55  GWEN_StringList_free(tym->folders);
56  GWEN_FREE_OBJECT(tym);
57  }
58 }
59 
60 
61 
63 {
64  assert(tym);
65  return tym->lang;
66 }
67 
68 
69 
71 {
72  assert(tym);
73  free(tym->lang);
74  if (s)
75  tym->lang=strdup(s);
76  else
77  tym->lang=NULL;
78 }
79 
80 
81 
83 {
84  assert(tym);
85  return tym->apiDeclaration;
86 }
87 
88 
89 
91 {
92  assert(tym);
93  free(tym->apiDeclaration);
94  if (s)
95  tym->apiDeclaration=strdup(s);
96  else
97  tym->apiDeclaration=NULL;
98 }
99 
100 
101 
103 {
104  assert(tym);
105  GWEN_StringList_AppendString(tym->folders, s, 0, 1);
106 }
107 
108 
109 
111 {
112  assert(tym);
113  Typemaker2_Type_List_Add(ty, tym->typeList);
114 }
115 
116 
117 
119 {
120  TYPEMAKER2_TYPE *ty;
121 
122  assert(tym);
123  ty=Typemaker2_Type_List_First(tym->typeList);
124  while (ty) {
125  const char *n;
126 
128  if (n && strcasecmp(s, n)==0)
129  break;
130  ty=Typemaker2_Type_List_Next(ty);
131  }
132 
133  return ty;
134 }
135 
136 
137 
139 {
140  GWEN_BUFFER *tbuf;
141  GWEN_BUFFER *nbuf;
142  char *p;
143  int rv;
144  TYPEMAKER2_TYPE *ty=NULL;
145  GWEN_XMLNODE *root;
146  GWEN_XMLNODE *node;
147 
148  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
149  GWEN_Buffer_AppendString(tbuf, typeName);
150  p=GWEN_Buffer_GetStart(tbuf);
151  while (*p) {
152  *p=tolower(*p);
153  p++;
154  }
155  GWEN_Buffer_AppendString(tbuf, ".tm2");
156 
157  nbuf=GWEN_Buffer_new(0, 256, 0, 1);
158  rv=GWEN_Directory_FindFileInPaths(tym->folders, GWEN_Buffer_GetStart(tbuf), nbuf);
159  if (rv<0) {
160  DBG_ERROR(GWEN_LOGDOMAIN, "Typefile [%s] not found (%d)", GWEN_Buffer_GetStart(tbuf), rv);
161  GWEN_Buffer_free(nbuf);
162  GWEN_Buffer_free(tbuf);
163  return NULL;
164  }
165 
166  /* read XML file */
168 
170  if (rv<0) {
171  DBG_ERROR(GWEN_LOGDOMAIN, "Could not load typefile [%s] (%d)", GWEN_Buffer_GetStart(nbuf), rv);
172  GWEN_XMLNode_free(root);
173  GWEN_Buffer_free(nbuf);
174  GWEN_Buffer_free(tbuf);
175  return NULL;
176  }
177 
178  /* get <tm2> element */
179  node=GWEN_XMLNode_FindFirstTag(root, "tm2", NULL, NULL);
180  if (node==NULL) {
182  "File [%s] does not contain a tm2 element",
183  GWEN_Buffer_GetStart(nbuf));
184  GWEN_XMLNode_free(root);
185  GWEN_Buffer_free(nbuf);
186  GWEN_Buffer_free(tbuf);
187  return NULL;
188  }
189 
190  /* get <typedef> element with id==typeName and wanted language */
191  node=GWEN_XMLNode_FindFirstTag(node, "typedef", "id", typeName);
192  while (node) {
193  const char *s=GWEN_XMLNode_GetProperty(node, "lang", NULL);
194  if (s && *s && strcasecmp(s, tym->lang)==0)
195  break;
196  node=GWEN_XMLNode_FindNextTag(node, "typedef", "id", typeName);
197  }
198  if (node==NULL) {
200  "File [%s] does not contain a <typedef> element for type [%s] and language [%s]",
201  GWEN_Buffer_GetStart(nbuf), typeName, tym->lang);
202  GWEN_XMLNode_free(root);
203  GWEN_Buffer_free(nbuf);
204  GWEN_Buffer_free(tbuf);
205  return NULL;
206  }
207 
208  /* load typedef from XML element */
209  ty=Typemaker2_Type_new();
210  rv=Typemaker2_Type_readXml(ty, node, NULL);
211  if (rv<0) {
212  DBG_INFO(GWEN_LOGDOMAIN, "Error reading type [%s] from file [%s] (%d)",
213  typeName,
214  GWEN_Buffer_GetStart(nbuf),
215  rv);
217  GWEN_XMLNode_free(root);
218  GWEN_Buffer_free(nbuf);
219  GWEN_Buffer_free(tbuf);
220  return NULL;
221  }
222 
223  GWEN_XMLNode_free(root);
224  GWEN_Buffer_free(nbuf);
225  GWEN_Buffer_free(tbuf);
226 
227  return ty;
228 }
229 
230 
231 
233  TYPEMAKER2_TYPE *ty,
234  const char *baseType,
235  const char *nType, const char *nPrefix)
236 {
237  TYPEMAKER2_TYPE *t2;
238  char tbuf[256];
239  int rv;
240 
241  t2=Typemaker2_Type_new();
242  Typemaker2_Type_SetExtends(t2, baseType);
245 
246  snprintf(tbuf, sizeof(tbuf)-1, "%s_%s", Typemaker2_Type_GetName(ty), nType);
247  tbuf[sizeof(tbuf)-1]=0;
248  Typemaker2_Type_SetName(t2, tbuf);
249 
250  snprintf(tbuf, sizeof(tbuf)-1, "%s_%s", Typemaker2_Type_GetIdentifier(ty), nType);
251  tbuf[sizeof(tbuf)-1]=0;
253 
254  snprintf(tbuf, sizeof(tbuf)-1, "%s_%s", Typemaker2_Type_GetPrefix(ty), nPrefix);
255  tbuf[sizeof(tbuf)-1]=0;
256  Typemaker2_Type_SetPrefix(t2, tbuf);
257 
259 
260  /* set type pointers in this type structure */
262  if (rv<0) {
263  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
264  return rv;
265  }
267  if (rv<0) {
268  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
269  return rv;
270  }
271 
272  return 0;
273 }
274 
275 
276 
278 {
279  return Typemaker2_TypeManager_MakeTypeDerivatives(tym, ty, "list1_base", "LIST", "List");
280 }
281 
282 
283 
285 {
286  return Typemaker2_TypeManager_MakeTypeDerivatives(tym, ty, "list2_base", "LIST2", "List2");
287 }
288 
289 
290 
292 {
293  return Typemaker2_TypeManager_MakeTypeDerivatives(tym, ty, "tree_base", "TREE", "Tree");
294 }
295 
296 
297 
299 {
300  int rv;
301  TYPEMAKER2_TYPE *ty=NULL;
302  GWEN_XMLNODE *root;
303  GWEN_XMLNODE *node;
304 
305  /* read XML file */
307 
308  rv=GWEN_XML_ReadFile(root, fileName, TM_TYPEMANAGER_XMLFLAGS);
309  if (rv<0) {
310  DBG_ERROR(GWEN_LOGDOMAIN, "Could not load typefile [%s] (%d)", fileName, rv);
311  GWEN_XMLNode_free(root);
312  return NULL;
313  }
314 
315  /* get <tm2> element */
316  node=GWEN_XMLNode_FindFirstTag(root, "tm2", NULL, NULL);
317  if (node==NULL) {
319  "File [%s] does not contain a tm2 element",
320  fileName);
321  GWEN_XMLNode_free(root);
322  return NULL;
323  }
324 
325  /* get <type> element with id==typeName and wanted language */
326  node=GWEN_XMLNode_FindFirstTag(node, "type", NULL, NULL);
327  if (node==NULL) {
329  "File [%s] does not contain a type element",
330  fileName);
331  GWEN_XMLNode_free(root);
332  return NULL;
333  }
334 
335  /* load type from XML element */
336  ty=Typemaker2_Type_new();
337  rv=Typemaker2_Type_readXml(ty, node, tym->lang);
338  if (rv<0) {
339  DBG_INFO(GWEN_LOGDOMAIN, "Error reading type from file [%s] (%d)",
340  fileName,
341  rv);
343  GWEN_XMLNode_free(root);
344  return NULL;
345  }
346 
347  GWEN_XMLNode_free(root);
348 
349  /* preset some stuff */
350  if (1) {
351  const char *x;
352 
354  if (!x || !(*x))
355  Typemaker2_Type_SetExtends(ty, "struct_base");
356  }
357 
358  /* add first, because other types might want to refer to this one */
359  Typemaker2_Type_List_Add(ty, tym->typeList);
360 
361 
368 
369  //Typemaker2_TypeManager_Dump(tym, stderr, 2);
370 
371  /* set type pointers in this type structure */
373  if (rv<0) {
374  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
376  return NULL;
377  }
378 
379  /* set type pointers in the member structures */
381  if (rv<0) {
382  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
384  return NULL;
385  }
386 
387 
388  return ty;
389 }
390 
391 
392 
394  TYPEMAKER2_TYPE_LIST2 *tlist2)
395 {
396  int rv;
397  TYPEMAKER2_TYPE *ty=NULL;
398  GWEN_XMLNODE *root;
399  GWEN_XMLNODE *node;
400  TYPEMAKER2_TYPE_LIST2 *tl;
401  TYPEMAKER2_TYPE_LIST2_ITERATOR *it;
402 
403  /* read XML file */
405 
406  rv=GWEN_XML_ReadFile(root, fileName, TM_TYPEMANAGER_XMLFLAGS);
407  if (rv<0) {
408  DBG_ERROR(GWEN_LOGDOMAIN, "Could not load typefile [%s] (%d)", fileName, rv);
409  GWEN_XMLNode_free(root);
410  return rv;
411  }
412 
413  /* get <tm2> element */
414  node=GWEN_XMLNode_FindFirstTag(root, "tm2", NULL, NULL);
415  if (node==NULL) {
417  "File [%s] does not contain a tm2 element",
418  fileName);
419  GWEN_XMLNode_free(root);
420  return GWEN_ERROR_NO_DATA;
421  }
422 
423  /* get <type> element with id==typeName and wanted language */
424  node=GWEN_XMLNode_FindFirstTag(node, "type", NULL, NULL);
425  if (node==NULL) {
427  "File [%s] does not contain a type element",
428  fileName);
429  GWEN_XMLNode_free(root);
430  return GWEN_ERROR_NO_DATA;
431  }
432 
433  /* read all types from the file */
434  tl=Typemaker2_Type_List2_new();
435  while (node) {
436  /* load type from XML element */
437  ty=Typemaker2_Type_new();
438  rv=Typemaker2_Type_readXml(ty, node, tym->lang);
439  if (rv<0) {
440  DBG_INFO(GWEN_LOGDOMAIN, "Error reading type from file [%s] (%d)",
441  fileName,
442  rv);
444  GWEN_XMLNode_free(root);
445  Typemaker2_Type_List2_free(tl);
446  return rv;
447  }
448 
449  /* preset some stuff */
450  if (1) {
451  const char *x;
452 
454  if (!x || !(*x))
455  Typemaker2_Type_SetExtends(ty, "struct_base");
456  }
457 
458  /* add first, because other types might want to refer to this one */
459  Typemaker2_Type_List_Add(ty, tym->typeList);
460  Typemaker2_Type_List2_PushBack(tl, ty);
461 
468 
469  node=GWEN_XMLNode_FindNextTag(node, "type", NULL, NULL);
470  }
471 
472  GWEN_XMLNode_free(root);
473 
474  //Typemaker2_TypeManager_Dump(tym, stderr, 2);
475 
476  /* set type pointers first */
477  it=Typemaker2_Type_List2_First(tl);
478  if (it) {
479  ty=Typemaker2_Type_List2Iterator_Data(it);
480  while (ty) {
481  /* set type pointers in this type structure */
483  if (rv<0) {
484  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
485  Typemaker2_Type_List2Iterator_free(it);
486  Typemaker2_Type_List2_free(tl);
487  return rv;
488  }
489 
490  /* handle next type */
491  ty=Typemaker2_Type_List2Iterator_Next(it);
492  }
493  Typemaker2_Type_List2Iterator_free(it);
494  }
495 
496  /* now set member pointers */
497  it=Typemaker2_Type_List2_First(tl);
498  if (it) {
499  ty=Typemaker2_Type_List2Iterator_Data(it);
500  while (ty) {
501  /* set type pointers in the member structures */
503  if (rv<0) {
504  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
505  Typemaker2_Type_List2Iterator_free(it);
506  Typemaker2_Type_List2_free(tl);
507  return rv;
508  }
509 
510  /* add to provided list2 */
511  Typemaker2_Type_List2_PushBack(tlist2, ty);
512  /* handle next type */
513  ty=Typemaker2_Type_List2Iterator_Next(it);
514  }
515  Typemaker2_Type_List2Iterator_free(it);
516  }
517 
518  /* done, free list */
519  Typemaker2_Type_List2_free(tl);
520 
521  return 0;
522 }
523 
524 
525 
527  TYPEMAKER2_TYPE_LIST2 *tlist2)
528 {
529  int rv;
530  TYPEMAKER2_TYPE *ty=NULL;
531  GWEN_XMLNODE *root;
532  GWEN_XMLNODE *node;
533 
534  /* read XML file */
536 
537  rv=GWEN_XML_ReadFile(root, fileName, TM_TYPEMANAGER_XMLFLAGS);
538  if (rv<0) {
539  DBG_ERROR(GWEN_LOGDOMAIN, "Could not load typefile [%s] (%d)", fileName, rv);
540  GWEN_XMLNode_free(root);
541  return rv;
542  }
543 
544  /* get <tm2> element */
545  node=GWEN_XMLNode_FindFirstTag(root, "tm2", NULL, NULL);
546  if (node==NULL) {
548  "File [%s] does not contain a tm2 element",
549  fileName);
550  GWEN_XMLNode_free(root);
551  return GWEN_ERROR_NO_DATA;
552  }
553 
554  /* get <type> element with id==typeName and wanted language */
555  node=GWEN_XMLNode_FindFirstTag(node, "type", NULL, NULL);
556  if (node==NULL) {
558  "File [%s] does not contain a type element",
559  fileName);
560  GWEN_XMLNode_free(root);
561  return GWEN_ERROR_NO_DATA;
562  }
563 
564  /* read all types from the file */
565  while (node) {
566  /* load type from XML element */
567  ty=Typemaker2_Type_new();
568  rv=Typemaker2_Type_readXml(ty, node, tym->lang);
569  if (rv<0) {
570  DBG_INFO(GWEN_LOGDOMAIN, "Error reading type from file [%s] (%d)",
571  fileName,
572  rv);
574  GWEN_XMLNode_free(root);
575  return rv;
576  }
577 
578  /* preset some stuff */
579  if (1) {
580  const char *x;
581 
583  if (!x || !(*x))
584  Typemaker2_Type_SetExtends(ty, "struct_base");
585  }
586 
587  /* add first, because other types might want to refer to this one */
588  Typemaker2_Type_List_Add(ty, tym->typeList);
589  Typemaker2_Type_List2_PushBack(tlist2, ty);
590 
597 
598  node=GWEN_XMLNode_FindNextTag(node, "type", NULL, NULL);
599  }
600 
601  GWEN_XMLNode_free(root);
602 
603  //Typemaker2_TypeManager_Dump(tym, stderr, 2);
604 
605  return 0;
606 }
607 
608 
609 
611 {
613  const char *s;
614 
616  if (s && *s) {
617  TYPEMAKER2_TYPE *tt;
618 
620  if (tt==NULL) {
621  DBG_INFO(GWEN_LOGDOMAIN, "Type for \"extends\" not found [%s]", s);
622  return GWEN_ERROR_NOT_FOUND;
623  }
625  }
626  }
627 
629  const char *s;
630 
632  if (s && *s) {
633  TYPEMAKER2_TYPE *tt;
634 
636  if (tt==NULL) {
637  DBG_INFO(GWEN_LOGDOMAIN, "Type for \"basetype\" not found [%s]", s);
638  return GWEN_ERROR_NOT_FOUND;
639  }
641  }
642  }
643 
645  const char *s;
646 
648  if (s && *s) {
649  TYPEMAKER2_TYPE *tt;
650 
652  if (tt==NULL) {
653  DBG_INFO(GWEN_LOGDOMAIN, "Type for \"inherits\" not found [%s]", s);
654  return GWEN_ERROR_NOT_FOUND;
655  }
657  }
658  }
659 
660  return 0;
661 }
662 
663 
664 
666 {
667  TYPEMAKER2_MEMBER_LIST *ml;
668 
670  if (ml) {
672  int pos=0;
673 
674  /* set pointers */
675  m=Typemaker2_Member_List_First(ml);
676  while (m) {
678  const char *s;
679 
680  /* set type pointer */
682  if (s && *s) {
683  TYPEMAKER2_TYPE *tt;
684 
686  if (tt==NULL) {
687  DBG_INFO(GWEN_LOGDOMAIN, "Type for \"type\" not found [%s]", s);
688  return GWEN_ERROR_NOT_FOUND;
689  }
691  }
692 
693  /* set enum pointer (if any) */
697  if (s && *s) {
699  if (te)
701  else {
702  DBG_ERROR(GWEN_LOGDOMAIN, "Enum [%s] not found", s);
703  return GWEN_ERROR_NOT_FOUND;
704  }
705  }
706  }
707  }
708 
709  m=Typemaker2_Member_List_Next(m);
710  }
711 
712  /* update member positions (needed for toObject/fromObject functions) */
713  m=Typemaker2_Member_List_First(ml);
714  while (m) {
716  const char *s;
717 
719 
720  /* create field id */
722  if (s && *s) {
723  GWEN_BUFFER *tbuf;
724  char *p;
725 
726  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
727  GWEN_Buffer_AppendString(tbuf, s);
728  GWEN_Buffer_AppendString(tbuf, "_FIELD_");
730  GWEN_Buffer_AppendString(tbuf, s);
731  /* all in capitals */
732  p=GWEN_Buffer_GetStart(tbuf);
733  while (*p) {
734  *p=toupper(*p);
735  p++;
736  }
737 
739  GWEN_Buffer_free(tbuf);
740  }
741  }
742 
743  m=Typemaker2_Member_List_Next(m);
744  }
746  if (pos) {
747  const char *s;
748 
749  /* create field id */
751  if (s && *s) {
752  GWEN_BUFFER *tbuf;
753  char *p;
754 
755  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
756  GWEN_Buffer_AppendString(tbuf, s);
757  GWEN_Buffer_AppendString(tbuf, "_FIELD_COUNT");
758  /* all in capitals */
759  p=GWEN_Buffer_GetStart(tbuf);
760  while (*p) {
761  *p=toupper(*p);
762  p++;
763  }
764 
766  GWEN_Buffer_free(tbuf);
767  }
768 
769  }
770  }
771 
772  return 0;
773 }
774 
775 
776 
778 {
779  TYPEMAKER2_TYPE *ty;
780 
782  if (ty==NULL) {
784  if (ty) {
785  int rv;
786 
787  /* add first, because other types might want to refer to this one */
788  Typemaker2_Type_List_Add(ty, tym->typeList);
789 
790  /* set type pointers in this type structure */
792  if (rv<0) {
793  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
794  return NULL;
795  }
796 
797  /* set type pointers in the member structures */
799  if (rv<0) {
800  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
801  return NULL;
802  }
803  }
804  else {
805  DBG_INFO(GWEN_LOGDOMAIN, "here");
806  }
807  }
808 
809  if (ty==NULL) {
810  DBG_INFO(GWEN_LOGDOMAIN, "Type [%s] not found", s);
811  }
812 
813  return ty;
814 }
815 
816 
817 
819 {
820  TYPEMAKER2_TYPE *ty;
821  int i;
822 
823  for (i=0; i<indent; i++)
824  fprintf(f, " ");
825  fprintf(f, "TypeManager\n");
826 
827  for (i=0; i<indent; i++)
828  fprintf(f, " ");
829  fprintf(f, "Types\n");
830 
831  ty=Typemaker2_Type_List_First(tym->typeList);
832  while (ty) {
833  Typemaker2_Type_Dump(ty, f, indent+2);
834  ty=Typemaker2_Type_List_Next(ty);
835  }
836 }
837 
838 
839 
840 
841 
void Typemaker2_TypeManager_AddFolder(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
const char * Typemaker2_Member_GetTypeName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:105
void Typemaker2_Type_SetExtends(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:276
TYPEMAKER2_TYPE * Typemaker2_TypeManager_GetType(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:467
void Typemaker2_Type_SetIdentifier(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:552
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
void Typemaker2_Type_Dump(TYPEMAKER2_TYPE *ty, FILE *f, int indent)
Definition: tm_type.c:1229
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:237
void Typemaker2_Type_SetNonVolatileMemberCount(TYPEMAKER2_TYPE *ty, int i)
Definition: tm_type.c:740
int Typemaker2_Type_readXml(TYPEMAKER2_TYPE *ty, GWEN_XMLNODE *node, const char *wantedLang)
Definition: tm_type.c:833
void Typemaker2_Type_free(TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:65
const char * Typemaker2_Type_GetExtends(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:267
TYPEMAKER2_TYPE * Typemaker2_TypeManager_FindType(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
TYPEMAKER2_TYPE * Typemaker2_Type_GetExtendsPtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:587
void Typemaker2_Type_SetBaseTypePtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:632
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
TYPEMAKER2_ENUM * Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:485
void Typemaker2_Type_SetInheritsPtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:614
void Typemaker2_TypeManager_Dump(TYPEMAKER2_TYPEMANAGER *tym, FILE *f, int indent)
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:1297
void Typemaker2_Member_SetFieldId(TYPEMAKER2_MEMBER *tm, const char *s)
Definition: tm_member.c:180
TYPEMAKER2_TYPE * Typemaker2_TypeManager_LoadType(TYPEMAKER2_TYPEMANAGER *tym, const char *typeName)
TYPEMAKER2_TYPE * Typemaker2_Type_GetBaseTypePtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:623
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
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
void Typemaker2_Type_SetPrefix(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:574
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
TYPEMAKER2_TYPE * Typemaker2_Type_new()
Definition: tm_type.c:32
int Typemaker2_TypeManager_LoadTypeFile2(TYPEMAKER2_TYPEMANAGER *tym, const char *fileName, TYPEMAKER2_TYPE_LIST2 *tlist2)
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:245
void Typemaker2_Member_SetEnumPtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_ENUM *te)
Definition: tm_member.c:494
void Typemaker2_Type_SetBaseType(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:302
GWENHYWFAR_API int GWEN_Directory_FindFileInPaths(const GWEN_STRINGLIST *paths, const char *filePath, GWEN_BUFFER *fbuf)
int Typemaker2_TypeManager_SetMemberTypePtrs(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:543
void Typemaker2_TypeManager_free(TYPEMAKER2_TYPEMANAGER *tym)
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE
Definition: tm_type.h:60
int Typemaker2_TypeManager_MakeTypeDerivatives(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty, const char *baseType, const char *nType, const char *nPrefix)
const char * Typemaker2_Type_GetInherits(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:315
void Typemaker2_Member_SetTypePtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_TYPE *ty)
Definition: tm_member.c:476
#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
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
TYPEMAKER2_TYPEMANAGER * Typemaker2_TypeManager_new()
const char * Typemaker2_Type_GetName(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:127
void Typemaker2_Type_SetFieldCountId(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:758
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition: tm_type.h:21
const char * Typemaker2_Type_GetBaseType(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:289
int Typemaker2_TypeManager_MakeTypeList1(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
void Typemaker2_Type_SetType(TYPEMAKER2_TYPE *ty, int i)
Definition: tm_type.c:186
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
#define GWEN_ERROR_NOT_FOUND
Definition: error.h:89
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
void Typemaker2_TypeManager_AddType(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
int Typemaker2_TypeManager_MakeTypeList2(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
void Typemaker2_TypeManager_SetApiDeclaration(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
TYPEMAKER2_TYPE * Typemaker2_Type_GetInheritsPtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:605
int Typemaker2_TypeManager_MakeTypeTree(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
void Typemaker2_Type_SetName(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:136
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
const char * Typemaker2_Member_GetEnumId(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:193
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
void Typemaker2_Type_SetExtendsPtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:596
void Typemaker2_TypeManager_SetLanguage(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
#define GWEN_ERROR_NO_DATA
Definition: error.h:94
void Typemaker2_Member_SetMemberPosition(TYPEMAKER2_MEMBER *tm, int i)
Definition: tm_member.c:548
const char * Typemaker2_TypeManager_GetLanguage(const TYPEMAKER2_TYPEMANAGER *tym)
int Typemaker2_TypeManager_SetTypePtrs(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
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
TYPEMAKER2_ENUM * Typemaker2_Type_FindEnum(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:1334
#define TYPEMAKER2_FLAGS_VOLATILE
Definition: tm_type.h:32
int Typemaker2_TypeManager_LoadTypeFileNoLookup(TYPEMAKER2_TYPEMANAGER *tym, const char *fileName, TYPEMAKER2_TYPE_LIST2 *tlist2)
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
#define TM_TYPEMANAGER_XMLFLAGS
TYPEMAKER2_TYPE * Typemaker2_TypeManager_LoadTypeFile(TYPEMAKER2_TYPEMANAGER *tym, const char *fileName)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1
Definition: tm_type.h:56