fixed bug #73363, bad tokenization of pattern Daniel
authorDaniel Veillard <veillard@src.gnome.org>
Mon, 4 Mar 2002 11:59:24 +0000 (11:59 +0000)
committerDaniel Veillard <veillard@src.gnome.org>
Mon, 4 Mar 2002 11:59:24 +0000 (11:59 +0000)
* libxslt/pattern.c: fixed bug #73363, bad tokenization of pattern
Daniel

ChangeLog
libxslt/pattern.c

index 460122e..27b5760 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Mar  4 12:57:21 CET 2002 Daniel Veillard <daniel@veillard.com>
+
+       * libxslt/pattern.c: fixed bug #73363, bad tokenization of
+         pattern
+
 Mon Mar  4 12:01:34 CET 2002 Daniel Veillard <daniel@veillard.com>
 
        * libexslt/date.c: patch from Charles Bozeman for the exslt date
index 71a1844..4e6d0b7 100644 (file)
@@ -1611,7 +1611,7 @@ xsltCompilePattern(const xmlChar *pattern, xmlDocPtr doc,
                   xsltTransformContextPtr runtime) {
     xsltParserContextPtr ctxt = NULL;
     xsltCompMatchPtr element, first = NULL, previous = NULL;
-    int current, start, end;
+    int current, start, end, level;
 
     if (pattern == NULL) {
        xsltPrintErrorContext(NULL, NULL, node); /* TODO */
@@ -1631,8 +1631,23 @@ xsltCompilePattern(const xmlChar *pattern, xmlDocPtr doc,
        while (IS_BLANK(pattern[current]))
            current++;
        end = current;
-       while ((pattern[end] != 0) && (pattern[end] != '|'))
+       level = 0;
+       while ((pattern[end] != 0) && ((pattern[end] != '|') || (level != 0))) {
+           if (pattern[end] == '[')
+               level++;
+           else if (pattern[end] == ']')
+               level--;
+           else if (pattern[end] == '\'') {
+               end++;
+               while ((pattern[end] != 0) && (pattern[end] != '\''))
+                   end++;
+           } else if (pattern[end] == '"') {
+               end++;
+               while ((pattern[end] != 0) && (pattern[end] != '"'))
+                   end++;
+           }
            end++;
+       }
        if (current == end) {
            xsltPrintErrorContext(NULL, NULL, node); /* TODO */
            xsltGenericError(xsltGenericErrorContext,