gwenhywfar  5.10.1
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 
29  enums=Typemaker2_Type_GetEnums(ty);
30  assert(enums);
31  if (Typemaker2_Enum_List_GetCount(enums)) {
32  GWEN_BUFFER *tbuf;
33  const char *s;
34  TYPEMAKER2_ENUM *te;
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;
42  TYPEMAKER2_ITEM *ti;
43  int access=TypeMaker2_Access_Public;
44 
45  prefix=Typemaker2_Enum_GetPrefix(te);
46  if (prefix==NULL || *prefix==0) {
47  DBG_ERROR(GWEN_LOGDOMAIN, "No prefix in enum definition");
48  GWEN_Buffer_free(tbuf);
49  return GWEN_ERROR_BAD_DATA;
50  }
51 
52  etype=Typemaker2_Enum_GetType(te);
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, " = ");
78  GWEN_Buffer_AppendString(tbuf, s);
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;
200  int acc=TypeMaker2_Access_Public;
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;
312  int acc=TypeMaker2_Access_Public;
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) {
326  GWEN_Buffer_AppendString(tbuf, 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 
const char * Typemaker2_Item_GetName(const TYPEMAKER2_ITEM *p_struct)
Definition: tm_item.c:101
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
TYPEMAKER2_ITEM_LIST * Typemaker2_Enum_GetItems(const TYPEMAKER2_ENUM *p_struct)
Definition: tm_enum.c:198
#define NULL
Definition: binreloc.c:300
#define GWEN_LOGDOMAIN
Definition: logger.h:35
struct TYPEMAKER2_ENUM TYPEMAKER2_ENUM
Definition: tm_enum.h:24
void Typemaker2_Enum_SetFromStringFn(TYPEMAKER2_ENUM *p_struct, const char *p_src)
Definition: tm_enum.c:286
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
struct TYPEMAKER2_ITEM TYPEMAKER2_ITEM
Definition: tm_item.h:22
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:196
const char * Typemaker2_Item_GetValue(const TYPEMAKER2_ITEM *p_struct)
Definition: tm_item.c:107
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
void Typemaker2_Builder_AddProtectedDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:188
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
const char * Typemaker2_Enum_GetPrefix(const TYPEMAKER2_ENUM *p_struct)
Definition: tm_enum.c:186
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
int TM2C_BuildEnumToString(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_enums.c:289
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:204
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
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
void Typemaker2_Enum_SetToStringFn(TYPEMAKER2_ENUM *p_struct, const char *p_src)
Definition: tm_enum.c:272
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
int TM2C_BuildDefineEnums(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_enums.c:25
TYPEMAKER2_ENUM_LIST * Typemaker2_Type_GetEnums(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:659
void Typemaker2_Builder_AddLibraryDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:180
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
int TM2C_SetEnumStringFns(TYPEMAKER2_TYPE *ty)
Definition: tm2c_enums.c:126
const char * Typemaker2_Enum_GetType(const TYPEMAKER2_ENUM *p_struct)
Definition: tm_enum.c:192
int TM2C_BuildEnumFromString(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_enums.c:179
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989