gwenhywfar 5.14.1
tm2c_signal.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_signal.h"
16#include "tm2c_misc.h"
17
18#include <gwenhywfar/debug.h>
19
20#include <ctype.h>
21
22
23
24
26{
27 GWEN_BUFFER *tbuf;
28 const char *s;
30 TYPEMAKER2_SIGNAL_LIST *sigList;
31 const char *sTypeId;
32 const char *sTypePrefix;
33
36 sTypePrefix=Typemaker2_Type_GetPrefix(ty);
37
38 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
39
40
42 if (sigList) {
44
45 /* prototype */
46 GWEN_Buffer_AppendString(tbuf, "/* signal functions */\n");
47 sig=Typemaker2_Signal_List_First(sigList);
48 while (sig) {
49 const char *sSignalName;
50
51 sSignalName=Typemaker2_Signal_GetName(sig);
52
53 /* SignalConnect */
55 if (s && *s)
56 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
58 "int %s_SignalConnect_%c%s(%s *p_struct, GWEN_SLOT *slot);\n",
59 sTypePrefix,
60 toupper(*sSignalName),
61 sSignalName+1,
62 sTypeId);
63
64
65 /* SignalDisconnect */
67 if (s && *s)
68 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
70 "int %s_SignalDisconnect_%c%s(%s *p_struct, GWEN_SLOT *slot);\n",
71 sTypePrefix,
72 toupper(*sSignalName),
73 sSignalName+1,
74 sTypeId);
75
76
77 /* GetSignal */
79 if (s && *s)
80 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
82 "GWEN_SIGNAL *%s_GetSignal_%c%s(const %s *p_struct);\n",
83 sTypePrefix,
84 toupper(*sSignalName),
85 sSignalName+1,
86 sTypeId);
87
88
89 /* EmitSignal */
91 if (s && *s)
92 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
94 "int %s_EmitSignal_%c%s(%s *p_struct",
95 sTypePrefix,
96 toupper(*sSignalName),
97 sSignalName+1,
98 sTypeId);
99
100 s=Typemaker2_Signal_GetParamType1(sig); /* param 1 */
101 if (s && *s && strcasecmp(s, "none")!=0)
102 GWEN_Buffer_AppendArgs(tbuf, ", %s param1", s);
103
104 s=Typemaker2_Signal_GetParamType2(sig); /* param 2 */
105 if (s && *s && strcasecmp(s, "none")!=0)
106 GWEN_Buffer_AppendArgs(tbuf, ", %s param2", s);
108 GWEN_Buffer_AppendString(tbuf, ", int param3");
110 GWEN_Buffer_AppendString(tbuf, ", int param4");
111 GWEN_Buffer_AppendString(tbuf, ");\n");
112
113
114 sig=Typemaker2_Signal_List_Next(sig);
115 }
117 GWEN_Buffer_Reset(tbuf);
118
119 /* implementation */
120 GWEN_Buffer_AppendString(tbuf, "/* signal functions */\n");
121 sig=Typemaker2_Signal_List_First(sigList);
122 while (sig) {
123
124 /* SignalConnect */
125 GWEN_Buffer_AppendString(tbuf, "int ");
128 GWEN_Buffer_AppendString(tbuf, "_SignalConnect_");
130 GWEN_Buffer_AppendByte(tbuf, toupper(*s));
131 GWEN_Buffer_AppendString(tbuf, s+1);
132 GWEN_Buffer_AppendString(tbuf, "(");
135 GWEN_Buffer_AppendString(tbuf, " *p_struct, GWEN_SLOT *slot) {\n");
136
137 GWEN_Buffer_AppendString(tbuf, " GWEN_SIGNAL *sig;\n");
138 GWEN_Buffer_AppendString(tbuf, "\n");
139 GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
140 GWEN_Buffer_AppendString(tbuf, " sig=GWEN_SignalObject_FindSignal(p_struct->_signalObject, ");
141 s=Typemaker2_Signal_GetName(sig); /* name */
142 GWEN_Buffer_AppendString(tbuf, "\"");
144 GWEN_Buffer_AppendString(tbuf, "\", ");
145 s=Typemaker2_Signal_GetParamType1(sig); /* param 1 */
146 GWEN_Buffer_AppendString(tbuf, "\"");
147 GWEN_Buffer_AppendString(tbuf, s?s:"none");
148 GWEN_Buffer_AppendString(tbuf, "\", ");
149 s=Typemaker2_Signal_GetParamType2(sig); /* param 2 */
150 GWEN_Buffer_AppendString(tbuf, "\"");
151 GWEN_Buffer_AppendString(tbuf, s?s:"none");
152 GWEN_Buffer_AppendString(tbuf, "\");\n");
153 GWEN_Buffer_AppendString(tbuf, " if (sig)\n");
154 GWEN_Buffer_AppendString(tbuf, " return GWEN_Signal_Connect(sig, slot);\n");
155 GWEN_Buffer_AppendString(tbuf, " else\n");
156 GWEN_Buffer_AppendString(tbuf, " return GWEN_ERROR_NOT_FOUND;\n");
157
158 GWEN_Buffer_AppendString(tbuf, "}\n");
159 GWEN_Buffer_AppendString(tbuf, "\n");
160
161 /* SignalDisconnect */
162 GWEN_Buffer_AppendString(tbuf, "int ");
165 GWEN_Buffer_AppendString(tbuf, "_SignalDisconnect_");
167 GWEN_Buffer_AppendByte(tbuf, toupper(*s));
168 GWEN_Buffer_AppendString(tbuf, s+1);
169 GWEN_Buffer_AppendString(tbuf, "(");
172 GWEN_Buffer_AppendString(tbuf, " *p_struct, GWEN_SLOT *slot) {\n");
173
174 GWEN_Buffer_AppendString(tbuf, " GWEN_SIGNAL *sig;\n");
175 GWEN_Buffer_AppendString(tbuf, "\n");
176 GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
177 GWEN_Buffer_AppendString(tbuf, " sig=GWEN_SignalObject_FindSignal(p_struct->_signalObject, ");
178 s=Typemaker2_Signal_GetName(sig); /* name */
179 GWEN_Buffer_AppendString(tbuf, "\"");
181 GWEN_Buffer_AppendString(tbuf, "\", ");
182 s=Typemaker2_Signal_GetParamType1(sig); /* param 1 */
183 GWEN_Buffer_AppendString(tbuf, "\"");
184 GWEN_Buffer_AppendString(tbuf, s?s:"none");
185 GWEN_Buffer_AppendString(tbuf, "\", ");
186 s=Typemaker2_Signal_GetParamType2(sig); /* param 2 */
187 GWEN_Buffer_AppendString(tbuf, "\"");
188 GWEN_Buffer_AppendString(tbuf, s?s:"none");
189 GWEN_Buffer_AppendString(tbuf, "\");\n");
190 GWEN_Buffer_AppendString(tbuf, " if (sig)\n");
191 GWEN_Buffer_AppendString(tbuf, " return GWEN_Signal_Disconnect(sig, slot);\n");
192 GWEN_Buffer_AppendString(tbuf, " else\n");
193 GWEN_Buffer_AppendString(tbuf, " return GWEN_ERROR_NOT_FOUND;\n");
194
195 GWEN_Buffer_AppendString(tbuf, "}\n");
196 GWEN_Buffer_AppendString(tbuf, "\n");
197
198
199 /* GetSignal */
200 GWEN_Buffer_AppendString(tbuf, "GWEN_SIGNAL *");
203 GWEN_Buffer_AppendString(tbuf, "_GetSignal_");
205 GWEN_Buffer_AppendByte(tbuf, toupper(*s));
206 GWEN_Buffer_AppendString(tbuf, s+1);
207 GWEN_Buffer_AppendString(tbuf, "(const ");
210 GWEN_Buffer_AppendString(tbuf, " *p_struct) {\n");
211
212 GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
213 GWEN_Buffer_AppendString(tbuf, " return GWEN_SignalObject_FindSignal(p_struct->_signalObject, ");
214 s=Typemaker2_Signal_GetName(sig); /* name */
215 GWEN_Buffer_AppendString(tbuf, "\"");
217 GWEN_Buffer_AppendString(tbuf, "\", ");
218 s=Typemaker2_Signal_GetParamType1(sig); /* param 1 */
219 GWEN_Buffer_AppendString(tbuf, "\"");
220 GWEN_Buffer_AppendString(tbuf, s?s:"none");
221 GWEN_Buffer_AppendString(tbuf, "\", ");
222 s=Typemaker2_Signal_GetParamType2(sig); /* param 2 */
223 GWEN_Buffer_AppendString(tbuf, "\"");
224 GWEN_Buffer_AppendString(tbuf, s?s:"none");
225 GWEN_Buffer_AppendString(tbuf, "\");\n");
226
227 GWEN_Buffer_AppendString(tbuf, "}\n");
228 GWEN_Buffer_AppendString(tbuf, "\n");
229
230
231 /* EmitSignal */
232 GWEN_Buffer_AppendString(tbuf, "int ");
235 GWEN_Buffer_AppendString(tbuf, "_EmitSignal_");
237 GWEN_Buffer_AppendByte(tbuf, toupper(*s));
238 GWEN_Buffer_AppendString(tbuf, s+1);
239 GWEN_Buffer_AppendString(tbuf, "(");
242 GWEN_Buffer_AppendString(tbuf, " *p_struct");
243 s=Typemaker2_Signal_GetParamType1(sig); /* param 1 */
244 if (s && *s && strcasecmp(s, "none")) {
245 GWEN_Buffer_AppendString(tbuf, ", ");
247 GWEN_Buffer_AppendString(tbuf, " param1");
248 }
249 s=Typemaker2_Signal_GetParamType2(sig); /* param 2 */
250 if (s && *s && strcasecmp(s, "none")) {
251 GWEN_Buffer_AppendString(tbuf, ", ");
253 GWEN_Buffer_AppendString(tbuf, " param2");
254 }
256 GWEN_Buffer_AppendString(tbuf, ", int param3");
257 }
259 GWEN_Buffer_AppendString(tbuf, ", int param4");
260 }
261 GWEN_Buffer_AppendString(tbuf, "){\n");
262
263 GWEN_Buffer_AppendString(tbuf, " GWEN_SIGNAL *sig;\n");
264 GWEN_Buffer_AppendString(tbuf, "\n");
265 GWEN_Buffer_AppendString(tbuf, " assert(p_struct);\n");
266 GWEN_Buffer_AppendString(tbuf, " sig=GWEN_SignalObject_FindSignal(p_struct->_signalObject, ");
267 s=Typemaker2_Signal_GetName(sig); /* name */
268 GWEN_Buffer_AppendString(tbuf, "\"");
270 GWEN_Buffer_AppendString(tbuf, "\", ");
271
272 s=Typemaker2_Signal_GetParamType1(sig); /* param 1 */
273 GWEN_Buffer_AppendString(tbuf, "\"");
274 GWEN_Buffer_AppendString(tbuf, s?s:"none");
275 GWEN_Buffer_AppendString(tbuf, "\", ");
276 s=Typemaker2_Signal_GetParamType2(sig); /* param 2 */
277 GWEN_Buffer_AppendString(tbuf, "\"");
278 GWEN_Buffer_AppendString(tbuf, s?s:"none");
279 GWEN_Buffer_AppendString(tbuf, "\");\n");
280
281 GWEN_Buffer_AppendString(tbuf, " if (sig) \n");
282 GWEN_Buffer_AppendString(tbuf, " return GWEN_Signal_Emit(sig, ");
283 s=Typemaker2_Signal_GetParamType1(sig); /* param 1 */
284 if (s && *s && strcasecmp(s, "none")) {
285 GWEN_Buffer_AppendString(tbuf, "(void*) ");
286 GWEN_Buffer_AppendString(tbuf, "param1, ");
287 }
288 else
289 GWEN_Buffer_AppendString(tbuf, "NULL, ");
290 s=Typemaker2_Signal_GetParamType2(sig); /* param 2 */
291 if (s && *s && strcasecmp(s, "none")) {
292 GWEN_Buffer_AppendString(tbuf, "(void*) ");
293 GWEN_Buffer_AppendString(tbuf, " param2, ");
294 }
295 else
296 GWEN_Buffer_AppendString(tbuf, "NULL, ");
298 GWEN_Buffer_AppendString(tbuf, "param3, ");
299 else
300 GWEN_Buffer_AppendString(tbuf, "0, ");
302 GWEN_Buffer_AppendString(tbuf, "param4");
303 else
304 GWEN_Buffer_AppendString(tbuf, "0");
305 GWEN_Buffer_AppendString(tbuf, ");\n");
306
307
308 GWEN_Buffer_AppendString(tbuf, " else\n");
309 GWEN_Buffer_AppendString(tbuf, " return 0;\n");
310
311 GWEN_Buffer_AppendString(tbuf, "}\n");
312 GWEN_Buffer_AppendString(tbuf, "\n");
313
314
315 sig=Typemaker2_Signal_List_Next(sig);
316 }
318 GWEN_Buffer_Reset(tbuf);
319
320 }
321 GWEN_Buffer_free(tbuf);
322
323 return 0;
324}
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_Reset(GWEN_BUFFER *bf)
Definition buffer.c:653
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
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition buffer.c:393
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
int TM2C_BuildSignalFunctions(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_signal.c:25
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
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition tm_builder.h:26
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
uint32_t Typemaker2_Signal_GetFlags(const TYPEMAKER2_SIGNAL *p_struct)
Definition tm_signal.c:146
#define TYPEMAKER2_SIGNAL_FLAGS_USE_PARAM4
Definition tm_signal.h:18
#define TYPEMAKER2_SIGNAL_FLAGS_USE_PARAM3
Definition tm_signal.h:17
struct TYPEMAKER2_SIGNAL TYPEMAKER2_SIGNAL
Definition tm_signal.h:27
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_SIGNAL_LIST * Typemaker2_Type_GetSignals(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:746
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition tm_type.h:21
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER