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)
251 const char *name,
const char *value,
258 if (strcasecmp(p->name, name)==0)
282 const char *name,
const char *value){
350 return GWEN_XMLNode_List_First(n->children);
362 GWEN_XMLNode_List_Add(child, n->children);
401 return GWEN_XMLNode_List_Next(n);
414 fprintf(stderr,
" ");
419 fprintf(stderr,
"<%s", n->data);
421 fprintf(stderr,
"<UNKNOWN");
425 fprintf(stderr,
" %s=\"%s\"", p->name, p->value);
427 fprintf(stderr,
" %s", p->name);
432 if (n->data[0]==
'?') {
434 fprintf(stderr,
"?");
436 else if (n->data[0]==
'!') {
441 fprintf(stderr,
">\n");
449 fprintf(stderr,
" ");
451 fprintf(stderr,
"</%s>\n", n->data);
453 fprintf(stderr,
"</UNKNOWN>\n");
458 fprintf(stderr,
"%s\n", n->data);
462 fprintf(stderr,
"<!--");
464 fprintf(stderr,
"%s", n->data);
466 fprintf(stderr,
"-->\n");
486 if (strcasecmp(n->data, data)==0)
504 GWEN_XMLNode_List_Del(child);
512 GWEN_XMLNode_List_Clear(n->children);
536 if (strcasecmp(tp->name, sp->name)==0) {
693 const char *defValue) {
715 const char *defValue) {
736 if (dn->data && *(dn->data))
789 if (1!=sscanf(p,
"%i", &res))
801 snprintf(numbuf,
sizeof(numbuf)-1,
"%d", value);
802 numbuf[
sizeof(numbuf)-1]=0;
810 return n->properties;
842 if (!child || !parent || child==parent)
923 if (ln2->parent==ln1)
940 snprintf(idxbuf,
sizeof(idxbuf),
"[%d]", idx);
941 idxbuf[
sizeof(idxbuf)-1]=0;
970 "GWEN_PATH_FLAGS_VARIABLE not allowed for XPATH");
981 if (strcasecmp(entry,
"..")==0) {
984 else if (strcasecmp(entry,
".")==0 ||
985 strcasecmp(entry,
"here()")==0) {
992 (((flags & GWEN_PATH_FLAGS_VARIABLE) &&
994 (!(flags & GWEN_PATH_FLAGS_VARIABLE) &&
998 !(flags & GWEN_PATH_FLAGS_LAST) &&
1002 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
1009 "Can not create tag with index!=1 (%s)", entry);
1013 "Unconditionally creating tag \"%s\"", entry);
1030 (!(flags & GWEN_PATH_FLAGS_LAST) &&
1035 "Tag \"%s\" does not exist", entry);
1041 "Can not create tag with index!=1 (%s)", entry);
1045 "Tag \"%s\" not found, creating", entry);
1052 ((flags & GWEN_PATH_FLAGS_LAST) &&
1054 (!(flags & GWEN_PATH_FLAGS_LAST) &&
1080 return GWEN_XMLNode_List_First(n->headers);
1088 GWEN_XMLNode_List_Add(nh, n->headers);
1096 GWEN_XMLNode_List_Del(nh);
1103 GWEN_XMLNode_List_Clear(n->headers);
1110 return n->nameSpaces;
1120 ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1125 if (d && strcasecmp(d, s)==0)
1127 ns=GWEN_XMLNode_NameSpace_List_Next(ns);
1140 ns=GWEN_XMLNode_NameSpace_List_First(n->nameSpaces);
1145 if (d && strcasecmp(d, s)==0)
1147 ns=GWEN_XMLNode_NameSpace_List_Next(ns);
1205 if ((s==0 && p==t) || (s && strncasecmp(t, s, p-t)==0))
1232 if (strcasecmp(p, s)==0) {
1287 const char *currentNameSpace) {
1290 char *localNameSpace;
1300 if (strcasecmp(pr->name,
"xmlns")==0) {
1302 if (localNameSpace) {
1303 if (strcasecmp(pr->value, localNameSpace)==0) {
1314 else if (currentNameSpace) {
1315 if (strcasecmp(pr->value, currentNameSpace)==0) {
1332 else if (strncasecmp(pr->name,
"xmlns:", 6)==0) {
1336 prefix=strchr(pr->name,
':');
1348 if (strcasecmp(p, pr->value)!=0) {
1355 "Redefinition of namespace prefix \"%s\" in \"%s\"",
1379 localNameSpace?localNameSpace:
1396 const char *nspace) {
1404 p=strchr(n->data,
':');
1406 if (strncasecmp(n->data, prefix, p-n->data)==0) {
1417 p=strchr(pr->name,
':');
1419 if (strncasecmp(pr->name, prefix, p-pr->name)==0) {
1421 "Prefix \"%s\" used in attribute \"%s\" of tag \"%s\"",
1422 prefix, pr->name, n->data);
1428 "Prefix \"%s\" not used in attribute \"%s\" of tag \"%s\"",
1429 prefix, pr->name, n->data);
1438 p=strchr(n->data,
':');
1445 "No prefix, current namespace is used");
1472 const char *nspace) {
1512 if (strcasecmp(pr->name,
"xmlns")==0 ||
1513 strncasecmp(pr->name,
"xmlns:", 6)==0) {
1516 prefix=strchr(pr->name,
':');
1575 if (n->nameSpace==0) {
1578 p=strchr(n->data,
':');
1584 assert(n->nameSpace);
1585 memmove(n->nameSpace, n->data, len);
1586 n->nameSpace[len-1]=0;
1595 if (pp->nameSpace==0) {
1598 p=strchr(pp->name,
':');
1604 assert(pp->nameSpace);
1605 memmove(pp->nameSpace, pp->name, len);
1606 pp->nameSpace[len-1]=0;
1616 nn=GWEN_XMLNode_List_First(n->children);
1625 nn=GWEN_XMLNode_List_Next(nn);
1655 for (i=0; i<np->pos; i++) {
1656 p->nodes[i]=np->nodes[i];
1673 if (np->pos>=GWEN_XML_MAX_DEPTH) {
1679 for (i=0; i<np->pos; i++) {
1680 assert(np->nodes[i]!=n);
1682 np->nodes[np->pos++]=n;
1695 return np->nodes[--np->pos];
1706 for (i=0; i<np->pos; i++) {