mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 22:43:01 +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 \
|
FEATURES TODO Copyright libxslt.m4 \
|
||||||
win32/libxslt/libxslt.def win32/libxslt/libxslt.dsw \
|
win32/libxslt/libxslt.def win32/libxslt/libxslt.dsw \
|
||||||
win32/libxslt/libxslt_so.dsp win32/libxslt/xsltproc.dsp \
|
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)
|
$(CVS_EXTRA_DIST)
|
||||||
|
|
||||||
## We create xsltConf.sh here and not from configure because we want
|
## We create xsltConf.sh here and not from configure because we want
|
||||||
|
@ -73,6 +74,9 @@ rpm: cleantar
|
||||||
pkgconfigdir=$(libdir)/pkgconfig
|
pkgconfigdir=$(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = libxslt.pc libexslt.pc
|
pkgconfig_DATA = libxslt.pc libexslt.pc
|
||||||
|
|
||||||
|
cmakedir = $(libdir)/cmake/libxslt
|
||||||
|
cmake_DATA = FindGcrypt.cmake libxslt-config.cmake
|
||||||
|
|
||||||
m4datadir = $(datadir)/aclocal
|
m4datadir = $(datadir)/aclocal
|
||||||
m4data_DATA = libxslt.m4
|
m4data_DATA = libxslt.m4
|
||||||
|
|
||||||
|
|
171
dll/3rdparty/libxslt/NEWS
vendored
171
dll/3rdparty/libxslt/NEWS
vendored
|
@ -1,13 +1,176 @@
|
||||||
|
|
||||||
NEWS file for libxslt
|
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
|
See the git page at
|
||||||
https://gitlab.gnome.org/GNOME/libxslt
|
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:
|
v1.1.33: Jan 03 2019:
|
||||||
- Portability:
|
- Portability:
|
||||||
Variables need 'extern' in static lib on Cygwin (Nick Wellnhofer),
|
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)
|
XSLT support for libxml2 (XML toolkit from the GNOME project)
|
||||||
|
|
||||||
Full documentation is available on-line at
|
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.
|
This code is released under the MIT Licence see the Copyright file.
|
||||||
|
|
||||||
To report bugs, follow the instructions at:
|
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:
|
A mailing-list xslt@gnome.org is available, to subscribe:
|
||||||
http://mail.gnome.org/mailman/listinfo/xslt
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* *
|
|
||||||
* Test module http://xmlsoft.org/XSLT/ *
|
|
||||||
* *
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* *
|
* *
|
||||||
* Test of the extension module API *
|
* 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;
|
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);
|
resObj = xmlXPtrEval(fragment, xptrctxt);
|
||||||
xmlXPathFreeContext(xptrctxt);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
xmlXPathFreeContext(xptrctxt);
|
||||||
|
#endif /* LIBXML_XPTR_ENABLED */
|
||||||
|
|
||||||
if (resObj == NULL)
|
if (resObj == NULL)
|
||||||
goto out_fragment;
|
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
|
.SH AUTHORS
|
||||||
Daniel Veillard (daniel@veillard.com).
|
Daniel Veillard (daniel@veillard.com).
|
||||||
If you download and install this package look at instructions on the
|
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)
|
Manual page by Heiko W. Rupp (hwr@pilhuhn.de)
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.IR libexslt (3),
|
.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;
|
i = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*(--pointer) = val;
|
*(--pointer) = (xmlChar)val;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/*
|
/*
|
||||||
|
@ -943,7 +943,7 @@ xsltFormatNumberConversion(xsltDecimalFormatPtr self,
|
||||||
xmlChar *nprefix, *nsuffix = NULL;
|
xmlChar *nprefix, *nsuffix = NULL;
|
||||||
int prefix_length, suffix_length = 0, nprefix_length, nsuffix_length;
|
int prefix_length, suffix_length = 0, nprefix_length, nsuffix_length;
|
||||||
double scale;
|
double scale;
|
||||||
int j, len;
|
int j, len = 0;
|
||||||
int self_grouping_len;
|
int self_grouping_len;
|
||||||
xsltFormatNumberInfo format_info;
|
xsltFormatNumberInfo format_info;
|
||||||
/*
|
/*
|
||||||
|
|
448
dll/3rdparty/libxslt/pattern.c
vendored
448
dll/3rdparty/libxslt/pattern.c
vendored
|
@ -433,14 +433,11 @@ xsltReverseCompMatch(xsltParserContextPtr ctxt, xsltCompMatchPtr comp) {
|
||||||
xsltCompMatchAdd(ctxt, comp, XSLT_OP_END, NULL, NULL, 0);
|
xsltCompMatchAdd(ctxt, comp, XSLT_OP_END, NULL, NULL, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Detect consecutive XSLT_OP_PREDICATE and predicates on ops which
|
* Detect consecutive XSLT_OP_PREDICATE indicating a direct matching
|
||||||
* haven't been optimized yet indicating a direct matching should be done.
|
* should be done.
|
||||||
*/
|
*/
|
||||||
for (i = 0;i < comp->nbStep - 1;i++) {
|
for (i = 0;i < comp->nbStep - 1;i++) {
|
||||||
xsltOp op = comp->steps[i].op;
|
if ((comp->steps[i].op == XSLT_OP_PREDICATE) &&
|
||||||
|
|
||||||
if ((op != XSLT_OP_ELEM) &&
|
|
||||||
(op != XSLT_OP_ALL) &&
|
|
||||||
(comp->steps[i + 1].op == XSLT_OP_PREDICATE)) {
|
(comp->steps[i + 1].op == XSLT_OP_PREDICATE)) {
|
||||||
|
|
||||||
comp->direct = 1;
|
comp->direct = 1;
|
||||||
|
@ -610,6 +607,152 @@ xsltTestCompMatchDirect(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
||||||
return(0);
|
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:
|
* xsltTestPredicateMatch:
|
||||||
* @ctxt: a XSLT process context
|
* @ctxt: a XSLT process context
|
||||||
|
@ -637,6 +780,8 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
||||||
return(0);
|
return(0);
|
||||||
if (step->comp == NULL)
|
if (step->comp == NULL)
|
||||||
return(0);
|
return(0);
|
||||||
|
if (sel == NULL)
|
||||||
|
return(0);
|
||||||
|
|
||||||
doc = node->doc;
|
doc = node->doc;
|
||||||
if (XSLT_IS_RES_TREE_FRAG(doc))
|
if (XSLT_IS_RES_TREE_FRAG(doc))
|
||||||
|
@ -647,16 +792,16 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
||||||
/*
|
/*
|
||||||
* Recompute contextSize and proximityPosition.
|
* Recompute contextSize and proximityPosition.
|
||||||
*
|
*
|
||||||
* TODO: Make this work for additional ops. Currently, only XSLT_OP_ELEM
|
* This could be improved in the following ways:
|
||||||
* and XSLT_OP_ALL are supported.
|
*
|
||||||
|
* - 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;
|
oldCS = ctxt->xpathCtxt->contextSize;
|
||||||
oldCP = ctxt->xpathCtxt->proximityPosition;
|
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;
|
xmlNodePtr previous;
|
||||||
int nocache = 0;
|
int nocache = 0;
|
||||||
|
|
||||||
|
@ -673,17 +818,8 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
||||||
while (sibling != NULL) {
|
while (sibling != NULL) {
|
||||||
if (sibling == previous)
|
if (sibling == previous)
|
||||||
break;
|
break;
|
||||||
if ((sibling->type == XML_ELEMENT_NODE) &&
|
if (xsltTestStepMatch(ctxt, sibling, sel))
|
||||||
(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++;
|
indx++;
|
||||||
}
|
|
||||||
sibling = sibling->prev;
|
sibling = sibling->prev;
|
||||||
}
|
}
|
||||||
if (sibling == NULL) {
|
if (sibling == NULL) {
|
||||||
|
@ -693,20 +829,8 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
||||||
while (sibling != NULL) {
|
while (sibling != NULL) {
|
||||||
if (sibling == previous)
|
if (sibling == previous)
|
||||||
break;
|
break;
|
||||||
if ((sibling->type == XML_ELEMENT_NODE) &&
|
if (xsltTestStepMatch(ctxt, sibling, sel))
|
||||||
(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--;
|
indx--;
|
||||||
}
|
|
||||||
}
|
|
||||||
sibling = sibling->next;
|
sibling = sibling->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -737,20 +861,12 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
||||||
if (parent) siblings = parent->children;
|
if (parent) siblings = parent->children;
|
||||||
|
|
||||||
while (siblings != NULL) {
|
while (siblings != NULL) {
|
||||||
if (siblings->type == XML_ELEMENT_NODE) {
|
|
||||||
if (siblings == node) {
|
if (siblings == node) {
|
||||||
len++;
|
len++;
|
||||||
pos = len;
|
pos = len;
|
||||||
} else if ((node->name != NULL) &&
|
} else if (xsltTestStepMatch(ctxt, siblings, sel)) {
|
||||||
(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++;
|
len++;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
siblings = siblings->next;
|
siblings = siblings->next;
|
||||||
}
|
}
|
||||||
if ((parent == NULL) || (node->doc == NULL))
|
if ((parent == NULL) || (node->doc == NULL))
|
||||||
|
@ -778,96 +894,6 @@ xsltTestPredicateMatch(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
|
||||||
XSLT_RUNTIME_EXTRA(ctxt, sel->lenExtra, ival) = len;
|
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;
|
oldNode = ctxt->node;
|
||||||
|
@ -950,55 +976,6 @@ restart:
|
||||||
switch (step->op) {
|
switch (step->op) {
|
||||||
case XSLT_OP_END:
|
case XSLT_OP_END:
|
||||||
goto found;
|
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:
|
case XSLT_OP_PARENT:
|
||||||
if ((node->type == XML_DOCUMENT_NODE) ||
|
if ((node->type == XML_DOCUMENT_NODE) ||
|
||||||
(node->type == XML_HTML_DOCUMENT_NODE) ||
|
(node->type == XML_HTML_DOCUMENT_NODE) ||
|
||||||
|
@ -1056,6 +1033,7 @@ restart:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
sel = step;
|
||||||
if (step->value == NULL) {
|
if (step->value == NULL) {
|
||||||
xsltPatPushState(ctxt, &states, i - 1, node);
|
xsltPatPushState(ctxt, &states, i - 1, node);
|
||||||
continue;
|
continue;
|
||||||
|
@ -1080,50 +1058,6 @@ restart:
|
||||||
goto rollback;
|
goto rollback;
|
||||||
xsltPatPushState(ctxt, &states, i - 1, node);
|
xsltPatPushState(ctxt, &states, i - 1, node);
|
||||||
continue;
|
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: {
|
case XSLT_OP_PREDICATE: {
|
||||||
/*
|
/*
|
||||||
* When there is cascading XSLT_OP_PREDICATE or a predicate
|
* When there is cascading XSLT_OP_PREDICATE or a predicate
|
||||||
|
@ -1143,34 +1077,9 @@ restart:
|
||||||
|
|
||||||
break;
|
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:
|
default:
|
||||||
|
if (xsltTestStepMatch(ctxt, node, step) != 1)
|
||||||
goto rollback;
|
goto rollback;
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1420,6 +1329,7 @@ xsltCompileIdKeyPattern(xsltParserContextPtr ctxt, xmlChar *name,
|
||||||
if (ctxt->error) {
|
if (ctxt->error) {
|
||||||
xsltTransformError(NULL, NULL, NULL,
|
xsltTransformError(NULL, NULL, NULL,
|
||||||
"xsltCompileIdKeyPattern : Literal expected\n");
|
"xsltCompileIdKeyPattern : Literal expected\n");
|
||||||
|
xmlFree(lit);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SKIP_BLANKS;
|
SKIP_BLANKS;
|
||||||
|
@ -1446,6 +1356,7 @@ xsltCompileIdKeyPattern(xsltParserContextPtr ctxt, xmlChar *name,
|
||||||
if (ctxt->error) {
|
if (ctxt->error) {
|
||||||
xsltTransformError(NULL, NULL, NULL,
|
xsltTransformError(NULL, NULL, NULL,
|
||||||
"xsltCompileIdKeyPattern : Literal expected\n");
|
"xsltCompileIdKeyPattern : Literal expected\n");
|
||||||
|
xmlFree(lit);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SKIP_BLANKS;
|
SKIP_BLANKS;
|
||||||
|
@ -1487,6 +1398,7 @@ xsltCompileIdKeyPattern(xsltParserContextPtr ctxt, xmlChar *name,
|
||||||
if (ctxt->error) {
|
if (ctxt->error) {
|
||||||
xsltTransformError(NULL, NULL, NULL,
|
xsltTransformError(NULL, NULL, NULL,
|
||||||
"xsltCompileIdKeyPattern : Literal expected\n");
|
"xsltCompileIdKeyPattern : Literal expected\n");
|
||||||
|
xmlFree(lit);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SKIP_BLANKS;
|
SKIP_BLANKS;
|
||||||
|
@ -2108,13 +2020,16 @@ xsltAddTemplate(xsltStylesheetPtr style, xsltTemplatePtr cur,
|
||||||
* 'top' will point to style->xxxMatch ptr - declaring as 'void'
|
* 'top' will point to style->xxxMatch ptr - declaring as 'void'
|
||||||
* avoids gcc 'type-punned pointer' warning.
|
* avoids gcc 'type-punned pointer' warning.
|
||||||
*/
|
*/
|
||||||
void **top = NULL;
|
xsltCompMatchPtr *top = NULL;
|
||||||
const xmlChar *name = NULL;
|
const xmlChar *name = NULL;
|
||||||
float priority; /* the priority */
|
float priority; /* the priority */
|
||||||
|
|
||||||
if ((style == NULL) || (cur == NULL))
|
if ((style == NULL) || (cur == NULL))
|
||||||
return(-1);
|
return(-1);
|
||||||
|
|
||||||
|
if (cur->next != NULL)
|
||||||
|
cur->position = cur->next->position + 1;
|
||||||
|
|
||||||
/* Register named template */
|
/* Register named template */
|
||||||
if (cur->name != NULL) {
|
if (cur->name != NULL) {
|
||||||
if (style->namedTemplates == NULL) {
|
if (style->namedTemplates == NULL) {
|
||||||
|
@ -2476,7 +2391,10 @@ xsltGetTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
while ((list != NULL) &&
|
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,
|
if (xsltTestCompMatch(ctxt, list, node,
|
||||||
ctxt->mode, ctxt->modeURI) == 1) {
|
ctxt->mode, ctxt->modeURI) == 1) {
|
||||||
ret = list->template;
|
ret = list->template;
|
||||||
|
@ -2493,7 +2411,10 @@ xsltGetTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||||
(node->type == XML_TEXT_NODE)) {
|
(node->type == XML_TEXT_NODE)) {
|
||||||
list = curstyle->elemMatch;
|
list = curstyle->elemMatch;
|
||||||
while ((list != NULL) &&
|
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,
|
if (xsltTestCompMatch(ctxt, list, node,
|
||||||
ctxt->mode, ctxt->modeURI) == 1) {
|
ctxt->mode, ctxt->modeURI) == 1) {
|
||||||
ret = list->template;
|
ret = list->template;
|
||||||
|
@ -2506,7 +2427,10 @@ xsltGetTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||||
(node->type == XML_COMMENT_NODE)) {
|
(node->type == XML_COMMENT_NODE)) {
|
||||||
list = curstyle->elemMatch;
|
list = curstyle->elemMatch;
|
||||||
while ((list != NULL) &&
|
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,
|
if (xsltTestCompMatch(ctxt, list, node,
|
||||||
ctxt->mode, ctxt->modeURI) == 1) {
|
ctxt->mode, ctxt->modeURI) == 1) {
|
||||||
ret = list->template;
|
ret = list->template;
|
||||||
|
@ -2521,7 +2445,10 @@ keyed_match:
|
||||||
if (keyed) {
|
if (keyed) {
|
||||||
list = curstyle->keyMatch;
|
list = curstyle->keyMatch;
|
||||||
while ((list != NULL) &&
|
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,
|
if (xsltTestCompMatch(ctxt, list, node,
|
||||||
ctxt->mode, ctxt->modeURI) == 1) {
|
ctxt->mode, ctxt->modeURI) == 1) {
|
||||||
ret = list->template;
|
ret = list->template;
|
||||||
|
@ -2599,8 +2526,7 @@ xsltCleanupTemplates(xsltStylesheetPtr style ATTRIBUTE_UNUSED) {
|
||||||
void
|
void
|
||||||
xsltFreeTemplateHashes(xsltStylesheetPtr style) {
|
xsltFreeTemplateHashes(xsltStylesheetPtr style) {
|
||||||
if (style->templatesHash != NULL)
|
if (style->templatesHash != NULL)
|
||||||
xmlHashFree((xmlHashTablePtr) style->templatesHash,
|
xmlHashFree(style->templatesHash, xsltFreeCompMatchListEntry);
|
||||||
xsltFreeCompMatchListEntry);
|
|
||||||
if (style->rootMatch != NULL)
|
if (style->rootMatch != NULL)
|
||||||
xsltFreeCompMatchList(style->rootMatch);
|
xsltFreeCompMatchList(style->rootMatch);
|
||||||
if (style->keyMatch != NULL)
|
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.groupingCharacterLen = xmlStrlen(prop);
|
||||||
comp->numdata.groupingCharacter =
|
comp->numdata.groupingCharacter =
|
||||||
xsltGetUTF8Char(prop, &(comp->numdata.groupingCharacterLen));
|
xsltGetUTF8Char(prop, &(comp->numdata.groupingCharacterLen));
|
||||||
|
if (comp->numdata.groupingCharacter < 0)
|
||||||
|
comp->numdata.groupingCharacter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
prop = xsltGetCNsProp(style, cur, (const xmlChar *)"grouping-size", XSLT_NAMESPACE);
|
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
|
* Interfaces
|
||||||
*/
|
*/
|
||||||
extern const xmlChar *xsltExtMarker;
|
XSLTPUBVAR const xmlChar *xsltExtMarker;
|
||||||
|
|
||||||
XSLTPUBFUN xsltElemPreCompPtr XSLTCALL
|
XSLTPUBFUN xsltElemPreCompPtr XSLTCALL
|
||||||
xsltDocumentComp (xsltStylesheetPtr style,
|
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__)
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
DWORD dwAttrs;
|
DWORD dwAttrs;
|
||||||
|
|
||||||
dwAttrs = GetFileAttributes(path);
|
dwAttrs = GetFileAttributesA(path);
|
||||||
if (dwAttrs != INVALID_FILE_ATTRIBUTES) {
|
if (dwAttrs != INVALID_FILE_ATTRIBUTES) {
|
||||||
if (dwAttrs & FILE_ATTRIBUTE_DIRECTORY) {
|
if (dwAttrs & FILE_ATTRIBUTE_DIRECTORY) {
|
||||||
return 2;
|
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;
|
xmlNodePtr oldInsert, insert = NULL;
|
||||||
xmlChar *ret;
|
xmlChar *ret;
|
||||||
|
const xmlChar *oldLastText;
|
||||||
|
int oldLastTextSize, oldLastTextUse;
|
||||||
|
|
||||||
if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL) ||
|
if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL) ||
|
||||||
(inst->type != XML_ELEMENT_NODE))
|
(inst->type != XML_ELEMENT_NODE))
|
||||||
|
@ -215,12 +217,18 @@ xsltEvalTemplateString(xsltTransformContextPtr ctxt,
|
||||||
}
|
}
|
||||||
oldInsert = ctxt->insert;
|
oldInsert = ctxt->insert;
|
||||||
ctxt->insert = insert;
|
ctxt->insert = insert;
|
||||||
|
oldLastText = ctxt->lasttext;
|
||||||
|
oldLastTextSize = ctxt->lasttsize;
|
||||||
|
oldLastTextUse = ctxt->lasttuse;
|
||||||
/*
|
/*
|
||||||
* OPTIMIZE TODO: if inst->children consists only of text-nodes.
|
* OPTIMIZE TODO: if inst->children consists only of text-nodes.
|
||||||
*/
|
*/
|
||||||
xsltApplyOneTemplate(ctxt, contextNode, inst->children, NULL, NULL);
|
xsltApplyOneTemplate(ctxt, contextNode, inst->children, NULL, NULL);
|
||||||
|
|
||||||
ctxt->insert = oldInsert;
|
ctxt->insert = oldInsert;
|
||||||
|
ctxt->lasttext = oldLastText;
|
||||||
|
ctxt->lasttsize = oldLastTextSize;
|
||||||
|
ctxt->lasttuse = oldLastTextUse;
|
||||||
|
|
||||||
ret = xmlNodeGetContent(insert);
|
ret = xmlNodeGetContent(insert);
|
||||||
if (insert != NULL)
|
if (insert != NULL)
|
||||||
|
|
120
dll/3rdparty/libxslt/transform.c
vendored
120
dll/3rdparty/libxslt/transform.c
vendored
|
@ -1860,7 +1860,7 @@ static void
|
||||||
xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||||
xsltStackElemPtr params) {
|
xsltStackElemPtr params) {
|
||||||
xmlNodePtr copy;
|
xmlNodePtr copy;
|
||||||
xmlNodePtr delete = NULL, cur;
|
xmlNodePtr cur;
|
||||||
int nbchild = 0, oldSize;
|
int nbchild = 0, oldSize;
|
||||||
int childno = 0, oldPos;
|
int childno = 0, oldPos;
|
||||||
xsltTemplatePtr template;
|
xsltTemplatePtr template;
|
||||||
|
@ -1933,54 +1933,13 @@ xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Handling of Elements: first pass, cleanup and counting
|
* Handling of Elements: first pass, counting
|
||||||
*/
|
*/
|
||||||
cur = node->children;
|
cur = node->children;
|
||||||
while (cur != NULL) {
|
while (cur != NULL) {
|
||||||
switch (cur->type) {
|
if (IS_XSLT_REAL_NODE(cur))
|
||||||
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++;
|
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;
|
|
||||||
}
|
|
||||||
cur = cur->next;
|
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 (elements != NULL) {
|
||||||
if (style->stripSpaces == NULL)
|
if (style->stripSpaces == NULL)
|
||||||
style->stripSpaces = xmlHashCreate(10);
|
style->stripSpaces = xmlHashCreate(10);
|
||||||
if (style->stripSpaces == NULL)
|
if (style->stripSpaces == NULL) {
|
||||||
|
xmlFree(elements);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
element = elements;
|
element = elements;
|
||||||
while (*element != 0) {
|
while (*element != 0) {
|
||||||
|
@ -4829,7 +4790,7 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||||
xsltStylePreCompPtr comp = (xsltStylePreCompPtr) castedComp;
|
xsltStylePreCompPtr comp = (xsltStylePreCompPtr) castedComp;
|
||||||
#endif
|
#endif
|
||||||
int i;
|
int i;
|
||||||
xmlNodePtr cur, delNode = NULL, oldContextNode;
|
xmlNodePtr cur, oldContextNode;
|
||||||
xmlNodeSetPtr list = NULL, oldList;
|
xmlNodeSetPtr list = NULL, oldList;
|
||||||
xsltStackElemPtr withParams = NULL;
|
xsltStackElemPtr withParams = NULL;
|
||||||
int oldXPProximityPosition, oldXPContextSize;
|
int oldXPProximityPosition, oldXPContextSize;
|
||||||
|
@ -4963,73 +4924,9 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||||
else
|
else
|
||||||
cur = NULL;
|
cur = NULL;
|
||||||
while (cur != NULL) {
|
while (cur != NULL) {
|
||||||
switch (cur->type) {
|
if (IS_XSLT_REAL_NODE(cur))
|
||||||
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);
|
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;
|
|
||||||
}
|
|
||||||
cur = cur->next;
|
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];
|
xmlNodePtr sorts[XSLT_MAX_SORT];
|
||||||
|
|
||||||
sorts[nbsorts++] = cur;
|
sorts[nbsorts++] = cur;
|
||||||
|
cur = cur->next;
|
||||||
|
|
||||||
while (cur) {
|
while (cur) {
|
||||||
|
|
||||||
|
|
4
dll/3rdparty/libxslt/xslt.c
vendored
4
dll/3rdparty/libxslt/xslt.c
vendored
|
@ -3627,13 +3627,9 @@ xsltPreprocessStylesheet(xsltStylesheetPtr style, xmlNodePtr cur)
|
||||||
(!xsltCheckExtURI(style, cur->ns->href))) {
|
(!xsltCheckExtURI(style, cur->ns->href))) {
|
||||||
goto skip_children;
|
goto skip_children;
|
||||||
} else if (cur->children != NULL) {
|
} 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;
|
cur = cur->children;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
skip_children:
|
skip_children:
|
||||||
if (cur->next != NULL) {
|
if (cur->next != NULL) {
|
||||||
|
|
1
dll/3rdparty/libxslt/xsltlocale.c
vendored
1
dll/3rdparty/libxslt/xsltlocale.c
vendored
|
@ -341,6 +341,7 @@ xsltDefaultRegion(const xmlChar *localeName) {
|
||||||
void
|
void
|
||||||
xsltFreeLocale(xsltLocale locale) {
|
xsltFreeLocale(xsltLocale locale) {
|
||||||
#ifdef XSLT_LOCALE_POSIX
|
#ifdef XSLT_LOCALE_POSIX
|
||||||
|
if (locale != NULL)
|
||||||
freelocale(locale);
|
freelocale(locale);
|
||||||
#endif
|
#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
|
* @ctxt: a XSLT process context
|
||||||
* @sort: node list
|
* @sort: node list
|
||||||
|
* @xfrm: Transform strings according to locale
|
||||||
*
|
*
|
||||||
* reorder the current node list accordingly to the set of sorting
|
* reorder the current node list accordingly to the set of sorting
|
||||||
* requirement provided by the array of nodes.
|
* requirement provided by the array of nodes.
|
||||||
*
|
*
|
||||||
* Returns a ordered XPath nodeset or NULL in case of error.
|
* Returns a ordered XPath nodeset or NULL in case of error.
|
||||||
*/
|
*/
|
||||||
xmlXPathObjectPtr *
|
static xmlXPathObjectPtr *
|
||||||
xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) {
|
xsltComputeSortResultInternal(xsltTransformContextPtr ctxt, xmlNodePtr sort,
|
||||||
|
int xfrm) {
|
||||||
#ifdef XSLT_REFACTORED
|
#ifdef XSLT_REFACTORED
|
||||||
xsltStyleItemSortPtr comp;
|
xsltStyleItemSortPtr comp;
|
||||||
#else
|
#else
|
||||||
|
@ -1021,7 +1023,7 @@ xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (res->type == XPATH_STRING) {
|
if (res->type == XPATH_STRING) {
|
||||||
if (comp->locale != (xsltLocale)0) {
|
if ((xfrm) && (comp->locale != (xsltLocale)0)) {
|
||||||
xmlChar *str = res->stringval;
|
xmlChar *str = res->stringval;
|
||||||
res->stringval = (xmlChar *) xsltStrxfrm(comp->locale, str);
|
res->stringval = (xmlChar *) xsltStrxfrm(comp->locale, str);
|
||||||
xmlFree(str);
|
xmlFree(str);
|
||||||
|
@ -1051,6 +1053,21 @@ xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) {
|
||||||
return(results);
|
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:
|
* xsltDefaultSortFunction:
|
||||||
* @ctxt: a XSLT process context
|
* @ctxt: a XSLT process context
|
||||||
|
@ -1078,7 +1095,8 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
||||||
int depth;
|
int depth;
|
||||||
xmlNodePtr node;
|
xmlNodePtr node;
|
||||||
xmlXPathObjectPtr tmp;
|
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) ||
|
if ((ctxt == NULL) || (sorts == NULL) || (nbsorts <= 0) ||
|
||||||
(nbsorts >= XSLT_MAX_SORT))
|
(nbsorts >= XSLT_MAX_SORT))
|
||||||
|
@ -1100,7 +1118,7 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
||||||
comp->stype =
|
comp->stype =
|
||||||
xsltEvalAttrValueTemplate(ctxt, sorts[j],
|
xsltEvalAttrValueTemplate(ctxt, sorts[j],
|
||||||
(const xmlChar *) "data-type",
|
(const xmlChar *) "data-type",
|
||||||
XSLT_NAMESPACE);
|
NULL);
|
||||||
if (comp->stype != NULL) {
|
if (comp->stype != NULL) {
|
||||||
tempstype[j] = 1;
|
tempstype[j] = 1;
|
||||||
if (xmlStrEqual(comp->stype, (const xmlChar *) "text"))
|
if (xmlStrEqual(comp->stype, (const xmlChar *) "text"))
|
||||||
|
@ -1119,7 +1137,7 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
||||||
if ((comp->order == NULL) && (comp->has_order != 0)) {
|
if ((comp->order == NULL) && (comp->has_order != 0)) {
|
||||||
comp->order = xsltEvalAttrValueTemplate(ctxt, sorts[j],
|
comp->order = xsltEvalAttrValueTemplate(ctxt, sorts[j],
|
||||||
(const xmlChar *) "order",
|
(const xmlChar *) "order",
|
||||||
XSLT_NAMESPACE);
|
NULL);
|
||||||
if (comp->order != NULL) {
|
if (comp->order != NULL) {
|
||||||
temporder[j] = 1;
|
temporder[j] = 1;
|
||||||
if (xmlStrEqual(comp->order, (const xmlChar *) "ascending"))
|
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;
|
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++)
|
for (i = 1;i < XSLT_MAX_SORT;i++)
|
||||||
resultsTab[i] = NULL;
|
resultsTab[i] = NULL;
|
||||||
|
|
||||||
|
@ -1149,7 +1179,7 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
||||||
descending = comp->descending;
|
descending = comp->descending;
|
||||||
number = comp->number;
|
number = comp->number;
|
||||||
if (results == NULL)
|
if (results == NULL)
|
||||||
return;
|
goto cleanup;
|
||||||
|
|
||||||
/* Shell's sort of node-set */
|
/* Shell's sort of node-set */
|
||||||
for (incr = len / 2; incr > 0; incr /= 2) {
|
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
|
* full set, this might be optimized ... or not
|
||||||
*/
|
*/
|
||||||
if (resultsTab[depth] == NULL)
|
if (resultsTab[depth] == NULL)
|
||||||
resultsTab[depth] = xsltComputeSortResult(ctxt,
|
resultsTab[depth] =
|
||||||
sorts[depth]);
|
xsltComputeSortResultInternal(ctxt,
|
||||||
|
sorts[depth],
|
||||||
|
/* xfrm */ 1);
|
||||||
res = resultsTab[depth];
|
res = resultsTab[depth];
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
break;
|
break;
|
||||||
|
@ -1291,6 +1323,7 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
for (j = 0; j < nbsorts; j++) {
|
for (j = 0; j < nbsorts; j++) {
|
||||||
comp = sorts[j]->psvi;
|
comp = sorts[j]->psvi;
|
||||||
if (tempstype[j] == 1) {
|
if (tempstype[j] == 1) {
|
||||||
|
@ -1303,6 +1336,10 @@ xsltDefaultSortFunction(xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
|
||||||
xmlFree((void *)(comp->order));
|
xmlFree((void *)(comp->order));
|
||||||
comp->order = NULL;
|
comp->order = NULL;
|
||||||
}
|
}
|
||||||
|
if (templang[j] == 1) {
|
||||||
|
xsltFreeLocale(comp->locale);
|
||||||
|
comp->locale = (xsltLocale)0;
|
||||||
|
}
|
||||||
if (resultsTab[j] != NULL) {
|
if (resultsTab[j] != NULL) {
|
||||||
for (i = 0;i < len;i++)
|
for (i = 0;i < len;i++)
|
||||||
xmlXPathFreeObject(resultsTab[j][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"
|
* the version string like "1.2.3"
|
||||||
*/
|
*/
|
||||||
#define LIBXSLT_DOTTED_VERSION "1.1.34"
|
#define LIBXSLT_DOTTED_VERSION "1.1.35"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LIBXSLT_VERSION:
|
* LIBXSLT_VERSION:
|
||||||
*
|
*
|
||||||
* the version number: 1.2.3 value is 1002003
|
* the version number: 1.2.3 value is 1002003
|
||||||
*/
|
*/
|
||||||
#define LIBXSLT_VERSION 10134
|
#define LIBXSLT_VERSION 10135
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LIBXSLT_VERSION_STRING:
|
* LIBXSLT_VERSION_STRING:
|
||||||
*
|
*
|
||||||
* the version number string, 1.2.3 value is "1002003"
|
* the version number string, 1.2.3 value is "1002003"
|
||||||
*/
|
*/
|
||||||
#define LIBXSLT_VERSION_STRING "10134"
|
#define LIBXSLT_VERSION_STRING "10135"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LIBXSLT_VERSION_EXTRA:
|
* LIBXSLT_VERSION_EXTRA:
|
||||||
|
|
|
@ -45,7 +45,7 @@ URL: http://www.simplesystems.org/libtiff/
|
||||||
|
|
||||||
Title: Libxslt
|
Title: Libxslt
|
||||||
Path: dll/3rdparty/libxslt
|
Path: dll/3rdparty/libxslt
|
||||||
Used Version: 1.1.34
|
Used Version: 1.1.35
|
||||||
License: MIT (https://spdx.org/licenses/MIT.html)
|
License: MIT (https://spdx.org/licenses/MIT.html)
|
||||||
URL: http://xmlsoft.org
|
URL: http://xmlsoft.org
|
||||||
|
|
||||||
|
|
|
@ -246,7 +246,7 @@ XSLTPUBFUN xmlHashTablePtr XSLTCALL
|
||||||
const xmlChar *URI);
|
const xmlChar *URI);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test module http://xmlsoft.org/XSLT/
|
* Test of the extension module API
|
||||||
*/
|
*/
|
||||||
XSLTPUBFUN void XSLTCALL
|
XSLTPUBFUN void XSLTCALL
|
||||||
xsltRegisterTestModule (void);
|
xsltRegisterTestModule (void);
|
||||||
|
|
|
@ -291,6 +291,9 @@ struct _xsltTemplate {
|
||||||
int templMax; /* Size of the templtes stack */
|
int templMax; /* Size of the templtes stack */
|
||||||
xsltTemplatePtr *templCalledTab; /* templates called */
|
xsltTemplatePtr *templCalledTab; /* templates called */
|
||||||
int *templCountTab; /* .. and how often */
|
int *templCountTab; /* .. and how often */
|
||||||
|
|
||||||
|
/* Conflict resolution */
|
||||||
|
int position;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1501,16 +1504,17 @@ struct _xsltStylesheet {
|
||||||
* Template descriptions.
|
* Template descriptions.
|
||||||
*/
|
*/
|
||||||
xsltTemplatePtr templates; /* the ordered list of templates */
|
xsltTemplatePtr templates; /* the ordered list of templates */
|
||||||
void *templatesHash; /* hash table or wherever compiled templates
|
xmlHashTablePtr templatesHash; /* hash table or wherever compiled
|
||||||
information is stored */
|
templates information is stored */
|
||||||
void *rootMatch; /* template based on / */
|
struct _xsltCompMatch *rootMatch; /* template based on / */
|
||||||
void *keyMatch; /* template based on key() */
|
struct _xsltCompMatch *keyMatch; /* template based on key() */
|
||||||
void *elemMatch; /* template based on * */
|
struct _xsltCompMatch *elemMatch; /* template based on * */
|
||||||
void *attrMatch; /* template based on @* */
|
struct _xsltCompMatch *attrMatch; /* template based on @* */
|
||||||
void *parentMatch; /* template based on .. */
|
struct _xsltCompMatch *parentMatch; /* template based on .. */
|
||||||
void *textMatch; /* template based on text() */
|
struct _xsltCompMatch *textMatch; /* template based on text() */
|
||||||
void *piMatch; /* template based on processing-instruction() */
|
struct _xsltCompMatch *piMatch; /* template based on
|
||||||
void *commentMatch; /* template based on comment() */
|
processing-instruction() */
|
||||||
|
struct _xsltCompMatch *commentMatch; /* template based on comment() */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Namespace aliases.
|
* Namespace aliases.
|
||||||
|
|
|
@ -20,21 +20,21 @@ extern "C" {
|
||||||
*
|
*
|
||||||
* the version string like "1.2.3"
|
* the version string like "1.2.3"
|
||||||
*/
|
*/
|
||||||
#define LIBXSLT_DOTTED_VERSION "1.1.34"
|
#define LIBXSLT_DOTTED_VERSION "1.1.35"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LIBXSLT_VERSION:
|
* LIBXSLT_VERSION:
|
||||||
*
|
*
|
||||||
* the version number: 1.2.3 value is 10203
|
* the version number: 1.2.3 value is 10203
|
||||||
*/
|
*/
|
||||||
#define LIBXSLT_VERSION 10134
|
#define LIBXSLT_VERSION 10135
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LIBXSLT_VERSION_STRING:
|
* LIBXSLT_VERSION_STRING:
|
||||||
*
|
*
|
||||||
* the version number string, 1.2.3 value is "10203"
|
* the version number string, 1.2.3 value is "10203"
|
||||||
*/
|
*/
|
||||||
#define LIBXSLT_VERSION_STRING "10134"
|
#define LIBXSLT_VERSION_STRING "10135"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LIBXSLT_VERSION_EXTRA:
|
* LIBXSLT_VERSION_EXTRA:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue