29 #define DISABLE_DEBUGLOG
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>
47 #include <sys/types.h>
48 #ifdef HAVE_SYS_STAT_H
49 # include <sys/stat.h>
60 #define GWEN_XML_BUFFERSIZE 512
101 pp->nameSpace=strdup(p->nameSpace);
143 n->children=GWEN_XMLNode_List_new();
144 n->headers=GWEN_XMLNode_List_new();
147 n->nameSpaces=GWEN_XMLNode_NameSpace_List_new();
158 GWEN_XMLNode_List_free(n->headers);
159 GWEN_XMLNode_List_free(n->children);
160 GWEN_XMLNode_NameSpace_List_free(n->nameSpaces);
170 next=GWEN_XMLNode_List_Next(n);
185 nn->nameSpace=strdup(n->nameSpace);
198 cn=GWEN_XMLNode_List_First(n->children);
206 cn=GWEN_XMLNode_List_First(n->headers);
214 nns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
219 GWEN_XMLNode_NameSpace_List_Add(nnns, nn->nameSpaces);
220 nns=GWEN_XMLNode_NameSpace_List_Next(nns);
229 const char *defaultValue){
237 if (strcasecmp(p->name, name)==0)
260 if (strcasecmp(p->name, name)==0)
269 if (1==sscanf(p->value,
"%i", &i))
278 const char *name,
const char *value,
285 if (strcasecmp(p->name, name)==0)
309 const char *name,
const char *value){
316 const char *name,
int value){
319 snprintf(numbuf,
sizeof(numbuf)-1,
"%i", value);
320 numbuf[
sizeof(numbuf)-1]=0;
388 return GWEN_XMLNode_List_First(n->children);
400 GWEN_XMLNode_List_Add(child, n->children);
439 return GWEN_XMLNode_List_Next(n);
452 fprintf(stderr,
" ");
457 fprintf(stderr,
"<%s", n->data);
459 fprintf(stderr,
"<UNKNOWN");
463 fprintf(stderr,
" %s=\"%s\"", p->name, p->value);
465 fprintf(stderr,
" %s", p->name);
470 if (n->data[0]==
'?') {
472 fprintf(stderr,
"?");
474 else if (n->data[0]==
'!') {
479 fprintf(stderr,
">\n");
487 fprintf(stderr,
" ");
489 fprintf(stderr,
"</%s>\n", n->data);
491 fprintf(stderr,
"</UNKNOWN>\n");
496 fprintf(stderr,
"%s\n", n->data);
500 fprintf(stderr,
"<!--");
502 fprintf(stderr,
"%s", n->data);
504 fprintf(stderr,
"-->\n");
524 if (strcasecmp(n->data, data)==0)
542 GWEN_XMLNode_List_Del(child);
550 GWEN_XMLNode_List_Clear(n->children);
574 if (strcasecmp(tp->name, sp->name)==0) {
731 const char *defValue) {
753 const char *defValue) {
774 if (dn->data && *(dn->data))
827 if (1!=sscanf(p,
"%i", &res))
839 snprintf(numbuf,
sizeof(numbuf)-1,
"%d", value);
840 numbuf[
sizeof(numbuf)-1]=0;
848 return n->properties;
880 if (!child || !parent || child==parent)
961 if (ln2->parent==ln1)
978 snprintf(idxbuf,
sizeof(idxbuf),
"[%d]", idx);
979 idxbuf[
sizeof(idxbuf)-1]=0;
1008 "GWEN_PATH_FLAGS_VARIABLE not allowed for XPATH");
1019 if (strcasecmp(entry,
"..")==0) {
1022 else if (strcasecmp(entry,
".")==0 ||
1023 strcasecmp(entry,
"here()")==0) {
1030 (((flags & GWEN_PATH_FLAGS_VARIABLE) &&
1032 (!(flags & GWEN_PATH_FLAGS_VARIABLE) &&
1036 !(flags & GWEN_PATH_FLAGS_LAST) &&
1040 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
1047 "Can not create tag with index!=1 (%s)", entry);
1051 "Unconditionally creating tag \"%s\"", entry);
1068 (!(flags & GWEN_PATH_FLAGS_LAST) &&
1073 "Tag \"%s\" does not exist", entry);
1079 "Can not create tag with index!=1 (%s)", entry);
1083 "Tag \"%s\" not found, creating", entry);
1090 ((flags & GWEN_PATH_FLAGS_LAST) &&
1092 (!(flags & GWEN_PATH_FLAGS_LAST) &&
1118 return GWEN_XMLNode_List_First(n->headers);
1126 GWEN_XMLNode_List_Add(nh, n->headers);
1134 GWEN_XMLNode_List_Del(nh);
1141 GWEN_XMLNode_List_Clear(n->headers);
1148 return n->nameSpaces;
1158 ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1163 if (d && strcasecmp(d, s)==0)
1165 ns=GWEN_XMLNode_NameSpace_List_Next(ns);
1178 ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1183 if (d && strcasecmp(d, s)==0)
1185 ns=GWEN_XMLNode_NameSpace_List_Next(ns);
1243 if ((s==0 && p==t) || (s && strncasecmp(t, s, p-t)==0))
1270 if (strcasecmp(p, s)==0) {
1325 const char *currentNameSpace) {
1328 char *localNameSpace;
1338 if (strcasecmp(pr->name,
"xmlns")==0) {
1340 if (localNameSpace) {
1341 if (strcasecmp(pr->value, localNameSpace)==0) {
1352 else if (currentNameSpace) {
1353 if (strcasecmp(pr->value, currentNameSpace)==0) {
1370 else if (strncasecmp(pr->name,
"xmlns:", 6)==0) {
1374 prefix=strchr(pr->name,
':');
1386 if (strcasecmp(p, pr->value)!=0) {
1393 "Redefinition of namespace prefix \"%s\" in \"%s\"",
1417 localNameSpace?localNameSpace:
1434 const char *nspace) {
1442 p=strchr(n->data,
':');
1444 if (strncasecmp(n->data, prefix, p-n->data)==0) {
1455 p=strchr(pr->name,
':');
1457 if (strncasecmp(pr->name, prefix, p-pr->name)==0) {
1459 "Prefix \"%s\" used in attribute \"%s\" of tag \"%s\"",
1460 prefix, pr->name, n->data);
1466 "Prefix \"%s\" not used in attribute \"%s\" of tag \"%s\"",
1467 prefix, pr->name, n->data);
1476 p=strchr(n->data,
':');
1483 "No prefix, current namespace is used");
1510 const char *nspace) {
1550 if (strcasecmp(pr->name,
"xmlns")==0 ||
1551 strncasecmp(pr->name,
"xmlns:", 6)==0) {
1554 prefix=strchr(pr->name,
':');
1613 if (n->nameSpace==0) {
1616 p=strchr(n->data,
':');
1622 assert(n->nameSpace);
1623 memmove(n->nameSpace, n->data, len);
1624 n->nameSpace[len-1]=0;
1633 if (pp->nameSpace==0) {
1636 p=strchr(pp->name,
':');
1642 assert(pp->nameSpace);
1643 memmove(pp->nameSpace, pp->name, len);
1644 pp->nameSpace[len-1]=0;
1654 nn=GWEN_XMLNode_List_First(n->children);
1663 nn=GWEN_XMLNode_List_Next(nn);
1693 for (i=0; i<np->pos; i++) {
1694 p->nodes[i]=np->nodes[i];
1711 if (np->pos>=GWEN_XML_MAX_DEPTH) {
1717 for (i=0; i<np->pos; i++) {
1718 assert(np->nodes[i]!=n);
1720 np->nodes[np->pos++]=n;
1733 return np->nodes[--np->pos];
1744 for (i=0; i<np->pos; i++) {