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, " ");
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
#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_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 _addDupValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_copy.c:214
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_copy.c:75
static void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_copy.c:50
static int _addAssignValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_copy.c:181
static int _addCopyMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_copy.c:120
int TM2C_BuildCopy(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_copy.c:34
int TM2C_AddReleaseOldValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_misc.c:23
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_DupFn(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
int Typemaker2_Builder_Invoke_AssignFn(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_GetCopyFlags(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:325
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
int Typemaker2_Type_GetType(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:171
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:543
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
@ TypeMaker2_Type_Pointer
Definition: tm_type.h:78
#define TYPEMAKER2_FLAGS_OWN
Definition: tm_type.h:31
#define TYPEMAKER2_FLAGS_ASSIGN
Definition: tm_type.h:40
#define TYPEMAKER2_FLAGS_NOCOPY
Definition: tm_type.h:43
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER