summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2008-04-14 09:20:54 +0000
committerDaniel Veillard <veillard@src.gnome.org>2008-04-14 09:20:54 +0000
commit2f21f67242eeb557ac6aeaba4ec514d27f0373c4 (patch)
tree70fd86abd69984d0d686773d20856073df7c84da
parenta91a7c57179a279c27e8310e8f497f967bd5d24f (diff)
downloadlibxslt-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--ChangeLog5
-rw-r--r--NEWS15
-rw-r--r--libxslt/pattern.c86
-rw-r--r--libxslt/pattern.h14
-rw-r--r--libxslt/xsltInternals.h6
5 files changed, 101 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 1e6e4812..762946f0 100644
--- 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 e0294546..ac9ef792 100644
--- 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).
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;
};
/**