X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=utils%2Fxmlgrep%2Fxmlgrep.c;h=23577b0c8d2415a25343817e413c1dcd33836cf1;hb=a89a28c4e62a63e05b6b889274fa848ea2bda007;hp=a75b1f8cbdd798fc63f2c4e11835522409f41852;hpb=f35ab314bf8b41dea011c9acddc641340229c56a;p=flightgear.git diff --git a/utils/xmlgrep/xmlgrep.c b/utils/xmlgrep/xmlgrep.c index a75b1f8cb..23577b0c8 100644 --- a/utils/xmlgrep/xmlgrep.c +++ b/utils/xmlgrep/xmlgrep.c @@ -1,20 +1,39 @@ #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" 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)); \ @@ -27,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) free(_element); + 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]) @@ -62,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) @@ -88,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); - _root = strdup(arg); + alen = strlen(arg)+1; + if (_root) free(_root); + _root = malloc(alen); + memcpy(_root, arg, alen); return 2; } - else if (strncmp(opt, "-element", sz) == 0) + else if (strncmp(opt, "-element", olen) == 0) { if (arg == 0) SHOW_NOVAL(opt); - _element = strdup(arg); + alen = strlen(arg)+1; + if (_element) free(_element); + _element = malloc(alen); + memcpy(_element, arg, alen); return 2; } - else if (strncmp(opt, "-value", sz) == 0) + else if (strncmp(opt, "-value", olen) == 0) { if (arg == 0) SHOW_NOVAL(opt); - _value = strdup(arg); + alen = strlen(arg)+1; + if (_value) free(_value); + _value = malloc(alen); + memcpy(_value, arg, alen); return 2; } - else if (strncmp(opt, "-print", sz) == 0) + else if (strncmp(opt, "-print", olen) == 0) { if (arg == 0) SHOW_NOVAL(opt); - _print = strdup(arg); + alen = strlen(arg)+1; + if (_print) free(_print); + _print = malloc(alen); + memcpy(_print, arg, alen); return 2; } - else if (strncmp(opt, "-list-filenames", sz) == 0) + 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; @@ -145,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; @@ -153,92 +201,120 @@ parse_option(char **args, int n, int max) void walk_the_tree(size_t num, void *xid, char *tree) { - unsigned int q, no_elements; - char *elem, *next; + unsigned int i, no_elements; - elem = tree; - if (*elem == '/') elem++; - - next = strchr(elem, '/'); - if (!next) /* last node from the tree */ + if (!tree) /* last node from the tree */ { - void *elem_id = xmlMarkId(xid); - - no_elements = xmlGetNumElements(xid, elem); - for (q=0; q%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); } } - free(xmid); } - else if (node_id && _value) + free(xmid); + } + else if (xmid && _value) + { + no_elements = xmlNodeGetNum(xmid, _element); + for (i=0; i%s\n", - _filenames[num], _element, _value, _element); - } + printf("%s: <%s>%s\n", + _filenames[num], nodename, _value, nodename); } - free(xmid); - } - else - { } } - else if (node_id && _element) + 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); + } + } } } - free(elem_id); + else printf("Error executing xmlMarkId\n"); } - else /* walk the rest of the tree */ + 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) { - *next++ = 0; + if (next) + { + *next++ = 0; + } - no_elements = xmlGetNumElements(xid, elem); - for (q=0; q