gwenhywfar  5.10.1
tm2c_typedef.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_typedef.h"
16 
17 #include <gwenhywfar/debug.h>
18 
19 #include <ctype.h>
20 
21 
22 
24 static void _addPreHeaders(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf);
25 static void _addTypeSpecificDefs(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf);
26 
27 
28 
29 
32 {
33  GWEN_BUFFER *tbuf;
34  const char *s;
35  uint32_t flags;
36 
37  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
38 
39  flags=Typemaker2_Type_GetFlags(ty);
40 
42  _addPreHeaders(ty, tbuf);
43 
45  GWEN_Buffer_AppendString(tbuf, "#include <aqdatabase/aqdb.h>\n");
46 
47  GWEN_Buffer_AppendString(tbuf, "typedef struct ");
49  GWEN_Buffer_AppendString(tbuf, s);
50  GWEN_Buffer_AppendString(tbuf, " ");
51  GWEN_Buffer_AppendString(tbuf, s);
52  GWEN_Buffer_AppendString(tbuf, ";\n");
53 
54  _addTypeSpecificDefs(tb, ty, flags, tbuf);
55 
57  GWEN_Buffer_AppendString(tbuf, "#include <aqdatabase/aqdb_db.h>\n");
58  }
59  GWEN_Buffer_AppendString(tbuf, "\n");
60 
62  GWEN_Buffer_free(tbuf);
63 
64  return 0;
65 }
66 
67 
68 
70 {
71  uint32_t flags;
72 
73  flags=Typemaker2_Type_GetFlags(ty);
74 
75  /* add some system headers */
76  GWEN_Buffer_AppendString(tbuf, "/* needed system headers */\n");
77  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/types.h>\n");
79  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/list1.h>\n");
81  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/list2.h>\n");
83  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/tree.h>\n");
85  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/tree2.h>\n");
87  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/inherit.h>\n");
89  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/idmap.h>\n");
90  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_DB)
91  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/db.h>\n");
93  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/xml.h>\n");
95  GWEN_Buffer_AppendString(tbuf, "#include <gwenhywfar/gwensignal.h>\n");
96  GWEN_Buffer_AppendString(tbuf, "\n");
97 }
98 
99 
100 
102 {
103  TYPEMAKER2_HEADER_LIST *hl;
104 
105  /* handle pre-headers */
107  if (hl) {
109 
110  h=Typemaker2_Header_List_First(hl);
111  if (h) {
112  GWEN_Buffer_AppendString(tbuf, "/* pre-headers */\n");
113  while (h) {
115  GWEN_Buffer_AppendString(tbuf, "#include ");
116 
118  GWEN_Buffer_AppendString(tbuf, "<");
120  GWEN_Buffer_AppendString(tbuf, ">");
121  }
122  else {
123  GWEN_Buffer_AppendString(tbuf, "\"");
125  GWEN_Buffer_AppendString(tbuf, "\"");
126  }
127  GWEN_Buffer_AppendString(tbuf, "\n");
128  }
129  h=Typemaker2_Header_List_Next(h);
130  }
131  GWEN_Buffer_AppendString(tbuf, "\n");
132  }
133  }
134 }
135 
136 
137 
139 {
141  const char *sTypeId;
142  const char *sTypePrefix;
143  const char *sApi;
144 
146  sTypeId=Typemaker2_Type_GetIdentifier(ty);
147  sTypePrefix=Typemaker2_Type_GetPrefix(ty);
149 
150  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_LIST1) {
152  GWEN_Buffer_AppendArgs(tbuf, "GWEN_LIST_FUNCTION_LIB_DEFS(%s, %s, %s)\n", sTypeId, sTypePrefix, sApi);
153  else
154  GWEN_Buffer_AppendArgs(tbuf, "GWEN_LIST_FUNCTION_DEFS(%s, %s)\n", sTypeId, sTypePrefix);
155  }
156 
157  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_LIST2) {
159  GWEN_Buffer_AppendArgs(tbuf, "GWEN_LIST2_FUNCTION_LIB_DEFS(%s, %s, %s)\n", sTypeId, sTypePrefix, sApi);
160  else
161  GWEN_Buffer_AppendArgs(tbuf, "GWEN_LIST2_FUNCTION_DEFS(%s, %s)\n", sTypeId, sTypePrefix);
162  }
163 
166  GWEN_Buffer_AppendArgs(tbuf, "GWEN_CONSTLIST2_FUNCTION_LIB_DEFS(%s, %s, %s)\n", sTypeId, sTypePrefix, sApi);
167  else
168  GWEN_Buffer_AppendArgs(tbuf, "GWEN_CONSTLIST2_FUNCTION_DEFS(%s, %s)\n", sTypeId, sTypePrefix);
169  }
170 
171  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_TREE) {
173  GWEN_Buffer_AppendArgs(tbuf, "GWEN_TREE_FUNCTION_LIB_DEFS(%s, %s, %s)\n", sTypeId, sTypePrefix, sApi);
174  else
175  GWEN_Buffer_AppendArgs(tbuf, "GWEN_TREE_FUNCTION_DEFS(%s, %s)\n", sTypeId, sTypePrefix);
176  }
177 
178  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_TREE2) {
180  GWEN_Buffer_AppendArgs(tbuf, "GWEN_TREE2_FUNCTION_LIB_DEFS(%s, %s, %s)\n", sTypeId, sTypePrefix, sApi);
181  else
182  GWEN_Buffer_AppendArgs(tbuf, "GWEN_TREE2_FUNCTION_DEFS(%s, %s)\n", sTypeId, sTypePrefix);
183  }
184 
185  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_INHERIT) {
187  GWEN_Buffer_AppendArgs(tbuf, "GWEN_INHERIT_FUNCTION_LIB_DEFS(%s, %s)\n", sTypeId, sApi);
188  else
189  GWEN_Buffer_AppendArgs(tbuf, "GWEN_INHERIT_FUNCTION_DEFS(%s)\n", sTypeId);
190  }
191 
192  if (flags & TYPEMAKER2_TYPEFLAGS_WITH_IDMAP) {
194  GWEN_Buffer_AppendArgs(tbuf, "GWEN_IDMAP_FUNCTION_LIB_DEFS(%s, %s, %s)\n", sTypeId, sTypePrefix, sApi);
195  else
196  GWEN_Buffer_AppendArgs(tbuf, "GWEN_IDMAP_FUNCTION_DEFS(%s, %s)\n", sTypeId, sTypePrefix);
197  }
198  GWEN_Buffer_AppendString(tbuf, "\n");
199 }
200 
201 
202 
int Typemaker2_Header_GetType(const TYPEMAKER2_HEADER *th)
Definition: tm_header.c:90
#define TYPEMAKER2_TYPEFLAGS_WITH_CONSTLIST2
Definition: tm_type.h:70
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE2
Definition: tm_type.h:71
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
const char * Typemaker2_Header_GetFileName(const TYPEMAKER2_HEADER *th)
Definition: tm_header.c:68
TYPEMAKER2_HEADER_LIST * Typemaker2_Type_GetHeaders(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:650
int Typemaker2_Header_GetLocation(const TYPEMAKER2_HEADER *th)
Definition: tm_header.c:108
#define TYPEMAKER2_TYPEFLAGS_WITH_XML
Definition: tm_type.h:54
static void _addFlagSpecificSystemHeaders(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
Definition: tm2c_typedef.c:69
#define TYPEMAKER2_TYPEFLAGS_WITH_SLOTS
Definition: tm_type.h:63
struct TYPEMAKER2_HEADER TYPEMAKER2_HEADER
Definition: tm_header.h:19
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
#define TYPEMAKER2_TYPEFLAGS_WITH_SIGNALS
Definition: tm_type.h:62
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
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE
Definition: tm_type.h:60
int TM2C_BuildTypedef(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
Definition: tm2c_typedef.c:31
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
static void _addTypeSpecificDefs(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, uint32_t flags, GWEN_BUFFER *tbuf)
Definition: tm2c_typedef.c:138
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_TYPEFLAGS_WITH_IDMAP
Definition: tm_type.h:59
static void _addPreHeaders(TYPEMAKER2_TYPE *ty, GWEN_BUFFER *tbuf)
Definition: tm2c_typedef.c:101
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)
#define TYPEMAKER2_TYPEFLAGS_WITH_INHERIT
Definition: tm_type.h:58
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:341
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST2
Definition: tm_type.h:57
#define TYPEMAKER2_TYPEFLAGS_WITH_OBJECT
Definition: tm_type.h:55
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
#define TYPEMAKER2_TYPEFLAGS_WITH_DB
Definition: tm_type.h:53
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1
Definition: tm_type.h:56