From f03a8cdacdce917d09972c65371953e8a57a2ac3 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Sun, 4 Sep 2005 12:01:57 +0000 Subject: fixing yet another pattern induced XPath bug #314282 reverted back last * pattern.c xpath.c include/libxml/pattern.h: fixing yet another pattern induced XPath bug #314282 * relaxng.c: reverted back last change it was seriously broken Daniel --- pattern.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'pattern.c') diff --git a/pattern.c b/pattern.c index 7dc9f59c..a76a58c5 100644 --- a/pattern.c +++ b/pattern.c @@ -1634,6 +1634,14 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream, * Fast check for ".". */ if (comp->nbStep == 0) { + /* + * / and . are handled at the XPath node set creation + * level by checking min depth + */ + if (stream->flags & XML_PATTERN_XPATH) { + stream = stream->next; + continue; /* while */ + } /* * For non-pattern like evaluation like XML Schema IDCs * or traditional XPath expressions, this will match if @@ -2157,7 +2165,33 @@ xmlPatternMaxDepth(xmlPatternPtr comp) { comp = comp->next; } return(ret); +} +/** + * xmlPatternMinDepth: + * @comp: the precompiled pattern + * + * Check the minimum depth reachable by a pattern, 0 mean the / or . are + * part of the set. + * + * Returns -1 in case of error otherwise the depth, + * + */ +int +xmlPatternMinDepth(xmlPatternPtr comp) { + int ret = 12345678; + if (comp == NULL) + return(-1); + while (comp != NULL) { + if (comp->stream == NULL) + return(-1); + if (comp->stream->nbStep < ret) + ret = comp->stream->nbStep; + if (ret == 0) + return(0); + comp = comp->next; + } + return(ret); } /** -- cgit v1.2.1