gwenhywfar  4.99.8beta
xml.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Sat Jun 28 2003
3  copyright : (C) 2003-2010 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 #ifdef HAVE_CONFIG_H
26 # include <config.h>
27 #endif
28 
29 #define DISABLE_DEBUGLOG
30 
31 #include "xml_p.h"
32 #include "xmlctx_l.h"
33 #include "i18n_l.h"
34 
35 #include <gwenhywfar/debug.h>
36 #include <gwenhywfar/misc.h>
37 #include <gwenhywfar/text.h>
38 #include <gwenhywfar/path.h>
39 #include <gwenhywfar/fastbuffer.h>
40 #include <gwenhywfar/syncio_file.h>
41 #include <gwenhywfar/syncio_memory.h>
42 
43 #include <stdlib.h>
44 #include <assert.h>
45 #include <string.h>
46 #include <ctype.h>
47 #include <sys/types.h>
48 #ifdef HAVE_SYS_STAT_H
49 # include <sys/stat.h>
50 #endif
51 #ifdef HAVE_FCNTL_H
52 # include <fcntl.h>
53 #endif
54 #include <errno.h>
55 #ifdef HAVE_UNISTD_H
56 # include <unistd.h>
57 #endif
58 
59 
60 #define GWEN_XML_BUFFERSIZE 512
61 
62 
63 
64 GWEN_LIST_FUNCTIONS(GWEN_XMLNODE, GWEN_XMLNode)
66 
67 GWEN_LIST_FUNCTIONS(GWEN_XMLNODE_NAMESPACE, GWEN_XMLNode_NameSpace)
68 
69 
70 
71 
72 GWEN_XMLPROPERTY *GWEN_XMLProperty_new(const char *name, const char *value) {
74 
76  if (name)
77  p->name=GWEN_Memory_strdup(name);
78  if (value)
79  p->value=GWEN_Memory_strdup(value);
80  return p;
81 }
82 
83 
84 
86  if (p) {
87  GWEN_Memory_dealloc(p->name);
88  GWEN_Memory_dealloc(p->value);
89  GWEN_Memory_dealloc(p->nameSpace);
91  }
92 }
93 
94 
95 
97  GWEN_XMLPROPERTY *pp;
98 
99  pp=GWEN_XMLProperty_new(p->name, p->value);
100  if (p->nameSpace)
101  pp->nameSpace=strdup(p->nameSpace);
102 
103  return pp;
104 }
105 
106 
107 
110 }
111 
112 
113 
116 }
117 
118 
121 }
122 
123 
125  while(p) {
126  GWEN_XMLPROPERTY *next;
127 
128  next=p->next;
130  p=next;
131  } /* while */
132 }
133 
134 
135 
136 
138  GWEN_XMLNODE *n;
139 
142  n->type=t;
143  n->children=GWEN_XMLNode_List_new();
144  n->headers=GWEN_XMLNode_List_new();
145  if (data)
146  n->data=GWEN_Memory_strdup(data);
147  n->nameSpaces=GWEN_XMLNode_NameSpace_List_new();
148  return n;
149 }
150 
151 
153  if (n) {
155  GWEN_XMLProperty_freeAll(n->properties);
156  GWEN_Memory_dealloc(n->nameSpace);
157  GWEN_Memory_dealloc(n->data);
158  GWEN_XMLNode_List_free(n->headers);
159  GWEN_XMLNode_List_free(n->children);
160  GWEN_XMLNode_NameSpace_List_free(n->nameSpaces);
161  GWEN_FREE_OBJECT(n);
162  }
163 }
164 
165 
167  while(n) {
168  GWEN_XMLNODE *next;
169 
170  next=GWEN_XMLNode_List_Next(n);
172  n=next;
173  } /* while */
174 }
175 
176 
178  GWEN_XMLNODE *nn, *cn, *ncn;
179  const GWEN_XMLPROPERTY *p;
180  const GWEN_XMLNODE_NAMESPACE *nns;
181 
182  /* duplicate node itself */
183  nn=GWEN_XMLNode_new(n->type, n->data);
184  if (n->nameSpace)
185  nn->nameSpace=strdup(n->nameSpace);
186 
187  /* duplicate properties */
188  p=n->properties;
189  while(p) {
190  GWEN_XMLPROPERTY *np;
191 
192  np=GWEN_XMLProperty_dup(p);
193  GWEN_XMLProperty_add(np, &(nn->properties));
194  p=p->next;
195  } /* while */
196 
197  /* duplicate children */
198  cn=GWEN_XMLNode_List_First(n->children);
199  while(cn) {
200  ncn=GWEN_XMLNode_dup(cn);
201  GWEN_XMLNode_AddChild(nn, ncn);
202  cn=GWEN_XMLNode_Next(cn);
203  } /* while */
204 
205  /* duplicate headers */
206  cn=GWEN_XMLNode_List_First(n->headers);
207  while(cn) {
208  ncn=GWEN_XMLNode_dup(cn);
209  GWEN_XMLNode_AddHeader(nn, ncn);
210  cn=GWEN_XMLNode_Next(cn);
211  } /* while */
212 
213  /* duplicate namespaces */
214  nns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
215  while(nns) {
217 
218  nnns=GWEN_XMLNode_NameSpace_dup(nns);
219  GWEN_XMLNode_NameSpace_List_Add(nnns, nn->nameSpaces);
221  }
222 
223  return nn;
224 }
225 
226 
227 
228 const char *GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name,
229  const char *defaultValue) {
230  GWEN_XMLPROPERTY *p;
231 
232  assert(n);
233  assert(name);
234  p=n->properties;
235  while(p) {
236  assert(p->name);
237  if (strcasecmp(p->name, name)==0)
238  break;
239  p=p->next;
240  } /* while */
241 
242  if (p) {
243  if (p->value)
244  return p->value;
245  }
246  return defaultValue;
247 }
248 
249 
250 
251 int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name,
252  int defaultValue) {
253  GWEN_XMLPROPERTY *p;
254 
255  assert(n);
256  assert(name);
257  p=n->properties;
258  while(p) {
259  assert(p->name);
260  if (strcasecmp(p->name, name)==0)
261  break;
262  p=p->next;
263  } /* while */
264 
265  if (p) {
266  if (p->value) {
267  int i;
268 
269  if (1==sscanf(p->value, "%i", &i))
270  return i;
271  }
272  }
273  return defaultValue;
274 }
275 
276 
278  const char *name, const char *value,
279  int doInsert) {
280  GWEN_XMLPROPERTY *p;
281 
282  p=n->properties;
283  while(p) {
284  assert(p->name);
285  if (strcasecmp(p->name, name)==0)
286  break;
287  p=p->next;
288  } /* while */
289 
290  if (p) {
291  GWEN_Memory_dealloc(p->value);
292  if (value)
293  p->value=GWEN_Memory_strdup(value);
294  else
295  p->value=0;
296  }
297  else {
298  p=GWEN_XMLProperty_new(name, value);
299  if (doInsert)
300  GWEN_XMLProperty_insert(p, &(n->properties));
301  else
302  GWEN_XMLProperty_add(p, &(n->properties));
303  }
304 }
305 
306 
307 
309  const char *name, const char *value) {
310  GWEN_XMLNode__SetProperty(n, name, value, 0);
311 }
312 
313 
314 
316  const char *name, int value) {
317  char numbuf[256];
318 
319  snprintf(numbuf, sizeof(numbuf)-1, "%i", value);
320  numbuf[sizeof(numbuf)-1]=0;
321  GWEN_XMLNode__SetProperty(n, name, numbuf, 0);
322 }
323 
324 
325 
327  assert(n);
328  n->usage++;
329 }
330 
331 
332 
334  assert(n);
335  if (n->usage==0) {
336  DBG_WARN(GWEN_LOGDOMAIN, "Node usage already is zero");
337  }
338  else
339  n->usage--;
340 }
341 
342 
343 
345  assert(n);
346  return n->usage;
347 }
348 
349 
350 
351 const char *GWEN_XMLNode_GetData(const GWEN_XMLNODE *n) {
352  assert(n);
353  return n->data;
354 }
355 
356 
357 void GWEN_XMLNode_SetData(GWEN_XMLNODE *n, const char *data) {
358  assert(n);
359  GWEN_Memory_dealloc(n->data);
360  if (data)
361  n->data=GWEN_Memory_strdup(data);
362  else
363  n->data=0;
364 }
365 
366 
367 
369  assert(n);
370  return n->nameSpace;
371 }
372 
373 
374 
375 void GWEN_XMLNode_SetNamespace(GWEN_XMLNODE *n, const char *s) {
376  assert(n);
377  GWEN_Memory_dealloc(n->nameSpace);
378  if (s)
379  n->nameSpace=GWEN_Memory_strdup(s);
380  else
381  n->nameSpace=NULL;
382 }
383 
384 
385 
387  assert(n);
388  return GWEN_XMLNode_List_First(n->children);
389 }
390 
391 
393  assert(n);
394  return n->parent;
395 }
396 
397 
399  assert(n);
400  GWEN_XMLNode_List_Add(child, n->children);
401  child->parent=n;
402 }
403 
404 
405 
407  int copythem) {
408  GWEN_XMLNODE *ch;
409 
410  assert(n);
411  assert(nn);
412 
413  ch=GWEN_XMLNode_GetChild(nn);
414  while(ch) {
415  GWEN_XMLNODE *nc;
416 
417  nc=GWEN_XMLNode_Next(ch);
418  if (!copythem) {
419  GWEN_XMLNode_UnlinkChild(nn, ch);
420  GWEN_XMLNode_AddChild(n, ch);
421  }
422  else {
424  }
425  ch=nc;
426  } /* while */
427 }
428 
429 
430 
432  assert(n);
433  return n->type;
434 }
435 
436 
438  assert(n);
439  return GWEN_XMLNode_List_Next(n);
440 }
441 
442 
443 void GWEN_XMLNode_Dump(const GWEN_XMLNODE *n, int ind) {
444  GWEN_XMLPROPERTY *p;
445  GWEN_XMLNODE *c;
446  int i;
447  int simpleTag;
448 
449  assert(n);
450 
451  for(i=0; i<ind; i++)
452  fprintf(stderr, " ");
453 
454  simpleTag=0;
455  if (n->type==GWEN_XMLNodeTypeTag) {
456  if (n->data)
457  fprintf(stderr, "<%s", n->data);
458  else
459  fprintf(stderr, "<UNKNOWN");
460  p=n->properties;
461  while (p) {
462  if (p->value)
463  fprintf(stderr, " %s=\"%s\"", p->name, p->value);
464  else
465  fprintf(stderr, " %s", p->name);
466  p=p->next;
467  }
468 
469  if (n->data) {
470  if (n->data[0]=='?') {
471  simpleTag=1;
472  fprintf(stderr, "?");
473  }
474  else if (n->data[0]=='!') {
475  simpleTag=1;
476  }
477  }
478 
479  fprintf(stderr, ">\n");
480  if (!simpleTag) {
482  while(c) {
483  GWEN_XMLNode_Dump(c, ind+2);
484  c=GWEN_XMLNode_Next(c);
485  }
486  for(i=0; i<ind; i++)
487  fprintf(stderr, " ");
488  if (n->data)
489  fprintf(stderr, "</%s>\n", n->data);
490  else
491  fprintf(stderr, "</UNKNOWN>\n");
492  }
493  }
494  else if (n->type==GWEN_XMLNodeTypeData) {
495  if (n->data) {
496  fprintf(stderr, "%s\n", n->data);
497  }
498  }
499  else if (n->type==GWEN_XMLNodeTypeComment) {
500  fprintf(stderr, "<!--");
501  if (n->data) {
502  fprintf(stderr, "%s", n->data);
503  }
504  fprintf(stderr, "-->\n");
505  }
506  else {
507  DBG_ERROR(GWEN_LOGDOMAIN, "Unknown tag type (%d)", n->type);
508  }
509 }
510 
511 
512 
514  GWEN_XMLNODE_TYPE t, const char *data) {
515  GWEN_XMLNODE *n;
516 
517  assert(node);
518  assert(data);
519 
520  n=GWEN_XMLNode_GetChild(node);
521  while(n) {
522  if (n->type==t)
523  if (n->data)
524  if (strcasecmp(n->data, data)==0)
525  break;
526  n=GWEN_XMLNode_Next(n);
527  } /* while */
528 
529  if (!n) {
530  DBG_DEBUG(GWEN_LOGDOMAIN, "Node %d:\"%s\" not found", t, data);
531  return 0;
532  }
533 
534  return n;
535 }
536 
537 
538 
540  assert(n);
541  assert(child);
542  GWEN_XMLNode_List_Del(child);
543  child->parent=0;
544 }
545 
546 
547 
549  assert(n);
550  GWEN_XMLNode_List_Clear(n->children);
551 }
552 
553 
554 
556  const GWEN_XMLNODE *sn,
557  int overwrite) {
558  const GWEN_XMLPROPERTY *sp;
559  GWEN_XMLPROPERTY *tp;
560 
561  assert(tn);
562  assert(sn);
563 
564  sp=sn->properties;
565  while(sp) {
566  GWEN_XMLPROPERTY *np;
567 
568  assert(sp->name);
569  tp=tn->properties;
570  /* lookup property in target */
571  while(tp) {
572 
573  assert(tp->name);
574  if (strcasecmp(tp->name, sp->name)==0) {
575  /* property already exists */
576  if (overwrite) {
577  /* overwrite old property */
578  GWEN_Memory_dealloc(tp->value);
579  tp->value=0;
580  if (sp->value)
581  tp->value=GWEN_Memory_strdup(sp->value);
582  }
583  break;
584  }
585  tp=tp->next;
586  } /* while */
587 
588  if (!tp) {
589  /* property not found, simply copy and add it */
590  np=GWEN_XMLProperty_dup(sp);
591  GWEN_XMLProperty_add(np, &(tn->properties));
592  }
593 
594  sp=sp->next;
595  } /* while */
596 }
597 
598 
599 
601  GWEN_XMLNODE_TYPE t) {
602  GWEN_XMLNODE *nn;
603 
604  assert(n);
605  nn=GWEN_XMLNode_GetChild(n);
606  while(nn) {
607  if (nn->type==t)
608  return nn;
609  nn=GWEN_XMLNode_Next(nn);
610  } /* while */
611  return 0;
612 }
613 
614 
615 
617  GWEN_XMLNODE_TYPE t) {
618  assert(n);
619  while(n) {
620  if (n->type==t)
621  return (GWEN_XMLNODE *)n;
622  n=GWEN_XMLNode_Next(n);
623  } /* while */
624  return 0;
625 }
626 
627 
628 
631 }
632 
633 
634 
636  GWEN_XMLNODE *next;
637 
638  next=GWEN_XMLNode_Next(n);
639  if (!next)
640  return 0;
642 }
643 
644 
645 
648 }
649 
650 
651 
653  GWEN_XMLNODE *next;
654 
655  next=GWEN_XMLNode_Next(n);
656  if (!next)
657  return 0;
659 }
660 
661 
662 
664  const char *tname,
665  const char *pname,
666  const char *pvalue) {
667  while(n) {
668  if (-1!=GWEN_Text_ComparePattern(n->data, tname, 0)) {
669  if (pname) {
670  const char *p;
671 
672  p=GWEN_XMLNode_GetProperty(n, pname, 0);
673  if (p) {
674  if (!pvalue)
675  return (GWEN_XMLNODE*)n;
676  if (-1!=GWEN_Text_ComparePattern(pvalue, p, 0))
677  return (GWEN_XMLNODE*)n;
678  }
679  else {
680  /* return this node if pvalue is 0 an the property does not exist */
681  if (!pvalue)
682  return (GWEN_XMLNODE*)n;
683  }
684  } /* if pname */
685  else
686  return (GWEN_XMLNODE*)n;
687  }
689  } /* while */
690  return 0;
691 }
692 
693 
694 
696  const char *tname,
697  const char *pname,
698  const char *pvalue) {
699  GWEN_XMLNODE *nn;
700 
702  if (!nn)
703  return 0;
704  return GWEN_XMLNode_FindTag(nn,
705  tname,
706  pname,
707  pvalue);
708 }
709 
710 
711 
713  const char *tname,
714  const char *pname,
715  const char *pvalue) {
716  GWEN_XMLNODE *nn;
717 
719  if (!nn)
720  return 0;
721  return GWEN_XMLNode_FindTag(nn,
722  tname,
723  pname,
724  pvalue);
725 }
726 
727 
728 
730  const char *name,
731  const char *defValue) {
732  GWEN_XMLNODE *nn;
733 
734  if (name && *name) {
735  nn=GWEN_XMLNode_FindFirstTag(n, name, 0, 0);
736 
737  while(nn) {
738  GWEN_XMLNODE *dn;
739 
741  if (dn) {
742  if (dn->data)
743  return dn->data;
744  }
745  nn=GWEN_XMLNode_FindNextTag(nn, name, 0, 0);
746  }
747  }
748  else {
749  GWEN_XMLNODE *dn;
750 
752  if (dn) {
753  if (dn->data)
754  return dn->data;
755  }
756  }
757  return defValue;
758 }
759 
760 
761 
763  const char *name,
764  const char *defValue) {
765  GWEN_XMLNODE *nn=0;
766  GWEN_STRINGLIST *langl;
767 
769  if (langl) {
771 
772  se=GWEN_StringList_FirstEntry(langl);
773  while(se) {
774  const char *l;
775 
777  DBG_DEBUG(GWEN_LOGDOMAIN, "Trying locale \"%s\"", l);
778  assert(l);
779  nn=GWEN_XMLNode_FindFirstTag(n, name, "lang", l);
780  while(nn) {
781  GWEN_XMLNODE *dn;
782 
784  if (dn) {
785  if (dn->data && *(dn->data))
786  return dn->data;
787  }
788  nn=GWEN_XMLNode_FindNextTag(nn, name, "lang", l);
789  } /* while nn */
791  } /* while */
792  } /* if language list available */
793 
794  /* otherwise try without locale */
795  nn=GWEN_XMLNode_FindFirstTag(n, name, 0, 0);
796  while(nn) {
797  GWEN_XMLNODE *dn;
798 
800  if (dn) {
801  if (dn->data)
802  return dn->data;
803  }
804  nn=GWEN_XMLNode_FindNextTag(nn, name, 0, 0);
805  }
806 
807  return defValue;
808 }
809 
810 
811 
813  const char *name,
814  const char *value) {
815  if (name && *name) {
816  GWEN_XMLNODE *nn;
817 
819  if (value) {
820  GWEN_XMLNODE *nnn;
821 
823  GWEN_XMLNode_AddChild(nn, nnn);
824  }
825  GWEN_XMLNode_AddChild(n, nn);
826  }
827  else {
828  GWEN_XMLNODE *nn;
829 
831  GWEN_XMLNode_AddChild(n, nn);
832  }
833 }
834 
835 
836 
838  const char *name,
839  int defValue) {
840  const char *p;
841  int res;
842 
843  p=GWEN_XMLNode_GetCharValue(n, name, 0);
844  if (!p)
845  return defValue;
846  if (1!=sscanf(p, "%i", &res))
847  return defValue;
848  return res;
849 }
850 
851 
852 
854  const char *name,
855  int value) {
856  char numbuf[32];
857 
858  snprintf(numbuf, sizeof(numbuf)-1, "%d", value);
859  numbuf[sizeof(numbuf)-1]=0;
860  GWEN_XMLNode_SetCharValue(n, name, numbuf);
861 }
862 
863 
864 
866  const char *name,
867  const char *value) {
868  GWEN_XMLNODE *nn;
869 
870  nn=GWEN_XMLNode_GetNodeByXPath(n, name, 0);
871  if (nn) {
872  GWEN_XMLNODE *nnn;
873 
874  /* clear current entries */
876  GWEN_XMLNode_List_Clear(nn->children);
877 
878  /* create value node */
880  GWEN_XMLNode_AddChild(nn, nnn);
881 
882  return 0;
883  }
884  else {
885  DBG_ERROR(GWEN_LOGDOMAIN, "Unable to create node [%s]", name);
886  return GWEN_ERROR_INVALID;
887  }
888 }
889 
890 
891 
893  const char *name,
894  const char *defValue) {
895  GWEN_XMLNODE *nn;
896 
897  nn=GWEN_XMLNode_GetNodeByXPath(n, name, 0);
898  if (nn) {
899  GWEN_XMLNODE *dn;
900 
902  if (dn) {
903  if (dn->data)
904  return dn->data;
905  }
906  }
907 
908  return defValue;
909 }
910 
911 
912 
914  const char *name,
915  int value) {
916  char numbuf[32];
917  int rv;
918 
919  /* create int value */
920  snprintf(numbuf, sizeof(numbuf)-1, "%d", value);
921  numbuf[sizeof(numbuf)-1]=0;
922 
923  rv=GWEN_XMLNode_SetCharValueByPath(n, flags, name, numbuf);
924  if (rv<0) {
925  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
926  return rv;
927  }
928 
929  return rv;
930 }
931 
932 
933 
935  const char *name,
936  int defValue) {
937  const char *p;
938  int res;
939 
941  if (!p)
942  return defValue;
943  if (1!=sscanf(p, "%i", &res))
944  return defValue;
945  return res;
946 }
947 
948 
949 
950 
951 
952 
954  assert(n);
955  return n->properties;
956 }
957 
958 
959 
961  const GWEN_XMLPROPERTY *pr) {
962  assert(n);
963  assert(pr);
964  return pr->next;
965 }
966 
967 
968 
970  assert(pr);
971  return pr->name;
972 }
973 
974 
975 
977  assert(pr);
978  return pr->value;
979 }
980 
981 
982 
984  const GWEN_XMLNODE *child) {
985  GWEN_XMLNODE *n;
986 
987  if (!child || !parent || child==parent)
988  return 0;
989  n=child->parent;
990  while(n) {
991  if (n==parent)
992  return 1;
993  n=n->parent;
994  }
995  return 0;
996 }
997 
998 
999 
1001  const GWEN_XMLNODE *n2,
1002  GWEN_BUFFER *nbuf) {
1003  GWEN_BUFFER *lbuf;
1004  const GWEN_XMLNODE *ln1;
1005  const GWEN_XMLNODE *ln2;
1006 
1007  if (!n1 && !n2) {
1008  DBG_ERROR(GWEN_LOGDOMAIN, "Both nodes are NULL");
1009  return -1;
1010  }
1011 
1012  if (!n1) {
1013  n1=n2;
1014  while(n1->parent)
1015  n1=n1->parent;
1016  }
1017 
1018  if (!n2) {
1019  n2=n1;
1020  while(n2->parent)
1021  n2=n2->parent;
1022  }
1023 
1024  if (n2==n1) {
1025  GWEN_Buffer_AppendString(nbuf, "here()");
1026  return 0;
1027  }
1028 
1029  lbuf=GWEN_Buffer_new(0, 256, 0, 1);
1030  GWEN_Buffer_ReserveBytes(lbuf, 128);
1031 
1032  ln1=n1->parent;
1033  if (ln1) {
1034  GWEN_Buffer_AppendString(lbuf, "../");
1035  while(ln1) {
1036  if (ln1==n2) {
1037  /* found n2 */
1038  GWEN_Buffer_AppendBuffer(nbuf, lbuf);
1039  GWEN_Buffer_free(lbuf);
1040  return 0;
1041  }
1042  if (GWEN_XMLNode_IsChildOf(ln1, n2))
1043  break;
1044  ln1=ln1->parent;
1045  GWEN_Buffer_AppendString(lbuf, "../");
1046  }
1047 
1048  if (!ln1) {
1049  DBG_ERROR(GWEN_LOGDOMAIN, "Nodes do not share root node");
1050  GWEN_Buffer_free(lbuf);
1051  return -1;
1052  }
1053 
1054  /* append path to n1 */
1055  GWEN_Buffer_AppendBuffer(nbuf, lbuf);
1056  }
1057  DBG_ERROR(GWEN_LOGDOMAIN, "Path so far: %s", GWEN_Buffer_GetStart(lbuf));
1058 
1059  /* get path to n2 */
1060  GWEN_Buffer_Reset(lbuf);
1061 
1062  ln2=n2;
1063  while(ln2) {
1064  GWEN_XMLNODE *tn;
1065  int idx;
1066  char idxbuf[32];
1067 
1068  if (ln2->parent==ln1)
1069  break;
1070 
1071  /* count occurences of this tag in this level */
1072  idx=1;
1073  tn=ln2->parent;
1074  if (tn) {
1075  tn=GWEN_XMLNode_FindFirstTag(tn, ln2->data, 0, 0);
1076 
1077  while(tn) {
1078  if (tn==ln2)
1079  break;
1080  idx++;
1081  tn=GWEN_XMLNode_FindNextTag(tn, ln2->data, 0, 0);
1082  }
1083  }
1084 
1085  snprintf(idxbuf, sizeof(idxbuf), "[%d]", idx);
1086  idxbuf[sizeof(idxbuf)-1]=0;
1087  GWEN_Buffer_InsertString(lbuf, idxbuf);
1089  GWEN_Buffer_InsertByte(lbuf, '/');
1090  ln2=ln2->parent;
1091  }
1092  /*DBG_ERROR(GWEN_LOGDOMAIN, "Path so far: %s", GWEN_Buffer_GetStart(lbuf)); */
1093  assert(ln2);
1094 
1095  /* append path to n2 */
1096  GWEN_Buffer_AppendBuffer(nbuf, lbuf);
1097  GWEN_Buffer_free(lbuf);
1098  return 0;
1099 }
1100 
1101 
1102 
1103 void* GWEN_XMLNode_HandlePath(const char *entry,
1104  void *data,
1105  int idx,
1106  uint32_t flags) {
1107  GWEN_XMLNODE *n;
1108  GWEN_XMLNODE *nn;
1109  int i;
1110 
1111  n=(GWEN_XMLNODE*)data;
1112 
1113  if (flags & GWEN_PATH_FLAGS_VARIABLE) {
1115  "GWEN_PATH_FLAGS_VARIABLE not allowed for XPATH");
1116  return 0;
1117  }
1118 
1119  if (flags & GWEN_PATH_FLAGS_ROOT) {
1120  while(n->parent)
1121  n=n->parent;
1122  if (*entry=='/')
1123  entry++;
1124  }
1125 
1126  if (strcasecmp(entry, "..")==0) {
1127  return n->parent;
1128  }
1129  else if (strcasecmp(entry, ".")==0 ||
1130  strcasecmp(entry, "here()")==0) {
1131  return n;
1132  }
1133 
1134  /* check whether we are allowed to simply create the node */
1135  if (
1136  ((flags & GWEN_PATH_FLAGS_LAST) &&
1137  (((flags & GWEN_PATH_FLAGS_VARIABLE) &&
1138  (flags & GWEN_PATH_FLAGS_CREATE_VAR)) ||
1139  (!(flags & GWEN_PATH_FLAGS_VARIABLE) &&
1140  (flags & GWEN_PATH_FLAGS_CREATE_GROUP)))
1141  ) ||
1142  (
1143  !(flags & GWEN_PATH_FLAGS_LAST) &&
1144  (flags & GWEN_PATH_FLAGS_PATHCREATE))
1145  ) {
1146  /* simply create the new variable/group */
1147  if (flags & GWEN_PATH_FLAGS_VARIABLE) {
1148  /* not allowed for now */
1149  return 0;
1150  }
1151  else {
1152  if (idx!=0) {
1154  "Can not create tag with index!=1 (%s)", entry);
1155  return 0;
1156  }
1158  "Unconditionally creating tag \"%s\"", entry);
1160  GWEN_XMLNode_AddChild(n, nn);
1161  return nn;
1162  }
1163  }
1164 
1165  /* find the node */
1166  i=idx;
1167  nn=GWEN_XMLNode_FindFirstTag(n, entry, 0, 0);
1168  while(nn && i--) {
1169  nn=GWEN_XMLNode_FindNextTag(nn, entry, 0, 0);
1170  }
1171 
1172  if (!nn) {
1173  /* node not found, check, if we are allowed to create it */
1174  if (
1175  (!(flags & GWEN_PATH_FLAGS_LAST) &&
1176  (flags & GWEN_PATH_FLAGS_PATHMUSTEXIST)) ||
1178  ) {
1180  "Tag \"%s\" does not exist", entry);
1181  return 0;
1182  }
1183  /* create the new variable/group */
1184  if (idx!=0) {
1186  "Can not create tag with index!=1 (%s)", entry);
1187  return 0;
1188  }
1190  "Tag \"%s\" not found, creating", entry);
1192  GWEN_XMLNode_AddChild(n, nn);
1193  } /* if node not found */
1194  else {
1195  /* node does exist, check whether this is ok */
1196  if (
1197  ((flags & GWEN_PATH_FLAGS_LAST) &&
1198  (flags & GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST)) ||
1199  (!(flags & GWEN_PATH_FLAGS_LAST) &&
1201  ) {
1202  DBG_VERBOUS(GWEN_LOGDOMAIN, "Entry \"%s\" already exists", entry);
1203  return 0;
1204  }
1205  }
1206 
1207  return nn;
1208 }
1209 
1210 
1211 
1213  const char *path,
1214  uint32_t flags) {
1215  return (GWEN_XMLNODE*)GWEN_Path_HandleWithIdx(path,
1216  (void*)n,
1217  flags,
1219 }
1220 
1221 
1222 
1224  assert(n);
1225  return GWEN_XMLNode_List_First(n->headers);
1226 }
1227 
1228 
1229 
1231  assert(n);
1232  assert(nh);
1233  GWEN_XMLNode_List_Add(nh, n->headers);
1234 }
1235 
1236 
1237 
1239  assert(n);
1240  assert(nh);
1242 }
1243 
1244 
1245 
1247  assert(n);
1248  GWEN_XMLNode_List_Clear(n->headers);
1249 }
1250 
1251 
1252 
1254  assert(n);
1255  return n->nameSpaces;
1256 }
1257 
1258 
1259 
1261  const char *s) {
1263 
1264  assert(n);
1265  ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1266  while(ns) {
1267  const char *d;
1268 
1270  if (d && strcasecmp(d, s)==0)
1271  return ns;
1273  }
1274 
1275  return NULL;
1276 }
1277 
1278 
1279 
1281  const char *s) {
1283 
1284  assert(n);
1285  ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1286  while(ns) {
1287  const char *d;
1288 
1290  if (d && strcasecmp(d, s)==0)
1291  return ns;
1293  }
1294 
1295  return NULL;
1296 }
1297 
1298 
1299 
1301  assert(n);
1302  assert(ns);
1304 }
1305 
1306 
1307 
1308 
1309 
1310 
1311 
1312 
1313 
1314 
1315 
1317  const char *prefix,
1318  const char *name) {
1319  GWEN_BUFFER *nbuf;
1320  int rv;
1321 
1322  nbuf=GWEN_Buffer_new(0, 32, 0, 1);
1323  if (prefix)
1324  GWEN_Buffer_AppendString(nbuf, prefix);
1325  GWEN_Buffer_AppendByte(nbuf, ':');
1326  GWEN_Buffer_AppendString(nbuf, name);
1329  GWEN_Buffer_free(nbuf);
1330  return rv;
1331 }
1332 
1333 
1334 
1336  const char *s) {
1338 
1339  it=GWEN_StringList2_First(sl);
1340  if (it) {
1341  const char *t;
1342 
1344  assert(t);
1345  while(t) {
1346  const char *p;
1347 
1348  p=strchr(t, ':');
1349  assert(p);
1350  if ((s==0 && p==t) || (s && strncasecmp(t, s, p-t)==0))
1351  return t;
1353  } /* while */
1355  }
1356  return 0;
1357 }
1358 
1359 
1360 
1362  const char *s) {
1364 
1365  it=GWEN_StringList2_First(sl);
1366  if (it) {
1367  const char *t;
1368 
1370  assert(t);
1371  while(t) {
1372  const char *p;
1373 
1374  p=strchr(t, ':');
1375  assert(p);
1376  p++;
1377  if (strcasecmp(p, s)==0) {
1379  return t;
1380  }
1382  } /* while */
1384  }
1385  return 0;
1386 }
1387 
1388 
1389 
1391  const char *prefix,
1392  const char *name) {
1393  GWEN_BUFFER *nbuf;
1395 
1396  nbuf=GWEN_Buffer_new(0, 32, 0, 1);
1397  if (prefix)
1398  GWEN_Buffer_AppendString(nbuf, prefix);
1399  GWEN_Buffer_AppendByte(nbuf, ':');
1400  GWEN_Buffer_AppendString(nbuf, name);
1401 
1402  it=GWEN_StringList2_First(sl);
1403  if (it) {
1404  const char *t;
1405 
1407  assert(t);
1408  while(t) {
1409  const char *p;
1410 
1411  p=strchr(t, ':');
1412  assert(p);
1413  p++;
1414  if (strcasecmp(p, GWEN_Buffer_GetStart(nbuf))==0) {
1416  GWEN_Buffer_free(nbuf);
1417  return t;
1418  }
1420  } /* while */
1422  }
1423 
1424  GWEN_Buffer_free(nbuf);
1425  return 0;
1426 }
1427 
1428 
1429 
1431  GWEN_STRINGLIST2 *sl,
1432  const char *currentNameSpace) {
1433  GWEN_XMLPROPERTY *pr;
1434  GWEN_XMLNODE *nn;
1435  char *localNameSpace;
1436 
1437  localNameSpace=0;
1438 
1439  /* remove all unnecessary namespace declarations from this node */
1440  pr=n->properties;
1441  while(pr) {
1442  GWEN_XMLPROPERTY *prNext;
1443 
1444  prNext=pr->next;
1445  if (strcasecmp(pr->name, "xmlns")==0) {
1446  /* default namespace changed ? */
1447  if (localNameSpace) {
1448  if (strcasecmp(pr->value, localNameSpace)==0) {
1449  /* already mentioned name space, remove duplicate property */
1450  GWEN_XMLProperty_del(pr, &n->properties);
1452  }
1453  else {
1454  /* current namespace changed */
1455  GWEN_Memory_dealloc(localNameSpace);
1456  localNameSpace=GWEN_Memory_strdup(pr->value);
1457  }
1458  }
1459  else if (currentNameSpace) {
1460  if (strcasecmp(pr->value, currentNameSpace)==0) {
1461  /* already active name space, remove property */
1462  GWEN_XMLProperty_del(pr, &n->properties);
1464  }
1465  else {
1466  /* current namespace changed */
1467  GWEN_Memory_dealloc(localNameSpace);
1468  localNameSpace=GWEN_Memory_strdup(pr->value);
1469  }
1470  }
1471  else {
1472  /* set current namespace */
1473  GWEN_Memory_dealloc(localNameSpace);
1474  localNameSpace=GWEN_Memory_strdup(pr->value);
1475  }
1476  }
1477  else if (strncasecmp(pr->name, "xmlns:", 6)==0) {
1478  const char *prefix;
1479  const char *x;
1480 
1481  prefix=strchr(pr->name, ':');
1482  prefix++;
1483 
1484  /* check for redefinition */
1485  x=GWEN_XML_FindNameSpaceByName(sl, prefix);
1486  if (x) {
1487  const char *p;
1488 
1489  /* prefix already in use, check whether it is the same namespace */
1490  p=strchr(x, ':');
1491  assert(p);
1492  p++;
1493  if (strcasecmp(p, pr->value)!=0) {
1494  GWEN_BUFFER *xpath;
1495 
1496  /* same prefix, different namespace */
1497  xpath=GWEN_Buffer_new(0, 256, 0, 1);
1498  GWEN_XMLNode_GetXPath(0, n, xpath);
1500  "Redefinition of namespace prefix \"%s\" in \"%s\"",
1501  prefix, GWEN_Buffer_GetStart(xpath));
1502  GWEN_Buffer_free(xpath);
1503  return -1;
1504  } /* if different namespace for same prefix */
1505  else {
1506  /* already in list, remove property here */
1507  GWEN_XMLProperty_del(pr, &n->properties);
1509  }
1510  }
1511  else {
1512  GWEN_XML_AddNameSpace(sl, prefix, pr->value);
1513  }
1514  }
1515  pr=prNext;
1516  } /* while */
1517 
1518  /* do the same on all sub nodes */
1520  while(nn) {
1521  int rv;
1522 
1524  localNameSpace?localNameSpace:
1525  currentNameSpace);
1526  if (rv) {
1527  GWEN_Memory_dealloc(localNameSpace);
1528  return rv;
1529  }
1530  nn=GWEN_XMLNode_GetNextTag(nn);
1531  }
1532 
1533  GWEN_Memory_dealloc(localNameSpace);
1534  return 0;
1535 }
1536 
1537 
1538 
1540  const char *prefix,
1541  const char *nspace) {
1542  GWEN_XMLPROPERTY *pr;
1543  const char *p;
1544  int inUse;
1545 
1546  inUse=0;
1547  /* check current tag for prefix */
1548  if (prefix) {
1549  p=strchr(n->data, ':');
1550  if (p) {
1551  if (strncasecmp(n->data, prefix, p-n->data)==0) {
1552  DBG_DEBUG(GWEN_LOGDOMAIN, "Prefix \"%s\" used in tag \"%s\"",
1553  prefix, n->data);
1554  inUse=1;
1555  }
1556  }
1557 
1558  if (!inUse) {
1559  /* check all attributes for prefixes */
1560  pr=n->properties;
1561  while(pr) {
1562  p=strchr(pr->name, ':');
1563  if (p) {
1564  if (strncasecmp(pr->name, prefix, p-pr->name)==0) {
1566  "Prefix \"%s\" used in attribute \"%s\" of tag \"%s\"",
1567  prefix, pr->name, n->data);
1568  inUse=1;
1569  break;
1570  }
1571  else {
1573  "Prefix \"%s\" not used in attribute \"%s\" of tag \"%s\"",
1574  prefix, pr->name, n->data);
1575  }
1576  }
1577  pr=pr->next;
1578  } /* while */
1579  }
1580  } /* if prefix */
1581  else {
1582  /* no prefix, check whether the current element hasn't any */
1583  p=strchr(n->data, ':');
1584  if (!p) {
1585  /* current tag has no prefix, check whether we have a namespace
1586  * declaration here */
1587  if (GWEN_XMLNode_GetProperty(n, "xmlns", 0)==0) {
1588  /* no, so the current namespace from above is used */
1590  "No prefix, current namespace is used");
1591  inUse=1;
1592  }
1593  }
1594  } /* if no prefix */
1595 
1596  if (inUse) {
1597  GWEN_BUFFER *nbuf;
1598 
1599  nbuf=GWEN_Buffer_new(0, 32, 0, 1);
1600  GWEN_Buffer_AppendString(nbuf, "xmlns");
1601  if (prefix) {
1602  GWEN_Buffer_AppendByte(nbuf, ':');
1603  GWEN_Buffer_AppendString(nbuf, prefix);
1604  }
1605  GWEN_XMLNode__SetProperty(n, GWEN_Buffer_GetStart(nbuf), nspace, 1);
1606  GWEN_Buffer_free(nbuf);
1607  return 1;
1608  }
1609 
1610  return 0;
1611 }
1612 
1613 
1614 
1616  const char *prefix,
1617  const char *nspace) {
1618  GWEN_XMLNODE *nn;
1619  int rv;
1620 
1621  rv=GWEN_XMLNode__CheckAndSetNameSpace(n, prefix, nspace);
1622  if (rv)
1623  return rv;
1624 
1626  while(nn) {
1627  rv=GWEN_XMLNode__CheckAndSetNameSpace(nn, prefix, nspace);
1628  if (rv==-1)
1629  return rv;
1630  else if (rv==0) {
1631  /* check children */
1632  rv=GWEN_XMLNode__SetNameSpaces(nn, prefix, nspace);
1633  if (rv)
1634  return rv;
1635  }
1636 
1637  nn=GWEN_XMLNode_GetNextTag(nn);
1638  }
1639 
1640  return 0;
1641 }
1642 
1643 
1644 
1646  GWEN_XMLPROPERTY *pr;
1647  GWEN_XMLNODE *nn;
1648  int rv;
1649 
1650  /* move all namespace declarations from this node to the nodes
1651  * of first use */
1652  pr=n->properties;
1653  while(pr) {
1654  GWEN_XMLPROPERTY *prNext;
1655 
1656  prNext=pr->next;
1657  if (strcasecmp(pr->name, "xmlns")==0 ||
1658  strncasecmp(pr->name, "xmlns:", 6)==0) {
1659  const char *prefix;
1660 
1661  prefix=strchr(pr->name, ':');
1662  if (prefix)
1663  prefix++;
1664 
1665  GWEN_XMLProperty_del(pr, &n->properties);
1666  rv=GWEN_XMLNode__SetNameSpaces(n, prefix, pr->value);
1667  DBG_DEBUG(GWEN_LOGDOMAIN, "Removing property \"%s\"",
1668  pr->name);
1670  if (rv==-1)
1671  return rv;
1672  }
1673  pr=prNext;
1674  } /* while */
1675 
1676  /* do the same on all sub nodes */
1678  while(nn) {
1680  if (rv) {
1681  return rv;
1682  }
1683  nn=GWEN_XMLNode_GetNextTag(nn);
1684  }
1685 
1686  return 0;
1687 }
1688 
1689 
1690 
1691 
1693  const char *ns;
1694  int rv;
1695  GWEN_STRINGLIST2 *sl;
1696 
1697  ns=GWEN_XMLNode_GetProperty(n, "xmlns", 0);
1698  sl=GWEN_StringList2_new();
1699  rv=GWEN_XMLNode__CheckNameSpaceDecls1(n, sl, ns);
1701  if (rv) {
1702  DBG_INFO(GWEN_LOGDOMAIN, "here");
1703  return rv;
1704  }
1705 
1706  //rv=GWEN_XMLNode__CheckNameSpaceDecls2(n, ns);
1708  if (rv==-1)
1709  return rv;
1710  return 0;
1711 }
1712 
1713 
1714 
1716  if (n && n->type==GWEN_XMLNodeTypeTag && n->data) {
1717  GWEN_XMLNODE *nn;
1718  GWEN_XMLPROPERTY *pp;
1719 
1720  if (n->nameSpace==0) {
1721  char *p;
1722 
1723  p=strchr(n->data, ':');
1724  if (p) {
1725  int len=p-n->data;
1726  char *s;
1727 
1728  n->nameSpace=(char*)GWEN_Memory_malloc(len);
1729  assert(n->nameSpace);
1730  memmove(n->nameSpace, n->data, len);
1731  n->nameSpace[len-1]=0;
1732  s=GWEN_Memory_strdup(p+1);
1733  free(n->data);
1734  n->data=s;
1735  }
1736  }
1737 
1738  pp=n->properties;
1739  while(pp) {
1740  if (pp->nameSpace==0) {
1741  char *p;
1742 
1743  p=strchr(pp->name, ':');
1744  if (p) {
1745  int len=p-pp->name;
1746  char *s;
1747 
1748  pp->nameSpace=(char*)GWEN_Memory_malloc(len);
1749  assert(pp->nameSpace);
1750  memmove(pp->nameSpace, pp->name, len);
1751  pp->nameSpace[len-1]=0;
1752  s=GWEN_Memory_strdup(p+1);
1753  free(pp->name);
1754  pp->name=s;
1755  }
1756  }
1757 
1758  pp=pp->next;
1759  }
1760 
1761  nn=GWEN_XMLNode_List_First(n->children);
1762  while(nn) {
1763  int rv;
1764 
1766  if (rv<0) {
1767  DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", rv);
1768  return rv;
1769  }
1770  nn=GWEN_XMLNode_List_Next(nn);
1771  }
1772  }
1773 
1774  return 0;
1775 }
1776 
1777 
1778 
1779 
1780 
1781 
1782 
1783 
1784 
1786  GWEN_XMLNODE_PATH *p;
1787 
1789  return p;
1790 }
1791 
1792 
1793 
1795  GWEN_XMLNODE_PATH *p;
1796  unsigned int i;
1797 
1799  p->pos=np->pos;
1800  for (i=0; i<np->pos; i++) {
1801  p->nodes[i]=np->nodes[i];
1802  }
1803  return p;
1804 }
1805 
1806 
1807 
1809  GWEN_FREE_OBJECT(np);
1810 }
1811 
1812 
1813 
1815  GWEN_XMLNODE *n) {
1816  unsigned int i;
1817 
1818  if (np->pos>=GWEN_XML_MAX_DEPTH) {
1819  DBG_ERROR(GWEN_LOGDOMAIN, "Path too deep");
1820  return 1;
1821  }
1822 
1823  /* check for double entries */
1824  for (i=0; i<np->pos; i++) {
1825  assert(np->nodes[i]!=n);
1826  }
1827  np->nodes[np->pos++]=n;
1828  DBG_DEBUG(GWEN_LOGDOMAIN, "Dived to %d", np->pos);
1829  return 0;
1830 }
1831 
1832 
1833 
1835  if (np->pos==0) {
1836  DBG_DEBUG(GWEN_LOGDOMAIN, "Root reached");
1837  return 0;
1838  }
1839  DBG_DEBUG(GWEN_LOGDOMAIN, "Surfaced to %d", np->pos-1);
1840  return np->nodes[--np->pos];
1841 }
1842 
1843 
1844 
1846  unsigned int i;
1847 
1848  if (np->pos==0) {
1849  DBG_NOTICE(GWEN_LOGDOMAIN, "Empty path");
1850  }
1851  for (i=0; i<np->pos; i++) {
1852  DBG_NOTICE(GWEN_LOGDOMAIN, "Path entry %d:", i);
1853  GWEN_XMLNode_Dump(np->nodes[i], 1);
1854  }
1855 }
1856 
1857 
1858 
1859 
1860 
1861 
1862 
1863 
1864 
1865 
1866 
1868  const char *url) {
1870 
1873 
1874  if (name)
1875  ns->name=GWEN_Memory_strdup(name);
1876  if (url)
1877  ns->url=GWEN_Memory_strdup(url);
1878 
1879  return ns;
1880 }
1881 
1882 
1883 
1885  if (ns) {
1887  free(ns->url);
1888  free(ns->name);
1889  GWEN_FREE_OBJECT(ns);
1890  }
1891 }
1892 
1893 
1894 
1897 
1898  assert(ns);
1899  nns=GWEN_XMLNode_NameSpace_new(ns->name, ns->url);
1900  return nns;
1901 }
1902 
1903 
1904 
1906  assert(ns);
1907  return ns->name;
1908 }
1909 
1910 
1911 
1913  assert(ns);
1914  return ns->url;
1915 }
1916 
1917 
1918 
1919 
1920 
1921 
1922 #include "xmlrw.c"
1923 #include "xmlglobalize.c"
1924 
1925 
1926 
GWEN_XMLNODE * GWEN_XMLNode_GetHeader(const GWEN_XMLNODE *n)
Definition: xml.c:1223
uint32_t GWEN_XMLNode_GetUsage(const GWEN_XMLNODE *n)
Definition: xml.c:344
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:51
int GWEN_Buffer_InsertString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:1023
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
Definition: xml.h:149
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1230
const char * GWEN_XML_FindNameSpace(GWEN_STRINGLIST2 *sl, const char *prefix, const char *name)
Definition: xml.c:1390
GWEN_XMLNODE_NAMESPACE_LIST * GWEN_XMLNode_GetNameSpaces(const GWEN_XMLNODE *n)
Definition: xml.c:1253
#define GWEN_ERROR_INVALID
Definition: error.h:67
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:228
const char * GWEN_XMLNode_NameSpace_GetName(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:1905
GWEN_XMLNODE * GWEN_XMLNode_GetNextData(const GWEN_XMLNODE *n)
Definition: xml.c:652
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_FindNameSpaceByName(const GWEN_XMLNODE *n, const char *s)
Definition: xml.c:1260
int GWEN_XML_AddNameSpace(GWEN_STRINGLIST2 *sl, const char *prefix, const char *name)
Definition: xml.c:1316
void GWEN_XMLProperty_freeAll(GWEN_XMLPROPERTY *p)
Definition: xml.c:124
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:712
char * GWEN_Memory_strdup(const char *s)
Definition: memory.c:530
int GWEN_XMLNode__SetNameSpaces(GWEN_XMLNODE *n, const char *prefix, const char *nspace)
Definition: xml.c:1615
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:140
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:646
struct GWEN__XMLPROPERTY GWEN_XMLPROPERTY
Definition: xml_l.h:37
const char * GWEN_XMLNode_NameSpace_GetUrl(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:1912
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
void GWEN_Memory_dealloc(void *p)
Definition: memory.c:472
#define GWEN_PATH_FLAGS_CREATE_GROUP
Definition: path.h:96
GWEN_XMLNODE * GWEN_XMLNode_GetFirstOfType(const GWEN_XMLNODE *n, GWEN_XMLNODE_TYPE t)
Definition: xml.c:600
#define DBG_VERBOUS(dbg_logger, format, args...)
Definition: debug.h:200
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:308
void GWEN_XMLNode_Path_Dump(GWEN_XMLNODE_PATH *np)
Definition: xml.c:1845
void GWEN_XMLNode_Dump(const GWEN_XMLNODE *n, int ind)
Definition: xml.c:443
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:118
GWEN_XMLNODE * GWEN_XMLNode_FindTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:663
int GWEN_XMLNode_IsChildOf(const GWEN_XMLNODE *parent, const GWEN_XMLNODE *child)
Definition: xml.c:983
void GWEN_XMLNode_RemoveChildren(GWEN_XMLNODE *n)
Definition: xml.c:548
void GWEN_XMLNode_SetCharValue(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:812
#define GWEN_LOGDOMAIN
Definition: logger.h:35
struct GWEN_XMLNODE_PATH GWEN_XMLNODE_PATH
Definition: xml.h:846
void GWEN_XMLNode_AddNameSpace(GWEN_XMLNODE *n, const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:1300
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:137
int GWEN_Buffer_ReserveBytes(GWEN_BUFFER *bf, uint32_t res)
Definition: buffer.c:152
void GWEN_XMLNode_NameSpace_free(GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:1884
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:38
void GWEN_XMLNode_CopyProperties(GWEN_XMLNODE *tn, const GWEN_XMLNODE *sn, int overwrite)
Definition: xml.c:555
void GWEN_XMLNode_SetData(GWEN_XMLNODE *n, const char *data)
Definition: xml.c:357
GWEN_XMLPROPERTY * GWEN_XMLNode_GetFirstProperty(const GWEN_XMLNODE *n)
Definition: xml.c:953
#define GWEN_LIST_DEL(typ, sr, head)
Definition: misc.h:116
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:352
const char * GWEN_StringList2Iterator_Data(GWEN_STRINGLIST2_ITERATOR *li)
Definition: stringlist2.c:438
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:684
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_new(const char *name, const char *url)
Definition: xml.c:1867
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:366
int GWEN_XMLNode_GetIntValue(const GWEN_XMLNODE *n, const char *name, int defValue)
Definition: xml.c:837
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition: xml.c:386
#define GWEN_PATH_FLAGS_LAST
Definition: path.h:166
const char * GWEN_XML_FindNameSpaceByPrefix(GWEN_STRINGLIST2 *sl, const char *s)
Definition: xml.c:1335
#define GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST
Definition: path.h:89
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:695
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_FindNameSpaceByUrl(const GWEN_XMLNODE *n, const char *s)
Definition: xml.c:1280
#define GWEN_PATH_FLAGS_ROOT
Definition: path.h:174
void GWEN_XMLNode_DelHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1238
void GWEN_XMLProperty_insert(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
Definition: xml.c:114
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
Definition: xml.c:251
GWEN_XMLNODE_TYPE GWEN_XMLNode_GetType(const GWEN_XMLNODE *n)
Definition: xml.c:431
GWEN_XMLNODE_PATH * GWEN_XMLNode_Path_new(void)
Definition: xml.c:1785
const char * GWEN_StringList2Iterator_Next(GWEN_STRINGLIST2_ITERATOR *li)
Definition: stringlist2.c:432
const char * GWEN_XMLNode_GetCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:729
GWEN_XMLPROPERTY * GWEN_XMLNode_GetNextProperty(const GWEN_XMLNODE *n, const GWEN_XMLPROPERTY *pr)
Definition: xml.c:960
int GWEN_XMLNode_SetIntValueByPath(GWEN_XMLNODE *n, uint32_t flags, const char *name, int value)
Definition: xml.c:913
int GWEN_XMLNode__CheckAndSetNameSpace(GWEN_XMLNODE *n, const char *prefix, const char *nspace)
Definition: xml.c:1539
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:192
int GWEN_Buffer_AppendBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
Definition: buffer.c:549
int GWEN_XMLNode__CheckNameSpaceDecls3(GWEN_XMLNODE *n)
Definition: xml.c:1645
GWEN_XMLPROPERTY * GWEN_XMLProperty_new(const char *name, const char *value)
Definition: xml.c:72
void GWEN_StringList2_free(GWEN_STRINGLIST2 *sl2)
Definition: stringlist2.c:62
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:635
const char * GWEN_XMLNode_GetNamespace(const GWEN_XMLNODE *n)
Definition: xml.c:368
int GWEN_Buffer_InsertByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:939
#define GWEN_PATH_FLAGS_VARIABLE
Definition: path.h:111
void * GWEN_Memory_malloc(size_t wsize)
Definition: memory.c:385
GWEN_XMLNODE * GWEN_XMLNode_Path_Surface(GWEN_XMLNODE_PATH *np)
Definition: xml.c:1834
GWEN_XMLNODE * GWEN_XMLNode_GetNodeByXPath(GWEN_XMLNODE *n, const char *path, uint32_t flags)
Definition: xml.c:1212
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition: xml.c:437
GWEN_XMLNODE * GWEN_XMLNode_FindNode(const GWEN_XMLNODE *node, GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:513
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:54
void GWEN_XMLNode_SetNamespace(GWEN_XMLNODE *n, const char *s)
Definition: xml.c:375
GWEN_XMLNODE * GWEN_XMLNode_List_Next(const GWEN_XMLNODE *element)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:380
void * GWEN_XMLNode_HandlePath(const char *entry, void *data, int idx, uint32_t flags)
Definition: xml.c:1103
void GWEN_XMLNode_List_Del(GWEN_XMLNODE *element)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:83
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:152
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:539
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
GWEN_LIST2_FUNCTIONS(TYPEMAKER2_TYPE, Typemaker2_Type)
GWEN_XMLNODE * GWEN_XMLNode_GetParent(const GWEN_XMLNODE *n)
Definition: xml.c:392
void GWEN_XMLNode_DecUsage(GWEN_XMLNODE *n)
Definition: xml.c:333
int GWEN_XMLNode_GetXPath(const GWEN_XMLNODE *n1, const GWEN_XMLNODE *n2, GWEN_BUFFER *nbuf)
Definition: xml.c:1000
#define GWEN_PATH_FLAGS_PATHCREATE
Definition: path.h:78
#define GWEN_PATH_FLAGS_CREATE_VAR
Definition: path.h:103
void GWEN_XMLNode_SetIntProperty(GWEN_XMLNODE *n, const char *name, int value)
Definition: xml.c:315
GWEN_XMLNODE_TYPE
Definition: xml.h:134
#define GWEN_PATH_FLAGS_PATHMUSTNOTEXIST
Definition: path.h:70
void GWEN_XMLNode_NameSpace_List_free(GWEN_XMLNODE_NAMESPACE_LIST *l)
#define GWEN_LIST_INSERT(typ, sr, head)
Definition: misc.h:100
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:629
int GWEN_XMLNode_SetCharValueByPath(GWEN_XMLNODE *n, uint32_t flags, const char *name, const char *value)
Definition: xml.c:865
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:351
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_dup(const GWEN_XMLNODE_NAMESPACE *ns)
Definition: xml.c:1895
const char * GWEN_XMLNode_GetLocalizedCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:762
struct GWEN_STRINGLIST2 GWEN_STRINGLIST2
Definition: stringlist2.h:43
void GWEN_XMLProperty_del(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
Definition: xml.c:119
void GWEN_XMLNode__SetProperty(GWEN_XMLNODE *n, const char *name, const char *value, int doInsert)
Definition: xml.c:277
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1162
GWEN_XMLNODE * GWEN_XMLNode_GetNextOfType(const GWEN_XMLNODE *n, GWEN_XMLNODE_TYPE t)
Definition: xml.c:616
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:359
GWEN_XMLNODE_PATH * GWEN_XMLNode_Path_dup(const GWEN_XMLNODE_PATH *np)
Definition: xml.c:1794
void GWEN_XMLNode_List_Add(GWEN_XMLNODE *element, GWEN_XMLNODE_LIST *list)
#define GWEN_PATH_FLAGS_PATHMUSTEXIST
Definition: path.h:66
GWEN_STRINGLIST2 * GWEN_StringList2_new(void)
Definition: stringlist2.c:45
GWEN_XMLNODE * GWEN_XMLNode_dup(const GWEN_XMLNODE *n)
Definition: xml.c:177
void GWEN_XMLNode_List_free(GWEN_XMLNODE_LIST *l)
int GWEN_XMLNode__CheckNameSpaceDecls1(GWEN_XMLNODE *n, GWEN_STRINGLIST2 *sl, const char *currentNameSpace)
Definition: xml.c:1430
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
int GWEN_XMLNode_Path_Dive(GWEN_XMLNODE_PATH *np, GWEN_XMLNODE *n)
Definition: xml.c:1814
void GWEN_StringList2Iterator_free(GWEN_STRINGLIST2_ITERATOR *li)
Definition: stringlist2.c:420
void GWEN_XMLNode_NameSpace_List_Add(GWEN_XMLNODE_NAMESPACE *element, GWEN_XMLNODE_NAMESPACE_LIST *list)
int GWEN_XMLNode_GetIntValueByPath(GWEN_XMLNODE *n, const char *name, int defValue)
Definition: xml.c:934
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
const char * GWEN_XMLProperty_GetName(const GWEN_XMLPROPERTY *pr)
Definition: xml.c:969
int GWEN_XMLNode_NormalizeNameSpaces(GWEN_XMLNODE *n)
Definition: xml.c:1692
void GWEN_XMLNode_ClearHeaders(GWEN_XMLNODE *n)
Definition: xml.c:1246
const char * GWEN_XMLNode_GetCharValueByPath(GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:892
void GWEN_XMLNode_AddChildrenOnly(GWEN_XMLNODE *n, GWEN_XMLNODE *nn, int copythem)
Definition: xml.c:406
void GWEN_XMLNode_Path_free(GWEN_XMLNODE_PATH *np)
Definition: xml.c:1808
const char * GWEN_XMLProperty_GetValue(const GWEN_XMLPROPERTY *pr)
Definition: xml.c:976
#define GWEN_LIST_ADD(typ, sr, head)
Definition: misc.h:82
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition: list1.h:366
void * GWEN_Path_HandleWithIdx(const char *path, void *data, uint32_t flags, GWEN_PATHIDXHANDLERPTR elementFunction)
Definition: path.c:188
void GWEN_XMLNode_IncUsage(GWEN_XMLNODE *n)
Definition: xml.c:326
void GWEN_XMLProperty_free(GWEN_XMLPROPERTY *p)
Definition: xml.c:85
void GWEN_XMLNode_List_Clear(GWEN_XMLNODE_LIST *l)
GWEN_STRINGLIST2_ITERATOR * GWEN_StringList2_First(const GWEN_STRINGLIST2 *l)
Definition: stringlist2.c:406
GWEN_STRINGLIST * GWEN_I18N_GetCurrentLocaleList(void)
Definition: i18n.c:235
const char * GWEN_XML_FindNameSpaceByName(GWEN_STRINGLIST2 *sl, const char *s)
Definition: xml.c:1361
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_Next(const GWEN_XMLNODE_NAMESPACE *element)
GWEN_XMLPROPERTY * GWEN_XMLProperty_dup(const GWEN_XMLPROPERTY *p)
Definition: xml.c:96
GWEN_XMLNODE_LIST * GWEN_XMLNode_List_new()
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
Definition: path.h:84
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
GWEN_XMLNODE_NAMESPACE_LIST * GWEN_XMLNode_NameSpace_List_new()
int GWEN_StringList2_AppendString(GWEN_STRINGLIST2 *sl2, const char *s, int take, GWEN_STRINGLIST2_INSERTMODE m)
Definition: stringlist2.c:188
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:148
GWEN_XMLNODE * GWEN_XMLNode_List_First(const GWEN_XMLNODE_LIST *l)
void GWEN_XMLProperty_add(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
Definition: xml.c:108
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:1014
GWEN_LIST_ITERATOR GWEN_STRINGLIST2_ITERATOR
Definition: stringlist2.h:44
#define GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES
Definition: xml.h:125
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_First(const GWEN_XMLNODE_NAMESPACE_LIST *l)
int GWEN_XMLNode_StripNamespaces(GWEN_XMLNODE *n)
Definition: xml.c:1715
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:398
void GWEN_XMLNode_SetIntValue(GWEN_XMLNODE *n, const char *name, int value)
Definition: xml.c:853
void GWEN_XMLNode_freeAll(GWEN_XMLNODE *n)
Definition: xml.c:166