gwenhywfar  5.3.0
gwen_parser_element_fns.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Fri Apr 18 2014
3  copyright : (C) 2014 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU Lesser General Public *
10  * License as published by the Free Software Foundation; either *
11  * version 2.1 of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * Lesser General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU Lesser General Public *
19  * License along with this library; if not, write to the Free Software *
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21  * MA 02111-1307 USA *
22  * *
23  ***************************************************************************/
24 
25 
27 
28 
29 
30 
31 GWEN_PARSER_ELEMENT *GWEN_ParserElement_fromXml(GWEN_XMLNODE *node)
32 {
33  GWEN_PARSER_ELEMENT *e;
34  const char *s;
35  int i;
36 
37  e=GWEN_ParserElement_new();
38 
39  s=GWEN_XMLNode_GetProperty(node, "elementType", "element");
40  if (s && *s) {
41  GWEN_PARSER_ELEMENT_TYPE et;
42 
43  et=GWEN_ParserElementType_fromString(s);
44  if (et==GWEN_ParserElementType_Unknown) {
45  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid element type \"%s\"", s);
46  GWEN_ParserElement_free(e);
47  return NULL;
48  }
49  e->elementType=et;
50  }
51 
52  s=GWEN_XMLNode_GetProperty(node, "name", NULL);
53  if (s && *s)
54  GWEN_ParserElement_SetName(e, s);
55 
56  s=GWEN_XMLNode_GetProperty(node, "type", NULL);
57  if (s && *s)
58  GWEN_ParserElement_SetType(e, s);
59 
60  s=GWEN_XMLNode_GetProperty(node, "dbName", NULL);
61  if (s && *s)
62  GWEN_ParserElement_SetDbName(e, s);
63 
64  i=GWEN_XMLNode_GetIntProperty(node, "minOccurs", 1);
65  GWEN_ParserElement_SetMinOccurs(e, i);
66 
67  i=GWEN_XMLNode_GetIntProperty(node, "maxOccurs", 1);
68  GWEN_ParserElement_SetMaxOccurs(e, i);
69 
70  i=GWEN_XMLNode_GetIntProperty(node, "minSize", 0);
71  GWEN_ParserElement_SetMinSize(e, i);
72 
73  i=GWEN_XMLNode_GetIntProperty(node, "maxSize", -1);
74  GWEN_ParserElement_SetMaxSize(e, i);
75 
76  return e;
77 }
78 
79 
80 
81 int GWEN_ParserElement_toXml(const GWEN_PARSER_ELEMENT *e, GWEN_XMLNODE *node)
82 {
83 
84  GWEN_XMLNode_SetProperty(node, "name", GWEN_ParserElementType_toString(e->elementType));
85 
86  if (e->name)
87  GWEN_XMLNode_SetProperty(node, "name", e->name);
88 
89  if (e->type)
90  GWEN_XMLNode_SetProperty(node, "type", e->type);
91 
92  if (e->dbName)
93  GWEN_XMLNode_SetProperty(node, "dbName", e->dbName);
94 
95  GWEN_XMLNode_SetIntProperty(node, "minOccurs", e->minOccurs);
96  GWEN_XMLNode_SetIntProperty(node, "maxOccurs", e->maxOccurs);
97 
98  GWEN_XMLNode_SetIntProperty(node, "minSize", e->minSize);
99  GWEN_XMLNode_SetIntProperty(node, "maxSize", e->maxSize);
100 
101  return 0;
102 }
103 
104 
105 
106 
107 
108 int GWEN_ParserElement_Tree__ReadXml(GWEN_PARSER_ELEMENT_TREE *et, GWEN_PARSER_ELEMENT *eParent, GWEN_XMLNODE *node)
109 {
110  GWEN_PARSER_ELEMENT *e;
111  GWEN_XMLNODE *n;
112 
114  if (e==NULL) {
115  DBG_INFO(GWEN_LOGDOMAIN, "here");
116  return GWEN_ERROR_GENERIC;
117  }
118 
119  DBG_INFO(GWEN_LOGDOMAIN, "Adding element \"%s\" (%s)",
120  (e->name)?(e->name):"-?-",
121  GWEN_ParserElementType_toString(e->elementType));
122 
123  if (eParent)
124  GWEN_ParserElement_Tree_AddChild(eParent, e);
125  else
126  GWEN_ParserElement_Tree_Add(et, e);
127 
128  /* read sub-elements */
129  n=GWEN_XMLNode_FindFirstTag(node, "element", NULL, NULL);
130  while (n) {
131  int rv;
132 
134  if (rv<0) {
135  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
136  return rv;
137  }
138  n=GWEN_XMLNode_FindNextTag(n, "element", NULL, NULL);
139  }
140 
141  return 0;
142 }
143 
144 
145 
146 int GWEN_ParserElement_Tree_ReadXml(GWEN_PARSER_ELEMENT_TREE *et, GWEN_XMLNODE *node)
147 {
148  return GWEN_ParserElement_Tree__ReadXml(et, NULL, node);
149 }
150 
151 
152 
153 
154 
155 int GWEN_ParserElement_Tree_ReadXmlFile(GWEN_PARSER_ELEMENT_TREE *et, const char *fname)
156 {
157  int rv;
158  GWEN_XMLNODE *rootNode;
159  GWEN_XMLNODE *n;
160 
161  rootNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
162  rv=GWEN_XML_ReadFile(rootNode, fname, GWEN_XML_FLAGS_DEFAULT);
163  if (rv<0) {
164  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
165  GWEN_XMLNode_free(rootNode);
166  return rv;
167  }
168 
169  n=GWEN_XMLNode_FindFirstTag(rootNode, "gwen-parser-def", NULL, NULL);
170  if (n) {
171  GWEN_XMLNODE *nn;
172 
173  nn=GWEN_XMLNode_FindFirstTag(n, "element", NULL, NULL);
174  while (nn) {
175  int rv;
176 
178  if (rv<0) {
179  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
180  GWEN_XMLNode_free(rootNode);
181  return rv;
182  }
183 
184  nn=GWEN_XMLNode_FindNextTag(nn, "element", NULL, NULL);
185  }
186  }
187 
188  GWEN_XMLNode_free(rootNode);
189  return 0;
190 }
191 
192 
193 
194 
195 int GWEN_ParserElement_Tree__WriteXml(const GWEN_PARSER_ELEMENT *e, GWEN_XMLNODE *node)
196 {
197  const GWEN_PARSER_ELEMENT *eChild;
198  GWEN_XMLNODE *n;
199  int rv;
200 
202  rv=GWEN_ParserElement_toXml(e, n);
203  if (rv<0) {
204  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
206  return rv;
207  }
208 
209  eChild=GWEN_ParserElement_Tree_GetFirstChild(e);
210  while (eChild) {
211  rv=GWEN_ParserElement_Tree__WriteXml(eChild, n);
212  if (rv<0) {
213  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
215  return rv;
216  }
217  eChild=GWEN_ParserElement_Tree_GetNext(eChild);
218  }
219 
220  GWEN_XMLNode_AddChild(node, n);
221  return 0;
222 }
223 
224 
225 
226 int GWEN_ParserElement_Tree_WriteXml(const GWEN_PARSER_ELEMENT_TREE *et, GWEN_XMLNODE *node)
227 {
228  const GWEN_PARSER_ELEMENT *e;
229  int rv;
230 
231  e=GWEN_ParserElement_Tree_GetFirst(et);
232  while (e) {
234  if (rv<0) {
235  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
236  return rv;
237  }
238  e=GWEN_ParserElement_Tree_GetNext(e);
239  }
240 
241  return 0;
242 }
243 
244 
245 
246 int GWEN_ParserElement_Tree_WriteXmlFile(GWEN_PARSER_ELEMENT_TREE *et, const char *fname)
247 {
248  int rv;
249  GWEN_XMLNODE *rootNode;
250  GWEN_XMLNODE *n;
251 
252  rootNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
253 
254  n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "gwen-parser-def");
255  GWEN_XMLNode_AddChild(rootNode, n);
256 
258  if (rv<0) {
259  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
260  GWEN_XMLNode_free(rootNode);
261  return rv;
262  }
263 
264  rv=GWEN_XMLNode_WriteFile(rootNode, fname, GWEN_XML_FLAGS_DEFAULT);
265  if (rv<0) {
266  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
267  GWEN_XMLNode_free(rootNode);
268  return rv;
269  }
270 
271 
272  GWEN_XMLNode_free(rootNode);
273  return 0;
274 }
275 
276 
277 
278 
279 
280 
281 void GWEN_ParserElement_Dump(const GWEN_PARSER_ELEMENT *e, int indent)
282 {
283  int i;
284 
285  for (i=0; i<indent; i++)
286  fprintf(stderr, " ");
287  fprintf(stderr, "Element \"%s\"\n", GWEN_ParserElementType_toString(e->elementType));
288 
289  for (i=0; i<indent+1; i++)
290  fprintf(stderr, " ");
291  fprintf(stderr, "- Name : \"%s\"\n", (e->name)?(e->name):"-?-");
292 
293  for (i=0; i<indent+1; i++)
294  fprintf(stderr, " ");
295  fprintf(stderr, "- DbName : \"%s\"\n", (e->dbName)?(e->dbName):"-?-");
296 
297  for (i=0; i<indent+1; i++)
298  fprintf(stderr, " ");
299  fprintf(stderr, "- Type : \"%s\"\n", (e->type)?(e->type):"-?-");
300 
301  for (i=0; i<indent+1; i++)
302  fprintf(stderr, " ");
303  fprintf(stderr, "- MinOccurs: %d\n", e->minOccurs);
304 
305  for (i=0; i<indent+1; i++)
306  fprintf(stderr, " ");
307  fprintf(stderr, "- MaxOccurs: %d\n", e->maxOccurs);
308 
309  for (i=0; i<indent+1; i++)
310  fprintf(stderr, " ");
311  fprintf(stderr, "- MinSize : %d\n", e->minSize);
312 
313  for (i=0; i<indent+1; i++)
314  fprintf(stderr, " ");
315  fprintf(stderr, "- MaxSize : %d\n", e->maxSize);
316 
317  for (i=0; i<indent+1; i++)
318  fprintf(stderr, " ");
319  fprintf(stderr, "- Data : \"%s\"\n", (e->data)?(e->data):"-?-");
320 
321 }
322 
323 
324 
325 void GWEN_ParserElement_DumpWithChildren(const GWEN_PARSER_ELEMENT *e, int indent)
326 {
327  const GWEN_PARSER_ELEMENT *eChild;
328 
329  GWEN_ParserElement_Dump(e, indent);
330  eChild=GWEN_ParserElement_Tree_GetFirstChild(e);
331  while (eChild) {
332  GWEN_ParserElement_DumpWithChildren(eChild, indent+2);
333  eChild=GWEN_ParserElement_Tree_GetNext(eChild);
334  }
335 }
336 
337 
338 
339 void GWEN_ParserElement_Tree_Dump(const GWEN_PARSER_ELEMENT_TREE *et, int indent)
340 {
341  const GWEN_PARSER_ELEMENT *e;
342  int i;
343 
344  for (i=0; i<indent; i++)
345  fprintf(stderr, " ");
346  fprintf(stderr, "ParserElement tree:\n");
347 
348  e=GWEN_ParserElement_Tree_GetFirst(et);
349  while (e) {
351  e=GWEN_ParserElement_Tree_GetNext(e);
352  }
353 }
354 
355 
356 
357 
358 
359 
360 
int GWEN_ParserElement_Tree_WriteXmlFile(GWEN_PARSER_ELEMENT_TREE *et, const char *fname)
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:110
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:754
int GWEN_ParserElement_Tree_ReadXmlFile(GWEN_PARSER_ELEMENT_TREE *et, const char *fname)
#define NULL
Definition: binreloc.c:300
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
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:736
int GWEN_ParserElement_Tree__ReadXml(GWEN_PARSER_ELEMENT_TREE *et, GWEN_PARSER_ELEMENT *eParent, GWEN_XMLNODE *node)
void GWEN_ParserElement_Dump(const GWEN_PARSER_ELEMENT *e, int indent)
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
Definition: xml.c:263
void GWEN_ParserElement_DumpWithChildren(const GWEN_PARSER_ELEMENT *e, int indent)
int GWEN_ParserElement_toXml(const GWEN_PARSER_ELEMENT *e, GWEN_XMLNODE *node)
#define GWEN_ERROR_GENERIC
Definition: error.h:62
GWENHYWFAR_API int GWEN_XMLNode_WriteFile(const GWEN_XMLNODE *n, const char *fname, uint32_t flags)
Definition: xmlrw.c:583
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
void GWEN_XMLNode_SetIntProperty(GWEN_XMLNODE *n, const char *name, int value)
Definition: xml.c:330
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
int GWEN_ParserElement_Tree__WriteXml(const GWEN_PARSER_ELEMENT *e, GWEN_XMLNODE *node)
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:178
int GWEN_ParserElement_Tree_WriteXml(const GWEN_PARSER_ELEMENT_TREE *et, GWEN_XMLNODE *node)
int GWEN_ParserElement_Tree_ReadXml(GWEN_PARSER_ELEMENT_TREE *et, GWEN_XMLNODE *node)
GWEN_PARSER_ELEMENT * GWEN_ParserElement_fromXml(GWEN_XMLNODE *node)
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:149
void GWEN_ParserElement_Tree_Dump(const GWEN_PARSER_ELEMENT_TREE *et, int indent)
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423