diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2008-04-14 09:20:54 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2008-04-14 09:20:54 +0000 |
commit | 2f21f67242eeb557ac6aeaba4ec514d27f0373c4 (patch) | |
tree | 70fd86abd69984d0d686773d20856073df7c84da | |
parent | a91a7c57179a279c27e8310e8f497f967bd5d24f (diff) | |
download | libxslt-2f21f67242eeb557ac6aeaba4ec514d27f0373c4.tar.gz libxslt-2f21f67242eeb557ac6aeaba4ec514d27f0373c4.tar.bz2 libxslt-2f21f67242eeb557ac6aeaba4ec514d27f0373c4.zip |
fixes #527297 general patter comps fix and cleanup other cleanups Daniel
* 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
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 15 | ||||
-rw-r--r-- | libxslt/pattern.c | 86 | ||||
-rw-r--r-- | libxslt/pattern.h | 14 | ||||
-rw-r--r-- | libxslt/xsltInternals.h | 6 |
5 files changed, 101 insertions, 25 deletions
@@ -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 @@ -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). diff --git a/libxslt/pattern.c b/libxslt/pattern.c index bfc55592..d5e2e61b 100644 --- a/libxslt/pattern.c +++ b/libxslt/pattern.c @@ -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 diff --git a/libxslt/pattern.h b/libxslt/pattern.h index 4183e6b7..eb21be32 100644 --- a/libxslt/pattern.h +++ b/libxslt/pattern.h @@ -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 diff --git a/libxslt/xsltInternals.h b/libxslt/xsltInternals.h index 8be177cd..dfc91e8d 100644 --- a/libxslt/xsltInternals.h +++ b/libxslt/xsltInternals.h @@ -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; }; /** |