From 493051a1b2dae838bf5ceb7d8ac112c370943448 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Thu, 15 Feb 2001 11:46:16 +0000 Subject: [PATCH] Cleanup, and improving some inefficiency in the number code: - libxslt/pattern.[ch]: exported pattern matching interfaces for numbers.c and future debug module - libxslt/numbers.c: updated to new interface, should avoid unnecessary recompilation of patterns. - libxslt/xsltutils.[ch]: cleanup - tests/REC/gmon.out: removed :-) Daniel --- ChangeLog | 9 ++++++++ libxslt/numbers.c | 52 +++++++++++++++++++++++++++++++++------------ libxslt/pattern.c | 59 ++++++++++++++++++++++++++++++++++------------------ libxslt/pattern.h | 19 +++++++++++++++++ libxslt/xsltutils.c | 2 +- libxslt/xsltutils.h | 3 +++ tests/REC/gmon.out | Bin 151219 -> 0 bytes 7 files changed, 110 insertions(+), 34 deletions(-) delete mode 100644 tests/REC/gmon.out diff --git a/ChangeLog b/ChangeLog index dd043ee..1d9b1bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Thu Feb 15 12:41:44 CET 2001 Daniel Veillard + + * libxslt/pattern.[ch]: exported pattern matching interfaces + for numbers.c and future debug module + * libxslt/numbers.c: updated to new interface, should avoid + unnecessary recompilation of patterns. + * libxslt/xsltutils.[ch]: cleanup + * tests/REC/gmon.out: removed :-) + Wed Feb 14 19:13:33 CET 2001 Bjorn Reese * libxslt/numbers.c: implemented level=any diff --git a/libxslt/numbers.c b/libxslt/numbers.c index dd0d58d..c59ebe4 100644 --- a/libxslt/numbers.c +++ b/libxslt/numbers.c @@ -404,7 +404,17 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, xmlNodePtr ancestor; xmlNodePtr preceding; xmlXPathParserContextPtr parser; - + xsltCompMatchPtr countPat; + xsltCompMatchPtr fromPat; + + if (count != NULL) + countPat = xsltCompilePattern(count); + else + countPat = NULL; + if (from != NULL) + fromPat = xsltCompilePattern(from); + else + fromPat = NULL; context->xpathCtxt->node = node; parser = xmlXPathNewParserContext(NULL, context->xpathCtxt); if (parser) { @@ -413,7 +423,7 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, preceding != NULL; preceding = xmlXPathNextPreceding(parser, preceding)) { if ((from != NULL) && - xsltMatchPattern(context, preceding, from)) { + xsltTestCompMatchList(context, preceding, fromPat)) { keep_going = FALSE; break; /* for */ } @@ -423,7 +433,7 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, xmlStrEqual(node->name, preceding->name)) cnt++; } else { - if (xsltMatchPattern(context, preceding, count)) + if (xsltTestCompMatchList(context, preceding, countPat)) cnt++; } } @@ -434,7 +444,7 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, ancestor != NULL; ancestor = xmlXPathNextAncestor(parser, ancestor)) { if ((from != NULL) && - xsltMatchPattern(context, ancestor, from)) { + xsltTestCompMatchList(context, ancestor, fromPat)) { break; /* for */ } if (count == NULL) { @@ -443,13 +453,15 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, xmlStrEqual(node->name, ancestor->name)) cnt++; } else { - if (xsltMatchPattern(context, ancestor, count)) + if (xsltTestCompMatchList(context, ancestor, countPat)) cnt++; } } } array[amount++] = (double)cnt; } + xsltFreeCompMatchList(countPat); + xsltFreeCompMatchList(fromPat); return amount; } @@ -466,7 +478,17 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr context, xmlNodePtr ancestor; xmlNodePtr preceding; xmlXPathParserContextPtr parser; - + xsltCompMatchPtr countPat; + xsltCompMatchPtr fromPat; + + if (count != NULL) + countPat = xsltCompilePattern(count); + else + countPat = NULL; + if (from != NULL) + fromPat = xsltCompilePattern(from); + else + fromPat = NULL; context->xpathCtxt->node = node; parser = xmlXPathNewParserContext(NULL, context->xpathCtxt); if (parser) { @@ -476,23 +498,25 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr context, ancestor = xmlXPathNextAncestor(parser, ancestor)) { if ((from != NULL) && - xsltMatchPattern(context, ancestor, from)) + xsltTestCompMatchList(context, ancestor, fromPat)) break; /* for */ if ((count == NULL) || - xsltMatchPattern(context, ancestor, count)) { + xsltTestCompMatchList(context, ancestor, countPat)) { /* count(preceding-sibling::*) */ cnt = 0; for (preceding = ancestor; preceding != NULL; - preceding = xmlXPathNextPrecedingSibling(parser, preceding)) { + preceding = + xmlXPathNextPrecedingSibling(parser, preceding)) { if (count == NULL) { if ((preceding->type == ancestor->type) && /* FIXME */ xmlStrEqual(preceding->name, ancestor->name)) cnt++; } else { - if (xsltMatchPattern(context, preceding, count)) + if (xsltTestCompMatchList(context, preceding, + countPat)) cnt++; } } @@ -503,6 +527,8 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr context, } xmlXPathFreeParserContext(parser); } + xsltFreeCompMatchList(countPat); + xsltFreeCompMatchList(fromPat); return amount; } @@ -573,7 +599,7 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, } else if (data->level) { - if (xmlStrEqual(data->level, "single")) { + if (xmlStrEqual(data->level, (const xmlChar *) "single")) { amount = xsltNumberFormatGetMultipleLevel(ctxt, node, data->count, @@ -588,7 +614,7 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, array_amount, output); } - } else if (xmlStrEqual(data->level, "multiple")) { + } else if (xmlStrEqual(data->level, (const xmlChar *) "multiple")) { double numarray[1024]; int max = sizeof(numarray)/sizeof(numarray[0]); amount = xsltNumberFormatGetMultipleLevel(ctxt, @@ -605,7 +631,7 @@ xsltNumberFormat(xsltTransformContextPtr ctxt, array_amount, output); } - } else if (xmlStrEqual(data->level, "any")) { + } else if (xmlStrEqual(data->level, (const xmlChar *) "any")) { amount = xsltNumberFormatGetAnyLevel(ctxt, node, data->count, diff --git a/libxslt/pattern.c b/libxslt/pattern.c index 47f2b92..9e9a407 100644 --- a/libxslt/pattern.c +++ b/libxslt/pattern.c @@ -62,8 +62,6 @@ struct _xsltStepOp { xmlChar *value3; }; -typedef struct _xsltCompMatch xsltCompMatch; -typedef xsltCompMatch *xsltCompMatchPtr; struct _xsltCompMatch { struct _xsltCompMatch *next; /* siblings in the name hash */ float priority; /* the priority */ @@ -94,15 +92,13 @@ struct _xsltParserContext { /** * xsltNewCompMatch: - * @mode: the mode name or NULL - * @modeURI: the mode URI or NULL * * Create a new XSLT CompMatch * * Returns the newly allocated xsltCompMatchPtr or NULL in case of error */ xsltCompMatchPtr -xsltNewCompMatch(const xmlChar *mode, const xmlChar *modeURI) { +xsltNewCompMatch(void) { xsltCompMatchPtr cur; cur = (xsltCompMatchPtr) xmlMalloc(sizeof(xsltCompMatch)); @@ -113,8 +109,6 @@ xsltNewCompMatch(const xmlChar *mode, const xmlChar *modeURI) { } memset(cur, 0, sizeof(xsltCompMatch)); cur->maxStep = 20; - cur->mode = xmlStrdup(mode); - cur->modeURI = xmlStrdup(modeURI); return(cur); } @@ -575,6 +569,32 @@ xsltTestCompMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp, return(1); } +/** + * xsltTestCompMatchList: + * @ctxt: a XSLT process context + * @node: a node + * @comp: the precompiled pattern list + * + * Test wether the node matches one of the patterns in the list + * + * Returns 1 if it matches, 0 if it doesn't and -1 in case of failure + */ +int +xsltTestCompMatchList(xsltTransformContextPtr ctxt, xmlNodePtr node, + xsltCompMatchPtr comp) { + int ret; + + if ((ctxt == NULL) || (node == NULL)) + return(-1); + while (comp != NULL) { + ret = xsltTestCompMatch(ctxt, comp, node, NULL, NULL); + if (ret == 1) + return(1); + comp = comp->next; + } + return(0); +} + /************************************************************************ * * * Dedicated parser for templates * @@ -1096,22 +1116,17 @@ error: /** * xsltCompilePattern: * @pattern an XSLT pattern - * @mode: the mode name or NULL - * @modeURI: the mode URI or NULL * - * Compile the XSLT pattern and generates a precompiled form suitable + * Compile the XSLT pattern and generates a list of precompiled form suitable * for fast matching. - * Note that the splitting as union of patterns is expected to be handled - * by the caller * * [1] Pattern ::= LocationPathPattern | Pattern '|' LocationPathPattern * - * Returns the generated xsltCompMatchPtr or NULL in case of failure + * Returns the generated pattern list or NULL in case of failure */ xsltCompMatchPtr -xsltCompilePattern(const xmlChar *pattern, const xmlChar *mode, - const xmlChar *modeURI) { +xsltCompilePattern(const xmlChar *pattern) { xsltParserContextPtr ctxt = NULL; xsltCompMatchPtr element, first = NULL, previous = NULL; int current, start, end; @@ -1143,7 +1158,7 @@ xsltCompilePattern(const xmlChar *pattern, const xmlChar *mode, "xsltCompilePattern : NULL pattern\n"); goto error; } - element = xsltNewCompMatch(mode, modeURI); + element = xsltNewCompMatch(); if (element == NULL) { goto error; } @@ -1214,7 +1229,6 @@ error: return(NULL); } - /************************************************************************ * * * Module interfaces * @@ -1241,12 +1255,16 @@ xsltAddTemplate(xsltStylesheetPtr style, xsltTemplatePtr cur, if ((style == NULL) || (cur == NULL) || (cur->match == NULL)) return(-1); - pat = xsltCompilePattern(cur->match, mode, modeURI); + pat = xsltCompilePattern(cur->match); while (pat) { next = pat->next; pat->next = NULL; pat->template = cur; + if (mode != NULL) + pat->mode = xmlStrdup(mode); + if (modeURI != NULL) + pat->modeURI = xmlStrdup(modeURI); if (pat->priority != XSLT_PAT_NO_PRIORITY) cur->priority = pat->priority; else @@ -1574,7 +1592,7 @@ xsltFreeTemplateHashes(xsltStylesheetPtr style) { } /** - * xsltMatchTemplate + * xsltMatchPattern * @node: a node in the source tree * @pattern: an XSLT pattern * @@ -1589,7 +1607,7 @@ xsltMatchPattern(xsltTransformContextPtr context, xsltCompMatchPtr first, comp; if ((context != NULL) && (pattern != NULL)) { - first = xsltCompilePattern(pattern, NULL, NULL); + first = xsltCompilePattern(pattern); for (comp = first; comp != NULL; comp = comp->next) { match = xsltTestCompMatch(context, comp, node, NULL, NULL); if (match) @@ -1600,3 +1618,4 @@ xsltMatchPattern(xsltTransformContextPtr context, } return match; } + diff --git a/libxslt/pattern.h b/libxslt/pattern.h index 4320ec9..105c143 100644 --- a/libxslt/pattern.h +++ b/libxslt/pattern.h @@ -15,6 +15,25 @@ extern "C" { #endif +/* + * The implementation of patterns is kept private + */ +typedef struct _xsltCompMatch xsltCompMatch; +typedef xsltCompMatch *xsltCompMatchPtr; + +/* + * Pattern related interfaces + */ + +xsltCompMatchPtr xsltCompilePattern (const xmlChar *pattern); +void xsltFreeCompMatchList (xsltCompMatchPtr comp); +int xsltTestCompMatchList (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xsltCompMatchPtr comp); + +/* + * Template related interfaces + */ int xsltAddTemplate (xsltStylesheetPtr style, xsltTemplatePtr cur, const xmlChar *mode, diff --git a/libxslt/xsltutils.c b/libxslt/xsltutils.c index e7d6048..e988877 100644 --- a/libxslt/xsltutils.c +++ b/libxslt/xsltutils.c @@ -389,7 +389,7 @@ xsltSaveResultTo(xmlOutputBufferPtr buf, xmlDocPtr result, } if ((cur != NULL) && (cur->name != NULL)) { xmlOutputBufferWriteString(buf, "name); + xmlOutputBufferWriteString(buf, (const char *) cur->name); if (doctypePublic != NULL) { if (doctypeSystem != NULL) { xmlOutputBufferWriteString(buf, " PUBLIC "); diff --git a/libxslt/xsltutils.h b/libxslt/xsltutils.h index 334541e..970737c 100644 --- a/libxslt/xsltutils.h +++ b/libxslt/xsltutils.h @@ -24,6 +24,9 @@ xmlChar *xmlSplitQName2(const xmlChar *name, xmlChar **prefix); void xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs); xmlAttrPtr xmlSetNsProp (xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, const xmlChar *value); +xmlNodePtr xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); +xmlNodePtr xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); +xmlNodePtr xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur); /********* void xmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt, xmlXPathVariableLookupFunc f, void *data) diff --git a/tests/REC/gmon.out b/tests/REC/gmon.out deleted file mode 100644 index f8cd7d39142749673fbadfdaea84a7f21686cd2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151219 zcmeIxPl#1j9Kdm(o{L8in@oz*LSzIT3?^vPE}@01XyL+z3&F7lDqSe(V%kQya5a>b zrVAJL4ppEvK7*Z1um zEcwsR^Rp@cv3W&)b>m>kRLu78*}ZS?)c)aJqd$fh{3bwv009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009F3UtqBPos{R#r96l|2AkeZdDZ5oi?R1oe(FM<%tk!(XD=51?Zwj{ z^y1rNy|}Yj<3ikWH#RBfjGsvPoA+yMi8y||#wQ=9eDHjYnU7NbBGxQ#pY5-R(d5#n zDQ_FD8T%~d4IkGv>mpWNuQC34%0Ha0F?}ZGxmZ`8;7Y`3x5=|9{~ZUH$!x@EaxCKI z*s+@g)70=yPe=R~o0Q37#Ar>POZm;XP$nk>aKo21j?Sli>tc|w+iO4e*3A6Wttpc>Mz`IKI1^`;$;xXf9~vHdBjTYrr%Vo9 zPx)Ry_QYAE$=k6>i7oLF9{xJzW$m+Fjd<%`%DIh|zoh)e@SJPE_Y6+mPkGnY`j7Na z#QmFfx0fDn@{ynGZZ}ppERJ0s@nZ4Usk CAgQ(h -- 2.7.4