gwenhywfar 5.12.0
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) {
59 if (ndst) {
60 GWEN_XMLNODE *n;
61
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);
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
88int 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;
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,
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);
157 return 2;
158 }
159 if (addDefinitions(top, n)) {
160 fprintf(stderr, "ERROR: Error merging file \"%s\"\n",
161 inFile->param);
164 return 3;
165 }
167 inFile=inFile->next;
168 } /* while */
169
170 /* write file */
171 if (args->compact) {
173 }
174 else {
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 */
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
226 Arguments_free(args);
227
228 return 0;
229}
230
231
232
233
#define NULL
Definition binreloc.c:300
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_DEBUG(dbg_logger, format,...)
Definition debug.h:214
int GWEN_Init(void)
Definition gwenhywfar.c:92
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
void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
Definition logger.c:627
#define GWEN_LOGDOMAIN
Definition logger.h:35
@ GWEN_LoggerFacility_User
Definition logger.h:58
const char * outputFile
GWEN_LOGGER_LEVEL logLevel
GWEN_LOGGER_LOGTYPE logType
FREEPARAM * params
const char * param
FREEPARAM * next
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition syncio.c:97
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition syncio.c:179
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition syncio.c:78
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition syncio.c:109
struct GWEN_SYNCIO GWEN_SYNCIO
Definition syncio.h:40
@ GWEN_SyncIo_File_CreationMode_CreateAlways
Definition syncio_file.h:40
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
Definition syncio_file.h:63
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition syncio_file.h:59
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition syncio_file.h:53
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition syncio_file.h:58
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
Definition syncio_file.h:62
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition syncio_file.h:54
ARGUMENTS * Arguments_new()
void Arguments_free(ARGUMENTS *ar)
int checkArgs(ARGUMENTS *args, int argc, char **argv)
struct _S_PARAM FREEPARAM
struct _S_ARGS ARGUMENTS
GWEN_XMLNODE * GWEN_XMLNode_dup(const GWEN_XMLNODE *n)
Definition xml.c:187
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition xml.c:1331
GWEN_XMLNODE_TYPE GWEN_XMLNode_GetType(const GWEN_XMLNODE *n)
Definition xml.c:458
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition xml.c:322
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition xml.c:144
GWEN_XMLNODE * GWEN_XMLNode_FindNode(const GWEN_XMLNODE *node, GWEN_XMLNODE_TYPE t, const char *data)
Definition xml.c:543
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition xml.c:465
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition xml.c:423
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition xml.c:160
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition xml.c:370
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition xml.c:409
#define GWEN_XML_FLAGS_INDENT
Definition xml.h:66
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition xml.h:94
struct GWEN__XMLNODE GWEN_XMLNODE
Definition xml.h:156
#define GWEN_XML_FLAGS_DEFAULT
Definition xml.h:117
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition xmlrw.c:1298
GWENHYWFAR_API int GWEN_XMLNode_WriteToStream(const GWEN_XMLNODE *n, GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition xmlrw.c:481
@ GWEN_XMLNodeTypeComment
Definition xml.h:149
@ GWEN_XMLNodeTypeTag
Definition xml.h:145
#define GWEN_XML_FLAGS_SIMPLE
Definition xml.h:89
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition xmlctx.c:81
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
Definition xmlctx.c:385
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition xmlctx.h:39
int main(int argc, char **argv)
int addDefinitions(GWEN_XMLNODE *top, GWEN_XMLNODE *node)