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_member_p.h"
16 #include "tm_util.h"
17 
18 
19 #include <gwenhywfar/debug.h>
20 #include <gwenhywfar/misc.h>
21 
22 #include <assert.h>
23 
24 
25 
GWEN_LIST_FUNCTIONS(TYPEMAKER2_MEMBER,Typemaker2_Member)26 GWEN_LIST_FUNCTIONS(TYPEMAKER2_MEMBER, Typemaker2_Member)
27 
28 
29 
30 
31 TYPEMAKER2_MEMBER *Typemaker2_Member_new()
32 {
33   TYPEMAKER2_MEMBER *tm;
34 
35   GWEN_NEW_OBJECT(TYPEMAKER2_MEMBER, tm);
36   tm->refCount=1;
37   GWEN_LIST_INIT(TYPEMAKER2_MEMBER, tm);
38 
39   tm->codeDefs=Typemaker2_Code_List_new();
40 
41   return tm;
42 }
43 
44 
45 
Typemaker2_Member_free(TYPEMAKER2_MEMBER * tm)46 void Typemaker2_Member_free(TYPEMAKER2_MEMBER *tm)
47 {
48   if (tm) {
49     assert(tm->refCount);
50     if (tm->refCount==1) {
51       GWEN_LIST_FINI(TYPEMAKER2_MEMBER, tm);
52       Typemaker2_Code_List_free(tm->codeDefs);
53       free(tm->name);
54       free(tm->typeName);
55       free(tm->elementName);
56       free(tm->descr);
57       free(tm->fieldId);
58       free(tm->defaultValue);
59       free(tm->presetValue);
60       free(tm->aedb_type);
61       free(tm->enumId);
62       free(tm->defineId);
63       tm->refCount=0;
64       GWEN_FREE_OBJECT(tm);
65     }
66     else {
67       tm->refCount--;
68     }
69   }
70 }
71 
72 
73 
Typemaker2_Member_Attach(TYPEMAKER2_MEMBER * tm)74 void Typemaker2_Member_Attach(TYPEMAKER2_MEMBER *tm)
75 {
76   assert(tm);
77   assert(tm->refCount);
78   tm->refCount++;
79 }
80 
81 
82 
Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER * tm)83 const char *Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
84 {
85   assert(tm);
86   assert(tm->refCount);
87   return tm->name;
88 }
89 
90 
91 
Typemaker2_Member_SetName(TYPEMAKER2_MEMBER * tm,const char * s)92 void Typemaker2_Member_SetName(TYPEMAKER2_MEMBER *tm, const char *s)
93 {
94   assert(tm);
95   assert(tm->refCount);
96   free(tm->name);
97   if (s && *s)
98     tm->name=strdup(s);
99   else
100     tm->name=NULL;
101 }
102 
103 
104 
Typemaker2_Member_GetTypeName(const TYPEMAKER2_MEMBER * tm)105 const char *Typemaker2_Member_GetTypeName(const TYPEMAKER2_MEMBER *tm)
106 {
107   assert(tm);
108   assert(tm->refCount);
109   return tm->typeName;
110 }
111 
112 
113 
Typemaker2_Member_SetTypeName(TYPEMAKER2_MEMBER * tm,const char * s)114 void Typemaker2_Member_SetTypeName(TYPEMAKER2_MEMBER *tm, const char *s)
115 {
116   assert(tm);
117   assert(tm->refCount);
118   free(tm->typeName);
119   if (s && *s)
120     tm->typeName=strdup(s);
121   else
122     tm->typeName=NULL;
123 }
124 
125 
126 
Typemaker2_Member_GetElementName(const TYPEMAKER2_MEMBER * tm)127 const char *Typemaker2_Member_GetElementName(const TYPEMAKER2_MEMBER *tm)
128 {
129   assert(tm);
130   assert(tm->refCount);
131   return tm->elementName;
132 }
133 
134 
135 
Typemaker2_Member_SetElementName(TYPEMAKER2_MEMBER * tm,const char * s)136 void Typemaker2_Member_SetElementName(TYPEMAKER2_MEMBER *tm, const char *s)
137 {
138   assert(tm);
139   assert(tm->refCount);
140   free(tm->elementName);
141   if (s && *s)
142     tm->elementName=strdup(s);
143   else
144     tm->elementName=NULL;
145 }
146 
147 
148 
Typemaker2_Member_GetDescription(const TYPEMAKER2_MEMBER * tm)149 const char *Typemaker2_Member_GetDescription(const TYPEMAKER2_MEMBER *tm)
150 {
151   assert(tm);
152   assert(tm->refCount);
153   return tm->descr;
154 }
155 
156 
157 
Typemaker2_Member_SetDescription(TYPEMAKER2_MEMBER * tm,const char * s)158 void Typemaker2_Member_SetDescription(TYPEMAKER2_MEMBER *tm, const char *s)
159 {
160   assert(tm);
161   assert(tm->refCount);
162   free(tm->descr);
163   if (s && *s)
164     tm->descr=strdup(s);
165   else
166     tm->descr=NULL;
167 }
168 
169 
170 
Typemaker2_Member_GetFieldId(const TYPEMAKER2_MEMBER * tm)171 const char *Typemaker2_Member_GetFieldId(const TYPEMAKER2_MEMBER *tm)
172 {
173   assert(tm);
174   assert(tm->refCount);
175   return tm->fieldId;
176 }
177 
178 
179 
Typemaker2_Member_SetFieldId(TYPEMAKER2_MEMBER * tm,const char * s)180 void Typemaker2_Member_SetFieldId(TYPEMAKER2_MEMBER *tm, const char *s)
181 {
182   assert(tm);
183   assert(tm->refCount);
184   free(tm->fieldId);
185   if (s && *s)
186     tm->fieldId=strdup(s);
187   else
188     tm->fieldId=NULL;
189 }
190 
191 
192 
Typemaker2_Member_GetEnumId(const TYPEMAKER2_MEMBER * tm)193 const char *Typemaker2_Member_GetEnumId(const TYPEMAKER2_MEMBER *tm)
194 {
195   assert(tm);
196   assert(tm->refCount);
197   return tm->enumId;
198 }
199 
200 
201 
Typemaker2_Member_SetEnumId(TYPEMAKER2_MEMBER * tm,const char * s)202 void Typemaker2_Member_SetEnumId(TYPEMAKER2_MEMBER *tm, const char *s)
203 {
204   assert(tm);
205   assert(tm->refCount);
206   free(tm->enumId);
207   if (s && *s)
208     tm->enumId=strdup(s);
209   else
210     tm->enumId=NULL;
211 }
212 
213 
214 
Typemaker2_Member_GetDefineId(const TYPEMAKER2_MEMBER * tm)215 const char *Typemaker2_Member_GetDefineId(const TYPEMAKER2_MEMBER *tm)
216 {
217   assert(tm);
218   assert(tm->refCount);
219   return tm->defineId;
220 }
221 
222 
223 
Typemaker2_Member_SetDefineId(TYPEMAKER2_MEMBER * tm,const char * s)224 void Typemaker2_Member_SetDefineId(TYPEMAKER2_MEMBER *tm, const char *s)
225 {
226   assert(tm);
227   assert(tm->refCount);
228   free(tm->defineId);
229   if (s && *s)
230     tm->defineId=strdup(s);
231   else
232     tm->defineId=NULL;
233 }
234 
235 
236 
Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER * tm)237 uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
238 {
239   assert(tm);
240   assert(tm->refCount);
241 
242   if (tm->flags==0 && tm->typePtr)
243     return Typemaker2_Type_GetFlags(tm->typePtr);
244 
245   return tm->flags;
246 }
247 
248 
249 
Typemaker2_Member_SetFlags(TYPEMAKER2_MEMBER * tm,uint32_t i)250 void Typemaker2_Member_SetFlags(TYPEMAKER2_MEMBER *tm, uint32_t i)
251 {
252   assert(tm);
253   assert(tm->refCount);
254   tm->flags=i;
255 }
256 
257 
258 
Typemaker2_Member_GetSetFlags(const TYPEMAKER2_MEMBER * tm)259 uint32_t Typemaker2_Member_GetSetFlags(const TYPEMAKER2_MEMBER *tm)
260 {
261   assert(tm);
262   assert(tm->refCount);
263 
264   if (tm->setFlags==0 && tm->typePtr)
265     return Typemaker2_Type_GetSetFlags(tm->typePtr);
266 
267   return tm->setFlags;
268 }
269 
270 
271 
Typemaker2_Member_SetSetFlags(TYPEMAKER2_MEMBER * tm,uint32_t i)272 void Typemaker2_Member_SetSetFlags(TYPEMAKER2_MEMBER *tm, uint32_t i)
273 {
274   assert(tm);
275   assert(tm->refCount);
276   tm->setFlags=i;
277 }
278 
279 
280 
Typemaker2_Member_GetGetFlags(const TYPEMAKER2_MEMBER * tm)281 uint32_t Typemaker2_Member_GetGetFlags(const TYPEMAKER2_MEMBER *tm)
282 {
283   assert(tm);
284   assert(tm->refCount);
285 
286   if (tm->getFlags==0 && tm->typePtr)
287     return Typemaker2_Type_GetGetFlags(tm->typePtr);
288 
289   return tm->getFlags;
290 }
291 
292 
293 
Typemaker2_Member_SetGetFlags(TYPEMAKER2_MEMBER * tm,uint32_t i)294 void Typemaker2_Member_SetGetFlags(TYPEMAKER2_MEMBER *tm, uint32_t i)
295 {
296   assert(tm);
297   assert(tm->refCount);
298   tm->getFlags=i;
299 }
300 
301 
302 
Typemaker2_Member_GetDupFlags(const TYPEMAKER2_MEMBER * tm)303 uint32_t Typemaker2_Member_GetDupFlags(const TYPEMAKER2_MEMBER *tm)
304 {
305   assert(tm);
306   assert(tm->refCount);
307 
308   if (tm->dupFlags==0 && tm->typePtr)
309     return Typemaker2_Type_GetDupFlags(tm->typePtr);
310 
311   return tm->dupFlags;
312 }
313 
314 
315 
Typemaker2_Member_SetDupFlags(TYPEMAKER2_MEMBER * tm,uint32_t i)316 void Typemaker2_Member_SetDupFlags(TYPEMAKER2_MEMBER *tm, uint32_t i)
317 {
318   assert(tm);
319   assert(tm->refCount);
320   tm->dupFlags=i;
321 }
322 
323 
324 
Typemaker2_Member_GetCopyFlags(const TYPEMAKER2_MEMBER * tm)325 uint32_t Typemaker2_Member_GetCopyFlags(const TYPEMAKER2_MEMBER *tm)
326 {
327   assert(tm);
328   assert(tm->refCount);
329 
330   if (tm->copyFlags==0 && tm->typePtr)
331     return Typemaker2_Type_GetCopyFlags(tm->typePtr);
332 
333   return tm->copyFlags;
334 }
335 
336 
337 
Typemaker2_Member_SetCopyFlags(TYPEMAKER2_MEMBER * tm,uint32_t i)338 void Typemaker2_Member_SetCopyFlags(TYPEMAKER2_MEMBER *tm, uint32_t i)
339 {
340   assert(tm);
341   assert(tm->refCount);
342   tm->copyFlags=i;
343 }
344 
345 
346 
Typemaker2_Member_GetAccess(const TYPEMAKER2_MEMBER * tm)347 int Typemaker2_Member_GetAccess(const TYPEMAKER2_MEMBER *tm)
348 {
349   assert(tm);
350   assert(tm->refCount);
351 
352   if (tm->access==TypeMaker2_Access_Unknown && tm->typePtr)
353     return Typemaker2_Type_GetAccess(tm->typePtr);
354 
355   return tm->access;
356 }
357 
358 
359 
Typemaker2_Member_SetAccess(TYPEMAKER2_MEMBER * tm,int i)360 void Typemaker2_Member_SetAccess(TYPEMAKER2_MEMBER *tm, int i)
361 {
362   assert(tm);
363   assert(tm->refCount);
364   tm->access=i;
365 }
366 
367 
368 
Typemaker2_Member_GetMaxLen(const TYPEMAKER2_MEMBER * tm)369 int Typemaker2_Member_GetMaxLen(const TYPEMAKER2_MEMBER *tm)
370 {
371   assert(tm);
372   assert(tm->refCount);
373 
374   return tm->maxLen;
375 }
376 
377 
378 
Typemaker2_Member_SetMaxLen(TYPEMAKER2_MEMBER * tm,int i)379 void Typemaker2_Member_SetMaxLen(TYPEMAKER2_MEMBER *tm, int i)
380 {
381   assert(tm);
382   assert(tm->refCount);
383   tm->maxLen=i;
384 }
385 
386 
387 
Typemaker2_Member_GetDefaultValue(const TYPEMAKER2_MEMBER * tm)388 const char *Typemaker2_Member_GetDefaultValue(const TYPEMAKER2_MEMBER *tm)
389 {
390   assert(tm);
391   assert(tm->refCount);
392 
393   if (tm->defaultValue==NULL && tm->typePtr)
394     return Typemaker2_Type_GetDefaultValue(tm->typePtr);
395   return tm->defaultValue;
396 }
397 
398 
399 
Typemaker2_Member_SetDefaultValue(TYPEMAKER2_MEMBER * tm,const char * s)400 void Typemaker2_Member_SetDefaultValue(TYPEMAKER2_MEMBER *tm, const char *s)
401 {
402   assert(tm);
403   assert(tm->refCount);
404 
405   free(tm->defaultValue);
406   if (s)
407     tm->defaultValue=strdup(s);
408   else
409     tm->defaultValue=NULL;
410 }
411 
412 
413 
Typemaker2_Member_GetPresetValue(const TYPEMAKER2_MEMBER * tm)414 const char *Typemaker2_Member_GetPresetValue(const TYPEMAKER2_MEMBER *tm)
415 {
416   assert(tm);
417   assert(tm->refCount);
418 
419   if (tm->presetValue==NULL && tm->typePtr)
420     return Typemaker2_Type_GetPresetValue(tm->typePtr);
421   return tm->presetValue;
422 }
423 
424 
425 
Typemaker2_Member_SetPresetValue(TYPEMAKER2_MEMBER * tm,const char * s)426 void Typemaker2_Member_SetPresetValue(TYPEMAKER2_MEMBER *tm, const char *s)
427 {
428   assert(tm);
429   assert(tm->refCount);
430 
431   free(tm->presetValue);
432   if (s)
433     tm->presetValue=strdup(s);
434   else
435     tm->presetValue=NULL;
436 }
437 
438 
439 
Typemaker2_Member_GetAqDbType(const TYPEMAKER2_MEMBER * tm)440 const char *Typemaker2_Member_GetAqDbType(const TYPEMAKER2_MEMBER *tm)
441 {
442   assert(tm);
443   assert(tm->refCount);
444 
445   if (tm->aedb_type==NULL && tm->typePtr)
446     return Typemaker2_Type_GetAqDbType(tm->typePtr);
447 
448   return tm->aedb_type;
449 }
450 
451 
452 
Typemaker2_Member_SetAqDbType(TYPEMAKER2_MEMBER * tm,const char * s)453 void Typemaker2_Member_SetAqDbType(TYPEMAKER2_MEMBER *tm, const char *s)
454 {
455   assert(tm);
456   assert(tm->refCount);
457 
458   free(tm->aedb_type);
459   if (s)
460     tm->aedb_type=strdup(s);
461   else
462     tm->aedb_type=NULL;
463 }
464 
465 
466 
Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER * tm)467 TYPEMAKER2_TYPE *Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
468 {
469   assert(tm);
470   assert(tm->refCount);
471   return tm->typePtr;
472 }
473 
474 
475 
Typemaker2_Member_SetTypePtr(TYPEMAKER2_MEMBER * tm,TYPEMAKER2_TYPE * ty)476 void Typemaker2_Member_SetTypePtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_TYPE *ty)
477 {
478   assert(tm);
479   assert(tm->refCount);
480   tm->typePtr=ty;
481 }
482 
483 
484 
Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER * tm)485 TYPEMAKER2_ENUM *Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
486 {
487   assert(tm);
488   assert(tm->refCount);
489   return tm->enumPtr;
490 }
491 
492 
493 
Typemaker2_Member_SetEnumPtr(TYPEMAKER2_MEMBER * tm,TYPEMAKER2_ENUM * te)494 void Typemaker2_Member_SetEnumPtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_ENUM *te)
495 {
496   assert(tm);
497   assert(tm->refCount);
498   tm->enumPtr=te;
499 }
500 
501 
502 
Typemaker2_Member_GetDefinePtr(const TYPEMAKER2_MEMBER * tm)503 TYPEMAKER2_DEFINE *Typemaker2_Member_GetDefinePtr(const TYPEMAKER2_MEMBER *tm)
504 {
505   assert(tm);
506   assert(tm->refCount);
507   return tm->definePtr;
508 }
509 
510 
511 
Typemaker2_Member_SetDefinePtr(TYPEMAKER2_MEMBER * tm,TYPEMAKER2_DEFINE * td)512 void Typemaker2_Member_SetDefinePtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_DEFINE *td)
513 {
514   assert(tm);
515   assert(tm->refCount);
516   tm->definePtr=td;
517 }
518 
519 
520 
Typemaker2_Member_GetGroupPtr(const TYPEMAKER2_MEMBER * tm)521 TYPEMAKER2_GROUP *Typemaker2_Member_GetGroupPtr(const TYPEMAKER2_MEMBER *tm)
522 {
523   assert(tm);
524   assert(tm->refCount);
525   return tm->groupPtr;
526 }
527 
528 
529 
Typemaker2_Member_SetGroupPtr(TYPEMAKER2_MEMBER * tm,TYPEMAKER2_GROUP * gr)530 void Typemaker2_Member_SetGroupPtr(TYPEMAKER2_MEMBER *tm, TYPEMAKER2_GROUP *gr)
531 {
532   assert(tm);
533   assert(tm->refCount);
534   tm->groupPtr=gr;
535 }
536 
537 
538 
Typemaker2_Member_GetMemberPosition(const TYPEMAKER2_MEMBER * tm)539 int Typemaker2_Member_GetMemberPosition(const TYPEMAKER2_MEMBER *tm)
540 {
541   assert(tm);
542   assert(tm->refCount);
543   return tm->memberPosition;
544 }
545 
546 
547 
Typemaker2_Member_SetMemberPosition(TYPEMAKER2_MEMBER * tm,int i)548 void Typemaker2_Member_SetMemberPosition(TYPEMAKER2_MEMBER *tm, int i)
549 {
550   assert(tm);
551   assert(tm->refCount);
552   tm->memberPosition=i;
553 }
554 
555 
556 
Typemaker2_Member_GetCodeDefs(const TYPEMAKER2_MEMBER * tm)557 TYPEMAKER2_CODE_LIST *Typemaker2_Member_GetCodeDefs(const TYPEMAKER2_MEMBER *tm)
558 {
559   assert(tm);
560   assert(tm->refCount);
561   return tm->codeDefs;
562 }
563 
564 
565 
Typemaker2_Member_readXml(TYPEMAKER2_MEMBER * tm,GWEN_XMLNODE * node,const char * wantedLang)566 int Typemaker2_Member_readXml(TYPEMAKER2_MEMBER *tm, GWEN_XMLNODE *node, const char *wantedLang)
567 {
568   const char *s;
569   GWEN_XMLNODE *langNode=NULL;
570   GWEN_XMLNODE *nn;
571 
572   assert(tm);
573   assert(tm->refCount);
574 
575   if (wantedLang)
576     langNode=GWEN_XMLNode_FindFirstTag(node, "lang", "id", wantedLang);
577   if (langNode==NULL)
578     langNode=node;
579 
580   s=GWEN_XMLNode_GetProperty(node, "name", NULL);
581   if (s==NULL) {
582     DBG_ERROR(GWEN_LOGDOMAIN, "Member has no id");
583     return GWEN_ERROR_BAD_DATA;
584   }
585   Typemaker2_Member_SetName(tm, s);
586 
587   s=GWEN_XMLNode_GetProperty(node, "type", NULL);
588   if (s==NULL) {
589     DBG_ERROR(GWEN_LOGDOMAIN, "Member has no type");
590     return GWEN_ERROR_BAD_DATA;
591   }
592   Typemaker2_Member_SetTypeName(tm, s);
593 
594   s=GWEN_XMLNode_GetProperty(node, "elementName", NULL);
595   Typemaker2_Member_SetElementName(tm, s);
596 
597   s=GWEN_XMLNode_GetProperty(node, "enum", NULL);
598   Typemaker2_Member_SetEnumId(tm, s);
599 
600   s=GWEN_XMLNode_GetProperty(node, "define", NULL);
601   Typemaker2_Member_SetDefineId(tm, s);
602 
603   s=GWEN_XMLNode_GetProperty(node, "maxlen", NULL);
604   if (s && *s) {
605     int i;
606 
607     if (1==sscanf(s, "%i", &i))
608       tm->maxLen=i;
609     else {
610       DBG_ERROR(GWEN_LOGDOMAIN, "Bad value for maxlen [%s]", s);
611       return GWEN_ERROR_BAD_DATA;
612     }
613   }
614 
615   /* read flags */
616   s=GWEN_XMLNode_GetCharValue(node, "flags", NULL);
617   if (s && *s)
618     Typemaker2_Member_SetFlags(tm, Typemaker2_FlagsFromString(s));
619 
620   /* read setflags */
621   s=GWEN_XMLNode_GetCharValue(node, "setflags", NULL);
622   if (s && *s)
623     Typemaker2_Member_SetSetFlags(tm, Typemaker2_FlagsFromString(s));
624 
625   /* read getflags */
626   s=GWEN_XMLNode_GetCharValue(node, "getflags", NULL);
627   if (s && *s)
628     Typemaker2_Member_SetGetFlags(tm, Typemaker2_FlagsFromString(s));
629 
630   /* read dupflags */
631   s=GWEN_XMLNode_GetCharValue(node, "dupflags", NULL);
632   if (s && *s)
633     Typemaker2_Member_SetDupFlags(tm, Typemaker2_FlagsFromString(s));
634 
635   /* read copyflags */
636   s=GWEN_XMLNode_GetCharValue(node, "copyflags", NULL);
637   if (s && *s)
638     Typemaker2_Member_SetCopyFlags(tm, Typemaker2_FlagsFromString(s));
639 
640   /* read access */
641   s=GWEN_XMLNode_GetCharValue(node, "access", NULL);
642   if (s && *s) {
643     int i=Typemaker2_AccessFromString(s);
644     if (i==TypeMaker2_Access_Unknown) {
645       DBG_ERROR(GWEN_LOGDOMAIN, "Unknown access type [%s]", s);
646       return GWEN_ERROR_BAD_DATA;
647     }
648     Typemaker2_Member_SetAccess(tm, i);
649   }
650 
651   /* read default value */
652   s=GWEN_XMLNode_GetCharValue(node, "default", NULL);
653   if (s && *s)
654     Typemaker2_Member_SetDefaultValue(tm, s);
655 
656   /* read preset value */
657   s=GWEN_XMLNode_GetCharValue(node, "preset", NULL);
658   if (s && *s)
659     Typemaker2_Member_SetPresetValue(tm, s);
660 
661   /* read AEDB type */
662   s=GWEN_XMLNode_GetCharValue(node, "aedb_type", NULL);
663   if (s && *s)
664     Typemaker2_Member_SetAqDbType(tm, s);
665 
666   /* read description */
667   nn=GWEN_XMLNode_FindFirstTag(node, "descr", NULL, NULL);
668   if (nn) {
669     GWEN_BUFFER *tbuf;
670     int rv;
671 
672     tbuf=GWEN_Buffer_new(0, 256, 0, 1);
673     rv=GWEN_XMLNode_toBuffer(nn, tbuf, GWEN_XML_FLAGS_SIMPLE | GWEN_XML_FLAGS_HANDLE_COMMENTS);
674     if (rv<0) {
675       DBG_ERROR(0, "here (%d)", rv);
676     }
677     else {
678       Typemaker2_Member_SetDescription(tm, GWEN_Buffer_GetStart(tbuf));
679     }
680     GWEN_Buffer_free(tbuf);
681   }
682 
683   /* read codedefs */
684   nn=GWEN_XMLNode_FindFirstTag(langNode, "codedefs", NULL, NULL);
685   if (nn) {
686     GWEN_XMLNODE *nnn;
687 
688     nnn=GWEN_XMLNode_FindFirstTag(nn, "codedef", NULL, NULL);
689     while (nnn) {
690       TYPEMAKER2_CODE *tc;
691 
692       tc=Typemaker2_Code_fromXml(nnn);
693       if (tc) {
694         const char *s;
695 
696         s=Typemaker2_Code_GetMemberFlagsMask(tc);
697         if (s && *s)
698           Typemaker2_Code_SetMemberFlagsMaskInt(tc, Typemaker2_FlagsFromString(s));
699 
700         s=Typemaker2_Code_GetMemberFlagsValue(tc);
701         if (s && *s)
702           Typemaker2_Code_SetMemberFlagsValueInt(tc, Typemaker2_FlagsFromString(s));
703       }
704 
705       Typemaker2_Code_List_Add(tc, tm->codeDefs);
706       nnn=GWEN_XMLNode_FindNextTag(nnn, "codedef", NULL, NULL);
707     }
708   }
709 
710 
711   return 0;
712 }
713 
714 
715 
Typemaker2_Member_Dump(TYPEMAKER2_MEMBER * tm,FILE * f,int indent)716 void Typemaker2_Member_Dump(TYPEMAKER2_MEMBER *tm, FILE *f, int indent)
717 {
718   if (tm) {
719     int i;
720     const char *s1, *s2;
721 
722     for (i=0; i<indent; i++)
723       fprintf(f, " ");
724     fprintf(f, "Member\n");
725 
726     for (i=0; i<indent+2; i++)
727       fprintf(f, " ");
728     fprintf(f, "Name        : %s\n", (tm->name)?(tm->name):"<null>");
729 
730     for (i=0; i<indent+2; i++)
731       fprintf(f, " ");
732     fprintf(f, "Typename    : %s\n", (tm->typeName)?(tm->typeName):"<null>");
733 
734     for (i=0; i<indent+2; i++)
735       fprintf(f, " ");
736     fprintf(f, "Elementname : %s\n", (tm->elementName)?(tm->elementName):"<null>");
737 
738     for (i=0; i<indent+2; i++)
739       fprintf(f, " ");
740     fprintf(f, "Field Id    : %s\n", (tm->fieldId)?(tm->fieldId):"<null>");
741 
742     for (i=0; i<indent+2; i++)
743       fprintf(f, " ");
744     fprintf(f, "Access      : %d  [%d]\n", tm->access, Typemaker2_Member_GetAccess(tm));
745 
746     for (i=0; i<indent+2; i++)
747       fprintf(f, " ");
748     fprintf(f, "Flags       : %08x [%08x]\n", tm->flags, Typemaker2_Member_GetFlags(tm));
749 
750     for (i=0; i<indent+2; i++)
751       fprintf(f, " ");
752     fprintf(f, "SetFlags    : %08x [%08x]\n", tm->setFlags, Typemaker2_Member_GetSetFlags(tm));
753 
754     for (i=0; i<indent+2; i++)
755       fprintf(f, " ");
756     fprintf(f, "GetFlags    : %08x [%08x]\n", tm->getFlags, Typemaker2_Member_GetGetFlags(tm));
757 
758     for (i=0; i<indent+2; i++)
759       fprintf(f, " ");
760     fprintf(f, "DupFlags    : %08x [%08x]\n", tm->dupFlags, Typemaker2_Member_GetDupFlags(tm));
761 
762     for (i=0; i<indent+2; i++)
763       fprintf(f, " ");
764     s1=tm->defaultValue;
765     s2=Typemaker2_Member_GetDefaultValue(tm);
766     fprintf(f, "Default     : %s [%s]\n", s1?s1:"<null>", s2?s2:"<null>");
767 
768     for (i=0; i<indent+2; i++)
769       fprintf(f, " ");
770     s1=tm->presetValue;
771     s2=Typemaker2_Member_GetPresetValue(tm);
772     fprintf(f, "Preset      : %s [%s]\n", s1?s1:"<null>", s2?s2:"<null>");
773 
774     for (i=0; i<indent+2; i++)
775       fprintf(f, " ");
776     fprintf(f, "Position    : %d\n", tm->memberPosition);
777 
778     for (i=0; i<indent+2; i++)
779       fprintf(f, " ");
780     fprintf(f, "Description : %s\n", (tm->descr)?(tm->descr):"<null>");
781 
782   }
783 }
784 
785 
786 
787 
788 
789 
790 
791