gwenhywfar 5.14.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, " ");
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) {
199 GWEN_Buffer_AppendString(tbuf, " ");
200 }
201 GWEN_Buffer_AppendString(tbuf, "int ");
204 GWEN_Buffer_AppendString(tbuf, "_fromObject(const AQDB_OBJECT *p_db, ");
207 GWEN_Buffer_AppendString(tbuf, " **pp_struct);\n");
209 GWEN_Buffer_Reset(tbuf);
210
211 /* implementation */
212 GWEN_Buffer_AppendString(tbuf, "int ");
215 GWEN_Buffer_AppendString(tbuf, "_fromObject(const AQDB_OBJECT *p_db, ");
218 GWEN_Buffer_AppendString(tbuf, " **pp_struct) {\n");
219
220 GWEN_Buffer_AppendString(tbuf, " ");
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=");
230 GWEN_Buffer_AppendByte(tbuf, '_');
231 }
232 GWEN_Buffer_AppendString(tbuf, "_new();\n");
233
234 GWEN_Buffer_AppendString(tbuf, " p_rv=");
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, " ");
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
#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
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition buffer.c:1087
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition buffer.c:653
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition buffer.c:393
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_LOGDOMAIN
Definition logger.h:32
int TM2C_AddReleaseOldValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_misc.c:23
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
static int _addReadMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
int TM2C_BuildReadObject(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
static void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
int TM2C_BuildFromObject(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:204
void Typemaker2_Builder_AddPublicDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:172
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition tm_builder.c:133
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition tm_builder.h:26
int Typemaker2_Builder_Invoke_FromObjectFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
int Typemaker2_Builder_Invoke_ConstructFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:467
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:237
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:83
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition tm_member.h:21
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:585
int Typemaker2_Type_GetNonVolatileMemberCount(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:773
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:607
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:683
int Typemaker2_Type_GetUsePrivateConstructor(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:515
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition tm_type.h:21
#define TYPEMAKER2_FLAGS_VOLATILE
Definition tm_type.h:32
#define TYPEMAKER2_FLAGS_OWN
Definition tm_type.h:31
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER