gwenhywfar  5.10.1
tm2c_dup.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_dup.h"
16 #include "tm2c_misc.h"
17 
18 #include <gwenhywfar/debug.h>
19 
20 #include <ctype.h>
21 
22 
23 
29 
30 
31 
32 
33 
35 {
36  int rv;
37 
38  _addPrototype(tb, ty);
39  rv=_addImplementation(tb, ty);
40  if (rv<0) {
41  DBG_INFO(NULL, "here (%d)", rv);
42  return rv;
43  }
44 
45  return 0;
46 }
47 
48 
49 
51 {
52  GWEN_BUFFER *tbuf;
53  const char *s;
55 
57  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
58 
59  /* prototype */
61  if (s)
62  GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
64  "%s *%s_dup(const %s *p_src);\n",
69  GWEN_Buffer_free(tbuf);
70 }
71 
72 
73 
75 {
76  GWEN_BUFFER *tbuf;
77  TYPEMAKER2_MEMBER_LIST *tml;
78  int rv;
79 
80  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
81 
83  "%s *%s_dup(const %s *p_src) {\n",
87 
88  GWEN_Buffer_AppendArgs(tbuf, " %s *p_struct;\n\n", Typemaker2_Type_GetIdentifier(ty));
89 
90  GWEN_Buffer_AppendString(tbuf, " assert(p_src);\n");
92  GWEN_Buffer_AppendArgs(tbuf, " p_struct=%s__new();\n", Typemaker2_Type_GetPrefix(ty));
93  else
94  GWEN_Buffer_AppendArgs(tbuf, " p_struct=%s_new();\n", Typemaker2_Type_GetPrefix(ty));
95 
96 
98  if (tml) {
100 
101  tm=Typemaker2_Member_List_First(tml);
102  while (tm) {
103  rv=_addDupMemberCode(tb, ty, tm, tbuf);
104  if (rv<0) {
105  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
106  return rv;
107  }
108  GWEN_Buffer_AppendString(tbuf, "\n");
109  tm=Typemaker2_Member_List_Next(tm);
110  }
111  }
112 
113  GWEN_Buffer_AppendString(tbuf, " return p_struct;\n");
114  GWEN_Buffer_AppendString(tbuf, "}\n");
115 
117  GWEN_Buffer_free(tbuf);
118 
119  return 0;
120 }
121 
122 
123 
125 {
126  TYPEMAKER2_TYPE *mty;
127  const char *sMemberName;
128  int rv;
129 
131  assert(mty);
132  sMemberName=Typemaker2_Member_GetName(tm);
133 
135  GWEN_Buffer_AppendArgs(tbuf, " /* member \"%s\" */\n", sMemberName);
136 
137  /* TODO: only do this if there is a preset value and it is !=NULL for pointers! */
139  rv=TM2C_AddReleaseOldValueCode(tb, ty, tm, tbuf);
140  if (rv<0) {
141  DBG_INFO(NULL, "here (%d)", rv);
142  GWEN_Buffer_free(tbuf);
143  return rv;
144  }
145  }
146 
149  rv=_addAssignValueCode(tb, ty, tm, tbuf);
150  if (rv<0) {
151  DBG_INFO(NULL, "here (%d)", rv);
152  return rv;
153  }
154  } /* assign */
155  else {
156  GWEN_Buffer_AppendArgs(tbuf, " if (p_src->%s) {\n", sMemberName);
157  rv=_addDupValueCode(tb, ty, tm, tbuf);
158  if (rv<0) {
159  DBG_INFO(NULL, "here (%d)", rv);
160  return rv;
161  }
162  GWEN_Buffer_AppendString(tbuf, " }\n");
163  }
164  } /* if pointer */
165  else {
166  rv=_addDupValueCode(tb, ty, tm, tbuf);
167  if (rv<0) {
168  DBG_INFO(NULL, "here (%d)", rv);
169  return rv;
170  }
171  }
172  } /* if !nodup */
173  else {
174  GWEN_Buffer_AppendString(tbuf, " /* member \"");
175  GWEN_Buffer_AppendString(tbuf, sMemberName);
176  GWEN_Buffer_AppendString(tbuf, "\" has nodup flag, not copying */\n");
177  }
178 
179  GWEN_Buffer_AppendString(tbuf, "\n");
180  return 0;
181 }
182 
183 
184 
186 {
187  GWEN_BUFFER *dstbuf;
188  GWEN_BUFFER *srcbuf;
189  int rv;
190  const char *sMemberName;
191 
192  sMemberName=Typemaker2_Member_GetName(tm);
193 
194  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
195  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
196 
197  srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
198  GWEN_Buffer_AppendArgs(srcbuf, "p_src->%s", sMemberName);
199 
200  GWEN_Buffer_AppendString(tbuf, " ");
202  GWEN_Buffer_GetStart(srcbuf),
203  GWEN_Buffer_GetStart(dstbuf),
204  tbuf);
205  GWEN_Buffer_free(srcbuf);
206  GWEN_Buffer_free(dstbuf);
207  if (rv<0) {
208  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
209  return rv;
210  }
211  GWEN_Buffer_AppendString(tbuf, "\n");
212 
213  return 0;
214 }
215 
216 
217 
219 {
220  GWEN_BUFFER *dstbuf;
221  GWEN_BUFFER *srcbuf;
222  int rv;
223  const char *sMemberName;
224 
225  sMemberName=Typemaker2_Member_GetName(tm);
226 
227  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
228  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
229 
230  srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
231  GWEN_Buffer_AppendArgs(srcbuf, "p_src->%s", sMemberName);
232 
233  GWEN_Buffer_AppendString(tbuf, " ");
234  rv=Typemaker2_Builder_Invoke_DupFn(tb, ty, tm,
235  GWEN_Buffer_GetStart(srcbuf),
236  GWEN_Buffer_GetStart(dstbuf),
237  tbuf);
238  GWEN_Buffer_free(srcbuf);
239  GWEN_Buffer_free(dstbuf);
240  if (rv<0) {
241  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
242  return rv;
243  }
244  GWEN_Buffer_AppendString(tbuf, "\n");
245 
246  return 0;
247 }
248 
249 
250 
251 
252 
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 Typemaker2_Builder_Invoke_DupFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
static int _addDupMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_dup.c:124
#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
#define TYPEMAKER2_FLAGS_ASSIGN
Definition: tm_type.h:40
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_dup.c:74
int TM2C_BuildDup(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_dup.c:34
static int _addDupValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_dup.c:218
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 void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_dup.c:50
uint32_t Typemaker2_Member_GetDupFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:303
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
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
int Typemaker2_Type_GetType(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:171
#define TYPEMAKER2_FLAGS_NODUP
Definition: tm_type.h:36
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_AssignFn(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
static int _addAssignValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_dup.c:185
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989