gwenhywfar 5.12.0
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
26static 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);
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) {
65 GWEN_Buffer_AppendString(tbuf, " ");
66 }
67 GWEN_Buffer_AppendString(tbuf, "void ");
70 GWEN_Buffer_AppendString(tbuf, "_free(");
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 ");
92 GWEN_Buffer_AppendString(tbuf, "(");
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);
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
166void _addTypeFinis(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
167{
168 const char *sTypeId;
169 const char *sTypePrefix;
170
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
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) {
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 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 _addFreeHookPrototype(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
static void _addPrototypes(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
static int _addImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
static void _addTypeFinis(TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
int TM2C_BuildDestructor(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
static int _addMemberFinis(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
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
int Typemaker2_Builder_Invoke_DestructFn(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
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
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:585
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:361
const char * Typemaker2_Type_GetFreeHook(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:244
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
#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_FLAGS_OWN
Definition tm_type.h:31
#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