mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 18:06:04 +00:00
[LIBXSLT] Update to version 1.1.35. CORE-17766
This commit is contained in:
parent
e524b1bcf6
commit
f7671c1be8
21 changed files with 482 additions and 437 deletions
4
dll/3rdparty/libxslt/Makefile.am
vendored
4
dll/3rdparty/libxslt/Makefile.am
vendored
|
@ -25,6 +25,7 @@ EXTRA_DIST = xsltConf.sh.in xslt-config.in libxslt.spec libxslt.spec.in \
|
|||
FEATURES TODO Copyright libxslt.m4 \
|
||||
win32/libxslt/libxslt.def win32/libxslt/libxslt.dsw \
|
||||
win32/libxslt/libxslt_so.dsp win32/libxslt/xsltproc.dsp \
|
||||
CMakeLists.txt config.h.cmake.in FindGcrypt.cmake libxslt-config.cmake.in libxslt-config.cmake.cmake.in \
|
||||
$(CVS_EXTRA_DIST)
|
||||
|
||||
## We create xsltConf.sh here and not from configure because we want
|
||||
|
@ -73,6 +74,9 @@ rpm: cleantar
|
|||
pkgconfigdir=$(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libxslt.pc libexslt.pc
|
||||
|
||||
cmakedir = $(libdir)/cmake/libxslt
|
||||
cmake_DATA = FindGcrypt.cmake libxslt-config.cmake
|
||||
|
||||
m4datadir = $(datadir)/aclocal
|
||||
m4data_DATA = libxslt.m4
|
||||
|
||||
|
|
171
dll/3rdparty/libxslt/NEWS
vendored
171
dll/3rdparty/libxslt/NEWS
vendored
|
@ -1,13 +1,176 @@
|
|||
|
||||
NEWS file for libxslt
|
||||
|
||||
Note that this is automatically generated from the news webpage at:
|
||||
http://xmlsoft.org/XSLT/news.html
|
||||
|
||||
See the git page at
|
||||
https://gitlab.gnome.org/GNOME/libxslt
|
||||
|
||||
to get a description of the recent commits.Those are the public releases made:
|
||||
to get a description of the recent commits.
|
||||
v1.1.35: Feb 16 2022:
|
||||
- Security:
|
||||
[CVE-2021-30560] Fix use-after-free in xsltApplyTemplates
|
||||
Fix memory leak in xsltDocumentElem (David King)
|
||||
Fix memory leak in xsltCompileIdKeyPattern (David King)
|
||||
Fix double-free with stylesheets containing entity nodes
|
||||
|
||||
- Fixed regressions:
|
||||
Fix performance regression with predicates in patterns
|
||||
Fix regression in xsltComputeSortResult
|
||||
|
||||
- Bug fixes:
|
||||
Fix conflict resolution for templates with same priority
|
||||
Fix xsl:number generating invalid UTF-8
|
||||
Support attribute value templates in xsl:sort lang attributes
|
||||
Don't pass first <xsl:sort> in <xsl:apply-templates> twice
|
||||
Fix quadratic runtime with text and <xsl:message>
|
||||
Don't allow empty EXSLT durations
|
||||
|
||||
- Improvements:
|
||||
Add xsltproc --huge Argument via libxml XML_PARSE_HUGE (William N. Braswell, Jr.)
|
||||
|
||||
- Tests, code quality, fuzzing:
|
||||
Remove .travis.yml
|
||||
Fix some misleading indentation (David King)
|
||||
Use actual types for templates in struct _xsltStylesheet
|
||||
Add CI for CMake on MSVC (Markus Rickert)
|
||||
Check for null pointer before calling freelocale
|
||||
Add CI test for Python 3
|
||||
Don't set maxDepth in XPath contexts
|
||||
Transfer XPath limits to XPtr context
|
||||
Stop using maxParserDepth XPath limit
|
||||
Make long-to-double cast explicit in date.c
|
||||
Disable LeakSanitizer
|
||||
Run clang CI tests with -Wimplicit-int-conversion
|
||||
Fix implicit-int-conversion warning in exslt/crypto.c
|
||||
Fix clang -Wimplicit-int-conversion warning (David Kilzer)
|
||||
Fix clang -Wconditional-uninitialized warning in libxslt/numbers.c (David Kilzer)
|
||||
Fix -Wshadow warnings in libexslt/dynamic.c (David Kilzer)
|
||||
Also search parent dir for source XML when fuzzing
|
||||
|
||||
- Build system, portability:
|
||||
Add CMake build files (Markus Rickert)
|
||||
Initial support for Python 3 (Suleyman Poyraz)
|
||||
Call ANSI versions of WinAPI functions explicitly
|
||||
Remove redundant flags from pkg-config files
|
||||
Suppress automake warning in tests/XSLTMark
|
||||
Fix linking libexslt dynamic library when using MinGW (Vadim Zeitlin)
|
||||
Added platform specific path separators (Dmitriy Korovkin)
|
||||
win32: allow passing *FLAGS on command line
|
||||
Fix export of xsltExtMarker on Windows (David Kilzer)
|
||||
Fix redundant includes already in libexslt.h (David Kilzer)
|
||||
Minor fixes to configure.js
|
||||
Fix variable syntax in Python configuration
|
||||
Add new EXSLT string tests to EXTRA_DIST
|
||||
Fix xml2-config check in configure script
|
||||
win32: Add configuration for profiler (Chun-wei Fan)
|
||||
Check whether 'xml2-config --dynamic' is supported
|
||||
|
||||
- Documentation:
|
||||
Add Makefile rule to regenerate xsltproc.html
|
||||
Update links
|
||||
Remove MAINTAINERS
|
||||
Upload documentation to GitLab Pages
|
||||
Add documentation in devhelp format
|
||||
Add --enable-rebuild-docs configure option
|
||||
Fix libexslt header summaries
|
||||
Fix validity of tutorial XML (David King)
|
||||
Use DocBook URL for tutorial DTD (David King)
|
||||
Update libxslt.doap
|
||||
Add missing options to xsltproc man page
|
||||
|
||||
|
||||
|
||||
v1.1.34: Oct 30 2019:
|
||||
- Documentation:
|
||||
Fix EXSLT web pages (Nick Wellnhofer),
|
||||
Regenerate web pages (Nick Wellnhofer),
|
||||
Fix Git link in news.html (Nick Wellnhofer),
|
||||
Minor documentation fixes after recent changes (Nick Wellnhofer),
|
||||
Fix typos (Jan Pokorný),
|
||||
Regenerate symbols and API docs (Nick Wellnhofer),
|
||||
Regenerate EXSLT website (Nick Wellnhofer)
|
||||
|
||||
- Portability:
|
||||
Remove stubs when compiling without debugger or profiler (Nick Wellnhofer),
|
||||
configure.ac: Invoke PKG_CHECK_MODULES for building shared libraries (Hugh McMaster),
|
||||
configure.ac: Conditionally determine whether xml2-config should pass shared libraries or static libraries (Hugh McMaster),
|
||||
xslt-config.in: Fix broken --prefix=DIR support (Hugh McMaster),
|
||||
libexslt.pc.in: Do not expose private library dependencies unless invoked (Hugh McMaster),
|
||||
libxslt.pc.in: Do not expose private library dependencies unless invoked (Hugh McMaster),
|
||||
Fix -Wformat-overflow warning (GCC 9) (Nick Wellnhofer),
|
||||
Stop including ansidecl.h (Nick Wellnhofer),
|
||||
Remove WIN32_EXTRA_* variables (Nick Wellnhofer),
|
||||
Fix vsnprintf in Python bindings on Windows (Nick Wellnhofer),
|
||||
Build without winsock (Nick Wellnhofer),
|
||||
Stop redefining snprintf on MinGW (Nick Wellnhofer)
|
||||
|
||||
- Bug Fixes:
|
||||
xsl:template without name and match attributes should not be allowed (Nikolai Weibull),
|
||||
Make sure that Python tests exit with error code (Nick Wellnhofer),
|
||||
Improve handling of invalid UTF-8 in format-number (Nick Wellnhofer),
|
||||
Fix dangling pointer in xsltCopyText (Nick Wellnhofer),
|
||||
Fix memory leak in pattern compilation error path (Nick Wellnhofer),
|
||||
Fix uninitialized read with UTF-8 grouping chars (Nick Wellnhofer),
|
||||
Fix integer overflow in FORMAT_GYEAR (Nick Wellnhofer),
|
||||
Fix performance regression with xsl:number (Nick Wellnhofer),
|
||||
Backup XPath context node in xsltInitCtxtKey (Nick Wellnhofer),
|
||||
Fix unsigned integer overflow in date.c (Nick Wellnhofer),
|
||||
Fix insertion of xsl:fallback content (Nick Wellnhofer),
|
||||
Avoid quadratic behavior in xsltSaveResultTo (Nick Wellnhofer),
|
||||
Fix numbering in non-Latin scripts (Nick Wellnhofer),
|
||||
Fix uninitialized read of xsl:number token (Nick Wellnhofer),
|
||||
Fix integer overflow in _exsltDateDayInWeek (Nick Wellnhofer),
|
||||
Rework xsltAttrVT allocation (Nick Wellnhofer),
|
||||
Fix check of xsltTestCompMatch return value (Nick Wellnhofer),
|
||||
Fix security framework bypass (Nick Wellnhofer),
|
||||
Use xmlNewTextChild in EXSLT dyn:map (Nick Wellnhofer),
|
||||
Fix float casts in exsltDateDuration (Nick Wellnhofer),
|
||||
Always set context node before calling XPath iterators (Nick Wellnhofer),
|
||||
Fix attribute precedence with xsl:use-attribute-sets (Nick Wellnhofer),
|
||||
Backup context node in exsltFuncFunctionFunction (Nick Wellnhofer),
|
||||
Initialize ctxt->output before evaluating global vars (Nick Wellnhofer),
|
||||
Fix memory leak in EXSLT functions error path (Nick Wellnhofer)
|
||||
|
||||
- Improvements:
|
||||
Enable continuous integration via GitLab CI (Nick Wellnhofer),
|
||||
Fix -Wimplicit-fallthrough warnings (Nick Wellnhofer),
|
||||
Adjust number of API index pages (Nick Wellnhofer),
|
||||
Make xsltCompileRelativePathPattern non-recursive (Nick Wellnhofer),
|
||||
Check that crypto:rc4_decrypt produces valid UTF-8 (Nick Wellnhofer),
|
||||
Avoid recursion in keys.c:skipPredicate (Nick Wellnhofer),
|
||||
xslt-config.in: Simply handling of $all_flags (Hugh McMaster),
|
||||
xslt-config.in: Add a --dynamic option to --libs (Hugh McMaster),
|
||||
xslt-config.in: Simplify basic library handling (Hugh McMaster),
|
||||
xslt-config.in: Remove unused variable (Hugh McMaster),
|
||||
xslt-config: Simply handling of --cflags (Hugh McMaster),
|
||||
Add Travis test with MemorySanitizer (Nick Wellnhofer),
|
||||
Run Travis ASan tests under Xenial (Nick Wellnhofer),
|
||||
Improve fuzzers (Nick Wellnhofer),
|
||||
Always reuse XPath context (Nick Wellnhofer),
|
||||
Compile with -Wextra (Nick Wellnhofer),
|
||||
Make profiler support optional (Nick Wellnhofer),
|
||||
Hide unused code when compiling without debugger (Nick Wellnhofer),
|
||||
Reorganize fuzzing code (Nick Wellnhofer),
|
||||
Simplify .gitignore (Nick Wellnhofer),
|
||||
Optional operation limit (Nick Wellnhofer),
|
||||
Improve seed corpus and dictionary (Nick Wellnhofer),
|
||||
Reuse XPath context when compiling stylesheets (Nick Wellnhofer),
|
||||
Reuse XPath context in dyn:map (Nick Wellnhofer),
|
||||
Reuse XPath context in saxon:expression (Nick Wellnhofer),
|
||||
Add libFuzzer targets (Nick Wellnhofer),
|
||||
Adjust error message in expected test output (Nick Wellnhofer),
|
||||
Change bug tracker URL (Nick Wellnhofer),
|
||||
Change git repo URL (Nick Wellnhofer),
|
||||
Regenerate NEWS (Nick Wellnhofer),
|
||||
Fix misleading indentation in security.c (Nick Wellnhofer)
|
||||
|
||||
- Cleanups:
|
||||
Candidate release 1 of libxslt 1.1.34 * doc/xsltproc.xml: moved to new place for docbook stylesheet and work around a missing / inrewrite of docbook xsl catalog in Fedora 30 * tests/fuzz/Makefile.am: add fuzz.h to sources * python/Makefile.am: there is no more TODO * libxslt.spec.in: run make tests instead of check to avoid fuzz in that environment, and drop python TODO (Daniel Veillard),
|
||||
Remove empty TODO file (Nick Wellnhofer),
|
||||
Remove generated file libxsltclass.txt from version control (Nick Wellnhofer),
|
||||
Rebuild docs (Nick Wellnhofer)
|
||||
|
||||
|
||||
|
||||
v1.1.33: Jan 03 2019:
|
||||
- Portability:
|
||||
Variables need 'extern' in static lib on Cygwin (Nick Wellnhofer),
|
||||
|
|
4
dll/3rdparty/libxslt/README
vendored
4
dll/3rdparty/libxslt/README
vendored
|
@ -2,12 +2,12 @@
|
|||
XSLT support for libxml2 (XML toolkit from the GNOME project)
|
||||
|
||||
Full documentation is available on-line at
|
||||
http://xmlsoft.org/XSLT/
|
||||
https://gitlab.gnome.org/GNOME/libxslt/-/wikis
|
||||
|
||||
This code is released under the MIT Licence see the Copyright file.
|
||||
|
||||
To report bugs, follow the instructions at:
|
||||
http://xmlsoft.org/XSLT/bugs.html
|
||||
https://gitlab.gnome.org/GNOME/libxslt/-/issues
|
||||
|
||||
A mailing-list xslt@gnome.org is available, to subscribe:
|
||||
http://mail.gnome.org/mailman/listinfo/xslt
|
||||
|
|
6
dll/3rdparty/libxslt/extensions.c
vendored
6
dll/3rdparty/libxslt/extensions.c
vendored
|
@ -1951,12 +1951,6 @@ xsltGetExtInfo(xsltStylesheetPtr style, const xmlChar * URI)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* *
|
||||
* Test module http://xmlsoft.org/XSLT/ *
|
||||
* *
|
||||
************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* *
|
||||
* Test of the extension module API *
|
||||
|
|
14
dll/3rdparty/libxslt/functions.c
vendored
14
dll/3rdparty/libxslt/functions.c
vendored
|
@ -150,10 +150,22 @@ xsltDocumentFunctionLoadDocument(xmlXPathParserContextPtr ctxt, xmlChar* URI)
|
|||
goto out_fragment;
|
||||
}
|
||||
|
||||
#if LIBXML_VERSION >= 20911 || \
|
||||
defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
|
||||
xptrctxt->opLimit = ctxt->context->opLimit;
|
||||
xptrctxt->opCount = ctxt->context->opCount;
|
||||
xptrctxt->depth = ctxt->context->depth;
|
||||
|
||||
resObj = xmlXPtrEval(fragment, xptrctxt);
|
||||
|
||||
ctxt->context->opCount = xptrctxt->opCount;
|
||||
#else
|
||||
resObj = xmlXPtrEval(fragment, xptrctxt);
|
||||
xmlXPathFreeContext(xptrctxt);
|
||||
#endif
|
||||
|
||||
xmlXPathFreeContext(xptrctxt);
|
||||
#endif /* LIBXML_XPTR_ENABLED */
|
||||
|
||||
if (resObj == NULL)
|
||||
goto out_fragment;
|
||||
|
||||
|
|
2
dll/3rdparty/libxslt/libxslt.3
vendored
2
dll/3rdparty/libxslt/libxslt.3
vendored
|
@ -21,7 +21,7 @@ binary application to do XSL transformations on the command line
|
|||
.SH AUTHORS
|
||||
Daniel Veillard (daniel@veillard.com).
|
||||
If you download and install this package look at instructions on the
|
||||
Web site http://xmlsoft.org/XSLT/ .
|
||||
Web site https://gitlab.gnome.org/GNOME/libxslt .
|
||||
Manual page by Heiko W. Rupp (hwr@pilhuhn.de)
|
||||
.SH SEE ALSO
|
||||
.IR libexslt (3),
|
||||
|
|
4
dll/3rdparty/libxslt/numbers.c
vendored
4
dll/3rdparty/libxslt/numbers.c
vendored
|
@ -160,7 +160,7 @@ xsltNumberFormatDecimal(xmlBufferPtr buffer,
|
|||
i = -1;
|
||||
break;
|
||||
}
|
||||
*(--pointer) = val;
|
||||
*(--pointer) = (xmlChar)val;
|
||||
}
|
||||
else {
|
||||
/*
|
||||
|
@ -943,7 +943,7 @@ xsltFormatNumberConversion(xsltDecimalFormatPtr self,
|
|||
xmlChar *nprefix, *nsuffix = NULL;
|
||||
int prefix_length, suffix_length = 0, nprefix_length, nsuffix_length;
|
||||
double scale;
|
||||
int j, len;
|
||||
int j, len = 0;
|
||||
int self_grouping_len;
|
||||
xsltFormatNumberInfo format_info;
|
||||
/*
|
||||
|
|
464
dll/3rdparty/libxslt/pattern.c
vendored
464
dll/3rdparty/libxslt/pattern.c
vendored
|
@ -433,14 +433,11 @@ xsltReverseCompMatch(xsltParserContextPtr ctxt, xsltCompMatchPtr comp) {
|
|||
xsltCompMatchAdd(ctxt, comp, XSLT_OP_END, NULL, NULL, 0);
|
||||
|
||||
/*
|
||||
* Detect consecutive XSLT_OP_PREDICATE and predicates on ops which
|
||||
* haven't been optimized yet indicating a direct matching should be done.
|
||||
* Detect consecutive XSLT_OP_PREDICATE indicating a direct matching
|
||||
* should be done.
|
||||
*/
|
||||
for (i = 0;i < comp->nbStep - 1;i++) {
|
||||
xsltOp op = comp->steps[i].op;
|
||||
|
||||
if ((op != XSLT_OP_ELEM) &&
|
||||
(op != XSLT_OP_ALL) &&
|
||||
if ((comp->steps[i].op == XSLT_OP_PREDICATE) &&
|
||||
(comp->steps[i + 1].op == XSLT_OP_PREDICATE)) {
|
||||
|
||||
comp->direct = 1;
|
||||
|
@ -610,6 +607,152 @@ xsltTestCompMatchDirect(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
|||
return(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* xsltTestStepMatch:
|
||||
* @ctxt: a XSLT process context
|
||||
* @node: a node
|
||||
* @step: the step
|
||||
*
|
||||
* Test whether the node matches the step.
|
||||
*
|
||||
* Returns 1 if it matches, 0 if it doesn't and -1 in case of failure
|
||||
*/
|
||||
static int
|
||||
xsltTestStepMatch(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||
xsltStepOpPtr step) {
|
||||
switch (step->op) {
|
||||
case XSLT_OP_ROOT:
|
||||
if ((node->type == XML_DOCUMENT_NODE) ||
|
||||
#ifdef LIBXML_DOCB_ENABLED
|
||||
(node->type == XML_DOCB_DOCUMENT_NODE) ||
|
||||
#endif
|
||||
(node->type == XML_HTML_DOCUMENT_NODE))
|
||||
return(1);
|
||||
if ((node->type == XML_ELEMENT_NODE) && (node->name[0] == ' '))
|
||||
return(1);
|
||||
return(0);
|
||||
case XSLT_OP_ELEM:
|
||||
if (node->type != XML_ELEMENT_NODE)
|
||||
return(0);
|
||||
if (step->value == NULL)
|
||||
return(1);
|
||||
if (step->value[0] != node->name[0])
|
||||
return(0);
|
||||
if (!xmlStrEqual(step->value, node->name))
|
||||
return(0);
|
||||
|
||||
/* Namespace test */
|
||||
if (node->ns == NULL) {
|
||||
if (step->value2 != NULL)
|
||||
return(0);
|
||||
} else if (node->ns->href != NULL) {
|
||||
if (step->value2 == NULL)
|
||||
return(0);
|
||||
if (!xmlStrEqual(step->value2, node->ns->href))
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
case XSLT_OP_ATTR:
|
||||
if (node->type != XML_ATTRIBUTE_NODE)
|
||||
return(0);
|
||||
if (step->value != NULL) {
|
||||
if (step->value[0] != node->name[0])
|
||||
return(0);
|
||||
if (!xmlStrEqual(step->value, node->name))
|
||||
return(0);
|
||||
}
|
||||
/* Namespace test */
|
||||
if (node->ns == NULL) {
|
||||
if (step->value2 != NULL)
|
||||
return(0);
|
||||
} else if (step->value2 != NULL) {
|
||||
if (!xmlStrEqual(step->value2, node->ns->href))
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
case XSLT_OP_ID: {
|
||||
/* TODO Handle IDs decently, must be done differently */
|
||||
xmlAttrPtr id;
|
||||
|
||||
if (node->type != XML_ELEMENT_NODE)
|
||||
return(0);
|
||||
|
||||
id = xmlGetID(node->doc, step->value);
|
||||
if ((id == NULL) || (id->parent != node))
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
case XSLT_OP_KEY: {
|
||||
xmlNodeSetPtr list;
|
||||
int indx;
|
||||
|
||||
list = xsltGetKey(ctxt, step->value,
|
||||
step->value3, step->value2);
|
||||
if (list == NULL)
|
||||
return(0);
|
||||
for (indx = 0;indx < list->nodeNr;indx++)
|
||||
if (list->nodeTab[indx] == node)
|
||||
break;
|
||||
if (indx >= list->nodeNr)
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
case XSLT_OP_NS:
|
||||
if (node->type != XML_ELEMENT_NODE)
|
||||
return(0);
|
||||
if (node->ns == NULL) {
|
||||
if (step->value != NULL)
|
||||
return(0);
|
||||
} else if (node->ns->href != NULL) {
|
||||
if (step->value == NULL)
|
||||
return(0);
|
||||
if (!xmlStrEqual(step->value, node->ns->href))
|
||||
return(0);
|
||||
}
|
||||
break;
|
||||
case XSLT_OP_ALL:
|
||||
if (node->type != XML_ELEMENT_NODE)
|
||||
return(0);
|
||||
break;
|
||||
case XSLT_OP_PI:
|
||||
if (node->type != XML_PI_NODE)
|
||||
return(0);
|
||||
if (step->value != NULL) {
|
||||
if (!xmlStrEqual(step->value, node->name))
|
||||
return(0);
|
||||
}
|
||||
break;
|
||||
case XSLT_OP_COMMENT:
|
||||
if (node->type != XML_COMMENT_NODE)
|
||||
return(0);
|
||||
break;
|
||||
case XSLT_OP_TEXT:
|
||||
if ((node->type != XML_TEXT_NODE) &&
|
||||
(node->type != XML_CDATA_SECTION_NODE))
|
||||
return(0);
|
||||
break;
|
||||
case XSLT_OP_NODE:
|
||||
switch (node->type) {
|
||||
case XML_ELEMENT_NODE:
|
||||
case XML_CDATA_SECTION_NODE:
|
||||
case XML_PI_NODE:
|
||||
case XML_COMMENT_NODE:
|
||||
case XML_TEXT_NODE:
|
||||
break;
|
||||
default:
|
||||
return(0);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
xsltTransformError(ctxt, NULL, node,
|
||||
"xsltTestStepMatch: unexpected step op %d\n",
|
||||
step->op);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* xsltTestPredicateMatch:
|
||||
* @ctxt: a XSLT process context
|
||||
|
@ -637,6 +780,8 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
|||
return(0);
|
||||
if (step->comp == NULL)
|
||||
return(0);
|
||||
if (sel == NULL)
|
||||
return(0);
|
||||
|
||||
doc = node->doc;
|
||||
if (XSLT_IS_RES_TREE_FRAG(doc))
|
||||
|
@ -647,16 +792,16 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
|||
/*
|
||||
* Recompute contextSize and proximityPosition.
|
||||
*
|
||||
* TODO: Make this work for additional ops. Currently, only XSLT_OP_ELEM
|
||||
* and XSLT_OP_ALL are supported.
|
||||
* This could be improved in the following ways:
|
||||
*
|
||||
* - Skip recomputation if predicates don't use position() or last()
|
||||
* - Keep data for multiple parents. This would require a hash table
|
||||
* or an unused member in xmlNode.
|
||||
* - Store node test results in a bitmap to avoid computing them twice.
|
||||
*/
|
||||
oldCS = ctxt->xpathCtxt->contextSize;
|
||||
oldCP = ctxt->xpathCtxt->proximityPosition;
|
||||
if ((sel != NULL) &&
|
||||
(sel->op == XSLT_OP_ELEM) &&
|
||||
(sel->value != NULL) &&
|
||||
(node->type == XML_ELEMENT_NODE) &&
|
||||
(node->parent != NULL)) {
|
||||
{
|
||||
xmlNodePtr previous;
|
||||
int nocache = 0;
|
||||
|
||||
|
@ -673,17 +818,8 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
|||
while (sibling != NULL) {
|
||||
if (sibling == previous)
|
||||
break;
|
||||
if ((sibling->type == XML_ELEMENT_NODE) &&
|
||||
(previous->name != NULL) &&
|
||||
(sibling->name != NULL) &&
|
||||
(previous->name[0] == sibling->name[0]) &&
|
||||
(xmlStrEqual(previous->name, sibling->name)))
|
||||
{
|
||||
if ((sel->value2 == NULL) ||
|
||||
((sibling->ns != NULL) &&
|
||||
(xmlStrEqual(sel->value2, sibling->ns->href))))
|
||||
indx++;
|
||||
}
|
||||
if (xsltTestStepMatch(ctxt, sibling, sel))
|
||||
indx++;
|
||||
sibling = sibling->prev;
|
||||
}
|
||||
if (sibling == NULL) {
|
||||
|
@ -693,20 +829,8 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
|||
while (sibling != NULL) {
|
||||
if (sibling == previous)
|
||||
break;
|
||||
if ((sibling->type == XML_ELEMENT_NODE) &&
|
||||
(previous->name != NULL) &&
|
||||
(sibling->name != NULL) &&
|
||||
(previous->name[0] == sibling->name[0]) &&
|
||||
(xmlStrEqual(previous->name, sibling->name)))
|
||||
{
|
||||
if ((sel->value2 == NULL) ||
|
||||
((sibling->ns != NULL) &&
|
||||
(xmlStrEqual(sel->value2,
|
||||
sibling->ns->href))))
|
||||
{
|
||||
indx--;
|
||||
}
|
||||
}
|
||||
if (xsltTestStepMatch(ctxt, sibling, sel))
|
||||
indx--;
|
||||
sibling = sibling->next;
|
||||
}
|
||||
}
|
||||
|
@ -737,19 +861,11 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
|||
if (parent) siblings = parent->children;
|
||||
|
||||
while (siblings != NULL) {
|
||||
if (siblings->type == XML_ELEMENT_NODE) {
|
||||
if (siblings == node) {
|
||||
len++;
|
||||
pos = len;
|
||||
} else if ((node->name != NULL) &&
|
||||
(siblings->name != NULL) &&
|
||||
(node->name[0] == siblings->name[0]) &&
|
||||
(xmlStrEqual(node->name, siblings->name))) {
|
||||
if ((sel->value2 == NULL) ||
|
||||
((siblings->ns != NULL) &&
|
||||
(xmlStrEqual(sel->value2, siblings->ns->href))))
|
||||
len++;
|
||||
}
|
||||
if (siblings == node) {
|
||||
len++;
|
||||
pos = len;
|
||||
} else if (xsltTestStepMatch(ctxt, siblings, sel)) {
|
||||
len++;
|
||||
}
|
||||
siblings = siblings->next;
|
||||
}
|
||||
|
@ -778,96 +894,6 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
|||
XSLT_RUNTIME_EXTRA(ctxt, sel->lenExtra, ival) = len;
|
||||
}
|
||||
}
|
||||
} else if ((sel != NULL) && (sel->op == XSLT_OP_ALL) &&
|
||||
(node->type == XML_ELEMENT_NODE)) {
|
||||
xmlNodePtr previous;
|
||||
int nocache = 0;
|
||||
|
||||
previous = (xmlNodePtr)
|
||||
XSLT_RUNTIME_EXTRA(ctxt, sel->previousExtra, ptr);
|
||||
if ((previous != NULL) &&
|
||||
(previous->parent == node->parent)) {
|
||||
/*
|
||||
* just walk back to adjust the index
|
||||
*/
|
||||
int indx = 0;
|
||||
xmlNodePtr sibling = node;
|
||||
|
||||
while (sibling != NULL) {
|
||||
if (sibling == previous)
|
||||
break;
|
||||
if (sibling->type == XML_ELEMENT_NODE)
|
||||
indx++;
|
||||
sibling = sibling->prev;
|
||||
}
|
||||
if (sibling == NULL) {
|
||||
/* hum going backward in document order ... */
|
||||
indx = 0;
|
||||
sibling = node;
|
||||
while (sibling != NULL) {
|
||||
if (sibling == previous)
|
||||
break;
|
||||
if (sibling->type == XML_ELEMENT_NODE)
|
||||
indx--;
|
||||
sibling = sibling->next;
|
||||
}
|
||||
}
|
||||
if (sibling != NULL) {
|
||||
pos = XSLT_RUNTIME_EXTRA(ctxt,
|
||||
sel->indexExtra, ival) + indx;
|
||||
/*
|
||||
* If the node is in a Value Tree we cannot
|
||||
* cache it !
|
||||
*/
|
||||
if ((node->doc != NULL) && !isRVT) {
|
||||
len = XSLT_RUNTIME_EXTRA(ctxt, sel->lenExtra, ival);
|
||||
XSLT_RUNTIME_EXTRA(ctxt, sel->previousExtra, ptr) = node;
|
||||
XSLT_RUNTIME_EXTRA(ctxt, sel->indexExtra, ival) = pos;
|
||||
}
|
||||
} else
|
||||
pos = 0;
|
||||
} else {
|
||||
/*
|
||||
* recompute the index
|
||||
*/
|
||||
xmlNodePtr parent = node->parent;
|
||||
xmlNodePtr siblings = NULL;
|
||||
|
||||
if (parent) siblings = parent->children;
|
||||
|
||||
while (siblings != NULL) {
|
||||
if (siblings->type == XML_ELEMENT_NODE) {
|
||||
len++;
|
||||
if (siblings == node) {
|
||||
pos = len;
|
||||
}
|
||||
}
|
||||
siblings = siblings->next;
|
||||
}
|
||||
if ((parent == NULL) || (node->doc == NULL))
|
||||
nocache = 1;
|
||||
else {
|
||||
while (parent->parent != NULL)
|
||||
parent = parent->parent;
|
||||
if (((parent->type != XML_DOCUMENT_NODE) &&
|
||||
(parent->type != XML_HTML_DOCUMENT_NODE)) ||
|
||||
(parent != (xmlNodePtr) node->doc))
|
||||
nocache = 1;
|
||||
}
|
||||
}
|
||||
if (pos != 0) {
|
||||
ctxt->xpathCtxt->contextSize = len;
|
||||
ctxt->xpathCtxt->proximityPosition = pos;
|
||||
/*
|
||||
* If the node is in a Value Tree we cannot
|
||||
* cache it !
|
||||
*/
|
||||
if ((node->doc != NULL) && (nocache == 0) && !isRVT) {
|
||||
XSLT_RUNTIME_EXTRA(ctxt, sel->previousExtra, ptr) = node;
|
||||
XSLT_RUNTIME_EXTRA(ctxt, sel->indexExtra, ival) = pos;
|
||||
XSLT_RUNTIME_EXTRA(ctxt, sel->lenExtra, ival) = len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
oldNode = ctxt->node;
|
||||
|
@ -950,55 +976,6 @@ restart:
|
|||
switch (step->op) {
|
||||
case XSLT_OP_END:
|
||||
goto found;
|
||||
case XSLT_OP_ROOT:
|
||||
if ((node->type == XML_DOCUMENT_NODE) ||
|
||||
#ifdef LIBXML_DOCB_ENABLED
|
||||
(node->type == XML_DOCB_DOCUMENT_NODE) ||
|
||||
#endif
|
||||
(node->type == XML_HTML_DOCUMENT_NODE))
|
||||
continue;
|
||||
if ((node->type == XML_ELEMENT_NODE) && (node->name[0] == ' '))
|
||||
continue;
|
||||
goto rollback;
|
||||
case XSLT_OP_ELEM:
|
||||
if (node->type != XML_ELEMENT_NODE)
|
||||
goto rollback;
|
||||
if (step->value == NULL)
|
||||
continue;
|
||||
if (step->value[0] != node->name[0])
|
||||
goto rollback;
|
||||
if (!xmlStrEqual(step->value, node->name))
|
||||
goto rollback;
|
||||
|
||||
/* Namespace test */
|
||||
if (node->ns == NULL) {
|
||||
if (step->value2 != NULL)
|
||||
goto rollback;
|
||||
} else if (node->ns->href != NULL) {
|
||||
if (step->value2 == NULL)
|
||||
goto rollback;
|
||||
if (!xmlStrEqual(step->value2, node->ns->href))
|
||||
goto rollback;
|
||||
}
|
||||
continue;
|
||||
case XSLT_OP_ATTR:
|
||||
if (node->type != XML_ATTRIBUTE_NODE)
|
||||
goto rollback;
|
||||
if (step->value != NULL) {
|
||||
if (step->value[0] != node->name[0])
|
||||
goto rollback;
|
||||
if (!xmlStrEqual(step->value, node->name))
|
||||
goto rollback;
|
||||
}
|
||||
/* Namespace test */
|
||||
if (node->ns == NULL) {
|
||||
if (step->value2 != NULL)
|
||||
goto rollback;
|
||||
} else if (step->value2 != NULL) {
|
||||
if (!xmlStrEqual(step->value2, node->ns->href))
|
||||
goto rollback;
|
||||
}
|
||||
continue;
|
||||
case XSLT_OP_PARENT:
|
||||
if ((node->type == XML_DOCUMENT_NODE) ||
|
||||
(node->type == XML_HTML_DOCUMENT_NODE) ||
|
||||
|
@ -1056,6 +1033,7 @@ restart:
|
|||
continue;
|
||||
}
|
||||
i++;
|
||||
sel = step;
|
||||
if (step->value == NULL) {
|
||||
xsltPatPushState(ctxt, &states, i - 1, node);
|
||||
continue;
|
||||
|
@ -1080,50 +1058,6 @@ restart:
|
|||
goto rollback;
|
||||
xsltPatPushState(ctxt, &states, i - 1, node);
|
||||
continue;
|
||||
case XSLT_OP_ID: {
|
||||
/* TODO Handle IDs decently, must be done differently */
|
||||
xmlAttrPtr id;
|
||||
|
||||
if (node->type != XML_ELEMENT_NODE)
|
||||
goto rollback;
|
||||
|
||||
id = xmlGetID(node->doc, step->value);
|
||||
if ((id == NULL) || (id->parent != node))
|
||||
goto rollback;
|
||||
break;
|
||||
}
|
||||
case XSLT_OP_KEY: {
|
||||
xmlNodeSetPtr list;
|
||||
int indx;
|
||||
|
||||
list = xsltGetKey(ctxt, step->value,
|
||||
step->value3, step->value2);
|
||||
if (list == NULL)
|
||||
goto rollback;
|
||||
for (indx = 0;indx < list->nodeNr;indx++)
|
||||
if (list->nodeTab[indx] == node)
|
||||
break;
|
||||
if (indx >= list->nodeNr)
|
||||
goto rollback;
|
||||
break;
|
||||
}
|
||||
case XSLT_OP_NS:
|
||||
if (node->type != XML_ELEMENT_NODE)
|
||||
goto rollback;
|
||||
if (node->ns == NULL) {
|
||||
if (step->value != NULL)
|
||||
goto rollback;
|
||||
} else if (node->ns->href != NULL) {
|
||||
if (step->value == NULL)
|
||||
goto rollback;
|
||||
if (!xmlStrEqual(step->value, node->ns->href))
|
||||
goto rollback;
|
||||
}
|
||||
break;
|
||||
case XSLT_OP_ALL:
|
||||
if (node->type != XML_ELEMENT_NODE)
|
||||
goto rollback;
|
||||
break;
|
||||
case XSLT_OP_PREDICATE: {
|
||||
/*
|
||||
* When there is cascading XSLT_OP_PREDICATE or a predicate
|
||||
|
@ -1143,34 +1077,9 @@ restart:
|
|||
|
||||
break;
|
||||
}
|
||||
case XSLT_OP_PI:
|
||||
if (node->type != XML_PI_NODE)
|
||||
goto rollback;
|
||||
if (step->value != NULL) {
|
||||
if (!xmlStrEqual(step->value, node->name))
|
||||
goto rollback;
|
||||
}
|
||||
break;
|
||||
case XSLT_OP_COMMENT:
|
||||
if (node->type != XML_COMMENT_NODE)
|
||||
goto rollback;
|
||||
break;
|
||||
case XSLT_OP_TEXT:
|
||||
if ((node->type != XML_TEXT_NODE) &&
|
||||
(node->type != XML_CDATA_SECTION_NODE))
|
||||
goto rollback;
|
||||
break;
|
||||
case XSLT_OP_NODE:
|
||||
switch (node->type) {
|
||||
case XML_ELEMENT_NODE:
|
||||
case XML_CDATA_SECTION_NODE:
|
||||
case XML_PI_NODE:
|
||||
case XML_COMMENT_NODE:
|
||||
case XML_TEXT_NODE:
|
||||
break;
|
||||
default:
|
||||
goto rollback;
|
||||
}
|
||||
default:
|
||||
if (xsltTestStepMatch(ctxt, node, step) != 1)
|
||||
goto rollback;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1420,6 +1329,7 @@ xsltCompileIdKeyPattern(xsltParserContextPtr ctxt, xmlChar *name,
|
|||
if (ctxt->error) {
|
||||
xsltTransformError(NULL, NULL, NULL,
|
||||
"xsltCompileIdKeyPattern : Literal expected\n");
|
||||
xmlFree(lit);
|
||||
return;
|
||||
}
|
||||
SKIP_BLANKS;
|
||||
|
@ -1446,6 +1356,7 @@ xsltCompileIdKeyPattern(xsltParserContextPtr ctxt, xmlChar *name,
|
|||
if (ctxt->error) {
|
||||
xsltTransformError(NULL, NULL, NULL,
|
||||
"xsltCompileIdKeyPattern : Literal expected\n");
|
||||
xmlFree(lit);
|
||||
return;
|
||||
}
|
||||
SKIP_BLANKS;
|
||||
|
@ -1487,6 +1398,7 @@ xsltCompileIdKeyPattern(xsltParserContextPtr ctxt, xmlChar *name,
|
|||
if (ctxt->error) {
|
||||
xsltTransformError(NULL, NULL, NULL,
|
||||
"xsltCompileIdKeyPattern : Literal expected\n");
|
||||
xmlFree(lit);
|
||||
return;
|
||||
}
|
||||
SKIP_BLANKS;
|
||||
|
@ -2108,13 +2020,16 @@ xsltAddTemplate(xsltStylesheetPtr style, xsltTemplatePtr cur,
|
|||
* 'top' will point to style->xxxMatch ptr - declaring as 'void'
|
||||
* avoids gcc 'type-punned pointer' warning.
|
||||
*/
|
||||
void **top = NULL;
|
||||
xsltCompMatchPtr *top = NULL;
|
||||
const xmlChar *name = NULL;
|
||||
float priority; /* the priority */
|
||||
|
||||
if ((style == NULL) || (cur == NULL))
|
||||
return(-1);
|
||||
|
||||
if (cur->next != NULL)
|
||||
cur->position = cur->next->position + 1;
|
||||
|
||||
/* Register named template */
|
||||
if (cur->name != NULL) {
|
||||
if (style->namedTemplates == NULL) {
|
||||
|
@ -2476,7 +2391,10 @@ xsltGetTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||
break;
|
||||
}
|
||||
while ((list != NULL) &&
|
||||
((ret == NULL) || (list->priority > priority))) {
|
||||
((ret == NULL) ||
|
||||
(list->priority > priority) ||
|
||||
((list->priority == priority) &&
|
||||
(list->template->position > ret->position)))) {
|
||||
if (xsltTestCompMatch(ctxt, list, node,
|
||||
ctxt->mode, ctxt->modeURI) == 1) {
|
||||
ret = list->template;
|
||||
|
@ -2493,7 +2411,10 @@ xsltGetTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||
(node->type == XML_TEXT_NODE)) {
|
||||
list = curstyle->elemMatch;
|
||||
while ((list != NULL) &&
|
||||
((ret == NULL) || (list->priority > priority))) {
|
||||
((ret == NULL) ||
|
||||
(list->priority > priority) ||
|
||||
((list->priority == priority) &&
|
||||
(list->template->position > ret->position)))) {
|
||||
if (xsltTestCompMatch(ctxt, list, node,
|
||||
ctxt->mode, ctxt->modeURI) == 1) {
|
||||
ret = list->template;
|
||||
|
@ -2506,7 +2427,10 @@ xsltGetTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||
(node->type == XML_COMMENT_NODE)) {
|
||||
list = curstyle->elemMatch;
|
||||
while ((list != NULL) &&
|
||||
((ret == NULL) || (list->priority > priority))) {
|
||||
((ret == NULL) ||
|
||||
(list->priority > priority) ||
|
||||
((list->priority == priority) &&
|
||||
(list->template->position > ret->position)))) {
|
||||
if (xsltTestCompMatch(ctxt, list, node,
|
||||
ctxt->mode, ctxt->modeURI) == 1) {
|
||||
ret = list->template;
|
||||
|
@ -2521,7 +2445,10 @@ keyed_match:
|
|||
if (keyed) {
|
||||
list = curstyle->keyMatch;
|
||||
while ((list != NULL) &&
|
||||
((ret == NULL) || (list->priority > priority))) {
|
||||
((ret == NULL) ||
|
||||
(list->priority > priority) ||
|
||||
((list->priority == priority) &&
|
||||
(list->template->position > ret->position)))) {
|
||||
if (xsltTestCompMatch(ctxt, list, node,
|
||||
ctxt->mode, ctxt->modeURI) == 1) {
|
||||
ret = list->template;
|
||||
|
@ -2599,8 +2526,7 @@ xsltCleanupTemplates(xsltStylesheetPtr style ATTRIBUTE_UNUSED) {
|
|||
void
|
||||
xsltFreeTemplateHashes(xsltStylesheetPtr style) {
|
||||
if (style->templatesHash != NULL)
|
||||
xmlHashFree((xmlHashTablePtr) style->templatesHash,
|
||||
xsltFreeCompMatchListEntry);
|
||||
xmlHashFree(style->templatesHash, xsltFreeCompMatchListEntry);
|
||||
if (style->rootMatch != NULL)
|
||||
xsltFreeCompMatchList(style->rootMatch);
|
||||
if (style->keyMatch != NULL)
|
||||
|
|
2
dll/3rdparty/libxslt/preproc.c
vendored
2
dll/3rdparty/libxslt/preproc.c
vendored
|
@ -1470,6 +1470,8 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) {
|
|||
comp->numdata.groupingCharacterLen = xmlStrlen(prop);
|
||||
comp->numdata.groupingCharacter =
|
||||
xsltGetUTF8Char(prop, &(comp->numdata.groupingCharacterLen));
|
||||
if (comp->numdata.groupingCharacter < 0)
|
||||
comp->numdata.groupingCharacter = 0;
|
||||
}
|
||||
|
||||
prop = xsltGetCNsProp(style, cur, (const xmlChar *)"grouping-size", XSLT_NAMESPACE);
|
||||
|
|
2
dll/3rdparty/libxslt/preproc.h
vendored
2
dll/3rdparty/libxslt/preproc.h
vendored
|
@ -22,7 +22,7 @@ extern "C" {
|
|||
/*
|
||||
* Interfaces
|
||||
*/
|
||||
extern const xmlChar *xsltExtMarker;
|
||||
XSLTPUBVAR const xmlChar *xsltExtMarker;
|
||||
|
||||
XSLTPUBFUN xsltElemPreCompPtr XSLTCALL
|
||||
xsltDocumentComp (xsltStylesheetPtr style,
|
||||
|
|
2
dll/3rdparty/libxslt/security.c
vendored
2
dll/3rdparty/libxslt/security.c
vendored
|
@ -249,7 +249,7 @@ xsltCheckFilename (const char *path)
|
|||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
DWORD dwAttrs;
|
||||
|
||||
dwAttrs = GetFileAttributes(path);
|
||||
dwAttrs = GetFileAttributesA(path);
|
||||
if (dwAttrs != INVALID_FILE_ATTRIBUTES) {
|
||||
if (dwAttrs & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
return 2;
|
||||
|
|
8
dll/3rdparty/libxslt/templates.c
vendored
8
dll/3rdparty/libxslt/templates.c
vendored
|
@ -192,6 +192,8 @@ xsltEvalTemplateString(xsltTransformContextPtr ctxt,
|
|||
{
|
||||
xmlNodePtr oldInsert, insert = NULL;
|
||||
xmlChar *ret;
|
||||
const xmlChar *oldLastText;
|
||||
int oldLastTextSize, oldLastTextUse;
|
||||
|
||||
if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL) ||
|
||||
(inst->type != XML_ELEMENT_NODE))
|
||||
|
@ -215,12 +217,18 @@ xsltEvalTemplateString(xsltTransformContextPtr ctxt,
|
|||
}
|
||||
oldInsert = ctxt->insert;
|
||||
ctxt->insert = insert;
|
||||
oldLastText = ctxt->lasttext;
|
||||
oldLastTextSize = ctxt->lasttsize;
|
||||
oldLastTextUse = ctxt->lasttuse;
|
||||
/*
|
||||
* OPTIMIZE TODO: if inst->children consists only of text-nodes.
|
||||
*/
|
||||
xsltApplyOneTemplate(ctxt, contextNode, inst->children, NULL, NULL);
|
||||
|
||||
ctxt->insert = oldInsert;
|
||||
ctxt->lasttext = oldLastText;
|
||||
ctxt->lasttsize = oldLastTextSize;
|
||||
ctxt->lasttuse = oldLastTextUse;
|
||||
|
||||
ret = xmlNodeGetContent(insert);
|
||||
if (insert != NULL)
|
||||
|
|
124
dll/3rdparty/libxslt/transform.c
vendored
124
dll/3rdparty/libxslt/transform.c
vendored
|
@ -1860,7 +1860,7 @@ static void
|
|||
xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||
xsltStackElemPtr params) {
|
||||
xmlNodePtr copy;
|
||||
xmlNodePtr delete = NULL, cur;
|
||||
xmlNodePtr cur;
|
||||
int nbchild = 0, oldSize;
|
||||
int childno = 0, oldPos;
|
||||
xsltTemplatePtr template;
|
||||
|
@ -1933,54 +1933,13 @@ xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||
return;
|
||||
}
|
||||
/*
|
||||
* Handling of Elements: first pass, cleanup and counting
|
||||
* Handling of Elements: first pass, counting
|
||||
*/
|
||||
cur = node->children;
|
||||
while (cur != NULL) {
|
||||
switch (cur->type) {
|
||||
case XML_TEXT_NODE:
|
||||
case XML_CDATA_SECTION_NODE:
|
||||
case XML_DOCUMENT_NODE:
|
||||
case XML_HTML_DOCUMENT_NODE:
|
||||
case XML_ELEMENT_NODE:
|
||||
case XML_PI_NODE:
|
||||
case XML_COMMENT_NODE:
|
||||
nbchild++;
|
||||
break;
|
||||
case XML_DTD_NODE:
|
||||
/* Unlink the DTD, it's still reachable using doc->intSubset */
|
||||
if (cur->next != NULL)
|
||||
cur->next->prev = cur->prev;
|
||||
if (cur->prev != NULL)
|
||||
cur->prev->next = cur->next;
|
||||
break;
|
||||
default:
|
||||
#ifdef WITH_XSLT_DEBUG_PROCESS
|
||||
XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext,
|
||||
"xsltDefaultProcessOneNode: skipping node type %d\n",
|
||||
cur->type));
|
||||
#endif
|
||||
delete = cur;
|
||||
}
|
||||
if (IS_XSLT_REAL_NODE(cur))
|
||||
nbchild++;
|
||||
cur = cur->next;
|
||||
if (delete != NULL) {
|
||||
#ifdef WITH_XSLT_DEBUG_PROCESS
|
||||
XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext,
|
||||
"xsltDefaultProcessOneNode: removing ignorable blank node\n"));
|
||||
#endif
|
||||
xmlUnlinkNode(delete);
|
||||
xmlFreeNode(delete);
|
||||
delete = NULL;
|
||||
}
|
||||
}
|
||||
if (delete != NULL) {
|
||||
#ifdef WITH_XSLT_DEBUG_PROCESS
|
||||
XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext,
|
||||
"xsltDefaultProcessOneNode: removing ignorable blank node\n"));
|
||||
#endif
|
||||
xmlUnlinkNode(delete);
|
||||
xmlFreeNode(delete);
|
||||
delete = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3637,8 +3596,10 @@ xsltDocumentElem(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||
if (elements != NULL) {
|
||||
if (style->stripSpaces == NULL)
|
||||
style->stripSpaces = xmlHashCreate(10);
|
||||
if (style->stripSpaces == NULL)
|
||||
if (style->stripSpaces == NULL) {
|
||||
xmlFree(elements);
|
||||
return;
|
||||
}
|
||||
|
||||
element = elements;
|
||||
while (*element != 0) {
|
||||
|
@ -4829,7 +4790,7 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||
xsltStylePreCompPtr comp = (xsltStylePreCompPtr) castedComp;
|
||||
#endif
|
||||
int i;
|
||||
xmlNodePtr cur, delNode = NULL, oldContextNode;
|
||||
xmlNodePtr cur, oldContextNode;
|
||||
xmlNodeSetPtr list = NULL, oldList;
|
||||
xsltStackElemPtr withParams = NULL;
|
||||
int oldXPProximityPosition, oldXPContextSize;
|
||||
|
@ -4963,73 +4924,9 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||
else
|
||||
cur = NULL;
|
||||
while (cur != NULL) {
|
||||
switch (cur->type) {
|
||||
case XML_TEXT_NODE:
|
||||
if ((IS_BLANK_NODE(cur)) &&
|
||||
(cur->parent != NULL) &&
|
||||
(cur->parent->type == XML_ELEMENT_NODE) &&
|
||||
(ctxt->style->stripSpaces != NULL)) {
|
||||
const xmlChar *val;
|
||||
|
||||
if (cur->parent->ns != NULL) {
|
||||
val = (const xmlChar *)
|
||||
xmlHashLookup2(ctxt->style->stripSpaces,
|
||||
cur->parent->name,
|
||||
cur->parent->ns->href);
|
||||
if (val == NULL) {
|
||||
val = (const xmlChar *)
|
||||
xmlHashLookup2(ctxt->style->stripSpaces,
|
||||
BAD_CAST "*",
|
||||
cur->parent->ns->href);
|
||||
}
|
||||
} else {
|
||||
val = (const xmlChar *)
|
||||
xmlHashLookup2(ctxt->style->stripSpaces,
|
||||
cur->parent->name, NULL);
|
||||
}
|
||||
if ((val != NULL) &&
|
||||
(xmlStrEqual(val, (xmlChar *) "strip"))) {
|
||||
delNode = cur;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Intentional fall-through */
|
||||
case XML_ELEMENT_NODE:
|
||||
case XML_DOCUMENT_NODE:
|
||||
case XML_HTML_DOCUMENT_NODE:
|
||||
case XML_CDATA_SECTION_NODE:
|
||||
case XML_PI_NODE:
|
||||
case XML_COMMENT_NODE:
|
||||
xmlXPathNodeSetAddUnique(list, cur);
|
||||
break;
|
||||
case XML_DTD_NODE:
|
||||
/* Unlink the DTD, it's still reachable
|
||||
* using doc->intSubset */
|
||||
if (cur->next != NULL)
|
||||
cur->next->prev = cur->prev;
|
||||
if (cur->prev != NULL)
|
||||
cur->prev->next = cur->next;
|
||||
break;
|
||||
case XML_NAMESPACE_DECL:
|
||||
break;
|
||||
default:
|
||||
#ifdef WITH_XSLT_DEBUG_PROCESS
|
||||
XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext,
|
||||
"xsltApplyTemplates: skipping cur type %d\n",
|
||||
cur->type));
|
||||
#endif
|
||||
delNode = cur;
|
||||
}
|
||||
if (IS_XSLT_REAL_NODE(cur))
|
||||
xmlXPathNodeSetAddUnique(list, cur);
|
||||
cur = cur->next;
|
||||
if (delNode != NULL) {
|
||||
#ifdef WITH_XSLT_DEBUG_PROCESS
|
||||
XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext,
|
||||
"xsltApplyTemplates: removing ignorable blank cur\n"));
|
||||
#endif
|
||||
xmlUnlinkNode(delNode);
|
||||
xmlFreeNode(delNode);
|
||||
delNode = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5086,6 +4983,7 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
|||
xmlNodePtr sorts[XSLT_MAX_SORT];
|
||||
|
||||
sorts[nbsorts++] = cur;
|
||||
cur = cur->next;
|
||||
|
||||
while (cur) {
|
||||
|
||||
|
|
8
dll/3rdparty/libxslt/xslt.c
vendored
8
dll/3rdparty/libxslt/xslt.c
vendored
|
@ -3627,12 +3627,8 @@ xsltPreprocessStylesheet(xsltStylesheetPtr style, xmlNodePtr cur)
|
|||
(!xsltCheckExtURI(style, cur->ns->href))) {
|
||||
goto skip_children;
|
||||
} else if (cur->children != NULL) {
|
||||
if ((cur->children->type != XML_ENTITY_DECL) &&
|
||||
(cur->children->type != XML_ENTITY_REF_NODE) &&
|
||||
(cur->children->type != XML_ENTITY_NODE)) {
|
||||
cur = cur->children;
|
||||
continue;
|
||||
}
|
||||
cur = cur->children;
|
||||
continue;
|
||||
}
|
||||
|
||||
skip_children:
|
||||
|
|
3
dll/3rdparty/libxslt/xsltlocale.c
vendored
3
dll/3rdparty/libxslt/xsltlocale.c
vendored
|
@ -341,7 +341,8 @@ xsltDefaultRegion(const xmlChar *localeName) {
|
|||
void
|
||||
xsltFreeLocale(xsltLocale locale) {
|
||||
#ifdef XSLT_LOCALE_POSIX
|
||||
freelocale(locale);
|
||||
if (locale != NULL)
|
||||
freelocale(locale);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
59
dll/3rdparty/libxslt/xsltutils.c
vendored
59
dll/3rdparty/libxslt/xsltutils.c
vendored
|
@ -924,17 +924,19 @@ xsltDocumentSortFunction(xmlNodeSetPtr list) {
|
|||
}
|
||||
|
||||
/**
|
||||
* xsltComputeSortResult:
|
||||
* xsltComputeSortResultiInternal:
|
||||
* @ctxt: a XSLT process context
|
||||
* @sort: node list
|
||||
* @xfrm: Transform strings according to locale
|
||||
*
|
||||
* reorder the current node list accordingly to the set of sorting
|
||||
* requirement provided by the array of nodes.
|
||||
*
|
||||
* Returns a ordered XPath nodeset or NULL in case of error.
|
||||
*/
|
||||
xmlXPathObjectPtr *
|
||||
xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) {
|
||||
static xmlXPathObjectPtr *
|
||||
xsltComputeSortResultInternal(xsltTransformContextPtr ctxt, xmlNodePtr sort,
|
||||
int xfrm) {
|
||||
#ifdef XSLT_REFACTORED
|
||||
xsltStyleItemSortPtr comp;
|
||||
#else
|
||||
|
@ -1021,7 +1023,7 @@ xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) {
|
|||
}
|
||||
} else {
|
||||
if (res->type == XPATH_STRING) {
|
||||
if (comp->locale != (xsltLocale)0) {
|
||||
if ((xfrm) && (comp->locale != (xsltLocale)0)) {
|
||||
xmlChar *str = res->stringval;
|
||||
res->stringval = (xmlChar *) xsltStrxfrm(comp->locale, str);
|
||||
xmlFree(str);
|
||||
|
@ -1051,6 +1053,21 @@ xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) {
|
|||
return(results);
|
||||
}
|
||||
|
||||
/**
|
||||
* xsltComputeSortResult:
|
||||
* @ctxt: a XSLT process context
|
||||
* @sort: node list
|
||||
*
|
||||
* reorder the current node list accordingly to the set of sorting
|
||||
* requirement provided by the array of nodes.
|
||||
*
|
||||
* Returns a ordered XPath nodeset or NULL in case of error.
|
||||
*/
|
||||
xmlXPathObjectPtr *
|
||||
xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) {
|
||||
return xsltComputeSortResultInternal(ctxt, sort, /* xfrm */ 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* xsltDefaultSortFunction:
|
||||
* @ctxt: a XSLT process context
|
||||
|
@ -1078,7 +1095,8 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
|||
int depth;
|
||||
xmlNodePtr node;
|
||||
xmlXPathObjectPtr tmp;
|
||||
int tempstype[XSLT_MAX_SORT], temporder[XSLT_MAX_SORT];
|
||||
int tempstype[XSLT_MAX_SORT], temporder[XSLT_MAX_SORT],
|
||||
templang[XSLT_MAX_SORT];
|
||||
|
||||
if ((ctxt == NULL) || (sorts == NULL) || (nbsorts <= 0) ||
|
||||
(nbsorts >= XSLT_MAX_SORT))
|
||||
|
@ -1100,7 +1118,7 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
|||
comp->stype =
|
||||
xsltEvalAttrValueTemplate(ctxt, sorts[j],
|
||||
(const xmlChar *) "data-type",
|
||||
XSLT_NAMESPACE);
|
||||
NULL);
|
||||
if (comp->stype != NULL) {
|
||||
tempstype[j] = 1;
|
||||
if (xmlStrEqual(comp->stype, (const xmlChar *) "text"))
|
||||
|
@ -1119,7 +1137,7 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
|||
if ((comp->order == NULL) && (comp->has_order != 0)) {
|
||||
comp->order = xsltEvalAttrValueTemplate(ctxt, sorts[j],
|
||||
(const xmlChar *) "order",
|
||||
XSLT_NAMESPACE);
|
||||
NULL);
|
||||
if (comp->order != NULL) {
|
||||
temporder[j] = 1;
|
||||
if (xmlStrEqual(comp->order, (const xmlChar *) "ascending"))
|
||||
|
@ -1135,11 +1153,23 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
|||
}
|
||||
}
|
||||
}
|
||||
templang[j] = 0;
|
||||
if ((comp->lang == NULL) && (comp->has_lang != 0)) {
|
||||
xmlChar *lang = xsltEvalAttrValueTemplate(ctxt, sorts[j],
|
||||
(xmlChar *) "lang",
|
||||
NULL);
|
||||
if (lang != NULL) {
|
||||
templang[j] = 1;
|
||||
comp->locale = xsltNewLocale(lang);
|
||||
xmlFree(lang);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
len = list->nodeNr;
|
||||
|
||||
resultsTab[0] = xsltComputeSortResult(ctxt, sorts[0]);
|
||||
resultsTab[0] = xsltComputeSortResultInternal(ctxt, sorts[0],
|
||||
/* xfrm */ 1);
|
||||
for (i = 1;i < XSLT_MAX_SORT;i++)
|
||||
resultsTab[i] = NULL;
|
||||
|
||||
|
@ -1149,7 +1179,7 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
|||
descending = comp->descending;
|
||||
number = comp->number;
|
||||
if (results == NULL)
|
||||
return;
|
||||
goto cleanup;
|
||||
|
||||
/* Shell's sort of node-set */
|
||||
for (incr = len / 2; incr > 0; incr /= 2) {
|
||||
|
@ -1210,8 +1240,10 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
|||
* full set, this might be optimized ... or not
|
||||
*/
|
||||
if (resultsTab[depth] == NULL)
|
||||
resultsTab[depth] = xsltComputeSortResult(ctxt,
|
||||
sorts[depth]);
|
||||
resultsTab[depth] =
|
||||
xsltComputeSortResultInternal(ctxt,
|
||||
sorts[depth],
|
||||
/* xfrm */ 1);
|
||||
res = resultsTab[depth];
|
||||
if (res == NULL)
|
||||
break;
|
||||
|
@ -1291,6 +1323,7 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
|||
}
|
||||
}
|
||||
|
||||
cleanup:
|
||||
for (j = 0; j < nbsorts; j++) {
|
||||
comp = sorts[j]->psvi;
|
||||
if (tempstype[j] == 1) {
|
||||
|
@ -1303,6 +1336,10 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
|||
xmlFree((void *)(comp->order));
|
||||
comp->order = NULL;
|
||||
}
|
||||
if (templang[j] == 1) {
|
||||
xsltFreeLocale(comp->locale);
|
||||
comp->locale = (xsltLocale)0;
|
||||
}
|
||||
if (resultsTab[j] != NULL) {
|
||||
for (i = 0;i < len;i++)
|
||||
xmlXPathFreeObject(resultsTab[j][i]);
|
||||
|
|
6
dll/3rdparty/libxslt/xsltwin32config.h
vendored
6
dll/3rdparty/libxslt/xsltwin32config.h
vendored
|
@ -23,21 +23,21 @@ extern "C" {
|
|||
*
|
||||
* the version string like "1.2.3"
|
||||
*/
|
||||
#define LIBXSLT_DOTTED_VERSION "1.1.34"
|
||||
#define LIBXSLT_DOTTED_VERSION "1.1.35"
|
||||
|
||||
/**
|
||||
* LIBXSLT_VERSION:
|
||||
*
|
||||
* the version number: 1.2.3 value is 1002003
|
||||
*/
|
||||
#define LIBXSLT_VERSION 10134
|
||||
#define LIBXSLT_VERSION 10135
|
||||
|
||||
/**
|
||||
* LIBXSLT_VERSION_STRING:
|
||||
*
|
||||
* the version number string, 1.2.3 value is "1002003"
|
||||
*/
|
||||
#define LIBXSLT_VERSION_STRING "10134"
|
||||
#define LIBXSLT_VERSION_STRING "10135"
|
||||
|
||||
/**
|
||||
* LIBXSLT_VERSION_EXTRA:
|
||||
|
|
|
@ -45,7 +45,7 @@ URL: http://www.simplesystems.org/libtiff/
|
|||
|
||||
Title: Libxslt
|
||||
Path: dll/3rdparty/libxslt
|
||||
Used Version: 1.1.34
|
||||
Used Version: 1.1.35
|
||||
License: MIT (https://spdx.org/licenses/MIT.html)
|
||||
URL: http://xmlsoft.org
|
||||
|
||||
|
|
|
@ -246,7 +246,7 @@ XSLTPUBFUN xmlHashTablePtr XSLTCALL
|
|||
const xmlChar *URI);
|
||||
|
||||
/**
|
||||
* Test module http://xmlsoft.org/XSLT/
|
||||
* Test of the extension module API
|
||||
*/
|
||||
XSLTPUBFUN void XSLTCALL
|
||||
xsltRegisterTestModule (void);
|
||||
|
|
|
@ -291,6 +291,9 @@ struct _xsltTemplate {
|
|||
int templMax; /* Size of the templtes stack */
|
||||
xsltTemplatePtr *templCalledTab; /* templates called */
|
||||
int *templCountTab; /* .. and how often */
|
||||
|
||||
/* Conflict resolution */
|
||||
int position;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1500,17 +1503,18 @@ struct _xsltStylesheet {
|
|||
/*
|
||||
* Template descriptions.
|
||||
*/
|
||||
xsltTemplatePtr templates; /* the ordered list of templates */
|
||||
void *templatesHash; /* hash table or wherever compiled templates
|
||||
information is stored */
|
||||
void *rootMatch; /* template based on / */
|
||||
void *keyMatch; /* template based on key() */
|
||||
void *elemMatch; /* template based on * */
|
||||
void *attrMatch; /* template based on @* */
|
||||
void *parentMatch; /* template based on .. */
|
||||
void *textMatch; /* template based on text() */
|
||||
void *piMatch; /* template based on processing-instruction() */
|
||||
void *commentMatch; /* template based on comment() */
|
||||
xsltTemplatePtr templates; /* the ordered list of templates */
|
||||
xmlHashTablePtr templatesHash; /* hash table or wherever compiled
|
||||
templates information is stored */
|
||||
struct _xsltCompMatch *rootMatch; /* template based on / */
|
||||
struct _xsltCompMatch *keyMatch; /* template based on key() */
|
||||
struct _xsltCompMatch *elemMatch; /* template based on * */
|
||||
struct _xsltCompMatch *attrMatch; /* template based on @* */
|
||||
struct _xsltCompMatch *parentMatch; /* template based on .. */
|
||||
struct _xsltCompMatch *textMatch; /* template based on text() */
|
||||
struct _xsltCompMatch *piMatch; /* template based on
|
||||
processing-instruction() */
|
||||
struct _xsltCompMatch *commentMatch; /* template based on comment() */
|
||||
|
||||
/*
|
||||
* Namespace aliases.
|
||||
|
|
|
@ -20,21 +20,21 @@ extern "C" {
|
|||
*
|
||||
* the version string like "1.2.3"
|
||||
*/
|
||||
#define LIBXSLT_DOTTED_VERSION "1.1.34"
|
||||
#define LIBXSLT_DOTTED_VERSION "1.1.35"
|
||||
|
||||
/**
|
||||
* LIBXSLT_VERSION:
|
||||
*
|
||||
* the version number: 1.2.3 value is 10203
|
||||
*/
|
||||
#define LIBXSLT_VERSION 10134
|
||||
#define LIBXSLT_VERSION 10135
|
||||
|
||||
/**
|
||||
* LIBXSLT_VERSION_STRING:
|
||||
*
|
||||
* the version number string, 1.2.3 value is "10203"
|
||||
*/
|
||||
#define LIBXSLT_VERSION_STRING "10134"
|
||||
#define LIBXSLT_VERSION_STRING "10135"
|
||||
|
||||
/**
|
||||
* LIBXSLT_VERSION_EXTRA:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue