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);
185 nn->nameSpace=strdup(n->nameSpace);
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;
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)
574 if (strcasecmp(tp->name, sp->name)==0) {
666 const char *pvalue) {
698 const char *pvalue) {
715 const char *pvalue) {
731 const char *defValue) {
764 const char *defValue) {
785 if (dn->data && *(dn->data))
846 if (1!=sscanf(p,
"%i", &res))
858 snprintf(numbuf,
sizeof(numbuf)-1,
"%d", value);
859 numbuf[
sizeof(numbuf)-1]=0;
894 const char *defValue) {
920 snprintf(numbuf,
sizeof(numbuf)-1,
"%d", value);
921 numbuf[
sizeof(numbuf)-1]=0;
943 if (1!=sscanf(p,
"%i", &res))
955 return n->properties;
987 if (!child || !parent || child==parent)
1068 if (ln2->parent==ln1)
1085 snprintf(idxbuf,
sizeof(idxbuf),
"[%d]", idx);
1086 idxbuf[
sizeof(idxbuf)-1]=0;
1115 "GWEN_PATH_FLAGS_VARIABLE not allowed for XPATH");
1126 if (strcasecmp(entry,
"..")==0) {
1129 else if (strcasecmp(entry,
".")==0 ||
1130 strcasecmp(entry,
"here()")==0) {
1137 (((flags & GWEN_PATH_FLAGS_VARIABLE) &&
1139 (!(flags & GWEN_PATH_FLAGS_VARIABLE) &&
1143 !(flags & GWEN_PATH_FLAGS_LAST) &&
1147 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
1154 "Can not create tag with index!=1 (%s)", entry);
1158 "Unconditionally creating tag \"%s\"", entry);
1175 (!(flags & GWEN_PATH_FLAGS_LAST) &&
1180 "Tag \"%s\" does not exist", entry);
1186 "Can not create tag with index!=1 (%s)", entry);
1190 "Tag \"%s\" not found, creating", entry);
1197 ((flags & GWEN_PATH_FLAGS_LAST) &&
1199 (!(flags & GWEN_PATH_FLAGS_LAST) &&
1255 return n->nameSpaces;
1270 if (d && strcasecmp(d, s)==0)
1290 if (d && strcasecmp(d, s)==0)
1350 if ((s==0 && p==t) || (s && strncasecmp(t, s, p-t)==0))
1377 if (strcasecmp(p, s)==0) {
1432 const char *currentNameSpace) {
1435 char *localNameSpace;
1445 if (strcasecmp(pr->name,
"xmlns")==0) {
1447 if (localNameSpace) {
1448 if (strcasecmp(pr->value, localNameSpace)==0) {
1459 else if (currentNameSpace) {
1460 if (strcasecmp(pr->value, currentNameSpace)==0) {
1477 else if (strncasecmp(pr->name,
"xmlns:", 6)==0) {
1481 prefix=strchr(pr->name,
':');
1493 if (strcasecmp(p, pr->value)!=0) {
1500 "Redefinition of namespace prefix \"%s\" in \"%s\"",
1524 localNameSpace?localNameSpace:
1541 const char *nspace) {
1549 p=strchr(n->data,
':');
1551 if (strncasecmp(n->data, prefix, p-n->data)==0) {
1562 p=strchr(pr->name,
':');
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);
1573 "Prefix \"%s\" not used in attribute \"%s\" of tag \"%s\"",
1574 prefix, pr->name, n->data);
1583 p=strchr(n->data,
':');
1590 "No prefix, current namespace is used");
1617 const char *nspace) {
1657 if (strcasecmp(pr->name,
"xmlns")==0 ||
1658 strncasecmp(pr->name,
"xmlns:", 6)==0) {
1661 prefix=strchr(pr->name,
':');
1720 if (n->nameSpace==0) {
1723 p=strchr(n->data,
':');
1729 assert(n->nameSpace);
1730 memmove(n->nameSpace, n->data, len);
1731 n->nameSpace[len-1]=0;
1740 if (pp->nameSpace==0) {
1743 p=strchr(pp->name,
':');
1749 assert(pp->nameSpace);
1750 memmove(pp->nameSpace, pp->name, len);
1751 pp->nameSpace[len-1]=0;
1800 for (i=0; i<np->pos; i++) {
1801 p->nodes[i]=np->nodes[i];
1818 if (np->pos>=GWEN_XML_MAX_DEPTH) {
1824 for (i=0; i<np->pos; i++) {
1825 assert(np->nodes[i]!=n);
1827 np->nodes[np->pos++]=n;
1840 return np->nodes[--np->pos];
1851 for (i=0; i<np->pos; i++) {
GWEN_XMLNODE * GWEN_XMLNode_GetHeader(const GWEN_XMLNODE *n)
uint32_t GWEN_XMLNode_GetUsage(const GWEN_XMLNODE *n)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
int GWEN_Buffer_InsertString(GWEN_BUFFER *bf, const char *buffer)
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
const char * GWEN_XML_FindNameSpace(GWEN_STRINGLIST2 *sl, const char *prefix, const char *name)
GWEN_XMLNODE_NAMESPACE_LIST * GWEN_XMLNode_GetNameSpaces(const GWEN_XMLNODE *n)
#define GWEN_ERROR_INVALID
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
const char * GWEN_XMLNode_NameSpace_GetName(const GWEN_XMLNODE_NAMESPACE *ns)
GWEN_XMLNODE * GWEN_XMLNode_GetNextData(const GWEN_XMLNODE *n)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_FindNameSpaceByName(const GWEN_XMLNODE *n, const char *s)
int GWEN_XML_AddNameSpace(GWEN_STRINGLIST2 *sl, const char *prefix, const char *name)
void GWEN_XMLProperty_freeAll(GWEN_XMLPROPERTY *p)
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
char * GWEN_Memory_strdup(const char *s)
int GWEN_XMLNode__SetNameSpaces(GWEN_XMLNODE *n, const char *prefix, const char *nspace)
#define DBG_NOTICE(dbg_logger, format, args...)
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
struct GWEN__XMLPROPERTY GWEN_XMLPROPERTY
const char * GWEN_XMLNode_NameSpace_GetUrl(const GWEN_XMLNODE_NAMESPACE *ns)
#define GWEN_FREE_OBJECT(varname)
void GWEN_Memory_dealloc(void *p)
#define GWEN_PATH_FLAGS_CREATE_GROUP
GWEN_XMLNODE * GWEN_XMLNode_GetFirstOfType(const GWEN_XMLNODE *n, GWEN_XMLNODE_TYPE t)
#define DBG_VERBOUS(dbg_logger, format, args...)
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
void GWEN_XMLNode_Path_Dump(GWEN_XMLNODE_PATH *np)
void GWEN_XMLNode_Dump(const GWEN_XMLNODE *n, int ind)
#define DBG_WARN(dbg_logger, format, args...)
GWEN_XMLNODE * GWEN_XMLNode_FindTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
int GWEN_XMLNode_IsChildOf(const GWEN_XMLNODE *parent, const GWEN_XMLNODE *child)
void GWEN_XMLNode_RemoveChildren(GWEN_XMLNODE *n)
void GWEN_XMLNode_SetCharValue(GWEN_XMLNODE *n, const char *name, const char *value)
struct GWEN_XMLNODE_PATH GWEN_XMLNODE_PATH
void GWEN_XMLNode_AddNameSpace(GWEN_XMLNODE *n, const GWEN_XMLNODE_NAMESPACE *ns)
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
int GWEN_Buffer_ReserveBytes(GWEN_BUFFER *bf, uint32_t res)
void GWEN_XMLNode_NameSpace_free(GWEN_XMLNODE_NAMESPACE *ns)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
void GWEN_XMLNode_CopyProperties(GWEN_XMLNODE *tn, const GWEN_XMLNODE *sn, int overwrite)
void GWEN_XMLNode_SetData(GWEN_XMLNODE *n, const char *data)
GWEN_XMLPROPERTY * GWEN_XMLNode_GetFirstProperty(const GWEN_XMLNODE *n)
#define GWEN_LIST_DEL(typ, sr, head)
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
const char * GWEN_StringList2Iterator_Data(GWEN_STRINGLIST2_ITERATOR *li)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_new(const char *name, const char *url)
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
int GWEN_XMLNode_GetIntValue(const GWEN_XMLNODE *n, const char *name, int defValue)
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
#define GWEN_PATH_FLAGS_LAST
const char * GWEN_XML_FindNameSpaceByPrefix(GWEN_STRINGLIST2 *sl, const char *s)
#define GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_FindNameSpaceByUrl(const GWEN_XMLNODE *n, const char *s)
#define GWEN_PATH_FLAGS_ROOT
void GWEN_XMLNode_DelHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
void GWEN_XMLProperty_insert(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
#define GWEN_NEW_OBJECT(typ, varname)
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
GWEN_XMLNODE_TYPE GWEN_XMLNode_GetType(const GWEN_XMLNODE *n)
GWEN_XMLNODE_PATH * GWEN_XMLNode_Path_new(void)
const char * GWEN_StringList2Iterator_Next(GWEN_STRINGLIST2_ITERATOR *li)
const char * GWEN_XMLNode_GetCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
GWEN_XMLPROPERTY * GWEN_XMLNode_GetNextProperty(const GWEN_XMLNODE *n, const GWEN_XMLPROPERTY *pr)
int GWEN_XMLNode_SetIntValueByPath(GWEN_XMLNODE *n, uint32_t flags, const char *name, int value)
int GWEN_XMLNode__CheckAndSetNameSpace(GWEN_XMLNODE *n, const char *prefix, const char *nspace)
#define DBG_DEBUG(dbg_logger, format, args...)
int GWEN_Buffer_AppendBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
int GWEN_XMLNode__CheckNameSpaceDecls3(GWEN_XMLNODE *n)
GWEN_XMLPROPERTY * GWEN_XMLProperty_new(const char *name, const char *value)
void GWEN_StringList2_free(GWEN_STRINGLIST2 *sl2)
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
const char * GWEN_XMLNode_GetNamespace(const GWEN_XMLNODE *n)
int GWEN_Buffer_InsertByte(GWEN_BUFFER *bf, char c)
#define GWEN_PATH_FLAGS_VARIABLE
void * GWEN_Memory_malloc(size_t wsize)
GWEN_XMLNODE * GWEN_XMLNode_Path_Surface(GWEN_XMLNODE_PATH *np)
GWEN_XMLNODE * GWEN_XMLNode_GetNodeByXPath(GWEN_XMLNODE *n, const char *path, uint32_t flags)
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
GWEN_XMLNODE * GWEN_XMLNode_FindNode(const GWEN_XMLNODE *node, GWEN_XMLNODE_TYPE t, const char *data)
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
void GWEN_XMLNode_SetNamespace(GWEN_XMLNODE *n, const char *s)
GWEN_XMLNODE * GWEN_XMLNode_List_Next(const GWEN_XMLNODE *element)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
void * GWEN_XMLNode_HandlePath(const char *entry, void *data, int idx, uint32_t flags)
void GWEN_XMLNode_List_Del(GWEN_XMLNODE *element)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
GWEN_LIST2_FUNCTIONS(TYPEMAKER2_TYPE, Typemaker2_Type)
GWEN_XMLNODE * GWEN_XMLNode_GetParent(const GWEN_XMLNODE *n)
void GWEN_XMLNode_DecUsage(GWEN_XMLNODE *n)
int GWEN_XMLNode_GetXPath(const GWEN_XMLNODE *n1, const GWEN_XMLNODE *n2, GWEN_BUFFER *nbuf)
#define GWEN_PATH_FLAGS_PATHCREATE
#define GWEN_PATH_FLAGS_CREATE_VAR
void GWEN_XMLNode_SetIntProperty(GWEN_XMLNODE *n, const char *name, int value)
#define GWEN_PATH_FLAGS_PATHMUSTNOTEXIST
void GWEN_XMLNode_NameSpace_List_free(GWEN_XMLNODE_NAMESPACE_LIST *l)
#define GWEN_LIST_INSERT(typ, sr, head)
#define DBG_ERROR(dbg_logger, format, args...)
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
int GWEN_XMLNode_SetCharValueByPath(GWEN_XMLNODE *n, uint32_t flags, const char *name, const char *value)
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_dup(const GWEN_XMLNODE_NAMESPACE *ns)
const char * GWEN_XMLNode_GetLocalizedCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
struct GWEN_STRINGLIST2 GWEN_STRINGLIST2
void GWEN_XMLProperty_del(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
void GWEN_XMLNode__SetProperty(GWEN_XMLNODE *n, const char *name, const char *value, int doInsert)
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
GWEN_XMLNODE * GWEN_XMLNode_GetNextOfType(const GWEN_XMLNODE *n, GWEN_XMLNODE_TYPE t)
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
GWEN_XMLNODE_PATH * GWEN_XMLNode_Path_dup(const GWEN_XMLNODE_PATH *np)
void GWEN_XMLNode_List_Add(GWEN_XMLNODE *element, GWEN_XMLNODE_LIST *list)
#define GWEN_PATH_FLAGS_PATHMUSTEXIST
GWEN_STRINGLIST2 * GWEN_StringList2_new(void)
GWEN_XMLNODE * GWEN_XMLNode_dup(const GWEN_XMLNODE *n)
void GWEN_XMLNode_List_free(GWEN_XMLNODE_LIST *l)
int GWEN_XMLNode__CheckNameSpaceDecls1(GWEN_XMLNODE *n, GWEN_STRINGLIST2 *sl, const char *currentNameSpace)
#define DBG_INFO(dbg_logger, format, args...)
int GWEN_XMLNode_Path_Dive(GWEN_XMLNODE_PATH *np, GWEN_XMLNODE *n)
void GWEN_StringList2Iterator_free(GWEN_STRINGLIST2_ITERATOR *li)
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)
#define GWEN_LIST_INIT(t, element)
const char * GWEN_XMLProperty_GetName(const GWEN_XMLPROPERTY *pr)
int GWEN_XMLNode_NormalizeNameSpaces(GWEN_XMLNODE *n)
void GWEN_XMLNode_ClearHeaders(GWEN_XMLNODE *n)
const char * GWEN_XMLNode_GetCharValueByPath(GWEN_XMLNODE *n, const char *name, const char *defValue)
void GWEN_XMLNode_AddChildrenOnly(GWEN_XMLNODE *n, GWEN_XMLNODE *nn, int copythem)
void GWEN_XMLNode_Path_free(GWEN_XMLNODE_PATH *np)
const char * GWEN_XMLProperty_GetValue(const GWEN_XMLPROPERTY *pr)
#define GWEN_LIST_ADD(typ, sr, head)
#define GWEN_LIST_FUNCTIONS(t, pr)
void * GWEN_Path_HandleWithIdx(const char *path, void *data, uint32_t flags, GWEN_PATHIDXHANDLERPTR elementFunction)
void GWEN_XMLNode_IncUsage(GWEN_XMLNODE *n)
void GWEN_XMLProperty_free(GWEN_XMLPROPERTY *p)
void GWEN_XMLNode_List_Clear(GWEN_XMLNODE_LIST *l)
GWEN_STRINGLIST2_ITERATOR * GWEN_StringList2_First(const GWEN_STRINGLIST2 *l)
GWEN_STRINGLIST * GWEN_I18N_GetCurrentLocaleList(void)
const char * GWEN_XML_FindNameSpaceByName(GWEN_STRINGLIST2 *sl, const char *s)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_Next(const GWEN_XMLNODE_NAMESPACE *element)
GWEN_XMLPROPERTY * GWEN_XMLProperty_dup(const GWEN_XMLPROPERTY *p)
GWEN_XMLNODE_LIST * GWEN_XMLNode_List_new()
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
#define GWEN_LIST_FINI(t, element)
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)
struct GWEN__XMLNODE GWEN_XMLNODE
GWEN_XMLNODE * GWEN_XMLNode_List_First(const GWEN_XMLNODE_LIST *l)
void GWEN_XMLProperty_add(GWEN_XMLPROPERTY *p, GWEN_XMLPROPERTY **head)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
GWEN_LIST_ITERATOR GWEN_STRINGLIST2_ITERATOR
#define GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_List_First(const GWEN_XMLNODE_NAMESPACE_LIST *l)
int GWEN_XMLNode_StripNamespaces(GWEN_XMLNODE *n)
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
void GWEN_XMLNode_SetIntValue(GWEN_XMLNODE *n, const char *name, int value)
void GWEN_XMLNode_freeAll(GWEN_XMLNODE *n)