X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=utils%2Fxmlgrep%2Fxmlgrep.c;h=23577b0c8d2415a25343817e413c1dcd33836cf1;hb=a89a28c4e62a63e05b6b889274fa848ea2bda007;hp=074d4cc720e89288fbc8c8ef310de4395e13e68f;hpb=a21dddeffc94f15a1ff5620e44fbeda363fd46e5;p=flightgear.git diff --git a/utils/xmlgrep/xmlgrep.c b/utils/xmlgrep/xmlgrep.c index 074d4cc72..23577b0c8 100644 --- a/utils/xmlgrep/xmlgrep.c +++ b/utils/xmlgrep/xmlgrep.c @@ -5,11 +5,15 @@ #include #ifndef _MSC_VER # include +# include /* read */ #else # define strncasecmp strnicmp # include +# include #endif #include +#include /* fstat */ +#include /* 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\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\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 <%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; @@ -312,15 +330,75 @@ void grep_file(unsigned num) if (xid) { void *xrid = xmlMarkId(xid); - size_t n = 0; - char *s = 0; 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); - s = xmlErrorGetString(xrid); - n = xmlErrorGetLineNo(xrid); - r = xmlErrorGetNo(xrid); - if (r) printf("Error #%i at line #%u: '%s'\n", r, n, s); + 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); } @@ -330,12 +408,14 @@ void grep_file(unsigned num) } xmlClose(xid); + free(buf); } int main (int argc, char **argv) { - unsigned int i; + unsigned int u; + int i; if (argc == 1) show_help(); @@ -349,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);