gwenhywfar  4.99.8beta
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  GWEN_XMLNODE *nsrc, *ndst;
49 
50  assert(top);
51  assert(node);
52 
53  nsrc=GWEN_XMLNode_GetChild(node);
54  while(nsrc) {
57  GWEN_XMLNode_GetData(nsrc));
58  if (ndst) {
59  GWEN_XMLNODE *n;
60 
61  n=GWEN_XMLNode_GetChild(nsrc);
62  while (n) {
63  GWEN_XMLNODE *newNode;
64 
65  DBG_DEBUG(0, "Adding node \"%s\"", GWEN_XMLNode_GetData(n));
66  newNode=GWEN_XMLNode_dup(n);
67  GWEN_XMLNode_AddChild(ndst, newNode);
68  n=GWEN_XMLNode_Next(n);
69  } /* while n */
70  }
71  else {
72  GWEN_XMLNODE *newNode;
73 
74  DBG_DEBUG(0, "Adding branch \"%s\"", GWEN_XMLNode_GetData(nsrc));
75  newNode=GWEN_XMLNode_dup(nsrc);
76  GWEN_XMLNode_AddChild(top, newNode);
77  }
78  } /* if TAG */
79  nsrc=GWEN_XMLNode_Next(nsrc);
80  } /* while */
81 
82  return 0;
83 }
84 
85 
86 
87 int main(int argc, char **argv) {
88  ARGUMENTS *args;
89  int rv;
90  FREEPARAM *inFile;
91  GWEN_XMLNODE *top;
92  GWEN_XMLNODE *comment;
93  GWEN_SYNCIO *sio;
94  GWEN_XML_CONTEXT *ctx;
95  uint32_t flags;
96 
97  rv=GWEN_Init();
98  if (rv) {
99  fprintf(stderr, "Could not initialize Gwenhywfar.\n");
100  return 2;
101  }
102 
103  args=Arguments_new();
104  rv=checkArgs(args, argc, argv);
105  if (rv==-1) {
106  fprintf(stderr, "Parameter error\n");
107  return rv;
108  }
109  else if (rv==-2) {
110  return 0;
111  }
112 
113  GWEN_Logger_Open(0, "xmlmerge",
114  args->logFile,
115  args->logType,
117  GWEN_Logger_SetLevel(0, args->logLevel);
118 
119  inFile=args->params;
120  if (!inFile) {
121  fprintf(stderr, "No input file given.\n");
122  Arguments_free(args);
123  return 1;
124  }
125 
127  /* add comment */
129  "This is an automatically generated file, "
130  "do not edit");
131  GWEN_XMLNode_AddChild(top, comment);
132 
133  /* add header */
134  if (args->header) {
135  GWEN_XMLNODE *header;
136 
138  "?xml");
139  GWEN_XMLNode_SetProperty(header, "version", "1.0");
140  GWEN_XMLNode_SetProperty(header, "encoding", "utf8");
141  GWEN_XMLNode_AddHeader(top, header);
142  }
143 
144  /* read all files */
145  while(inFile) {
146  GWEN_XMLNODE *n;
147 
149  if (GWEN_XML_ReadFile(n, inFile->param,
152  fprintf(stderr, "ERROR: Error reading file \"%s\"\n", inFile->param);
154  GWEN_XMLNode_free(top);
155  return 2;
156  }
157  if (addDefinitions(top, n)) {
158  fprintf(stderr, "ERROR: Error merging file \"%s\"\n",
159  inFile->param);
161  GWEN_XMLNode_free(top);
162  return 3;
163  }
165  inFile=inFile->next;
166  } /* while */
167 
168  /* write file */
169  if (args->compact) {
170  flags=GWEN_XML_FLAGS_SIMPLE;
171  }
172  else {
173  flags=GWEN_XML_FLAGS_INDENT;
174  }
176 
177  ctx=GWEN_XmlCtxStore_new(NULL, flags);
178 
187  rv=GWEN_SyncIo_Connect(sio);
188  if (rv<0) {
189  fprintf(stderr, "Error opening file \"%s\": %s\n",
190  args->outputFile,
191  strerror(errno));
193  GWEN_SyncIo_free(sio);
194  GWEN_XmlCtx_free(ctx);
195  return 5;
196  }
197 
198 
199  rv=GWEN_XMLNode_WriteToStream(top, ctx, sio);
200  if (rv<0) {
201  fprintf(stderr, "Error writing to file \"%s\": %s\n",
202  args->outputFile,
203  strerror(errno));
205  GWEN_SyncIo_free(sio);
206  GWEN_XmlCtx_free(ctx);
207  return 5;
208  }
209 
210  /* close file */
211  rv=GWEN_SyncIo_Disconnect(sio);
212  if (rv<0) {
213  fprintf(stderr, "Error closing output stream (%d)\n", rv);
214  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
215  GWEN_SyncIo_free(sio);
216  GWEN_XmlCtx_free(ctx);
217  return 5;
218  }
219 
220  GWEN_SyncIo_free(sio);
221  GWEN_XmlCtx_free(ctx);
222 
223  GWEN_XMLNode_free(top);
224  Arguments_free(args);
225 
226  return 0;
227 }
228 
229 
230 
231 
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:94
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1230
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:110
#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:604
int checkArgs(ARGUMENTS *args, int argc, char **argv)
const char * outputFile
const char * param
#define NULL
Definition: binreloc.c:290
#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:308
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:973
#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:220
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:137
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
Definition: syncio_file.h:62
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition: xml.c:386
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:66
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:431
GWEN_LOGGER_LOGTYPE logType
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:192
FREEPARAM * next
GWEN_LOGGER_LEVEL logLevel
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition: xml.c:437
FREEPARAM * params
GWEN_XMLNODE * GWEN_XMLNode_FindNode(const GWEN_XMLNODE *node, GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:513
#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:318
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:152
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
int GWEN_Logger_Open(const char *logDomain, const char *ident, const char *file, GWEN_LOGGER_LOGTYPE logtype, GWEN_LOGGER_FACILITY facility)
Definition: logger.c:212
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:351
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:105
int main(int argc, char **argv)
Definition: xmlmerge/main.c:87
GWEN_XMLNODE * GWEN_XMLNode_dup(const GWEN_XMLNODE *n)
Definition: xml.c:177
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
#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:148
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition: xmlctx.h:39
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:398
void Arguments_free(ARGUMENTS *ar)