Imported Upstream version 0.19.7
[platform/upstream/gettext.git] / gettext-tools / gnulib-lib / libxml / pattern.c
index cf41606..33dee3a 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Reference:
  *   http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/
- *   to some extent 
+ *   to some extent
  *   http://www.w3.org/TR/1999/REC-xml-19991116
  *
  * See Copyright for the status of this software.
@@ -39,6 +39,9 @@
 
 /* #define DEBUG_STREAMING */
 
+#ifdef ERROR
+#undef ERROR
+#endif
 #define ERROR(a, b, c, d)
 #define ERROR5(a, b, c, d, e)
 
@@ -53,7 +56,7 @@
 * NOTE: Those private flags (XML_STREAM_xxx) are used
 *   in _xmlStreamCtxt->flag. They extend the public
 *   xmlPatternFlags, so be carefull not to interfere with the
-*   reserved values for xmlPatternFlags. 
+*   reserved values for xmlPatternFlags.
 */
 #define XML_STREAM_FINAL_IS_ANY_NODE 1<<14
 #define XML_STREAM_FROM_ROOT 1<<15
@@ -159,7 +162,7 @@ struct _xmlStepOp {
 #define PAT_FROM_CUR   (1<<9)
 
 struct _xmlPattern {
-    void *data;                /* the associated template */
+    void *data;                /* the associated template */
     xmlDictPtr dict;           /* the optional dictionary */
     struct _xmlPattern *next;  /* next pattern if | is used */
     const xmlChar *pattern;    /* the pattern */
@@ -178,15 +181,15 @@ struct _xmlPatParserContext {
     int                   error;               /* error code */
     xmlDictPtr     dict;               /* the dictionary if any */
     xmlPatternPtr  comp;               /* the result */
-    xmlNodePtr     elem;               /* the current node if any */    
+    xmlNodePtr     elem;               /* the current node if any */
     const xmlChar **namespaces;                /* the namespaces definitions */
     int   nb_namespaces;               /* the number of namespaces */
 };
 
 /************************************************************************
- *                                                                     *
- *                     Type functions                                  *
- *                                                                     *
+ *                                                                     *
+ *                     Type functions                                  *
+ *                                                                     *
  ************************************************************************/
 
 /**
@@ -305,7 +308,8 @@ xmlNewPatParserContext(const xmlChar *pattern, xmlDictPtr dict,
     cur->base = pattern;
     if (namespaces != NULL) {
         int i;
-       for (i = 0;namespaces[2 * i] != NULL;i++);
+        for (i = 0;namespaces[2 * i] != NULL;i++)
+            ;
         cur->nb_namespaces = i;
     } else {
         cur->nb_namespaces = 0;
@@ -323,7 +327,7 @@ xmlNewPatParserContext(const xmlChar *pattern, xmlDictPtr dict,
 static void
 xmlFreePatParserContext(xmlPatParserContextPtr ctxt) {
     if (ctxt == NULL)
-       return;    
+       return;
     memset(ctxt, -1, sizeof(xmlPatParserContext));
     xmlFree(ctxt);
 }
@@ -451,9 +455,9 @@ xmlReversePattern(xmlPatternPtr comp) {
 }
 
 /************************************************************************
- *                                                                     *
- *             The interpreter for the precompiled patterns            *
- *                                                                     *
+ *                                                                     *
+ *             The interpreter for the precompiled patterns            *
+ *                                                                     *
  ************************************************************************/
 
 static int
@@ -705,7 +709,7 @@ rollback:
  *                                                                     *
  ************************************************************************/
 
-#define TODO                                                           \
+#define TODO                                                           \
     xmlGenericError(xmlGenericErrorContext,                            \
            "Unimplemented block at %s:%d\n",                           \
             __FILE__, __LINE__);
@@ -715,14 +719,14 @@ rollback:
 #define PEEKPREV(val) ctxt->cur[-(val)]
 #define CUR_PTR ctxt->cur
 
-#define SKIP_BLANKS                                                    \
+#define SKIP_BLANKS                                                    \
     while (IS_BLANK_CH(CUR)) NEXT
 
 #define CURRENT (*ctxt->cur)
 #define NEXT ((*ctxt->cur) ?  ctxt->cur++: ctxt->cur)
 
 
-#define PUSH(op, val, val2)                                            \
+#define PUSH(op, val, val2)                                            \
     if (xmlPatternAdd(ctxt, ctxt->comp, (op), (val), (val2))) goto error;
 
 #define XSLT_ERROR(X)                                                  \
@@ -768,7 +772,7 @@ xmlPatScanLiteral(xmlPatParserContextPtr ctxt) {
            if (ctxt->dict)
                ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q);
            else
-               ret = xmlStrndup(q, cur - q);       
+               ret = xmlStrndup(q, cur - q);
         }
        cur += len;
        CUR_PTR = cur;
@@ -787,7 +791,7 @@ xmlPatScanLiteral(xmlPatParserContextPtr ctxt) {
            if (ctxt->dict)
                ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q);
            else
-               ret = xmlStrndup(q, cur - q);       
+               ret = xmlStrndup(q, cur - q);
         }
        cur += len;
        CUR_PTR = cur;
@@ -804,7 +808,7 @@ xmlPatScanLiteral(xmlPatParserContextPtr ctxt) {
  * xmlPatScanName:
  * @ctxt:  the XPath Parser context
  *
- * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | 
+ * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' |
  *                  CombiningChar | Extender
  *
  * [5] Name ::= (Letter | '_' | ':') (NameChar)*
@@ -829,7 +833,7 @@ xmlPatScanName(xmlPatParserContextPtr ctxt) {
 
     while ((IS_LETTER(val)) || (IS_DIGIT(val)) ||
            (val == '.') || (val == '-') ||
-          (val == '_') || 
+          (val == '_') ||
           (IS_COMBINING(val)) ||
           (IS_EXTENDER(val))) {
        cur += len;
@@ -838,7 +842,7 @@ xmlPatScanName(xmlPatParserContextPtr ctxt) {
     if (ctxt->dict)
        ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q);
     else
-       ret = xmlStrndup(q, cur - q);    
+       ret = xmlStrndup(q, cur - q);
     CUR_PTR = cur;
     return(ret);
 }
@@ -918,7 +922,7 @@ xmlCompileAttributeTest(xmlPatParserContextPtr ctxt) {
     xmlChar *token = NULL;
     xmlChar *name = NULL;
     xmlChar *URL = NULL;
-    
+
     SKIP_BLANKS;
     name = xmlPatScanNCName(ctxt);
     if (name == NULL) {
@@ -935,10 +939,10 @@ xmlCompileAttributeTest(xmlPatParserContextPtr ctxt) {
     if (CUR == ':') {
        int i;
        xmlChar *prefix = name;
-       
+
        NEXT;
 
-       if (IS_BLANK_CH(CUR)) {     
+       if (IS_BLANK_CH(CUR)) {
            ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL);
            XML_PAT_FREE_STRING(ctxt, prefix);
            ctxt->error = 1;
@@ -953,11 +957,11 @@ xmlCompileAttributeTest(xmlPatParserContextPtr ctxt) {
            (prefix[2] == 'l') &&
            (prefix[3] == 0))
        {
-           XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE);      
+           XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE);
        } else {
            for (i = 0;i < ctxt->nb_namespaces;i++) {
                if (xmlStrEqual(ctxt->namespaces[2 * i + 1], prefix)) {
-                   XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i])                 
+                   XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i])
                    break;
                }
            }
@@ -965,7 +969,7 @@ xmlCompileAttributeTest(xmlPatParserContextPtr ctxt) {
                ERROR5(NULL, NULL, NULL,
                    "xmlCompileAttributeTest : no namespace bound to prefix %s\n",
                    prefix);
-               ctxt->error = 1;            
+               ctxt->error = 1;
                goto error;
            }
        }
@@ -979,7 +983,7 @@ xmlCompileAttributeTest(xmlPatParserContextPtr ctxt) {
                    "xmlCompileAttributeTest : Name expected\n");
                ctxt->error = 1;
                goto error;
-           }       
+           }
        } else {
            PUSH(XML_OP_ATTR, token, URL);
        }
@@ -989,7 +993,7 @@ xmlCompileAttributeTest(xmlPatParserContextPtr ctxt) {
     return;
 error:
     if (URL != NULL)
-       XML_PAT_FREE_STRING(ctxt, URL)  
+       XML_PAT_FREE_STRING(ctxt, URL)
     if (token != NULL)
        XML_PAT_FREE_STRING(ctxt, token);
 }
@@ -1002,7 +1006,7 @@ error:
  * form suitable for fast matching.
  *
  * [3]    Step    ::=    '.' | NameTest
- * [4]    NameTest    ::=    QName | '*' | NCName ':' '*' 
+ * [4]    NameTest    ::=    QName | '*' | NCName ':' '*'
  */
 
 static void
@@ -1033,7 +1037,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
        }
        NEXT;
        xmlCompileAttributeTest(ctxt);
-       if (ctxt->error != 0) 
+       if (ctxt->error != 0)
            goto error;
        return;
     }
@@ -1058,7 +1062,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
        NEXT;
        if (CUR != ':') {
            xmlChar *prefix = name;
-           int i;          
+           int i;
 
            if (hasBlanks || IS_BLANK_CH(CUR)) {
                ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL);
@@ -1091,6 +1095,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
                }
            }
            XML_PAT_FREE_STRING(ctxt, prefix);
+           name = NULL;
            if (token == NULL) {
                if (CUR == '*') {
                    NEXT;
@@ -1106,7 +1111,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
            }
        } else {
            NEXT;
-           if (xmlStrEqual(name, (const xmlChar *) "child")) {         
+           if (xmlStrEqual(name, (const xmlChar *) "child")) {
                XML_PAT_FREE_STRING(ctxt, name);
                name = xmlPatScanName(ctxt);
                if (name == NULL) {
@@ -1124,7 +1129,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
                if (CUR == ':') {
                    xmlChar *prefix = name;
                    int i;
-                   
+
                    NEXT;
                    if (IS_BLANK_CH(CUR)) {
                        ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL);
@@ -1140,11 +1145,11 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
                        (prefix[2] == 'l') &&
                        (prefix[3] == 0))
                    {
-                       XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE)                       
+                       XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE)
                    } else {
                        for (i = 0;i < ctxt->nb_namespaces;i++) {
                            if (xmlStrEqual(ctxt->namespaces[2 * i + 1], prefix)) {
-                               XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i])                         
+                               XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i])
                                break;
                            }
                        }
@@ -1157,6 +1162,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
                        }
                    }
                    XML_PAT_FREE_STRING(ctxt, prefix);
+                   name = NULL;
                    if (token == NULL) {
                        if (CUR == '*') {
                            NEXT;
@@ -1191,7 +1197,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
                    "The 'element' or 'attribute' axis is expected.\n", NULL);
                ctxt->error = 1;
                goto error;
-           }       
+           }
        }
     } else if (CUR == '*') {
         if (name != NULL) {
@@ -1206,7 +1212,7 @@ xmlCompileStepPattern(xmlPatParserContextPtr ctxt) {
     return;
 error:
     if (URL != NULL)
-       XML_PAT_FREE_STRING(ctxt, URL)  
+       XML_PAT_FREE_STRING(ctxt, URL)
     if (token != NULL)
        XML_PAT_FREE_STRING(ctxt, token)
     if (name != NULL)
@@ -1220,7 +1226,7 @@ error:
  * Compile the Path Pattern and generates a precompiled
  * form suitable for fast matching.
  *
- * [5]    Path    ::=    ('.//')? ( Step '/' )* ( Step | '@' NameTest ) 
+ * [5]    Path    ::=    ('.//')? ( Step '/' )* ( Step | '@' NameTest )
  */
 static void
 xmlCompilePathPattern(xmlPatParserContextPtr ctxt) {
@@ -1230,7 +1236,7 @@ xmlCompilePathPattern(xmlPatParserContextPtr ctxt) {
     } else if ((CUR == '.') || (ctxt->comp->flags & XML_PATTERN_NOTPATTERN)) {
         ctxt->comp->flags |= PAT_FROM_CUR;
     }
-       
+
     if ((CUR == '/') && (NXT(1) == '/')) {
        PUSH(XML_OP_ANCESTOR, NULL, NULL);
        NEXT;
@@ -1293,7 +1299,7 @@ xmlCompilePathPattern(xmlPatParserContextPtr ctxt) {
                    ERROR5(NULL, NULL, NULL,
                    "Incomplete expression '%s'.\n", ctxt->base);
                    ctxt->error = 1;
-                   goto error;             
+                   goto error;
                }
                xmlCompileStepPattern(ctxt);
                if (ctxt->error != 0)
@@ -1317,7 +1323,7 @@ error:
  * Compile the Path Pattern and generates a precompiled
  * form suitable for fast matching.
  *
- * [5]    Path    ::=    ('.//')? ( Step '/' )* ( Step | '@' NameTest ) 
+ * [5]    Path    ::=    ('.//')? ( Step '/' )* ( Step | '@' NameTest )
  */
 static void
 xmlCompileIDCXPathPath(xmlPatParserContextPtr ctxt) {
@@ -1372,7 +1378,7 @@ xmlCompileIDCXPathPath(xmlPatParserContextPtr ctxt) {
     */
     do {
        xmlCompileStepPattern(ctxt);
-       if (ctxt->error != 0) 
+       if (ctxt->error != 0)
            goto error;
        SKIP_BLANKS;
        if (CUR != '/')
@@ -1391,7 +1397,7 @@ xmlCompileIDCXPathPath(xmlPatParserContextPtr ctxt) {
        }
        if (CUR == 0)
            goto error_unfinished;
-       
+
     } while (CUR != 0);
 
     if (CUR != 0) {
@@ -1407,7 +1413,7 @@ error:
 error_unfinished:
     ctxt->error = 1;
     ERROR5(NULL, NULL, NULL,
-       "Unfinished expression '%s'.\n", ctxt->base);    
+       "Unfinished expression '%s'.\n", ctxt->base);
     return;
 }
 
@@ -1562,7 +1568,7 @@ xmlStreamCompAddStep(xmlStreamCompPtr comp, const xmlChar *name,
 /**
  * xmlStreamCompile:
  * @comp: the precompiled pattern
- * 
+ *
  * Tries to stream compile a pattern
  *
  * Returns -1 in case of failure and 0 in case of success.
@@ -1599,7 +1605,7 @@ xmlStreamCompile(xmlPatternPtr comp) {
        xmlDictReference(stream->dict);
     }
 
-    i = 0;        
+    i = 0;
     if (comp->flags & PAT_FROM_ROOT)
        stream->flags |= XML_STREAM_FROM_ROOT;
 
@@ -1615,12 +1621,12 @@ xmlStreamCompile(xmlPatternPtr comp) {
                break;
            case XML_OP_NS:
                s = xmlStreamCompAddStep(stream, NULL, step.value,
-                   XML_ELEMENT_NODE, flags);           
+                   XML_ELEMENT_NODE, flags);
                if (s < 0)
                    goto error;
                prevs = s;
-               flags = 0;              
-               break;      
+               flags = 0;
+               break;
            case XML_OP_ATTR:
                flags |= XML_STREAM_STEP_ATTR;
                prevs = -1;
@@ -1630,7 +1636,7 @@ xmlStreamCompile(xmlPatternPtr comp) {
                if (s < 0)
                    goto error;
                break;
-           case XML_OP_ELEM:           
+           case XML_OP_ELEM:
                if ((step.value == NULL) && (step.value2 == NULL)) {
                    /*
                    * We have a "." or "self::node()" here.
@@ -1649,7 +1655,7 @@ xmlStreamCompile(xmlPatternPtr comp) {
                        if (comp->nbStep == i + 1) {
                            stream->flags |= XML_STREAM_FINAL_IS_ANY_NODE;
                        }
-                       flags |= XML_STREAM_STEP_NODE;                  
+                       flags |= XML_STREAM_STEP_NODE;
                        s = xmlStreamCompAddStep(stream, NULL, NULL,
                            XML_STREAM_ANY_NODE, flags);
                        if (s < 0)
@@ -1665,39 +1671,39 @@ xmlStreamCompile(xmlPatternPtr comp) {
                            stream->steps[prevs].flags |= XML_STREAM_STEP_IN_SET;
                            prevs = -1;
                        }
-                       break;  
+                       break;
 
                    } else {
                        /* Just skip this one. */
                        continue;
                    }
                }
-               /* An element node. */          
+               /* An element node. */
                s = xmlStreamCompAddStep(stream, step.value, step.value2,
-                   XML_ELEMENT_NODE, flags);           
+                   XML_ELEMENT_NODE, flags);
                if (s < 0)
                    goto error;
                prevs = s;
-               flags = 0;              
-               break;          
+               flags = 0;
+               break;
            case XML_OP_CHILD:
                /* An element node child. */
                s = xmlStreamCompAddStep(stream, step.value, step.value2,
-                   XML_ELEMENT_NODE, flags);           
+                   XML_ELEMENT_NODE, flags);
                if (s < 0)
                    goto error;
                prevs = s;
                flags = 0;
-               break;      
+               break;
            case XML_OP_ALL:
                s = xmlStreamCompAddStep(stream, NULL, NULL,
-                   XML_ELEMENT_NODE, flags);           
+                   XML_ELEMENT_NODE, flags);
                if (s < 0)
                    goto error;
                prevs = s;
                flags = 0;
                break;
-           case XML_OP_PARENT: 
+           case XML_OP_PARENT:
                break;
            case XML_OP_ANCESTOR:
                /* Skip redundant continuations. */
@@ -1711,7 +1717,7 @@ xmlStreamCompile(xmlPatternPtr comp) {
                    stream->flags |= XML_STREAM_DESC;
                break;
        }
-    }    
+    }
     if ((! root) && (comp->flags & XML_PATTERN_NOTPATTERN) == 0) {
        /*
        * If this should behave like a real pattern, we will mark
@@ -1723,7 +1729,7 @@ xmlStreamCompile(xmlPatternPtr comp) {
 
        if (stream->nbStep > 0) {
            if ((stream->steps[0].flags & XML_STREAM_STEP_DESC) == 0)
-               stream->steps[0].flags |= XML_STREAM_STEP_DESC;     
+               stream->steps[0].flags |= XML_STREAM_STEP_DESC;
        }
     }
     if (stream->nbStep <= s)
@@ -1916,7 +1922,7 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream,
            if ((nodeType != XML_ATTRIBUTE_NODE) &&
                (((stream->flags & XML_PATTERN_NOTPATTERN) == 0) ||
                (stream->level == 0))) {
-                   ret = 1;            
+                   ret = 1;
            }
            stream->level++;
            goto stream_next;
@@ -1925,7 +1931,7 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream,
            /*
            * Skip blocked expressions.
            */
-           stream->level++;
+           stream->level++;
            goto stream_next;
        }
 
@@ -1968,7 +1974,7 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream,
                * If there are "//", then we need to process every "//"
                * occuring in the states, plus any other state for this
                * level.
-               */              
+               */
                stepNr = stream->states[2 * i];
 
                /* TODO: should not happen anymore: dead states */
@@ -1986,7 +1992,7 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream,
                if ((tmp < stream->level) && (!desc))
                    goto next_state;
            }
-           /* 
+           /*
            * Check for correct node-type.
            */
            step = comp->steps[stepNr];
@@ -2000,7 +2006,7 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream,
                    goto next_state;
                } else if (step.nodeType != XML_STREAM_ANY_NODE)
                    goto next_state;
-           }       
+           }
            /*
            * Compare local/namespace-name.
            */
@@ -2021,9 +2027,9 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream,
                xmlStrEqual(step.name, name) &&
                ((step.ns == ns) || xmlStrEqual(step.ns, ns)))
            {
-               match = 1;          
-           }    
-#if 0 
+               match = 1;
+           }
+#if 0
 /*
 * TODO: Pointer comparison won't work, since not guaranteed that the given
 *  values are in the same dict; especially if it's the namespace name,
@@ -2038,8 +2044,8 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream,
                } else {
                    match = ((step.name == name) && (step.ns == ns));
                }
-#endif /* if 0 ------------------------------------------------------- */          
-           if (match) {                
+#endif /* if 0 ------------------------------------------------------- */
+           if (match) {
                final = step.flags & XML_STREAM_STEP_FINAL;
                if (desc) {
                    if (final) {
@@ -2064,7 +2070,7 @@ xmlStreamPushInternal(xmlStreamCtxtPtr stream,
                    */
                    ret = 1;
                }
-           }       
+           }
            if (((comp->flags & XML_STREAM_DESC) == 0) &&
                ((! match) || final))  {
                /*
@@ -2095,7 +2101,7 @@ next_state:
            * Re/enter the expression if it is a "descendant" one,
            * or if we are at the 1st level of evaluation.
            */
-           
+
            if (stream->level == 1) {
                if (XML_STREAM_XS_IDC(stream)) {
                    /*
@@ -2105,7 +2111,7 @@ next_state:
                    goto stream_next;
                } else
                    goto compare;
-           }       
+           }
            /*
            * A "//" is always reentrant.
            */
@@ -2115,14 +2121,14 @@ next_state:
            /*
            * XS-IDC: Process the 2nd level, since the missing
            * "self::node()" is responsible for the 2nd level being
-           * the real start level.         
-           */      
+           * the real start level.
+           */
            if ((stream->level == 2) && XML_STREAM_XS_IDC(stream))
                goto compare;
 
            goto stream_next;
        }
-       
+
 compare:
        /*
        * Check expected node-type.
@@ -2131,7 +2137,7 @@ compare:
            if (nodeType == XML_ATTRIBUTE_NODE)
                goto stream_next;
            else if (step.nodeType != XML_STREAM_ANY_NODE)
-               goto stream_next;            
+               goto stream_next;
        }
        /*
        * Compare local/namespace-name.
@@ -2153,10 +2159,10 @@ compare:
            xmlStrEqual(step.name, name) &&
            ((step.ns == ns) || xmlStrEqual(step.ns, ns)))
        {
-           match = 1;      
-       }           
+           match = 1;
+       }
        final = step.flags & XML_STREAM_STEP_FINAL;
-       if (match) {        
+       if (match) {
            if (final)
                ret = 1;
            else
@@ -2181,7 +2187,7 @@ compare:
 stream_next:
         stream = stream->next;
     } /* while stream != NULL */
+
     if (err > 0)
         ret = -1;
 #ifdef DEBUG_STREAMING
@@ -2273,7 +2279,7 @@ xmlStreamPushAttr(xmlStreamCtxtPtr stream,
 int
 xmlStreamPop(xmlStreamCtxtPtr stream) {
     int i, lev;
-    
+
     if (stream == NULL)
         return(-1);
     while (stream != NULL) {
@@ -2283,12 +2289,16 @@ xmlStreamPop(xmlStreamCtxtPtr stream) {
        if (stream->blockLevel == stream->level)
            stream->blockLevel = -1;
 
-       stream->level--;
-       if (stream->level < 0)
-           return(-1);         
+       /*
+        *  stream->level can be zero when XML_FINAL_IS_ANY_NODE is set
+        *  (see the thread at
+        *  http://mail.gnome.org/archives/xslt/2008-July/msg00027.html)
+        */
+       if (stream->level)
+           stream->level--;
        /*
         * Check evolution of existing states
-        */     
+        */
        for (i = stream->nbState -1; i >= 0; i--) {
            /* discard obsoleted states */
            lev = stream->states[(2 * i) + 1];
@@ -2316,11 +2326,11 @@ xmlStreamPop(xmlStreamCtxtPtr stream) {
  */
 int
 xmlStreamWantsAnyNode(xmlStreamCtxtPtr streamCtxt)
-{    
+{
     if (streamCtxt == NULL)
        return(-1);
     while (streamCtxt != NULL) {
-       if (streamCtxt->comp->flags & XML_STREAM_FINAL_IS_ANY_NODE)     
+       if (streamCtxt->comp->flags & XML_STREAM_FINAL_IS_ANY_NODE)
            return(1);
        streamCtxt = streamCtxt->next;
     }
@@ -2371,13 +2381,13 @@ xmlPatterncompile(const xmlChar *pattern, xmlDict *dict, int flags,
            }
            or++;
        }
-       if (ctxt == NULL) goto error;   
+       if (ctxt == NULL) goto error;
        cur = xmlNewPattern();
        if (cur == NULL) goto error;
        /*
        * Assign string dict.
        */
-       if (dict) {         
+       if (dict) {
            cur->dict = dict;
            xmlDictReference(dict);
        }
@@ -2560,7 +2570,7 @@ xmlPatternMaxDepth(xmlPatternPtr comp) {
  * part of the set.
  *
  * Returns -1 in case of error otherwise the depth,
- *         
+ *
  */
 int
 xmlPatternMinDepth(xmlPatternPtr comp) {