gwenhywfar  5.10.1
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 
25 static void _addTypeInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf);
26 static void _addSignalInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf);
27 static void _addSlotInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf);
29 static 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) {
66  GWEN_Buffer_AppendString(tbuf, s);
67  GWEN_Buffer_AppendString(tbuf, " ");
68  }
69  }
70 
72  GWEN_Buffer_AppendString(tbuf, s);
73  /* created structs are always pointers */
74  GWEN_Buffer_AppendString(tbuf, " *");
76  GWEN_Buffer_AppendString(tbuf, s);
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 
99  flags=Typemaker2_Type_GetFlags(ty);
100 
102  GWEN_Buffer_AppendString(tbuf, s);
103  GWEN_Buffer_AppendString(tbuf, " *");
105  GWEN_Buffer_AppendString(tbuf, s);
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 
138 void _addTypeInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
139 {
140  const char *sTypeId;
141  const char *sTypePrefix;
142 
143  sTypeId=Typemaker2_Type_GetIdentifier(ty);
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);
153  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_TREE)
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 
161 void _addSignalInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
162 {
164  GWEN_Buffer_AppendString(tbuf, " p_struct->_signalObject=GWEN_SignalObject_new();\n");
165 
166  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_SIGNALS) {
167  TYPEMAKER2_SIGNAL_LIST *slist;
168 
169  GWEN_Buffer_AppendString(tbuf, " /* generate pre-defined signals */\n");
170  slist=Typemaker2_Type_GetSignals(ty);
171  if (slist) {
172  TYPEMAKER2_SIGNAL *sig;
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 
200 void _addSlotInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
201 {
202  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_SLOTS) {
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 
214  s=Typemaker2_Slot_GetName(slot);
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 */
230  GWEN_Buffer_AppendString(tbuf, s);
231  GWEN_Buffer_AppendString(tbuf, "_SlotCallback_");
232 
233  s=Typemaker2_Slot_GetName(slot);
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) {
253  TYPEMAKER2_MEMBER *tm;
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 
308  fname=Typemaker2_VirtualFn_GetName(tvf);
309  fpreset=Typemaker2_VirtualFn_GetPreset(tvf);
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 TYPEMAKER2_TYPEFLAGS_WITH_TREE2
Definition: tm_type.h:71
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:133
TYPEMAKER2_VIRTUALFN_LIST * Typemaker2_Type_GetVirtualFns(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:695
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
static int _addMemberInits(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
struct TYPEMAKER2_SIGNAL TYPEMAKER2_SIGNAL
Definition: tm_signal.h:27
const char * Typemaker2_VirtualFn_GetPreset(const TYPEMAKER2_VIRTUALFN *vf)
Definition: tm_virtualfn.c:380
TYPEMAKER2_SLOT_LIST * Typemaker2_Type_GetSlots(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:713
#define NULL
Definition: binreloc.c:300
struct TYPEMAKER2_SLOT TYPEMAKER2_SLOT
Definition: tm_slot.h:27
int TM2C_BuildConstructor(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
#define GWEN_LOGDOMAIN
Definition: logger.h:35
static void _addTypeInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
#define TYPEMAKER2_TYPEFLAGS_WITH_SLOTS
Definition: tm_type.h:63
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
TYPEMAKER2_SIGNAL_LIST * Typemaker2_Type_GetSignals(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:704
static void _buildPrototypes(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:196
struct TYPEMAKER2_VIRTUALFN TYPEMAKER2_VIRTUALFN
Definition: tm_virtualfn.h:21
const char * Typemaker2_Signal_GetParamType1(const TYPEMAKER2_SIGNAL *p_struct)
Definition: tm_signal.c:134
#define TYPEMAKER2_TYPEFLAGS_WITH_SIGNALS
Definition: tm_type.h:62
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
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE
Definition: tm_type.h:60
const char * Typemaker2_Slot_GetName(const TYPEMAKER2_SLOT *p_struct)
Definition: tm_slot.c:128
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
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
const char * Typemaker2_Signal_GetName(const TYPEMAKER2_SIGNAL *p_struct)
Definition: tm_signal.c:128
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
const char * Typemaker2_Slot_GetParamType2(const TYPEMAKER2_SLOT *p_struct)
Definition: tm_slot.c:140
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define TYPEMAKER2_TYPEFLAGS_WITH_REFCOUNT
Definition: tm_type.h:61
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
const char * Typemaker2_Slot_GetParamType1(const TYPEMAKER2_SLOT *p_struct)
Definition: tm_slot.c:134
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
#define TYPEMAKER2_TYPEFLAGS_WITH_INHERIT
Definition: tm_type.h:58
static void _addSlotInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:341
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
static void _addVirtualFns(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
const char * Typemaker2_Signal_GetParamType2(const TYPEMAKER2_SIGNAL *p_struct)
Definition: tm_signal.c:140
const char * Typemaker2_VirtualFn_GetName(const TYPEMAKER2_VIRTUALFN *vf)
Definition: tm_virtualfn.c:170
static void _addSignalInits(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
int Typemaker2_Builder_Invoke_ConstructFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1
Definition: tm_type.h:56
static int _buildImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)