gwenhywfar  5.10.1
tm2c_destructor.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_destructor.h"
16 
17 #include <gwenhywfar/debug.h>
18 
19 #include <ctype.h>
20 
21 
22 
26 static void _addTypeFinis(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf);
28 
29 
30 
31 
32 
34 {
35  int rv;
36 
37  _addPrototypes(tb, ty);
38  _addFreeHookPrototype(tb, ty);
39 
40  rv=_addImplementation(tb, ty);
41  if (rv<0) {
42  DBG_INFO(NULL, "here (%d)", rv);
43  return rv;
44  }
45 
46  return 0;
47 }
48 
49 
50 
52 {
53  GWEN_BUFFER *tbuf;
54  const char *s;
56 
58  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
59 
60  /* prototype */
61  GWEN_Buffer_AppendString(tbuf, "/** Destructor. */\n");
63  if (s) {
64  GWEN_Buffer_AppendString(tbuf, s);
65  GWEN_Buffer_AppendString(tbuf, " ");
66  }
67  GWEN_Buffer_AppendString(tbuf, "void ");
69  GWEN_Buffer_AppendString(tbuf, s);
70  GWEN_Buffer_AppendString(tbuf, "_free(");
72  GWEN_Buffer_AppendString(tbuf, s);
73  GWEN_Buffer_AppendString(tbuf, " *p_struct);\n");
75  GWEN_Buffer_free(tbuf);
76 }
77 
78 
79 
81 {
82  const char *s;
83 
84  /* insert freeHook prototype, if needed */
86  if (s && *s) {
87  GWEN_BUFFER *tbuf;
88 
89  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
90  GWEN_Buffer_AppendString(tbuf, "static void ");
91  GWEN_Buffer_AppendString(tbuf, s);
92  GWEN_Buffer_AppendString(tbuf, "(");
94  GWEN_Buffer_AppendString(tbuf, s);
95  GWEN_Buffer_AppendString(tbuf, " *p_struct);\n");
97  GWEN_Buffer_free(tbuf);
98  }
99 }
100 
101 
102 
104 {
105  GWEN_BUFFER *tbuf;
106  const char *s;
107  uint32_t flags;
108  const char *sTypeId;
109  const char *sTypePrefix;
110  int rv;
111 
112  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
113 
114  flags=Typemaker2_Type_GetFlags(ty);
115  sTypeId=Typemaker2_Type_GetIdentifier(ty);
116  sTypePrefix=Typemaker2_Type_GetPrefix(ty);
117 
118  /* implementation */
119  GWEN_Buffer_AppendArgs(tbuf, "void %s_free(%s *p_struct) {\n", sTypePrefix, sTypeId);
120 
121  GWEN_Buffer_AppendString(tbuf, " if (p_struct) {\n");
122 
124  GWEN_Buffer_AppendString(tbuf, " assert(p_struct->_refCount);\n");
125  GWEN_Buffer_AppendString(tbuf, " if (p_struct->_refCount==1) {\n");
126  }
127 
129  GWEN_Buffer_AppendString(tbuf, " GWEN_SignalObject_free(p_struct->_signalObject);\n");
130 
131  /* insert freeHook, if any */
133  if (s && *s)
134  GWEN_Buffer_AppendArgs(tbuf, " %s(p_struct);\n", s);
135 
136  _addTypeFinis(ty, flags, tbuf);
137 
138  rv=_addMemberFinis(tb, ty, tbuf);
139  if (rv<0) {
140  DBG_INFO(NULL, "here (%d)", rv);
141  GWEN_Buffer_free(tbuf);
142  return rv;
143  }
144 
146  GWEN_Buffer_AppendString(tbuf, " p_struct->_refCount=0;\n");
147  }
148 
149  GWEN_Buffer_AppendString(tbuf, " GWEN_FREE_OBJECT(p_struct);\n");
151  GWEN_Buffer_AppendString(tbuf, " }\n");
152  GWEN_Buffer_AppendString(tbuf, " else\n");
153  GWEN_Buffer_AppendString(tbuf, " p_struct->_refCount--;\n");
154  }
155  GWEN_Buffer_AppendString(tbuf, " }\n");
156  GWEN_Buffer_AppendString(tbuf, "}\n");
157 
159  GWEN_Buffer_free(tbuf);
160 
161  return 0;
162 }
163 
164 
165 
166 void _addTypeFinis(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
167 {
168  const char *sTypeId;
169  const char *sTypePrefix;
170 
171  sTypeId=Typemaker2_Type_GetIdentifier(ty);
172  sTypePrefix=Typemaker2_Type_GetPrefix(ty);
173 
175  GWEN_Buffer_AppendArgs(tbuf, " GWEN_INHERIT_FINI(%s, p_struct)\n", sTypeId);
176 
178  GWEN_Buffer_AppendArgs(tbuf, " GWEN_LIST_FINI(%s, p_struct)\n", sTypeId);
179 
180  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_TREE)
181  GWEN_Buffer_AppendArgs(tbuf, " GWEN_TREE_FINI(%s, p_struct)\n", sTypeId);
182 
183 
185  GWEN_Buffer_AppendArgs(tbuf, " GWEN_TREE2_FINI(%s, p_struct, %s)\n", sTypeId, sTypePrefix);
186 }
187 
188 
189 
191 {
192  TYPEMAKER2_MEMBER_LIST *tml;
193 
194  GWEN_Buffer_AppendString(tbuf, " /* members */\n");
196  if (tml) {
197  TYPEMAKER2_MEMBER *tm;
198 
199  tm=Typemaker2_Member_List_First(tml);
200  while (tm) {
202  /* destruct, but only if the member is owned */
203  GWEN_BUFFER *dstbuf;
204  int rv;
205  const char *s;
206 
207  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
208  GWEN_Buffer_AppendString(dstbuf, "p_struct->");
210  GWEN_Buffer_AppendString(dstbuf, s);
211 
212  GWEN_Buffer_AppendString(tbuf, " ");
214  GWEN_Buffer_GetStart(dstbuf),
215  NULL, /* no dest */
216  tbuf);
217  if (rv<0) {
218  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
219  GWEN_Buffer_free(dstbuf);
220  return rv;
221  }
222  GWEN_Buffer_free(dstbuf);
223  GWEN_Buffer_AppendString(tbuf, "\n");
224  }
225 
226  tm=Typemaker2_Member_List_Next(tm);
227  }
228  }
229  return 0;
230 }
231 
232 
233 
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE2
Definition: tm_type.h:71
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:133
int TM2C_BuildDestructor(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
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
#define NULL
Definition: binreloc.c:300
#define GWEN_LOGDOMAIN
Definition: logger.h:35
#define TYPEMAKER2_TYPEFLAGS_WITH_SLOTS
Definition: tm_type.h:63
static void _addFreeHookPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
int Typemaker2_Builder_Invoke_DestructFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:196
static int _addMemberFinis(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
#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_Type_GetFreeHook(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:244
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
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
#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_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
static void _addPrototypes(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
static void _addTypeFinis(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
#define TYPEMAKER2_TYPEFLAGS_WITH_INHERIT
Definition: tm_type.h:58
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
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1
Definition: tm_type.h:56