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