From 0654531fff30a47bc47ec6eea11812b856f05f66 Mon Sep 17 00:00:00 2001 From: ehofman Date: Sun, 26 Apr 2009 09:05:22 +0000 Subject: [PATCH] * add support for comments inside xml-tags, e.g.: --- utils/xmlgrep/ChangeLog | 3 +++ utils/xmlgrep/xml.c | 48 ++++++++++++++++++++++++++++++++++------- utils/xmlgrep/xmlgrep.c | 2 +- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/utils/xmlgrep/ChangeLog b/utils/xmlgrep/ChangeLog index 76fd8fdf0..9d10d5f9d 100644 --- a/utils/xmlgrep/ChangeLog +++ b/utils/xmlgrep/ChangeLog @@ -1,3 +1,6 @@ +26-04-2009 + * add support for comments inside xml-tags, e.g.: + 25-04-2009 * add support for self-contained tags like * fix a problem if a file could not be mmaped diff --git a/utils/xmlgrep/xml.c b/utils/xmlgrep/xml.c index dee507003..a5e85e810 100644 --- a/utils/xmlgrep/xml.c +++ b/utils/xmlgrep/xml.c @@ -1469,19 +1469,49 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t * return 0; } + new++; restlen -= new-cur; cur = new; - if (*(cur+1) != '/') /* cascading tag found */ + if (*cur == '!') /* comment */ + { + new = __xmlCommentSkip(cur, restlen); + if (!new) + { + *rlen = 0; + *name = cur; + *len = XML_INVALID_COMMENT; + return 0; + } + restlen -= new-cur; + cur = new; + + /* + * look for the closing tag of the cascading block + */ + new = memchr(cur, '<', restlen); + if (!new) + { + *rlen = 0; + *name = cur; + *len = XML_ELEMENT_NO_CLOSING_TAG; + return 0; + } + new++; + restlen -= new-cur; + cur = new; + } + + if (*cur != '/') /* cascading tag found */ { char *node = "*"; - size_t slen = restlen; + size_t slen = restlen+1; size_t nlen = 1; size_t pos = -1; /* * recursively walk the xml tree from here */ - new = __xmlNodeGet(cur, &slen, &node, &nlen, &pos); + new = __xmlNodeGet(cur-1, &slen, &node, &nlen, &pos); if (!new) { if (slen == restlen) @@ -1508,20 +1538,20 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t * *len = XML_ELEMENT_NO_CLOSING_TAG; return 0; } - + new++; restlen -= new-cur; cur = new; } - if (*(cur+1) == '/') /* closing tag found */ + if (*cur == '/') /* closing tag found */ { - if (!strncasecmp(new+2, element, elementlen)) + if (!strncasecmp(new+1, element, elementlen)) { if (found == num) { if (start_tag) { - *len = new-ret; + *len = new-ret-1; *name = start_tag; } else /* report error */ @@ -1553,6 +1583,7 @@ __xmlNodeGet(const char *start, size_t *len, char **name, size_t *rlen, size_t * *rlen = 0; *name = cur; *len = XML_ELEMENT_NO_CLOSING_TAG; +printf("4\n"); return 0; } } @@ -1652,7 +1683,7 @@ __xml_memncasecmp(const char *haystack, size_t *haystacklen, /* search for everything */ if ((*ns == '*') && (*needlelen == 1)) { - char *he = hs + *haystacklen; + char *p, *he = hs + *haystacklen; while ((hs < he) && !isspace(*hs) && (*hs != '>')) hs++; if (*(hs-1) == '/') hs--; @@ -1660,6 +1691,7 @@ __xml_memncasecmp(const char *haystack, size_t *haystacklen, *needle = (char *)haystack; *needlelen = hs - haystack; + p = hs; while ((hs < he) && (*hs != '>')) hs++; hs++; diff --git a/utils/xmlgrep/xmlgrep.c b/utils/xmlgrep/xmlgrep.c index 8db5bead3..f163620e1 100644 --- a/utils/xmlgrep/xmlgrep.c +++ b/utils/xmlgrep/xmlgrep.c @@ -324,7 +324,7 @@ void grep_file(unsigned num) { 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); + printf("%s: at line %u: '%s'\n",_filenames[num], n, s); } free(xrid);