gwenhywfar 5.12.0
tm2c_enums.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_enums.h"
16#include "tm2c_misc.h"
17
18#include <gwenhywfar/debug.h>
19
20#include <ctype.h>
21
22
23
24
26{
27 TYPEMAKER2_ENUM_LIST *enums;
28
30 assert(enums);
31 if (Typemaker2_Enum_List_GetCount(enums)) {
32 GWEN_BUFFER *tbuf;
33 const char *s;
35
36 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
37
38 te=Typemaker2_Enum_List_First(enums);
39 while (te) {
40 const char *prefix;
41 const char *etype;
43 int access=TypeMaker2_Access_Public;
44
46 if (prefix==NULL || *prefix==0) {
47 DBG_ERROR(GWEN_LOGDOMAIN, "No prefix in enum definition");
48 GWEN_Buffer_free(tbuf);
50 }
51
53 if (etype && *etype)
54 GWEN_Buffer_AppendString(tbuf, "typedef enum {\n");
55 else
56 GWEN_Buffer_AppendString(tbuf, "enum {\n");
57
58 GWEN_Buffer_AppendString(tbuf, " ");
59 if (prefix)
60 GWEN_Buffer_AppendString(tbuf, prefix);
61 GWEN_Buffer_AppendString(tbuf, "Unknown = -1");
62 ti=Typemaker2_Item_List_First(Typemaker2_Enum_GetItems(te));
63 if (ti)
64 GWEN_Buffer_AppendString(tbuf, ",");
65 GWEN_Buffer_AppendString(tbuf, "\n");
66 while (ti) {
67 GWEN_Buffer_AppendString(tbuf, " ");
68 if (prefix)
69 GWEN_Buffer_AppendString(tbuf, prefix);
71 if (s && *s) {
72 GWEN_Buffer_AppendByte(tbuf, toupper(*s));
73 GWEN_Buffer_AppendString(tbuf, s+1);
74 }
76 if (s) {
77 GWEN_Buffer_AppendString(tbuf, " = ");
79 }
80
81 ti=Typemaker2_Item_List_Next(ti);
82 if (ti)
83 GWEN_Buffer_AppendString(tbuf, ",");
84 GWEN_Buffer_AppendString(tbuf, "\n");
85 }
86 GWEN_Buffer_AppendString(tbuf, "}");
87
88 if (etype && *etype) {
89 GWEN_Buffer_AppendString(tbuf, " ");
90 GWEN_Buffer_AppendString(tbuf, etype);
91 }
92
93 GWEN_Buffer_AppendString(tbuf, ";\n");
94 GWEN_Buffer_AppendString(tbuf, "\n");
95
96 switch (access) {
99 break;
102 break;
105 break;
108 break;
109 default:
110 DBG_ERROR(GWEN_LOGDOMAIN, "Invalid access type");
111 GWEN_Buffer_free(tbuf);
112 return GWEN_ERROR_BAD_DATA;
113 }
114 GWEN_Buffer_Reset(tbuf);
115
116 te=Typemaker2_Enum_List_Next(te);
117 }
118 }
119
120 return 0;
121}
122
123
124
125
127{
128 TYPEMAKER2_ENUM_LIST *enums;
129 /* TYPEMAKER2_TYPEMANAGER *tym; */
130 /* uint32_t flags; */
131
132 /* tym=Typemaker2_Builder_GetTypeManager(tb); */
133 enums=Typemaker2_Type_GetEnums(ty);
134 /* flags=Typemaker2_Type_GetFlags(ty); */
135
136 assert(enums);
137 if (Typemaker2_Enum_List_GetCount(enums)) {
138 TYPEMAKER2_ENUM *te;
139
140 te=Typemaker2_Enum_List_First(enums);
141 while (te) {
142 const char *prefix;
143 GWEN_BUFFER *tbuf;
144
145 prefix=Typemaker2_Enum_GetPrefix(te);
146 if (prefix==NULL || *prefix==0) {
147 DBG_ERROR(GWEN_LOGDOMAIN, "No prefix in enum definition");
148 return GWEN_ERROR_BAD_DATA;
149 }
150
151 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
152 if (prefix && *prefix) {
153 GWEN_Buffer_AppendString(tbuf, prefix);
154 if (prefix[strlen(prefix)-1]!='_')
155 GWEN_Buffer_AppendString(tbuf, "_");
156 }
157 GWEN_Buffer_AppendString(tbuf, "fromString");
159 GWEN_Buffer_Reset(tbuf);
160
161 if (prefix && *prefix) {
162 GWEN_Buffer_AppendString(tbuf, prefix);
163 if (prefix[strlen(prefix)-1]!='_')
164 GWEN_Buffer_AppendString(tbuf, "_");
165 }
166 GWEN_Buffer_AppendString(tbuf, "toString");
168 GWEN_Buffer_free(tbuf);
169
170 te=Typemaker2_Enum_List_Next(te);
171 }
172 }
173
174 return 0;
175}
176
177
178
180{
181 TYPEMAKER2_ENUM_LIST *enums;
183
185 enums=Typemaker2_Type_GetEnums(ty);
186
187 assert(enums);
188 if (Typemaker2_Enum_List_GetCount(enums)) {
189 GWEN_BUFFER *tbuf;
190 const char *s;
191 TYPEMAKER2_ENUM *te;
192
193 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
194
195 te=Typemaker2_Enum_List_First(enums);
196 while (te) {
197 const char *prefix;
198 const char *etype;
199 TYPEMAKER2_ITEM *ti;
201 int i;
202
203 prefix=Typemaker2_Enum_GetPrefix(te);
204 if (prefix==NULL || *prefix==0) {
205 DBG_ERROR(GWEN_LOGDOMAIN, "No prefix in enum definition");
206 GWEN_Buffer_free(tbuf);
207 return GWEN_ERROR_BAD_DATA;
208 }
209
210 etype=Typemaker2_Enum_GetType(te);
211
212 /* prototype */
214 if (s && *s)
215 GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
216
217 GWEN_Buffer_AppendArgs(tbuf, "%s ", (etype && *etype)?etype:"int");
218 if (prefix && *prefix) {
219 GWEN_Buffer_AppendString(tbuf, prefix);
220 if (prefix[strlen(prefix)-1]!='_')
221 GWEN_Buffer_AppendString(tbuf, "_");
222 }
223 GWEN_Buffer_AppendString(tbuf, "fromString(const char *p_s);\n");
224 switch (acc) {
227 break;
230 break;
233 break;
236 break;
237 default:
238 DBG_ERROR(GWEN_LOGDOMAIN, "Invalid access type");
239 GWEN_Buffer_free(tbuf);
240 return GWEN_ERROR_BAD_DATA;
241 }
242 GWEN_Buffer_Reset(tbuf);
243
244 /* implementation */
245 if (etype && *etype)
246 GWEN_Buffer_AppendArgs(tbuf, "%s ", etype);
247 else
248 GWEN_Buffer_AppendString(tbuf, "int ");
249 if (prefix && *prefix) {
250 GWEN_Buffer_AppendString(tbuf, prefix);
251 if (prefix[strlen(prefix)-1]!='_')
252 GWEN_Buffer_AppendString(tbuf, "_");
253 }
254 GWEN_Buffer_AppendString(tbuf, "fromString(const char *p_s) {\n");
255
256 GWEN_Buffer_AppendString(tbuf, " if (p_s && *p_s) {\n");
257
258 i=0;
259 ti=Typemaker2_Item_List_First(Typemaker2_Enum_GetItems(te));
260 while (ti) {
261 const char *sItemName;
262
263 sItemName=Typemaker2_Item_GetName(ti);
264 GWEN_Buffer_AppendString(tbuf, " ");
265 if (i++)
266 GWEN_Buffer_AppendString(tbuf, "else ");
267
268 GWEN_Buffer_AppendArgs(tbuf, "if (strcasecmp(p_s, \"%s\")==0)\n", sItemName);
269 GWEN_Buffer_AppendArgs(tbuf, " return %s%c%s;\n", prefix, toupper(*sItemName), sItemName+1);
270
271 ti=Typemaker2_Item_List_Next(ti);
272 }
273 GWEN_Buffer_AppendString(tbuf, " }\n");
274 GWEN_Buffer_AppendArgs(tbuf, " return %sUnknown;\n", prefix);
275 GWEN_Buffer_AppendString(tbuf, "}\n");
276
278 GWEN_Buffer_Reset(tbuf);
279 te=Typemaker2_Enum_List_Next(te);
280 }
281 GWEN_Buffer_free(tbuf);
282 } /* if enums */
283
284 return 0;
285}
286
287
288
290{
291 TYPEMAKER2_ENUM_LIST *enums;
293 /* uint32_t flags; */
294
296 enums=Typemaker2_Type_GetEnums(ty);
297 /* flags=Typemaker2_Type_GetFlags(ty); */
298
299 assert(enums);
300 if (Typemaker2_Enum_List_GetCount(enums)) {
301 GWEN_BUFFER *tbuf;
302 const char *s;
303 TYPEMAKER2_ENUM *te;
304
305 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
306
307 te=Typemaker2_Enum_List_First(enums);
308 while (te) {
309 const char *prefix;
310 const char *etype;
311 TYPEMAKER2_ITEM *ti;
313
314 prefix=Typemaker2_Enum_GetPrefix(te);
315 if (prefix==NULL || *prefix==0) {
316 DBG_ERROR(GWEN_LOGDOMAIN, "No prefix in enum definition");
317 GWEN_Buffer_free(tbuf);
318 return GWEN_ERROR_BAD_DATA;
319 }
320
321 etype=Typemaker2_Enum_GetType(te);
322
323 /* prototype */
325 if (s) {
327 GWEN_Buffer_AppendString(tbuf, " ");
328 }
329 GWEN_Buffer_AppendString(tbuf, "const char *");
330 if (prefix && *prefix) {
331 GWEN_Buffer_AppendString(tbuf, prefix);
332 if (prefix[strlen(prefix)-1]!='_')
333 GWEN_Buffer_AppendString(tbuf, "_");
334 }
335 GWEN_Buffer_AppendString(tbuf, "toString(");
336 if (etype && *etype)
337 GWEN_Buffer_AppendString(tbuf, etype);
338 else
339 GWEN_Buffer_AppendString(tbuf, "int");
340 GWEN_Buffer_AppendString(tbuf, " p_i);\n");
341
342 switch (acc) {
345 break;
348 break;
351 break;
354 break;
355 default:
356 DBG_ERROR(GWEN_LOGDOMAIN, "Invalid access type");
357 GWEN_Buffer_free(tbuf);
358 return GWEN_ERROR_BAD_DATA;
359 }
360 GWEN_Buffer_Reset(tbuf);
361
362 /* implementation */
363 GWEN_Buffer_AppendString(tbuf, "const char *");
364 if (prefix && *prefix) {
365 GWEN_Buffer_AppendString(tbuf, prefix);
366 if (prefix[strlen(prefix)-1]!='_')
367 GWEN_Buffer_AppendString(tbuf, "_");
368 }
369 GWEN_Buffer_AppendString(tbuf, "toString(");
370 if (etype && *etype)
371 GWEN_Buffer_AppendString(tbuf, etype);
372 else
373 GWEN_Buffer_AppendString(tbuf, "int");
374 GWEN_Buffer_AppendString(tbuf, " p_i) {\n");
375
376 GWEN_Buffer_AppendString(tbuf, " switch(p_i) {\n");
377 ti=Typemaker2_Item_List_First(Typemaker2_Enum_GetItems(te));
378 while (ti) {
379 GWEN_Buffer_AppendString(tbuf, " case ");
380 if (prefix)
381 GWEN_Buffer_AppendString(tbuf, prefix);
383 if (s && *s) {
384 GWEN_Buffer_AppendByte(tbuf, toupper(*s));
385 GWEN_Buffer_AppendString(tbuf, s+1);
386 }
387 GWEN_Buffer_AppendString(tbuf, ": return \"");
389 if (s && *s) {
390 GWEN_Buffer_AppendByte(tbuf, tolower(*s));
391 GWEN_Buffer_AppendString(tbuf, s+1);
392 }
393 GWEN_Buffer_AppendString(tbuf, "\";\n");
394
395 ti=Typemaker2_Item_List_Next(ti);
396 }
397
398 /* handle "unknown" */
399 GWEN_Buffer_AppendString(tbuf, " case ");
400 if (prefix)
401 GWEN_Buffer_AppendString(tbuf, prefix);
402 GWEN_Buffer_AppendString(tbuf, "Unknown:\n");
403
404 /* handle default */
405 GWEN_Buffer_AppendString(tbuf, " default: return \"unknown\";\n");
406 GWEN_Buffer_AppendString(tbuf, " }\n");
407 GWEN_Buffer_AppendString(tbuf, "}\n");
408
410 GWEN_Buffer_Reset(tbuf);
411 te=Typemaker2_Enum_List_Next(te);
412 }
413 GWEN_Buffer_free(tbuf);
414 } /* if enums */
415
416 return 0;
417}
418
419
420
#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_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
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define GWEN_ERROR_BAD_DATA
Definition error.h:121
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_LOGDOMAIN
Definition logger.h:35
int TM2C_BuildEnumToString(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_enums.c:289
int TM2C_SetEnumStringFns(TYPEMAKER2_TYPE *ty)
Definition tm2c_enums.c:126
int TM2C_BuildDefineEnums(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_enums.c:25
int TM2C_BuildEnumFromString(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition tm2c_enums.c:179
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_AddLibraryDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:180
void Typemaker2_Builder_AddProtectedDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:188
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
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition tm_builder.h:26
void Typemaker2_Enum_SetFromStringFn(TYPEMAKER2_ENUM *p_struct, const char *p_src)
Definition tm_enum.c:286
const char * Typemaker2_Enum_GetType(const TYPEMAKER2_ENUM *p_struct)
Definition tm_enum.c:192
TYPEMAKER2_ITEM_LIST * Typemaker2_Enum_GetItems(const TYPEMAKER2_ENUM *p_struct)
Definition tm_enum.c:198
void Typemaker2_Enum_SetToStringFn(TYPEMAKER2_ENUM *p_struct, const char *p_src)
Definition tm_enum.c:272
const char * Typemaker2_Enum_GetPrefix(const TYPEMAKER2_ENUM *p_struct)
Definition tm_enum.c:186
struct TYPEMAKER2_ENUM TYPEMAKER2_ENUM
Definition tm_enum.h:24
const char * Typemaker2_Item_GetName(const TYPEMAKER2_ITEM *p_struct)
Definition tm_item.c:101
const char * Typemaker2_Item_GetValue(const TYPEMAKER2_ITEM *p_struct)
Definition tm_item.c:107
struct TYPEMAKER2_ITEM TYPEMAKER2_ITEM
Definition tm_item.h:22
TYPEMAKER2_ENUM_LIST * Typemaker2_Type_GetEnums(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:701
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition tm_type.h:21
@ TypeMaker2_Access_Private
Definition tm_type.h:89
@ TypeMaker2_Access_Library
Definition tm_type.h:88
@ TypeMaker2_Access_Protected
Definition tm_type.h:87
@ TypeMaker2_Access_Public
Definition tm_type.h:86
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER