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) {
176  GWEN_Buffer_AppendString(tbuf, s);
177  GWEN_Buffer_AppendString(tbuf, " ");
178  }
179  GWEN_Buffer_AppendString(tbuf, "int ");
181  GWEN_Buffer_AppendString(tbuf, s);
182  GWEN_Buffer_AppendString(tbuf, "_toDb(const ");
184  GWEN_Buffer_AppendString(tbuf, s);
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 ");
192  GWEN_Buffer_AppendString(tbuf, s);
193  GWEN_Buffer_AppendString(tbuf, "_toDb(const ");
195  GWEN_Buffer_AppendString(tbuf, s);
196  GWEN_Buffer_AppendString(tbuf, " *p_struct, GWEN_DB_NODE *p_db) {\n");
197 
198  GWEN_Buffer_AppendString(tbuf, " return ");
200  GWEN_Buffer_AppendString(tbuf, s);
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 
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
#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
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_writedb.c:72
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
int TM2C_BuildWriteDb(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_writedb.c:32
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
static int _addWriteMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_writedb.c:121
int Typemaker2_Type_GetNonVolatileMemberCount(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:731
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
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
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
int TM2C_BuildToDb(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_writedb.c:161
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)
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
static void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_writedb.c:49
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_ToDbFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)