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 104 pp->nameSpace=strdup(p->nameSpace);
196 nn->nameSpace=strdup(n->nameSpace);
240 const char *defaultValue)
249 if (strcasecmp(p->name, name)==0)
273 if (strcasecmp(p->name, name)==0)
282 if (1==sscanf(p->value,
"%i", &i))
291 const char *name,
const char *value,
299 if (strcasecmp(p->name, name)==0)
323 const char *name,
const char *value)
331 const char *name,
int value)
335 snprintf(numbuf,
sizeof(numbuf)-1,
"%i", value);
336 numbuf[
sizeof(numbuf)-1]=0;
481 for (i=0; i<ind; i++)
482 fprintf(stderr,
" ");
487 fprintf(stderr,
"<%s", n->data);
489 fprintf(stderr,
"<UNKNOWN");
493 fprintf(stderr,
" %s=\"%s\"", p->name, p->value);
495 fprintf(stderr,
" %s", p->name);
500 if (n->data[0]==
'?') {
502 fprintf(stderr,
"?");
504 else if (n->data[0]==
'!') {
509 fprintf(stderr,
">\n");
516 for (i=0; i<ind; i++)
517 fprintf(stderr,
" ");
519 fprintf(stderr,
"</%s>\n", n->data);
521 fprintf(stderr,
"</UNKNOWN>\n");
526 fprintf(stderr,
"%s\n", n->data);
530 fprintf(stderr,
"<!--");
532 fprintf(stderr,
"%s", n->data);
534 fprintf(stderr,
"-->\n");
555 if (strcasecmp(n->data, data)==0)
608 if (strcasecmp(tp->name, sp->name)==0) {
653 "Error expanding value for property \"%s\": [%s] (%d)",
654 (sp->name)?(sp->name):
"<no name>",
655 (sp->value)?(sp->value):
"<no value>",
814 const char *defValue)
848 const char *defValue)
870 if (dn->data && *(dn->data))
933 if (1!=sscanf(p,
"%i", &res))
946 snprintf(numbuf,
sizeof(numbuf)-1,
"%d", value);
947 numbuf[
sizeof(numbuf)-1]=0;
983 const char *defValue)
1011 snprintf(numbuf,
sizeof(numbuf)-1,
"%d", value);
1012 numbuf[
sizeof(numbuf)-1]=0;
1035 if (1!=sscanf(p,
"%i", &res))
1048 return n->properties;
1084 if (!child || !parent || child==parent)
1166 if (ln2->parent==ln1)
1183 snprintf(idxbuf,
sizeof(idxbuf),
"[%d]", idx);
1184 idxbuf[
sizeof(idxbuf)-1]=0;
1214 "GWEN_PATH_FLAGS_VARIABLE not allowed for XPATH");
1225 if (strcasecmp(entry,
"..")==0) {
1228 else if (strcasecmp(entry,
".")==0 ||
1229 strcasecmp(entry,
"here()")==0) {
1253 "Can not create tag with index!=1 (%s)", entry);
1257 "Unconditionally creating tag \"%s\"", entry);
1279 "Tag \"%s\" does not exist", entry);
1285 "Can not create tag with index!=1 (%s)", entry);
1289 "Tag \"%s\" not found, creating", entry);
1360 return n->nameSpaces;
1376 if (d && strcasecmp(d, s)==0)
1397 if (d && strcasecmp(d, s)==0)
1460 if ((s==0 && p==t) || (s && strncasecmp(t, s, p-t)==0))
1488 if (strcasecmp(p, s)==0) {
1544 const char *currentNameSpace)
1548 char *localNameSpace;
1558 if (strcasecmp(pr->name,
"xmlns")==0) {
1560 if (localNameSpace) {
1561 if (strcasecmp(pr->value, localNameSpace)==0) {
1572 else if (currentNameSpace) {
1573 if (strcasecmp(pr->value, currentNameSpace)==0) {
1590 else if (strncasecmp(pr->name,
"xmlns:", 6)==0) {
1594 prefix=strchr(pr->name,
':');
1606 if (strcasecmp(p, pr->value)!=0) {
1613 "Redefinition of namespace prefix \"%s\" in \"%s\"",
1637 localNameSpace?localNameSpace:
1663 p=strchr(n->data,
':');
1665 if (strncasecmp(n->data, prefix, p-n->data)==0) {
1676 p=strchr(pr->name,
':');
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);
1687 "Prefix \"%s\" not used in attribute \"%s\" of tag \"%s\"",
1688 prefix, pr->name, n->data);
1697 p=strchr(n->data,
':');
1704 "No prefix, current namespace is used");
1773 if (strcasecmp(pr->name,
"xmlns")==0 ||
1774 strncasecmp(pr->name,
"xmlns:", 6)==0) {
1777 prefix=strchr(pr->name,
':');
1838 if (n->nameSpace==0) {
1841 p=strchr(n->data,
':');
1847 assert(n->nameSpace);
1848 memmove(n->nameSpace, n->data, len);
1849 n->nameSpace[len-1]=0;
1858 if (pp->nameSpace==0) {
1861 p=strchr(pp->name,
':');
1867 assert(pp->nameSpace);
1868 memmove(pp->nameSpace, pp->name, len);
1869 pp->nameSpace[len-1]=0;
1920 for (i=0; i<np->pos; i++) {
1921 p->nodes[i]=np->nodes[i];
1940 if (np->pos>=GWEN_XML_MAX_DEPTH) {
1946 for (i=0; i<np->pos; i++) {
1947 assert(np->nodes[i]!=n);
1949 np->nodes[np->pos++]=n;
1963 return np->nodes[--np->pos];
1975 for (i=0; i<np->pos; i++) {
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
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)
#define GWEN_LIST2_FUNCTIONS(t, pr)
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)
struct GWEN_DB_NODE GWEN_DB_NODE
#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_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)
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
#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)