gwenhywfar  5.10.1
tm2c_copy.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_copy.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_copy(%s *p_struct, const %s *p_src);\n",
70  GWEN_Buffer_free(tbuf);
71 }
72 
73 
74 
76 {
77  GWEN_BUFFER *tbuf;
78  TYPEMAKER2_MEMBER_LIST *tml;
79  int rv;
80 
81  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
82 
84  "%s *%s_copy(%s *p_struct, const %s *p_src) {\n",
89 
90  GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
91  GWEN_Buffer_AppendString(tbuf, " assert(p_src);\n");
92 
94  if (tml) {
96 
97  tm=Typemaker2_Member_List_First(tml);
98  while (tm) {
99  rv=_addCopyMemberCode(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  tm=Typemaker2_Member_List_Next(tm);
106  }
107  }
108 
109  GWEN_Buffer_AppendString(tbuf, " return p_struct;\n");
110  GWEN_Buffer_AppendString(tbuf, "}\n");
111 
113  GWEN_Buffer_free(tbuf);
114 
115  return 0;
116 }
117 
118 
119 
121 {
122  TYPEMAKER2_TYPE *mty;
123  const char *sMemberName;
124  int rv;
125 
127  assert(mty);
128  sMemberName=Typemaker2_Member_GetName(tm);
129 
131  GWEN_Buffer_AppendArgs(tbuf, " /* member \"%s\" */\n", sMemberName);
132 
133  /* TODO: only do this if there is a preset value and it is !=NULL for pointers! */
135  rv=TM2C_AddReleaseOldValueCode(tb, ty, tm, tbuf);
136  if (rv<0) {
137  DBG_INFO(NULL, "here (%d)", rv);
138  GWEN_Buffer_free(tbuf);
139  return rv;
140  }
141  }
142 
145  rv=_addAssignValueCode(tb, ty, tm, tbuf);
146  if (rv<0) {
147  DBG_INFO(NULL, "here (%d)", rv);
148  return rv;
149  }
150  } /* assign */
151  else {
152  GWEN_Buffer_AppendArgs(tbuf, " if (p_src->%s) {\n", sMemberName);
153  rv=_addDupValueCode(tb, ty, tm, tbuf);
154  if (rv<0) {
155  DBG_INFO(NULL, "here (%d)", rv);
156  return rv;
157  }
158  GWEN_Buffer_AppendString(tbuf, " }\n");
159  }
160  } /* if pointer */
161  else {
162  rv=_addDupValueCode(tb, ty, tm, tbuf);
163  if (rv<0) {
164  DBG_INFO(NULL, "here (%d)", rv);
165  return rv;
166  }
167  }
168  } /* if !nocopy */
169  else {
170  GWEN_Buffer_AppendString(tbuf, " /* member \"");
171  GWEN_Buffer_AppendString(tbuf, sMemberName);
172  GWEN_Buffer_AppendString(tbuf, "\" has nocopy flag, not copying */\n");
173  }
174 
175  GWEN_Buffer_AppendString(tbuf, "\n");
176  return 0;
177 }
178 
179 
180 
182 {
183  GWEN_BUFFER *dstbuf;
184  GWEN_BUFFER *srcbuf;
185  int rv;
186  const char *sMemberName;
187 
188  sMemberName=Typemaker2_Member_GetName(tm);
189 
190  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
191  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
192 
193  srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
194  GWEN_Buffer_AppendArgs(srcbuf, "p_src->%s", sMemberName);
195 
196  GWEN_Buffer_AppendString(tbuf, " ");
198  GWEN_Buffer_GetStart(srcbuf),
199  GWEN_Buffer_GetStart(dstbuf),
200  tbuf);
201  GWEN_Buffer_free(srcbuf);
202  GWEN_Buffer_free(dstbuf);
203  if (rv<0) {
204  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
205  return rv;
206  }
207  GWEN_Buffer_AppendString(tbuf, "\n");
208 
209  return 0;
210 }
211 
212 
213 
215 {
216  GWEN_BUFFER *dstbuf;
217  GWEN_BUFFER *srcbuf;
218  int rv;
219  const char *sMemberName;
220 
221  sMemberName=Typemaker2_Member_GetName(tm);
222 
223  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
224  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
225 
226  srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
227  GWEN_Buffer_AppendArgs(srcbuf, "p_src->%s", sMemberName);
228 
229  GWEN_Buffer_AppendString(tbuf, " ");
230  rv=Typemaker2_Builder_Invoke_DupFn(tb, ty, tm,
231  GWEN_Buffer_GetStart(srcbuf),
232  GWEN_Buffer_GetStart(dstbuf),
233  tbuf);
234  GWEN_Buffer_free(srcbuf);
235  GWEN_Buffer_free(dstbuf);
236  if (rv<0) {
237  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
238  return rv;
239  }
240  GWEN_Buffer_AppendString(tbuf, "\n");
241 
242  return 0;
243 }
244 
245 
246 
247 
248 
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 void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_copy.c:50
#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_copy.c:75
#define TYPEMAKER2_FLAGS_NOCOPY
Definition: tm_type.h:43
static int _addAssignValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_copy.c:181
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
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
uint32_t Typemaker2_Member_GetCopyFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:325
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
static int _addDupValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_copy.c:214
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
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
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
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
static int _addCopyMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_copy.c:120
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
int TM2C_BuildCopy(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_copy.c:34