gwenhywfar 5.12.0
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, " ");
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
#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:1087
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
#define DBG_INFO(dbg_logger, format,...)
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 _addDupMemberCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_dup.c:124
static int _addDupValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_dup.c:218
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_dup.c:74
static void _addPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_dup.c:50
int TM2C_BuildDup(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_dup.c:34
static int _addAssignValueCode(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_dup.c:185
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_GetDupFlags(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:303
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:585
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:607
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:683
int Typemaker2_Type_GetUsePrivateConstructor(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:515
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_NODUP
Definition tm_type.h:36
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER