gwenhywfar  5.10.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 
41  sigList=Typemaker2_Type_GetSignals(ty);
42  if (sigList) {
43  TYPEMAKER2_SIGNAL *sig;
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 ");
127  GWEN_Buffer_AppendString(tbuf, s);
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, "(");
134  GWEN_Buffer_AppendString(tbuf, s);
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, "\"");
143  GWEN_Buffer_AppendString(tbuf, s);
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 ");
164  GWEN_Buffer_AppendString(tbuf, s);
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, "(");
171  GWEN_Buffer_AppendString(tbuf, s);
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, "\"");
180  GWEN_Buffer_AppendString(tbuf, s);
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 *");
202  GWEN_Buffer_AppendString(tbuf, s);
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 ");
209  GWEN_Buffer_AppendString(tbuf, s);
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, "\"");
216  GWEN_Buffer_AppendString(tbuf, s);
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 ");
234  GWEN_Buffer_AppendString(tbuf, s);
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, "(");
241  GWEN_Buffer_AppendString(tbuf, s);
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, ", ");
246  GWEN_Buffer_AppendString(tbuf, s);
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, ", ");
252  GWEN_Buffer_AppendString(tbuf, s);
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, "\"");
269  GWEN_Buffer_AppendString(tbuf, s);
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 }
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:133
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct TYPEMAKER2_SIGNAL TYPEMAKER2_SIGNAL
Definition: tm_signal.h:27
int TM2C_BuildSignalFunctions(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_signal.c:25
#define TYPEMAKER2_SIGNAL_FLAGS_USE_PARAM4
Definition: tm_signal.h:18
uint32_t Typemaker2_Signal_GetFlags(const TYPEMAKER2_SIGNAL *p_struct)
Definition: tm_signal.c:146
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
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
const char * Typemaker2_Signal_GetParamType1(const TYPEMAKER2_SIGNAL *p_struct)
Definition: tm_signal.c:134
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
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
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
#define TYPEMAKER2_SIGNAL_FLAGS_USE_PARAM3
Definition: tm_signal.h:17
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
const char * Typemaker2_Signal_GetParamType2(const TYPEMAKER2_SIGNAL *p_struct)
Definition: tm_signal.c:140
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989