struct _xml_id
{
+ char *name;
char *start;
size_t len;
- int fd;
+ size_t nlen;
};
static char *__xmlCopyNode(char *, size_t, const char *);
-static char *__xmlGetNode(const char *, size_t *, const char *, size_t *, int *);
-static char *__xmlGetNodePath(const char *, size_t *, const char *, size_t *);
+static char *__xmlGetNode(const char *, size_t *, char **, size_t *, int *);
+static char *__xmlGetNodePath(const char *, size_t *, char **, size_t *);
static char *__xmlSkipComment(const char *, size_t);
static char *__xmlSkipInfo(const char *, size_t);
fstat(fd, &statbuf);
- id->fd = fd;
+ id->nlen = (size_t)fd;
id->len = statbuf.st_size;
id->start = mmap(0, id->len, PROT_READ, MAP_PRIVATE, fd, 0L);
+ id->name = 0;
}
}
}
if (id)
{
struct _xml_id *xid = (struct _xml_id *)id;
+ assert(xid->name == 0);
+
munmap(xid->start, xid->len);
- close(xid->fd);
+ close((int)xid->nlen);
free(id);
id = 0;
}
if (id && path)
{
struct _xml_id *xid = (struct _xml_id *)id;
+ char *ptr, *node, *p;
size_t slen, len;
- char *ptr, *p;
+ node = path;
len = xid->len;
slen = strlen(path);
- ptr = __xmlGetNodePath(xid->start, &len, path, &slen);
+ ptr = __xmlGetNodePath(xid->start, &len, &node, &slen);
if (ptr)
{
xsid = malloc(sizeof(struct _xml_id) + len);
xsid->len = len;
xsid->start = p;
- xsid->fd = 0;
+ xsid->nlen = slen;
+ xsid->name = node;
memcpy(xsid->start, ptr, len);
}
{
struct _xml_id *xid = (struct _xml_id *)id;
size_t len, slen;
- char *ptr;
+ char *ptr, *node;
+ node = path;
len = xid->len;
slen = strlen(path);
- ptr = __xmlGetNodePath(xid->start, &len, path, &slen);
+ ptr = __xmlGetNodePath(xid->start, &len, &node, &slen);
if (ptr)
{
xsid = malloc(sizeof(struct _xml_id));
- xsid->len = len;
- xsid->start = ptr;
- xsid->fd = 0;
+ if (xsid)
+ {
+ xsid->len = len;
+ xsid->start = ptr;
+ xsid->nlen = slen;
+ xsid->name = node;
+ }
}
}
return (void *)xsid;
}
-const char *
+char *
+xmlGetNodeName(void *id)
+{
+ struct _xml_id *xid = (struct _xml_id *)id;
+ char *ret;
+
+ ret = malloc(xid->nlen+1);
+ if (ret)
+ {
+ memcpy(ret, xid->name, xid->nlen);
+ *(ret + xid->nlen) = 0;
+ }
+
+ return ret;
+}
+
+size_t
+xmlCopyNodeName(void *id, const char *buf, size_t len)
+{
+ struct _xml_id *xid = (struct _xml_id *)id;
+ size_t slen = 0;
+
+ if (buf)
+ {
+ slen = len-1;
+ if (slen > xid->nlen) slen = xid->nlen;
+ memcpy((char *)buf, xid->name, slen);
+ }
+}
+
+void *
xmlGetNodeNum(const void *rid, void *id, char *element, int num)
{
struct _xml_id *xrid = (struct _xml_id *)rid;
- const char *ret = 0;
+ void *ret = 0;
if (id && element)
{
struct _xml_id *xid = (struct _xml_id *)id;
size_t len, slen;
- char *ptr;
+ char *ptr, *node;
len = xrid->len;
slen = strlen(element);
- ptr = __xmlGetNode(xrid->start, &len, element, &slen, &num);
+ node = element;
+ ptr = __xmlGetNode(xrid->start, &len, &node, &slen, &num);
if (ptr)
{
xid->len = len;
xid->start = ptr;
- ret = element;
+ xid->name = node;
+ xid->nlen = slen;
+ ret = xid;
}
}
if (xid && xid->len && path && s && (strlen(s) > 0))
{
- char *str, *ps, *pe;
+ char *node, *str, *ps, *pe;
size_t len, slen;
len = xid->len;
slen = strlen(path);
- str = __xmlGetNodePath(xid->start, &len, path, &slen);
+ node = (char *)path;
+ str = __xmlGetNodePath(xid->start, &len, &node, &slen);
if (str)
{
ps = str;
char *ps, *pe, *pend;
int slen;
- slen = strlen(str);
ps = str;
+ slen = strlen(str);
pend = ps+slen;
pe = pend-1;
if (xid && xid->len)
{
- str = malloc(xid->len+1);
- if (str)
+ char *ps, *pe, *pend;
+ int nlen;
+
+ ps = xid->start;
+ nlen = xid->len;
+ pend = ps+nlen;
+ pe = pend;
+
+ while ((ps<pe) && isspace(*ps)) ps++;
+ while ((pe>ps) && isspace(*pe)) pe--;
+ nlen = (pe-ps);
+ if (nlen)
{
- char *ps, *pe, *pend;
- int slen;
+ str = malloc(nlen+1);
+ if (str)
+ {
+ memcpy(str, ps, nlen);
+ *(str+nlen) = 0;
+ }
+ }
+ }
- slen = xid->len;
- memcpy(str, xid->start, slen);
+ return str;
+}
- ps = str;
- pend = ps+slen;
- pe = pend-1;
- *pend = 0;
+size_t
+xmlCopyString(void *id, char *buf, size_t len)
+{
+ struct _xml_id *xid = (struct _xml_id *)id;
+ size_t nlen = 0;
- while ((ps<pe) && isspace(*ps)) ps++;
- while ((pe>ps) && isspace(*pe)) pe--;
+ if (xid && xid->len && buf && len)
+ {
+ char *ps, *pe, *pend;
+ int slen;
- if (pe<pend) *++pe = 0;
- slen = (pe-ps);
- if ((ps>str) && slen) memmove(str, ps, slen+1);
- else if (!slen) *str = 0;
+ nlen = len-1;
+ ps = xid->start;
+ slen = xid->len;
+ pend = ps+slen;
+ pe = pend;
+
+ while ((ps<pe) && isspace(*ps)) ps++;
+ while ((pe>ps) && isspace(*pe)) pe--;
+ nlen = (pe-ps);
+ if (nlen > slen) nlen = slen;
+
+ if (nlen)
+ {
+ memcpy(buf, ps, nlen);
+ *(buf+nlen) = 0;
}
}
- return str;
+ return nlen;
}
-unsigned int
-xmlCopyString(void *id, const char *path, char *buffer, unsigned int buflen)
+size_t
+xmlCopyNodeString(void *id, const char *path, char *buffer, size_t buflen)
{
struct _xml_id *xid = (struct _xml_id *)id;
- unsigned int len = 0;
+ size_t len = 0;
if (xid && xid->len && path && buffer && buflen)
{
+ char *str, *node;
size_t slen;
- char *str;
*buffer = 0;
len = xid->len;
slen = strlen(path);
- str = __xmlGetNodePath(xid->start, &len, path, &slen);
+ node = (char *)path;
+ str = __xmlGetNodePath(xid->start, &len, &node, &slen);
if (str)
{
char *ps, *pe;
if (path && xid && xid->len)
{
size_t len, slen;
- char *str;
+ char *str, *node;
len = xid->len;
slen = strlen(path);
- str = __xmlGetNodePath(xid->start, &len, path, &slen);
+ node = (char *)path;
+ str = __xmlGetNodePath(xid->start, &len, &node, &slen);
if (str)
{
char *end = str+len;
if (path && xid && xid->len)
{
size_t len, slen;
- char *str;
+ char *str, *node;
len = xid->len;
slen = strlen(path);
- str = __xmlGetNodePath(xid->start, &len, path, &slen);
+ node = (char *)path;
+ str = __xmlGetNodePath(xid->start, &len, &node, &slen);
if (str)
{
char *end = str+len;
pathname = strchr(nodename, '/');
if (pathname)
{
+ char *node;
+
len = xid->len;
pathname++;
slen -= pathname-nodename;
- p = __xmlGetNodePath(xid->start, &len, pathname, &slen);
+ node = pathname;
+ p = __xmlGetNodePath(xid->start, &len, &node, &slen);
}
else
{
len = xid->len;
}
- if (p) __xmlGetNode(p, &len, nodename, &slen, &num);
+ if (p)
+ {
+ char *node = nodename;
+ __xmlGetNode(p, &len, &node, &slen, &num);
+ }
}
return num;
if (xmid)
{
memcpy(xmid, id, sizeof(struct _xml_id));
- xmid->fd = 0;
+ xmid->nlen = 0;
}
}
static char *
__xmlCopyNode(char *start, size_t len, const char *path)
{
- char *p, *ret = 0;
+ char *node, *p, *ret = 0;
size_t rlen, slen;
rlen = len;
slen = strlen(path);
- p = __xmlGetNodePath(start, &rlen, path, &slen);
+ node = (char *)path;
+ p = __xmlGetNodePath(start, &rlen, &node, &slen);
if (p && rlen)
{
ret = calloc(1, rlen+1);
}
char *
-__xmlGetNodePath(const char *start, size_t *len, const char *name, size_t *plen)
+__xmlGetNodePath(const char *start, size_t *len, char **name, size_t *plen)
{
char *node;
char *ret = 0;
assert (start != 0);
assert (len != 0);
assert (name != 0);
+ assert (*name != 0);
assert (plen != 0);
if ((*len == 0) || (*plen == 0) || (*plen > *len))
return 0;
- node = (char *)name;
- if (*name == '/') node++;
- if (node)
+ node = (char *)*name;
+ if (*node == '/') node++;
+ if (*node != 0)
{
size_t plen, slen;
char *path;
else plen = path++ - node;
num = 0;
- ret = __xmlGetNode(start, len, node, &plen, &num);
+ ret = __xmlGetNode(start, len, &node, &plen, &num);
if (ret && path)
{
- plen = slen - (path-node);
- ret = __xmlGetNodePath(ret, len, path, &plen);
+ plen = slen - (path - *name);
+ ret = __xmlGetNodePath(ret, len, &path, &plen);
}
+
+ *name = path;
}
return ret;
}
char *
-__xmlGetNode(const char *start, size_t *len, const char *name, size_t *rlen, int *nodenum)
+__xmlGetNode(const char *start, size_t *len, char **name, size_t *rlen, int *nodenum)
{
char *new, *cur, *ne, *ret = 0;
size_t restlen, elementlen;
assert (start != 0);
assert (len != 0);
assert (name != 0);
+ assert (*name != 0);
assert (rlen != 0);
assert (nodenum != 0);
continue;
}
- element = (char *)name;
+ element = (char *)*name;
elementlen = *rlen;
new = __xml_memncasecmp(cur, &restlen, &element, &elementlen);
if (new)
{
new = cur+elementlen;
if (new >= ne) return 0;
- element = (char *)name;
+ element = (char *)*name;
elementlen = *rlen;
}
cur = new;
if (*(cur+1) != '/') /* new node found */
{
+ char *node = "*";
size_t slen = restlen;
size_t nlen = 1;
int pos = -1;
- new = __xmlGetNode(cur, &slen, "*", &nlen, &pos);
+ new = __xmlGetNode(cur, &slen, &node, &nlen, &pos);
if (!new)
{
if (slen == restlen) return 0;
if (!strncasecmp(new+2, element, elementlen))
{
if (found == num) *len = new-ret;
+ *name = element;
found++;
}
if (new)
{
len -= new - cur;
- if ((len > 3) && (memcmp(cur, "-->", 3) == 0))
+ if ((len > 3) && (memcmp(new, "-->", 3) == 0))
{
new += 3;
len -= 3;
}
cur = new+1;
}
- else return 0;
+ else break;
}
while (new && (len > 2));
-
- if (!new || (len < 2)) return 0;
}
return new;
return rptr;
}
-#if 0
-void *
-__xml_memchr(const void *d, int c, size_t len)
-{
- char *s, *ret = 0;
- size_t i;
-
- s = (char *)d;
- for (i=0; i<len; i++)
- {
-#if 1
- printf("i: %u, len: %u\n", i, len);
-#endif
- if (s[i] == c)
- {
- ret = (char *)s + i;
- break;
- }
- }
-
- return (void *)ret;
-}
-#endif
-
#ifdef WIN32
/* Source:
* https://mollyrocket.com/forums/viewtopic.php?p=2529
*/
void *xmlCopyNode(void *, const char *);
+/**
+ * Return the name of this node.
+ * The returned string has to be freed by the calling program.
+ *
+ * @param xid XML-id
+ * @return a newly alocated string containing the node name.
+ */
+char *xmlGetNodeName(void *);
+
+/**
+ * Copy the name of this node in a pre-allocated buffer
+ *
+ * @param xid XML-id
+ * @param buffer the buffer to copy the string to
+ * @param buflen length of the destination buffer
+ * @return the length of the node name.
+ */
+size_t xmlCopyNodeName(void *, const char *, size_t);
+
/**
* Get the number of nodes with the same name from a specified xml path
*
* @param xid XML-id
* @param node name of the node to search for
* @param num specify which occurence to return
- * @return name of the node or NULL if unsuccessful
+ * @return XML-subsection-id for further processing or NULL if unsuccessful
*/
-const char *xmlGetNodeNum(const void *, void *, const char *, int);
+void *xmlGetNodeNum(const void *, void *, const char *, int);
/**
* Compare the value of this node to a reference string.
* @param buflen length of the destination buffer
* @return the length of the string
*/
-unsigned int xmlCopyNodeString(void *, const char *, char *, const unsigned int);
+size_t xmlCopyNodeString(void *, const char *, char *, size_t);
/**
* Get a string of characters from the current node
*/
char *xmlGetNodeString(void *, const char *);
+/**
+ * Get a string of characters from the current node
+ * This function has the advantage of not allocating its own return buffer,
+ * keeping the memory management to an absolute minimum but the disadvantage
+ * is that it's unreliable in multithread environments.
+ *
+ * @param xid XML-id
+ * @param buffer the buffer to copy the string to
+ * @param buflen length of the destination buffer
+ * @return the length of the string
+ */
+size_t xmlCopyString(void *, char *, size_t);
+
/**
* Compare the value of a node to a reference string.
* Comparing is done in a case insensitive way.