gwenhywfar  4.99.8beta
lhc.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Mon Mar 01 2004
3  copyright : (C) 2004-2010 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 
16 #include "args.h"
17 #include "typemaker_p.h"
18 #include <gwenhywfar/debug.h>
19 #include <gwenhywfar/logger.h>
20 #include <gwenhywfar/xml.h>
21 #include <gwenhywfar/syncio_file.h>
22 
23 #include <stdlib.h>
24 #include <assert.h>
25 
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <fcntl.h>
29 #include <errno.h>
30 #include <string.h>
31 #include <ctype.h>
32 
33 
34 
35 
37  int rv;
38  const char *f;
39  GWEN_BUFFER *fname;
40  GWEN_BUFFER *hbuf;
41  const char *s;
42  const char *nacc;
43  const char *constAcc;
44  const char *constName;
45  const char *fromDbAcc;
46  const char *fromDbName;
47  const char *dupAcc;
48  const char *dupName;
49  GWEN_SYNCIO *sio;
50  int err;
51  GWEN_XMLNODE *n;
52  const char *id;
53  const char *prefix;
54 
55  id=get_struct_property(node, "id", 0);
56  if (!id) {
57  DBG_ERROR(0, "No id for struct");
58  return -1;
59  }
60 
61  prefix=get_struct_property(node, "prefix", 0);
62  if (!prefix) {
63  DBG_ERROR(0, "No prefix for struct");
64  return -1;
65  }
66 
67  f=get_struct_property(node, "filename", 0);
68  if (!f) {
69  DBG_ERROR(0, "No filename given");
70  return -1;
71  }
72 
73  nacc=get_struct_property(node, "access", "public");
74  constAcc=get_struct_property(node, "constructor-access", nacc);
75  constName=get_struct_property(node, "constructor-name", 0);
76  fromDbAcc=get_struct_property(node, "fromdb-access", nacc);
77  fromDbName=get_struct_property(node, "fromdb-name", 0);
78  dupAcc=get_struct_property(node, "dup-access", nacc);
79  dupName=get_struct_property(node, "fromdb-name", 0);
80 
81  fname=GWEN_Buffer_new(0, 256, 0, 1);
82  GWEN_Buffer_AppendString(fname, f);
83  GWEN_Buffer_AppendString(fname, "_l.h");
84 
94  rv=GWEN_SyncIo_Connect(sio);
95  if (rv<0) {
96  DBG_ERROR(0, "open(%s): %s",
97  GWEN_Buffer_GetStart(fname),
98  strerror(errno));
99  GWEN_Buffer_free(fname);
100  GWEN_SyncIo_free(sio);
101  return -1;
102  }
103  GWEN_Buffer_free(fname);
104 
105  /* Insert the auto-generation warning */
106  GWEN_SyncIo_WriteString(sio, "/* This file is auto-generated from \"");
107  GWEN_SyncIo_WriteString(sio, f);
108  GWEN_SyncIo_WriteLine(sio, ".xml\" by the typemaker");
109  GWEN_SyncIo_WriteLine(sio, " tool of Gwenhywfar. ");
110  GWEN_SyncIo_WriteLine(sio, " Do not edit this file -- all changes will be lost! */");
111 
112  hbuf=GWEN_Buffer_new(0, 256, 0, 1);
113  s=f;
114  while(*s) {
115  GWEN_Buffer_AppendByte(hbuf, toupper(*s));
116  s++;
117  }
118  GWEN_Buffer_AppendString(hbuf, "_L_H");
119 
120  GWEN_SyncIo_WriteString(sio, "#ifndef ");
122  GWEN_SyncIo_WriteString(sio, "#define ");
124  GWEN_SyncIo_WriteLine(sio, "");
125 
126 
127  rv=write_apidoc_c(args, node, sio, "lib");
128  if (rv)
129  return rv;
130 
131  if (strcasecmp(nacc, "lib")==0) {
132  GWEN_SyncIo_WriteLine(sio, "#ifdef __cplusplus");
133  GWEN_SyncIo_WriteLine(sio, "extern \"C\" {");
134  GWEN_SyncIo_WriteLine(sio, "#endif");
135  GWEN_SyncIo_WriteLine(sio, "");
136  GWEN_SyncIo_WriteString(sio, "typedef struct ");
137  GWEN_SyncIo_WriteString(sio, id);
138  GWEN_SyncIo_WriteString(sio, " ");
139  GWEN_SyncIo_WriteString(sio, id);
140  GWEN_SyncIo_WriteLine(sio, ";");
141  GWEN_SyncIo_WriteLine(sio, "");
142  GWEN_SyncIo_WriteLine(sio, "#ifdef __cplusplus");
143  GWEN_SyncIo_WriteLine(sio, "} /* __cplusplus */");
144  GWEN_SyncIo_WriteLine(sio, "#endif");
145  GWEN_SyncIo_WriteLine(sio, "");
146 
147  }
148 
149 
150  if (strcasecmp(get_struct_property(node, "inherit", ""),
151  "lib")==0) {
152  GWEN_SyncIo_WriteLine(sio, "#include <gwenhywfar/inherit.h>");
153  }
154 
155  if (strcasecmp(get_struct_property(node, "list", ""),
156  "lib")==0) {
157  GWEN_SyncIo_WriteLine(sio, "#include <gwenhywfar/misc.h>");
158  }
159 
160  if (strcasecmp(get_struct_property(node, "list2", ""),
161  "lib")==0) {
162  GWEN_SyncIo_WriteLine(sio, "#include <gwenhywfar/list2.h>");
163  }
164 
165  if (strcasecmp(nacc, "public")==0) {
166  fname=GWEN_Buffer_new(0, 256, 0, 1);
167  GWEN_Buffer_AppendString(fname, f);
168  GWEN_Buffer_AppendString(fname, ".h");
169  GWEN_SyncIo_WriteString(sio, "#include \"");
171  GWEN_SyncIo_WriteLine(sio, "\"");
172  GWEN_Buffer_free(fname);
173  }
174 
175  if (strcasecmp(get_struct_property(node, "list", ""),
176  "lib")==0) {
177  GWEN_SyncIo_WriteLine(sio, "#include <gwenhywfar/misc.h>");
178  }
179 
180 
181  if (strcasecmp(nacc, "lib")==0) {
182  GWEN_SyncIo_WriteLine(sio, "#include <gwenhywfar/db.h>");
183 
184  n=GWEN_XMLNode_FindFirstTag(node, "pre-headers", 0, 0);
185  if (n) {
186  GWEN_XMLNODE *nn;
187 
189  while(nn) {
190  rv=write_hp_group_c(args, nn, sio);
191  if (rv) {
192  GWEN_Buffer_free(hbuf);
193  return -1;
194  }
196  } /* while */
197  }
198 
199  n=GWEN_XMLNode_FindFirstTag(node, "headers", 0, 0);
200  if (n) {
201  GWEN_XMLNODE *nn;
202 
204  while(nn) {
205  rv=write_hp_group_c(args, nn, sio);
206  if (rv) {
207  GWEN_Buffer_free(hbuf);
208  return -1;
209  }
211  } /* while */
212  }
213 
214  n=GWEN_XMLNode_FindFirstTag(node, "post-headers", 0, 0);
215  if (n) {
216  GWEN_XMLNODE *nn;
217 
219  while(nn) {
220  rv=write_hp_group_c(args, nn, sio);
221  if (rv) {
222  GWEN_Buffer_free(hbuf);
223  return -1;
224  }
226  } /* while */
227  }
228 
229  }
230  GWEN_SyncIo_WriteLine(sio, "");
231  GWEN_SyncIo_WriteLine(sio, "#ifdef __cplusplus");
232  GWEN_SyncIo_WriteLine(sio, "extern \"C\" {");
233  GWEN_SyncIo_WriteLine(sio, "#endif");
234  GWEN_SyncIo_WriteLine(sio, "");
235 
236  if (write_h_enums(args, node, sio, "lib")) {
237  DBG_ERROR(0, "Error writing enum types");
238  return -1;
239  }
240 
241  if (write_h_funcs(args, node, sio, "lib")) {
242  DBG_ERROR(0, "Error writing function types");
243  return -1;
244  }
245 
246  if (strcasecmp(get_struct_property(node, "inherit", ""),
247  "lib")==0) {
248  GWEN_SyncIo_WriteString(sio, "GWEN_INHERIT_FUNCTION_DEFS(");
249  GWEN_SyncIo_WriteString(sio, id);
250  GWEN_SyncIo_WriteLine(sio, ")");
251  }
252 
253  if (strcasecmp(get_struct_property(node, "list", ""),
254  "lib")==0) {
255  GWEN_SyncIo_WriteString(sio, "GWEN_LIST_FUNCTION_DEFS(");
256  GWEN_SyncIo_WriteString(sio, id);
257  GWEN_SyncIo_WriteString(sio, ", ");
258  GWEN_SyncIo_WriteString(sio, prefix);
259  GWEN_SyncIo_WriteLine(sio, ")");
260 
261  if (dupAcc && strcasecmp(dupAcc, "none")!=0) {
262  GWEN_SyncIo_WriteString(sio, id);
263  GWEN_SyncIo_WriteString(sio, "_LIST *");
264  GWEN_SyncIo_WriteString(sio, prefix);
265  GWEN_SyncIo_WriteString(sio, "_List_dup(const ");
266  GWEN_SyncIo_WriteString(sio, id);
267  GWEN_SyncIo_WriteLine(sio, "_LIST *stl);");
268  GWEN_SyncIo_WriteLine(sio, "");
269  }
270  }
271 
272  if (strcasecmp(get_struct_property(node, "list2", ""),
273  "lib")==0) {
274  GWEN_SyncIo_WriteString(sio, "GWEN_LIST2_FUNCTION_DEFS(");
275  GWEN_SyncIo_WriteString(sio, id);
276  GWEN_SyncIo_WriteString(sio, ", ");
277  GWEN_SyncIo_WriteString(sio, prefix);
278  GWEN_SyncIo_WriteLine(sio, ")");
279 
280  GWEN_SyncIo_WriteLine(sio, "");
281  GWEN_SyncIo_WriteString(sio, "void ");
282  GWEN_SyncIo_WriteString(sio, prefix);
283  GWEN_SyncIo_WriteString(sio, "_List2_freeAll(");
284  GWEN_SyncIo_WriteString(sio, id);
285  GWEN_SyncIo_WriteLine(sio, "_LIST2 *stl);");
286 
287  GWEN_SyncIo_WriteLine(sio, "");
288  }
289 
290  if (strcasecmp(constAcc, "lib")==0) {
291  GWEN_SyncIo_WriteString(sio, id);
292  GWEN_SyncIo_WriteString(sio, " *");
293  GWEN_SyncIo_WriteString(sio, prefix);
294  if (constName)
295  GWEN_SyncIo_WriteString(sio, constName);
296  else
297  GWEN_SyncIo_WriteString(sio, "_new");
298  GWEN_SyncIo_WriteLine(sio, "(void);");
299  }
300 
301  /* FromDb */
302  if (strcasecmp(fromDbAcc, "lib")==0) {
303  GWEN_SyncIo_WriteString(sio, id);
304  GWEN_SyncIo_WriteString(sio, " *");
305  GWEN_SyncIo_WriteString(sio, prefix);
306  if (fromDbName)
307  GWEN_SyncIo_WriteString(sio, fromDbName);
308  else
309  GWEN_SyncIo_WriteString(sio, "_fromDb");
310  GWEN_SyncIo_WriteLine(sio, "(GWEN_DB_NODE *db);");
311  }
312 
313  /* dup */
314  if (strcasecmp(dupAcc, "lib")==0) {
315  GWEN_SyncIo_WriteString(sio, id);
316  GWEN_SyncIo_WriteString(sio, " *");
317  GWEN_SyncIo_WriteString(sio, prefix);
318  if (dupName)
319  GWEN_SyncIo_WriteString(sio, dupName);
320  else
321  GWEN_SyncIo_WriteString(sio, "_dup");
322  GWEN_SyncIo_WriteString(sio, "(const ");
323  GWEN_SyncIo_WriteString(sio, id);
324  GWEN_SyncIo_WriteLine(sio, "*st);");
325  }
326 
327  if (strcasecmp(nacc, "lib")==0) {
328  GWEN_SyncIo_WriteString(sio, "void ");
329  GWEN_SyncIo_WriteString(sio, prefix);
330  GWEN_SyncIo_WriteString(sio, "_free(");
331  GWEN_SyncIo_WriteString(sio, id);
332  GWEN_SyncIo_WriteLine(sio, " *st);");
333 
334  GWEN_SyncIo_WriteString(sio, "void ");
335  GWEN_SyncIo_WriteString(sio, prefix);
336  GWEN_SyncIo_WriteString(sio, "_Attach(");
337  GWEN_SyncIo_WriteString(sio, id);
338  GWEN_SyncIo_WriteLine(sio, " *st);");
339 
340  /* ReadDb */
341  GWEN_SyncIo_WriteString(sio, "int ");
342  GWEN_SyncIo_WriteString(sio, prefix);
343  GWEN_SyncIo_WriteString(sio, "_ReadDb(");
344  GWEN_SyncIo_WriteString(sio, id);
345  GWEN_SyncIo_WriteLine(sio, " *st, GWEN_DB_NODE *db);");
346 
347  /* ToDb */
348  GWEN_SyncIo_WriteString(sio, "int ");
349  GWEN_SyncIo_WriteString(sio, prefix);
350  GWEN_SyncIo_WriteString(sio, "_toDb(const ");
351  GWEN_SyncIo_WriteString(sio, id);
352  GWEN_SyncIo_WriteLine(sio, "*st, GWEN_DB_NODE *db);");
353 
354  GWEN_SyncIo_WriteString(sio, "int ");
355  GWEN_SyncIo_WriteString(sio, prefix);
356  GWEN_SyncIo_WriteString(sio, "_IsModified(const ");
357  GWEN_SyncIo_WriteString(sio, id);
358  GWEN_SyncIo_WriteLine(sio, " *st);");
359 
360  GWEN_SyncIo_WriteString(sio, "void ");
361  GWEN_SyncIo_WriteString(sio, prefix);
362  GWEN_SyncIo_WriteString(sio, "_SetModified(");
363  GWEN_SyncIo_WriteString(sio, id);
364  GWEN_SyncIo_WriteLine(sio, " *st, int i);");
365  }
366 
367  rv=write_h_setget_c(args, node, sio, "lib");
368  if (rv) {
369  GWEN_Buffer_free(hbuf);
371  GWEN_SyncIo_free(sio);
372  return rv;
373  }
374 
375  GWEN_SyncIo_WriteLine(sio, "");
376  GWEN_SyncIo_WriteLine(sio, "#ifdef __cplusplus");
377  GWEN_SyncIo_WriteLine(sio, "} /* __cplusplus */");
378  GWEN_SyncIo_WriteLine(sio, "#endif");
379  GWEN_SyncIo_WriteLine(sio, "");
380 
381  /* write trailing endif */
382  GWEN_SyncIo_WriteLine(sio, "");
383 
384  GWEN_SyncIo_WriteString(sio, "#endif /* ");
386  GWEN_SyncIo_WriteLine(sio, " */");
387 
388  err=GWEN_SyncIo_Disconnect(sio);
389  if (err) {
390  DBG_ERROR_ERR(0, err);
391  GWEN_SyncIo_free(sio);
392  GWEN_Buffer_free(hbuf);
393  return -1;
394  }
395 
396  GWEN_Buffer_free(hbuf);
397  return 0;
398 }
399 
400 
401 
403  GWEN_XMLNODE *n;
404  int rv;
405 
406  n=GWEN_XMLNode_FindFirstTag(node, "type", 0, 0);
407  while (n) {
408  rv=write_hl_file_c(args, n);
409  if (rv)
410  return rv;
411  n=GWEN_XMLNode_FindNextTag(n, "type", 0, 0);
412  }
413  return 0;
414 }
415 
416 
417 
418 
419 
420 
421 
422 
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:94
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition: syncio_file.h:54
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:712
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
int write_hl_files_c(ARGUMENTS *args, GWEN_XMLNODE *node)
Definition: lhc.c:402
#define DBG_ERROR_ERR(dbg_logger, dbg_err)
Definition: debug.h:108
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:38
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
Definition: syncio_file.h:62
int GWEN_SyncIo_WriteLine(GWEN_SYNCIO *sio, const char *s)
Definition: syncio.c:382
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:695
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
const char * get_struct_property(GWEN_XMLNODE *node, const char *pname, const char *defval)
int write_h_funcs(ARGUMENTS *args, GWEN_XMLNODE *node, GWEN_SYNCIO *sio, const char *acc)
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:635
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
Definition: syncio_file.h:63
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:380
int write_hp_group_c(ARGUMENTS *args, GWEN_XMLNODE *node, GWEN_SYNCIO *sio)
Definition: phc.c:217
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
int write_hl_file_c(ARGUMENTS *args, GWEN_XMLNODE *node)
Definition: lhc.c:36
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:83
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:76
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:169
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:629
int GWEN_SyncIo_WriteString(GWEN_SYNCIO *sio, const char *s)
Definition: syncio.c:368
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:105
int write_h_enums(ARGUMENTS *args, GWEN_XMLNODE *node, GWEN_SYNCIO *sio, const char *acc)
int write_h_setget_c(ARGUMENTS *args, GWEN_XMLNODE *node, GWEN_SYNCIO *sio, const char *acc)
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
int write_apidoc_c(ARGUMENTS *args, GWEN_XMLNODE *node, GWEN_SYNCIO *sio, const char *acc)
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:148
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:1014