gwenhywfar 5.10.1
tm2c_writedb.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_writedb.h"
16#include "tm2c_misc.h"
17
18#include <gwenhywfar/debug.h>
19
20#include <ctype.h>
21
22
23
27
28
29
30
31
33{
34 int rv;
35
36 _addPrototype(tb, ty);
37
38 rv=_addImplementation(tb, ty);
39 if (rv<0) {
40 DBG_INFO(NULL, "here (%d)", rv);
41 return rv;
42 }
43
44 return 0;
45}
46
47
48
50{
51 GWEN_BUFFER *tbuf;
52 const char *s;
54
56 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
57
58 /* prototype */
60 if (s)
61 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
63 "int %s_WriteDb(const %s *p_struct, GWEN_DB_NODE *p_db);\n",
67 GWEN_Buffer_free(tbuf);
68}
69
70
71
73{
74 GWEN_BUFFER *tbuf;
75 TYPEMAKER2_MEMBER_LIST *tml;
76
77 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
78
80 "int %s_WriteDb(const %s *p_struct, GWEN_DB_NODE *p_db) {\n",
83
84
86 GWEN_Buffer_AppendString(tbuf, " int p_rv;\n");
87 GWEN_Buffer_AppendString(tbuf, "\n");
88 }
89 GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
90
92 if (tml) {
94
95 tm=Typemaker2_Member_List_First(tml);
96 while (tm) {
97 int rv;
98
99 rv=_addWriteMemberCode(tb, ty, tm, tbuf);
100 if (rv<0) {
101 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
102 return rv;
103 }
104 GWEN_Buffer_AppendString(tbuf, "\n");
105
106 tm=Typemaker2_Member_List_Next(tm);
107 }
108 }
109
110 GWEN_Buffer_AppendString(tbuf, " return 0;\n");
111 GWEN_Buffer_AppendString(tbuf, "}\n");
112
114 GWEN_Buffer_free(tbuf);
115
116 return 0;
117}
118
119
120
122{
123 TYPEMAKER2_TYPE *mty;
124 const char *sMemberName;
125
127 assert(mty);
128 sMemberName=Typemaker2_Member_GetName(tm);
129
131 GWEN_BUFFER *srcbuf;
132 int rv;
133
134 GWEN_Buffer_AppendArgs(tbuf, " /* member \"%s\" */\n", sMemberName);
135
136 srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
137 GWEN_Buffer_AppendArgs(srcbuf, "p_struct->%s", sMemberName);
138 GWEN_Buffer_AppendString(tbuf, " ");
139 rv=Typemaker2_Builder_Invoke_ToDbFn(tb, ty, tm, GWEN_Buffer_GetStart(srcbuf), NULL, tbuf);
140 GWEN_Buffer_free(srcbuf);
141 if (rv<0) {
142 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
143 return rv;
144 }
145 GWEN_Buffer_AppendString(tbuf, "\n");
146
147 GWEN_Buffer_AppendString(tbuf, " if (p_rv<0) {\n");
148 GWEN_Buffer_AppendString(tbuf, " DBG_INFO(GWEN_LOGDOMAIN, \"here (%d)\\n\", p_rv);\n");
149 GWEN_Buffer_AppendString(tbuf, " return p_rv;\n");
150 GWEN_Buffer_AppendString(tbuf, " }\n");
151 }
152 else
153 GWEN_Buffer_AppendArgs(tbuf, " /* member \"%s\" is volatile, not writing to db */\n", sMemberName);
154 GWEN_Buffer_AppendString(tbuf, "\n");
155
156 return 0;
157}
158
159
160
162{
163 GWEN_BUFFER *tbuf;
164 const char *s;
165 /* uint32_t flags; */
167
169 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
170
171 /* flags=Typemaker2_Type_GetFlags(ty); */
172
173 /* prototype */
175 if (s) {
177 GWEN_Buffer_AppendString(tbuf, " ");
178 }
179 GWEN_Buffer_AppendString(tbuf, "int ");
182 GWEN_Buffer_AppendString(tbuf, "_toDb(const ");
185 GWEN_Buffer_AppendString(tbuf, " *p_struct, GWEN_DB_NODE *p_db);\n");
187 GWEN_Buffer_Reset(tbuf);
188
189 /* implementation */
190 GWEN_Buffer_AppendString(tbuf, "int ");
193 GWEN_Buffer_AppendString(tbuf, "_toDb(const ");
196 GWEN_Buffer_AppendString(tbuf, " *p_struct, GWEN_DB_NODE *p_db) {\n");
197
198 GWEN_Buffer_AppendString(tbuf, " return ");
201 GWEN_Buffer_AppendString(tbuf, "_WriteDb(p_struct, p_db);\n");
202 GWEN_Buffer_AppendString(tbuf, "}\n");
203
205 GWEN_Buffer_free(tbuf);
206
207 return 0;
208}
209
210
211
212
213
214
215
#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:1084
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
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
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
#define GWEN_LOGDOMAIN
Definition: logger.h:35
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_writedb.c:72
static int _addWriteMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_writedb.c:121
int TM2C_BuildWriteDb(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_writedb.c:32
static void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_writedb.c:49
int TM2C_BuildToDb(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_writedb.c:161
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
int Typemaker2_Builder_Invoke_ToDbFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
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:543
int Typemaker2_Type_GetNonVolatileMemberCount(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:731
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:641
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition: tm_type.h:21
#define TYPEMAKER2_FLAGS_VOLATILE
Definition: tm_type.h:32
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER