gwenhywfar  5.10.1
tm2c_readxml.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 "tm2c_readxml.h"
16 #include "tm2c_misc.h"
17 
18 #include <gwenhywfar/debug.h>
19 
20 #include <ctype.h>
21 
22 
23 
27 
28 
29 
30 
32 {
33  int rv;
34 
35  _addPrototype(tb, ty);
36 
37  rv=_addImplementation(tb, ty);
38  if (rv<0) {
39  DBG_INFO(NULL, "here (%d)", rv);
40  return rv;
41  }
42 
43  return 0;
44 }
45 
46 
47 
49 {
50  GWEN_BUFFER *tbuf;
51  const char *s;
53 
55  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
56 
57  /* prototype */
59  if (s)
60  GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
62  "void %s_ReadXml(%s *p_struct, GWEN_XMLNODE *p_db);\n",
66  GWEN_Buffer_free(tbuf);
67 }
68 
69 
70 
72 {
73  GWEN_BUFFER *tbuf;
74  TYPEMAKER2_MEMBER_LIST *tml;
75  int rv;
76 
77  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
78 
80  "void %s_ReadXml(%s *p_struct, GWEN_XMLNODE *p_db){\n",
83  GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
84 
86  if (tml) {
88 
89  tm=Typemaker2_Member_List_First(tml);
90  while (tm) {
91 
92  rv=_addReadMemberCode(tb, ty, tm, tbuf);
93  if (rv<0) {
94  DBG_INFO(NULL, "here (%d)", rv);
95  GWEN_Buffer_free(tbuf);
96  return rv;
97  }
98 
99  tm=Typemaker2_Member_List_Next(tm);
100  }
101  }
102 
103  GWEN_Buffer_AppendString(tbuf, "}\n");
104 
106  GWEN_Buffer_free(tbuf);
107 
108  return 0;
109 }
110 
111 
112 
113 
115 {
116  TYPEMAKER2_TYPE *mty;
117  int rv;
118  const char *sMemberName;
119 
121  assert(mty);
122  sMemberName=Typemaker2_Member_GetName(tm);
123 
124  GWEN_Buffer_AppendArgs(tbuf, " /* member \"%s\" */\n", sMemberName);
126  rv=TM2C_AddReleaseOldValueCode(tb, ty, tm, tbuf);
127  if (rv<0) {
128  DBG_INFO(NULL, "here (%d)", rv);
129  GWEN_Buffer_free(tbuf);
130  return rv;
131  }
132  }
133 
134  /* read from object */
136  GWEN_BUFFER *dstbuf;
137 
138  GWEN_Buffer_AppendArgs(tbuf, " /* member \"%s\" is volatile, just presetting it */\n", sMemberName);
139  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
140  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
141  GWEN_Buffer_AppendString(tbuf, " ");
142  rv=Typemaker2_Builder_Invoke_ConstructFn(tb, ty, tm, NULL, GWEN_Buffer_GetStart(dstbuf), tbuf);
143  GWEN_Buffer_free(dstbuf);
144  if (rv<0) {
145  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
146  return rv;
147  }
148  GWEN_Buffer_AppendString(tbuf, "\n");
149  }
150  else {
151  GWEN_BUFFER *dstbuf;
152 
153  /* not volatile */
154  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
155  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
156  GWEN_Buffer_AppendString(tbuf, " ");
157  rv=Typemaker2_Builder_Invoke_FromXmlFn(tb, ty, tm, NULL, GWEN_Buffer_GetStart(dstbuf), tbuf);
158  GWEN_Buffer_free(dstbuf);
159  if (rv<0) {
160  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
161  return rv;
162  }
163  GWEN_Buffer_AppendString(tbuf, "\n");
164  }
165 
166  return 0;
167 }
168 
169 
170 
172 {
173  GWEN_BUFFER *tbuf;
174  const char *s;
175  /* uint32_t flags; */
177 
179  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
180 
181  /* flags=Typemaker2_Type_GetFlags(ty); */
182 
183  /* prototype */
185  if (s) {
186  GWEN_Buffer_AppendString(tbuf, s);
187  GWEN_Buffer_AppendString(tbuf, " ");
188  }
190  GWEN_Buffer_AppendString(tbuf, s);
191  GWEN_Buffer_AppendString(tbuf, " *");
193  GWEN_Buffer_AppendString(tbuf, s);
194  GWEN_Buffer_AppendString(tbuf, "_fromXml(GWEN_XMLNODE *p_db);\n");
196  GWEN_Buffer_Reset(tbuf);
197 
198  /* implementation */
200  GWEN_Buffer_AppendString(tbuf, s);
201  GWEN_Buffer_AppendString(tbuf, " *");
203  GWEN_Buffer_AppendString(tbuf, s);
204  GWEN_Buffer_AppendString(tbuf, "_fromXml(GWEN_XMLNODE *p_db) {\n");
205 
206  GWEN_Buffer_AppendString(tbuf, " ");
208  GWEN_Buffer_AppendString(tbuf, s);
209  GWEN_Buffer_AppendString(tbuf, " *p_struct;\n");
210 
211  GWEN_Buffer_AppendString(tbuf, " p_struct=");
213  GWEN_Buffer_AppendString(tbuf, s);
215  GWEN_Buffer_AppendByte(tbuf, '_');
216  }
217  GWEN_Buffer_AppendString(tbuf, "_new();\n");
218 
219  GWEN_Buffer_AppendString(tbuf, " ");
221  GWEN_Buffer_AppendString(tbuf, s);
222  GWEN_Buffer_AppendString(tbuf, "_ReadXml(p_struct, p_db);\n");
223 
224  GWEN_Buffer_AppendString(tbuf, " return p_struct;\n");
225  GWEN_Buffer_AppendString(tbuf, "}\n");
226 
228  GWEN_Buffer_free(tbuf);
229 
230  return 0;
231 }
232 
static int _addReadMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_readxml.c:114
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:133
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:467
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:237
int TM2C_BuildReadXml(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_readxml.c:31
#define NULL
Definition: binreloc.c:300
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
static void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_readxml.c:48
int Typemaker2_Builder_Invoke_FromXmlFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:543
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
#define TYPEMAKER2_FLAGS_OWN
Definition: tm_type.h:31
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:641
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:204
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_readxml.c:71
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition: tm_type.h:21
void Typemaker2_Builder_AddPublicDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:172
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
int Typemaker2_Type_GetUsePrivateConstructor(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:473
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
int TM2C_BuildFromXml(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_readxml.c:171
int TM2C_AddReleaseOldValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_misc.c:23
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
#define TYPEMAKER2_FLAGS_VOLATILE
Definition: tm_type.h:32
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
int Typemaker2_Builder_Invoke_ConstructFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)