gwenhywfar  4.99.8beta
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 
37 
39 
40  tym->typeList=Typemaker2_Type_List_new();
41  tym->folders=GWEN_StringList_new();
42  tym->lang=strdup("c");
43 
44 
45  return tym;
46 }
47 
48 
49 
51  if (tym) {
52  Typemaker2_Type_List_free(tym->typeList);
53  GWEN_StringList_free(tym->folders);
54  GWEN_FREE_OBJECT(tym);
55  }
56 }
57 
58 
59 
61  assert(tym);
62  return tym->lang;
63 }
64 
65 
66 
68  assert(tym);
69  free(tym->lang);
70  if (s) tym->lang=strdup(s);
71  else tym->lang=NULL;
72 }
73 
74 
75 
77  assert(tym);
78  return tym->apiDeclaration;
79 }
80 
81 
82 
84  assert(tym);
85  free(tym->apiDeclaration);
86  if (s) tym->apiDeclaration=strdup(s);
87  else tym->apiDeclaration=NULL;
88 }
89 
90 
91 
93  assert(tym);
94  GWEN_StringList_AppendString(tym->folders, s, 0, 1);
95 }
96 
97 
98 
100  assert(tym);
101  Typemaker2_Type_List_Add(ty, tym->typeList);
102 }
103 
104 
105 
107  TYPEMAKER2_TYPE *ty;
108 
109  assert(tym);
110  ty=Typemaker2_Type_List_First(tym->typeList);
111  while(ty) {
112  const char *n;
113 
115  if (n && strcasecmp(s, n)==0)
116  break;
117  ty=Typemaker2_Type_List_Next(ty);
118  }
119 
120  return ty;
121 }
122 
123 
124 
126  GWEN_BUFFER *tbuf;
127  GWEN_BUFFER *nbuf;
128  char *p;
129  int rv;
130  TYPEMAKER2_TYPE *ty=NULL;
131  GWEN_XMLNODE *root;
132  GWEN_XMLNODE *node;
133 
134  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
135  GWEN_Buffer_AppendString(tbuf, typeName);
136  p=GWEN_Buffer_GetStart(tbuf);
137  while(*p) {
138  *p=tolower(*p);
139  p++;
140  }
141  GWEN_Buffer_AppendString(tbuf, ".tm2");
142 
143  nbuf=GWEN_Buffer_new(0, 256, 0, 1);
144  rv=GWEN_Directory_FindFileInPaths(tym->folders, GWEN_Buffer_GetStart(tbuf), nbuf);
145  if (rv<0) {
146  DBG_ERROR(GWEN_LOGDOMAIN, "Typefile [%s] not found (%d)", GWEN_Buffer_GetStart(tbuf), rv);
147  GWEN_Buffer_free(nbuf);
148  GWEN_Buffer_free(tbuf);
149  return NULL;
150  }
151 
152  /* read XML file */
154 
156  if (rv<0) {
157  DBG_ERROR(GWEN_LOGDOMAIN, "Could not load typefile [%s] (%d)", GWEN_Buffer_GetStart(nbuf), rv);
158  GWEN_XMLNode_free(root);
159  GWEN_Buffer_free(nbuf);
160  GWEN_Buffer_free(tbuf);
161  return NULL;
162  }
163 
164  /* get <tm2> element */
165  node=GWEN_XMLNode_FindFirstTag(root, "tm2", NULL, NULL);
166  if (node==NULL) {
168  "File [%s] does not contain a tm2 element",
169  GWEN_Buffer_GetStart(nbuf));
170  GWEN_XMLNode_free(root);
171  GWEN_Buffer_free(nbuf);
172  GWEN_Buffer_free(tbuf);
173  return NULL;
174  }
175 
176  /* get <typedef> element with id==typeName and wanted language */
177  node=GWEN_XMLNode_FindFirstTag(node, "typedef", "id", typeName);
178  while(node) {
179  const char *s=GWEN_XMLNode_GetProperty(node, "lang", NULL);
180  if (s && *s && strcasecmp(s, tym->lang)==0)
181  break;
182  node=GWEN_XMLNode_FindNextTag(node, "typedef", "id", typeName);
183  }
184  if (node==NULL) {
186  "File [%s] does not contain a <typedef> element for type [%s] and language [%s]",
187  GWEN_Buffer_GetStart(nbuf), typeName, tym->lang);
188  GWEN_XMLNode_free(root);
189  GWEN_Buffer_free(nbuf);
190  GWEN_Buffer_free(tbuf);
191  return NULL;
192  }
193 
194  /* load typedef from XML element */
195  ty=Typemaker2_Type_new();
196  rv=Typemaker2_Type_readXml(ty, node, NULL);
197  if (rv<0) {
198  DBG_INFO(GWEN_LOGDOMAIN, "Error reading type [%s] from file [%s] (%d)",
199  typeName,
200  GWEN_Buffer_GetStart(nbuf),
201  rv);
203  GWEN_XMLNode_free(root);
204  GWEN_Buffer_free(nbuf);
205  GWEN_Buffer_free(tbuf);
206  return NULL;
207  }
208 
209  GWEN_XMLNode_free(root);
210  GWEN_Buffer_free(nbuf);
211  GWEN_Buffer_free(tbuf);
212 
213  return ty;
214 }
215 
216 
217 
219  TYPEMAKER2_TYPE *ty,
220  const char *baseType,
221  const char *nType, const char *nPrefix) {
222  TYPEMAKER2_TYPE *t2;
223  char tbuf[256];
224  int rv;
225 
226  t2=Typemaker2_Type_new();
227  Typemaker2_Type_SetExtends(t2, baseType);
230 
231  snprintf(tbuf, sizeof(tbuf)-1, "%s_%s", Typemaker2_Type_GetName(ty), nType);
232  tbuf[sizeof(tbuf)-1]=0;
233  Typemaker2_Type_SetName(t2, tbuf);
234 
235  snprintf(tbuf, sizeof(tbuf)-1, "%s_%s", Typemaker2_Type_GetIdentifier(ty), nType);
236  tbuf[sizeof(tbuf)-1]=0;
238 
239  snprintf(tbuf, sizeof(tbuf)-1, "%s_%s", Typemaker2_Type_GetPrefix(ty), nPrefix);
240  tbuf[sizeof(tbuf)-1]=0;
241  Typemaker2_Type_SetPrefix(t2, tbuf);
242 
244 
245  /* set type pointers in this type structure */
247  if (rv<0) {
248  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
249  return rv;
250  }
252  if (rv<0) {
253  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
254  return rv;
255  }
256 
257  return 0;
258 }
259 
260 
261 
263  return Typemaker2_TypeManager_MakeTypeDerivatives(tym, ty, "list1_base", "LIST", "List");
264 }
265 
266 
267 
269  return Typemaker2_TypeManager_MakeTypeDerivatives(tym, ty, "list2_base", "LIST2", "List2");
270 }
271 
272 
273 
275  return Typemaker2_TypeManager_MakeTypeDerivatives(tym, ty, "tree_base", "TREE", "Tree");
276 }
277 
278 
279 
281  int rv;
282  TYPEMAKER2_TYPE *ty=NULL;
283  GWEN_XMLNODE *root;
284  GWEN_XMLNODE *node;
285 
286  /* read XML file */
288 
289  rv=GWEN_XML_ReadFile(root, fileName, TM_TYPEMANAGER_XMLFLAGS);
290  if (rv<0) {
291  DBG_ERROR(GWEN_LOGDOMAIN, "Could not load typefile [%s] (%d)", fileName, rv);
292  GWEN_XMLNode_free(root);
293  return NULL;
294  }
295 
296  /* get <tm2> element */
297  node=GWEN_XMLNode_FindFirstTag(root, "tm2", NULL, NULL);
298  if (node==NULL) {
300  "File [%s] does not contain a tm2 element",
301  fileName);
302  GWEN_XMLNode_free(root);
303  return NULL;
304  }
305 
306  /* get <type> element with id==typeName and wanted language */
307  node=GWEN_XMLNode_FindFirstTag(node, "type", NULL, NULL);
308  if (node==NULL) {
310  "File [%s] does not contain a type element",
311  fileName);
312  GWEN_XMLNode_free(root);
313  return NULL;
314  }
315 
316  /* load type from XML element */
317  ty=Typemaker2_Type_new();
318  rv=Typemaker2_Type_readXml(ty, node, tym->lang);
319  if (rv<0) {
320  DBG_INFO(GWEN_LOGDOMAIN, "Error reading type from file [%s] (%d)",
321  fileName,
322  rv);
324  GWEN_XMLNode_free(root);
325  return NULL;
326  }
327 
328  GWEN_XMLNode_free(root);
329 
330  /* preset some stuff */
331  if (1) {
332  const char *x;
333 
335  if (!x || !(*x))
336  Typemaker2_Type_SetExtends(ty, "struct_base");
337  }
338 
339  /* add first, because other types might want to refer to this one */
340  Typemaker2_Type_List_Add(ty, tym->typeList);
341 
342 
349 
350  //Typemaker2_TypeManager_Dump(tym, stderr, 2);
351 
352  /* set type pointers in this type structure */
354  if (rv<0) {
355  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
357  return NULL;
358  }
359 
360  /* set type pointers in the member structures */
362  if (rv<0) {
363  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
365  return NULL;
366  }
367 
368 
369  return ty;
370 }
371 
372 
373 
375  TYPEMAKER2_TYPE_LIST2 *tlist2) {
376  int rv;
377  TYPEMAKER2_TYPE *ty=NULL;
378  GWEN_XMLNODE *root;
379  GWEN_XMLNODE *node;
380  TYPEMAKER2_TYPE_LIST2 *tl;
381  TYPEMAKER2_TYPE_LIST2_ITERATOR *it;
382 
383  /* read XML file */
385 
386  rv=GWEN_XML_ReadFile(root, fileName, TM_TYPEMANAGER_XMLFLAGS);
387  if (rv<0) {
388  DBG_ERROR(GWEN_LOGDOMAIN, "Could not load typefile [%s] (%d)", fileName, rv);
389  GWEN_XMLNode_free(root);
390  return rv;
391  }
392 
393  /* get <tm2> element */
394  node=GWEN_XMLNode_FindFirstTag(root, "tm2", NULL, NULL);
395  if (node==NULL) {
397  "File [%s] does not contain a tm2 element",
398  fileName);
399  GWEN_XMLNode_free(root);
400  return GWEN_ERROR_NO_DATA;
401  }
402 
403  /* get <type> element with id==typeName and wanted language */
404  node=GWEN_XMLNode_FindFirstTag(node, "type", NULL, NULL);
405  if (node==NULL) {
407  "File [%s] does not contain a type element",
408  fileName);
409  GWEN_XMLNode_free(root);
410  return GWEN_ERROR_NO_DATA;
411  }
412 
413  /* read all types from the file */
414  tl=Typemaker2_Type_List2_new();
415  while(node) {
416  /* load type from XML element */
417  ty=Typemaker2_Type_new();
418  rv=Typemaker2_Type_readXml(ty, node, tym->lang);
419  if (rv<0) {
420  DBG_INFO(GWEN_LOGDOMAIN, "Error reading type from file [%s] (%d)",
421  fileName,
422  rv);
424  GWEN_XMLNode_free(root);
425  Typemaker2_Type_List2_free(tl);
426  return rv;
427  }
428 
429  /* preset some stuff */
430  if (1) {
431  const char *x;
432 
434  if (!x || !(*x))
435  Typemaker2_Type_SetExtends(ty, "struct_base");
436  }
437 
438  /* add first, because other types might want to refer to this one */
439  Typemaker2_Type_List_Add(ty, tym->typeList);
440  Typemaker2_Type_List2_PushBack(tl, ty);
441 
448 
449  node=GWEN_XMLNode_FindNextTag(node, "type", NULL, NULL);
450  }
451 
452  GWEN_XMLNode_free(root);
453 
454  //Typemaker2_TypeManager_Dump(tym, stderr, 2);
455 
456  /* set type pointers first */
457  it=Typemaker2_Type_List2_First(tl);
458  if(it) {
459  ty=Typemaker2_Type_List2Iterator_Data(it);
460  while(ty) {
461  /* set type pointers in this type structure */
463  if (rv<0) {
464  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
465  Typemaker2_Type_List2Iterator_free(it);
466  Typemaker2_Type_List2_free(tl);
467  return rv;
468  }
469 
470  /* handle next type */
471  ty=Typemaker2_Type_List2Iterator_Next(it);
472  }
473  Typemaker2_Type_List2Iterator_free(it);
474  }
475 
476  /* now set member pointers */
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 the member structures */
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  /* add to provided list2 */
491  Typemaker2_Type_List2_PushBack(tlist2, ty);
492  /* handle next type */
493  ty=Typemaker2_Type_List2Iterator_Next(it);
494  }
495  Typemaker2_Type_List2Iterator_free(it);
496  }
497 
498  /* done, free list */
499  Typemaker2_Type_List2_free(tl);
500 
501  return 0;
502 }
503 
504 
505 
507  TYPEMAKER2_TYPE_LIST2 *tlist2) {
508  int rv;
509  TYPEMAKER2_TYPE *ty=NULL;
510  GWEN_XMLNODE *root;
511  GWEN_XMLNODE *node;
512 
513  /* read XML file */
515 
516  rv=GWEN_XML_ReadFile(root, fileName, TM_TYPEMANAGER_XMLFLAGS);
517  if (rv<0) {
518  DBG_ERROR(GWEN_LOGDOMAIN, "Could not load typefile [%s] (%d)", fileName, rv);
519  GWEN_XMLNode_free(root);
520  return rv;
521  }
522 
523  /* get <tm2> element */
524  node=GWEN_XMLNode_FindFirstTag(root, "tm2", NULL, NULL);
525  if (node==NULL) {
527  "File [%s] does not contain a tm2 element",
528  fileName);
529  GWEN_XMLNode_free(root);
530  return GWEN_ERROR_NO_DATA;
531  }
532 
533  /* get <type> element with id==typeName and wanted language */
534  node=GWEN_XMLNode_FindFirstTag(node, "type", NULL, NULL);
535  if (node==NULL) {
537  "File [%s] does not contain a type element",
538  fileName);
539  GWEN_XMLNode_free(root);
540  return GWEN_ERROR_NO_DATA;
541  }
542 
543  /* read all types from the file */
544  while(node) {
545  /* load type from XML element */
546  ty=Typemaker2_Type_new();
547  rv=Typemaker2_Type_readXml(ty, node, tym->lang);
548  if (rv<0) {
549  DBG_INFO(GWEN_LOGDOMAIN, "Error reading type from file [%s] (%d)",
550  fileName,
551  rv);
553  GWEN_XMLNode_free(root);
554  return rv;
555  }
556 
557  /* preset some stuff */
558  if (1) {
559  const char *x;
560 
562  if (!x || !(*x))
563  Typemaker2_Type_SetExtends(ty, "struct_base");
564  }
565 
566  /* add first, because other types might want to refer to this one */
567  Typemaker2_Type_List_Add(ty, tym->typeList);
568  Typemaker2_Type_List2_PushBack(tlist2, ty);
569 
576 
577  node=GWEN_XMLNode_FindNextTag(node, "type", NULL, NULL);
578  }
579 
580  GWEN_XMLNode_free(root);
581 
582  //Typemaker2_TypeManager_Dump(tym, stderr, 2);
583 
584  return 0;
585 }
586 
587 
588 
591  const char *s;
592 
594  if (s && *s) {
595  TYPEMAKER2_TYPE *tt;
596 
598  if (tt==NULL) {
599  DBG_INFO(GWEN_LOGDOMAIN, "Type for \"extends\" not found [%s]", s);
600  return GWEN_ERROR_NOT_FOUND;
601  }
603  }
604  }
605 
607  const char *s;
608 
610  if (s && *s) {
611  TYPEMAKER2_TYPE *tt;
612 
614  if (tt==NULL) {
615  DBG_INFO(GWEN_LOGDOMAIN, "Type for \"basetype\" not found [%s]", s);
616  return GWEN_ERROR_NOT_FOUND;
617  }
619  }
620  }
621 
623  const char *s;
624 
626  if (s && *s) {
627  TYPEMAKER2_TYPE *tt;
628 
630  if (tt==NULL) {
631  DBG_INFO(GWEN_LOGDOMAIN, "Type for \"inherits\" not found [%s]", s);
632  return GWEN_ERROR_NOT_FOUND;
633  }
635  }
636  }
637 
638  return 0;
639 }
640 
641 
642 
644  TYPEMAKER2_MEMBER_LIST *ml;
645 
647  if (ml) {
649  int pos=0;
650 
651  /* set pointers */
652  m=Typemaker2_Member_List_First(ml);
653  while(m) {
655  const char *s;
656 
657  /* set type pointer */
659  if (s && *s) {
660  TYPEMAKER2_TYPE *tt;
661 
663  if (tt==NULL) {
664  DBG_INFO(GWEN_LOGDOMAIN, "Type for \"type\" not found [%s]", s);
665  return GWEN_ERROR_NOT_FOUND;
666  }
668  }
669 
670  /* set enum pointer (if any) */
674  if (s && *s) {
676  if (te)
678  else {
679  DBG_ERROR(GWEN_LOGDOMAIN, "Enum [%s] not found", s);
680  return GWEN_ERROR_NOT_FOUND;
681  }
682  }
683  }
684  }
685 
686  m=Typemaker2_Member_List_Next(m);
687  }
688 
689  /* update member positions (needed for toObject/fromObject functions) */
690  m=Typemaker2_Member_List_First(ml);
691  while(m) {
693  const char *s;
694 
696 
697  /* create field id */
699  if (s && *s) {
700  GWEN_BUFFER *tbuf;
701  char *p;
702 
703  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
704  GWEN_Buffer_AppendString(tbuf, s);
705  GWEN_Buffer_AppendString(tbuf, "_FIELD_");
707  GWEN_Buffer_AppendString(tbuf, s);
708  /* all in capitals */
709  p=GWEN_Buffer_GetStart(tbuf);
710  while(*p) {
711  *p=toupper(*p);
712  p++;
713  }
714 
716  GWEN_Buffer_free(tbuf);
717  }
718  }
719 
720  m=Typemaker2_Member_List_Next(m);
721  }
723  if (pos) {
724  const char *s;
725 
726  /* create field id */
728  if (s && *s) {
729  GWEN_BUFFER *tbuf;
730  char *p;
731 
732  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
733  GWEN_Buffer_AppendString(tbuf, s);
734  GWEN_Buffer_AppendString(tbuf, "_FIELD_COUNT");
735  /* all in capitals */
736  p=GWEN_Buffer_GetStart(tbuf);
737  while(*p) {
738  *p=toupper(*p);
739  p++;
740  }
741 
743  GWEN_Buffer_free(tbuf);
744  }
745 
746  }
747  }
748 
749  return 0;
750 }
751 
752 
753 
755  TYPEMAKER2_TYPE *ty;
756 
758  if (ty==NULL) {
760  if (ty) {
761  int rv;
762 
763  /* add first, because other types might want to refer to this one */
764  Typemaker2_Type_List_Add(ty, tym->typeList);
765 
766  /* set type pointers in this type structure */
768  if (rv<0) {
769  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
770  return NULL;
771  }
772 
773  /* set type pointers in the member structures */
775  if (rv<0) {
776  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
777  return NULL;
778  }
779  }
780  else {
781  DBG_INFO(GWEN_LOGDOMAIN, "here");
782  }
783  }
784 
785  if (ty==NULL) {
786  DBG_INFO(GWEN_LOGDOMAIN, "Type [%s] not found", s);
787  }
788 
789  return ty;
790 }
791 
792 
793 
794 void Typemaker2_TypeManager_Dump(TYPEMAKER2_TYPEMANAGER *tym, FILE *f, int indent) {
795  TYPEMAKER2_TYPE *ty;
796  int i;
797 
798  for (i=0; i<indent; i++) fprintf(f, " ");
799  fprintf(f, "TypeManager\n");
800 
801  for (i=0; i<indent; i++) fprintf(f, " ");
802  fprintf(f, "Types\n");
803 
804  ty=Typemaker2_Type_List_First(tym->typeList);
805  while(ty) {
806  Typemaker2_Type_Dump(ty, f, indent+2);
807  ty=Typemaker2_Type_List_Next(ty);
808  }
809 }
810 
811 
812 
813 
814 
void Typemaker2_TypeManager_AddFolder(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
const char * Typemaker2_Member_GetTypeName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:98
void Typemaker2_Type_SetExtends(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:250
TYPEMAKER2_TYPE * Typemaker2_TypeManager_GetType(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:410
void Typemaker2_Type_SetIdentifier(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:492
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
void Typemaker2_Type_Dump(TYPEMAKER2_TYPE *ty, FILE *f, int indent)
Definition: tm_type.c:1138
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:206
void Typemaker2_Type_SetNonVolatileMemberCount(TYPEMAKER2_TYPE *ty, int i)
Definition: tm_type.c:656
int Typemaker2_Type_readXml(TYPEMAKER2_TYPE *ty, GWEN_XMLNODE *node, const char *wantedLang)
Definition: tm_type.c:743
void Typemaker2_Type_free(TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:64
const char * Typemaker2_Type_GetExtends(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:242
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:228
TYPEMAKER2_TYPE * Typemaker2_Type_GetExtendsPtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:520
void Typemaker2_Type_SetBaseTypePtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:560
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:712
TYPEMAKER2_ENUM * Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:426
void Typemaker2_Type_SetInheritsPtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:544
void Typemaker2_TypeManager_Dump(TYPEMAKER2_TYPEMANAGER *tym, FILE *f, int indent)
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:973
void Typemaker2_Member_SetFieldId(TYPEMAKER2_MEMBER *tm, const char *s)
Definition: tm_member.c:160
TYPEMAKER2_TYPE * Typemaker2_TypeManager_LoadType(TYPEMAKER2_TYPEMANAGER *tym, const char *typeName)
TYPEMAKER2_TYPE * Typemaker2_Type_GetBaseTypePtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:552
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:137
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:38
void Typemaker2_Type_SetPrefix(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:510
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:57
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:695
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:86
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:230
void Typemaker2_Member_SetEnumPtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_ENUM *te)
Definition: tm_member.c:434
void Typemaker2_Type_SetBaseType(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:272
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:484
void Typemaker2_TypeManager_free(TYPEMAKER2_TYPEMANAGER *tym)
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE
Definition: tm_type.h:59
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:282
void Typemaker2_Member_SetTypePtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_TYPE *ty)
Definition: tm_member.c:418
#define TYPEMAKER2_FLAGS_ENUM
Definition: tm_type.h:38
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:568
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:83
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:152
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
TYPEMAKER2_TYPEMANAGER * Typemaker2_TypeManager_new()
const char * Typemaker2_Type_GetName(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:124
void Typemaker2_Type_SetFieldCountId(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:672
#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:260
int Typemaker2_TypeManager_MakeTypeList1(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
void Typemaker2_Type_SetType(TYPEMAKER2_TYPE *ty, int i)
Definition: tm_type.c:174
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
#define GWEN_ERROR_NOT_FOUND
Definition: error.h:89
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
void Typemaker2_TypeManager_AddType(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:502
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:536
int Typemaker2_TypeManager_MakeTypeTree(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
void Typemaker2_Type_SetName(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:132
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
const char * Typemaker2_Member_GetEnumId(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:170
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
void Typemaker2_Type_SetExtendsPtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:528
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:482
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:46
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:304
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST2
Definition: tm_type.h:56
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:80
TYPEMAKER2_ENUM * Typemaker2_Type_FindEnum(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:1222
#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:148
#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:1014
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1
Definition: tm_type.h:55