gwenhywfar  4.99.8beta
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  GWEN_PARSER_ELEMENT *e;
33  const char *s;
34  int i;
35 
36  e=GWEN_ParserElement_new();
37 
38  s=GWEN_XMLNode_GetProperty(node, "elementType", "element");
39  if (s && *s) {
40  GWEN_PARSER_ELEMENT_TYPE et;
41 
42  et=GWEN_ParserElementType_fromString(s);
43  if (et==GWEN_ParserElementType_Unknown) {
44  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid element type \"%s\"", s);
45  GWEN_ParserElement_free(e);
46  return NULL;
47  }
48  e->elementType=et;
49  }
50 
51  s=GWEN_XMLNode_GetProperty(node, "name", NULL);
52  if (s && *s)
53  GWEN_ParserElement_SetName(e, s);
54 
55  s=GWEN_XMLNode_GetProperty(node, "type", NULL);
56  if (s && *s)
57  GWEN_ParserElement_SetType(e, s);
58 
59  s=GWEN_XMLNode_GetProperty(node, "dbName", NULL);
60  if (s && *s)
61  GWEN_ParserElement_SetDbName(e, s);
62 
63  i=GWEN_XMLNode_GetIntProperty(node, "minOccurs", 1);
64  GWEN_ParserElement_SetMinOccurs(e, i);
65 
66  i=GWEN_XMLNode_GetIntProperty(node, "maxOccurs", 1);
67  GWEN_ParserElement_SetMaxOccurs(e, i);
68 
69  i=GWEN_XMLNode_GetIntProperty(node, "minSize", 0);
70  GWEN_ParserElement_SetMinSize(e, i);
71 
72  i=GWEN_XMLNode_GetIntProperty(node, "maxSize", -1);
73  GWEN_ParserElement_SetMaxSize(e, i);
74 
75  return e;
76 }
77 
78 
79 
80 int GWEN_ParserElement_toXml(const GWEN_PARSER_ELEMENT *e, GWEN_XMLNODE *node) {
81 
82  GWEN_XMLNode_SetProperty(node, "name", GWEN_ParserElementType_toString(e->elementType));
83 
84  if (e->name)
85  GWEN_XMLNode_SetProperty(node, "name", e->name);
86 
87  if (e->type)
88  GWEN_XMLNode_SetProperty(node, "type", e->type);
89 
90  if (e->dbName)
91  GWEN_XMLNode_SetProperty(node, "dbName", e->dbName);
92 
93  GWEN_XMLNode_SetIntProperty(node, "minOccurs", e->minOccurs);
94  GWEN_XMLNode_SetIntProperty(node, "maxOccurs", e->maxOccurs);
95 
96  GWEN_XMLNode_SetIntProperty(node, "minSize", e->minSize);
97  GWEN_XMLNode_SetIntProperty(node, "maxSize", e->maxSize);
98 
99  return 0;
100 }
101 
102 
103 
104 
105 
106 int GWEN_ParserElement_Tree__ReadXml(GWEN_PARSER_ELEMENT_TREE *et, GWEN_PARSER_ELEMENT *eParent, GWEN_XMLNODE *node) {
107  GWEN_PARSER_ELEMENT *e;
108  GWEN_XMLNODE *n;
109 
111  if (e==NULL) {
112  DBG_INFO(GWEN_LOGDOMAIN, "here");
113  return GWEN_ERROR_GENERIC;
114  }
115 
116  DBG_INFO(GWEN_LOGDOMAIN, "Adding element \"%s\" (%s)",
117  (e->name)?(e->name):"-?-",
118  GWEN_ParserElementType_toString(e->elementType));
119 
120  if (eParent)
121  GWEN_ParserElement_Tree_AddChild(eParent, e);
122  else
123  GWEN_ParserElement_Tree_Add(et, e);
124 
125  /* read sub-elements */
126  n=GWEN_XMLNode_FindFirstTag(node, "element", NULL, NULL);
127  while(n) {
128  int rv;
129 
131  if (rv<0) {
132  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
133  return rv;
134  }
135  n=GWEN_XMLNode_FindNextTag(n, "element", NULL, NULL);
136  }
137 
138  return 0;
139 }
140 
141 
142 
143 int GWEN_ParserElement_Tree_ReadXml(GWEN_PARSER_ELEMENT_TREE *et, GWEN_XMLNODE *node) {
144  return GWEN_ParserElement_Tree__ReadXml(et, NULL, node);
145 }
146 
147 
148 
149 
150 
151 int GWEN_ParserElement_Tree_ReadXmlFile(GWEN_PARSER_ELEMENT_TREE *et, const char *fname) {
152  int rv;
153  GWEN_XMLNODE *rootNode;
154  GWEN_XMLNODE *n;
155 
156  rootNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
157  rv=GWEN_XML_ReadFile(rootNode, fname, GWEN_XML_FLAGS_DEFAULT);
158  if (rv<0) {
159  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
160  GWEN_XMLNode_free(rootNode);
161  return rv;
162  }
163 
164  n=GWEN_XMLNode_FindFirstTag(rootNode, "gwen-parser-def", NULL, NULL);
165  if (n) {
166  GWEN_XMLNODE *nn;
167 
168  nn=GWEN_XMLNode_FindFirstTag(n, "element", NULL, NULL);
169  while(nn) {
170  int rv;
171 
173  if (rv<0) {
174  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
175  GWEN_XMLNode_free(rootNode);
176  return rv;
177  }
178 
179  nn=GWEN_XMLNode_FindNextTag(nn, "element", NULL, NULL);
180  }
181  }
182 
183  GWEN_XMLNode_free(rootNode);
184  return 0;
185 }
186 
187 
188 
189 
190 int GWEN_ParserElement_Tree__WriteXml(const GWEN_PARSER_ELEMENT *e, GWEN_XMLNODE *node) {
191  const GWEN_PARSER_ELEMENT *eChild;
192  GWEN_XMLNODE *n;
193  int rv;
194 
196  rv=GWEN_ParserElement_toXml(e, n);
197  if (rv<0) {
198  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
200  return rv;
201  }
202 
203  eChild=GWEN_ParserElement_Tree_GetFirstChild(e);
204  while(eChild) {
205  rv=GWEN_ParserElement_Tree__WriteXml(eChild, n);
206  if (rv<0) {
207  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
209  return rv;
210  }
211  eChild=GWEN_ParserElement_Tree_GetNext(eChild);
212  }
213 
214  GWEN_XMLNode_AddChild(node, n);
215  return 0;
216 }
217 
218 
219 
220 int GWEN_ParserElement_Tree_WriteXml(const GWEN_PARSER_ELEMENT_TREE *et, GWEN_XMLNODE *node) {
221  const GWEN_PARSER_ELEMENT *e;
222  int rv;
223 
224  e=GWEN_ParserElement_Tree_GetFirst(et);
225  while(e) {
227  if (rv<0) {
228  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
229  return rv;
230  }
231  e=GWEN_ParserElement_Tree_GetNext(e);
232  }
233 
234  return 0;
235 }
236 
237 
238 
239 int GWEN_ParserElement_Tree_WriteXmlFile(GWEN_PARSER_ELEMENT_TREE *et, const char *fname) {
240  int rv;
241  GWEN_XMLNODE *rootNode;
242  GWEN_XMLNODE *n;
243 
244  rootNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
245 
246  n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "gwen-parser-def");
247  GWEN_XMLNode_AddChild(rootNode, n);
248 
250  if (rv<0) {
251  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
252  GWEN_XMLNode_free(rootNode);
253  return rv;
254  }
255 
256  rv=GWEN_XMLNode_WriteFile(rootNode, fname, GWEN_XML_FLAGS_DEFAULT);
257  if (rv<0) {
258  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
259  GWEN_XMLNode_free(rootNode);
260  return rv;
261  }
262 
263 
264  GWEN_XMLNode_free(rootNode);
265  return 0;
266 }
267 
268 
269 
270 
271 
272 
273 void GWEN_ParserElement_Dump(const GWEN_PARSER_ELEMENT *e, int indent) {
274  int i;
275 
276  for (i=0; i<indent; i++) fprintf(stderr, " ");
277  fprintf(stderr, "Element \"%s\"\n", GWEN_ParserElementType_toString(e->elementType));
278 
279  for (i=0; i<indent+1; i++) fprintf(stderr, " ");
280  fprintf(stderr, "- Name : \"%s\"\n", (e->name)?(e->name):"-?-");
281 
282  for (i=0; i<indent+1; i++) fprintf(stderr, " ");
283  fprintf(stderr, "- DbName : \"%s\"\n", (e->dbName)?(e->dbName):"-?-");
284 
285  for (i=0; i<indent+1; i++) fprintf(stderr, " ");
286  fprintf(stderr, "- Type : \"%s\"\n", (e->type)?(e->type):"-?-");
287 
288  for (i=0; i<indent+1; i++) fprintf(stderr, " ");
289  fprintf(stderr, "- MinOccurs: %d\n", e->minOccurs);
290 
291  for (i=0; i<indent+1; i++) fprintf(stderr, " ");
292  fprintf(stderr, "- MaxOccurs: %d\n", e->maxOccurs);
293 
294  for (i=0; i<indent+1; i++) fprintf(stderr, " ");
295  fprintf(stderr, "- MinSize : %d\n", e->minSize);
296 
297  for (i=0; i<indent+1; i++) fprintf(stderr, " ");
298  fprintf(stderr, "- MaxSize : %d\n", e->maxSize);
299 
300  for (i=0; i<indent+1; i++) fprintf(stderr, " ");
301  fprintf(stderr, "- Data : \"%s\"\n", (e->data)?(e->data):"-?-");
302 
303 }
304 
305 
306 
307 void GWEN_ParserElement_DumpWithChildren(const GWEN_PARSER_ELEMENT *e, int indent) {
308  const GWEN_PARSER_ELEMENT *eChild;
309 
310  GWEN_ParserElement_Dump(e, indent);
311  eChild=GWEN_ParserElement_Tree_GetFirstChild(e);
312  while(eChild) {
313  GWEN_ParserElement_DumpWithChildren(eChild, indent+2);
314  eChild=GWEN_ParserElement_Tree_GetNext(eChild);
315  }
316 }
317 
318 
319 
320 void GWEN_ParserElement_Tree_Dump(const GWEN_PARSER_ELEMENT_TREE *et, int indent) {
321  const GWEN_PARSER_ELEMENT *e;
322  int i;
323 
324  for (i=0; i<indent; i++) fprintf(stderr, " ");
325  fprintf(stderr, "ParserElement tree:\n");
326 
327  e=GWEN_ParserElement_Tree_GetFirst(et);
328  while(e) {
330  e=GWEN_ParserElement_Tree_GetNext(e);
331  }
332 }
333 
334 
335 
336 
337 
338 
339 
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:228
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:712
int GWEN_ParserElement_Tree_ReadXmlFile(GWEN_PARSER_ELEMENT_TREE *et, const char *fname)
#define NULL
Definition: binreloc.c:290
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
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:137
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:695
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:251
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:309
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:152
void GWEN_XMLNode_SetIntProperty(GWEN_XMLNODE *n, const char *name, int value)
Definition: xml.c:315
#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:164
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:148
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:398