]> git.mxchange.org Git - flightgear.git/blobdiff - utils/xmlgrep/xmlgrep.c
Merge branch 'ehofman/version'
[flightgear.git] / utils / xmlgrep / xmlgrep.c
index aa59d5300e91ea312508457dbe6d076be31d9448..23577b0c8d2415a25343817e413c1dcd33836cf1 100644 (file)
@@ -5,11 +5,15 @@
 #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"
 
@@ -26,6 +30,10 @@ 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)); \
@@ -114,6 +122,7 @@ parse_option(char **args, int n, int max)
     {
         if (arg == 0) SHOW_NOVAL(opt);
         alen = strlen(arg)+1;
+        if (_root) free(_root);
         _root = malloc(alen);
         memcpy(_root, arg, alen);
         return 2;
@@ -122,6 +131,7 @@ parse_option(char **args, int n, int max)
     {
         if (arg == 0) SHOW_NOVAL(opt);
         alen = strlen(arg)+1;
+        if (_element) free(_element);
         _element = malloc(alen);
         memcpy(_element, arg, alen);
         return 2;
@@ -130,6 +140,7 @@ parse_option(char **args, int n, int max)
     {
         if (arg == 0) SHOW_NOVAL(opt);
         alen = strlen(arg)+1;
+        if (_value) free(_value);
         _value = malloc(alen);
         memcpy(_value, arg, alen);
         return 2;
@@ -138,6 +149,7 @@ parse_option(char **args, int n, int max)
     {
         if (arg == 0) SHOW_NOVAL(opt);
         alen = strlen(arg)+1;
+        if (_print) free(_print);
         _print = malloc(alen);
         memcpy(_print, arg, alen);
         return 2;
@@ -146,6 +158,7 @@ parse_option(char **args, int n, int max)
     {
         if (arg == 0) SHOW_NOVAL(opt);
         alen = strlen(arg)+1;
+        if (_attribute) free(_attribute);
         _attribute = malloc(alen);
         memcpy(_attribute, arg, alen);
         return 2;
@@ -200,17 +213,23 @@ void walk_the_tree(size_t num, void *xid, char *tree)
             {
                 if (xmlNodeGetPos(xid, xmid, _print, i) != 0)
                 {
-                    char value[1024];
+                    char *value;
 
-                    xmlCopyString(xmid, (char *)&value, 1024);
-                    if (_value && _attribute)
+                    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
                     {
@@ -228,9 +247,9 @@ void walk_the_tree(size_t num, void *xid, char *tree)
             {
                 if (xmlNodeGetPos(xid, xmid, _element, i) != 0)
                 {
-                    char nodename[64];
+                    char nodename[NODE_NAME_LEN];
 
-                    xmlNodeCopyName(xmid, (char *)&nodename, 64);
+                    xmlNodeCopyName(xmid, (char *)&nodename, NODE_NAME_LEN);
                     if (xmlCompareString(xmid, _value) == 0)
                     {
                         printf("%s: <%s>%s</%s>\n",
@@ -242,22 +261,22 @@ void walk_the_tree(size_t num, void *xid, char *tree)
         }
         else if (xmid && _element)
         {
-            char parentname[64];
+            char parentname[NODE_NAME_LEN];
 
-            xmlNodeCopyName(xid, (char *)&parentname, 64);
+            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[64];
+                    char nodename[NODE_NAME_LEN];
 
-                    xmlNodeCopyName(xmid, (char *)&nodename, 64);
-                    if (strncasecmp((char *)&nodename, _element, 64) == 0)
+                    xmlNodeCopyName(xmid, (char *)&nodename, NODE_NAME_LEN);
+                    if (!strncasecmp((char*)&nodename, _element, NODE_NAME_LEN))
                     {
-                        char value[64];
-                        xmlCopyString(xmid, (char *)&value, 64);
+                        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);
@@ -303,7 +322,6 @@ void walk_the_tree(size_t num, void *xid, char *tree)
     }
 }
 
-
 void grep_file(unsigned num)
 {
     void *xid;
@@ -319,13 +337,10 @@ void grep_file(unsigned num)
        r = xmlErrorGetNo(xrid, 0);
        if (r)
        {
-            if (r == XML_ELEMENT_NOT_FOUND)
-            {
-                size_t n = xmlErrorGetLineNo(xrid, 0);
-                char *s = xmlErrorGetString(xrid, 1); /* clear the error */
-                printf("Error #%i at line %u: '%s'\n", r, n, s);
-            }
-            else printf("requested element was not found.\n");
+            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);
@@ -338,9 +353,68 @@ void grep_file(unsigned 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)
@@ -355,8 +429,12 @@ main (int argc, char **argv)
     if (_root == 0) _root = (char *)_static_root;
     if (_element == 0) _element = (char *)_static_element;
 
-    for (i=0; i<_fcount; i++)
-        grep_file(i);
+    for (u=0; u<_fcount; u++)
+#if USE_BUFFER
+        grep_file_buffer(u);
+#else
+        grep_file(u);
+#endif
 
     free_and_exit(0);