gwenhywfar  5.10.1
tm2c_readobject.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_readobject.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  "int %s_ReadObject(%s *p_struct, const AQDB_OBJECT *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  "int %s_ReadObject(%s *p_struct, const AQDB_OBJECT *p_db){\n",
83 
85  GWEN_Buffer_AppendString(tbuf, " int p_rv;\n");
86  GWEN_Buffer_AppendString(tbuf, "\n");
87  }
88  GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
89 
90 
92  if (tml) {
94 
95  tm=Typemaker2_Member_List_First(tml);
96  while (tm) {
97 
98  rv=_addReadMemberCode(tb, ty, tm, tbuf);
99  if (rv<0) {
100  DBG_INFO(NULL, "here (%d)", rv);
101  GWEN_Buffer_free(tbuf);
102  return rv;
103  }
104 
105  tm=Typemaker2_Member_List_Next(tm);
106  }
107  }
108 
109  GWEN_Buffer_AppendString(tbuf, " return 0;\n");
110  GWEN_Buffer_AppendString(tbuf, "}\n");
111 
113  GWEN_Buffer_free(tbuf);
114 
115  return 0;
116 }
117 
118 
119 
120 
122 {
123  TYPEMAKER2_TYPE *mty;
124  int rv;
125  const char *sMemberName;
126 
128  assert(mty);
129  sMemberName=Typemaker2_Member_GetName(tm);
130 
131  GWEN_Buffer_AppendArgs(tbuf, " /* member \"%s\" */\n", sMemberName);
133  rv=TM2C_AddReleaseOldValueCode(tb, ty, tm, tbuf);
134  if (rv<0) {
135  DBG_INFO(NULL, "here (%d)", rv);
136  GWEN_Buffer_free(tbuf);
137  return rv;
138  }
139  }
140 
141  /* read from object */
143  GWEN_BUFFER *dstbuf;
144 
145  GWEN_Buffer_AppendArgs(tbuf, " /* member \"%s\" is volatile, just presetting it */\n", sMemberName);
146  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
147  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
148  GWEN_Buffer_AppendString(tbuf, " ");
149  rv=Typemaker2_Builder_Invoke_ConstructFn(tb, ty, tm, NULL, GWEN_Buffer_GetStart(dstbuf), tbuf);
150  GWEN_Buffer_free(dstbuf);
151  if (rv<0) {
152  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
153  return rv;
154  }
155  GWEN_Buffer_AppendString(tbuf, "\n");
156  }
157  else {
158  GWEN_BUFFER *dstbuf;
159 
160  /* not volatile */
161  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
162  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
163  GWEN_Buffer_AppendString(tbuf, " ");
165  GWEN_Buffer_free(dstbuf);
166  if (rv<0) {
167  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
168  return rv;
169  }
170  GWEN_Buffer_AppendString(tbuf, "\n");
171 
172  GWEN_Buffer_AppendString(tbuf, " if (p_rv<0) {\n");
173  GWEN_Buffer_AppendString(tbuf, " DBG_INFO(GWEN_LOGDOMAIN, \"here (%d)\\n\", p_rv);\n");
174  GWEN_Buffer_AppendString(tbuf, " return p_rv;\n");
175  GWEN_Buffer_AppendString(tbuf, " }\n");
176  }
177 
178  return 0;
179 }
180 
181 
182 
184 {
185  GWEN_BUFFER *tbuf;
186  const char *s;
187  /* uint32_t flags; */
189 
191  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
192 
193  /* flags=Typemaker2_Type_GetFlags(ty); */
194 
195  /* prototype */
197  if (s) {
198  GWEN_Buffer_AppendString(tbuf, s);
199  GWEN_Buffer_AppendString(tbuf, " ");
200  }
201  GWEN_Buffer_AppendString(tbuf, "int ");
203  GWEN_Buffer_AppendString(tbuf, s);
204  GWEN_Buffer_AppendString(tbuf, "_fromObject(const AQDB_OBJECT *p_db, ");
206  GWEN_Buffer_AppendString(tbuf, s);
207  GWEN_Buffer_AppendString(tbuf, " **pp_struct);\n");
209  GWEN_Buffer_Reset(tbuf);
210 
211  /* implementation */
212  GWEN_Buffer_AppendString(tbuf, "int ");
214  GWEN_Buffer_AppendString(tbuf, s);
215  GWEN_Buffer_AppendString(tbuf, "_fromObject(const AQDB_OBJECT *p_db, ");
217  GWEN_Buffer_AppendString(tbuf, s);
218  GWEN_Buffer_AppendString(tbuf, " **pp_struct) {\n");
219 
220  GWEN_Buffer_AppendString(tbuf, " ");
222  GWEN_Buffer_AppendString(tbuf, s);
223  GWEN_Buffer_AppendString(tbuf, " *p_struct;\n");
224  GWEN_Buffer_AppendString(tbuf, " int p_rv;\n");
225 
226  GWEN_Buffer_AppendString(tbuf, " p_struct=");
228  GWEN_Buffer_AppendString(tbuf, s);
230  GWEN_Buffer_AppendByte(tbuf, '_');
231  }
232  GWEN_Buffer_AppendString(tbuf, "_new();\n");
233 
234  GWEN_Buffer_AppendString(tbuf, " p_rv=");
236  GWEN_Buffer_AppendString(tbuf, s);
237  GWEN_Buffer_AppendString(tbuf, "_ReadObject(p_struct, p_db);\n");
238 
239  GWEN_Buffer_AppendString(tbuf, " if (p_rv<0) {\n");
240  GWEN_Buffer_AppendString(tbuf, " DBG_INFO(GWEN_LOGDOMAIN, \"here (%d)\", p_rv);\n");
241  GWEN_Buffer_AppendString(tbuf, " ");
243  GWEN_Buffer_AppendString(tbuf, s);
244  GWEN_Buffer_AppendString(tbuf, "_free(p_struct);\n");
245  GWEN_Buffer_AppendString(tbuf, " return p_rv;\n");
246  GWEN_Buffer_AppendString(tbuf, " }\n");
247 
248  GWEN_Buffer_AppendString(tbuf, " *pp_struct=p_struct;\n");
249  GWEN_Buffer_AppendString(tbuf, " return 0;\n");
250  GWEN_Buffer_AppendString(tbuf, "}\n");
251 
253  GWEN_Buffer_free(tbuf);
254 
255  return 0;
256 }
257 
258 
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
#define NULL
Definition: binreloc.c:300
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
#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
int TM2C_BuildFromObject(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
int TM2C_BuildReadObject(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
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
int Typemaker2_Type_GetNonVolatileMemberCount(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:731
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
static void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
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 _addReadMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
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 Typemaker2_Builder_Invoke_FromObjectFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
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)