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);
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;
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",
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 */
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,
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
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;
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;
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 */
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;
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 */
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;
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 */
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);
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);
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);
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);
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);
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);
728 GWEN_Buffer_AppendString(tbuf, "_FIELD_");
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);
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
#define NULL
Definition: binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWENHYWFAR_API int GWEN_Directory_FindFileInPaths(const GWEN_STRINGLIST *paths, const char *filePath, GWEN_BUFFER *fbuf)
#define GWEN_ERROR_NOT_FOUND
Definition: error.h:89
#define GWEN_ERROR_NO_DATA
Definition: error.h:94
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
#define GWEN_LOGDOMAIN
Definition: logger.h:35
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:245
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition: stringlist.c:50
struct TYPEMAKER2_ENUM TYPEMAKER2_ENUM
Definition: tm_enum.h:24
void Typemaker2_Member_SetFieldId(TYPEMAKER2_MEMBER *tm, const char *s)
Definition: tm_member.c:180
const char * Typemaker2_Member_GetEnumId(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:193
void Typemaker2_Member_SetTypePtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_TYPE *ty)
Definition: tm_member.c:476
const char * Typemaker2_Member_GetTypeName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:105
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:467
void Typemaker2_Member_SetEnumPtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_ENUM *te)
Definition: tm_member.c:494
TYPEMAKER2_ENUM * Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:485
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:237
void Typemaker2_Member_SetMemberPosition(TYPEMAKER2_MEMBER *tm, int i)
Definition: tm_member.c:548
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
TYPEMAKER2_ENUM * Typemaker2_Type_FindEnum(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:1334
void Typemaker2_Type_SetType(TYPEMAKER2_TYPE *ty, int i)
Definition: tm_type.c:186
TYPEMAKER2_TYPE * Typemaker2_Type_GetInheritsPtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:605
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:543
void Typemaker2_Type_SetIdentifier(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:552
void Typemaker2_Type_SetInheritsPtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:614
void Typemaker2_Type_Dump(TYPEMAKER2_TYPE *ty, FILE *f, int indent)
Definition: tm_type.c:1229
void Typemaker2_Type_SetName(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:136
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:341
void Typemaker2_Type_SetPrefix(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:574
const char * Typemaker2_Type_GetExtends(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:267
TYPEMAKER2_TYPE * Typemaker2_Type_GetBaseTypePtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:623
void Typemaker2_Type_free(TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:65
const char * Typemaker2_Type_GetName(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:127
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
void Typemaker2_Type_SetBaseTypePtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:632
TYPEMAKER2_TYPE * Typemaker2_Type_GetExtendsPtr(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:587
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:641
const char * Typemaker2_Type_GetBaseType(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:289
const char * Typemaker2_Type_GetInherits(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:315
void Typemaker2_Type_SetBaseType(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:302
void Typemaker2_Type_SetExtends(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:276
void Typemaker2_Type_SetExtendsPtr(TYPEMAKER2_TYPE *ty, TYPEMAKER2_TYPE *p)
Definition: tm_type.c:596
void Typemaker2_Type_SetNonVolatileMemberCount(TYPEMAKER2_TYPE *ty, int i)
Definition: tm_type.c:740
TYPEMAKER2_TYPE * Typemaker2_Type_new()
Definition: tm_type.c:32
int Typemaker2_Type_readXml(TYPEMAKER2_TYPE *ty, GWEN_XMLNODE *node, const char *wantedLang)
Definition: tm_type.c:833
void Typemaker2_Type_SetFieldCountId(TYPEMAKER2_TYPE *ty, const char *s)
Definition: tm_type.c:758
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition: tm_type.h:21
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1
Definition: tm_type.h:56
#define TYPEMAKER2_FLAGS_ENUM
Definition: tm_type.h:38
#define TYPEMAKER2_FLAGS_VOLATILE
Definition: tm_type.h:32
@ TypeMaker2_Type_Pointer
Definition: tm_type.h:78
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST2
Definition: tm_type.h:57
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE
Definition: tm_type.h:60
int Typemaker2_TypeManager_LoadTypeFile2(TYPEMAKER2_TYPEMANAGER *tym, const char *fileName, TYPEMAKER2_TYPE_LIST2 *tlist2)
int Typemaker2_TypeManager_SetMemberTypePtrs(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
#define TM_TYPEMANAGER_XMLFLAGS
void Typemaker2_TypeManager_AddFolder(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
void Typemaker2_TypeManager_SetLanguage(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
int Typemaker2_TypeManager_LoadTypeFileNoLookup(TYPEMAKER2_TYPEMANAGER *tym, const char *fileName, TYPEMAKER2_TYPE_LIST2 *tlist2)
void Typemaker2_TypeManager_SetApiDeclaration(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
TYPEMAKER2_TYPE * Typemaker2_TypeManager_FindType(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
TYPEMAKER2_TYPE * Typemaker2_TypeManager_LoadTypeFile(TYPEMAKER2_TYPEMANAGER *tym, const char *fileName)
int Typemaker2_TypeManager_MakeTypeDerivatives(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty, const char *baseType, const char *nType, const char *nPrefix)
int Typemaker2_TypeManager_MakeTypeList1(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
const char * Typemaker2_TypeManager_GetLanguage(const TYPEMAKER2_TYPEMANAGER *tym)
void Typemaker2_TypeManager_AddType(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
TYPEMAKER2_TYPE * Typemaker2_TypeManager_GetType(TYPEMAKER2_TYPEMANAGER *tym, const char *s)
TYPEMAKER2_TYPE * Typemaker2_TypeManager_LoadType(TYPEMAKER2_TYPEMANAGER *tym, const char *typeName)
int Typemaker2_TypeManager_MakeTypeList2(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
void Typemaker2_TypeManager_free(TYPEMAKER2_TYPEMANAGER *tym)
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
TYPEMAKER2_TYPEMANAGER * Typemaker2_TypeManager_new()
void Typemaker2_TypeManager_Dump(TYPEMAKER2_TYPEMANAGER *tym, FILE *f, int indent)
int Typemaker2_TypeManager_SetTypePtrs(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
int Typemaker2_TypeManager_MakeTypeTree(TYPEMAKER2_TYPEMANAGER *tym, TYPEMAKER2_TYPE *ty)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:1297
@ GWEN_XMLNodeTypeTag
Definition: xml.h:145