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;
857 GWEN_XMLNode_List_Clear(nn->children);
875 const char *defValue){
901 snprintf(numbuf,
sizeof(numbuf)-1,
"%d", value);
902 numbuf[
sizeof(numbuf)-1]=0;
924 if (1!=sscanf(p,
"%i", &res))
936 return n->properties;
968 if (!child || !parent || child==parent)
1049 if (ln2->parent==ln1)
1066 snprintf(idxbuf,
sizeof(idxbuf),
"[%d]", idx);
1067 idxbuf[
sizeof(idxbuf)-1]=0;
1096 "GWEN_PATH_FLAGS_VARIABLE not allowed for XPATH");
1107 if (strcasecmp(entry,
"..")==0) {
1110 else if (strcasecmp(entry,
".")==0 ||
1111 strcasecmp(entry,
"here()")==0) {
1118 (((flags & GWEN_PATH_FLAGS_VARIABLE) &&
1120 (!(flags & GWEN_PATH_FLAGS_VARIABLE) &&
1124 !(flags & GWEN_PATH_FLAGS_LAST) &&
1128 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
1135 "Can not create tag with index!=1 (%s)", entry);
1139 "Unconditionally creating tag \"%s\"", entry);
1156 (!(flags & GWEN_PATH_FLAGS_LAST) &&
1161 "Tag \"%s\" does not exist", entry);
1167 "Can not create tag with index!=1 (%s)", entry);
1171 "Tag \"%s\" not found, creating", entry);
1178 ((flags & GWEN_PATH_FLAGS_LAST) &&
1180 (!(flags & GWEN_PATH_FLAGS_LAST) &&
1206 return GWEN_XMLNode_List_First(n->headers);
1214 GWEN_XMLNode_List_Add(nh, n->headers);
1222 GWEN_XMLNode_List_Del(nh);
1229 GWEN_XMLNode_List_Clear(n->headers);
1236 return n->nameSpaces;
1246 ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1251 if (d && strcasecmp(d, s)==0)
1253 ns=GWEN_XMLNode_NameSpace_List_Next(ns);
1266 ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1271 if (d && strcasecmp(d, s)==0)
1273 ns=GWEN_XMLNode_NameSpace_List_Next(ns);
1331 if ((s==0 && p==t) || (s && strncasecmp(t, s, p-t)==0))
1358 if (strcasecmp(p, s)==0) {
1413 const char *currentNameSpace) {
1416 char *localNameSpace;
1426 if (strcasecmp(pr->name,
"xmlns")==0) {
1428 if (localNameSpace) {
1429 if (strcasecmp(pr->value, localNameSpace)==0) {
1440 else if (currentNameSpace) {
1441 if (strcasecmp(pr->value, currentNameSpace)==0) {
1458 else if (strncasecmp(pr->name,
"xmlns:", 6)==0) {
1462 prefix=strchr(pr->name,
':');
1474 if (strcasecmp(p, pr->value)!=0) {
1481 "Redefinition of namespace prefix \"%s\" in \"%s\"",
1505 localNameSpace?localNameSpace:
1522 const char *nspace) {
1530 p=strchr(n->data,
':');
1532 if (strncasecmp(n->data, prefix, p-n->data)==0) {
1543 p=strchr(pr->name,
':');
1545 if (strncasecmp(pr->name, prefix, p-pr->name)==0) {
1547 "Prefix \"%s\" used in attribute \"%s\" of tag \"%s\"",
1548 prefix, pr->name, n->data);
1554 "Prefix \"%s\" not used in attribute \"%s\" of tag \"%s\"",
1555 prefix, pr->name, n->data);
1564 p=strchr(n->data,
':');
1571 "No prefix, current namespace is used");
1598 const char *nspace) {
1638 if (strcasecmp(pr->name,
"xmlns")==0 ||
1639 strncasecmp(pr->name,
"xmlns:", 6)==0) {
1642 prefix=strchr(pr->name,
':');
1701 if (n->nameSpace==0) {
1704 p=strchr(n->data,
':');
1710 assert(n->nameSpace);
1711 memmove(n->nameSpace, n->data, len);
1712 n->nameSpace[len-1]=0;
1721 if (pp->nameSpace==0) {
1724 p=strchr(pp->name,
':');
1730 assert(pp->nameSpace);
1731 memmove(pp->nameSpace, pp->name, len);
1732 pp->nameSpace[len-1]=0;
1742 nn=GWEN_XMLNode_List_First(n->children);
1751 nn=GWEN_XMLNode_List_Next(nn);
1781 for (i=0; i<np->pos; i++) {
1782 p->nodes[i]=np->nodes[i];
1799 if (np->pos>=GWEN_XML_MAX_DEPTH) {
1805 for (i=0; i<np->pos; i++) {
1806 assert(np->nodes[i]!=n);
1808 np->nodes[np->pos++]=n;
1821 return np->nodes[--np->pos];
1832 for (i=0; i<np->pos; i++) {