X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=utils%2Fxmlgrep%2Fxmlgrep.c;h=23577b0c8d2415a25343817e413c1dcd33836cf1;hb=a89a28c4e62a63e05b6b889274fa848ea2bda007;hp=0546a4a139dfab8ea44083ed0bfdfd531b6c660c;hpb=b4ab5242ecd88ac1791c333ebd9062697d9c6f24;p=flightgear.git diff --git a/utils/xmlgrep/xmlgrep.c b/utils/xmlgrep/xmlgrep.c index 0546a4a13..23577b0c8 100644 --- a/utils/xmlgrep/xmlgrep.c +++ b/utils/xmlgrep/xmlgrep.c @@ -1,6 +1,19 @@ #include + +#define _GNU_SOURCE #include #include +#ifndef _MSC_VER +# include +# include /* read */ +#else +# define strncasecmp strnicmp +# include +# include +#endif +#include +#include /* fstat */ +#include /* open */ #include "xml.h" @@ -12,10 +25,15 @@ 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)); \ @@ -28,30 +46,35 @@ show_help () printf("usage: xmlgrep [options] [file ...]\n\n"); printf("Options:\n"); printf("\t-h\t\tshow this help message\n"); + printf("\t-a \tprint this attribute as the output\n"); printf("\t-e \t\tshow sections that contain this element\n"); printf("\t-p \t\tprint this element as the output\n"); printf("\t-r \tspecify the XML search root\n"); - printf("\t-v \tshow sections where one of the elements has this "); - printf("value\n\n"); + printf("\t-v \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' one would use the following "); - printf("syntax:\n\n\txmlgrep -r /printer/output -p type sample.xml\n\n"); + 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 one would issue the following command:"); + 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 i) +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]) @@ -63,17 +86,18 @@ free_and_exit(int i) free(_filenames); } - exit(i); + exit(ret); } int parse_option(char **args, int n, int max) { char *opt, *arg = 0; - int sz; + unsigned int alen = 0; + unsigned int olen; opt = args[n]; - if (opt[0] == '-' && opt[1] == '-') + if (strncmp(opt, "--", 2) == 0) opt++; if ((arg = strchr(opt, '=')) != NULL) @@ -89,36 +113,57 @@ parse_option(char **args, int n, int max) #endif } - sz = strlen(opt); - if (strncmp(opt, "-help", sz) == 0) + olen = strlen(opt); + if (strncmp(opt, "-help", olen) == 0) { show_help(); } - else if (strncmp(opt, "-root", sz) == 0) + 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); - _root = strdup(arg); + alen = strlen(arg)+1; + if (_element) free(_element); + _element = malloc(alen); + memcpy(_element, arg, alen); return 2; } - else if (strncmp(opt, "-element", sz) == 0) + else if (strncmp(opt, "-value", olen) == 0) { if (arg == 0) SHOW_NOVAL(opt); - _element = strdup(arg); + alen = strlen(arg)+1; + if (_value) free(_value); + _value = malloc(alen); + memcpy(_value, arg, alen); return 2; } - else if (strncmp(opt, "-value", sz) == 0) + else if (strncmp(opt, "-print", olen) == 0) { if (arg == 0) SHOW_NOVAL(opt); - _value = strdup(arg); + alen = strlen(arg)+1; + if (_print) free(_print); + _print = malloc(alen); + memcpy(_print, arg, alen); return 2; } - else if (strncmp(opt, "-print", sz) == 0) + else if (strncmp(opt, "-attribute", olen) == 0) { if (arg == 0) SHOW_NOVAL(opt); - _print = strdup(arg); + alen = strlen(arg)+1; + if (_attribute) free(_attribute); + _attribute = malloc(alen); + memcpy(_attribute, arg, alen); return 2; } - else if (strncmp(opt, "-list-filenames", sz) == 0) + else if (strncmp(opt, "-list-filenames", olen) == 0) { /* undocumented test argument */ print_filenames = 1; return 1; @@ -146,7 +191,9 @@ parse_option(char **args, int n, int max) _filenames = ptr; } - _filenames[pos] = strdup(opt); + alen = strlen(opt)+1; + _filenames[pos] = malloc(alen); + memcpy(_filenames[pos], opt, alen); } return 1; @@ -161,17 +208,33 @@ void walk_the_tree(size_t num, void *xid, char *tree) void *xmid = xmlMarkId(xid); if (xmid && _print) { - no_elements = xmlGetNumNodes(xid, _print); + no_elements = xmlNodeGetNum(xid, _print); for (i=0; i%s\n", - _filenames[num], _print, value, _print); - free(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 + { + printf("%s: <%s>%s\n", + _filenames[num], _print, value, _print); } } } @@ -179,20 +242,47 @@ void walk_the_tree(size_t num, void *xid, char *tree) } else if (xmid && _value) { - no_elements = xmlGetNumNodes(xmid, _element); + no_elements = xmlNodeGetNum(xmid, _element); for (i=0; i%s\n", - _filenames[num], _element, _value, _element); + char nodename[NODE_NAME_LEN]; + + xmlNodeCopyName(xmid, (char *)&nodename, NODE_NAME_LEN); + if (xmlCompareString(xmid, _value) == 0) + { + printf("%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 <%s>%s \n", + _filenames[num], parentname, nodename, value, + nodename, parentname); + } + } + } } else printf("Error executing xmlMarkId\n"); } @@ -209,16 +299,22 @@ void walk_the_tree(size_t num, void *xid, char *tree) xmid = xmlMarkId(xid); if (xmid) { - if (next) *next++ = 0; + if (next) + { + *next++ = 0; + } - no_elements = xmlGetNumNodes(xid, elem); + no_elements = xmlNodeGetNum(xid, elem); for (i=0; i