gwenhywfar 5.12.0
tm2c_constructor.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_constructor.h"
16
17#include <gwenhywfar/debug.h>
18
19#include <ctype.h>
20
21
22
25static void _addTypeInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf);
26static void _addSignalInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf);
27static void _addSlotInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf);
29static void _addVirtualFns(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf);
30
31
32
33
35{
36 int rv;
37
38 _buildPrototypes(tb, ty);
39 rv=_buildImplementation(tb, ty);
40 if (rv<0) {
41 DBG_INFO(NULL, "here (%d)", rv);
42 return rv;
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 GWEN_Buffer_AppendString(tbuf, "/** Private constructor. */\n");
61 }
62 else {
63 GWEN_Buffer_AppendString(tbuf, "/** Constructor. */\n");
65 if (s) {
67 GWEN_Buffer_AppendString(tbuf, " ");
68 }
69 }
70
73 /* created structs are always pointers */
74 GWEN_Buffer_AppendString(tbuf, " *");
78 GWEN_Buffer_AppendString(tbuf, "_");
79 GWEN_Buffer_AppendString(tbuf, "_new(void)");
80 GWEN_Buffer_AppendString(tbuf, ";\n");
83 else
85 GWEN_Buffer_free(tbuf);
86}
87
88
89
91{
92 GWEN_BUFFER *tbuf;
93 const char *s;
94 uint32_t flags;
95 int rv;
96
97 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
98
100
103 GWEN_Buffer_AppendString(tbuf, " *");
107 GWEN_Buffer_AppendString(tbuf, "_");
108 GWEN_Buffer_AppendString(tbuf, "_new(void)");
109 GWEN_Buffer_AppendString(tbuf, " {\n");
110
111 GWEN_Buffer_AppendArgs(tbuf, " %s *p_struct;\n\n", Typemaker2_Type_GetIdentifier(ty));
112
113 _addTypeInits(ty, flags, tbuf);
114 _addSignalInits(ty, flags, tbuf);
115 _addSlotInits(ty, flags, tbuf);
116
117 rv=_addMemberInits(tb, ty, tbuf);
118 if (rv<0) {
119 DBG_INFO(NULL, "here (%d)", rv);
120 GWEN_Buffer_free(tbuf);
121 return rv;
122 }
123
124 _addVirtualFns(ty, tbuf);
125
126 GWEN_Buffer_AppendString(tbuf, "\n");
127 GWEN_Buffer_AppendString(tbuf, " return p_struct;\n");
128 GWEN_Buffer_AppendString(tbuf, "}\n");
129
131 GWEN_Buffer_free(tbuf);
132
133 return 0;
134}
135
136
137
138void _addTypeInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
139{
140 const char *sTypeId;
141 const char *sTypePrefix;
142
144 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
145
146 GWEN_Buffer_AppendArgs(tbuf, " GWEN_NEW_OBJECT(%s, p_struct)\n", sTypeId);
148 GWEN_Buffer_AppendString(tbuf, " p_struct->_refCount=1;\n");
150 GWEN_Buffer_AppendArgs(tbuf, " GWEN_INHERIT_INIT(%s, p_struct)\n", sTypeId);
152 GWEN_Buffer_AppendArgs(tbuf, " GWEN_LIST_INIT(%s, p_struct)\n", sTypeId);
154 GWEN_Buffer_AppendArgs(tbuf, " GWEN_TREE_INIT(%s, p_struct)\n", sTypeId);
156 GWEN_Buffer_AppendArgs(tbuf, " GWEN_TREE2_INIT(%s, p_struct, %s)\n", sTypeId, sTypePrefix);
157}
158
159
160
161void _addSignalInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
162{
164 GWEN_Buffer_AppendString(tbuf, " p_struct->_signalObject=GWEN_SignalObject_new();\n");
165
167 TYPEMAKER2_SIGNAL_LIST *slist;
168
169 GWEN_Buffer_AppendString(tbuf, " /* generate pre-defined signals */\n");
171 if (slist) {
173
174 sig=Typemaker2_Signal_List_First(slist);
175 while (sig) {
176 const char *s;
177
179 GWEN_Buffer_AppendArgs(tbuf, " /* signal \"%s \" */\n", s);
180 GWEN_Buffer_AppendString(tbuf, " GWEN_Signal_new(p_struct->_signalObject, NULL, ");
181 /* name */
182 GWEN_Buffer_AppendArgs(tbuf, "\"%s\", ", s);
183
184 /* param type 1 */
186 GWEN_Buffer_AppendArgs(tbuf, "\"%s\", ", s?s:"none");
187
188 /* param type 2 */
190 GWEN_Buffer_AppendArgs(tbuf, "\"%s\");\n", s?s:"none");
191
192 sig=Typemaker2_Signal_List_Next(sig);
193 }
194 }
195 }
196}
197
198
199
200void _addSlotInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
201{
203 TYPEMAKER2_SLOT_LIST *slist;
204
205 GWEN_Buffer_AppendString(tbuf, " /* generate pre-defined slots */\n");
206 slist=Typemaker2_Type_GetSlots(ty);
207 if (slist) {
208 TYPEMAKER2_SLOT *slot;
209
210 slot=Typemaker2_Slot_List_First(slist);
211 while (slot) {
212 const char *s;
213
215 GWEN_Buffer_AppendArgs(tbuf, " /* slot \"%s\" */\n", s);
216 GWEN_Buffer_AppendString(tbuf, " GWEN_Slot_new(p_struct->_signalObject, NULL, ");
217 /* name */
218 GWEN_Buffer_AppendArgs(tbuf, "\"%s\", ", s);
219
220 /* param type 1 */
222 GWEN_Buffer_AppendArgs(tbuf, "\"%s\", ", s?s:"none");
223
224 /* param type 2 */
226 GWEN_Buffer_AppendArgs(tbuf, "\"%s\", ", s?s:"none");
227
228 /* callback function */
231 GWEN_Buffer_AppendString(tbuf, "_SlotCallback_");
232
234 GWEN_Buffer_AppendArgs(tbuf, "%c%s", toupper(*s), (s+1));
235 GWEN_Buffer_AppendString(tbuf, ", (void*) p_struct);\n");
236
237 slot=Typemaker2_Slot_List_Next(slot);
238 }
239 }
240 }
241}
242
243
244
246{
247 TYPEMAKER2_MEMBER_LIST *tml;
248
249 GWEN_Buffer_AppendString(tbuf, " /* members */\n");
250
252 if (tml) {
254 int rv;
255
256 tm=Typemaker2_Member_List_First(tml);
257 while (tm) {
258 TYPEMAKER2_TYPE *mty;
259 GWEN_BUFFER *dstbuf;
260 const char *s;
261
262 dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
263 GWEN_Buffer_AppendString(dstbuf, "p_struct->");
265 GWEN_Buffer_AppendString(dstbuf, s);
266
268 assert(mty);
269
270 GWEN_Buffer_AppendString(tbuf, " ");
271
273 NULL, /* no source */
274 GWEN_Buffer_GetStart(dstbuf),
275 tbuf);
276 if (rv<0) {
277 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
278 GWEN_Buffer_free(dstbuf);
279 return rv;
280 }
281 GWEN_Buffer_free(dstbuf);
282
283 GWEN_Buffer_AppendString(tbuf, "\n");
284
285 tm=Typemaker2_Member_List_Next(tm);
286 }
287 }
288
289 return 0;
290}
291
292
293
295{
296 TYPEMAKER2_VIRTUALFN_LIST *tvfl;
297
299 if (tvfl) {
301
302 GWEN_Buffer_AppendString(tbuf, " /* virtual functions */\n");
303 tvf=Typemaker2_VirtualFn_List_First(tvfl);
304 while (tvf) {
305 const char *fname;
306 const char *fpreset;
307
310 if (fname && *fname && fpreset && *fpreset)
311 GWEN_Buffer_AppendArgs(tbuf, " p_struct->%c%sFn=%s;\n", tolower(*fname), fname+1, fpreset);
312 tvf=Typemaker2_VirtualFn_List_Next(tvf);
313 }
314 }
315}
316
317
318
319
320
#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 void _addSlotInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
static void _addTypeInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
static int _addMemberInits(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
static void _buildPrototypes(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
static void _addVirtualFns(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
static void _addSignalInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
int TM2C_BuildConstructor(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
static int _buildImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
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
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:196
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition tm_builder.c:133
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition tm_builder.h:26
int Typemaker2_Builder_Invoke_ConstructFn(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
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:83
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition tm_member.h:21
const char * Typemaker2_Signal_GetName(const TYPEMAKER2_SIGNAL *p_struct)
Definition tm_signal.c:128
const char * Typemaker2_Signal_GetParamType2(const TYPEMAKER2_SIGNAL *p_struct)
Definition tm_signal.c:140
const char * Typemaker2_Signal_GetParamType1(const TYPEMAKER2_SIGNAL *p_struct)
Definition tm_signal.c:134
struct TYPEMAKER2_SIGNAL TYPEMAKER2_SIGNAL
Definition tm_signal.h:27
const char * Typemaker2_Slot_GetParamType2(const TYPEMAKER2_SLOT *p_struct)
Definition tm_slot.c:140
const char * Typemaker2_Slot_GetName(const TYPEMAKER2_SLOT *p_struct)
Definition tm_slot.c:128
const char * Typemaker2_Slot_GetParamType1(const TYPEMAKER2_SLOT *p_struct)
Definition tm_slot.c:134
struct TYPEMAKER2_SLOT TYPEMAKER2_SLOT
Definition tm_slot.h:27
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:585
TYPEMAKER2_SLOT_LIST * Typemaker2_Type_GetSlots(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:755
TYPEMAKER2_VIRTUALFN_LIST * Typemaker2_Type_GetVirtualFns(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:737
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:361
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
TYPEMAKER2_SIGNAL_LIST * Typemaker2_Type_GetSignals(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:746
#define TYPEMAKER2_TYPEFLAGS_WITH_REFCOUNT
Definition tm_type.h:61
#define TYPEMAKER2_TYPEFLAGS_WITH_SIGNALS
Definition tm_type.h:62
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition tm_type.h:21
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1
Definition tm_type.h:56
#define TYPEMAKER2_TYPEFLAGS_WITH_INHERIT
Definition tm_type.h:58
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE
Definition tm_type.h:60
#define TYPEMAKER2_TYPEFLAGS_WITH_SLOTS
Definition tm_type.h:63
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE2
Definition tm_type.h:71
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
const char * Typemaker2_VirtualFn_GetName(const TYPEMAKER2_VIRTUALFN *vf)
const char * Typemaker2_VirtualFn_GetPreset(const TYPEMAKER2_VIRTUALFN *vf)
struct TYPEMAKER2_VIRTUALFN TYPEMAKER2_VIRTUALFN