]> git.mxchange.org Git - flightgear.git/commitdiff
Point to the new location of the ZeroXML library that contains xmlgrep
authorErik Hofman <erik@ehofman.com>
Thu, 24 May 2012 18:24:21 +0000 (20:24 +0200)
committerErik Hofman <erik@ehofman.com>
Thu, 24 May 2012 18:24:21 +0000 (20:24 +0200)
utils/xmlgrep/ChangeLog [deleted file]
utils/xmlgrep/README
utils/xmlgrep/printtree.c [deleted file]
utils/xmlgrep/printxml.c [deleted file]
utils/xmlgrep/sample.xml [deleted file]
utils/xmlgrep/testxml.c [deleted file]
utils/xmlgrep/xml.c [deleted file]
utils/xmlgrep/xml.h [deleted file]
utils/xmlgrep/xml_cache.c [deleted file]
utils/xmlgrep/xml_cache.h [deleted file]
utils/xmlgrep/xmlgrep.c [deleted file]

diff --git a/utils/xmlgrep/ChangeLog b/utils/xmlgrep/ChangeLog
deleted file mode 100644 (file)
index 2f8e4c2..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-24-05-2009
-  * Add a node cache that can be enabled at compile time.
-    the node cache prevents recursively walking the xml tree over and over
-    again to find the specified nodes.
-
-05-05-2009
-  * Various bugfixes, required to get fgrun working
-  * add testxml as sort of a stress test application
-
-30-04-2009
-  * Add support for CDATA
-  * Fix an off by one problem.
-
-28-04-2009
-  * changes to the code to allow walking the xml-tree using "*" as a node name
-  * add printxml, an example utility that walks an xml-tree and prints it
-    contenst
-
-27-04-2009
-  * add xmlInitBuffer() for processing of a preallocated buffer
-  * add xmlErrorGetColumnNo to get the column number of the syntax error
-  * pass an error at a higher level to lower levels
-  * detect a number of extra syntax errors
-
-26-04-2009
-  * add support for comments inside xml-tags, e.g.: <test><!-- --></test>
-
-25-04-2009
-  * add support for self-contained tags like <test/>
-  * fix a problem if a file could not be mmaped
-  * add a few comments which hopefully makes the code easier to understand
-  * code cleanups
-
-20-04-2009
-  * fix a case where a single-element root path (e.g. "/printer") would not
-    pass xmlNodeGetPath
-  * fix a problem where attributes or elements starting with the same letter
-    sequence could give a false negative result
-  * Add a 'clear' attribute to the xmlErrorGet functions that indicates whether
-    the error should be cleared or not
-  * detect more xml syntax errors
-
-18-04-2009
-  * Make the code compiler correctly under windows
-  * Introduce a root-node that can hold extra information which is necessary
-    for thread safety under windows
-  * Add xmlErrorGetString, xmlErrorGetLineNo for syntax error detetction
-  * Add xmlErrGetNo for detection of, and clearing the last error
-
-16-04-2009
-  * Rename xmlGetNode functions to xmlNodeGet for better consistancy
-  * likewise for xmlCopyNode en xmlCompareNode
-  * add xmlAttributeGetDouble, xmlAttributeGetInt, xmlAttributeGetString
-    xmlAttributeCopyString and xmlAttributeCompareString functions
-  * fix some small bugs and problems along the way
-  * add support for filtering on attribute value in xmlgrep
-
-21-07-2008
-  * change a number of function parameters to const where appropriate
-  * fix a problem where the wrong node-name length was returned
-  * xmlgrep now also works when only the -e options is specified
-  * fix xmlgrep to show the correct node-name (it reported the parent
-    node-name in the previous version)
-
-20-07-2008
-  * fix __xmlSkipComment to properly find the end of comment tag.
-  * add the xmlGetNodeName and xmlCopyNodeName functions
-  * add the xmlCopyString function
-  * clean up some code
-
-19-07-2008
-  * rewrite the code to always recursively walk the node tree when searching
-    for a particular node. this is required for cases where a node with a
-    particular name is located deeper in a node with the same name;
-    for example -r /configuration/device/reference/device would fail in the 
-    previous verion
-  * rename xmlGetElement to xmlGetNodeNum and add the possibility to request
-    the nth node with this name
-  * rename xmlGetNumElements to xmlGetNumNodes
-
-06-07-2008
-  * reorganize the code to be able to skip comment sections
-  * depreciate __xmlFindNextElement and use __xmlGetNode instead
-  * xmlGetNextElement now returns char* instead of void* for furute use
-  * add preliminary support for wildcards in the search path ('*' and '?')
-
-01-07-2008
- * fix a problem caused by removing the last unnecessary alloc
- * strip leading-, and trailing spaces from the string before comparing
- * fix a problem where trailing spaces weren't removed
-
-30-06-2008:
- * some small changes; fix some typo's and fix a small memory leak
- * update the documentation in README
- * remove the last unnecessary alloc
-
-29-06-2008:
- * rename xmlGet(Int/Double/String) to xmlGetNode(Int/Double/String)
- * add new xmlGet(Int/Double/String) functions
- * rename xmlCompareString to xmlCompareNodeString for consistency
- * rename xmlCompareElement to xmlCompareString for consistency
- * add a README file with short examples of various functions
-
-27-06-2008:
- * removed some memory allocation in xmlGetNode and XMLGetNextElement
- * use the file-size for mmap and remove the root node from the xml-id
- * rearrange xmlGetNode to work with complicated xml files
- * add the xmlMarkId function to save the id before using xmlGetNextElement
- * speed up xmlGetNextId
-
-23-06-2008: Initial release
index 33294ffbd19c639ade5cfd71396839fe802c2e64..72ab606ea3d99dfc5998e07a12fb83f74b579994 100644 (file)
@@ -1,146 +1,6 @@
-This library is specially designed for reading xml configuration files and
-to be as low on memory management as possible. Modifying or writing xml files
-is not planned for the future. In most situations being able to gather data
-by reading an xml file is more than enough and the read-only decision
-provides a number of advantages over a one-size fits all approach. For isntance
-the memory footprint can be kept low and the library can be kept simple.
 
-To achieve these goals the mmap function is used to map the configuration file
-to a memory region. The only places where memory is allocated is when creating
-a new XML-id, when requesting a string from a node, when requestiong the node
-name or when a request is made to copy a node into a new memory region.
+The xmlgrep utility is part op the ZeroXML package which is now hosted at:
+http://www.adalin.com
 
-Using this library should be pretty simple for most tasks; just open a file,
-read every parameter one by one and close the id again.
-{
-   void *xid;
+Any further development will take place there.
 
-   xid = xmlOpen("/tmp/file.xml");
-   xpos = xmlNodeGetDouble(xid, "/configuration/x-pos");
-   ypos = xmlNodeGetDouble(xid, "/configuration/y-pos");
-   zpos = xmlNodeGetDouble(xid, "/configuration/z-pos");
-   xmlClose(xid);
-}
-
-While it is certainly possible to access every node directly by calling the
-xmlNodeGet(Int/Double/String) functions, when more than one node need to be
-gathered from a parent node it is advised to get the id of the parent node
-and work from there since the XML-id holds the boundaries of the (parent)node
-which limits the searching area resulting in improved searching speed.
-{
-   void *xnid;
-   char *s;
-
-   xnid = xmlNodeGet(id, "/configuration/setup/");
-   version = xmlNodeGetDouble(xnid, "version");
-   s = xmlNodeGetString(xnid, "author");
-   if (s) author = s;
-   free(s);
-   free(xnid);
-}
-
-Overview of the available functions:
- ----------------------------------------------------------------------------- 
-#
-# Functions to Open and Close the XML file
-# e.g.
-#   id = xmlOpen("/tmp/file.xml");
-#   xmlClose(id);
-#
-void *xmlOpen(const char *filename);
-void *xmlInitBuffer(const char *buffer, size_t size);
-void xmlClose(void *xid);
-
-#
-# Get the Id of a node at the specified path
-# e.g.
-#    xnid = xmlNodeGet(id, "/path/to/specified/node");
-#
-void *xmlNodeGet(const void *xid, const char *path);
-void *xmlNodeCopy(const void *xid, const char *path);
-
-#
-# Functions to walk the node tree and process them one by one.
-# e.g.
-#   xmid = xmlMarkId(id);
-#   num = xmlNodeGetNum(xmid, "node");
-#   for (i=0; i<num; i++) {
-#      if (xmlNodeGetPos(id, xmid, "element", i) != 0) {
-#         if ((s = xmlGetString(xmid)) != 0) {
-#            printf("%s\n", s);
-#            free(s);
-#         }
-#      }
-#   }
-#   free(xmid);
-#
-void *xmlMarkId(const void *xid);
-unsigned int xmlNodeGetNum(const void *xid, const char *path);
-void *xmlNodeGetPos(const void *pid, void *xid, const char *element, int pos);
-
-#
-# Get the name of the current node
-#
-char *xmlNodeGetName(const void *xid);
-size_t xmlNodeCopyName(const void *xid, const char *buffer, size_t size);
-
-#
-# These functions work on the current node.
-# e.g.
-#    xnid = xmlNodeGet(id, "/path/to/last/node");
-#    i = xmlGetInt(xnid);
-# or
-#    xnid = xmlNodeGet(id, "/path/to/specified/node");
-#    if (xmlCompareString(xnid, "value") == 0) printf("We have a match!\n");
-#
-long int xmlGetInt(const void *xid);
-double xmlGetDouble(const void *xid);
-char *xmlGetString(const void *xid);
-size_t xmlCopyString(const void *xid, char *buffer, const size_t size);
-int xmlCompareString(const void *xid, const char *str);
-
-#
-# These functions work on a specified node path
-# e.g.
-#    d = xmlNodeGetDouble(id, "/path/to/node");
-# or
-#    xnid = xmlNodeGet(id, "/path/to");
-#    i = xmlNodeGetInt(xnid, "node");
-#
-long int xmlNodeGetInt(const void *xid, const char *path);
-double xmlNodeGetDouble(const void *xid, const char *path);
-char *xmlNodeGetString(const void *xid, const char *path);
-size_t xmlNodeCopyString(const void *xid, const char *path,
-                            char *buffer, const size_t size);
-int xmlNodeCompareString(const void *xid, const char *path, const char *str);
-
-#
-# These functions work on a specified atribute
-# e.g.
-#    i = xmlAttributeGetInt(id, "n");
-#
-# or
-#    s = xmlAttributeGetString(id, "type");
-#    if (s) printf("node is of type '%s'\n", s);
-#    free(s);
-#
-long int xmlAttributeGetInt(const void *xid, const char *attr);
-double xmlAttributeGetDouble(const void *xid, const char *attr);
-char *xmlAttributeGetString(const void *xid, const char *attr);
-size_t xmlAttributeCopyString(const void *xid, const char *attr,
-                                 const char *buffer, size_t size);
-int xmlAttributeCompareString(const void *xid, const char *attr,
-                                 const char *str);
-
-#
-# Error detection and reporting functions
-#
-# char *err_str = xmlErrorGetString(id, 0);
-# size_t err_lineno = xmlErrorGetLineNo(id, 0);
-# int err = xmlErrorGetNo(id, 1); /* clear last error */
-# if (err) printf("Error #%i at line %u: '%s'\n", err, err_lineno, err_str);
-#
-int xmlErrorGetNo(const void *xid, int clear);
-size_t xmlErrorGetLineNo(const void *xid, int clear);
-size_t xmlErrorGetColumnNo(const void *xid, int clear);
-const char *xmlErrorGetString(const void *xid, int clear);
diff --git a/utils/xmlgrep/printtree.c b/utils/xmlgrep/printtree.c
deleted file mode 100644 (file)
index 6998b13..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-
-#include <stdio.h>
-#include <malloc.h>
-
-#include "xml.h"
-
-void print_xml(void *, char *, unsigned int);
-
-int main(int argc, char **argv)
-{
-  if (argc < 1)
-  {
-    printf("usage: printtree <filename>\n\n");
-  }
-  else
-  {
-    void *rid;
-
-    rid = xmlOpen(argv[1]);
-    if (xmlErrorGetNo(rid, 0) != XML_NO_ERROR)
-    {
-       printf("%s\n", xmlErrorGetString(rid, 1));
-    }
-    else if (rid)
-    {
-      unsigned int i, num;
-      void *xid;
-      xid = xmlMarkId(rid);
-      num = xmlNodeGetNum(xid, "*");
-      for (i=0; i<num; i++)
-      {
-        if (xmlNodeGetPos(rid, xid, "*", i) != 0)
-        {
-          char name[4096] = "";
-          print_xml(xid, (char *)&name, 0);
-        }
-      }
-      free(xid);
-
-      xmlClose(rid);
-    }
-    else
-    {
-      printf("Error while opening file for reading: '%s'\n", argv[1]);
-    }
-  }
-}
-
-void print_xml(void *id, char *name, unsigned int len)
-{
-  void *xid = xmlMarkId(id);
-  unsigned int i, num;
-  
-  num = xmlNodeGetNum(xid, "*");
-  if (num == 0)
-  {
-    char *s;
-    s = xmlGetString(xid);
-    if (s)
-    {
-      name[len] = 0;
-      printf("%s = %s\n", name, s);
-      free(s);
-    }
-  }
-  else
-  {
-    unsigned int i, q;
-
-    name[len++] = '/';
-    for (i=0; i<num; i++)
-    {
-      if (xmlNodeGetPos(id, xid, "*", i) != 0)
-      {
-        unsigned int res, i = 4096 - len;
-        res = xmlNodeCopyName(xid, (char *)&name[len], i);
-        if (res)
-        {
-          unsigned int index = xmlAttributeGetInt(xid, "n");
-          if (index)
-          {
-            unsigned int pos = len+res;
-
-            name[pos++] = '[';
-            i = snprintf((char *)&name[pos], 4096-pos, "%i", index);
-            name[pos+i] = ']';
-            res += i+2;
-          }
-        }
-        print_xml(xid, name, len+res);
-      }
-      else printf("error\n");
-    }
-  }
-}
diff --git a/utils/xmlgrep/printxml.c b/utils/xmlgrep/printxml.c
deleted file mode 100644 (file)
index 119c1a1..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-
-#include <stdio.h>
-#include <malloc.h>
-
-#include "xml.h"
-
-void print_xml(void *);
-
-int main(int argc, char **argv)
-{
-  if (argc < 1)
-  {
-    printf("usage: printxml <filename>\n\n");
-  }
-  else
-  {
-    void *rid;
-
-    rid = xmlOpen(argv[1]);
-    if (xmlErrorGetNo(rid, 0) != XML_NO_ERROR)
-    {
-       printf("%s\n", xmlErrorGetString(rid, 1));
-    }
-    else if (rid)
-    {
-      unsigned int i, num;
-      void *xid;
-      xid = xmlMarkId(rid);
-      num = xmlNodeGetNum(xid, "*");
-      for (i=0; i<num; i++)
-      {
-        if (xmlNodeGetPos(rid, xid, "*", i) != 0)
-        {
-          char name[256];
-          xmlNodeCopyName(xid, (char *)&name, 256);
-          printf("<%s>\n", name);
-          print_xml(xid);
-          printf("\n</%s>\n", name);
-        }
-      }
-      free(xid);
-
-      xmlClose(rid);
-    }
-    else
-    {
-      printf("Error while opening file for reading: '%s'\n", argv[1]);
-    }
-  }
-}
-
-void print_xml(void *id)
-{
-  static int level = 1;
-  void *xid = xmlMarkId(id);
-  unsigned int i, num;
-  
-  num = xmlNodeGetNum(xid, "*");
-  if (num == 0)
-  {
-    char *s;
-    s = xmlGetString(xid);
-    if (s)
-    {
-      printf("%s", s);
-      free(s);
-    }
-  }
-  else
-  {
-    unsigned int i, q;
-    for (i=0; i<num; i++)
-    {
-      if (xmlNodeGetPos(id, xid, "*", i) != 0)
-      {
-        char name[256];
-        int r;
-
-        xmlNodeCopyName(xid, (char *)&name, 256);
-
-        printf("\n");
-        for(q=0; q<level; q++) printf(" ");
-        printf("<%s>", name);
-        level++;
-        print_xml(xid);
-        level--;
-        printf("</%s>", name);
-      }
-      else printf("error\n");
-    }
-    printf("\n");
-    for(q=1; q<level; q++) printf(" ");
-  }
-}
diff --git a/utils/xmlgrep/sample.xml b/utils/xmlgrep/sample.xml
deleted file mode 100644 (file)
index e22060c..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0"?>
-
-<Configuration>
-
- <output>
-  <frequency-hz>48000</frequency-hz>
-  <interval-hz>20</interval-hz>
-  <num-speakers>2</num-speakers>
-
-  <tmp><!-- --></tmp>
-  <test n="0" ëlémènt="bjôrn"/>
-  <test n="1"/>
-  <test n="2"/>
-
-  <menu><name>* Traffic, # taxiing to runway (.</name></menu>
-  <sample><test>       * Traffic, # taxiing to runway (.    </test></sample>
-
-  <!--
-    - x is positive to the right
-    - y is positive upwards
-    - z is positive backwards
-   -->
-  <speaker n="0">
-   <channel>0</channel>
-   <volume-norm>1.0</volume-norm>
-   <desc><!-- empty --></desc>
-  </speaker>
-
-  <speaker n="1">
-   <channel>1</channel>
-   <volume-norm>1.0</volume-norm>
-   <desc>
-                                   <!--
-      empty                                            --></desc>
-  </speaker>
-
-  <script><![CDATA[
-      getprop(call(sprintf, size(arg));
-      c--; x >>= 33;
-      // --> comment ]>
-  ;]]></script>
- </output>
-
- <backend>
-  <name type="stereo">ALSA Hardware</name>
-  <Output>
-   <renderer>hw:0</renderer>
-   <channels>2</channels>
-   <!-- periods>16</periods -->
-   <frequency-hz>44100</frequency-hz>
-   <bits-per-sample>16</bits-per-sample>
-  </Output>
-  <Input>
-   <renderer>default</renderer>
-   <frequency-hz>44100</frequency-hz>
-  </Input>
- </backend>
-
- <nasal>
-  <YF23>
-   <script><![CDATA[
-    # If the ground-roll-heading-hold has been reset (<-999) set:
-    if(agl > 50) {};
-   ]]></script>
-  </YF23>
- </nasal>
-
-</Configuration>
diff --git a/utils/xmlgrep/testxml.c b/utils/xmlgrep/testxml.c
deleted file mode 100644 (file)
index 732f081..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-#include <stdio.h>
-#include <malloc.h>
-#include <assert.h>
-#include "xml.h"
-
-#define ROOTNODE       "/Configuration/output/menu"
-#define        LEAFNODE        "name"
-#define PATH           ROOTNODE"/"LEAFNODE
-#define BUFLEN         4096
-
-#define PRINT_ERROR_AND_EXIT(id) \
-    if (xmlErrorGetNo(id, 0) != XML_NO_ERROR) { \
-         const char *errstr = xmlErrorGetString(id, 0); \
-         size_t column = xmlErrorGetColumnNo(id, 0); \
-         size_t lineno = xmlErrorGetLineNo(id, 1); \
-         printf("Error at line %i, column %i: %s\n", lineno, column, errstr); \
-         exit(-1); \
-      }
-
-int main()
-{
-   void *root_id;
-
-   root_id = xmlOpen("sample.xml");
-   if (root_id)
-   {
-      void *path_id, *node_id;
-      char *s;
-
-      printf("\nTesting xmlNodeGetString for /*/*/test:\t\t\t\t\t");
-      s = xmlNodeGetString(root_id , "/*/*/test");
-      if (s)
-      {
-         printf("failed.\n\t'%s' should be empty\n", s);
-         free(s);
-      }
-      else
-         printf("succes.\n");
-
-      printf("Testing xmlGetString for /Configuration/output/test:\t\t\t");
-      path_id = xmlNodeGet(root_id, "/Configuration/output/test");
-      if (path_id)
-      {
-         s = xmlGetString(path_id);
-         if (s)
-         {
-            printf("failed.\n\t'%s' should be empty\n", s);
-            free(s);
-         }
-         else
-            printf("succes.\n");
-      }
-      else
-         PRINT_ERROR_AND_EXIT(root_id);
-
-      path_id = xmlNodeGet(root_id, PATH);
-      node_id = xmlNodeGet(root_id, ROOTNODE);
-
-      if (path_id && node_id)
-      {
-         char buf[BUFLEN];
-         size_t len;
-        
-         xmlCopyString(path_id, buf, BUFLEN);
-         printf("Testing xmlNodeCopyString against xmlGetString:\t\t\t\t");
-         if ((s = xmlGetString(path_id)) != 0)
-         {
-            if (strcmp(s, buf)) /* not the same */
-               printf("failed.\n\t'%s' differs from '%s'\n", s, buf);
-            else
-               printf("succes.\n");
-
-            printf("Testing xmlCopyString against xmlGetString:\t\t\t\t");
-            xmlCopyString(path_id, buf, BUFLEN);
-            if (strcmp(s, buf)) /* not the same */
-               printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
-            else
-               printf("succes.\n");
-         }
-         else
-            PRINT_ERROR_AND_EXIT(path_id);
-
-         printf("Testing xmlCopyString against xmlCompareString:\t\t\t\t");
-         if (xmlCompareString(path_id, buf)) /* not the same */
-            printf ("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
-         else
-            printf("succes.\n");
-
-         printf("Testing xmlCopyString against xmlNodeCompareString:\t\t\t");
-         if (xmlNodeCompareString(node_id, LEAFNODE, buf)) /* not the same */
-            printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
-         else
-            printf("succes.\n");
-
-         if (s) free(s);
-         printf("Testing xmlCopyString against xmlNodeGetString:\t\t\t\t");
-         if ((s = xmlNodeGetString(node_id, LEAFNODE)) != 0)
-         {
-            if (strcmp(s, buf)) /* not the same */
-               printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
-            else
-               printf("succes.\n");
-            free(s);
-         }
-         else
-            PRINT_ERROR_AND_EXIT(node_id);
-
-         free(path_id);
-         path_id = xmlNodeGet(root_id, "/Configuration/backend/name");
-         if (path_id)
-         {
-            printf("Testing xmlAttributeCopyString against xmlAttributeCompareString:\t");
-            xmlAttributeCopyString(path_id, "type", buf, BUFLEN);
-            if (xmlAttributeCompareString(path_id, "type", buf)) /* no match */
-               printf("failed.\n\t'%s' differs\n", buf);
-            else
-               printf("succes.\n");
-
-            printf("Testing xmlAttributeCopyString against xmlAttributeGetString:\t\t");
-            if ((s = xmlAttributeGetString(path_id, "type")) != 0)
-            {
-                if (strcmp(s, buf)) /* not the same */
-                   printf("failed.\n\t'%s' differs from '%s'\n", s, buf);
-                else
-                   printf("succes.\n");
-                free(s);
-            }
-            else
-                PRINT_ERROR_AND_EXIT(path_id);
-
-         }
-         else
-            PRINT_ERROR_AND_EXIT(root_id);
-
-         free(node_id);
-         free(path_id);
-
-         path_id = xmlNodeGet(root_id, "Configuration/output/sample/test");
-         if (path_id)
-         {
-            xmlNodeCopyString(root_id ,"Configuration/output/menu/name", buf, BUFLEN);
-            printf("Testing xmlCompareString against a fixed string: \t\t\t");
-            if (xmlCompareString(path_id, buf))        /* no match */
-               printf("failed.\n\t'%s' differs\n", buf);
-            else
-               printf("succes.\n");
-
-            s = xmlGetString(path_id);
-            if (s)
-            {
-               printf("Testing xmlGetString  against a fixed string: \t\t\t\t");
-               if (strcmp(s, buf))                     /* mismatch */
-                  printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
-               else
-                  printf("succes.\n");
-
-               printf("Testing xmlCopyString gainst a fixed string: \t\t\t\t");
-               xmlCopyString(path_id, buf, BUFLEN);
-               if (strcmp(s, buf))                     /* mismatch */
-                  printf("failed.\n\t'%s' differs from\n\t'%s'\n", s, buf);
-               else
-                  printf("succes.\n"); 
-
-               free(s);
-            }
-            else
-               PRINT_ERROR_AND_EXIT(path_id);
-
-            free(path_id);
-         }
-      }
-
-      if (xmlErrorGetNo(root_id, 0) != XML_NO_ERROR)
-      {
-         const char *errstr = xmlErrorGetString(root_id, 0);
-         size_t column = xmlErrorGetColumnNo(root_id, 0);
-         size_t lineno = xmlErrorGetLineNo(root_id, 1);
-
-         printf("Error at line %i, column %i: %s\n", lineno, column, errstr);
-      }
-
-      xmlClose(root_id);
-   }
-   printf("\n");
-
-   return 0;
-}
diff --git a/utils/xmlgrep/xml.c b/utils/xmlgrep/xml.c
deleted file mode 100644 (file)
index 5357ed8..0000000
+++ /dev/null
@@ -1,1995 +0,0 @@
-/* Copyright (c) 2007-2009 by Adalin B.V.
- * Copyright (c) 2007-2009 by Erik Hofman
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *      * Redistributions of source code must retain the above copyright
- *         notice, this list of conditions and the following disclaimer.
- *      * Redistributions in binary form must reproduce the above copyright
- *         notice, this list of conditions and the following disclaimer in the
- *         documentation and/or other materials provided with the distribution.
- *      * Neither the name of (any of) the copyrightholder(s) nor the
- *         names of its contributors may be used to endorse or promote products
- *         derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef WIN32
-# include <io.h>
-
-#else  /* !WIN32 */
-# include <sys/mman.h>
-# include <unistd.h>
-#endif
-
-#ifndef NDEBUG
-# include <stdio.h>
-#endif
-#include <stdlib.h>     /* free, malloc */
-#include <malloc.h>
-#include <string.h>    /* memcmp */
-#ifndef _MSC_VER
-#include <strings.h>   /* strncasecmp */
-#else
-# define strncasecmp strnicmp
-#endif
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include "xml.h"
-
-#ifndef XML_NONVALIDATING
-static const char *__xml_error_str[XML_MAX_ERROR];
-
-static void __xmlErrorSet(const void *, const char *, unsigned int);
-# define xmlErrorSet(a, b, c)  __xmlErrorSet(a, b, c)
-
-# ifndef NDEBUG
-# define PRINT_INFO(a) \
-       assert((a) < XML_MAX_ERROR); \
-       printf("at line %i: %s\n", __LINE__, __xml_error_str[(a)])
-# else
-# define PRINT_INFO(a)
-# endif
-
-# define SET_ERROR_AND_RETURN(a, b) \
-       { *rlen = 0; *name = (a); *len = (b); PRINT_INFO(b); return 0; }
-
-#else /* !XML_NONVALIDATING */
-# define xmlErrorSet(a, b, c)
-# define SET_ERROR_AND_RETURN(a, b)    return 0;
-#endif
-
-static char *__xmlNodeGetPath(void **, const char *, size_t *, char **, size_t *);
-static char *__xmlNodeGet(void *, const char *, size_t *, char **, size_t *, size_t *);
-static char *__xmlProcessCDATA(char **, size_t *);
-static char *__xmlCommentSkip(const char *, size_t);
-static char *__xmlInfoProcess(const char *, size_t);
-
-static void *__xml_memncasecmp(const char *, size_t *, char **, size_t *);
-static void __xmlPrepareData(char **, size_t *);
-
-#ifdef WIN32
-/*
- * map 'filename' and return a pointer to it.
- */
-static void *simple_mmap(int, size_t, SIMPLE_UNMMAP *);
-static void simple_unmmap(SIMPLE_UNMMAP *);
-
-# define mmap(a,b,c,d,e,f)       simple_mmap((e), (b), &rid->un)
-# define munmap(a,b)             simple_unmmap(&rid->un)
-#endif
-
-#ifndef NDEBUG
-# define PRINT(a, b, c) { \
-   size_t l1 = (b), l2 = (c); \
-   char *s = (a); \
-   if (s) { \
-      size_t q, len = l2; \
-      if (l1 < l2) len = l1; \
-      if (len < 50000) { \
-         printf("(%i) '", len); \
-         for (q=0; q<len; q++) printf("%c", s[q]); \
-         printf("'\n"); \
-      } else printf("Length (%u) seems too large at line %i\n",len, __LINE__); \
-   } else printf("NULL pointer at line %i\n", __LINE__); \
-}
-#endif
-
-void *
-xmlOpen(const char *filename)
-{
-    struct _root_id *rid = 0;
-
-    if (filename)
-    {
-        int fd = open(filename, O_RDONLY);
-        if (fd >= 0)
-        {
-            struct stat statbuf;
-            void *mm;
-
-            fstat(fd, &statbuf);
-            mm = mmap(0, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0L);
-            if (mm != (void *)-1)
-            {
-                rid = calloc(1, sizeof(struct _root_id));
-                if (rid)
-                {
-                    size_t blen = statbuf.st_size;
-#ifdef XML_USE_NODECACHE
-                    size_t num = 0, nlen = 1;
-                    char *n = "*";
-
-                    rid->node = cacheInit();
-                    __xmlNodeGet(rid->node, mm, &blen, &n, &nlen, &num);
-#endif
-                    rid->fd = fd;
-                    rid->start = mm;
-                    rid->len = blen;
-                }
-            }
-        }
-    }
-
-    return (void *)rid;
-}
-
-void *
-xmlInitBuffer(const char *buffer, size_t size)
-{
-    struct _root_id *rid = 0;
-
-    if (buffer && (size > 0))
-    {
-        rid = calloc(1, sizeof(struct _root_id));
-        if (rid)
-        {
-#ifdef XML_USE_NODECACHE
-            size_t num = 0, nlen = 1;
-            size_t blen = size;
-            char *n = "*";
-
-            rid->node = cacheInit();
-            __xmlNodeGet(rid->node, buffer, &blen, &n, &nlen, &num);
-#endif
-           rid->fd = -1;
-            rid->start = (char *)buffer;
-            rid->len = size;
-        }
-    }
-
-    return (void *)rid;
-}
-
-void
-xmlClose(void *id)
-{
-     struct _root_id *rid = (struct _root_id *)id;
-
-     assert(rid != 0);
-     assert(rid->name == 0);
-
-     if (rid->fd != -1)
-     {
-         munmap(rid->start, rid->len);
-         close(rid->fd);
-     }
-
-#ifdef XML_USE_NODECACHE
-     if (rid->node) cacheFree(rid->node);
-#endif
-#ifndef XML_NONVALIDATING
-     if (rid->info) free(rid->info);
-#endif
-     free(rid);
-     id = 0;
-}
-
-void *
-xmlNodeGet(const void *id, const char *path)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    struct _xml_id *xsid = 0;
-    size_t len, slen;
-    char *ptr, *node;
-    void *nc, *nnc;
-
-    assert(id != 0);
-    assert(path != 0);
-
-    node = (char *)path;
-    len = xid->len;
-    slen = strlen(path);
-
-    nnc = nc = cacheNodeGet(xid);
-    ptr = __xmlNodeGetPath(&nnc, xid->start, &len, &node, &slen);
-    if (ptr)
-    {
-        xsid = malloc(sizeof(struct _xml_id));
-        if (xsid)
-        {
-             xsid->name = node;
-             xsid->name_len = slen;
-             xsid->start = ptr;
-             xsid->len = len;
-#ifdef XML_USE_NODECACHE
-             xsid->node = nnc;
-#endif
-#ifndef XML_NONVALIDATING
-             if (xid->name)
-                xsid->root = xid->root;
-             else
-                xsid->root = (struct _root_id *)xid;
-#endif
-        }
-        else
-        {
-            xmlErrorSet(xid, 0, XML_OUT_OF_MEMORY);
-        }
-    }
-    else if (slen == 0)
-    {
-        xmlErrorSet(xid, node, len);
-    }
-
-    return (void *)xsid;
-}
-
-void *
-xmlNodeCopy(const void *id, const char *path)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    struct _xml_id *xsid = 0;
-    char *ptr, *node, *p;
-    size_t slen, len;
-    void *nc, *nnc;
-
-    node = (char *)path;
-    len = xid->len;
-    slen = strlen(path);
-
-    nnc = nc = cacheNodeGet(xid);
-    ptr = __xmlNodeGetPath(&nnc, xid->start, &len, &node, &slen);
-    if (ptr)
-    {
-        xsid = malloc(sizeof(struct _xml_id) + len);
-        if (xsid)
-        {
-            p = (char *)xsid + sizeof(struct _xml_id);
-
-            xsid->len = len;
-            xsid->start = p;
-            xsid->name_len = slen;
-            xsid->name = node;
-#ifdef XML_USE_NODECACHE
-                 xsid->node = nc;
-#endif
-#ifndef XML_NONVALIDATING
-            if (xid->name)
-                xsid->root = xid->root;
-            else
-                xsid->root = (struct _root_id *)xid;
-#endif
-
-            memcpy(xsid->start, ptr, len);
-        }
-        else
-        {
-            xmlErrorSet(xid, 0, XML_OUT_OF_MEMORY);
-        }
-    }
-    else if (slen == 0)
-    {
-        xmlErrorSet(xid, node, len);
-    }
-
-   return (void *)xsid;
-}
-
-char *
-xmlNodeGetName(const void *id)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    size_t len;
-    char *ret;
-
-    assert(xid != 0);
-
-    len = xid->name_len;
-    ret = malloc(len+1);
-    if (ret)
-    {
-        memcpy(ret, xid->name, len);
-        *(ret + len) = 0;
-    }
-    else
-    {
-        xmlErrorSet(xid, 0, XML_OUT_OF_MEMORY);
-    }
-
-    return ret;
-}
-
-size_t
-xmlNodeCopyName(const void *id, char *buf, size_t buflen)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    size_t slen = 0;
-    assert(buf != 0);
-    assert(buflen > 0);
-
-    slen = xid->name_len;
-    if (slen >= buflen)
-    {
-        slen = buflen-1;
-        xmlErrorSet(xid, 0, XML_TRUNCATE_RESULT);
-    }
-    memcpy(buf, xid->name, slen);
-    *(buf + slen) = 0;
-
-    return slen;
-}
-
-unsigned int
-xmlNodeGetNum(const void *id, const char *path)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    size_t num = 0;
-
-    assert(xid != 0);
-    assert(path != 0);
-
-    if (xid->len)
-    {
-        char *nodename, *pathname;
-        size_t len, slen;
-        void *nc;
-        char *p;
-
-        nodename = (char *)path;
-        if (*path == '/') nodename++;
-        slen = strlen(nodename);
-
-        nc = cacheNodeGet(xid);
-        pathname = strchr(nodename, '/');
-        if (pathname)
-        {
-           char *node;
-
-           len = xid->len;
-           pathname++;
-           slen -= pathname-nodename;
-           node = pathname;
-           p = __xmlNodeGetPath(&nc, xid->start, &len, &node, &slen);
-           if (p == 0 && slen == 0)
-           {
-               xmlErrorSet(xid, node, len);
-           }
-        }
-        else
-        {
-            p = xid->start;
-            len = xid->len;
-        }
-
-        if (p)
-        {
-            char *ret, *node = nodename;
-#ifndef XML_USE_NODECACHE
-            ret = __xmlNodeGet(nc, p, &len, &node, &slen, &num);
-#else
-            ret = __xmlNodeGetFromCache(&nc, p, &len, &node, &slen, &num);
-#endif
-            if (ret == 0 && slen == 0)
-            {
-                xmlErrorSet(xid, node, len);
-                num = 0;
-            }
-        }
-    }
-
-    return num;
-}
-
-void *
-xmlNodeGetPos(const void *pid, void *id, const char *element, size_t num)
-{
-    struct _xml_id *xpid = (struct _xml_id *)pid;
-    struct _xml_id *xid = (struct _xml_id *)id;
-    size_t len, slen;
-    char *ptr, *node;
-    void *ret = 0;
-    void *nc;
-
-    assert(xpid != 0);
-    assert(xid != 0);
-    assert(element != 0);
-
-    len = xpid->len;
-    slen = strlen(element);
-    node = (char *)element;
-    nc = cacheNodeGet(xpid);
-#ifndef XML_USE_NODECACHE
-    ptr = __xmlNodeGet(nc, xpid->start, &len, &node, &slen, &num);
-#else
-    ptr = __xmlNodeGetFromCache(&nc, xpid->start, &len, &node, &slen, &num);
-#endif
-    if (ptr)
-    {
-         xid->len = len;
-         xid->start = ptr;
-         xid->name = node;
-         xid->name_len = slen;
-#ifdef XML_USE_NODECACHE
-         /* unused for the cache but tested at the start of this function */
-         if (len == 0) xid->len = 1;
-         xid->node = nc;
-#endif
-         ret = xid;
-    }
-    else if (slen == 0)
-    {
-        xmlErrorSet(xpid, node, len);
-    }
-
-    return ret;
-}
-
-char *
-xmlGetString(const void *id)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    char *str = 0;
-
-    assert(xid != 0);
-
-    if (xid->len)
-    {
-        size_t len;
-        char *ps;
-
-        ps = xid->start;
-        len = xid->len-1;
-        __xmlPrepareData(&ps, &len);
-        if (len)
-        {
-            len++;
-            str = malloc(len+1);
-            if (str)
-            {
-                memcpy(str, ps, len);
-                *(str+len) = 0;
-            }
-            else
-            {
-                xmlErrorSet(xid, 0, XML_OUT_OF_MEMORY);
-            }
-        }
-    }
-
-    return str;
-}
-
-size_t
-xmlCopyString(const void *id, char *buffer, size_t buflen)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    size_t ret = 0;
-    assert(xid != 0);
-    assert(buffer != 0);
-    assert(buflen > 0);
-
-    *buffer = '\0';
-    if (xid->len)
-    {
-        size_t len;
-        char *ps;
-
-        ps = xid->start;
-        len = xid->len;
-        __xmlPrepareData(&ps, &len);
-        if (len)
-        {
-            if (len >= buflen)
-            {
-                len = buflen-1;
-                xmlErrorSet(xid, 0, XML_TRUNCATE_RESULT);
-            }
-            memcpy(buffer, ps, len);
-            *(buffer+len) = 0;
-        }
-        ret = len;
-    }
-
-    return ret;
-}
-
-int
-xmlCompareString(const void *id, const char *s)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    int ret = -1;
-
-    assert(xid != 0);
-    assert(s != 0);
-
-    if (xid->len && (strlen(s) > 0))
-    {
-        size_t len;
-        char *ps;
-
-        ps = xid->start;
-        len = xid->len;
-        __xmlPrepareData(&ps, &len);
-        ret = strncasecmp(ps, s, len);
-    }
-
-    return ret;
-}
-
-char *
-xmlNodeGetString(const void *id, const char *path)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    char *str = 0;
-
-    assert(xid != 0);
-    assert(path != 0);
-
-    if (xid->len)
-    {
-        char *ptr, *node = (char *)path;
-        size_t slen = strlen(node);
-        size_t len = xid->len;
-        void *nc;
-
-        nc = cacheNodeGet(xid);
-        ptr = __xmlNodeGetPath(&nc, xid->start, &len, &node, &slen);
-        if (ptr && len)
-        {
-            __xmlPrepareData(&ptr, &len);
-            str = malloc(len+1);
-            if (str)
-            {
-               memcpy(str, ptr, len);
-               *(str+len) = '\0';
-            }
-            else
-            {
-                xmlErrorSet(xid, 0, XML_OUT_OF_MEMORY);
-            }
-        }
-        else
-        {
-            xmlErrorSet(xid, node, len);
-        }
-    }
-
-    return str;
-}
-
-size_t
-xmlNodeCopyString(const void *id, const char *path, char *buffer, size_t buflen)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    size_t ret = 0;
-
-    assert(xid != 0);
-    assert(path != 0);
-    assert(buffer != 0);
-    assert(buflen > 0);
-
-    *buffer = '\0';
-    if (xid->len)
-    {
-        char *p, *node = (char *)path;
-        size_t slen = strlen(node);
-        size_t len = xid->len;
-        void *nc;
-
-        nc = cacheNodeGet(xid);
-        p = __xmlNodeGetPath(&nc, xid->start, &len, &node, &slen);
-        if (p)
-        {
-            __xmlPrepareData(&p, &len);
-            if (len)
-            {
-                if (len >= buflen)
-                {
-                    len = buflen-1;
-                    xmlErrorSet(xid, 0, XML_TRUNCATE_RESULT);
-                }
-
-                memcpy(buffer, p, len);
-                *(buffer+len) = '\0';
-            }
-            ret = len;
-        }
-        else if (slen == 0)
-        {
-            xmlErrorSet(xid, node, len);
-        }
-    }
-
-    return ret;
-}
-
-int
-xmlNodeCompareString(const void *id, const char *path, const char *s)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    int ret = -1;
-
-    assert(xid != 0);
-    assert(path != 0);
-    assert(s != 0);
-
-    if (xid->len && (strlen(s) > 0))
-    {
-        char *node, *str, *ps, *pe;
-        size_t len, slen;
-        void *nc;
-
-        len = xid->len;
-        slen = strlen(path);
-        node = (char *)path;
-        nc = cacheNodeGet(xid);
-        str = __xmlNodeGetPath(&nc, xid->start, &len, &node, &slen);
-        if (str)
-        {
-            ps = str;
-            __xmlPrepareData(&ps, &len);
-            ret = strncasecmp(ps, s, len);
-        }
-        else if (slen == 0)
-        {
-            xmlErrorSet(xid, node, len);
-        }
-    }
-
-    return ret;
-}
-
-long int
-xmlGetInt(const void *id)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    long int li = 0;
-
-    assert(xid != 0);
-
-    if (xid->len)
-    {
-        char *end = xid->start + xid->len;
-        li = strtol(xid->start, &end, 10);
-    }
-
-    return li;
-}
-
-long int
-xmlNodeGetInt(const void *id, const char *path)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    long int li = 0;
-
-    assert(xid != 0);
-    assert(path != 0);
-
-    if (xid->len)
-    {
-        size_t len, slen;
-        char *str, *node;
-        void *nc;
-
-        len = xid->len;
-        slen = strlen(path);
-        node = (char *)path;
-        nc = cacheNodeGet(xid);
-        str = __xmlNodeGetPath(&nc, xid->start, &len, &node, &slen);
-        if (str)
-        {
-            char *end = str+len;
-            li = strtol(str, &end, 10);
-        }
-        else if (slen == 0)
-        {
-            xmlErrorSet(xid, node, len);
-        }
-    }
-
-    return li;
-}
-
-double
-xmlGetDouble(const void *id)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    double d = 0.0;
-
-    assert(xid != 0);
-
-    if (xid->len)
-    {
-        char *end = xid->start + xid->len;
-        d = strtod(xid->start, &end);
-    }
-
-    return d;
-}
-
-double
-xmlNodeGetDouble(const void *id, const char *path)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    double d = 0.0;
-
-    assert(xid != 0);
-    assert(path != 0);
-
-    if (xid->len)
-    {
-        size_t len, slen;
-        char *str, *node;
-        void *nc;
-
-        len = xid->len;
-        slen = strlen(path);
-        node = (char *)path;
-        nc = cacheNodeGet(xid);
-        str = __xmlNodeGetPath(&nc, xid->start, &len, &node, &slen);
-        if (str)
-        {
-            char *end = str+len;
-            d = strtod(str, &end);
-        }
-        else if (slen == 0)
-        {
-            xmlErrorSet(xid, node, len);
-        }
-    }
-
-    return d;
-}
-
-void *
-xmlMarkId(const void *id)
-{
-    struct _xml_id *xmid = 0;
-
-    assert(id != 0);
-
-    xmid = malloc(sizeof(struct _xml_id));
-    if (xmid)
-    {
-        struct _root_id *xrid = (struct _root_id *)id;
-        if (xrid->name == 0)
-        {
-            xmid->name = "";
-            xmid->name_len = 0;
-            xmid->start = xrid->start;
-            xmid->len = xrid->len;
-#ifdef XML_USE_NODECACHE
-            xmid->node = xrid->node;
-#endif
-#ifndef XML_NONVALIDATING
-            xmid->root = xrid;
-#endif
-        }
-        else
-        {
-            memcpy(xmid, id, sizeof(struct _xml_id));
-        }
-    }
-    else
-    {
-        xmlErrorSet(id, 0, XML_OUT_OF_MEMORY);
-    }
-
-    return (void *)xmid;
-}
-
-double
-xmlAttributeGetDouble(const void *id, const char *name)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    double ret = 0.0;
-
-    assert(xid != 0);
-    assert(name != 0);
-
-    if (xid->name_len)
-    {
-        size_t slen = strlen(name);
-        char *ps, *pe;
-
-        assert(xid->start > xid->name);
-
-        ps = xid->name + xid->name_len + 1;
-        pe = xid->start - 1;
-        while (ps<pe)
-        {
-            while ((ps<pe) && isspace(*ps)) ps++;
-            if (((size_t)(pe-ps) > slen) && (strncasecmp(ps, name, slen) == 0))
-            {
-                ps += slen;
-                if ((ps<pe) && (*ps == '='))
-                {
-                    char *start;
-
-                    ps++;
-                    if (*ps == '"' || *ps == '\'') ps++;
-                    else
-                    {
-                        xmlErrorSet(xid, ps, XML_ATTRIB_NO_OPENING_QUOTE);
-                        return 0;
-                    }
-
-                    start = ps;
-                    while ((ps<pe) && (*ps != '"') && (*ps != '\'')) ps++;
-                    if (ps<pe)
-                    {
-                        ret = strtod(start, &ps);
-                    }
-                    else
-                    {
-                        xmlErrorSet(xid, ps, XML_ATTRIB_NO_CLOSING_QUOTE);
-                        return 0;
-                    }
-                }
-                else
-                {
-                    while ((ps<pe) && !isspace(*ps)) ps++;
-                    continue;
-                }
-
-                break;
-            }
-
-            while ((ps<pe) && !isspace(*ps)) ps++;
-        }
-    }
-
-    return ret;
-}
-
-long int
-xmlAttributeGetInt(const void *id, const char *name)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    long int ret = 0;
-
-    assert(xid != 0);
-    assert(name != 0);
-
-    if (xid->name_len)
-    {
-        size_t slen = strlen(name);
-        char *ps, *pe;
-
-        assert(xid->start > xid->name);
-
-        ps = xid->name + xid->name_len + 1;
-        pe = xid->start - 1;
-        while (ps<pe)
-        {
-            while ((ps<pe) && isspace(*ps)) ps++;
-            if (((size_t)(pe-ps) > slen) && (strncasecmp(ps, name, slen) == 0))
-            {
-                ps += slen;
-                if ((ps<pe) && (*ps == '='))
-                {
-                    char *start;
-
-                    ps++;
-                    if (*ps == '"' || *ps == '\'') ps++;
-                    else
-                    {
-                        xmlErrorSet(xid, ps, XML_ATTRIB_NO_OPENING_QUOTE);
-                        return 0;
-                    }
-
-                    start = ps;
-                    while ((ps<pe) && (*ps != '"') && (*ps != '\'')) ps++;
-                    if (ps<pe)
-                    {
-                        ret = strtol(start, &ps, 10);
-                    }
-                    else
-                    {
-                       xmlErrorSet(xid, ps, XML_ATTRIB_NO_CLOSING_QUOTE);
-                       return 0;
-                   }
-               }
-               else
-               {
-                   while ((ps<pe) && isspace(*ps)) ps++;
-                   continue;
-               }
-
-               break;
-           }
-
-           while ((ps<pe) && !isspace(*ps)) ps++;
-        }
-    }
-
-    return ret;
-}
-
-char *
-xmlAttributeGetString(const void *id, const char *name)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    char *ret = 0;
-
-    assert(xid != 0);
-    assert(name != 0);
-
-    if (xid->name_len)
-    {
-        size_t slen = strlen(name);
-        char *ps, *pe;
-
-        assert(xid->start > xid->name);
-
-        ps = xid->name + xid->name_len + 1;
-        pe = xid->start - 1;
-        while (ps<pe)
-        {
-             while ((ps<pe) && isspace(*ps)) ps++;
-             if (((size_t)(pe-ps) > slen) && (strncasecmp(ps, name, slen) == 0))
-             {
-                 ps += slen;
-                 if ((ps<pe) && (*ps == '='))
-                 {
-                     char *start;
-
-                     ps++;
-                     if (*ps == '"' || *ps == '\'') ps++;
-                     else
-                     {
-                         xmlErrorSet(xid, ps, XML_ATTRIB_NO_OPENING_QUOTE);
-                         return 0;
-                     }
-
-                     start = ps;
-                     while ((ps<pe) && (*ps != '"') && (*ps != '\'')) ps++;
-                     if (ps<pe)
-                     {
-                         ret = malloc(ps-start);
-                         if (ret)
-                         {
-                             memcpy(ret, start, (ps-start));
-                             *(ret+(ps-start)) = '\0';
-                         }
-                         else
-                         {
-                             xmlErrorSet(xid, 0, XML_OUT_OF_MEMORY);
-                         }
-                     }
-                     else
-                     {
-                         xmlErrorSet(xid, ps, XML_ATTRIB_NO_CLOSING_QUOTE);
-                        return 0;
-                     }
-                 }
-                 else
-                 {
-                     while ((ps<pe) && !isspace(*ps)) ps++;
-                     continue;
-                 }
-
-
-                 break;
-             }
-
-             while ((ps<pe) && !isspace(*ps)) ps++;
-        }
-    }
-
-    return ret;
-}
-
-size_t
-xmlAttributeCopyString(const void *id, const char *name,
-                                       char *buffer, size_t buflen)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    size_t ret = 0;
-
-    assert(xid != 0);
-    assert(name != 0);
-    assert(buffer != 0);
-    assert(buflen > 0);
-
-    if (xid->name_len)
-    {
-        size_t slen = strlen(name);
-        char *ps, *pe;
-
-        assert(xid->start > xid->name);
-
-        *buffer = '\0';
-        ps = xid->name + xid->name_len + 1;
-        pe = xid->start - 1;
-        while (ps<pe)
-        {
-            while ((ps<pe) && isspace(*ps)) ps++;
-            if (((size_t)(pe-ps) > slen) && (strncasecmp(ps, name, slen) == 0))
-            {
-                ps += slen;
-                if ((ps<pe) && (*ps == '='))
-                {
-                    char *start;
-
-                    ps++;
-                    if (*ps == '"' || *ps == '\'') ps++;
-                    else
-                    {
-                        xmlErrorSet(xid, ps, XML_ATTRIB_NO_OPENING_QUOTE);
-                        return 0;
-                    }
-
-                    start = ps;
-                    while ((ps<pe) && (*ps != '"') && (*ps != '\'')) ps++;
-                    if (ps<pe)
-                    {
-                        size_t restlen = ps-start;
-                        if (restlen >= buflen)
-                        {
-                            restlen = buflen-1;
-                            xmlErrorSet(xid, ps, XML_TRUNCATE_RESULT);
-                        }
-
-                        memcpy(buffer, start, restlen);
-                        *(buffer+restlen) = 0;
-                        ret = restlen;
-                    }
-                    else
-                    {
-                        xmlErrorSet(xid, ps, XML_ATTRIB_NO_CLOSING_QUOTE);
-                        return 0;
-                    }
-                }
-                else
-                {
-                    while ((ps<pe) && isspace(*ps)) ps++;
-                    continue;
-                }
-
-                break;
-            }
-
-            while ((ps<pe) && !isspace(*ps)) ps++;
-        }
-    }
-
-    return ret;
-}
-
-int
-xmlAttributeCompareString(const void *id, const char *name, const char *s)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    int ret = -1;
-    assert(xid != 0);
-    assert(name != 0);
-    assert(s != 0);
-
-    if (xid->name_len && strlen(s))
-    {
-        size_t slen = strlen(name);
-        char *ps, *pe;
-
-        assert(xid->start > xid->name);
-
-        ps = xid->name + xid->name_len + 1;
-        pe = xid->start - 1;
-        while (ps<pe)
-        {
-            while ((ps<pe) && isspace(*ps)) ps++;
-            if (((size_t)(pe-ps) > slen) && (strncasecmp(ps, name, slen) == 0))
-            {
-                ps += slen;
-                if ((ps<pe) && (*ps == '='))
-                {
-                    char *start;
-
-                    ps++;
-                    if (*ps == '"' || *ps == '\'') ps++;
-                    else
-                    {
-                        xmlErrorSet(xid, ps, XML_ATTRIB_NO_OPENING_QUOTE);
-                        return 0;
-                    }
-
-                    start = ps;
-                    while ((ps<pe) && (*ps != '"') && (*ps != '\'')) ps++;
-                    if (ps<pe)
-                    {
-                        ret = strncasecmp(start, s, ps-start);
-                    }
-                    else
-                    {
-                        xmlErrorSet(xid, ps, XML_ATTRIB_NO_CLOSING_QUOTE);
-                        return 0;
-                    }
-                }
-                else
-                {
-                    while ((ps<pe) && !isspace(*ps)) ps++;
-                    continue;
-                }
-
-                break;
-            }
-
-            while ((ps<pe) && !isspace(*ps)) ps++;
-        }
-    }
-
-    return ret;
-}
-
-
-#ifndef XML_NONVALIDATING
-int
-xmlErrorGetNo(const void *id, int clear)
-{
-    int ret = 0;
-
-    if (id)
-    {
-        struct _xml_id *xid = (struct _xml_id *)id;
-        struct _root_id *rid;
-
-        if (xid->name) rid = xid->root;
-        else rid = (struct _root_id *)xid;
-
-        assert(rid != 0);
-
-        if (rid->info)
-        {
-            struct _xml_error *err = rid->info;
-
-            ret = err->err_no;
-            if (clear) err->err_no = 0;
-        }
-    }
-
-    return ret;
-}
-
-size_t
-xmlErrorGetLineNo(const void *id, int clear)
-{
-    size_t ret = 0;
-
-    if (id)
-    {
-        struct _xml_id *xid = (struct _xml_id *)id;
-        struct _root_id *rid;
-
-        if (xid->name) rid = xid->root;
-        else rid = (struct _root_id *)xid;
-
-        assert(rid != 0);
-
-        if (rid->info)
-        {
-            struct _xml_error *err = rid->info;
-            char *ps = rid->start;
-            char *pe = err->pos;
-            char *new;
-
-            ret++;
-            while (ps<pe)
-            {
-               new = memchr(ps, '\n', pe-ps);
-               if (new) ret++;
-               else break;
-               ps = new+1;
-            }       
-
-            if (clear) err->err_no = 0;
-        }
-    }
-
-    return ret;
-}
-
-size_t
-xmlErrorGetColumnNo(const void *id, int clear)
-{
-    size_t ret = 0;
-
-    if (id)
-    {
-        struct _xml_id *xid = (struct _xml_id *)id;
-        struct _root_id *rid;
-
-        if (xid->name) rid = xid->root;
-        else rid = (struct _root_id *)xid;
-
-        assert(rid != 0);
-
-        if (rid->info)
-        {
-            struct _xml_error *err = rid->info;
-            char *ps = rid->start;
-            char *pe = err->pos;
-            char *new;
-
-            while (ps<pe)
-            {
-               new = memchr(ps, '\n', pe-ps);
-               new = memchr(ps, '\n', pe-ps);
-               if (new) ret++;
-               else break;
-               ps = new+1;
-            }
-            ret = pe-ps;
-
-            if (clear) err->err_no = 0;
-        }
-    }
-
-    return ret;
-}
-
-const char *
-xmlErrorGetString(const void *id, int clear)
-{
-    char *ret = 0;
-
-    if (id)
-    {
-        struct _xml_id *xid = (struct _xml_id *)id;
-        struct _root_id *rid;
-
-        if (xid->name) rid = xid->root;
-        else rid = (struct _root_id *)xid;
-
-        assert(rid != 0);
-
-        if (rid->info)
-        {
-            struct _xml_error *err = rid->info;
-            if (XML_NO_ERROR <= err->err_no && err->err_no < XML_MAX_ERROR)
-            {
-               ret = (char *)__xml_error_str[err->err_no];
-            }
-            else
-            {
-               ret = "incorrect error number.";
-            }
-
-            if (clear) err->err_no = 0;
-        }
-    }
-
-    return ret;
-}
-
-#else
-
-int
-xmlErrorGetNo(const void *id, int clear)
-{
-    return XML_NO_ERROR;
-}
-
-size_t
-xmlErrorGetLineNo(const void *id, int clear)
-{
-    return 0;
-}
-
-size_t
-xmlErrorGetColumnNo(const void *id, int clear)
-{
-    return 0;
-}
-
-const char *
-xmlErrorGetString(const void *id, int clear)
-{
-   return "error detection was not enabled at compile time: no error.";
-}
-
-#endif
-
-/* -------------------------------------------------------------------------- */
-
-#ifndef XML_NONVALIDATING
-static const char *__xml_error_str[XML_MAX_ERROR] =
-{
-    "no error.",
-    "unable to allocate enough memory.",
-    "unable to open file for reading.",
-    "requested node name is invalid.",
-    "unexpected end of section.",
-    "buffer too small to hold all data, truncating.",
-    "incorrect comment section.",
-    "bad information block.",
-    "incompatible opening tag for element.",
-    "missing or invalid closing tag for element.",
-    "missing or invalid opening quote for attribute.",
-    "missing or invalid closing quote for attribute."
-};
-#endif
-
-char *
-__xmlNodeGetPath(void **nc, const char *start, size_t *len, char **name, size_t *nlen)
-{
-    char *path;
-    char *ret = 0;
-
-    assert(start != 0);
-    assert(len != 0);
-    assert(name != 0);
-    assert(*name != 0);
-    assert(nlen != 0);
-
-    path = *name;
-    if (*path == '/') path++;
-    if (*path != '\0')
-    {
-        size_t num, blocklen, pathlen, nodelen;
-        char *node;
-
-        node = path;
-        pathlen = strlen(path);
-        path = strchr(node, '/');
-
-        if (!path) nodelen = pathlen;
-        else nodelen = path++ - node;
-
-        num = 0;
-        blocklen = *len;
-
-#ifndef XML_USE_NODECACHE
-        ret = __xmlNodeGet(nc, start, &blocklen, &node, &nodelen, &num);
-#else
-        ret = __xmlNodeGetFromCache(nc, start, &blocklen, &node, &nodelen, &num);
-#endif
-        if (ret)
-        {
-            if (path)
-            {
-                ret = __xmlNodeGetPath(nc, ret, &blocklen, &path, &pathlen);
-                *name = path;
-                *len = blocklen;
-                *nlen = pathlen;
-            }
-            else
-            {
-               *name = node;
-               *nlen = nodelen;
-               *len = blocklen;
-            }
-        }
-        else
-        {
-            *len = 0;
-            *nlen = 0;
-        }
-    }
-
-    return ret;
-}
-
-char *
-__xmlNodeGet(void *nc, const char *start, size_t *len, char **name, size_t *rlen, size_t *nodenum)
-{
-    char *cdata, *open_element = *name;
-    char *element, *start_tag=0;
-    char *new, *cur, *ne, *ret = 0;
-    size_t restlen, elementlen;
-    size_t open_len = *rlen;
-    size_t return_len = 0;
-    int found, num;
-    void *nnc = 0;
-
-    assert(start != 0);
-    assert(len != 0);
-    assert(name != 0);
-    assert(rlen != 0);
-    assert(nodenum != 0);
-
-    if (open_len == 0 || *name == 0)
-        SET_ERROR_AND_RETURN((char *)start, XML_INVALID_NODE_NAME);
-
-    cdata = (char *)start;
-    if (*rlen > *len)
-        SET_ERROR_AND_RETURN((char *)start, XML_UNEXPECTED_EOF);
-
-    found = 0;
-    num = *nodenum;
-    restlen = *len;
-    cur = (char *)start;
-    ne = cur + restlen;
-
-#ifdef XML_USE_NODECACHE
-    cacheInitLevel(nc);
-#endif
-
-    /* search for an opening tag */
-    while ((new = memchr(cur, '<', restlen)) != 0)
-    {
-        size_t len_remaining;
-        char *rptr;
-
-        if (*(new+1) == '/')           /* end of section */
-        {
-            *len -= restlen;
-             break;
-        }
-
-        new++;
-        restlen -= new-cur;
-        cur = new;
-
-        if (*cur == '!') /* comment */
-        {
-            char *start = cur;
-            size_t blocklen = restlen;
-            new = __xmlProcessCDATA(&start, &blocklen);
-            if (!new && start && open_len)                       /* CDATA */
-                SET_ERROR_AND_RETURN(cur, XML_INVALID_COMMENT);
-
-            restlen -= new-cur;
-            cur = new;
-            continue;
-        }
-        else if (*cur == '?') /* info block */
-        {
-            new = __xmlInfoProcess(cur, restlen);
-            if (!new)
-                SET_ERROR_AND_RETURN(cur, XML_INVALID_INFO_BLOCK);
-
-            restlen -= new-cur;
-            cur = new;
-            continue;
-        }
-
-        /*
-         * get element name and a pointer to after the opening tag
-         */
-        element = *name;
-        elementlen = *rlen;
-        len_remaining = restlen;
-        rptr = __xml_memncasecmp(cur, &restlen, &element, &elementlen);
-        if (rptr)                      /* requested element was found */
-        {
-            new = rptr;
-            return_len = elementlen;
-            if (found == num)
-            {
-                ret = new;
-                open_len = elementlen;
-                start_tag = element;
-            }
-            else start_tag = 0;
-        }
-        else                           /* different element name was foud */
-        {
-            new = cur + (len_remaining - restlen);
-            if (new >= ne)
-                SET_ERROR_AND_RETURN(cur, XML_UNEXPECTED_EOF);
-
-            element = *name;
-        }
-
-#ifdef XML_USE_NODECACHE
-        nnc = cacheNodeNew(nc);
-#endif
-
-        if (*(new-2) == '/')                           /* e.g. <test/> */
-        {
-            cur = new;
-            if (rptr)
-            {
-#ifdef XML_USE_NODECACHE
-                cacheDataSet(nnc, element, elementlen, rptr, 0);
-#endif
-                if (found == num)
-                {
-                    open_element = start_tag;
-                    *len = 0;
-                }
-                found++;
-            }
-            continue;
-        }
-
-        /*
-         * get the next xml tag
-         */
-        /* restlen -= new-cur; not necessary because of __xml_memncasecmp */
-        cur = new;
-        new = memchr(cur, '<', restlen);
-        if (!new)
-            SET_ERROR_AND_RETURN(cur, XML_ELEMENT_NO_CLOSING_TAG);
-
-        new++;
-        restlen -= new-cur;
-        cur = new;
-        if (*cur == '!')                               /* comment, CDATA */
-        {
-            char *start = cur;
-            size_t blocklen = restlen;
-            new = __xmlProcessCDATA(&start, &blocklen);
-            if (new && start && open_len)                      /* CDATA */
-            {
-                cdata = ret;
-            }
-            else if (!new)
-                SET_ERROR_AND_RETURN(cur, XML_INVALID_COMMENT);
-
-            restlen -= new-cur;
-            cur = new;
-
-            /*
-             * look for the closing tag of the cascading block
-             */
-            new = memchr(cur, '<', restlen);
-            if (!new)
-                SET_ERROR_AND_RETURN(cur, XML_ELEMENT_NO_CLOSING_TAG);
-
-            new++;
-            restlen -= new-cur;
-            cur = new;
-        }
-
-        if (*cur == '/')               /* closing tag of leaf node found */
-        {
-            if (!strncasecmp(new+1, element, elementlen))
-            {
-#ifdef XML_USE_NODECACHE
-                cacheDataSet(nnc, element, elementlen, rptr, new-rptr-1);
-#endif
-                if (*(new+elementlen+1) != '>')
-                    SET_ERROR_AND_RETURN(new+1, XML_ELEMENT_NO_CLOSING_TAG);
-
-                if (found == num)
-                {
-                    if (start_tag)
-                    {
-                        *len = new-ret-1;
-                        open_element = start_tag;
-                        cdata = (char *)start;
-                        start_tag = 0;
-                    }
-                    else /* report error */
-                        SET_ERROR_AND_RETURN(new, XML_ELEMENT_NO_OPENING_TAG);
-                }
-                found++;
-            }
-
-            new = memchr(cur, '>', restlen);
-            if (!new)
-                SET_ERROR_AND_RETURN(cur, XML_ELEMENT_NO_CLOSING_TAG);
-
-            restlen -= new-cur;
-            cur = new;
-            continue;
-        }
-
-        /* no leaf node, continue */
-        if (*cur != '/')                       /* cascading tag found */
-        {
-            char *node = "*";
-            size_t slen = restlen+1; /* due to cur-1 below*/
-            size_t nlen = 1;
-            size_t pos = -1;
-
-            /*
-             * recursively walk the xml tree from here
-             */
-            new = __xmlNodeGet(nnc, cur-1, &slen, &node, &nlen, &pos);
-            if (!new)
-            {
-                if (nlen == 0)         /* error upstream */
-                {
-                    *rlen = nlen;
-                    *name = node;
-                    *len = slen;
-                    return 0;
-                }
-
-                if (slen == restlen)
-                    SET_ERROR_AND_RETURN(cur, XML_UNEXPECTED_EOF);
-
-                slen--;
-                new = cur + slen;
-                restlen -= slen;
-            }
-            else restlen -= slen;
-
-            /* 
-             * look for the closing tag of the cascading block
-             */
-            cur = new;
-            new = memchr(cur, '<', restlen);
-            if (!new)
-                SET_ERROR_AND_RETURN(cur, XML_ELEMENT_NO_CLOSING_TAG);
-
-            new++;
-            restlen -= new-cur;
-            cur = new;
-        }
-
-        if (*cur == '/')                               /* closing tag found */
-        {
-            if (!strncasecmp(new+1, element, elementlen))
-            {
-                if (*(new+elementlen+1) != '>')
-                    SET_ERROR_AND_RETURN(new+1, XML_ELEMENT_NO_CLOSING_TAG);
-
-#ifdef XML_USE_NODECACHE
-                cacheDataSet(nnc, element, elementlen, rptr, new-rptr-1);
-#endif
-                if (found == num)
-                {
-                    if (start_tag)
-                    {
-                        *len = new-ret-1;
-                        open_element = start_tag;
-                        cdata = (char *)start;
-                        start_tag = 0;
-                    }
-                    else /* report error */
-                        SET_ERROR_AND_RETURN(new, XML_ELEMENT_NO_OPENING_TAG);
-                }
-                found++;
-            }
-
-            new = memchr(cur, '>', restlen);
-            if (!new)
-                SET_ERROR_AND_RETURN(cur, XML_ELEMENT_NO_CLOSING_TAG);
-
-            restlen -= new-cur;
-            cur = new;
-        }
-        else
-            SET_ERROR_AND_RETURN(cur, XML_ELEMENT_NO_CLOSING_TAG);
-
-    } /* while */
-
-    if (found == 0)
-    {
-        ret = 0;
-        *rlen = 0;
-        *name = start_tag;
-        *len = XML_NO_ERROR;   /* element not found, no real error */
-    }
-    else
-    {
-        *rlen = open_len;
-        *name = open_element;
-        *nodenum = found;
-    }
-
-    return ret;
-}
-
-char *
-__xmlProcessCDATA(char **start, size_t *len)
-{
-    char *cur, *new;
-    size_t restlen = *len;
-
-    cur = *start;
-    if ((restlen > 6) && (*(cur+1) == '-'))             /* comment */
-    {
-        new = __xmlCommentSkip(cur, restlen);
-        if (new)
-        {
-            *start = new;
-            *len = 0;
-        }
-        return new;
-    }
-
-    if (restlen < 12) return 0;                         /* ![CDATA[ ]]> */
-
-    cur = *start;
-    new = 0;
-
-    if (memcmp(cur, "![CDATA[", 8) == 0)
-    {
-        *start = cur+8;
-        cur += 8;
-        restlen -= 8;
-        do
-        {
-            new = memchr(cur, ']', restlen);
-            if (new)
-            {
-                if ((restlen > 3) && (memcmp(new, "]]>", 3) == 0))
-                {
-                    *len = new-1 - *start;
-                    restlen -= 3;
-                    new += 3;
-                    break;
-                }
-                cur = new+1;
-            }
-            else
-            {
-                *len = 0;
-                break;
-            }
-        }
-        while (new && (restlen > 2));
-    }
-
-    return new;
-}
-
-char *
-__xmlCommentSkip(const char *start, size_t len)
-{
-    char *cur, *new;
-
-    if (len < 7) return 0;                              /* !-- --> */
-
-    cur = (char *)start;
-    new = 0;
-
-    if (memcmp(cur, "!--", 3) == 0)
-    {
-        cur += 3;
-        len -= 3;
-        do
-        {
-            new = memchr(cur, '-', len);
-            if (new)
-            {
-                len -= new-cur;
-                if ((len >= 3) && (memcmp(new, "-->", 3) == 0))
-                {
-                    new += 3;
-                    /* len -= 3; */
-                    break;
-                }
-                cur = new+1;
-                len -= cur-new;
-            }
-            else break;
-        }
-        while (new && (len > 2));
-    }
-
-    return new;
-}
-
-char *
-__xmlInfoProcess(const char *start, size_t len)
-{
-    char *cur, *new;
-
-    cur = (char *)start;
-    new = 0;
-
-    if (*cur == '?')
-    {
-        if (len < 3) return 0;                         /* <? ?> */
-
-        cur++;
-        len--;
-        new = memchr(cur, '?', len);
-        if (!new || *(new+1) != '>') return 0;
-
-        new += 2;
-    }
-
-    return new;
-}
-
-
-static void
-__xmlPrepareData(char **start, size_t *blocklen)
-{
-    size_t len = *blocklen;
-    char *pe, *ps = *start;
-
-    if (len > 1)
-    {
-        pe = ps + len-1;
-        while ((ps<pe) && isspace(*ps)) ps++;
-        while ((pe>ps) && isspace(*pe)) pe--;
-        len = (pe-ps)+1;
-    }
-    else if (isspace(*(ps+1))) len--;
-
-    /* CDATA or comment */
-    if ((len >= 2) && !strncmp(ps, "<!", 2))
-    {
-        char *start = ps+1;
-        size_t blocklen = len-1;
-        if (blocklen >= 6)                  /* !-- --> */
-        {
-            char *new = __xmlProcessCDATA(&start, &len);
-            if (new)
-            {
-                ps = start;
-                pe = ps + len;
-
-                while ((ps<pe) && isspace(*ps)) ps++;
-                while ((pe>ps) && isspace(*pe)) pe--;
-                len = (pe-ps);
-            }
-        }
-    }
-
-    *start = ps;
-    *blocklen = len;
-}
-
-#define NOCASECMP(a,b)  ( ((a)^(b)) & 0xdf )
-void *
-__xml_memncasecmp(const char *haystack, size_t *haystacklen,
-                  char **needle, size_t *needlelen)
-{
-    char *rptr = 0;
-
-    if (haystack && needle && needlelen && (*needlelen > 0)
-        && (*haystacklen >= *needlelen))
-    {
-        char *hs = (char *)haystack;
-        char *ns;
-        size_t i;
-
-        ns = *needle;
-
-        /* search for everything */
-        if ((*ns == '*') && (*needlelen == 1))
-        {
-           char *he = hs + *haystacklen;
-
-           while ((hs < he) && !isspace(*hs) && (*hs != '>')) hs++;
-           if (*(hs-1) == '/') hs--;
-
-           *needle = (char *)haystack;
-           *needlelen = hs - haystack;
-
-           ns = memchr(hs, '>', he-hs);
-           if (ns) hs = ns+1;
-           else hs = he;
-     
-           rptr = hs;
-        }
-        else
-        {
-            size_t nlen = *needlelen;
-            char *he = hs + *haystacklen;
-
-            for (i=0; i<nlen; i++)
-            {
-                if (NOCASECMP(*hs,*ns) && (*ns != '?')) break;
-                if (isspace(*hs) || (*hs == '/') || (*hs == '>')) break;
-                hs++;
-                ns++;
-            }
-
-            if (i == nlen)
-            {
-                *needle = (char *)haystack;
-                *needlelen = hs - haystack;
-
-                ns = memchr(hs, '>', he-hs);
-                if (ns) hs = ns+1;
-                else hs = he;
-
-                rptr = hs;
-            }
-            else /* not found */
-            {
-                while((hs < he) && !isspace(*hs) && (*hs != '>')) hs++;
-                if (*(hs-1) == '/') hs--;
-
-                *needle = (char *)haystack;
-                *needlelen = hs - haystack;
-
-                ns = memchr(hs, '>', he-hs);
-                if (ns) hs = ns+1;
-                else hs = he;
-            }
-        }
-
-        *haystacklen -= hs - haystack;
-    }
-
-    return rptr;
-}
-
-#ifndef XML_NONVALIDATING
-void
-__xmlErrorSet(const void *id, const char *pos, unsigned int err_no)
-{
-   struct _xml_id *xid = (struct _xml_id *)id;
-   struct _root_id *rid;
-
-   assert(xid != 0);
-
-   if (xid->name) rid = xid->root;
-   else rid = (struct _root_id *)xid;
-
-   assert(rid != 0);
-   if (rid->info == 0)
-   {
-      rid->info = malloc(sizeof(struct _xml_error));
-   }
-
-   if (rid->info)
-   {
-      struct _xml_error *err = rid->info;
-
-      err->pos = (char *)pos;
-      err->err_no = err_no;
-   }
-}
-#endif
-
-#ifdef WIN32
-/* Source:
- * https://mollyrocket.com/forums/viewtopic.php?p=2529
- */
-
-void *
-simple_mmap(int fd, size_t length, SIMPLE_UNMMAP *un)
-{
-    HANDLE f;
-    HANDLE m;
-    void *p;
-
-    f = (HANDLE)_get_osfhandle(fd);
-    if (!f) return (void *)-1;
-
-    m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL);
-    if (!m) return (void *)-1;
-
-    p = MapViewOfFile(m, FILE_MAP_READ, 0,0,0);
-    if (!p)
-    {
-        CloseHandle(m);
-        return (void *)-1;
-    }
-
-    if (un)
-    {
-        un->m = m;
-        un->p = p;
-    }
-
-    return p;
-}
-
-void
-simple_unmmap(SIMPLE_UNMMAP *un)
-{
-    UnmapViewOfFile(un->p);
-    CloseHandle(un->m);
-}
-#endif
diff --git a/utils/xmlgrep/xml.h b/utils/xmlgrep/xml.h
deleted file mode 100644 (file)
index 7431b4b..0000000
+++ /dev/null
@@ -1,434 +0,0 @@
-/* Copyright (c) 2007-2009 by Adalin B.V.
- * Copyright (c) 2007-2009 by Erik Hofman
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of (any of) the copyrightholder(s) nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
- * THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __XML_CONFIG
-#define __XML_CONFIG 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#undef XML_NONVALIDATING
-
-#ifdef XML_USE_NODECACHE
-#include "xml_cache.h"
-#else
-void *cacheGet(void *);
-#endif
-
-enum
-{
-    XML_NO_ERROR = 0,
-    XML_OUT_OF_MEMORY,
-    XML_FILE_NOT_FOUND,
-    XML_INVALID_NODE_NAME,
-    XML_UNEXPECTED_EOF,
-    XML_TRUNCATE_RESULT,
-    XML_INVALID_COMMENT,
-    XML_INVALID_INFO_BLOCK,
-    XML_ELEMENT_NO_OPENING_TAG,
-    XML_ELEMENT_NO_CLOSING_TAG,
-    XML_ATTRIB_NO_OPENING_QUOTE,
-    XML_ATTRIB_NO_CLOSING_QUOTE,
-    XML_MAX_ERROR
-};
-
-#ifdef WIN32
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-
-typedef struct
-{
-    HANDLE m;
-    void *p;
-} SIMPLE_UNMMAP;
-#endif
-
-#ifndef XML_NONVALIDATING
-struct _xml_error
-{
-    char *pos;
-    int err_no;
-};
-#endif
-
-/*
- * It is required for both the rood node and the normal xml nodes to both
- * have 'char *name' defined as the first entry. The code tests whether
- * name == 0 to detect the root node.
- */
-struct _root_id
-{
-    char *name;
-    char *start;
-    size_t len;
-    int fd;
-#ifdef XML_USE_NODECACHE
-    void *node;
-#endif
-#ifndef XML_NONVALIDATING
-    struct _xml_error *info;
-#endif
-#ifdef WIN32
-    SIMPLE_UNMMAP un;
-#endif
-};
-
-struct _xml_id
-{
-    char *name;
-    char *start;
-    size_t len;
-    size_t name_len;
-#ifndef XML_NONVALIDATING
-    struct _root_id *root;
-#endif
-#ifdef XML_USE_NODECACHE
-    void *node;
-#endif
-};
-
-
-
-/**
- * Open an XML file for processing.
- *
- * @param fname path to the file 
- * @return XML-id which is used for further processing
- */
-void *xmlOpen(const char *);
-
-/**
- * Process a section of XML code in a preallocated buffer.
- * The buffer may not be free'd until xmlClose has been called.
- *
- * @param buffer pointer to the buffer
- * @param size size of the buffer
- * @return XML-id which is used for further processing
- */
-void *xmlInitBuffer(const char *, size_t);
-
-/**
- * Close the XML file after which no further processing is possible.
- *
- * @param xid XML-id
- */
-void xmlClose(void *);
-
-
-/**
- * Locate a subsection of the xml tree for further processing.
- * This adds processing speed since the reuired nodes will only be searched
- * in the subsection.
- *
- * The memory allocated for the XML-subsection-id has to be freed by the
- * calling process.
- *
- * @param xid XML-id
- * @param node path to the node containing the subsection
- * @return XML-subsection-id for further processing
- */
-void *xmlNodeGet(const void *, const char *);
-
-/**
- * Copy a subsection of the xml tree for further processing.
- * This is useful when it's required to process a section of the XML code
- * after the file has been closed. The drawback is the added memory
- * requirements.
- *
- * The memory allocated for the XML-subsection-id has to be freed by the
- * calling process.
- *
- * @param xid XML-id
- * @param node path to the node containing the subsection
- * @return XML-subsection-id for further processing
- */
-void *xmlNodeCopy(const void *, const char *);
-
-
-/**
- * Return the name of this node.
- * The returned string has to be freed by the calling process.
- *
- * @param xid XML-id
- * @return a newly alocated string containing the node name
- */
-char *xmlNodeGetName(const 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 xmlNodeCopyName(const void *, char *, size_t);
-
-
-/**
- * Create a marker XML-id that starts out with the same settings as the
- * refference XML-id.
- *
- * Marker id's are required when xmlNodeGetNum() and xmlNodeGetPos() are used
- * to walk a number of nodes. The xmlNodeGetPos function adjusts the contents
- * of the provided XML-id to keep track of it's position within the xml section.
- * The returned XML-id is limited to the boundaries of the requested XML tag
- * and has to be freed by the calling process.
- *
- * @param xid reference XML-id
- * @return a copy of the reference XML-id
- */
-void *xmlMarkId(const void *);
-
-/**
- * Get the number of nodes with the same name from a specified xml path.
- *
- * @param xid XML-id
- * @param path path to the xml node
- * @return the number count of the nodename
- */
-unsigned int xmlNodeGetNum(const void *, const char *);
-
-/**
- * Get the nth occurrence of node in the parent node.
- * The return value should never be altered or freed by the caller.
- *
- * @param pid XML-id of the parent node of this node
- * @param xid XML-id
- * @param node name of the node to search for
- * @param num specify which occurence to return
- * @return XML-subsection-id for further processing or NULL if unsuccessful
- */
-void *xmlNodeGetPos(const void *, void *, const char *, size_t);
-
-
-/**
- * Get a string of characters from the current node.
- * The returned string has to be freed by the calling process.
- *
- * @param xid XML-id
- * @return a newly alocated string containing the contents of the node
- */
-char *xmlGetString(const void *);
-
-/**
- * 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(const void *, char *, size_t);
-
-/**
- * Compare the value of this node to a reference string.
- * Comparing is done in a case insensitive way.
- *
- * @param xid XML-id
- * @param str the string to compare to
- * @return an integer less than, equal to, ro greater than zero if the value
- * of the node is found, respectively, to be less than, to match, or be greater
- * than str
- */
-int xmlCompareString(const void *, const char *);
-
-/**
- * Get a string of characters from a specified xml path.
- * The returned string has to be freed by the calling process.
- *
- * @param xid XML-id
- * @param path path to the xml node
- * @return a newly alocated string containing the contents of the node
- */
-char *xmlNodeGetString(const void *, const char *);
-
-/**
- * Get a string of characters from a specified xml path.
- * 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 path path to the xml node
- * @param buffer the buffer to copy the string to
- * @param buflen length of the destination buffer
- * @return the length of the string
- */
-size_t xmlNodeCopyString(const void *, const char *, char *, size_t);
-
-/**
- * Compare the value of a node to a reference string.
- * Comparing is done in a case insensitive way.
- *
- * @param xid XML-id
- * @param path path to the xml node to compare to
- * @param str the string to compare to
- * @return an integer less than, equal to, ro greater than zero if the value
- * of the node is found, respectively, to be less than, to match, or be greater
- * than str
- */
-int xmlNodeCompareString(const void *, const char *, const char *);
-
-/**
- * Get a string of characters from a named attribute.
- * The returned string has to be freed by the calling process.
- *
- * @param xid XML-id
- * @param name name of the attribute to acquire
- * @return the contents of the node converted to an integer value
- */
-char *xmlAttributeGetString(const void *, const char *);
-
-/**
- * Get a string of characters from a named attribute.
- * 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 name name of the attribute to acquire.
- * @param buffer the buffer to copy the string to
- * @param buflen length of the destination buffer
- * @return the length of the string
- */
-size_t xmlAttributeCopyString(const void *, const char *, char *, size_t);
-
-/**
- * Compare the value of an attribute to a reference string.
- * Comparing is done in a case insensitive way.
- *
- * @param xid XML-id
- * @param name name of the attribute to acquire.
- * @param str the string to compare to
- * @return an integer less than, equal to, ro greater than zero if the value
- * of the node is found, respectively, to be less than, to match, or be greater
- * than str
- */
-int xmlAttributeCompareString(const void *, const char *, const char *);
-
-
-/**
- * Get the integer value from the current node/
- *
- * @param xid XML-id
- * @return the contents of the node converted to an integer value
- */
-long int xmlGetInt(const void *);
-
-/**
- * Get an integer value from a specified xml path.
- *
- * @param xid XML-id
- * @param path path to the xml node
- * @return the contents of the node converted to an integer value
- */
-long int xmlNodeGetInt(const void *, const char *);
-
-/**
- * Get the integer value from the named attribute.
- *
- * @param xid XML-id
- * @param name name of the attribute to acquire
- * @return the contents of the node converted to an integer value
- */
-long int xmlAttributeGetInt(const void *, const char *);
-
-
-/**
- * Get the double value from the curent node/
- *
- * @param xid XML-id
- * @return the contents of the node converted to a double value
- */
-double xmlGetDouble(const void *);
-
-/**
- * Get a double value from a specified xml path/
- *
- * @param xid XML-id
- * @param path path to the xml node
- * @return the contents of the node converted to a double value
- */
-double xmlNodeGetDouble(const void *, const char *);
-
-/**
- * Get the double value from the named attribute.
- *
- * @param xid XML-id
- * @param name name of the attribute to acquire
- * @return the contents of the node converted to an integer value
- */
-double xmlAttributeGetDouble(const void *, const char *);
-
-
-/**
- * Get the error number of the last error and clear it.
- *
- * @param xid XML-id
- * @param clear clear the error state if non zero
- * @return the numer of the last error, 0 means no error detected.
- */
-int xmlErrorGetNo(const void *, int);
-
-/**
- * Get the line number of the last detected syntax error in the xml file.
- *
- * @param xid XML-id
- * @param clear clear the error state if non zero
- * @return the line number of the detected syntax error.
- */
-size_t xmlErrorGetLineNo(const void *, int);
-
-/**
- * Get the column number of the last detected syntax error in the xml file.
- *
- * @param xid XML-id
- * @param clear clear the error state if non zero
- * @return the line number of the detected syntax error.
- */
-size_t xmlErrorGetColumnNo(const void *, int);
-
-/**
- * Get a string that explains the last error.
- *
- * @param xid XML-id
- * @param clear clear the error state if non zero
- * @return a string that explains the last error.
- */
-const char *xmlErrorGetString(const void *, int);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __XML_CONFIG */
-
diff --git a/utils/xmlgrep/xml_cache.c b/utils/xmlgrep/xml_cache.c
deleted file mode 100644 (file)
index 7de2e83..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-/* Copyright (c) 2007-2009 by Adalin B.V.
- * Copyright (c) 2007-2009 by Erik Hofman
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *      * Redistributions of source code must retain the above copyright
- *         notice, this list of conditions and the following disclaimer.
- *      * Redistributions in binary form must reproduce the above copyright
- *         notice, this list of conditions and the following disclaimer in the
- *         documentation and/or other materials provided with the distribution.
- *      * Neither the name of (any of) the copyrightholder(s) nor the
- *         names of its contributors may be used to endorse or promote products
- *         derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#include "xml.h"
-
-#ifndef NDEBUG
-# define PRINT(a, b, c) { \
-   size_t l1 = (b), l2 = (c); \
-   char *s = (a); \
-   if (s) { \
-      size_t q, len = l2; \
-      if (l1 < l2) len = l1; \
-      if (len < 50000) { \
-         printf("(%i) '", len); \
-         for (q=0; q<len; q++) printf("%c", s[q]); \
-         printf("'\n"); \
-      } else printf("Length (%u) seems too large at line %i\n",len, __LINE__); \
-   } else printf("NULL pointer at line %i\n", __LINE__); \
-}
-#endif
-
-#if !defined(XML_USE_NODECACHE)
-void *
-cacheNodeGet(void *id, const char *node)
-{
-    return 0;
-}
-
-#else
-
-#define NODE_BLOCKSIZE          16
-
-struct _xml_node
-{
-    void *parent;
-    char *name;
-    size_t name_len;
-    char *data;
-    size_t data_len;
-    void **node;
-    size_t no_nodes;
-    size_t first_free;
-};
-
-char *
-__xmlNodeGetFromCache(void **nc, const char *start, size_t *len,
-                      char **element, size_t *elementlen , size_t *nodenum)
-{
-    struct _xml_node *cache;
-    size_t num = *nodenum;
-    char *name = *element;
-    void *rv = 0;
-
-    assert(nc != 0);
-    cache = (struct _xml_node *)*nc;
-    assert(cache != 0);
-
-    assert((cache->first_free > num) || (cache->first_free == 0));
-
-    if (cache->first_free == 0) /* leaf node */
-    {
-        rv = cache->data;
-        *len = cache->data_len;
-        *element = cache->name;
-        *elementlen = cache->name_len;
-        *nodenum = 0;
-    }
-    else if (*name == '*')
-    {
-        struct _xml_node *node = cache->node[num];
-        *nc = node;
-        rv = node->data;
-        *len = node->data_len;
-        *element = node->name;
-        *elementlen = node->name_len;
-        *nodenum = cache->first_free;
-    }
-    else
-    {
-        size_t namelen = *elementlen;
-        size_t i, pos = 0;
-
-        for (i=0; i<cache->first_free; i++)
-        {
-            struct _xml_node *node = cache->node[i];
-
-            assert(node);
-
-            if ((node->name_len == namelen) &&
-                (!strncasecmp(node->name, name, namelen)))
-            {
-                 if (pos == num)
-                 {
-                     *nc = node;
-                     rv = node->data;
-                     *element = node->name;
-                     *elementlen = node->name_len;
-                     *len = node->data_len;
-                     *nodenum = cache->first_free;
-                     break;
-                 }
-                 pos++;
-            }
-        }
-    }
-
-    return rv;
-}
-
-
-void *
-cacheInit()
-{
-   return calloc(1, sizeof(struct _xml_node));
-}
-
-void
-cacheInitLevel(void *nc)
-{
-    struct _xml_node *cache = (struct _xml_node *)nc;
-
-    assert(cache != 0);
-
-    cache->node = calloc(NODE_BLOCKSIZE, sizeof(struct _xml_node *));
-    cache->no_nodes = NODE_BLOCKSIZE;
-}
-
-void
-cacheFree(void *nc)
-{
-    struct _xml_node *cache = (struct _xml_node *)nc;
-
-    assert(nc != 0);
-
-    if (cache->first_free)
-    {
-        struct _xml_node **node = (struct _xml_node **)cache->node;
-        size_t i = 0;
-
-        while(i < cache->first_free)
-        {
-            cacheFree(node[i++]);
-        }
-
-        free(node);
-    }
-    free(cache);
-}
-
-void *
-cacheNodeGet(void *id)
-{
-    struct _xml_id *xid = (struct _xml_id *)id;
-    struct _xml_node *cache = 0;
-
-    assert(xid != 0);
-
-    if (xid->name)
-    {
-        cache = xid->node;
-    }
-    else
-    {
-        struct _root_id *rid = (struct _root_id *)xid;
-        cache = rid->node;
-    }
-
-    return cache;
-}
-
-void *
-cacheNodeNew(void *nc)
-{
-    struct _xml_node *cache = (struct _xml_node *)nc;
-    struct _xml_node *rv = 0;
-    size_t i = 0;
-
-    assert(nc != 0);
-
-    i = cache->first_free;
-    if (i == cache->no_nodes)
-    {
-        size_t size, no_nodes;
-        void *p;
-
-        no_nodes = cache->no_nodes + NODE_BLOCKSIZE;
-        size = no_nodes * sizeof(struct _xml_node *);
-        p = realloc(cache->node, size);
-        if (!p) return 0;
-
-        cache->node = p;
-        cache->no_nodes = no_nodes;
-    }
-
-    rv = calloc(1, sizeof(struct _xml_node));
-    if (rv) rv->parent = cache;
-    cache->node[i] = rv;
-    cache->first_free++;
-
-    return rv;
-}
-
-void
-cacheDataSet(void *n, char *name, size_t namelen, char *data, size_t datalen)
-{
-   struct _xml_node *node = (struct _xml_node *)n;
-
-   assert(node != 0);
-   assert(name != 0);
-   assert(namelen != 0);
-   assert(data != 0);
-
-   node->name = name;
-   node->name_len = namelen;
-   node->data = data;
-   node->data_len = datalen;
-}
-
-#endif
-
diff --git a/utils/xmlgrep/xml_cache.h b/utils/xmlgrep/xml_cache.h
deleted file mode 100644 (file)
index b94fb53..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Copyright (c) 2007-2009 by Adalin B.V.
- * Copyright (c) 2007-2009 by Erik Hofman
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of (any of) the copyrightholder(s) nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __XML_NODECACHE
-#define __XML_NODECACHE 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void *cacheInit();
-void cacheInitLevel(void *);
-void cacheFree(void *);
-void *cacheNodeNew(void *);
-
-void *cacheNodeGet(void *);
-void cacheDataSet(void *, char *, size_t, char *, size_t);
-
-char *__xmlNodeGetFromCache(void **, const char *, size_t *, char **, size_t *, size_t *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __XML_NODECACHE */
-
diff --git a/utils/xmlgrep/xmlgrep.c b/utils/xmlgrep/xmlgrep.c
deleted file mode 100644 (file)
index 23577b0..0000000
+++ /dev/null
@@ -1,442 +0,0 @@
-#include <stdio.h>
-
-#define _GNU_SOURCE
-#include <stdlib.h>
-#include <string.h>
-#ifndef _MSC_VER
-# include <strings.h>
-# include <unistd.h>   /* read */
-#else
-# define strncasecmp strnicmp
-# include <stdlib.h>
-# include <io.h>
-#endif
-#include <assert.h>
-#include <sys/stat.h>  /* fstat */
-#include <fcntl.h>     /* open */
-
-#include "xml.h"
-
-static const char *_static_root = "/";
-static const char *_static_element = "*";
-static unsigned int _fcount = 0;
-static char **_filenames = 0;
-static char *_element = 0;
-static char *_value = 0;
-static char *_root = 0;
-static char *_print = 0;
-static char *_attribute = 0;
-static int print_filenames = 0;
-
-static void free_and_exit(int i);
-
-#define USE_BUFFER             0
-#define NODE_NAME_LEN          256
-#define STRING_LEN             2048
-
-#define SHOW_NOVAL(opt) \
-{ \
-    printf("option '%s' requires a value\n\n", (opt)); \
-    free_and_exit(-1); \
-}
-
-void
-show_help ()
-{
-    printf("usage: xmlgrep [options] [file ...]\n\n");
-    printf("Options:\n");
-    printf("\t-h\t\tshow this help message\n");
-    printf("\t-a <string>\tprint this attribute as the output\n");
-    printf("\t-e <id>\t\tshow sections that contain this element\n");
-    printf("\t-p <id>\t\tprint this element as the output\n");
-    printf("\t-r <path>\tspecify the XML search root\n");
-    printf("\t-v <string>\tfilter sections that contain this vale\n\n");
-    printf(" To print the contents of the 'type' element of the XML section ");
-    printf("that begins\n at '/printer/output' use the following command:\n\n");
-    printf("\txmlgrep -r /printer/output -p type sample.xml\n\n");
-    printf(" To filter 'output' elements under '/printer' that have attribute");
-    printf(" 'n' set to '1'\n use the following command:\n\n");
-    printf("\txmlgrep -r /printer -p output -a n -v 1 sample.xml\n\n");
-    printf(" To filter out sections that contain the 'driver' element with ");
-    printf("'generic' as\n it's value use the following command:");
-    printf("\n\n\txmlgrep -r /printer/output -e driver -v generic sample.xml");
-    printf("\n\n");
-    free_and_exit(0);
-}
-
-void
-free_and_exit(int ret)
-{
-    if (_root && _root != _static_root) free(_root);
-    if (_element && _element != _static_element) free(_element);
-    if (_value) free(_value);
-    if (_print) free(_print);
-    if (_attribute) free(_attribute);
-    if (_filenames)
-    {
-        unsigned int i;
-        for (i=0; i < _fcount; i++)
-        {
-            if (_filenames[i])
-            {
-                if (print_filenames) printf("%s\n", _filenames[i]);
-                free(_filenames[i]);
-            }
-        }
-        free(_filenames);
-    }
-    exit(ret);
-}
-
-int
-parse_option(char **args, int n, int max)
-{
-    char *opt, *arg = 0;
-    unsigned int alen = 0;
-    unsigned int olen;
-
-    opt = args[n];
-    if (strncmp(opt, "--", 2) == 0)
-        opt++;
-
-    if ((arg = strchr(opt, '=')) != NULL)
-    {
-        *arg++ = 0;
-    }
-    else if (++n < max)
-    {
-        arg = args[n];
-#if 0
-        if (arg && arg[0] == '-')
-            arg = 0;
-#endif
-    }
-
-    olen = strlen(opt);
-    if (strncmp(opt, "-help", olen) == 0)
-    {
-        show_help();
-    }
-    else if (strncmp(opt, "-root", olen) == 0)
-    {
-        if (arg == 0) SHOW_NOVAL(opt);
-        alen = strlen(arg)+1;
-        if (_root) free(_root);
-        _root = malloc(alen);
-        memcpy(_root, arg, alen);
-        return 2;
-    }
-    else if (strncmp(opt, "-element", olen) == 0)
-    {
-        if (arg == 0) SHOW_NOVAL(opt);
-        alen = strlen(arg)+1;
-        if (_element) free(_element);
-        _element = malloc(alen);
-        memcpy(_element, arg, alen);
-        return 2;
-    }
-    else if (strncmp(opt, "-value", olen) == 0)
-    {
-        if (arg == 0) SHOW_NOVAL(opt);
-        alen = strlen(arg)+1;
-        if (_value) free(_value);
-        _value = malloc(alen);
-        memcpy(_value, arg, alen);
-        return 2;
-    }
-    else if (strncmp(opt, "-print", olen) == 0)
-    {
-        if (arg == 0) SHOW_NOVAL(opt);
-        alen = strlen(arg)+1;
-        if (_print) free(_print);
-        _print = malloc(alen);
-        memcpy(_print, arg, alen);
-        return 2;
-    }
-    else if (strncmp(opt, "-attribute", olen) == 0)
-    {
-        if (arg == 0) SHOW_NOVAL(opt);
-        alen = strlen(arg)+1;
-        if (_attribute) free(_attribute);
-        _attribute = malloc(alen);
-        memcpy(_attribute, arg, alen);
-        return 2;
-    }
-    else if (strncmp(opt, "-list-filenames", olen) == 0)
-    { /* undocumented test argument */
-        print_filenames = 1;
-        return 1;
-    }
-    else if (opt[0] == '-')
-    {
-        printf("Unknown option %s\n", opt);
-        free_and_exit(-1);
-    }
-    else
-    {
-        int pos = _fcount++;
-        if (_filenames == 0)
-        {
-            _filenames = (char **)malloc(sizeof(char*));
-        }
-        else
-        {
-            char **ptr = (char **)realloc(_filenames, _fcount*sizeof(char*));
-            if (ptr == 0)
-            {
-                printf("Out of memory.\n\n");
-                free_and_exit(-1);
-            }
-           _filenames = ptr;
-        }
-
-        alen = strlen(opt)+1;
-        _filenames[pos] = malloc(alen);
-        memcpy(_filenames[pos], opt, alen);
-    }
-
-    return 1;
-}
-
-void walk_the_tree(size_t num, void *xid, char *tree)
-{
-    unsigned int i, no_elements;
-
-    if (!tree)                                 /* last node from the tree */
-    {
-        void *xmid = xmlMarkId(xid);
-        if (xmid && _print)
-        {
-            no_elements = xmlNodeGetNum(xid, _print);
-            for (i=0; i<no_elements; i++)
-            {
-                if (xmlNodeGetPos(xid, xmid, _print, i) != 0)
-                {
-                    char *value;
-
-                    value = xmlGetString(xmid);
-                    if (_value && _attribute && value)
-                    {
-#if 1
-                       char *a = xmlAttributeGetString(xmid, _attribute);
-                       if (a && !strcmp(a, _value))
-#else
-                       if (!xmlAttributeCompareString(xmid, _attribute, _value))
-#endif
-                       {
-                          printf("%s: <%s %s=\"%s\">%s</%s>\n",
-                                 _filenames[num], _print, _attribute, _value,
-                                                  value, _print);
-                       }
-                       if (value) free(value);
-                    }
-                    else
-                    {
-                       printf("%s: <%s>%s</%s>\n",
-                              _filenames[num], _print, value, _print);
-                    }
-                }
-            }
-            free(xmid);
-        }
-        else if (xmid && _value)
-        {
-            no_elements = xmlNodeGetNum(xmid, _element);
-            for (i=0; i<no_elements; i++)
-            {
-                if (xmlNodeGetPos(xid, xmid, _element, i) != 0)
-                {
-                    char nodename[NODE_NAME_LEN];
-
-                    xmlNodeCopyName(xmid, (char *)&nodename, NODE_NAME_LEN);
-                    if (xmlCompareString(xmid, _value) == 0)
-                    {
-                        printf("%s: <%s>%s</%s>\n",
-                               _filenames[num], nodename, _value, nodename);
-                    }
-                }
-            }
-            free(xmid);
-        }
-        else if (xmid && _element)
-        {
-            char parentname[NODE_NAME_LEN];
-
-            xmlNodeCopyName(xid, (char *)&parentname, NODE_NAME_LEN);
-
-            no_elements = xmlNodeGetNum(xmid, _element);
-            for (i=0; i<no_elements; i++)
-            {
-                if (xmlNodeGetPos(xid, xmid, _element, i) != 0)
-                {
-                    char nodename[NODE_NAME_LEN];
-
-                    xmlNodeCopyName(xmid, (char *)&nodename, NODE_NAME_LEN);
-                    if (!strncasecmp((char*)&nodename, _element, NODE_NAME_LEN))
-                    {
-                        char value[NODE_NAME_LEN];
-                        xmlCopyString(xmid, (char *)&value, NODE_NAME_LEN);
-                        printf("%s: <%s> <%s>%s</%s> </%s>\n",
-                                _filenames[num], parentname, nodename, value,
-                                                 nodename, parentname);
-                    }
-                }
-            }
-        }
-        else printf("Error executing xmlMarkId\n");
-    }
-    else if (xid)                       /* walk the rest of the tree */
-    {
-        char *elem, *next;
-        void *xmid;
-
-        elem = tree;
-        if (*elem == '/') elem++;
-
-        next = strchr(elem, '/');
-        
-        xmid = xmlMarkId(xid);
-        if (xmid)
-        {
-            if (next)
-            {
-               *next++ = 0;
-            }
-
-            no_elements = xmlNodeGetNum(xid, elem);
-            for (i=0; i<no_elements; i++)
-            {
-                if (xmlNodeGetPos(xid, xmid, elem, i) != 0)
-                    walk_the_tree(num, xmid, next);
-            }
-
-            if (next)
-            {
-               *--next = '/';
-            }
-
-            free(xmid);
-        }
-        else printf("Error executing xmlMarkId\n");
-    }
-}
-
-void grep_file(unsigned num)
-{
-    void *xid;
-
-    xid = xmlOpen(_filenames[num]);
-    if (xid)
-    {
-       void *xrid = xmlMarkId(xid);
-       int r = 0;
-
-       walk_the_tree(num, xrid, _root);
-
-       r = xmlErrorGetNo(xrid, 0);
-       if (r)
-       {
-            size_t n = xmlErrorGetLineNo(xrid, 0);
-            size_t c = xmlErrorGetColumnNo(xrid, 0);
-            const char *s = xmlErrorGetString(xrid, 1); /* clear the error */
-            printf("%s: at line %u, column %u: '%s'\n",_filenames[num], n,c, s);
-       }
-
-       free(xrid);
-    }
-    else
-    {
-        fprintf(stderr, "Error reading file '%s'\n", _filenames[num]);
-    }
-
-    xmlClose(xid);
-}
-
-
-void grep_file_buffer(unsigned num)
-{
-    struct stat st;
-    void *xid, *buf;
-    int fd, res;
-
-    fd = open(_filenames[num], O_RDONLY);
-    if (fd == -1)
-    {
-        printf("read error opening file '%s'\n", _filenames[num]);
-        return;
-    }
-    
-    fstat(fd, &st);
-    buf = malloc(st.st_size);
-    if (!buf)
-    {
-        printf("unable to allocate enough memory for reading.\n");
-        return;
-    }
-
-    res = read(fd, buf, st.st_size);
-    if (res == -1)
-    {
-        printf("unable to read from file '%s'.\n", _filenames[num]);
-        return;
-    }
-    close(fd);
-
-    xid = xmlInitBuffer(buf, st.st_size);
-    if (xid)
-    {
-       void *xrid = xmlMarkId(xid);
-       int r = 0;
-
-       walk_the_tree(num, xrid, _root);
-
-       r = xmlErrorGetNo(xrid, 0);
-       if (r)
-       {
-            size_t n = xmlErrorGetLineNo(xrid, 0);
-            size_t c = xmlErrorGetColumnNo(xrid, 0);
-            const char *s = xmlErrorGetString(xrid, 1); /* clear the error */
-            printf("%s: at line %u, column %u: '%s'\n",_filenames[num], n,c, s);
-       }
-
-       free(xrid);
-    }
-    else
-    {
-        fprintf(stderr, "Error reading file '%s'\n", _filenames[num]);
-    }
-
-    xmlClose(xid);
-    free(buf);
-}
-
-int
-main (int argc, char **argv)
-{
-    unsigned int u;
-    int i;
-
-    if (argc == 1)
-        show_help();
-
-    for (i=1; i<argc;)
-    {
-        int ret = parse_option(argv, i, argc);
-        i += ret;
-    }
-
-    if (_root == 0) _root = (char *)_static_root;
-    if (_element == 0) _element = (char *)_static_element;
-
-    for (u=0; u<_fcount; u++)
-#if USE_BUFFER
-        grep_file_buffer(u);
-#else
-        grep_file(u);
-#endif
-
-    free_and_exit(0);
-
-    return 0;
-}