Diff for /embedaddon/libxml2/xpointer.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2013/07/22 01:22:20 version 1.1.1.3, 2014/06/15 19:53:30
Line 7 Line 7
  *   *
  * Added support for the element() scheme described in:   * Added support for the element() scheme described in:
  * W3C Proposed Recommendation 13 November 2002   * W3C Proposed Recommendation 13 November 2002
 * http://www.w3.org/TR/2002/PR-xptr-element-20021113/   * http://www.w3.org/TR/2002/PR-xptr-element-20021113/
  *   *
  * See Copyright for the status of this software.   * See Copyright for the status of this software.
  *   *
Line 47 Line 47
 #endif  #endif
 #endif  #endif
   
#define TODO                                                            \#define TODO                                                            \
     xmlGenericError(xmlGenericErrorContext,                             \      xmlGenericError(xmlGenericErrorContext,                             \
             "Unimplemented block at %s:%d\n",                           \              "Unimplemented block at %s:%d\n",                           \
             __FILE__, __LINE__);              __FILE__, __LINE__);
   
#define STRANGE                                                         \#define STRANGE                                                 \
     xmlGenericError(xmlGenericErrorContext,                             \      xmlGenericError(xmlGenericErrorContext,                             \
             "Internal error at %s:%d\n",                                \              "Internal error at %s:%d\n",                                \
             __FILE__, __LINE__);              __FILE__, __LINE__);
   
 /************************************************************************  /************************************************************************
  *                                                                      *   *                                                                      *
 *              Some factorized error routines                          * *                Some factorized error routines                          *
  *                                                                      *   *                                                                      *
  ************************************************************************/   ************************************************************************/
   
Line 134  xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *lev Line 134  xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *lev
 static int  static int
 xmlXPtrGetArity(xmlNodePtr cur) {  xmlXPtrGetArity(xmlNodePtr cur) {
     int i;      int i;
    if (cur == NULL)     if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL))
         return(-1);          return(-1);
     cur = cur->children;      cur = cur->children;
     for (i = 0;cur != NULL;cur = cur->next) {      for (i = 0;cur != NULL;cur = cur->next) {
Line 157  xmlXPtrGetArity(xmlNodePtr cur) { Line 157  xmlXPtrGetArity(xmlNodePtr cur) {
 static int  static int
 xmlXPtrGetIndex(xmlNodePtr cur) {  xmlXPtrGetIndex(xmlNodePtr cur) {
     int i;      int i;
    if (cur == NULL)     if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL))
         return(-1);          return(-1);
     for (i = 1;cur != NULL;cur = cur->prev) {      for (i = 1;cur != NULL;cur = cur->prev) {
         if ((cur->type == XML_ELEMENT_NODE) ||          if ((cur->type == XML_ELEMENT_NODE) ||
Line 179  xmlXPtrGetIndex(xmlNodePtr cur) { Line 179  xmlXPtrGetIndex(xmlNodePtr cur) {
 static xmlNodePtr  static xmlNodePtr
 xmlXPtrGetNthChild(xmlNodePtr cur, int no) {  xmlXPtrGetNthChild(xmlNodePtr cur, int no) {
     int i;      int i;
    if (cur == NULL)     if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL))
         return(cur);          return(cur);
     cur = cur->children;      cur = cur->children;
     for (i = 0;i <= no;cur = cur->next) {      for (i = 0;i <= no;cur = cur->next) {
        if (cur == NULL)         if (cur == NULL)
             return(cur);              return(cur);
         if ((cur->type == XML_ELEMENT_NODE) ||          if ((cur->type == XML_ELEMENT_NODE) ||
             (cur->type == XML_DOCUMENT_NODE) ||              (cur->type == XML_DOCUMENT_NODE) ||
Line 553  xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathOb Line 553  xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathOb
             break;              break;
         case XPATH_NODESET:          case XPATH_NODESET:
             /*              /*
             * Empty set ...              * Empty set ...
              */               */
             if (end->nodesetval->nodeNr <= 0)              if (end->nodesetval->nodeNr <= 0)
                 return(NULL);                  return(NULL);
Line 731  xmlXPtrLocationSetDel(xmlLocationSetPtr cur, xmlXPathO Line 731  xmlXPtrLocationSetDel(xmlLocationSetPtr cur, xmlXPathO
   
     if (i >= cur->locNr) {      if (i >= cur->locNr) {
 #ifdef DEBUG  #ifdef DEBUG
        xmlGenericError(xmlGenericErrorContext,         xmlGenericError(xmlGenericErrorContext,
                 "xmlXPtrLocationSetDel: Range wasn't found in RangeList\n");                  "xmlXPtrLocationSetDel: Range wasn't found in RangeList\n");
 #endif  #endif
         return;          return;
Line 903  static void xmlXPtrEvalChildSeq(xmlXPathParserContextP Line 903  static void xmlXPtrEvalChildSeq(xmlXPathParserContextP
 #define NXT(val) ctxt->cur[(val)]  #define NXT(val) ctxt->cur[(val)]
 #define CUR_PTR ctxt->cur  #define CUR_PTR ctxt->cur
   
#define SKIP_BLANKS                                                     \#define SKIP_BLANKS                                                     \
     while (IS_BLANK_CH(*(ctxt->cur))) NEXT      while (IS_BLANK_CH(*(ctxt->cur))) NEXT
   
 #define CURRENT (*ctxt->cur)  #define CURRENT (*ctxt->cur)
Line 945  xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int i Line 945  xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int i
  * xmlXPtrEvalXPtrPart:   * xmlXPtrEvalXPtrPart:
  * @ctxt:  the XPointer Parser context   * @ctxt:  the XPointer Parser context
  * @name:  the preparsed Scheme for the XPtrPart   * @name:  the preparsed Scheme for the XPtrPart
 *  *
  * XPtrPart ::= 'xpointer' '(' XPtrExpr ')'   * XPtrPart ::= 'xpointer' '(' XPtrExpr ')'
  *            | Scheme '(' SchemeSpecificExpr ')'   *            | Scheme '(' SchemeSpecificExpr ')'
  *   *
Line 953  xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int i Line 953  xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int i
  *   *
  * SchemeSpecificExpr ::= StringWithBalancedParens   * SchemeSpecificExpr ::= StringWithBalancedParens
  *   *
 * StringWithBalancedParens ::=   * StringWithBalancedParens ::=
  *              [^()]* ('(' StringWithBalancedParens ')' [^()]*)*   *              [^()]* ('(' StringWithBalancedParens ')' [^()]*)*
  *              [VC: Parenthesis escaping]   *              [VC: Parenthesis escaping]
  *   *
Line 971  xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int i Line 971  xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int i
  *   *
  * Parse and evaluate an XPtrPart. Basically it generates the unescaped   * Parse and evaluate an XPtrPart. Basically it generates the unescaped
  * string and if the scheme is 'xpointer' it will call the XPath interpreter.   * string and if the scheme is 'xpointer' it will call the XPath interpreter.
 *  *
  * TODO: there is no new scheme registration mechanism   * TODO: there is no new scheme registration mechanism
  */   */
   
Line 1097  xmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xml Line 1097  xmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xml
             xmlFree(name);              xmlFree(name);
             XP_ERROR(XPATH_MEMORY_ERROR);              XP_ERROR(XPATH_MEMORY_ERROR);
         }          }
        
         xmlXPathRegisterNs(ctxt->context, prefix, URI);          xmlXPathRegisterNs(ctxt->context, prefix, URI);
         CUR_PTR = left;          CUR_PTR = left;
         xmlFree(URI);          xmlFree(URI);
Line 1229  xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xml Line 1229  xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xml
     while (CUR == '/') {      while (CUR == '/') {
         int child = 0;          int child = 0;
         NEXT;          NEXT;
        
         while ((CUR >= '0') && (CUR <= '9')) {          while ((CUR >= '0') && (CUR <= '9')) {
             child = child * 10 + (CUR - '0');              child = child * 10 + (CUR - '0');
             NEXT;              NEXT;
Line 1253  static void Line 1253  static void
 xmlXPtrEvalXPointer(xmlXPathParserContextPtr ctxt) {  xmlXPtrEvalXPointer(xmlXPathParserContextPtr ctxt) {
     if (ctxt->valueTab == NULL) {      if (ctxt->valueTab == NULL) {
         /* Allocate the value stack */          /* Allocate the value stack */
        ctxt->valueTab = (xmlXPathObjectPtr *)         ctxt->valueTab = (xmlXPathObjectPtr *)
                          xmlMalloc(10 * sizeof(xmlXPathObjectPtr));                           xmlMalloc(10 * sizeof(xmlXPathObjectPtr));
         if (ctxt->valueTab == NULL) {          if (ctxt->valueTab == NULL) {
             xmlXPtrErrMemory("allocating evaluation context");              xmlXPtrErrMemory("allocating evaluation context");
Line 1396  xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx Line 1396  xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx
                     /*                      /*
                      * Evaluation may push a root nodeset which is unused                       * Evaluation may push a root nodeset which is unused
                      */                       */
                    xmlNodeSetPtr set;                     xmlNodeSetPtr set;
                     set = tmp->nodesetval;                      set = tmp->nodesetval;
                     if ((set->nodeNr != 1) ||                      if ((set->nodeNr != 1) ||
                         (set->nodeTab[0] != (xmlNodePtr) ctx->doc))                          (set->nodeTab[0] != (xmlNodePtr) ctx->doc))
                         stack++;                          stack++;
                 } else                  } else
                    stack++;                        stack++;
             }              }
             xmlXPathFreeObject(tmp);              xmlXPathFreeObject(tmp);
         }          }
Line 1416  xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx Line 1416  xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx
         xmlXPathFreeObject(res);          xmlXPathFreeObject(res);
         res = NULL;          res = NULL;
     }      }
        
     xmlXPathFreeParserContext(ctxt);      xmlXPathFreeParserContext(ctxt);
     return(res);      return(res);
 }  }
Line 1444  xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { Line 1444  xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) {
         return(NULL);          return(NULL);
     start = (xmlNodePtr) range->user;      start = (xmlNodePtr) range->user;
   
    if (start == NULL)    if ((start == NULL) || (start->type == XML_NAMESPACE_DECL))
         return(NULL);          return(NULL);
     end = range->user2;      end = range->user2;
     if (end == NULL)      if (end == NULL)
         return(xmlCopyNode(start, 1));          return(xmlCopyNode(start, 1));
       if (end->type == XML_NAMESPACE_DECL)
           return(NULL);
   
     cur = start;      cur = start;
     index1 = range->index;      index1 = range->index;
Line 1478  xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { Line 1480  xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) {
                 /* prune and return full set */                  /* prune and return full set */
                 if (last != NULL)                  if (last != NULL)
                     xmlAddNextSibling(last, tmp);                      xmlAddNextSibling(last, tmp);
                else                 else
                     xmlAddChild(parent, tmp);                      xmlAddChild(parent, tmp);
                 return(list);                  return(list);
             } else {              } else {
Line 1732  xmlXPtrNbLocChildren(xmlNodePtr node) { Line 1734  xmlXPtrNbLocChildren(xmlNodePtr node) {
  * @ctxt:  the XPointer Parser context   * @ctxt:  the XPointer Parser context
  * @nargs:  the number of args   * @nargs:  the number of args
  *   *
 * Function implementing here() operation  * Function implementing here() operation
  * as described in 5.4.3   * as described in 5.4.3
  */   */
 static void  static void
Line 1741  xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int Line 1743  xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int
   
     if (ctxt->context->here == NULL)      if (ctxt->context->here == NULL)
         XP_ERROR(XPTR_SYNTAX_ERROR);          XP_ERROR(XPTR_SYNTAX_ERROR);
    
     valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->here, NULL));      valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->here, NULL));
 }  }
   
Line 1750  xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int Line 1752  xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int
  * @ctxt:  the XPointer Parser context   * @ctxt:  the XPointer Parser context
  * @nargs:  the number of args   * @nargs:  the number of args
  *   *
 * Function implementing origin() operation  * Function implementing origin() operation
  * as described in 5.4.3   * as described in 5.4.3
  */   */
 static void  static void
Line 1759  xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, i Line 1761  xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, i
   
     if (ctxt->context->origin == NULL)      if (ctxt->context->origin == NULL)
         XP_ERROR(XPTR_SYNTAX_ERROR);          XP_ERROR(XPTR_SYNTAX_ERROR);
    
     valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->origin, NULL));      valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->origin, NULL));
 }  }
   
Line 1768  xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, i Line 1770  xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, i
  * @ctxt:  the XPointer Parser context   * @ctxt:  the XPointer Parser context
  * @nargs:  the number of args   * @nargs:  the number of args
  *   *
 * Function implementing start-point() operation  * Function implementing start-point() operation
  * as described in 5.4.3   * as described in 5.4.3
  * ----------------   * ----------------
  * location-set start-point(location-set)   * location-set start-point(location-set)
Line 1860  xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctx Line 1862  xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctx
  * @ctxt:  the XPointer Parser context   * @ctxt:  the XPointer Parser context
  * @nargs:  the number of args   * @nargs:  the number of args
  *   *
 * Function implementing end-point() operation  * Function implementing end-point() operation
  * as described in 5.4.3   * as described in 5.4.3
  * ----------------------------   * ----------------------------
  * location-set end-point(location-set)   * location-set end-point(location-set)
Line 1996  xmlXPtrCoveringRange(xmlXPathParserContextPtr ctxt, xm Line 1998  xmlXPtrCoveringRange(xmlXPathParserContextPtr ctxt, xm
                         case XML_NOTATION_NODE:                          case XML_NOTATION_NODE:
                         case XML_HTML_DOCUMENT_NODE: {                          case XML_HTML_DOCUMENT_NODE: {
                             int indx = xmlXPtrGetIndex(node);                              int indx = xmlXPtrGetIndex(node);
                             
                             node = node->parent;                              node = node->parent;
                             return(xmlXPtrNewRange(node, indx - 1,                              return(xmlXPtrNewRange(node, indx - 1,
                                                    node, indx + 1));                                                     node, indx + 1));
Line 2243  xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt,  Line 2245  xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, 
   
     cur = ctxt->cur;      cur = ctxt->cur;
     newset = xmlXPtrLocationSetCreate(NULL);      newset = xmlXPtrLocationSetCreate(NULL);
    
     for (i = 0; i < oldset->nodeNr; i++) {      for (i = 0; i < oldset->nodeNr; i++) {
         ctxt->cur = cur;          ctxt->cur = cur;
   
Line 2277  xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt,  Line 2279  xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, 
             res = valuePop(ctxt);              res = valuePop(ctxt);
             xmlXPathFreeObject(res);              xmlXPathFreeObject(res);
         }          }
        
         ctxt->context->node = NULL;          ctxt->context->node = NULL;
     }      }
   
Line 2297  xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt,  Line 2299  xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, 
  * @level: incremented/decremented to show level in tree   * @level: incremented/decremented to show level in tree
  *   *
  * Advance to the next element or text node in document order   * Advance to the next element or text node in document order
 * TODO: add a stack for entering/exiting entities  * TODO: add a stack for entering/exiting entities
  *   *
  * Returns -1 in case of failure, 0 otherwise   * Returns -1 in case of failure, 0 otherwise
  */   */
 xmlNodePtr  xmlNodePtr
 xmlXPtrAdvanceNode(xmlNodePtr cur, int *level) {  xmlXPtrAdvanceNode(xmlNodePtr cur, int *level) {
 next:  next:
    if (cur == NULL)    if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL))
         return(NULL);          return(NULL);
     if (cur->children != NULL) {      if (cur->children != NULL) {
         cur = cur->children ;          cur = cur->children ;
Line 2362  xmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int by Line 2364  xmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int by
     if ((node == NULL) || (indx == NULL))      if ((node == NULL) || (indx == NULL))
         return(-1);          return(-1);
     cur = *node;      cur = *node;
    if (cur == NULL)    if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL))
         return(-1);          return(-1);
     pos = *indx;      pos = *indx;
   
Line 2400  xmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int by Line 2402  xmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int by
             return(0);              return(0);
         }          }
         /*          /*
         * We should have a text (or cdata) node ...          * We should have a text (or cdata) node ...
          */           */
         len = 0;          len = 0;
         if ((cur->type != XML_ELEMENT_NODE) &&          if ((cur->type != XML_ELEMENT_NODE) &&
Line 2453  xmlXPtrMatchString(const xmlChar *string, xmlNodePtr s Line 2455  xmlXPtrMatchString(const xmlChar *string, xmlNodePtr s
   
     if (string == NULL)      if (string == NULL)
         return(-1);          return(-1);
    if (start == NULL)    if ((start == NULL) || (start->type == XML_NAMESPACE_DECL))
         return(-1);          return(-1);
    if ((end == NULL) || (endindex == NULL))    if ((end == NULL) || (*end == NULL) ||
         ((*end)->type == XML_NAMESPACE_DECL) || (endindex == NULL))
         return(-1);          return(-1);
     cur = start;      cur = start;
     if (cur == NULL)      if (cur == NULL)
Line 2538  xmlXPtrSearchString(const xmlChar *string, xmlNodePtr  Line 2541  xmlXPtrSearchString(const xmlChar *string, xmlNodePtr 
   
     if (string == NULL)      if (string == NULL)
         return(-1);          return(-1);
    if ((start == NULL) || (startindex == NULL))    if ((start == NULL) || (*start == NULL) ||
         ((*start)->type == XML_NAMESPACE_DECL) || (startindex == NULL))
         return(-1);          return(-1);
     if ((end == NULL) || (endindex == NULL))      if ((end == NULL) || (endindex == NULL))
         return(-1);          return(-1);
     cur = *start;      cur = *start;
     if (cur == NULL)  
         return(-1);  
     pos = *startindex - 1;      pos = *startindex - 1;
     first = string[0];      first = string[0];
   
Line 2577  xmlXPtrSearchString(const xmlChar *string, xmlNodePtr  Line 2579  xmlXPtrSearchString(const xmlChar *string, xmlNodePtr 
                     /*                      /*
                      * An empty string is considered to match before each                       * An empty string is considered to match before each
                      * character of the string-value and after the final                       * character of the string-value and after the final
                     * character.                      * character.
                      */                       */
 #ifdef DEBUG_RANGES  #ifdef DEBUG_RANGES
                     xmlGenericError(xmlGenericErrorContext,                      xmlGenericError(xmlGenericErrorContext,
Line 2618  xmlXPtrGetLastChar(xmlNodePtr *node, int *indx) { Line 2620  xmlXPtrGetLastChar(xmlNodePtr *node, int *indx) {
     xmlNodePtr cur;      xmlNodePtr cur;
     int pos, len = 0;      int pos, len = 0;
   
    if ((node == NULL) || (indx == NULL))    if ((node == NULL) || (*node == NULL) ||
         ((*node)->type == XML_NAMESPACE_DECL) || (indx == NULL))
         return(-1);          return(-1);
     cur = *node;      cur = *node;
     pos = *indx;      pos = *indx;
   
     if (cur == NULL)  
         return(-1);  
   
     if ((cur->type == XML_ELEMENT_NODE) ||      if ((cur->type == XML_ELEMENT_NODE) ||
         (cur->type == XML_DOCUMENT_NODE) ||          (cur->type == XML_DOCUMENT_NODE) ||
         (cur->type == XML_HTML_DOCUMENT_NODE)) {          (cur->type == XML_HTML_DOCUMENT_NODE)) {
Line 2729  xmlXPtrGetEndPoint(xmlXPathObjectPtr obj, xmlNodePtr * Line 2729  xmlXPtrGetEndPoint(xmlXPathObjectPtr obj, xmlNodePtr *
  * @nargs:  the number of args   * @nargs:  the number of args
  *   *
  * Function implementing the string-range() function   * Function implementing the string-range() function
 * range as described in 5.4.2  * range as described in 5.4.2
  *   *
  * ------------------------------   * ------------------------------
  * [Definition: For each location in the location-set argument,   * [Definition: For each location in the location-set argument,
Line 2893  error: Line 2893  error:
  * @ctxt:  the XPointer Parser context   * @ctxt:  the XPointer Parser context
  *   *
  *  [8]   Predicate ::=   '[' PredicateExpr ']'   *  [8]   Predicate ::=   '[' PredicateExpr ']'
 *  [9]   PredicateExpr ::=   Expr  *  [9]   PredicateExpr ::=   Expr
  *   *
  * Evaluate a predicate as in xmlXPathEvalPredicate() but for   * Evaluate a predicate as in xmlXPathEvalPredicate() but for
  * a Location Set instead of a node set   * a Location Set instead of a node set
Line 2942  xmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctx Line 2942  xmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctx
          */           */
         cur = ctxt->cur;          cur = ctxt->cur;
         newset = xmlXPtrLocationSetCreate(NULL);          newset = xmlXPtrLocationSetCreate(NULL);
        
         for (i = 0; i < oldset->locNr; i++) {          for (i = 0; i < oldset->locNr; i++) {
             ctxt->cur = cur;              ctxt->cur = cur;
   
Line 2978  xmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctx Line 2978  xmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctx
                 res = valuePop(ctxt);                  res = valuePop(ctxt);
                 xmlXPathFreeObject(res);                  xmlXPathFreeObject(res);
             }              }
            
             ctxt->context->node = NULL;              ctxt->context->node = NULL;
         }          }
   

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>