fixes #527297 general patter comps fix and cleanup other cleanups Daniel
authorDaniel Veillard <veillard@src.gnome.org>
Mon, 14 Apr 2008 09:20:54 +0000 (09:20 +0000)
committerDaniel Veillard <veillard@src.gnome.org>
Mon, 14 Apr 2008 09:20:54 +0000 (09:20 +0000)
* libxslt/pattern.c: fixes #527297 general patter comps fix and cleanup
* libxslt/xsltInternals.h libxslt/pattern.h: other cleanups
Daniel

svn path=/trunk/; revision=1469

ChangeLog
NEWS
libxslt/pattern.c
libxslt/pattern.h
libxslt/xsltInternals.h

index 1e6e481..762946f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Apr 14 11:19:14 CEST 2008 Daniel Veillard <daniel@veillard.com>
+
+       * libxslt/pattern.c: fixes #527297 general patter comps fix and cleanup
+       * libxslt/xsltInternals.h libxslt/pattern.h: other cleanups
+
 Tue Apr  8 19:15:19 CEST 2008 Daniel Veillard <daniel@veillard.com>
 
        * configure.in doc/*: release of 1.1.23
diff --git a/NEWS b/NEWS
index e029454..ac9ef79 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,21 @@ ChangeLog.html
 to the SVN at 
 http://svn.gnome.org/viewcvs/libxslt/trunk/
  code base.Those are the public releases made:
+1.1.23: Apr  8 2008:
+   - Documentation: fix links for Cygwin DocBook setup (Philippe Bourcier),
+      xsltParseStylesheetDoc doc fix (Jason Viers), fix manpage default
+      maxdepth value 
+   - Bug fixes: python segfault (Daniel Gryniewicz), week-in-year bug fix
+      (Maurice van der Pot), fix python iterator problem (William Brack),
+      avoid garbage collection problems on str:tokenize and str:split
+      and function results (William Brack and Peter Pawlowski) 
+      superfluous re-generation of keys (William Brack), remove superfluous
+      code in xsltExtInitTest (Tony Graham), func:result segfault fix
+      (William Brack), timezone offset problem (Peter Pawlowski),
+   - Portability fixes: old gcrypt support fix (Brent Cowgill), Python
+      portability patch (Stephane Bidoul), VS 2008 fix (Rob Richard) 
+
+
 1.1.22: Aug 23 2007:
    - Bug fixes: RVT cleanup problems (William Brack), exclude-result-prefix
       bug (William Brack), stylesheet compilation error handling (Rob Richards).
index bfc5559..d5e2e61 100644 (file)
@@ -106,7 +106,7 @@ struct _xsltCompMatch {
     int maxStep;
     xmlNsPtr *nsList;          /* the namespaces in scope */
     int nsNr;                  /* the number of namespaces in scope */
-    xsltStepOp steps[40];        /* ops for computation */
+    xsltStepOpPtr steps;        /* ops for computation */
 };
 
 typedef struct _xsltParserContext xsltParserContext;
@@ -146,7 +146,16 @@ xsltNewCompMatch(void) {
        return(NULL);
     }
     memset(cur, 0, sizeof(xsltCompMatch));
-    cur->maxStep = 40;
+    cur->maxStep = 10;
+    cur->nbStep = 0;
+    cur-> steps = (xsltStepOpPtr) xmlMalloc(sizeof(xsltStepOp) *
+                                            cur->maxStep);
+    if (cur->steps == NULL) {
+       xsltTransformError(NULL, NULL, NULL,
+               "xsltNewCompMatch : out of memory error\n");
+       xmlFree(cur);
+       return(NULL);
+    }
     cur->nsNr = 0;
     cur->nsList = NULL;
     cur->direct = 0;
@@ -181,6 +190,7 @@ xsltFreeCompMatch(xsltCompMatchPtr comp) {
        if (op->comp != NULL)
            xmlXPathFreeCompExpr(op->comp);
     }
+    xmlFree(comp->steps);
     memset(comp, -1, sizeof(xsltCompMatch));
     xmlFree(comp);
 }
@@ -279,14 +289,26 @@ static int
 xsltCompMatchAdd(xsltParserContextPtr ctxt, xsltCompMatchPtr comp,
                  xsltOp op, xmlChar * value, xmlChar * value2, int novar)
 {
-    if (comp->nbStep >= 40) {
-        xsltTransformError(NULL, NULL, NULL,
-                         "xsltCompMatchAdd: overflow\n");
-        return (-1);
+    if (comp->nbStep >= comp->maxStep) {
+        xsltStepOpPtr tmp;
+
+       tmp = (xsltStepOpPtr) xmlRealloc(comp->steps, comp->maxStep * 2 *
+                                        sizeof(xsltStepOp));
+       if (tmp == NULL) {
+           xsltGenericError(xsltGenericErrorContext,
+            "xsltCompMatchAdd: memory re-allocation failure.\n");
+           if (ctxt->style != NULL)
+               ctxt->style->errors++;
+           return (-1);
+       }
+        comp->maxStep *= 2;
+       comp->steps = tmp;
     }
     comp->steps[comp->nbStep].op = op;
     comp->steps[comp->nbStep].value = value;
     comp->steps[comp->nbStep].value2 = value2;
+    comp->steps[comp->nbStep].value3 = NULL;
+    comp->steps[comp->nbStep].comp = NULL;
     if (ctxt->ctxt != NULL) {
        comp->steps[comp->nbStep].previousExtra =
            xsltAllocateExtraCtxt(ctxt->ctxt);
@@ -343,6 +365,7 @@ xsltSwapTopCompMatch(xsltCompMatchPtr comp) {
        register xmlChar *tmp;
        register xsltOp op;
        register xmlXPathCompExprPtr expr; 
+       register int t;
        i = j - 1;
        tmp = comp->steps[i].value;
        comp->steps[i].value = comp->steps[j].value;
@@ -350,46 +373,74 @@ xsltSwapTopCompMatch(xsltCompMatchPtr comp) {
        tmp = comp->steps[i].value2;
        comp->steps[i].value2 = comp->steps[j].value2;
        comp->steps[j].value2 = tmp;
+       tmp = comp->steps[i].value3;
+       comp->steps[i].value3 = comp->steps[j].value3;
+       comp->steps[j].value3 = tmp;
        op = comp->steps[i].op;
        comp->steps[i].op = comp->steps[j].op;
        comp->steps[j].op = op;
        expr = comp->steps[i].comp;
        comp->steps[i].comp = comp->steps[j].comp;
        comp->steps[j].comp = expr;
+       t = comp->steps[i].previousExtra;
+       comp->steps[i].previousExtra = comp->steps[j].previousExtra;
+       comp->steps[j].previousExtra = t;
+       t = comp->steps[i].indexExtra;
+       comp->steps[i].indexExtra = comp->steps[j].indexExtra;
+       comp->steps[j].indexExtra = t;
+       t = comp->steps[i].lenExtra;
+       comp->steps[i].lenExtra = comp->steps[j].lenExtra;
+       comp->steps[j].lenExtra = t;
     }
 }
 
 /**
  * xsltReverseCompMatch:
+ * @ctxt: the parser context
  * @comp:  the compiled match expression
  *
  * reverse all the stack of expressions
  */
 static void
-xsltReverseCompMatch(xsltCompMatchPtr comp) {
+xsltReverseCompMatch(xsltParserContextPtr ctxt, xsltCompMatchPtr comp) {
     int i = 0;
     int j = comp->nbStep - 1;
 
     while (j > i) {
        register xmlChar *tmp;
        register xsltOp op;
-       register xmlXPathCompExprPtr expr; 
+       register xmlXPathCompExprPtr expr;
+       register int t;
+
        tmp = comp->steps[i].value;
        comp->steps[i].value = comp->steps[j].value;
        comp->steps[j].value = tmp;
        tmp = comp->steps[i].value2;
        comp->steps[i].value2 = comp->steps[j].value2;
        comp->steps[j].value2 = tmp;
+       tmp = comp->steps[i].value3;
+       comp->steps[i].value3 = comp->steps[j].value3;
+       comp->steps[j].value3 = tmp;
        op = comp->steps[i].op;
        comp->steps[i].op = comp->steps[j].op;
        comp->steps[j].op = op;
        expr = comp->steps[i].comp;
        comp->steps[i].comp = comp->steps[j].comp;
        comp->steps[j].comp = expr;
+       t = comp->steps[i].previousExtra;
+       comp->steps[i].previousExtra = comp->steps[j].previousExtra;
+       comp->steps[j].previousExtra = t;
+       t = comp->steps[i].indexExtra;
+       comp->steps[i].indexExtra = comp->steps[j].indexExtra;
+       comp->steps[j].indexExtra = t;
+       t = comp->steps[i].lenExtra;
+       comp->steps[i].lenExtra = comp->steps[j].lenExtra;
+       comp->steps[j].lenExtra = t;
        j--;
        i++;
     }
-    comp->steps[comp->nbStep++].op = XSLT_OP_END;
+    xsltCompMatchAdd(ctxt, comp, XSLT_OP_END, NULL, NULL, 0);
+
     /*
      * detect consecutive XSLT_OP_PREDICATE indicating a direct
      * matching should be done.
@@ -420,7 +471,8 @@ xsltReverseCompMatch(xsltCompMatchPtr comp) {
  ************************************************************************/
 
 static int
-xsltPatPushState(xsltStepStates *states, int step, xmlNodePtr node) {
+xsltPatPushState(xsltTransformContextPtr ctxt, xsltStepStates *states,
+                 int step, xmlNodePtr node) {
     if ((states->states == NULL) || (states->maxstates <= 0)) {
         states->maxstates = 4;
        states->nbstates = 0;
@@ -431,8 +483,12 @@ xsltPatPushState(xsltStepStates *states, int step, xmlNodePtr node) {
 
        tmp = (xsltStepStatePtr) xmlRealloc(states->states,
                               2 * states->maxstates * sizeof(xsltStepState));
-       if (tmp == NULL)
+       if (tmp == NULL) {
+           xsltGenericError(xsltGenericErrorContext,
+            "xsltPatPushState: memory re-allocation failure.\n");
+           ctxt->state = XSLT_STATE_STOPPED;
            return(-1);
+       }
        states->states = tmp;
        states->maxstates *= 2;
     }
@@ -738,12 +794,12 @@ restart:
                    goto rollback;
                node = node->parent;
                if ((step->op != XSLT_OP_ELEM) && step->op != XSLT_OP_ALL) {
-                   xsltPatPushState(&states, i, node);
+                   xsltPatPushState(ctxt, &states, i, node);
                    continue;
                }
                i++;
                if (step->value == NULL) {
-                   xsltPatPushState(&states, i - 1, node);
+                   xsltPatPushState(ctxt, &states, i - 1, node);
                    continue;
                }
                while (node != NULL) {
@@ -764,7 +820,7 @@ restart:
                }
                if (node == NULL)
                    goto rollback;
-               xsltPatPushState(&states, i - 1, node);
+               xsltPatPushState(ctxt, &states, i - 1, node);
                continue;
             case XSLT_OP_ID: {
                /* TODO Handle IDs decently, must be done differently */
@@ -1971,7 +2027,7 @@ xsltCompilePatternInternal(const xmlChar *pattern, xmlDocPtr doc,
        /*
         * Reverse for faster interpretation.
         */
-       xsltReverseCompMatch(element);
+       xsltReverseCompMatch(ctxt, element);
 
        /*
         * Set-up the priority
index 4183e6b..eb21be3 100644 (file)
@@ -32,15 +32,15 @@ typedef xsltCompMatch *xsltCompMatchPtr;
  * Pattern related interfaces.
  */
 
-XSLTPUBFUN xsltCompMatchPtr XSLTCALL 
+XSLTPUBFUN xsltCompMatchPtr XSLTCALL
                xsltCompilePattern      (const xmlChar *pattern,
                                         xmlDocPtr doc,
                                         xmlNodePtr node,
                                         xsltStylesheetPtr style,
                                         xsltTransformContextPtr runtime);
-XSLTPUBFUN void XSLTCALL                
+XSLTPUBFUN void XSLTCALL
                xsltFreeCompMatchList   (xsltCompMatchPtr comp);
-XSLTPUBFUN int XSLTCALL                 
+XSLTPUBFUN int XSLTCALL
                xsltTestCompMatchList   (xsltTransformContextPtr ctxt,
                                         xmlNodePtr node,
                                         xsltCompMatchPtr comp);
@@ -52,18 +52,18 @@ XSLTPUBFUN void XSLTCALL
 /*
  * Template related interfaces.
  */
-XSLTPUBFUN int XSLTCALL                
+XSLTPUBFUN int XSLTCALL
                xsltAddTemplate         (xsltStylesheetPtr style,
                                         xsltTemplatePtr cur,
                                         const xmlChar *mode,
                                         const xmlChar *modeURI);
-XSLTPUBFUN xsltTemplatePtr XSLTCALL    
+XSLTPUBFUN xsltTemplatePtr XSLTCALL
                xsltGetTemplate         (xsltTransformContextPtr ctxt,
                                         xmlNodePtr node,
                                         xsltStylesheetPtr style);
-XSLTPUBFUN void XSLTCALL               
+XSLTPUBFUN void XSLTCALL
                xsltFreeTemplateHashes  (xsltStylesheetPtr style);
-XSLTPUBFUN void XSLTCALL               
+XSLTPUBFUN void XSLTCALL
                xsltCleanupTemplates    (xsltStylesheetPtr style);
 
 #if 0
index 8be177c..dfc91e8 100644 (file)
@@ -1766,8 +1766,8 @@ struct _xsltTransformContext {
      */
     int internalized;
     int nbKeys;
-    int hasTemplKeyPatterns;    
-    xsltTemplatePtr currentTemplateRule; /* the Current Template Rule */    
+    int hasTemplKeyPatterns;
+    xsltTemplatePtr currentTemplateRule; /* the Current Template Rule */
     xmlNodePtr initialContextNode;
     xmlDocPtr initialContextDoc;
     xsltTransformCachePtr cache;
@@ -1775,7 +1775,7 @@ struct _xsltTransformContext {
     xmlDocPtr localRVT; /* list of local tree fragments; will be freed when
                           the instruction which created the fragment
                            exits */
-    xmlDocPtr localRVTBase;    
+    xmlDocPtr localRVTBase;
 };
 
 /**