gwenhywfar  5.10.1
xmlmerge/main.c
Go to the documentation of this file.
1 /***************************************************************************
2  $RCSfile$
3  -------------------
4  cvs : $Id$
5  begin : Mon Mar 01 2004
6  copyright : (C) 2004 by Martin Preuss
7  email : martin@libchipcard.de
8 
9  ***************************************************************************
10  * Please see toplevel file COPYING for license details *
11  ***************************************************************************/
12 
13 #ifdef HAVE_CONFIG_H
14 # include <config.h>
15 #endif
16 
17 /* Internationalization */
18 #ifdef ENABLE_NLS
19 # include <libintl.h>
20 # include <locale.h>
21 # define I18N(m) dgettext("gwenhywfar", m)
22 # define I18S(m) m
23 #else
24 # define I18N(m) m
25 # define I18S(m) m
26 #endif
27 
28 
29 #include "args.h"
30 #include <gwenhywfar/gwenhywfar.h>
31 #include <gwenhywfar/debug.h>
32 #include <gwenhywfar/logger.h>
33 #include <gwenhywfar/xml.h>
34 #include <gwenhywfar/syncio_file.h>
35 
36 #include <stdlib.h>
37 #include <assert.h>
38 
39 #include <sys/types.h>
40 #include <sys/stat.h>
41 #include <fcntl.h>
42 #include <errno.h>
43 #include <string.h>
44 
45 
47  GWEN_XMLNODE *node)
48 {
49  GWEN_XMLNODE *nsrc, *ndst;
50 
51  assert(top);
52  assert(node);
53 
54  nsrc=GWEN_XMLNode_GetChild(node);
55  while (nsrc) {
58  GWEN_XMLNode_GetData(nsrc));
59  if (ndst) {
60  GWEN_XMLNODE *n;
61 
62  n=GWEN_XMLNode_GetChild(nsrc);
63  while (n) {
64  GWEN_XMLNODE *newNode;
65 
66  DBG_DEBUG(0, "Adding node \"%s\"", GWEN_XMLNode_GetData(n));
67  newNode=GWEN_XMLNode_dup(n);
68  GWEN_XMLNode_AddChild(ndst, newNode);
69  n=GWEN_XMLNode_Next(n);
70  } /* while n */
71  }
72  else {
73  GWEN_XMLNODE *newNode;
74 
75  DBG_DEBUG(0, "Adding branch \"%s\"", GWEN_XMLNode_GetData(nsrc));
76  newNode=GWEN_XMLNode_dup(nsrc);
77  GWEN_XMLNode_AddChild(top, newNode);
78  }
79  } /* if TAG */
80  nsrc=GWEN_XMLNode_Next(nsrc);
81  } /* while */
82 
83  return 0;
84 }
85 
86 
87 
88 int main(int argc, char **argv)
89 {
90  ARGUMENTS *args;
91  int rv;
92  FREEPARAM *inFile;
93  GWEN_XMLNODE *top;
94  GWEN_XMLNODE *comment;
95  GWEN_SYNCIO *sio;
96  GWEN_XML_CONTEXT *ctx;
97  uint32_t flags;
98 
99  rv=GWEN_Init();
100  if (rv) {
101  fprintf(stderr, "Could not initialize Gwenhywfar.\n");
102  return 2;
103  }
104 
105  args=Arguments_new();
106  rv=checkArgs(args, argc, argv);
107  if (rv==-1) {
108  fprintf(stderr, "Parameter error\n");
109  return rv;
110  }
111  else if (rv==-2) {
112  return 0;
113  }
114 
115  GWEN_Logger_Open(0, "xmlmerge",
116  args->logFile,
117  args->logType,
119  GWEN_Logger_SetLevel(0, args->logLevel);
120 
121  inFile=args->params;
122  if (!inFile) {
123  fprintf(stderr, "No input file given.\n");
124  Arguments_free(args);
125  return 1;
126  }
127 
129  /* add comment */
131  "This is an automatically generated file, "
132  "do not edit");
133  GWEN_XMLNode_AddChild(top, comment);
134 
135  /* add header */
136  if (args->header) {
137  GWEN_XMLNODE *header;
138 
140  "?xml");
141  GWEN_XMLNode_SetProperty(header, "version", "1.0");
142  GWEN_XMLNode_SetProperty(header, "encoding", "utf8");
143  GWEN_XMLNode_AddHeader(top, header);
144  }
145 
146  /* read all files */
147  while (inFile) {
148  GWEN_XMLNODE *n;
149 
151  if (GWEN_XML_ReadFile(n, inFile->param,
154  fprintf(stderr, "ERROR: Error reading file \"%s\"\n", inFile->param);
156  GWEN_XMLNode_free(top);
157  return 2;
158  }
159  if (addDefinitions(top, n)) {
160  fprintf(stderr, "ERROR: Error merging file \"%s\"\n",
161  inFile->param);
163  GWEN_XMLNode_free(top);
164  return 3;
165  }
167  inFile=inFile->next;
168  } /* while */
169 
170  /* write file */
171  if (args->compact) {
172  flags=GWEN_XML_FLAGS_SIMPLE;
173  }
174  else {
175  flags=GWEN_XML_FLAGS_INDENT;
176  }
178 
179  ctx=GWEN_XmlCtxStore_new(NULL, flags);
180 
189  rv=GWEN_SyncIo_Connect(sio);
190  if (rv<0) {
191  fprintf(stderr, "Error opening file \"%s\": %s\n",
192  args->outputFile,
193  strerror(errno));
195  GWEN_SyncIo_free(sio);
196  GWEN_XmlCtx_free(ctx);
197  return 5;
198  }
199 
200 
201  rv=GWEN_XMLNode_WriteToStream(top, ctx, sio);
202  if (rv<0) {
203  fprintf(stderr, "Error writing to file \"%s\": %s\n",
204  args->outputFile,
205  strerror(errno));
207  GWEN_SyncIo_free(sio);
208  GWEN_XmlCtx_free(ctx);
209  return 5;
210  }
211 
212  /* close file */
213  rv=GWEN_SyncIo_Disconnect(sio);
214  if (rv<0) {
215  fprintf(stderr, "Error closing output stream (%d)\n", rv);
216  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
217  GWEN_SyncIo_free(sio);
218  GWEN_XmlCtx_free(ctx);
219  return 5;
220  }
221 
222  GWEN_SyncIo_free(sio);
223  GWEN_XmlCtx_free(ctx);
224 
225  GWEN_XMLNode_free(top);
226  Arguments_free(args);
227 
228  return 0;
229 }
230 
231 
232 
233 
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1331
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:117
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition: syncio_file.h:54
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
#define GWEN_XML_FLAGS_SIMPLE
Definition: xml.h:89
void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
Definition: logger.c:627
int checkArgs(ARGUMENTS *args, int argc, char **argv)
const char * outputFile
const char * param
#define NULL
Definition: binreloc.c:300
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:322
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:1297
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWENHYWFAR_API int GWEN_XMLNode_WriteToStream(const GWEN_XMLNODE *n, GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition: xmlrw.c:480
int addDefinitions(GWEN_XMLNODE *top, GWEN_XMLNODE *node)
Definition: xmlmerge/main.c:46
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
Definition: syncio_file.h:62
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition: xml.c:409
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:81
ARGUMENTS * Arguments_new()
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
GWEN_XMLNODE_TYPE GWEN_XMLNode_GetType(const GWEN_XMLNODE *n)
Definition: xml.c:458
GWEN_LOGGER_LOGTYPE logType
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
FREEPARAM * next
GWEN_LOGGER_LEVEL logLevel
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition: xml.c:465
FREEPARAM * params
GWEN_XMLNODE * GWEN_XMLNode_FindNode(const GWEN_XMLNODE *node, GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:543
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
Definition: syncio_file.h:63
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
Definition: xmlctx.c:385
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
int GWEN_Logger_Open(const char *logDomain, const char *ident, const char *file, GWEN_LOGGER_LOGTYPE logtype, GWEN_LOGGER_FACILITY facility)
Definition: logger.c:225
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
int main(int argc, char **argv)
Definition: xmlmerge/main.c:88
GWEN_XMLNODE * GWEN_XMLNode_dup(const GWEN_XMLNODE *n)
Definition: xml.c:187
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define GWEN_XML_FLAGS_INDENT
Definition: xml.h:66
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition: xml.h:94
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
int GWEN_Init(void)
Definition: gwenhywfar.c:92
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition: xmlctx.h:39
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423
void Arguments_free(ARGUMENTS *ar)