From cfa4eb1c65dd2edd24728ac17e73539774718cac Mon Sep 17 00:00:00 2001 From: Ben Boeckel <ben.boeckel@kitware.com> Date: Thu, 28 Dec 2017 11:34:16 -0500 Subject: [PATCH] libxml2: remove old import --- ThirdParty/libxml2/vtklibxml2/AUTHORS | 5 - ThirdParty/libxml2/vtklibxml2/CMakeLists.txt | 380 - ThirdParty/libxml2/vtklibxml2/Copyright | 27 - ThirdParty/libxml2/vtklibxml2/DOCBparser.c | 305 - ThirdParty/libxml2/vtklibxml2/HTMLparser.c | 6274 ---- ThirdParty/libxml2/vtklibxml2/HTMLtree.c | 1213 - ThirdParty/libxml2/vtklibxml2/SAX.c | 180 - ThirdParty/libxml2/vtklibxml2/SAX2.c | 2891 -- ThirdParty/libxml2/vtklibxml2/c14n.c | 1928 -- ThirdParty/libxml2/vtklibxml2/catalog.c | 3788 -- ThirdParty/libxml2/vtklibxml2/chvalid.c | 336 - .../libxml2/vtklibxml2/config_cmake.h.in | 263 - ThirdParty/libxml2/vtklibxml2/debugXML.c | 3264 -- ThirdParty/libxml2/vtklibxml2/dict.c | 901 - ThirdParty/libxml2/vtklibxml2/elfgcchack.h | 17428 ---------- ThirdParty/libxml2/vtklibxml2/encoding.c | 3295 -- ThirdParty/libxml2/vtklibxml2/entities.c | 966 - ThirdParty/libxml2/vtklibxml2/error.c | 986 - ThirdParty/libxml2/vtklibxml2/globals.c | 1129 - ThirdParty/libxml2/vtklibxml2/hash.c | 1079 - .../vtklibxml2/include/libxml/DOCBparser.h | 96 - .../vtklibxml2/include/libxml/HTMLparser.h | 303 - .../vtklibxml2/include/libxml/HTMLtree.h | 147 - .../libxml2/vtklibxml2/include/libxml/SAX.h | 170 - .../libxml2/vtklibxml2/include/libxml/SAX2.h | 176 - .../libxml2/vtklibxml2/include/libxml/c14n.h | 105 - .../vtklibxml2/include/libxml/catalog.h | 182 - .../vtklibxml2/include/libxml/chvalid.h | 230 - .../vtklibxml2/include/libxml/debugXML.h | 217 - .../libxml2/vtklibxml2/include/libxml/dict.h | 69 - .../vtklibxml2/include/libxml/encoding.h | 226 - .../vtklibxml2/include/libxml/entities.h | 140 - .../vtklibxml2/include/libxml/globals.h | 492 - .../libxml2/vtklibxml2/include/libxml/hash.h | 233 - .../libxml2/vtklibxml2/include/libxml/list.h | 137 - .../vtklibxml2/include/libxml/nanoftp.h | 143 - .../vtklibxml2/include/libxml/nanohttp.h | 81 - .../vtklibxml2/include/libxml/parser.h | 1220 - .../include/libxml/parserInternals.h | 602 - .../vtklibxml2/include/libxml/pattern.h | 100 - .../vtklibxml2/include/libxml/relaxng.h | 196 - .../include/libxml/schemasInternals.h | 958 - .../vtklibxml2/include/libxml/schematron.h | 124 - .../vtklibxml2/include/libxml/threads.h | 80 - .../libxml2/vtklibxml2/include/libxml/tree.h | 1208 - .../libxml2/vtklibxml2/include/libxml/uri.h | 89 - .../libxml2/vtklibxml2/include/libxml/valid.h | 458 - .../include/libxml/vtk_libxml2_mangle.h | 1637 - .../vtklibxml2/include/libxml/xinclude.h | 125 - .../libxml2/vtklibxml2/include/libxml/xlink.h | 189 - .../libxml2/vtklibxml2/include/libxml/xmlIO.h | 360 - .../vtklibxml2/include/libxml/xmlautomata.h | 146 - .../vtklibxml2/include/libxml/xmlerror.h | 936 - .../vtklibxml2/include/libxml/xmlexports.h | 156 - .../vtklibxml2/include/libxml/xmlmemory.h | 222 - .../vtklibxml2/include/libxml/xmlmodule.h | 57 - .../vtklibxml2/include/libxml/xmlreader.h | 408 - .../vtklibxml2/include/libxml/xmlregexp.h | 216 - .../vtklibxml2/include/libxml/xmlsave.h | 84 - .../vtklibxml2/include/libxml/xmlschemas.h | 198 - .../include/libxml/xmlschemastypes.h | 151 - .../vtklibxml2/include/libxml/xmlstring.h | 140 - .../vtklibxml2/include/libxml/xmlunicode.h | 202 - .../vtklibxml2/include/libxml/xmlversion.h.in | 405 - .../include/libxml/xmlwin32version.h.in | 288 - .../vtklibxml2/include/libxml/xmlwriter.h | 459 - .../libxml2/vtklibxml2/include/libxml/xpath.h | 543 - .../include/libxml/xpathInternals.h | 630 - .../vtklibxml2/include/libxml/xpointer.h | 114 - .../libxml2/vtklibxml2/include/wsockcompat.h | 81 - ThirdParty/libxml2/vtklibxml2/legacy.c | 1328 - ThirdParty/libxml2/vtklibxml2/libxml.h | 79 - .../vtklibxml2/libxml2PlatformTests.cmake | 134 - ThirdParty/libxml2/vtklibxml2/list.c | 779 - ThirdParty/libxml2/vtklibxml2/nanoftp.c | 2109 -- ThirdParty/libxml2/vtklibxml2/nanohttp.c | 1789 - ThirdParty/libxml2/vtklibxml2/parser.c | 13612 -------- .../libxml2/vtklibxml2/parserInternals.c | 2059 -- ThirdParty/libxml2/vtklibxml2/pattern.c | 2607 -- .../libxml2/vtklibxml2/platformTestsC.c | 122 - ThirdParty/libxml2/vtklibxml2/regressions.xml | 226 - ThirdParty/libxml2/vtklibxml2/relaxng.c | 10815 ------ ThirdParty/libxml2/vtklibxml2/rngparser.c | 1595 - ThirdParty/libxml2/vtklibxml2/runsuite.c | 1184 - ThirdParty/libxml2/vtklibxml2/runtest.c | 4432 --- ThirdParty/libxml2/vtklibxml2/schematron.c | 1734 - ThirdParty/libxml2/vtklibxml2/threads.c | 867 - ThirdParty/libxml2/vtklibxml2/tree.c | 9535 ----- ThirdParty/libxml2/vtklibxml2/trio.c | 6855 ---- ThirdParty/libxml2/vtklibxml2/trio.h | 216 - ThirdParty/libxml2/vtklibxml2/triodef.h | 222 - ThirdParty/libxml2/vtklibxml2/trionan.c | 915 - ThirdParty/libxml2/vtklibxml2/trionan.h | 84 - ThirdParty/libxml2/vtklibxml2/triop.h | 150 - ThirdParty/libxml2/vtklibxml2/triostr.c | 2102 -- ThirdParty/libxml2/vtklibxml2/triostr.h | 140 - ThirdParty/libxml2/vtklibxml2/uri.c | 2483 -- ThirdParty/libxml2/vtklibxml2/valid.c | 6955 ---- ThirdParty/libxml2/vtklibxml2/vtk_README.txt | 57 - .../libxml2/vtklibxml2/vtk_libxml2_zlib.h | 10 - ThirdParty/libxml2/vtklibxml2/xinclude.c | 2555 -- ThirdParty/libxml2/vtklibxml2/xlink.c | 181 - ThirdParty/libxml2/vtklibxml2/xmlIO.c | 3881 --- ThirdParty/libxml2/vtklibxml2/xmlcatalog.c | 617 - ThirdParty/libxml2/vtklibxml2/xmllint.c | 3541 -- ThirdParty/libxml2/vtklibxml2/xmlmemory.c | 1044 - ThirdParty/libxml2/vtklibxml2/xmlmodule.c | 445 - ThirdParty/libxml2/vtklibxml2/xmlreader.c | 5659 --- ThirdParty/libxml2/vtklibxml2/xmlregexp.c | 7959 ----- ThirdParty/libxml2/vtklibxml2/xmlsave.c | 2406 -- ThirdParty/libxml2/vtklibxml2/xmlschemas.c | 28654 ---------------- .../libxml2/vtklibxml2/xmlschemastypes.c | 6113 ---- ThirdParty/libxml2/vtklibxml2/xmlstring.c | 984 - ThirdParty/libxml2/vtklibxml2/xmlunicode.c | 3179 -- ThirdParty/libxml2/vtklibxml2/xmlwriter.c | 4614 --- ThirdParty/libxml2/vtklibxml2/xpath.c | 15069 -------- ThirdParty/libxml2/vtklibxml2/xpointer.c | 3003 -- 117 files changed, 227666 deletions(-) delete mode 100644 ThirdParty/libxml2/vtklibxml2/AUTHORS delete mode 100644 ThirdParty/libxml2/vtklibxml2/CMakeLists.txt delete mode 100644 ThirdParty/libxml2/vtklibxml2/Copyright delete mode 100644 ThirdParty/libxml2/vtklibxml2/DOCBparser.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/HTMLparser.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/HTMLtree.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/SAX.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/SAX2.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/c14n.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/catalog.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/chvalid.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/config_cmake.h.in delete mode 100644 ThirdParty/libxml2/vtklibxml2/debugXML.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/dict.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/elfgcchack.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/encoding.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/entities.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/error.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/globals.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/hash.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/DOCBparser.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/HTMLparser.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/HTMLtree.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/SAX.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/SAX2.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/c14n.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/catalog.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/chvalid.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/debugXML.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/dict.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/encoding.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/entities.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/globals.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/hash.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/list.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/nanoftp.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/nanohttp.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/parser.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/parserInternals.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/pattern.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/relaxng.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/schemasInternals.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/schematron.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/threads.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/tree.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/uri.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/valid.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/vtk_libxml2_mangle.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xinclude.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xlink.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlIO.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlautomata.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlerror.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlexports.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlmemory.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlmodule.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlreader.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlregexp.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlsave.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlschemas.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlschemastypes.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlstring.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlunicode.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlversion.h.in delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlwin32version.h.in delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xmlwriter.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xpath.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xpathInternals.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/libxml/xpointer.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/include/wsockcompat.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/legacy.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/libxml.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/libxml2PlatformTests.cmake delete mode 100644 ThirdParty/libxml2/vtklibxml2/list.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/nanoftp.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/nanohttp.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/parser.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/parserInternals.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/pattern.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/platformTestsC.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/regressions.xml delete mode 100644 ThirdParty/libxml2/vtklibxml2/relaxng.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/rngparser.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/runsuite.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/runtest.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/schematron.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/threads.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/tree.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/trio.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/trio.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/triodef.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/trionan.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/trionan.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/triop.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/triostr.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/triostr.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/uri.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/valid.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/vtk_README.txt delete mode 100644 ThirdParty/libxml2/vtklibxml2/vtk_libxml2_zlib.h delete mode 100644 ThirdParty/libxml2/vtklibxml2/xinclude.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xlink.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlIO.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlcatalog.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmllint.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlmemory.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlmodule.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlreader.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlregexp.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlsave.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlschemas.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlschemastypes.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlstring.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlunicode.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xmlwriter.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xpath.c delete mode 100644 ThirdParty/libxml2/vtklibxml2/xpointer.c diff --git a/ThirdParty/libxml2/vtklibxml2/AUTHORS b/ThirdParty/libxml2/vtklibxml2/AUTHORS deleted file mode 100644 index cf2e9a6fadd..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/AUTHORS +++ /dev/null @@ -1,5 +0,0 @@ -Daniel Veillard <daniel@veillard.com> -Bjorn Reese <breese@users.sourceforge.net> -William Brack <wbrack@mmm.com.hk> -Igor Zlatkovic <igor@zlatkovic.com> for the Windows port -Aleksey Sanin <aleksey@aleksey.com> diff --git a/ThirdParty/libxml2/vtklibxml2/CMakeLists.txt b/ThirdParty/libxml2/vtklibxml2/CMakeLists.txt deleted file mode 100644 index 34d9fadc41b..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/CMakeLists.txt +++ /dev/null @@ -1,380 +0,0 @@ -PROJECT(vtklibxml2 C) -INCLUDE_REGULAR_EXPRESSION("^.*$") - -SET(PACKAGE "vtklibxml2") -SET(VERSION "2.6.27") -SET(LIBXML_VERSION_NUMBER 20627) -SET(LIBXML_VERSION_EXTRA "") -SET(MODULE_EXTENSION ${CMAKE_SHARED_MODULE_SUFFIX}) - -SET(PACKAGE_TARNAME "") -SET(PACKAGE_BUGREPORT " ") -SET(PACKAGE_NAME "") -SET(PACKAGE_VERSION "") -SET(PACKAGE_STRING "") -SET(PACKAGE_BUGREPORT "") - -INCLUDE(CheckLibraryExists) -INCLUDE(CheckIncludeFile) -INCLUDE(CheckIncludeFiles) -INCLUDE(CheckSymbolExists) -INCLUDE(libxml2PlatformTests.cmake) - -SET(LIBXML2_PLATFORM_TEST_FILE_C platformTestsC.c) - -set(CMAKE_THREAD_PREFER_PTHREAD OFF) - -FIND_PACKAGE(Threads) - -# This macro checks if the symbol exists in the library and if it -# does, it appends library to the list. -SET(LIBXML2_LIBS "") -MACRO(CHECK_LIBRARY_EXISTS_CONCAT LIBRARY SYMBOL VARIABLE) - CHECK_LIBRARY_EXISTS("${LIBRARY};${LIBXML2_LIBS}" ${SYMBOL} "" ${VARIABLE}) - IF(${VARIABLE}) - SET(LIBXML2_LIBS ${LIBXML2_LIBS} ${LIBRARY}) - ENDIF() -ENDMACRO() - -CHECK_LIBRARY_EXISTS_CONCAT("dl" dlopen HAVE_LIBDL) -CHECK_LIBRARY_EXISTS_CONCAT("dld" shl_load HAVE_SHLLOAD) -# VTK does not use the read line functionality of libxml2, so don't -# try and find these libraries. It creates extra dependencies on -# executables and libraries. This might cause trouble when creating -# packages or rpm's. - -#CHECK_LIBRARY_EXISTS_CONCAT("history" append_history HAVE_LIBHISTORY) -#CHECK_LIBRARY_EXISTS_CONCAT("readline" readline HAVE_LIBREADLINE) -IF(NOT vtkzlib_LIBRARIES) - CHECK_LIBRARY_EXISTS_CONCAT("z" inflateEnd HAVE_LIBZ) -ENDIF() - -# Use needed system libraries. -SET(LIBXML2_LIBS ${LIBXML2_LIBS} ${CMAKE_THREAD_LIBS} ${CMAKE_DL_LIBS}) -IF(UNIX) - SET(LIBXML2_LIBS ${LIBXML2_LIBS} m) -ENDIF() - -# Check for symbol dlopen separately from the dl library. -CHECK_LIBRARY_EXISTS("${LIBXML2_LIBS}" dlopen "" HAVE_DLOPEN) - -# For other tests to use the same libraries -SET(CMAKE_REQUIRED_LIBRARIES ${LIBXML2_LIBS}) -SET(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE") - -# Use VTK's zlib if we are building in the tree. -IF(vtkzlib_LIBRARIES) - SET(HAVE_LIBZ 1) - SET(LIBXML2_LIBS ${vtkzlib_LIBRARIES} ${LIBXML2_LIBS}) -ENDIF() - -# Check if header file exists and add it to the list. -MACRO(CHECK_INCLUDE_FILE_CONCAT FILE VARIABLE) - CHECK_INCLUDE_FILES("${LIBXML2_INCLUDES};${FILE}" ${VARIABLE}) - IF(${VARIABLE}) - SET(LIBXML2_INCLUDES ${LIBXML2_INCLUDES} ${FILE}) - ENDIF() -ENDMACRO() - -# Check for headers not actually needed for the configured header but -# that may be needed to include the other headers tested. -CHECK_INCLUDE_FILE_CONCAT("stdio.h" HAVE_STDIO_H) -CHECK_INCLUDE_FILE_CONCAT("stddef.h" HAVE_STDDEF_H) - -CHECK_INCLUDE_FILE_CONCAT("sys/types.h" HAVE_SYS_TYPES_H) -CHECK_INCLUDE_FILE_CONCAT("inttypes.h" HAVE_INTTYPES_H) -CHECK_INCLUDE_FILE_CONCAT("dlfcn.h" HAVE_DLFCN_H) -CHECK_INCLUDE_FILE_CONCAT("fcntl.h" HAVE_FCNTL_H) -CHECK_INCLUDE_FILE_CONCAT("malloc.h" HAVE_MALLOC_H) -CHECK_INCLUDE_FILE_CONCAT("memory.h" HAVE_MEMORY_H) -CHECK_INCLUDE_FILE_CONCAT("netdb.h" HAVE_NETDB_H) -CHECK_INCLUDE_FILE_CONCAT("limits.h" HAVE_LIMITS_H) -CHECK_INCLUDE_FILE_CONCAT("sys/socket.h" HAVE_SYS_SOCKET_H) -CHECK_INCLUDE_FILE_CONCAT("netinet/in.h" HAVE_NETINET_IN_H) -CHECK_INCLUDE_FILE_CONCAT("sys/select.h" HAVE_SYS_SELECT_H) -CHECK_INCLUDE_FILE_CONCAT("stdint.h" HAVE_STDINT_H) -CHECK_INCLUDE_FILE_CONCAT("stdlib.h" HAVE_STDLIB_H) -CHECK_INCLUDE_FILE_CONCAT("string.h" HAVE_STRING_H) -CHECK_INCLUDE_FILE_CONCAT("strings.h" HAVE_STRINGS_H) -CHECK_INCLUDE_FILE_CONCAT("sys/stat.h" HAVE_SYS_STAT_H) -CHECK_INCLUDE_FILE_CONCAT("sys/time.h" HAVE_SYS_TIME_H) -CHECK_INCLUDE_FILE_CONCAT("time.h" HAVE_TIME_H) -CHECK_INCLUDE_FILE_CONCAT("unistd.h" HAVE_UNISTD_H) -CHECK_INCLUDE_FILE_CONCAT("signal.h" HAVE_SIGNAL_H) -CHECK_INCLUDE_FILE_CONCAT("errno.h" HAVE_ERRNO_H) -CHECK_INCLUDE_FILE_CONCAT("ansidecl.h" HAVE_ANSIDECL_H) -CHECK_INCLUDE_FILE_CONCAT("arpa/inet.h" HAVE_ARPA_INET_H) -CHECK_INCLUDE_FILE_CONCAT("arpa/nameser.h" HAVE_ARPA_NAMESER_H) -CHECK_INCLUDE_FILE_CONCAT("ctype.h" HAVE_CTYPE_H) -CHECK_INCLUDE_FILE_CONCAT("dirent.h" HAVE_DIRENT_H) -CHECK_INCLUDE_FILE_CONCAT("dl.h" HAVE_DL_H) -CHECK_INCLUDE_FILE_CONCAT("float.h" HAVE_FLOAT_H) -CHECK_INCLUDE_FILE_CONCAT("fp_class.h" HAVE_FP_CLASS_H) -CHECK_INCLUDE_FILE_CONCAT("ieeefp.h" HAVE_IEEEFP_H) -CHECK_INCLUDE_FILE_CONCAT("math.h" HAVE_MATH_H) -CHECK_INCLUDE_FILE_CONCAT("nan.h" HAVE_NAN_H) -CHECK_INCLUDE_FILE_CONCAT("ndir.h" HAVE_NDIR_H) -CHECK_INCLUDE_FILE_CONCAT("pthread.h" HAVE_PTHREAD_H) -CHECK_INCLUDE_FILE_CONCAT("resolv.h" HAVE_RESOLV_H) -CHECK_INCLUDE_FILE_CONCAT("stdarg.h" HAVE_STDARG_H) -CHECK_INCLUDE_FILE_CONCAT("sys/mman.h" HAVE_SYS_MMAN_H) -CHECK_INCLUDE_FILE_CONCAT("sys/timeb.h" HAVE_SYS_TIMEB_H) - -CHECK_SYMBOL_EXISTS(finite "${LIBXML2_INCLUDES}" HAVE_FINITE) -CHECK_SYMBOL_EXISTS(fpclass "${LIBXML2_INCLUDES}" HAVE_FPCLASS) -CHECK_SYMBOL_EXISTS(fp_class "${LIBXML2_INCLUDES}" HAVE_FP_CLASS) -CHECK_SYMBOL_EXISTS(fprintf "${LIBXML2_INCLUDES}" HAVE_FPRINTF) -CHECK_SYMBOL_EXISTS(ftime "${LIBXML2_INCLUDES}" HAVE_FTIME) -CHECK_SYMBOL_EXISTS(gettimeofday "${LIBXML2_INCLUDES}" HAVE_GETTIMEOFDAY) -CHECK_SYMBOL_EXISTS(localtime "${LIBXML2_INCLUDES}" HAVE_LOCALTIME) -CHECK_SYMBOL_EXISTS(printf "${LIBXML2_INCLUDES}" HAVE_PRINTF) -CHECK_SYMBOL_EXISTS(sscanf "${LIBXML2_INCLUDES}" HAVE_SSCANF) -CHECK_SYMBOL_EXISTS(sprintf "${LIBXML2_INCLUDES}" HAVE_SPRINTF) -CHECK_SYMBOL_EXISTS(snprintf "${LIBXML2_INCLUDES}" HAVE_SNPRINTF) -CHECK_SYMBOL_EXISTS(signal "${LIBXML2_INCLUDES}" HAVE_SIGNAL) -CHECK_SYMBOL_EXISTS(strdup "${LIBXML2_INCLUDES}" HAVE_STRDUP) -CHECK_SYMBOL_EXISTS(strndup "${LIBXML2_INCLUDES}" HAVE_STRNDUP) -CHECK_SYMBOL_EXISTS(strerror "${LIBXML2_INCLUDES}" HAVE_STRERROR) -CHECK_SYMBOL_EXISTS(strftime "${LIBXML2_INCLUDES}" HAVE_STRFTIME) -CHECK_SYMBOL_EXISTS(stat "${LIBXML2_INCLUDES}" HAVE_STAT) -CHECK_SYMBOL_EXISTS(_stat "${LIBXML2_INCLUDES}" HAVE__STAT) -CHECK_SYMBOL_EXISTS(vfprintf "${LIBXML2_INCLUDES}" HAVE_VFPRINTF) -CHECK_SYMBOL_EXISTS(vsnprintf "${LIBXML2_INCLUDES}" HAVE_VSNPRINTF) -CHECK_SYMBOL_EXISTS(vsprintf "${LIBXML2_INCLUDES}" HAVE_VSPRINTF) - -LIBXML2_PLATFORM_C_TEST(HAVE_GETADDRINFO "Checking for getaddrinfo." DIRECT) -LIBXML2_PLATFORM_C_TEST(HAVE_SOCKLEN_T "Checking for socklen_t" DIRECT) -LIBXML2_PLATFORM_C_TEST(HAVE_SYS_DIR_H "Checking for DIR in sys/dir.h" DIRECT) -LIBXML2_PLATFORM_C_TEST(HAVE_SYS_NDIR_H "Checking for DIR in sys/ndir.h" DIRECT) -LIBXML2_PLATFORM_C_TEST(HAVE_VA_COPY "Checking for va_copy" DIRECT) -LIBXML2_PLATFORM_C_TEST(HAVE___VA_COPY "Checking for __va_copy" DIRECT) -LIBXML2_PLATFORM_C_TEST(SUPPORT_IP6 "Checking for ipv6 support." DIRECT) - -# Use VTK's zlib if we are building in the tree. -IF(vtkzlib_LIBRARIES) - SET(HAVE_VTK_ZLIB_H 1) - SET(HAVE_ZLIB_H 1) -ELSE() - CHECK_INCLUDE_FILE_CONCAT("zlib.h" HAVE_ZLIB_H) -ENDIF() - -IF(HAVE_SOCKLEN_T) - SET(XML_SOCKLEN_T "socklen_t") -ELSE() - SET(XML_SOCKLEN_T) -ENDIF() -SET(_WINSOCKAPI_) - - -SET(WITH_TRIO 0) # some kind of 3rd party library -SET(WITH_THREADS 1) -SET(WITH_TREE 1) -SET(WITH_OUTPUT 1) -SET(WITH_PUSH 1) -SET(WITH_READER 1) -SET(WITH_PATTERN 1) -SET(WITH_WRITER 1) -SET(WITH_SAX1 1) -SET(WITH_FTP 0) # fix socket API -SET(WITH_HTTP 0) # fix socket API -SET(WITH_VALID 1) -SET(WITH_HTML 1) -SET(WITH_LEGACY 1) -SET(WITH_C14N 1) -SET(WITH_CATALOG 1) -SET(WITH_DOCB 1) -SET(WITH_XPATH 1) -SET(WITH_XPTR 1) -SET(WITH_XINCLUDE 1) -SET(WITH_ICONV 0) -SET(WITH_ISO8859X 1) -SET(WITH_DEBUG 0) -SET(WITH_MEM_DEBUG 0) -SET(WITH_RUN_DEBUG 0) -SET(WITH_REGEXPS 1) -SET(WITH_REGEXPS 1) -SET(WITH_REGEXPS 1) -SET(WITH_SCHEMAS 1) -SET(WITH_SCHEMAS 1) -SET(WITH_SCHEMATRON 1) -SET(WITH_MODULES 1) - -IF(HAVE_ZLIB_H AND HAVE_LIBZ) - SET(WITH_ZLIB 1) -ELSE() - SET(WITH_ZLIB 0) -ENDIF() - -# not building VTK with pthreads -IF(NOT VTK_USE_PTHREADS AND HAVE_PTHREAD_H) - SET(HAVE_PTHREAD_H 0) -ENDIF() - -# Create the platform configuration header. -CONFIGURE_FILE(${vtklibxml2_SOURCE_DIR}/config_cmake.h.in - ${vtklibxml2_BINARY_DIR}/config.h @ONLY) - -# Create the build configuration header. -CONFIGURE_FILE(${vtklibxml2_SOURCE_DIR}/include/libxml/xmlversion.h.in - ${vtklibxml2_BINARY_DIR}/libxml/xmlversion.h @ONLY) -SET(vtklibxml2_HEADER_FILES - ${vtklibxml2_BINARY_DIR}/libxml/xmlversion.h) - -# Copy all the source headers over to the same directory as the build -# configuration header so that headers can include each other with -# double quotes. -FILE(GLOB vtklibxml2_HEADERS - RELATIVE ${vtklibxml2_SOURCE_DIR}/include/libxml - include/libxml/*.h) -FOREACH(f ${vtklibxml2_HEADERS}) - CONFIGURE_FILE(${vtklibxml2_SOURCE_DIR}/include/libxml/${f} - ${vtklibxml2_BINARY_DIR}/libxml/${f} COPYONLY) - SET(vtklibxml2_HEADER_FILES ${vtklibxml2_HEADER_FILES} - ${vtklibxml2_BINARY_DIR}/libxml/${f}) -ENDFOREACH() - -# Block warnings unless we are instructed to allow them. -# SET(VTKLIBXML2_WARNINGS_ALLOW 1) -vtk_third_party_warning_suppress(VTKLIBXML2 C) - -ADD_DEFINITIONS(-DHAVE_CONFIG_H -D_GNU_SOURCE -DPIC -D_REENTRANT) -IF(VTK_USE_WIN32_THREADS) - # threads.c looks for this - ADD_DEFINITIONS(-DHAVE_WIN32_THREADS) -ENDIF() - -SET(vtklibxml2_la_SOURCES - DOCBparser.c - HTMLparser.c - HTMLtree.c - SAX.c - SAX2.c - c14n.c - catalog.c - chvalid.c - debugXML.c - dict.c - encoding.c - entities.c - error.c - globals.c - hash.c - legacy.c - list.c - nanoftp.c - nanohttp.c - parser.c - parserInternals.c - pattern.c - relaxng.c - schematron.c - threads.c - tree.c - uri.c - valid.c - xinclude.c - xlink.c - xmlIO.c - xmlmemory.c - xmlmodule.c - xmlreader.c - xmlregexp.c - xmlsave.c - xmlschemas.c - xmlschemastypes.c - xmlstring.c - xmlunicode.c - xmlwriter.c - xpath.c - xpointer.c - ) - -INCLUDE_DIRECTORIES(BEFORE ${vtklibxml2_BINARY_DIR}) - -# Create the build configuration header. -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/include/libxml/xmlversion.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/include/libxml/xmlversion.h" - @ONLY) - -set(headers - include/libxml/c14n.h - include/libxml/catalog.h - include/libxml/chvalid.h - include/libxml/debugXML.h - include/libxml/dict.h - include/libxml/DOCBparser.h - include/libxml/encoding.h - include/libxml/entities.h - include/libxml/globals.h - include/libxml/hash.h - include/libxml/HTMLparser.h - include/libxml/HTMLtree.h - include/libxml/list.h - include/libxml/nanoftp.h - include/libxml/nanohttp.h - include/libxml/parser.h - include/libxml/parserInternals.h - include/libxml/pattern.h - include/libxml/relaxng.h - include/libxml/SAX.h - include/libxml/SAX2.h - include/libxml/schemasInternals.h - include/libxml/schematron.h - include/libxml/threads.h - include/libxml/tree.h - include/libxml/uri.h - include/libxml/valid.h - include/libxml/vtk_libxml2_mangle.h - include/libxml/xinclude.h - include/libxml/xlink.h - include/libxml/xmlautomata.h - include/libxml/xmlerror.h - include/libxml/xmlexports.h - include/libxml/xmlIO.h - include/libxml/xmlmemory.h - include/libxml/xmlmodule.h - include/libxml/xmlreader.h - include/libxml/xmlregexp.h - include/libxml/xmlsave.h - include/libxml/xmlschemas.h - include/libxml/xmlschemastypes.h - include/libxml/xmlstring.h - include/libxml/xmlunicode.h - include/libxml/xmlwin32version.h - include/libxml/xmlwriter.h - include/libxml/xpath.h - include/libxml/xpathInternals.h - include/libxml/xpointer.h - "${CMAKE_CURRENT_BINARY_DIR}/include/libxml/xmlversion.h") - -if (VTK_USE_WIN32_THREADS) - # threads.c looks for this - set_source_files_properties(threads.c - PROPERTIES - COMPILE_DEFINITIONS HAVE_WIN32_THREADS) -endif () - -vtk_module_add_module(VTK::libxml2 - SOURCES ${sources} - HEADERS ${headers} - HEADERS_SUBDIR "vtklibxml2/include/libxml") -target_compile_definitions(libxml2 - PRIVATE - _GNU_SOURCE - _REENTRANT) - -if(NOT BUILD_SHARED_LIBS) - target_compile_definitions(libxml2 - PRIVATE - LIBXML_STATIC) -endif() - -target_include_directories(libxml2 - PRIVATE - "${CMAKE_CURRENT_SOURCE_DIR}/include/libxml" - "${CMAKE_CURRENT_BINARY_DIR}/include/libxml" - PUBLIC - "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>" - "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>" - "$<INSTALL_INTERFACE:${_vtk_build_HEADERS_DESTINATION}/vtklibxml2/include>") diff --git a/ThirdParty/libxml2/vtklibxml2/Copyright b/ThirdParty/libxml2/vtklibxml2/Copyright deleted file mode 100644 index 417e95531fd..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/Copyright +++ /dev/null @@ -1,27 +0,0 @@ -Except where otherwise noted in the source code (e.g. the files hash.c, -list.c and the trio files, which are covered by a similar licence but -with different Copyright notices) all the files are: - - Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is fur- -nished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- -NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- -NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of Daniel Veillard shall not -be used in advertising or otherwise to promote the sale, use or other deal- -ings in this Software without prior written authorization from him. - diff --git a/ThirdParty/libxml2/vtklibxml2/DOCBparser.c b/ThirdParty/libxml2/vtklibxml2/DOCBparser.c deleted file mode 100644 index a02263e8613..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/DOCBparser.c +++ /dev/null @@ -1,305 +0,0 @@ -/* - * DOCBparser.c : an attempt to parse SGML Docbook documents - * - * This is deprecated !!! - * Code removed with release 2.6.0 it was broken. - * The doc are expect to be migrated to XML DocBook - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" -#ifdef LIBXML_DOCB_ENABLED - -#include <libxml/xmlerror.h> -#include <libxml/DOCBparser.h> - -/** - * docbEncodeEntities: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * @quoteChar: the quote character to escape (' or ") or zero. - * - * Take a block of UTF-8 chars in and try to convert it to an ASCII - * plus SGML entities block of chars out. - * - * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * as the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -int -docbEncodeEntities(unsigned char *out ATTRIBUTE_UNUSED, - int *outlen ATTRIBUTE_UNUSED, - const unsigned char *in ATTRIBUTE_UNUSED, - int *inlen ATTRIBUTE_UNUSED, - int quoteChar ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbEncodeEntities() deprecated function reached\n"); - deprecated = 1; - } - return(-1); -} - -/** - * docbParseDocument: - * @ctxt: an SGML parser context - * - * parse an SGML document (and build a tree if using the standard SAX - * interface). - * - * Returns 0, -1 in case of error. the parser context is augmented - * as a result of the parsing. - */ - -int -docbParseDocument(docbParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbParseDocument() deprecated function reached\n"); - deprecated = 1; - } - return (xmlParseDocument(ctxt)); -} - -/** - * docbFreeParserCtxt: - * @ctxt: an SGML parser context - * - * Free all the memory used by a parser context. However the parsed - * document in ctxt->myDoc is not freed. - */ - -void -docbFreeParserCtxt(docbParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbFreeParserCtxt() deprecated function reached\n"); - deprecated = 1; - } - xmlFreeParserCtxt(ctxt); -} - -/** - * docbParseChunk: - * @ctxt: an XML parser context - * @chunk: an char array - * @size: the size in byte of the chunk - * @terminate: last chunk indicator - * - * Parse a Chunk of memory - * - * Returns zero if no error, the xmlParserErrors otherwise. - */ -int -docbParseChunk(docbParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - const char *chunk ATTRIBUTE_UNUSED, - int size ATTRIBUTE_UNUSED, - int terminate ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbParseChunk() deprecated function reached\n"); - deprecated = 1; - } - - return (xmlParseChunk(ctxt, chunk, size, terminate)); -} - -/** - * docbCreatePushParserCtxt: - * @sax: a SAX handler - * @user_data: The user data returned on SAX callbacks - * @chunk: a pointer to an array of chars - * @size: number of chars in the array - * @filename: an optional file name or URI - * @enc: an optional encoding - * - * Create a parser context for using the DocBook SGML parser in push mode - * To allow content encoding detection, @size should be >= 4 - * The value of @filename is used for fetching external entities - * and error/warning reports. - * - * Returns the new parser context or NULL - */ -docbParserCtxtPtr -docbCreatePushParserCtxt(docbSAXHandlerPtr sax ATTRIBUTE_UNUSED, - void *user_data ATTRIBUTE_UNUSED, - const char *chunk ATTRIBUTE_UNUSED, - int size ATTRIBUTE_UNUSED, - const char *filename ATTRIBUTE_UNUSED, - xmlCharEncoding enc ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbParseChunk() deprecated function reached\n"); - deprecated = 1; - } - - return(xmlCreatePushParserCtxt(sax, user_data, chunk, size, filename)); -} - -/** - * docbSAXParseDoc: - * @cur: a pointer to an array of xmlChar - * @encoding: a free form C string describing the SGML document encoding, or NULL - * @sax: the SAX handler block - * @userData: if using SAX, this pointer will be provided on callbacks. - * - * parse an SGML in-memory document and build a tree. - * It use the given SAX function block to handle the parsing callback. - * If sax is NULL, fallback to the default DOM tree building routines. - * - * Returns the resulting document tree - */ - -docbDocPtr -docbSAXParseDoc(xmlChar * cur ATTRIBUTE_UNUSED, - const char *encoding ATTRIBUTE_UNUSED, - docbSAXHandlerPtr sax ATTRIBUTE_UNUSED, - void *userData ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbParseChunk() deprecated function reached\n"); - deprecated = 1; - } - - return (xmlSAXParseMemoryWithData(sax, (const char *)cur, - xmlStrlen((const xmlChar *) cur), 0, userData)); -} - -/** - * docbParseDoc: - * @cur: a pointer to an array of xmlChar - * @encoding: a free form C string describing the SGML document encoding, or NULL - * - * parse an SGML in-memory document and build a tree. - * - * Returns the resulting document tree - */ - -docbDocPtr -docbParseDoc(xmlChar * cur ATTRIBUTE_UNUSED, - const char *encoding ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbParseChunk() deprecated function reached\n"); - deprecated = 1; - } - - return (xmlParseDoc(cur)); -} - - -/** - * docbCreateFileParserCtxt: - * @filename: the filename - * @encoding: the SGML document encoding, or NULL - * - * Create a parser context for a file content. - * Automatic support for ZLIB/Compress compressed document is provided - * by default if found at compile-time. - * - * Returns the new parser context or NULL - */ -docbParserCtxtPtr -docbCreateFileParserCtxt(const char *filename ATTRIBUTE_UNUSED, - const char *encoding ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbCreateFileParserCtxt() deprecated function reached\n"); - deprecated = 1; - } - - return (xmlCreateFileParserCtxt(filename)); -} - -/** - * docbSAXParseFile: - * @filename: the filename - * @encoding: a free form C string describing the SGML document encoding, or NULL - * @sax: the SAX handler block - * @userData: if using SAX, this pointer will be provided on callbacks. - * - * parse an SGML file and build a tree. Automatic support for ZLIB/Compress - * compressed document is provided by default if found at compile-time. - * It use the given SAX function block to handle the parsing callback. - * If sax is NULL, fallback to the default DOM tree building routines. - * - * Returns the resulting document tree - */ - -docbDocPtr -docbSAXParseFile(const char *filename ATTRIBUTE_UNUSED, - const char *encoding ATTRIBUTE_UNUSED, - docbSAXHandlerPtr sax ATTRIBUTE_UNUSED, - void *userData ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbSAXParseFile() deprecated function reached\n"); - deprecated = 1; - } - - return (xmlSAXParseFileWithData(sax, filename, 0, userData)); -} - -/** - * docbParseFile: - * @filename: the filename - * @encoding: a free form C string describing document encoding, or NULL - * - * parse a Docbook SGML file and build a tree. Automatic support for - * ZLIB/Compress compressed document is provided by default if found - * at compile-time. - * - * Returns the resulting document tree - */ - -docbDocPtr -docbParseFile(const char *filename ATTRIBUTE_UNUSED, - const char *encoding ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "docbParseFile() deprecated function reached\n"); - deprecated = 1; - } - - return (xmlParseFile(filename)); -} -#define bottom_DOCBparser -#include "elfgcchack.h" -#endif /* LIBXML_DOCB_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/HTMLparser.c b/ThirdParty/libxml2/vtklibxml2/HTMLparser.c deleted file mode 100644 index e6f65264dc1..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/HTMLparser.c +++ /dev/null @@ -1,6274 +0,0 @@ -/* - * HTMLparser.c : an HTML 4.0 non-verifying parser - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" -#ifdef LIBXML_HTML_ENABLED - -#include <string.h> -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#include "vtk_libxml2_zlib.h" - -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/xmlerror.h> -#include <libxml/HTMLparser.h> -#include <libxml/HTMLtree.h> -#include <libxml/entities.h> -#include <libxml/encoding.h> -#include <libxml/valid.h> -#include <libxml/xmlIO.h> -#include <libxml/globals.h> -#include <libxml/uri.h> - -#define HTML_MAX_NAMELEN 1000 -#define HTML_PARSER_BIG_BUFFER_SIZE 1000 -#define HTML_PARSER_BUFFER_SIZE 100 - -/* #define DEBUG */ -/* #define DEBUG_PUSH */ - -static int htmlOmittedDefaultValue = 1; - -xmlChar * htmlDecodeEntities(htmlParserCtxtPtr ctxt, int len, - xmlChar end, xmlChar end2, xmlChar end3); -static void htmlParseComment(htmlParserCtxtPtr ctxt); - -/************************************************************************ - * * - * Some factorized error routines * - * * - ************************************************************************/ - -/** - * htmlErrMemory: - * @ctxt: an HTML parser context - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -static void -htmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) { - ctxt->errNo = XML_ERR_NO_MEMORY; - ctxt->instate = XML_PARSER_EOF; - ctxt->disableSAX = 1; - } - if (extra) - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, - NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); - else - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, - NULL, NULL, 0, 0, "Memory allocation failed\n"); -} - -/** - * htmlParseErr: - * @ctxt: an HTML parser context - * @error: the error number - * @msg: the error message - * @str1: string infor - * @str2: string infor - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -htmlParseErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar *str1, const xmlChar *str2) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, - XML_ERR_ERROR, NULL, 0, - (const char *) str1, (const char *) str2, - NULL, 0, 0, - msg, str1, str2); - if (ctxt != NULL) - ctxt->wellFormed = 0; -} - -/** - * htmlParseErrInt: - * @ctxt: an HTML parser context - * @error: the error number - * @msg: the error message - * @val: integer info - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -htmlParseErrInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, int val) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, - XML_ERR_ERROR, NULL, 0, NULL, NULL, - NULL, val, 0, msg, val); - if (ctxt != NULL) - ctxt->wellFormed = 0; -} - -/************************************************************************ - * * - * Parser stacks related functions and macros * - * * - ************************************************************************/ - -/** - * htmlnamePush: - * @ctxt: an HTML parser context - * @value: the element name - * - * Pushes a new element name on top of the name stack - * - * Returns 0 in case of error, the index in the stack otherwise - */ -static int -htmlnamePush(htmlParserCtxtPtr ctxt, const xmlChar * value) -{ - if (ctxt->nameNr >= ctxt->nameMax) { - ctxt->nameMax *= 2; - ctxt->nameTab = (const xmlChar * *) - xmlRealloc((xmlChar * *)ctxt->nameTab, - ctxt->nameMax * - sizeof(ctxt->nameTab[0])); - if (ctxt->nameTab == NULL) { - htmlErrMemory(ctxt, NULL); - return (0); - } - } - ctxt->nameTab[ctxt->nameNr] = value; - ctxt->name = value; - return (ctxt->nameNr++); -} -/** - * htmlnamePop: - * @ctxt: an HTML parser context - * - * Pops the top element name from the name stack - * - * Returns the name just removed - */ -static const xmlChar * -htmlnamePop(htmlParserCtxtPtr ctxt) -{ - const xmlChar *ret; - - if (ctxt->nameNr <= 0) - return (NULL); - ctxt->nameNr--; - if (ctxt->nameNr < 0) - return (NULL); - if (ctxt->nameNr > 0) - ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; - else - ctxt->name = NULL; - ret = ctxt->nameTab[ctxt->nameNr]; - ctxt->nameTab[ctxt->nameNr] = NULL; - return (ret); -} - -/* - * Macros for accessing the content. Those should be used only by the parser, - * and not exported. - * - * Dirty macros, i.e. one need to make assumption on the context to use them - * - * CUR_PTR return the current pointer to the xmlChar to be parsed. - * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled - * in ISO-Latin or UTF-8, and the current 16 bit value if compiled - * in UNICODE mode. This should be used internally by the parser - * only to compare to ASCII values otherwise it would break when - * running with UTF-8 encoding. - * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only - * to compare on ASCII based substring. - * UPP(n) returns the n'th next xmlChar converted to uppercase. Same as CUR - * it should be used only to compare on ASCII based substring. - * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined - * strings without newlines within the parser. - * - * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding - * - * CURRENT Returns the current char value, with the full decoding of - * UTF-8 if we are using this mode. It returns an int. - * NEXT Skip to the next character, this does the proper decoding - * in UTF-8 mode. It also pop-up unfinished entities on the fly. - * NEXTL(l) Skip the current unicode character of l xmlChars long. - * COPY(to) copy one char to *to, increment CUR_PTR and to accordingly - */ - -#define UPPER (toupper(*ctxt->input->cur)) - -#define SKIP(val) ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val) - -#define NXT(val) ctxt->input->cur[(val)] - -#define UPP(val) (toupper(ctxt->input->cur[(val)])) - -#define CUR_PTR ctxt->input->cur - -#define SHRINK if ((ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ - (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ - xmlParserInputShrink(ctxt->input) - -#define GROW if ((ctxt->progressive == 0) && \ - (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ - xmlParserInputGrow(ctxt->input, INPUT_CHUNK) - -#define CURRENT ((int) (*ctxt->input->cur)) - -#define SKIP_BLANKS htmlSkipBlankChars(ctxt) - -/* Inported from XML */ - -/* #define CUR (ctxt->token ? ctxt->token : (int) (*ctxt->input->cur)) */ -#define CUR ((int) (*ctxt->input->cur)) -#define NEXT xmlNextChar(ctxt) - -#define RAW (ctxt->token ? -1 : (*ctxt->input->cur)) -#define NXT(val) ctxt->input->cur[(val)] -#define CUR_PTR ctxt->input->cur - - -#define NEXTL(l) do { \ - if (*(ctxt->input->cur) == '\n') { \ - ctxt->input->line++; ctxt->input->col = 1; \ - } else ctxt->input->col++; \ - ctxt->token = 0; ctxt->input->cur += l; ctxt->nbChars++; \ - } while (0) - -/************ - \ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ - if (*ctxt->input->cur == '&') xmlParserHandleReference(ctxt); - ************/ - -#define CUR_CHAR(l) htmlCurrentChar(ctxt, &l) -#define CUR_SCHAR(s, l) xmlStringCurrentChar(ctxt, s, &l) - -#define COPY_BUF(l,b,i,v) \ - if (l == 1) b[i++] = (xmlChar) v; \ - else i += xmlCopyChar(l,&b[i],v) - -/** - * htmlCurrentChar: - * @ctxt: the HTML parser context - * @len: pointer to the length of the char read - * - * The current char value, if using UTF-8 this may actually span multiple - * bytes in the input buffer. Implement the end of line normalization: - * 2.11 End-of-Line Handling - * If the encoding is unspecified, in the case we find an ISO-Latin-1 - * char, then the encoding converter is plugged in automatically. - * - * Returns the current char value and its length - */ - -static int -htmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) { - if (ctxt->instate == XML_PARSER_EOF) - return(0); - - if (ctxt->token != 0) { - *len = 0; - return(ctxt->token); - } - if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { - /* - * We are supposed to handle UTF8, check it's valid - * From rfc2044: encoding of the Unicode values on UTF-8: - * - * UCS-4 range (hex.) UTF-8 octet sequence (binary) - * 0000 0000-0000 007F 0xxxxxxx - * 0000 0080-0000 07FF 110xxxxx 10xxxxxx - * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx - * - * Check for the 0x110000 limit too - */ - const unsigned char *cur = ctxt->input->cur; - unsigned char c; - unsigned int val; - - c = *cur; - if (c & 0x80) { - if (cur[1] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if ((cur[1] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xe0) == 0xe0) { - - if (cur[2] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if ((cur[2] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xf0) == 0xf0) { - if (cur[3] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if (((c & 0xf8) != 0xf0) || - ((cur[3] & 0xc0) != 0x80)) - goto encoding_error; - /* 4-byte code */ - *len = 4; - val = (cur[0] & 0x7) << 18; - val |= (cur[1] & 0x3f) << 12; - val |= (cur[2] & 0x3f) << 6; - val |= cur[3] & 0x3f; - } else { - /* 3-byte code */ - *len = 3; - val = (cur[0] & 0xf) << 12; - val |= (cur[1] & 0x3f) << 6; - val |= cur[2] & 0x3f; - } - } else { - /* 2-byte code */ - *len = 2; - val = (cur[0] & 0x1f) << 6; - val |= cur[1] & 0x3f; - } - if (!IS_CHAR(val)) { - htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, - "Char 0x%X out of allowed range\n", val); - } - return(val); - } else { - /* 1-byte code */ - *len = 1; - return((int) *ctxt->input->cur); - } - } - /* - * Assume it's a fixed length encoding (1) with - * a compatible encoding for the ASCII set, since - * XML constructs only use < 128 chars - */ - *len = 1; - if ((int) *ctxt->input->cur < 0x80) - return((int) *ctxt->input->cur); - - /* - * Humm this is bad, do an automatic flow conversion - */ - xmlSwitchEncoding(ctxt, XML_CHAR_ENCODING_8859_1); - ctxt->charset = XML_CHAR_ENCODING_UTF8; - return(xmlCurrentChar(ctxt, len)); - -encoding_error: - /* - * If we detect an UTF8 error that probably mean that the - * input encoding didn't get properly advertized in the - * declaration header. Report the error and switch the encoding - * to ISO-Latin-1 (if you don't like this policy, just declare the - * encoding !) - */ - { - char buffer[150]; - - snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - ctxt->input->cur[0], ctxt->input->cur[1], - ctxt->input->cur[2], ctxt->input->cur[3]); - htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, - "Input is not proper UTF-8, indicate encoding !\n", - BAD_CAST buffer, NULL); - } - - ctxt->charset = XML_CHAR_ENCODING_8859_1; - *len = 1; - return((int) *ctxt->input->cur); -} - -/** - * htmlSkipBlankChars: - * @ctxt: the HTML parser context - * - * skip all blanks character found at that point in the input streams. - * - * Returns the number of space chars skipped - */ - -static int -htmlSkipBlankChars(xmlParserCtxtPtr ctxt) { - int res = 0; - - while (IS_BLANK_CH(*(ctxt->input->cur))) { - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) { - xmlPopInput(ctxt); - } else { - if (*(ctxt->input->cur) == '\n') { - ctxt->input->line++; ctxt->input->col = 1; - } else ctxt->input->col++; - ctxt->input->cur++; - ctxt->nbChars++; - if (*ctxt->input->cur == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - } - res++; - } - return(res); -} - - - -/************************************************************************ - * * - * The list of HTML elements and their properties * - * * - ************************************************************************/ - -/* - * Start Tag: 1 means the start tag can be ommited - * End Tag: 1 means the end tag can be ommited - * 2 means it's forbidden (empty elements) - * 3 means the tag is stylistic and should be closed easily - * Depr: this element is deprecated - * DTD: 1 means that this element is valid only in the Loose DTD - * 2 means that this element is valid only in the Frameset DTD - * - * Name,Start Tag,End Tag,Save End,Empty,Deprecated,DTD,inline,Description - , subElements , impliedsubelt , Attributes, userdata - */ - -/* Definitions and a couple of vars for HTML Elements */ - -#define FONTSTYLE "tt", "i", "b", "u", "s", "strike", "big", "small" -#define NB_FONTSTYLE 8 -#define PHRASE "em", "strong", "dfn", "code", "samp", "kbd", "var", "cite", "abbr", "acronym" -#define NB_PHRASE 10 -#define SPECIAL "a", "img", "applet", "object", "font", "basefont", "br", "script", "map", "q", "sub", "sup", "span", "bdo", "iframe" -#define NB_SPECIAL 15 -#define INLINE PCDATA FONTSTYLE PHRASE SPECIAL FORMCTRL -#define NB_INLINE NB_PCDATA + NB_FONTSTYLE + NB_PHRASE + NB_SPECIAL + NB_FORMCTRL -#define BLOCK HEADING, LIST "pre", "p", "dl", "div", "center", "noscript", "noframes", "blockquote", "form", "isindex", "hr", "table", "fieldset", "address" -#define NB_BLOCK NB_HEADING + NB_LIST + 14 -#define FORMCTRL "input", "select", "textarea", "label", "button" -#define NB_FORMCTRL 5 -#define PCDATA -#define NB_PCDATA 0 -#define HEADING "h1", "h2", "h3", "h4", "h5", "h6" -#define NB_HEADING 6 -#define LIST "ul", "ol", "dir", "menu" -#define NB_LIST 4 -#define MODIFIER -#define NB_MODIFIER 0 -#define FLOW BLOCK,INLINE -#define NB_FLOW NB_BLOCK + NB_INLINE -#define EMPTY NULL - - -static const char* const html_flow[] = { FLOW, NULL } ; -static const char* const html_inline[] = { INLINE, NULL } ; - -/* placeholders: elts with content but no subelements */ -static const char* const html_pcdata[] = { NULL } ; -#define html_cdata html_pcdata - - -/* ... and for HTML Attributes */ - -#define COREATTRS "id", "class", "style", "title" -#define NB_COREATTRS 4 -#define I18N "lang", "dir" -#define NB_I18N 2 -#define EVENTS "onclick", "ondblclick", "onmousedown", "onmouseup", "onmouseover", "onmouseout", "onkeypress", "onkeydown", "onkeyup" -#define NB_EVENTS 9 -#define ATTRS COREATTRS,I18N,EVENTS -#define NB_ATTRS NB_NB_COREATTRS + NB_I18N + NB_EVENTS -#define CELLHALIGN "align", "char", "charoff" -#define NB_CELLHALIGN 3 -#define CELLVALIGN "valign" -#define NB_CELLVALIGN 1 - -static const char* const html_attrs[] = { ATTRS, NULL } ; -static const char* const core_i18n_attrs[] = { COREATTRS, I18N, NULL } ; -static const char* const core_attrs[] = { COREATTRS, NULL } ; -static const char* const i18n_attrs[] = { I18N, NULL } ; - - -/* Other declarations that should go inline ... */ -static const char* const a_attrs[] = { ATTRS, "charset", "type", "name", - "href", "hreflang", "rel", "rev", "accesskey", "shape", "coords", - "tabindex", "onfocus", "onblur", NULL } ; -static const char* const target_attr[] = { "target", NULL } ; -static const char* const rows_cols_attr[] = { "rows", "cols", NULL } ; -static const char* const alt_attr[] = { "alt", NULL } ; -static const char* const src_alt_attrs[] = { "src", "alt", NULL } ; -static const char* const href_attrs[] = { "href", NULL } ; -static const char* const clear_attrs[] = { "clear", NULL } ; -static const char* const inline_p[] = { INLINE, "p", NULL } ; - -static const char* const flow_param[] = { FLOW, "param", NULL } ; -static const char* const applet_attrs[] = { COREATTRS , "codebase", - "archive", "alt", "name", "height", "width", "align", - "hspace", "vspace", NULL } ; -static const char* const area_attrs[] = { "shape", "coords", "href", "nohref", - "tabindex", "accesskey", "onfocus", "onblur", NULL } ; -static const char* const basefont_attrs[] = - { "id", "size", "color", "face", NULL } ; -static const char* const quote_attrs[] = { ATTRS, "cite", NULL } ; -static const char* const body_contents[] = { FLOW, "ins", "del", NULL } ; -static const char* const body_attrs[] = { ATTRS, "onload", "onunload", NULL } ; -static const char* const body_depr[] = { "background", "bgcolor", "text", - "link", "vlink", "alink", NULL } ; -static const char* const button_attrs[] = { ATTRS, "name", "value", "type", - "disabled", "tabindex", "accesskey", "onfocus", "onblur", NULL } ; - - -static const char* const col_attrs[] = { ATTRS, "span", "width", CELLHALIGN, CELLVALIGN, NULL } ; -static const char* const col_elt[] = { "col", NULL } ; -static const char* const edit_attrs[] = { ATTRS, "datetime", "cite", NULL } ; -static const char* const compact_attrs[] = { ATTRS, "compact", NULL } ; -static const char* const dl_contents[] = { "dt", "dd", NULL } ; -static const char* const compact_attr[] = { "compact", NULL } ; -static const char* const label_attr[] = { "label", NULL } ; -static const char* const fieldset_contents[] = { FLOW, "legend" } ; -static const char* const font_attrs[] = { COREATTRS, I18N, "size", "color", "face" , NULL } ; -static const char* const form_contents[] = { HEADING, LIST, INLINE, "pre", "p", "div", "center", "noscript", "noframes", "blockquote", "isindex", "hr", "table", "fieldset", "address", NULL } ; -static const char* const form_attrs[] = { ATTRS, "method", "enctype", "accept", "name", "onsubmit", "onreset", "accept-charset", NULL } ; -static const char* const frame_attrs[] = { COREATTRS, "longdesc", "name", "src", "frameborder", "marginwidth", "marginheight", "noresize", "scrolling" , NULL } ; -static const char* const frameset_attrs[] = { COREATTRS, "rows", "cols", "onload", "onunload", NULL } ; -static const char* const frameset_contents[] = { "frameset", "frame", "noframes", NULL } ; -static const char* const head_attrs[] = { I18N, "profile", NULL } ; -static const char* const head_contents[] = { "title", "isindex", "base", "script", "style", "meta", "link", "object", NULL } ; -static const char* const hr_depr[] = { "align", "noshade", "size", "width", NULL } ; -static const char* const version_attr[] = { "version", NULL } ; -static const char* const html_content[] = { "head", "body", "frameset", NULL } ; -static const char* const iframe_attrs[] = { COREATTRS, "longdesc", "name", "src", "frameborder", "marginwidth", "marginheight", "scrolling", "align", "height", "width", NULL } ; -static const char* const img_attrs[] = { ATTRS, "longdesc", "name", "height", "width", "usemap", "ismap", NULL } ; -static const char* const input_attrs[] = { ATTRS, "type", "name", "value", "checked", "disabled", "readonly", "size", "maxlength", "src", "alt", "usemap", "ismap", "tabindex", "accesskey", "onfocus", "onblur", "onselect", "onchange", "accept", NULL } ; -static const char* const prompt_attrs[] = { COREATTRS, I18N, "prompt", NULL } ; -static const char* const label_attrs[] = { ATTRS, "for", "accesskey", "onfocus", "onblur", NULL } ; -static const char* const legend_attrs[] = { ATTRS, "accesskey", NULL } ; -static const char* const align_attr[] = { "align", NULL } ; -static const char* const link_attrs[] = { ATTRS, "charset", "href", "hreflang", "type", "rel", "rev", "media", NULL } ; -static const char* const map_contents[] = { BLOCK, "area", NULL } ; -static const char* const name_attr[] = { "name", NULL } ; -static const char* const action_attr[] = { "action", NULL } ; -static const char* const blockli_elt[] = { BLOCK, "li", NULL } ; -static const char* const meta_attrs[] = { I18N, "http-equiv", "name", "scheme", NULL } ; -static const char* const content_attr[] = { "content", NULL } ; -static const char* const type_attr[] = { "type", NULL } ; -static const char* const noframes_content[] = { "body", FLOW MODIFIER, NULL } ; -static const char* const object_contents[] = { FLOW, "param", NULL } ; -static const char* const object_attrs[] = { ATTRS, "declare", "classid", "codebase", "data", "type", "codetype", "archive", "standby", "height", "width", "usemap", "name", "tabindex", NULL } ; -static const char* const object_depr[] = { "align", "border", "hspace", "vspace", NULL } ; -static const char* const ol_attrs[] = { "type", "compact", "start", NULL} ; -static const char* const option_elt[] = { "option", NULL } ; -static const char* const optgroup_attrs[] = { ATTRS, "disabled", NULL } ; -static const char* const option_attrs[] = { ATTRS, "disabled", "label", "selected", "value", NULL } ; -static const char* const param_attrs[] = { "id", "value", "valuetype", "type", NULL } ; -static const char* const width_attr[] = { "width", NULL } ; -static const char* const pre_content[] = { PHRASE, "tt", "i", "b", "u", "s", "strike", "a", "br", "script", "map", "q", "span", "bdo", "iframe", NULL } ; -static const char* const script_attrs[] = { "charset", "src", "defer", "event", "for", NULL } ; -static const char* const language_attr[] = { "language", NULL } ; -static const char* const select_content[] = { "optgroup", "option", NULL } ; -static const char* const select_attrs[] = { ATTRS, "name", "size", "multiple", "disabled", "tabindex", "onfocus", "onblur", "onchange", NULL } ; -static const char* const style_attrs[] = { I18N, "media", "title", NULL } ; -static const char* const table_attrs[] = { ATTRS "summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding", "datapagesize", NULL } ; -static const char* const table_depr[] = { "align", "bgcolor", NULL } ; -static const char* const table_contents[] = { "caption", "col", "colgroup", "thead", "tfoot", "tbody", "tr", NULL} ; -static const char* const tr_elt[] = { "tr", NULL } ; -static const char* const talign_attrs[] = { ATTRS, CELLHALIGN, CELLVALIGN, NULL} ; -static const char* const th_td_depr[] = { "nowrap", "bgcolor", "width", "height", NULL } ; -static const char* const th_td_attr[] = { ATTRS, "abbr", "axis", "headers", "scope", "rowspan", "colspan", CELLHALIGN, CELLVALIGN, NULL } ; -static const char* const textarea_attrs[] = { ATTRS, "name", "disabled", "readonly", "tabindex", "accesskey", "onfocus", "onblur", "onselect", "onchange", NULL } ; -static const char* const tr_contents[] = { "th", "td", NULL } ; -static const char* const bgcolor_attr[] = { "bgcolor", NULL } ; -static const char* const li_elt[] = { "li", NULL } ; -static const char* const ul_depr[] = { "type", "compact", NULL} ; -static const char* const dir_attr[] = { "dir", NULL} ; - -#define DECL (const char**) - -static const htmlElemDesc -html40ElementTable[] = { -{ "a", 0, 0, 0, 0, 0, 0, 1, "anchor ", - DECL html_inline , NULL , DECL a_attrs , DECL target_attr, NULL -}, -{ "abbr", 0, 0, 0, 0, 0, 0, 1, "abbreviated form", - DECL html_inline , NULL , DECL html_attrs, NULL, NULL -}, -{ "acronym", 0, 0, 0, 0, 0, 0, 1, "", - DECL html_inline , NULL , DECL html_attrs, NULL, NULL -}, -{ "address", 0, 0, 0, 0, 0, 0, 0, "information on author ", - DECL inline_p , NULL , DECL html_attrs, NULL, NULL -}, -{ "applet", 0, 0, 0, 0, 1, 1, 2, "java applet ", - DECL flow_param , NULL , NULL , DECL applet_attrs, NULL -}, -{ "area", 0, 2, 2, 1, 0, 0, 0, "client-side image map area ", - EMPTY , NULL , DECL area_attrs , DECL target_attr, DECL alt_attr -}, -{ "b", 0, 3, 0, 0, 0, 0, 1, "bold text style", - DECL html_inline , NULL , DECL html_attrs, NULL, NULL -}, -{ "base", 0, 2, 2, 1, 0, 0, 0, "document base uri ", - EMPTY , NULL , NULL , DECL target_attr, DECL href_attrs -}, -{ "basefont", 0, 2, 2, 1, 1, 1, 1, "base font size " , - EMPTY , NULL , NULL, DECL basefont_attrs, NULL -}, -{ "bdo", 0, 0, 0, 0, 0, 0, 1, "i18n bidi over-ride ", - DECL html_inline , NULL , DECL core_i18n_attrs, NULL, DECL dir_attr -}, -{ "big", 0, 3, 0, 0, 0, 0, 1, "large text style", - DECL html_inline , NULL , DECL html_attrs, NULL, NULL -}, -{ "blockquote", 0, 0, 0, 0, 0, 0, 0, "long quotation ", - DECL html_flow , NULL , DECL quote_attrs , NULL, NULL -}, -{ "body", 1, 1, 0, 0, 0, 0, 0, "document body ", - DECL body_contents , "div" , DECL body_attrs, DECL body_depr, NULL -}, -{ "br", 0, 2, 2, 1, 0, 0, 1, "forced line break ", - EMPTY , NULL , DECL core_attrs, DECL clear_attrs , NULL -}, -{ "button", 0, 0, 0, 0, 0, 0, 2, "push button ", - DECL html_flow MODIFIER , NULL , DECL button_attrs, NULL, NULL -}, -{ "caption", 0, 0, 0, 0, 0, 0, 0, "table caption ", - DECL html_inline , NULL , DECL html_attrs, NULL, NULL -}, -{ "center", 0, 3, 0, 0, 1, 1, 0, "shorthand for div align=center ", - DECL html_flow , NULL , NULL, DECL html_attrs, NULL -}, -{ "cite", 0, 0, 0, 0, 0, 0, 1, "citation", - DECL html_inline , NULL , DECL html_attrs, NULL, NULL -}, -{ "code", 0, 0, 0, 0, 0, 0, 1, "computer code fragment", - DECL html_inline , NULL , DECL html_attrs, NULL, NULL -}, -{ "col", 0, 2, 2, 1, 0, 0, 0, "table column ", - EMPTY , NULL , DECL col_attrs , NULL, NULL -}, -{ "colgroup", 0, 1, 0, 0, 0, 0, 0, "table column group ", - DECL col_elt , "col" , DECL col_attrs , NULL, NULL -}, -{ "dd", 0, 1, 0, 0, 0, 0, 0, "definition description ", - DECL html_flow , NULL , DECL html_attrs, NULL, NULL -}, -{ "del", 0, 0, 0, 0, 0, 0, 2, "deleted text ", - DECL html_flow , NULL , DECL edit_attrs , NULL, NULL -}, -{ "dfn", 0, 0, 0, 0, 0, 0, 1, "instance definition", - DECL html_inline , NULL , DECL html_attrs, NULL, NULL -}, -{ "dir", 0, 0, 0, 0, 1, 1, 0, "directory list", - DECL blockli_elt, "li" , NULL, DECL compact_attrs, NULL -}, -{ "div", 0, 0, 0, 0, 0, 0, 0, "generic language/style container", - DECL html_flow, NULL, DECL html_attrs, DECL align_attr, NULL -}, -{ "dl", 0, 0, 0, 0, 0, 0, 0, "definition list ", - DECL dl_contents , "dd" , DECL html_attrs, DECL compact_attr, NULL -}, -{ "dt", 0, 1, 0, 0, 0, 0, 0, "definition term ", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "em", 0, 3, 0, 0, 0, 0, 1, "emphasis", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "fieldset", 0, 0, 0, 0, 0, 0, 0, "form control group ", - DECL fieldset_contents , NULL, DECL html_attrs, NULL, NULL -}, -{ "font", 0, 3, 0, 0, 1, 1, 1, "local change to font ", - DECL html_inline, NULL, NULL, DECL font_attrs, NULL -}, -{ "form", 0, 0, 0, 0, 0, 0, 0, "interactive form ", - DECL form_contents, "fieldset", DECL form_attrs , DECL target_attr, DECL action_attr -}, -{ "frame", 0, 2, 2, 1, 0, 2, 0, "subwindow " , - EMPTY, NULL, NULL, DECL frame_attrs, NULL -}, -{ "frameset", 0, 0, 0, 0, 0, 2, 0, "window subdivision" , - DECL frameset_contents, "noframes" , NULL , DECL frameset_attrs, NULL -}, -{ "h1", 0, 0, 0, 0, 0, 0, 0, "heading ", - DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL -}, -{ "h2", 0, 0, 0, 0, 0, 0, 0, "heading ", - DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL -}, -{ "h3", 0, 0, 0, 0, 0, 0, 0, "heading ", - DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL -}, -{ "h4", 0, 0, 0, 0, 0, 0, 0, "heading ", - DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL -}, -{ "h5", 0, 0, 0, 0, 0, 0, 0, "heading ", - DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL -}, -{ "h6", 0, 0, 0, 0, 0, 0, 0, "heading ", - DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL -}, -{ "head", 1, 1, 0, 0, 0, 0, 0, "document head ", - DECL head_contents, NULL, DECL head_attrs, NULL, NULL -}, -{ "hr", 0, 2, 2, 1, 0, 0, 0, "horizontal rule " , - EMPTY, NULL, DECL html_attrs, DECL hr_depr, NULL -}, -{ "html", 1, 1, 0, 0, 0, 0, 0, "document root element ", - DECL html_content , NULL , DECL i18n_attrs, DECL version_attr, NULL -}, -{ "i", 0, 3, 0, 0, 0, 0, 1, "italic text style", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "iframe", 0, 0, 0, 0, 0, 1, 2, "inline subwindow ", - DECL html_flow, NULL, NULL, DECL iframe_attrs, NULL -}, -{ "img", 0, 2, 2, 1, 0, 0, 1, "embedded image ", - EMPTY, NULL, DECL img_attrs, DECL align_attr, DECL src_alt_attrs -}, -{ "input", 0, 2, 2, 1, 0, 0, 1, "form control ", - EMPTY, NULL, DECL input_attrs , DECL align_attr, NULL -}, -{ "ins", 0, 0, 0, 0, 0, 0, 2, "inserted text", - DECL html_flow, NULL, DECL edit_attrs, NULL, NULL -}, -{ "isindex", 0, 2, 2, 1, 1, 1, 0, "single line prompt ", - EMPTY, NULL, NULL, DECL prompt_attrs, NULL -}, -{ "kbd", 0, 0, 0, 0, 0, 0, 1, "text to be entered by the user", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "label", 0, 0, 0, 0, 0, 0, 1, "form field label text ", - DECL html_inline MODIFIER, NULL, DECL label_attrs , NULL, NULL -}, -{ "legend", 0, 0, 0, 0, 0, 0, 0, "fieldset legend ", - DECL html_inline, NULL, DECL legend_attrs , DECL align_attr, NULL -}, -{ "li", 0, 1, 1, 0, 0, 0, 0, "list item ", - DECL html_flow, NULL, DECL html_attrs, NULL, NULL -}, -{ "link", 0, 2, 2, 1, 0, 0, 0, "a media-independent link ", - EMPTY, NULL, DECL link_attrs, DECL target_attr, NULL -}, -{ "map", 0, 0, 0, 0, 0, 0, 2, "client-side image map ", - DECL map_contents , NULL, DECL html_attrs , NULL, DECL name_attr -}, -{ "menu", 0, 0, 0, 0, 1, 1, 0, "menu list ", - DECL blockli_elt , NULL, NULL, DECL compact_attrs, NULL -}, -{ "meta", 0, 2, 2, 1, 0, 0, 0, "generic metainformation ", - EMPTY, NULL, DECL meta_attrs , NULL , DECL content_attr -}, -{ "noframes", 0, 0, 0, 0, 0, 2, 0, "alternate content container for non frame-based rendering ", - DECL noframes_content, "body" , DECL html_attrs, NULL, NULL -}, -{ "noscript", 0, 0, 0, 0, 0, 0, 0, "alternate content container for non script-based rendering ", - DECL html_flow, "div", DECL html_attrs, NULL, NULL -}, -{ "object", 0, 0, 0, 0, 0, 0, 2, "generic embedded object ", - DECL object_contents , "div" , DECL object_attrs, DECL object_depr, NULL -}, -{ "ol", 0, 0, 0, 0, 0, 0, 0, "ordered list ", - DECL li_elt , "li" , DECL html_attrs, DECL ol_attrs, NULL -}, -{ "optgroup", 0, 0, 0, 0, 0, 0, 0, "option group ", - DECL option_elt , "option", DECL optgroup_attrs, NULL, DECL label_attr -}, -{ "option", 0, 1, 0, 0, 0, 0, 0, "selectable choice " , - DECL html_pcdata, NULL, DECL option_attrs, NULL, NULL -}, -{ "p", 0, 1, 0, 0, 0, 0, 0, "paragraph ", - DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL -}, -{ "param", 0, 2, 2, 1, 0, 0, 0, "named property value ", - EMPTY, NULL, DECL param_attrs, NULL, DECL name_attr -}, -{ "pre", 0, 0, 0, 0, 0, 0, 0, "preformatted text ", - DECL pre_content, NULL, DECL html_attrs, DECL width_attr, NULL -}, -{ "q", 0, 0, 0, 0, 0, 0, 1, "short inline quotation ", - DECL html_inline, NULL, DECL quote_attrs, NULL, NULL -}, -{ "s", 0, 3, 0, 0, 1, 1, 1, "strike-through text style", - DECL html_inline, NULL, NULL, DECL html_attrs, NULL -}, -{ "samp", 0, 0, 0, 0, 0, 0, 1, "sample program output, scripts, etc.", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "script", 0, 0, 0, 0, 0, 0, 2, "script statements ", - DECL html_cdata, NULL, DECL script_attrs, DECL language_attr, DECL type_attr -}, -{ "select", 0, 0, 0, 0, 0, 0, 1, "option selector ", - DECL select_content, NULL, DECL select_attrs, NULL, NULL -}, -{ "small", 0, 3, 0, 0, 0, 0, 1, "small text style", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "span", 0, 0, 0, 0, 0, 0, 1, "generic language/style container ", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "strike", 0, 3, 0, 0, 1, 1, 1, "strike-through text", - DECL html_inline, NULL, NULL, DECL html_attrs, NULL -}, -{ "strong", 0, 3, 0, 0, 0, 0, 1, "strong emphasis", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "style", 0, 0, 0, 0, 0, 0, 0, "style info ", - DECL html_cdata, NULL, DECL style_attrs, NULL, DECL type_attr -}, -{ "sub", 0, 3, 0, 0, 0, 0, 1, "subscript", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "sup", 0, 3, 0, 0, 0, 0, 1, "superscript ", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "table", 0, 0, 0, 0, 0, 0, 0, "", - DECL table_contents , "tr" , DECL table_attrs , DECL table_depr, NULL -}, -{ "tbody", 1, 0, 0, 0, 0, 0, 0, "table body ", - DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL -}, -{ "td", 0, 0, 0, 0, 0, 0, 0, "table data cell", - DECL html_flow, NULL, DECL th_td_attr, DECL th_td_depr, NULL -}, -{ "textarea", 0, 0, 0, 0, 0, 0, 1, "multi-line text field ", - DECL html_pcdata, NULL, DECL textarea_attrs, NULL, DECL rows_cols_attr -}, -{ "tfoot", 0, 1, 0, 0, 0, 0, 0, "table footer ", - DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL -}, -{ "th", 0, 1, 0, 0, 0, 0, 0, "table header cell", - DECL html_flow, NULL, DECL th_td_attr, DECL th_td_depr, NULL -}, -{ "thead", 0, 1, 0, 0, 0, 0, 0, "table header ", - DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL -}, -{ "title", 0, 0, 0, 0, 0, 0, 0, "document title ", - DECL html_pcdata, NULL, DECL i18n_attrs, NULL, NULL -}, -{ "tr", 0, 0, 0, 0, 0, 0, 0, "table row ", - DECL tr_contents , "td" , DECL talign_attrs, DECL bgcolor_attr, NULL -}, -{ "tt", 0, 3, 0, 0, 0, 0, 1, "teletype or monospaced text style", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -}, -{ "u", 0, 3, 0, 0, 1, 1, 1, "underlined text style", - DECL html_inline, NULL, NULL, DECL html_attrs, NULL -}, -{ "ul", 0, 0, 0, 0, 0, 0, 0, "unordered list ", - DECL li_elt , "li" , DECL html_attrs, DECL ul_depr, NULL -}, -{ "var", 0, 0, 0, 0, 0, 0, 1, "instance of a variable or program argument", - DECL html_inline, NULL, DECL html_attrs, NULL, NULL -} -}; - -/* - * start tags that imply the end of current element - */ -static const char * const htmlStartClose[] = { -"form", "form", "p", "hr", "h1", "h2", "h3", "h4", "h5", "h6", - "dl", "ul", "ol", "menu", "dir", "address", "pre", - "listing", "xmp", "head", NULL, -"head", "p", NULL, -"title", "p", NULL, -"body", "head", "style", "link", "title", "p", NULL, -"frameset", "head", "style", "link", "title", "p", NULL, -"li", "p", "h1", "h2", "h3", "h4", "h5", "h6", "dl", "address", - "pre", "listing", "xmp", "head", "li", NULL, -"hr", "p", "head", NULL, -"h1", "p", "head", NULL, -"h2", "p", "head", NULL, -"h3", "p", "head", NULL, -"h4", "p", "head", NULL, -"h5", "p", "head", NULL, -"h6", "p", "head", NULL, -"dir", "p", "head", NULL, -"address", "p", "head", "ul", NULL, -"pre", "p", "head", "ul", NULL, -"listing", "p", "head", NULL, -"xmp", "p", "head", NULL, -"blockquote", "p", "head", NULL, -"dl", "p", "dt", "menu", "dir", "address", "pre", "listing", - "xmp", "head", NULL, -"dt", "p", "menu", "dir", "address", "pre", "listing", "xmp", - "head", "dd", NULL, -"dd", "p", "menu", "dir", "address", "pre", "listing", "xmp", - "head", "dt", NULL, -"ul", "p", "head", "ol", "menu", "dir", "address", "pre", - "listing", "xmp", NULL, -"ol", "p", "head", "ul", NULL, -"menu", "p", "head", "ul", NULL, -"p", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", NULL, -"div", "p", "head", NULL, -"noscript", "p", "head", NULL, -"center", "font", "b", "i", "p", "head", NULL, -"a", "a", NULL, -"caption", "p", NULL, -"colgroup", "caption", "colgroup", "col", "p", NULL, -"col", "caption", "col", "p", NULL, -"table", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", "pre", - "listing", "xmp", "a", NULL, -"th", "th", "td", "p", "span", "font", "a", "b", "i", "u", NULL, -"td", "th", "td", "p", "span", "font", "a", "b", "i", "u", NULL, -"tr", "th", "td", "tr", "caption", "col", "colgroup", "p", NULL, -"thead", "caption", "col", "colgroup", NULL, -"tfoot", "th", "td", "tr", "caption", "col", "colgroup", "thead", - "tbody", "p", NULL, -"tbody", "th", "td", "tr", "caption", "col", "colgroup", "thead", - "tfoot", "tbody", "p", NULL, -"optgroup", "option", NULL, -"option", "option", NULL, -"fieldset", "legend", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", - "pre", "listing", "xmp", "a", NULL, -NULL -}; - -/* - * The list of HTML elements which are supposed not to have - * CDATA content and where a p element will be implied - * - * TODO: extend that list by reading the HTML SGML DTD on - * implied paragraph - */ -static const char *const htmlNoContentElements[] = { - "html", - "head", - NULL -}; - -/* - * The list of HTML attributes which are of content %Script; - * NOTE: when adding ones, check htmlIsScriptAttribute() since - * it assumes the name starts with 'on' - */ -static const char *const htmlScriptAttributes[] = { - "onclick", - "ondblclick", - "onmousedown", - "onmouseup", - "onmouseover", - "onmousemove", - "onmouseout", - "onkeypress", - "onkeydown", - "onkeyup", - "onload", - "onunload", - "onfocus", - "onblur", - "onsubmit", - "onrest", - "onchange", - "onselect" -}; - -/* - * This table is used by the htmlparser to know what to do with - * broken html pages. By assigning different priorities to different - * elements the parser can decide how to handle extra endtags. - * Endtags are only allowed to close elements with lower or equal - * priority. - */ - -typedef struct { - const char *name; - int priority; -} elementPriority; - -static const elementPriority htmlEndPriority[] = { - {"div", 150}, - {"td", 160}, - {"th", 160}, - {"tr", 170}, - {"thead", 180}, - {"tbody", 180}, - {"tfoot", 180}, - {"table", 190}, - {"head", 200}, - {"body", 200}, - {"html", 220}, - {NULL, 100} /* Default priority */ -}; - -static const char** htmlStartCloseIndex[100]; -static int htmlStartCloseIndexinitialized = 0; - -/************************************************************************ - * * - * functions to handle HTML specific data * - * * - ************************************************************************/ - -/** - * htmlInitAutoClose: - * - * Initialize the htmlStartCloseIndex for fast lookup of closing tags names. - * This is not reentrant. Call xmlInitParser() once before processing in - * case of use in multithreaded programs. - */ -void -htmlInitAutoClose(void) { - int indx, i = 0; - - if (htmlStartCloseIndexinitialized) return; - - for (indx = 0;indx < 100;indx ++) htmlStartCloseIndex[indx] = NULL; - indx = 0; - while ((htmlStartClose[i] != NULL) && (indx < 100 - 1)) { - htmlStartCloseIndex[indx++] = (const char**) &htmlStartClose[i]; - while (htmlStartClose[i] != NULL) i++; - i++; - } - htmlStartCloseIndexinitialized = 1; -} - -/** - * htmlTagLookup: - * @tag: The tag name in lowercase - * - * Lookup the HTML tag in the ElementTable - * - * Returns the related htmlElemDescPtr or NULL if not found. - */ -const htmlElemDesc * -htmlTagLookup(const xmlChar *tag) { - unsigned int i; - - for (i = 0; i < (sizeof(html40ElementTable) / - sizeof(html40ElementTable[0]));i++) { - if (!xmlStrcasecmp(tag, BAD_CAST html40ElementTable[i].name)) - return((htmlElemDescPtr) &html40ElementTable[i]); - } - return(NULL); -} - -/** - * htmlGetEndPriority: - * @name: The name of the element to look up the priority for. - * - * Return value: The "endtag" priority. - **/ -static int -htmlGetEndPriority (const xmlChar *name) { - int i = 0; - - while ((htmlEndPriority[i].name != NULL) && - (!xmlStrEqual((const xmlChar *)htmlEndPriority[i].name, name))) - i++; - - return(htmlEndPriority[i].priority); -} - - -/** - * htmlCheckAutoClose: - * @newtag: The new tag name - * @oldtag: The old tag name - * - * Checks whether the new tag is one of the registered valid tags for - * closing old. - * Initialize the htmlStartCloseIndex for fast lookup of closing tags names. - * - * Returns 0 if no, 1 if yes. - */ -static int -htmlCheckAutoClose(const xmlChar * newtag, const xmlChar * oldtag) -{ - int i, indx; - const char **closed = NULL; - - if (htmlStartCloseIndexinitialized == 0) - htmlInitAutoClose(); - - /* inefficient, but not a big deal */ - for (indx = 0; indx < 100; indx++) { - closed = htmlStartCloseIndex[indx]; - if (closed == NULL) - return (0); - if (xmlStrEqual(BAD_CAST * closed, newtag)) - break; - } - - i = closed - htmlStartClose; - i++; - while (htmlStartClose[i] != NULL) { - if (xmlStrEqual(BAD_CAST htmlStartClose[i], oldtag)) { - return (1); - } - i++; - } - return (0); -} - -/** - * htmlAutoCloseOnClose: - * @ctxt: an HTML parser context - * @newtag: The new tag name - * @force: force the tag closure - * - * The HTML DTD allows an ending tag to implicitly close other tags. - */ -static void -htmlAutoCloseOnClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) -{ - const htmlElemDesc *info; - int i, priority; - - priority = htmlGetEndPriority(newtag); - - for (i = (ctxt->nameNr - 1); i >= 0; i--) { - - if (xmlStrEqual(newtag, ctxt->nameTab[i])) - break; - /* - * A missplaced endtag can only close elements with lower - * or equal priority, so if we find an element with higher - * priority before we find an element with - * matching name, we just ignore this endtag - */ - if (htmlGetEndPriority(ctxt->nameTab[i]) > priority) - return; - } - if (i < 0) - return; - - while (!xmlStrEqual(newtag, ctxt->name)) { - info = htmlTagLookup(ctxt->name); - if ((info != NULL) && (info->endTag == 3)) { - htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, - "Opening and ending tag mismatch: %s and %s\n", - newtag, ctxt->name); - } - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, ctxt->name); - htmlnamePop(ctxt); - } -} - -/** - * htmlAutoCloseOnEnd: - * @ctxt: an HTML parser context - * - * Close all remaining tags at the end of the stream - */ -static void -htmlAutoCloseOnEnd(htmlParserCtxtPtr ctxt) -{ - int i; - - if (ctxt->nameNr == 0) - return; - for (i = (ctxt->nameNr - 1); i >= 0; i--) { - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, ctxt->name); - htmlnamePop(ctxt); - } -} - -/** - * htmlAutoClose: - * @ctxt: an HTML parser context - * @newtag: The new tag name or NULL - * - * The HTML DTD allows a tag to implicitly close other tags. - * The list is kept in htmlStartClose array. This function is - * called when a new tag has been detected and generates the - * appropriates closes if possible/needed. - * If newtag is NULL this mean we are at the end of the resource - * and we should check - */ -static void -htmlAutoClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) -{ - while ((newtag != NULL) && (ctxt->name != NULL) && - (htmlCheckAutoClose(newtag, ctxt->name))) { - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, ctxt->name); - htmlnamePop(ctxt); - } - if (newtag == NULL) { - htmlAutoCloseOnEnd(ctxt); - return; - } - while ((newtag == NULL) && (ctxt->name != NULL) && - ((xmlStrEqual(ctxt->name, BAD_CAST "head")) || - (xmlStrEqual(ctxt->name, BAD_CAST "body")) || - (xmlStrEqual(ctxt->name, BAD_CAST "html")))) { - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, ctxt->name); - htmlnamePop(ctxt); - } -} - -/** - * htmlAutoCloseTag: - * @doc: the HTML document - * @name: The tag name - * @elem: the HTML element - * - * The HTML DTD allows a tag to implicitly close other tags. - * The list is kept in htmlStartClose array. This function checks - * if the element or one of it's children would autoclose the - * given tag. - * - * Returns 1 if autoclose, 0 otherwise - */ -int -htmlAutoCloseTag(htmlDocPtr doc, const xmlChar *name, htmlNodePtr elem) { - htmlNodePtr child; - - if (elem == NULL) return(1); - if (xmlStrEqual(name, elem->name)) return(0); - if (htmlCheckAutoClose(elem->name, name)) return(1); - child = elem->children; - while (child != NULL) { - if (htmlAutoCloseTag(doc, name, child)) return(1); - child = child->next; - } - return(0); -} - -/** - * htmlIsAutoClosed: - * @doc: the HTML document - * @elem: the HTML element - * - * The HTML DTD allows a tag to implicitly close other tags. - * The list is kept in htmlStartClose array. This function checks - * if a tag is autoclosed by one of it's child - * - * Returns 1 if autoclosed, 0 otherwise - */ -int -htmlIsAutoClosed(htmlDocPtr doc, htmlNodePtr elem) { - htmlNodePtr child; - - if (elem == NULL) return(1); - child = elem->children; - while (child != NULL) { - if (htmlAutoCloseTag(doc, elem->name, child)) return(1); - child = child->next; - } - return(0); -} - -/** - * htmlCheckImplied: - * @ctxt: an HTML parser context - * @newtag: The new tag name - * - * The HTML DTD allows a tag to exists only implicitly - * called when a new tag has been detected and generates the - * appropriates implicit tags if missing - */ -static void -htmlCheckImplied(htmlParserCtxtPtr ctxt, const xmlChar *newtag) { - if (!htmlOmittedDefaultValue) - return; - if (xmlStrEqual(newtag, BAD_CAST"html")) - return; - if (ctxt->nameNr <= 0) { - htmlnamePush(ctxt, BAD_CAST"html"); - if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) - ctxt->sax->startElement(ctxt->userData, BAD_CAST"html", NULL); - } - if ((xmlStrEqual(newtag, BAD_CAST"body")) || (xmlStrEqual(newtag, BAD_CAST"head"))) - return; - if ((ctxt->nameNr <= 1) && - ((xmlStrEqual(newtag, BAD_CAST"script")) || - (xmlStrEqual(newtag, BAD_CAST"style")) || - (xmlStrEqual(newtag, BAD_CAST"meta")) || - (xmlStrEqual(newtag, BAD_CAST"link")) || - (xmlStrEqual(newtag, BAD_CAST"title")) || - (xmlStrEqual(newtag, BAD_CAST"base")))) { - /* - * dropped OBJECT ... i you put it first BODY will be - * assumed ! - */ - htmlnamePush(ctxt, BAD_CAST"head"); - if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) - ctxt->sax->startElement(ctxt->userData, BAD_CAST"head", NULL); - } else if ((!xmlStrEqual(newtag, BAD_CAST"noframes")) && - (!xmlStrEqual(newtag, BAD_CAST"frame")) && - (!xmlStrEqual(newtag, BAD_CAST"frameset"))) { - int i; - for (i = 0;i < ctxt->nameNr;i++) { - if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"body")) { - return; - } - if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"head")) { - return; - } - } - - htmlnamePush(ctxt, BAD_CAST"body"); - if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) - ctxt->sax->startElement(ctxt->userData, BAD_CAST"body", NULL); - } -} - -/** - * htmlCheckParagraph - * @ctxt: an HTML parser context - * - * Check whether a p element need to be implied before inserting - * characters in the current element. - * - * Returns 1 if a paragraph has been inserted, 0 if not and -1 - * in case of error. - */ - -static int -htmlCheckParagraph(htmlParserCtxtPtr ctxt) { - const xmlChar *tag; - int i; - - if (ctxt == NULL) - return(-1); - tag = ctxt->name; - if (tag == NULL) { - htmlAutoClose(ctxt, BAD_CAST"p"); - htmlCheckImplied(ctxt, BAD_CAST"p"); - htmlnamePush(ctxt, BAD_CAST"p"); - if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) - ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL); - return(1); - } - if (!htmlOmittedDefaultValue) - return(0); - for (i = 0; htmlNoContentElements[i] != NULL; i++) { - if (xmlStrEqual(tag, BAD_CAST htmlNoContentElements[i])) { - htmlAutoClose(ctxt, BAD_CAST"p"); - htmlCheckImplied(ctxt, BAD_CAST"p"); - htmlnamePush(ctxt, BAD_CAST"p"); - if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) - ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL); - return(1); - } - } - return(0); -} - -/** - * htmlIsScriptAttribute: - * @name: an attribute name - * - * Check if an attribute is of content type Script - * - * Returns 1 is the attribute is a script 0 otherwise - */ -int -htmlIsScriptAttribute(const xmlChar *name) { - unsigned int i; - - if (name == NULL) - return(0); - /* - * all script attributes start with 'on' - */ - if ((name[0] != 'o') || (name[1] != 'n')) - return(0); - for (i = 0; - i < sizeof(htmlScriptAttributes)/sizeof(htmlScriptAttributes[0]); - i++) { - if (xmlStrEqual(name, (const xmlChar *) htmlScriptAttributes[i])) - return(1); - } - return(0); -} - -/************************************************************************ - * * - * The list of HTML predefined entities * - * * - ************************************************************************/ - - -static const htmlEntityDesc html40EntitiesTable[] = { -/* - * the 4 absolute ones, plus apostrophe. - */ -{ 34, "quot", "quotation mark = APL quote, U+0022 ISOnum" }, -{ 38, "amp", "ampersand, U+0026 ISOnum" }, -{ 39, "apos", "single quote" }, -{ 60, "lt", "less-than sign, U+003C ISOnum" }, -{ 62, "gt", "greater-than sign, U+003E ISOnum" }, - -/* - * A bunch still in the 128-255 range - * Replacing them depend really on the charset used. - */ -{ 160, "nbsp", "no-break space = non-breaking space, U+00A0 ISOnum" }, -{ 161, "iexcl","inverted exclamation mark, U+00A1 ISOnum" }, -{ 162, "cent", "cent sign, U+00A2 ISOnum" }, -{ 163, "pound","pound sign, U+00A3 ISOnum" }, -{ 164, "curren","currency sign, U+00A4 ISOnum" }, -{ 165, "yen", "yen sign = yuan sign, U+00A5 ISOnum" }, -{ 166, "brvbar","broken bar = broken vertical bar, U+00A6 ISOnum" }, -{ 167, "sect", "section sign, U+00A7 ISOnum" }, -{ 168, "uml", "diaeresis = spacing diaeresis, U+00A8 ISOdia" }, -{ 169, "copy", "copyright sign, U+00A9 ISOnum" }, -{ 170, "ordf", "feminine ordinal indicator, U+00AA ISOnum" }, -{ 171, "laquo","left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum" }, -{ 172, "not", "not sign, U+00AC ISOnum" }, -{ 173, "shy", "soft hyphen = discretionary hyphen, U+00AD ISOnum" }, -{ 174, "reg", "registered sign = registered trade mark sign, U+00AE ISOnum" }, -{ 175, "macr", "macron = spacing macron = overline = APL overbar, U+00AF ISOdia" }, -{ 176, "deg", "degree sign, U+00B0 ISOnum" }, -{ 177, "plusmn","plus-minus sign = plus-or-minus sign, U+00B1 ISOnum" }, -{ 178, "sup2", "superscript two = superscript digit two = squared, U+00B2 ISOnum" }, -{ 179, "sup3", "superscript three = superscript digit three = cubed, U+00B3 ISOnum" }, -{ 180, "acute","acute accent = spacing acute, U+00B4 ISOdia" }, -{ 181, "micro","micro sign, U+00B5 ISOnum" }, -{ 182, "para", "pilcrow sign = paragraph sign, U+00B6 ISOnum" }, -{ 183, "middot","middle dot = Georgian comma Greek middle dot, U+00B7 ISOnum" }, -{ 184, "cedil","cedilla = spacing cedilla, U+00B8 ISOdia" }, -{ 185, "sup1", "superscript one = superscript digit one, U+00B9 ISOnum" }, -{ 186, "ordm", "masculine ordinal indicator, U+00BA ISOnum" }, -{ 187, "raquo","right-pointing double angle quotation mark right pointing guillemet, U+00BB ISOnum" }, -{ 188, "frac14","vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum" }, -{ 189, "frac12","vulgar fraction one half = fraction one half, U+00BD ISOnum" }, -{ 190, "frac34","vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum" }, -{ 191, "iquest","inverted question mark = turned question mark, U+00BF ISOnum" }, -{ 192, "Agrave","latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1" }, -{ 193, "Aacute","latin capital letter A with acute, U+00C1 ISOlat1" }, -{ 194, "Acirc","latin capital letter A with circumflex, U+00C2 ISOlat1" }, -{ 195, "Atilde","latin capital letter A with tilde, U+00C3 ISOlat1" }, -{ 196, "Auml", "latin capital letter A with diaeresis, U+00C4 ISOlat1" }, -{ 197, "Aring","latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1" }, -{ 198, "AElig","latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1" }, -{ 199, "Ccedil","latin capital letter C with cedilla, U+00C7 ISOlat1" }, -{ 200, "Egrave","latin capital letter E with grave, U+00C8 ISOlat1" }, -{ 201, "Eacute","latin capital letter E with acute, U+00C9 ISOlat1" }, -{ 202, "Ecirc","latin capital letter E with circumflex, U+00CA ISOlat1" }, -{ 203, "Euml", "latin capital letter E with diaeresis, U+00CB ISOlat1" }, -{ 204, "Igrave","latin capital letter I with grave, U+00CC ISOlat1" }, -{ 205, "Iacute","latin capital letter I with acute, U+00CD ISOlat1" }, -{ 206, "Icirc","latin capital letter I with circumflex, U+00CE ISOlat1" }, -{ 207, "Iuml", "latin capital letter I with diaeresis, U+00CF ISOlat1" }, -{ 208, "ETH", "latin capital letter ETH, U+00D0 ISOlat1" }, -{ 209, "Ntilde","latin capital letter N with tilde, U+00D1 ISOlat1" }, -{ 210, "Ograve","latin capital letter O with grave, U+00D2 ISOlat1" }, -{ 211, "Oacute","latin capital letter O with acute, U+00D3 ISOlat1" }, -{ 212, "Ocirc","latin capital letter O with circumflex, U+00D4 ISOlat1" }, -{ 213, "Otilde","latin capital letter O with tilde, U+00D5 ISOlat1" }, -{ 214, "Ouml", "latin capital letter O with diaeresis, U+00D6 ISOlat1" }, -{ 215, "times","multiplication sign, U+00D7 ISOnum" }, -{ 216, "Oslash","latin capital letter O with stroke latin capital letter O slash, U+00D8 ISOlat1" }, -{ 217, "Ugrave","latin capital letter U with grave, U+00D9 ISOlat1" }, -{ 218, "Uacute","latin capital letter U with acute, U+00DA ISOlat1" }, -{ 219, "Ucirc","latin capital letter U with circumflex, U+00DB ISOlat1" }, -{ 220, "Uuml", "latin capital letter U with diaeresis, U+00DC ISOlat1" }, -{ 221, "Yacute","latin capital letter Y with acute, U+00DD ISOlat1" }, -{ 222, "THORN","latin capital letter THORN, U+00DE ISOlat1" }, -{ 223, "szlig","latin small letter sharp s = ess-zed, U+00DF ISOlat1" }, -{ 224, "agrave","latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1" }, -{ 225, "aacute","latin small letter a with acute, U+00E1 ISOlat1" }, -{ 226, "acirc","latin small letter a with circumflex, U+00E2 ISOlat1" }, -{ 227, "atilde","latin small letter a with tilde, U+00E3 ISOlat1" }, -{ 228, "auml", "latin small letter a with diaeresis, U+00E4 ISOlat1" }, -{ 229, "aring","latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1" }, -{ 230, "aelig","latin small letter ae = latin small ligature ae, U+00E6 ISOlat1" }, -{ 231, "ccedil","latin small letter c with cedilla, U+00E7 ISOlat1" }, -{ 232, "egrave","latin small letter e with grave, U+00E8 ISOlat1" }, -{ 233, "eacute","latin small letter e with acute, U+00E9 ISOlat1" }, -{ 234, "ecirc","latin small letter e with circumflex, U+00EA ISOlat1" }, -{ 235, "euml", "latin small letter e with diaeresis, U+00EB ISOlat1" }, -{ 236, "igrave","latin small letter i with grave, U+00EC ISOlat1" }, -{ 237, "iacute","latin small letter i with acute, U+00ED ISOlat1" }, -{ 238, "icirc","latin small letter i with circumflex, U+00EE ISOlat1" }, -{ 239, "iuml", "latin small letter i with diaeresis, U+00EF ISOlat1" }, -{ 240, "eth", "latin small letter eth, U+00F0 ISOlat1" }, -{ 241, "ntilde","latin small letter n with tilde, U+00F1 ISOlat1" }, -{ 242, "ograve","latin small letter o with grave, U+00F2 ISOlat1" }, -{ 243, "oacute","latin small letter o with acute, U+00F3 ISOlat1" }, -{ 244, "ocirc","latin small letter o with circumflex, U+00F4 ISOlat1" }, -{ 245, "otilde","latin small letter o with tilde, U+00F5 ISOlat1" }, -{ 246, "ouml", "latin small letter o with diaeresis, U+00F6 ISOlat1" }, -{ 247, "divide","division sign, U+00F7 ISOnum" }, -{ 248, "oslash","latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1" }, -{ 249, "ugrave","latin small letter u with grave, U+00F9 ISOlat1" }, -{ 250, "uacute","latin small letter u with acute, U+00FA ISOlat1" }, -{ 251, "ucirc","latin small letter u with circumflex, U+00FB ISOlat1" }, -{ 252, "uuml", "latin small letter u with diaeresis, U+00FC ISOlat1" }, -{ 253, "yacute","latin small letter y with acute, U+00FD ISOlat1" }, -{ 254, "thorn","latin small letter thorn with, U+00FE ISOlat1" }, -{ 255, "yuml", "latin small letter y with diaeresis, U+00FF ISOlat1" }, - -{ 338, "OElig","latin capital ligature OE, U+0152 ISOlat2" }, -{ 339, "oelig","latin small ligature oe, U+0153 ISOlat2" }, -{ 352, "Scaron","latin capital letter S with caron, U+0160 ISOlat2" }, -{ 353, "scaron","latin small letter s with caron, U+0161 ISOlat2" }, -{ 376, "Yuml", "latin capital letter Y with diaeresis, U+0178 ISOlat2" }, - -/* - * Anything below should really be kept as entities references - */ -{ 402, "fnof", "latin small f with hook = function = florin, U+0192 ISOtech" }, - -{ 710, "circ", "modifier letter circumflex accent, U+02C6 ISOpub" }, -{ 732, "tilde","small tilde, U+02DC ISOdia" }, - -{ 913, "Alpha","greek capital letter alpha, U+0391" }, -{ 914, "Beta", "greek capital letter beta, U+0392" }, -{ 915, "Gamma","greek capital letter gamma, U+0393 ISOgrk3" }, -{ 916, "Delta","greek capital letter delta, U+0394 ISOgrk3" }, -{ 917, "Epsilon","greek capital letter epsilon, U+0395" }, -{ 918, "Zeta", "greek capital letter zeta, U+0396" }, -{ 919, "Eta", "greek capital letter eta, U+0397" }, -{ 920, "Theta","greek capital letter theta, U+0398 ISOgrk3" }, -{ 921, "Iota", "greek capital letter iota, U+0399" }, -{ 922, "Kappa","greek capital letter kappa, U+039A" }, -{ 923, "Lambda", "greek capital letter lambda, U+039B ISOgrk3" }, -{ 924, "Mu", "greek capital letter mu, U+039C" }, -{ 925, "Nu", "greek capital letter nu, U+039D" }, -{ 926, "Xi", "greek capital letter xi, U+039E ISOgrk3" }, -{ 927, "Omicron","greek capital letter omicron, U+039F" }, -{ 928, "Pi", "greek capital letter pi, U+03A0 ISOgrk3" }, -{ 929, "Rho", "greek capital letter rho, U+03A1" }, -{ 931, "Sigma","greek capital letter sigma, U+03A3 ISOgrk3" }, -{ 932, "Tau", "greek capital letter tau, U+03A4" }, -{ 933, "Upsilon","greek capital letter upsilon, U+03A5 ISOgrk3" }, -{ 934, "Phi", "greek capital letter phi, U+03A6 ISOgrk3" }, -{ 935, "Chi", "greek capital letter chi, U+03A7" }, -{ 936, "Psi", "greek capital letter psi, U+03A8 ISOgrk3" }, -{ 937, "Omega","greek capital letter omega, U+03A9 ISOgrk3" }, - -{ 945, "alpha","greek small letter alpha, U+03B1 ISOgrk3" }, -{ 946, "beta", "greek small letter beta, U+03B2 ISOgrk3" }, -{ 947, "gamma","greek small letter gamma, U+03B3 ISOgrk3" }, -{ 948, "delta","greek small letter delta, U+03B4 ISOgrk3" }, -{ 949, "epsilon","greek small letter epsilon, U+03B5 ISOgrk3" }, -{ 950, "zeta", "greek small letter zeta, U+03B6 ISOgrk3" }, -{ 951, "eta", "greek small letter eta, U+03B7 ISOgrk3" }, -{ 952, "theta","greek small letter theta, U+03B8 ISOgrk3" }, -{ 953, "iota", "greek small letter iota, U+03B9 ISOgrk3" }, -{ 954, "kappa","greek small letter kappa, U+03BA ISOgrk3" }, -{ 955, "lambda","greek small letter lambda, U+03BB ISOgrk3" }, -{ 956, "mu", "greek small letter mu, U+03BC ISOgrk3" }, -{ 957, "nu", "greek small letter nu, U+03BD ISOgrk3" }, -{ 958, "xi", "greek small letter xi, U+03BE ISOgrk3" }, -{ 959, "omicron","greek small letter omicron, U+03BF NEW" }, -{ 960, "pi", "greek small letter pi, U+03C0 ISOgrk3" }, -{ 961, "rho", "greek small letter rho, U+03C1 ISOgrk3" }, -{ 962, "sigmaf","greek small letter final sigma, U+03C2 ISOgrk3" }, -{ 963, "sigma","greek small letter sigma, U+03C3 ISOgrk3" }, -{ 964, "tau", "greek small letter tau, U+03C4 ISOgrk3" }, -{ 965, "upsilon","greek small letter upsilon, U+03C5 ISOgrk3" }, -{ 966, "phi", "greek small letter phi, U+03C6 ISOgrk3" }, -{ 967, "chi", "greek small letter chi, U+03C7 ISOgrk3" }, -{ 968, "psi", "greek small letter psi, U+03C8 ISOgrk3" }, -{ 969, "omega","greek small letter omega, U+03C9 ISOgrk3" }, -{ 977, "thetasym","greek small letter theta symbol, U+03D1 NEW" }, -{ 978, "upsih","greek upsilon with hook symbol, U+03D2 NEW" }, -{ 982, "piv", "greek pi symbol, U+03D6 ISOgrk3" }, - -{ 8194, "ensp", "en space, U+2002 ISOpub" }, -{ 8195, "emsp", "em space, U+2003 ISOpub" }, -{ 8201, "thinsp","thin space, U+2009 ISOpub" }, -{ 8204, "zwnj", "zero width non-joiner, U+200C NEW RFC 2070" }, -{ 8205, "zwj", "zero width joiner, U+200D NEW RFC 2070" }, -{ 8206, "lrm", "left-to-right mark, U+200E NEW RFC 2070" }, -{ 8207, "rlm", "right-to-left mark, U+200F NEW RFC 2070" }, -{ 8211, "ndash","en dash, U+2013 ISOpub" }, -{ 8212, "mdash","em dash, U+2014 ISOpub" }, -{ 8216, "lsquo","left single quotation mark, U+2018 ISOnum" }, -{ 8217, "rsquo","right single quotation mark, U+2019 ISOnum" }, -{ 8218, "sbquo","single low-9 quotation mark, U+201A NEW" }, -{ 8220, "ldquo","left double quotation mark, U+201C ISOnum" }, -{ 8221, "rdquo","right double quotation mark, U+201D ISOnum" }, -{ 8222, "bdquo","double low-9 quotation mark, U+201E NEW" }, -{ 8224, "dagger","dagger, U+2020 ISOpub" }, -{ 8225, "Dagger","double dagger, U+2021 ISOpub" }, - -{ 8226, "bull", "bullet = black small circle, U+2022 ISOpub" }, -{ 8230, "hellip","horizontal ellipsis = three dot leader, U+2026 ISOpub" }, - -{ 8240, "permil","per mille sign, U+2030 ISOtech" }, - -{ 8242, "prime","prime = minutes = feet, U+2032 ISOtech" }, -{ 8243, "Prime","double prime = seconds = inches, U+2033 ISOtech" }, - -{ 8249, "lsaquo","single left-pointing angle quotation mark, U+2039 ISO proposed" }, -{ 8250, "rsaquo","single right-pointing angle quotation mark, U+203A ISO proposed" }, - -{ 8254, "oline","overline = spacing overscore, U+203E NEW" }, -{ 8260, "frasl","fraction slash, U+2044 NEW" }, - -{ 8364, "euro", "euro sign, U+20AC NEW" }, - -{ 8465, "image","blackletter capital I = imaginary part, U+2111 ISOamso" }, -{ 8472, "weierp","script capital P = power set = Weierstrass p, U+2118 ISOamso" }, -{ 8476, "real", "blackletter capital R = real part symbol, U+211C ISOamso" }, -{ 8482, "trade","trade mark sign, U+2122 ISOnum" }, -{ 8501, "alefsym","alef symbol = first transfinite cardinal, U+2135 NEW" }, -{ 8592, "larr", "leftwards arrow, U+2190 ISOnum" }, -{ 8593, "uarr", "upwards arrow, U+2191 ISOnum" }, -{ 8594, "rarr", "rightwards arrow, U+2192 ISOnum" }, -{ 8595, "darr", "downwards arrow, U+2193 ISOnum" }, -{ 8596, "harr", "left right arrow, U+2194 ISOamsa" }, -{ 8629, "crarr","downwards arrow with corner leftwards = carriage return, U+21B5 NEW" }, -{ 8656, "lArr", "leftwards double arrow, U+21D0 ISOtech" }, -{ 8657, "uArr", "upwards double arrow, U+21D1 ISOamsa" }, -{ 8658, "rArr", "rightwards double arrow, U+21D2 ISOtech" }, -{ 8659, "dArr", "downwards double arrow, U+21D3 ISOamsa" }, -{ 8660, "hArr", "left right double arrow, U+21D4 ISOamsa" }, - -{ 8704, "forall","for all, U+2200 ISOtech" }, -{ 8706, "part", "partial differential, U+2202 ISOtech" }, -{ 8707, "exist","there exists, U+2203 ISOtech" }, -{ 8709, "empty","empty set = null set = diameter, U+2205 ISOamso" }, -{ 8711, "nabla","nabla = backward difference, U+2207 ISOtech" }, -{ 8712, "isin", "element of, U+2208 ISOtech" }, -{ 8713, "notin","not an element of, U+2209 ISOtech" }, -{ 8715, "ni", "contains as member, U+220B ISOtech" }, -{ 8719, "prod", "n-ary product = product sign, U+220F ISOamsb" }, -{ 8721, "sum", "n-ary summation, U+2211 ISOamsb" }, -{ 8722, "minus","minus sign, U+2212 ISOtech" }, -{ 8727, "lowast","asterisk operator, U+2217 ISOtech" }, -{ 8730, "radic","square root = radical sign, U+221A ISOtech" }, -{ 8733, "prop", "proportional to, U+221D ISOtech" }, -{ 8734, "infin","infinity, U+221E ISOtech" }, -{ 8736, "ang", "angle, U+2220 ISOamso" }, -{ 8743, "and", "logical and = wedge, U+2227 ISOtech" }, -{ 8744, "or", "logical or = vee, U+2228 ISOtech" }, -{ 8745, "cap", "intersection = cap, U+2229 ISOtech" }, -{ 8746, "cup", "union = cup, U+222A ISOtech" }, -{ 8747, "int", "integral, U+222B ISOtech" }, -{ 8756, "there4","therefore, U+2234 ISOtech" }, -{ 8764, "sim", "tilde operator = varies with = similar to, U+223C ISOtech" }, -{ 8773, "cong", "approximately equal to, U+2245 ISOtech" }, -{ 8776, "asymp","almost equal to = asymptotic to, U+2248 ISOamsr" }, -{ 8800, "ne", "not equal to, U+2260 ISOtech" }, -{ 8801, "equiv","identical to, U+2261 ISOtech" }, -{ 8804, "le", "less-than or equal to, U+2264 ISOtech" }, -{ 8805, "ge", "greater-than or equal to, U+2265 ISOtech" }, -{ 8834, "sub", "subset of, U+2282 ISOtech" }, -{ 8835, "sup", "superset of, U+2283 ISOtech" }, -{ 8836, "nsub", "not a subset of, U+2284 ISOamsn" }, -{ 8838, "sube", "subset of or equal to, U+2286 ISOtech" }, -{ 8839, "supe", "superset of or equal to, U+2287 ISOtech" }, -{ 8853, "oplus","circled plus = direct sum, U+2295 ISOamsb" }, -{ 8855, "otimes","circled times = vector product, U+2297 ISOamsb" }, -{ 8869, "perp", "up tack = orthogonal to = perpendicular, U+22A5 ISOtech" }, -{ 8901, "sdot", "dot operator, U+22C5 ISOamsb" }, -{ 8968, "lceil","left ceiling = apl upstile, U+2308 ISOamsc" }, -{ 8969, "rceil","right ceiling, U+2309 ISOamsc" }, -{ 8970, "lfloor","left floor = apl downstile, U+230A ISOamsc" }, -{ 8971, "rfloor","right floor, U+230B ISOamsc" }, -{ 9001, "lang", "left-pointing angle bracket = bra, U+2329 ISOtech" }, -{ 9002, "rang", "right-pointing angle bracket = ket, U+232A ISOtech" }, -{ 9674, "loz", "lozenge, U+25CA ISOpub" }, - -{ 9824, "spades","black spade suit, U+2660 ISOpub" }, -{ 9827, "clubs","black club suit = shamrock, U+2663 ISOpub" }, -{ 9829, "hearts","black heart suit = valentine, U+2665 ISOpub" }, -{ 9830, "diams","black diamond suit, U+2666 ISOpub" }, - -}; - -/************************************************************************ - * * - * Commodity functions to handle entities * - * * - ************************************************************************/ - -/* - * Macro used to grow the current buffer. - */ -#define growBuffer(buffer) { \ - xmlChar *tmp; \ - buffer##_size *= 2; \ - tmp = (xmlChar *) xmlRealloc(buffer, buffer##_size * sizeof(xmlChar)); \ - if (tmp == NULL) { \ - htmlErrMemory(ctxt, "growing buffer\n"); \ - xmlFree(buffer); \ - return(NULL); \ - } \ - buffer = tmp; \ -} - -/** - * htmlEntityLookup: - * @name: the entity name - * - * Lookup the given entity in EntitiesTable - * - * TODO: the linear scan is really ugly, an hash table is really needed. - * - * Returns the associated htmlEntityDescPtr if found, NULL otherwise. - */ -const htmlEntityDesc * -htmlEntityLookup(const xmlChar *name) { - unsigned int i; - - for (i = 0;i < (sizeof(html40EntitiesTable)/ - sizeof(html40EntitiesTable[0]));i++) { - if (xmlStrEqual(name, BAD_CAST html40EntitiesTable[i].name)) { - return((htmlEntityDescPtr) &html40EntitiesTable[i]); - } - } - return(NULL); -} - -/** - * htmlEntityValueLookup: - * @value: the entity's unicode value - * - * Lookup the given entity in EntitiesTable - * - * TODO: the linear scan is really ugly, an hash table is really needed. - * - * Returns the associated htmlEntityDescPtr if found, NULL otherwise. - */ -const htmlEntityDesc * -htmlEntityValueLookup(unsigned int value) { - unsigned int i; - - for (i = 0;i < (sizeof(html40EntitiesTable)/ - sizeof(html40EntitiesTable[0]));i++) { - if (html40EntitiesTable[i].value >= value) { - if (html40EntitiesTable[i].value > value) - break; - return((htmlEntityDescPtr) &html40EntitiesTable[i]); - } - } - return(NULL); -} - -/** - * UTF8ToHtml: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and try to convert it to an ASCII - * plus HTML entities block of chars out. - * - * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * as the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -int -UTF8ToHtml(unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - const unsigned char* processed = in; - const unsigned char* outend; - const unsigned char* outstart = out; - const unsigned char* instart = in; - const unsigned char* inend; - unsigned int c, d; - int trailing; - - if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); - if (in == NULL) { - /* - * initialization nothing to do - */ - *outlen = 0; - *inlen = 0; - return(0); - } - inend = in + (*inlen); - outend = out + (*outlen); - while (in < inend) { - d = *in++; - if (d < 0x80) { c= d; trailing= 0; } - else if (d < 0xC0) { - /* trailing byte in leading position */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } - else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } - else if (d < 0xF8) { c= d & 0x07; trailing= 3; } - else { - /* no chance for this in Ascii */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - - if (inend - in < trailing) { - break; - } - - for ( ; trailing; trailing--) { - if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) - break; - c <<= 6; - c |= d & 0x3F; - } - - /* assertion: c is a single UTF-4 value */ - if (c < 0x80) { - if (out + 1 >= outend) - break; - *out++ = c; - } else { - int len; - const htmlEntityDesc * ent; - - /* - * Try to lookup a predefined HTML entity for it - */ - - ent = htmlEntityValueLookup(c); - if (ent == NULL) { - /* no chance for this in Ascii */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - len = strlen(ent->name); - if (out + 2 + len >= outend) - break; - *out++ = '&'; - memcpy(out, ent->name, len); - out += len; - *out++ = ';'; - } - processed = in; - } - *outlen = out - outstart; - *inlen = processed - instart; - return(0); -} - -/** - * htmlEncodeEntities: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * @quoteChar: the quote character to escape (' or ") or zero. - * - * Take a block of UTF-8 chars in and try to convert it to an ASCII - * plus HTML entities block of chars out. - * - * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * as the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -int -htmlEncodeEntities(unsigned char* out, int *outlen, - const unsigned char* in, int *inlen, int quoteChar) { - const unsigned char* processed = in; - const unsigned char* outend; - const unsigned char* outstart = out; - const unsigned char* instart = in; - const unsigned char* inend; - unsigned int c, d; - int trailing; - - if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) - return(-1); - outend = out + (*outlen); - inend = in + (*inlen); - while (in < inend) { - d = *in++; - if (d < 0x80) { c= d; trailing= 0; } - else if (d < 0xC0) { - /* trailing byte in leading position */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } - else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } - else if (d < 0xF8) { c= d & 0x07; trailing= 3; } - else { - /* no chance for this in Ascii */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - - if (inend - in < trailing) - break; - - while (trailing--) { - if (((d= *in++) & 0xC0) != 0x80) { - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - c <<= 6; - c |= d & 0x3F; - } - - /* assertion: c is a single UTF-4 value */ - if ((c < 0x80) && (c != (unsigned int) quoteChar) && - (c != '&') && (c != '<') && (c != '>')) { - if (out >= outend) - break; - *out++ = c; - } else { - const htmlEntityDesc * ent; - const char *cp; - char nbuf[16]; - int len; - - /* - * Try to lookup a predefined HTML entity for it - */ - ent = htmlEntityValueLookup(c); - if (ent == NULL) { - snprintf(nbuf, sizeof(nbuf), "#%u", c); - cp = nbuf; - } - else - cp = ent->name; - len = strlen(cp); - if (out + 2 + len > outend) - break; - *out++ = '&'; - memcpy(out, cp, len); - out += len; - *out++ = ';'; - } - processed = in; - } - *outlen = out - outstart; - *inlen = processed - instart; - return(0); -} - -/************************************************************************ - * * - * Commodity functions to handle streams * - * * - ************************************************************************/ - -/** - * htmlNewInputStream: - * @ctxt: an HTML parser context - * - * Create a new input stream structure - * Returns the new input stream or NULL - */ -static htmlParserInputPtr -htmlNewInputStream(htmlParserCtxtPtr ctxt) { - htmlParserInputPtr input; - - input = (xmlParserInputPtr) xmlMalloc(sizeof(htmlParserInput)); - if (input == NULL) { - htmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); - return(NULL); - } - memset(input, 0, sizeof(htmlParserInput)); - input->filename = NULL; - input->directory = NULL; - input->base = NULL; - input->cur = NULL; - input->buf = NULL; - input->line = 1; - input->col = 1; - input->buf = NULL; - input->free = NULL; - input->version = NULL; - input->consumed = 0; - input->length = 0; - return(input); -} - - -/************************************************************************ - * * - * Commodity functions, cleanup needed ? * - * * - ************************************************************************/ -/* - * all tags allowing pc data from the html 4.01 loose dtd - * NOTE: it might be more apropriate to integrate this information - * into the html40ElementTable array but I don't want to risk any - * binary incomptibility - */ -static const char *allowPCData[] = { - "a", "abbr", "acronym", "address", "applet", "b", "bdo", "big", - "blockquote", "body", "button", "caption", "center", "cite", "code", - "dd", "del", "dfn", "div", "dt", "em", "font", "form", "h1", "h2", - "h3", "h4", "h5", "h6", "i", "iframe", "ins", "kbd", "label", "legend", - "li", "noframes", "noscript", "object", "p", "pre", "q", "s", "samp", - "small", "span", "strike", "strong", "td", "th", "tt", "u", "var" -}; - -/** - * areBlanks: - * @ctxt: an HTML parser context - * @str: a xmlChar * - * @len: the size of @str - * - * Is this a sequence of blank chars that one can ignore ? - * - * Returns 1 if ignorable 0 otherwise. - */ - -static int areBlanks(htmlParserCtxtPtr ctxt, const xmlChar *str, int len) { - unsigned int i; - int j; - xmlNodePtr lastChild; - xmlDtdPtr dtd; - - for (j = 0;j < len;j++) - if (!(IS_BLANK_CH(str[j]))) return(0); - - if (CUR == 0) return(1); - if (CUR != '<') return(0); - if (ctxt->name == NULL) - return(1); - if (xmlStrEqual(ctxt->name, BAD_CAST"html")) - return(1); - if (xmlStrEqual(ctxt->name, BAD_CAST"head")) - return(1); - - /* Only strip CDATA children of the body tag for strict HTML DTDs */ - if (xmlStrEqual(ctxt->name, BAD_CAST "body") && ctxt->myDoc != NULL) { - dtd = xmlGetIntSubset(ctxt->myDoc); - if (dtd != NULL && dtd->ExternalID != NULL) { - if (!xmlStrcasecmp(dtd->ExternalID, BAD_CAST "-//W3C//DTD HTML 4.01//EN") || - !xmlStrcasecmp(dtd->ExternalID, BAD_CAST "-//W3C//DTD HTML 4//EN")) - return(1); - } - } - - if (ctxt->node == NULL) return(0); - lastChild = xmlGetLastChild(ctxt->node); - while ((lastChild) && (lastChild->type == XML_COMMENT_NODE)) - lastChild = lastChild->prev; - if (lastChild == NULL) { - if ((ctxt->node->type != XML_ELEMENT_NODE) && - (ctxt->node->content != NULL)) return(0); - /* keep ws in constructs like ...<b> </b>... - for all tags "b" allowing PCDATA */ - for ( i = 0; i < sizeof(allowPCData)/sizeof(allowPCData[0]); i++ ) { - if ( xmlStrEqual(ctxt->name, BAD_CAST allowPCData[i]) ) { - return(0); - } - } - } else if (xmlNodeIsText(lastChild)) { - return(0); - } else { - /* keep ws in constructs like <p><b>xy</b> <i>z</i><p> - for all tags "p" allowing PCDATA */ - for ( i = 0; i < sizeof(allowPCData)/sizeof(allowPCData[0]); i++ ) { - if ( xmlStrEqual(lastChild->name, BAD_CAST allowPCData[i]) ) { - return(0); - } - } - } - return(1); -} - -/** - * htmlNewDocNoDtD: - * @URI: URI for the dtd, or NULL - * @ExternalID: the external ID of the DTD, or NULL - * - * Creates a new HTML document without a DTD node if @URI and @ExternalID - * are NULL - * - * Returns a new document, do not initialize the DTD if not provided - */ -htmlDocPtr -htmlNewDocNoDtD(const xmlChar *URI, const xmlChar *ExternalID) { - xmlDocPtr cur; - - /* - * Allocate a new document and fill the fields. - */ - cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc)); - if (cur == NULL) { - htmlErrMemory(NULL, "HTML document creation failed\n"); - return(NULL); - } - memset(cur, 0, sizeof(xmlDoc)); - - cur->type = XML_HTML_DOCUMENT_NODE; - cur->version = NULL; - cur->intSubset = NULL; - cur->doc = cur; - cur->name = NULL; - cur->children = NULL; - cur->extSubset = NULL; - cur->oldNs = NULL; - cur->encoding = NULL; - cur->standalone = 1; - cur->compression = 0; - cur->ids = NULL; - cur->refs = NULL; - cur->_private = NULL; - cur->charset = XML_CHAR_ENCODING_UTF8; - if ((ExternalID != NULL) || - (URI != NULL)) - xmlCreateIntSubset(cur, BAD_CAST "html", ExternalID, URI); - return(cur); -} - -/** - * htmlNewDoc: - * @URI: URI for the dtd, or NULL - * @ExternalID: the external ID of the DTD, or NULL - * - * Creates a new HTML document - * - * Returns a new document - */ -htmlDocPtr -htmlNewDoc(const xmlChar *URI, const xmlChar *ExternalID) { - if ((URI == NULL) && (ExternalID == NULL)) - return(htmlNewDocNoDtD( - BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd", - BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN")); - - return(htmlNewDocNoDtD(URI, ExternalID)); -} - - -/************************************************************************ - * * - * The parser itself * - * Relates to http://www.w3.org/TR/html40 * - * * - ************************************************************************/ - -/************************************************************************ - * * - * The parser itself * - * * - ************************************************************************/ - -static const xmlChar * htmlParseNameComplex(xmlParserCtxtPtr ctxt); - -/** - * htmlParseHTMLName: - * @ctxt: an HTML parser context - * - * parse an HTML tag or attribute name, note that we convert it to lowercase - * since HTML names are not case-sensitive. - * - * Returns the Tag Name parsed or NULL - */ - -static const xmlChar * -htmlParseHTMLName(htmlParserCtxtPtr ctxt) { - int i = 0; - xmlChar loc[HTML_PARSER_BUFFER_SIZE]; - - if (!IS_ASCII_LETTER(CUR) && (CUR != '_') && - (CUR != ':')) return(NULL); - - while ((i < HTML_PARSER_BUFFER_SIZE) && - ((IS_ASCII_LETTER(CUR)) || (IS_ASCII_DIGIT(CUR)) || - (CUR == ':') || (CUR == '-') || (CUR == '_'))) { - if ((CUR >= 'A') && (CUR <= 'Z')) loc[i] = CUR + 0x20; - else loc[i] = CUR; - i++; - - NEXT; - } - - return(xmlDictLookup(ctxt->dict, loc, i)); -} - -/** - * htmlParseName: - * @ctxt: an HTML parser context - * - * parse an HTML name, this routine is case sensitive. - * - * Returns the Name parsed or NULL - */ - -static const xmlChar * -htmlParseName(htmlParserCtxtPtr ctxt) { - const xmlChar *in; - const xmlChar *ret; - int count = 0; - - GROW; - - /* - * Accelerator for simple ASCII names - */ - in = ctxt->input->cur; - if (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - (*in == '_') || (*in == ':')) { - in++; - while (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - ((*in >= 0x30) && (*in <= 0x39)) || - (*in == '_') || (*in == '-') || - (*in == ':') || (*in == '.')) - in++; - if ((*in > 0) && (*in < 0x80)) { - count = in - ctxt->input->cur; - ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); - ctxt->input->cur = in; - ctxt->nbChars += count; - ctxt->input->col += count; - return(ret); - } - } - return(htmlParseNameComplex(ctxt)); -} - -static const xmlChar * -htmlParseNameComplex(xmlParserCtxtPtr ctxt) { - int len = 0, l; - int c; - int count = 0; - - /* - * Handler for more complex cases - */ - GROW; - c = CUR_CHAR(l); - if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ - (!IS_LETTER(c) && (c != '_') && - (c != ':'))) { - return(NULL); - } - - while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ - ((IS_LETTER(c)) || (IS_DIGIT(c)) || - (c == '.') || (c == '-') || - (c == '_') || (c == ':') || - (IS_COMBINING(c)) || - (IS_EXTENDER(c)))) { - if (count++ > 100) { - count = 0; - GROW; - } - len += l; - NEXTL(l); - c = CUR_CHAR(l); - } - return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); -} - - -/** - * htmlParseHTMLAttribute: - * @ctxt: an HTML parser context - * @stop: a char stop value - * - * parse an HTML attribute value till the stop (quote), if - * stop is 0 then it stops at the first space - * - * Returns the attribute parsed or NULL - */ - -static xmlChar * -htmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) { - xmlChar *buffer = NULL; - int buffer_size = 0; - xmlChar *out = NULL; - const xmlChar *name = NULL; - const xmlChar *cur = NULL; - const htmlEntityDesc * ent; - - /* - * allocate a translation buffer. - */ - buffer_size = HTML_PARSER_BUFFER_SIZE; - buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); - if (buffer == NULL) { - htmlErrMemory(ctxt, "buffer allocation failed\n"); - return(NULL); - } - out = buffer; - - /* - * Ok loop until we reach one of the ending chars - */ - while ((CUR != 0) && (CUR != stop)) { - if ((stop == 0) && (CUR == '>')) break; - if ((stop == 0) && (IS_BLANK_CH(CUR))) break; - if (CUR == '&') { - if (NXT(1) == '#') { - unsigned int c; - int bits; - - c = htmlParseCharRef(ctxt); - if (c < 0x80) - { *out++ = c; bits= -6; } - else if (c < 0x800) - { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } - else if (c < 0x10000) - { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } - else - { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } - - for ( ; bits >= 0; bits-= 6) { - *out++ = ((c >> bits) & 0x3F) | 0x80; - } - - if (out - buffer > buffer_size - 100) { - int indx = out - buffer; - - growBuffer(buffer); - out = &buffer[indx]; - } - } else { - ent = htmlParseEntityRef(ctxt, &name); - if (name == NULL) { - *out++ = '&'; - if (out - buffer > buffer_size - 100) { - int indx = out - buffer; - - growBuffer(buffer); - out = &buffer[indx]; - } - } else if (ent == NULL) { - *out++ = '&'; - cur = name; - while (*cur != 0) { - if (out - buffer > buffer_size - 100) { - int indx = out - buffer; - - growBuffer(buffer); - out = &buffer[indx]; - } - *out++ = *cur++; - } - } else { - unsigned int c; - int bits; - - if (out - buffer > buffer_size - 100) { - int indx = out - buffer; - - growBuffer(buffer); - out = &buffer[indx]; - } - c = ent->value; - if (c < 0x80) - { *out++ = c; bits= -6; } - else if (c < 0x800) - { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } - else if (c < 0x10000) - { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } - else - { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } - - for ( ; bits >= 0; bits-= 6) { - *out++ = ((c >> bits) & 0x3F) | 0x80; - } - } - } - } else { - unsigned int c; - int bits, l; - - if (out - buffer > buffer_size - 100) { - int indx = out - buffer; - - growBuffer(buffer); - out = &buffer[indx]; - } - c = CUR_CHAR(l); - if (c < 0x80) - { *out++ = c; bits= -6; } - else if (c < 0x800) - { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } - else if (c < 0x10000) - { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } - else - { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } - - for ( ; bits >= 0; bits-= 6) { - *out++ = ((c >> bits) & 0x3F) | 0x80; - } - NEXT; - } - } - *out++ = 0; - return(buffer); -} - -/** - * htmlParseEntityRef: - * @ctxt: an HTML parser context - * @str: location to store the entity name - * - * parse an HTML ENTITY references - * - * [68] EntityRef ::= '&' Name ';' - * - * Returns the associated htmlEntityDescPtr if found, or NULL otherwise, - * if non-NULL *str will have to be freed by the caller. - */ -const htmlEntityDesc * -htmlParseEntityRef(htmlParserCtxtPtr ctxt, const xmlChar **str) { - const xmlChar *name; - const htmlEntityDesc * ent = NULL; - - if (str != NULL) *str = NULL; - if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); - - if (CUR == '&') { - NEXT; - name = htmlParseName(ctxt); - if (name == NULL) { - htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, - "htmlParseEntityRef: no name\n", NULL, NULL); - } else { - GROW; - if (CUR == ';') { - if (str != NULL) - *str = name; - - /* - * Lookup the entity in the table. - */ - ent = htmlEntityLookup(name); - if (ent != NULL) /* OK that's ugly !!! */ - NEXT; - } else { - htmlParseErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, - "htmlParseEntityRef: expecting ';'\n", - NULL, NULL); - if (str != NULL) - *str = name; - } - } - } - return(ent); -} - -/** - * htmlParseAttValue: - * @ctxt: an HTML parser context - * - * parse a value for an attribute - * Note: the parser won't do substitution of entities here, this - * will be handled later in xmlStringGetNodeList, unless it was - * asked for ctxt->replaceEntities != 0 - * - * Returns the AttValue parsed or NULL. - */ - -static xmlChar * -htmlParseAttValue(htmlParserCtxtPtr ctxt) { - xmlChar *ret = NULL; - - if (CUR == '"') { - NEXT; - ret = htmlParseHTMLAttribute(ctxt, '"'); - if (CUR != '"') { - htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, - "AttValue: \" expected\n", NULL, NULL); - } else - NEXT; - } else if (CUR == '\'') { - NEXT; - ret = htmlParseHTMLAttribute(ctxt, '\''); - if (CUR != '\'') { - htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, - "AttValue: ' expected\n", NULL, NULL); - } else - NEXT; - } else { - /* - * That's an HTMLism, the attribute value may not be quoted - */ - ret = htmlParseHTMLAttribute(ctxt, 0); - if (ret == NULL) { - htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, - "AttValue: no value found\n", NULL, NULL); - } - } - return(ret); -} - -/** - * htmlParseSystemLiteral: - * @ctxt: an HTML parser context - * - * parse an HTML Literal - * - * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") - * - * Returns the SystemLiteral parsed or NULL - */ - -static xmlChar * -htmlParseSystemLiteral(htmlParserCtxtPtr ctxt) { - const xmlChar *q; - xmlChar *ret = NULL; - - if (CUR == '"') { - NEXT; - q = CUR_PTR; - while ((IS_CHAR_CH(CUR)) && (CUR != '"')) - NEXT; - if (!IS_CHAR_CH(CUR)) { - htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, - "Unfinished SystemLiteral\n", NULL, NULL); - } else { - ret = xmlStrndup(q, CUR_PTR - q); - NEXT; - } - } else if (CUR == '\'') { - NEXT; - q = CUR_PTR; - while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) - NEXT; - if (!IS_CHAR_CH(CUR)) { - htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, - "Unfinished SystemLiteral\n", NULL, NULL); - } else { - ret = xmlStrndup(q, CUR_PTR - q); - NEXT; - } - } else { - htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, - " or ' expected\n", NULL, NULL); - } - - return(ret); -} - -/** - * htmlParsePubidLiteral: - * @ctxt: an HTML parser context - * - * parse an HTML public literal - * - * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" - * - * Returns the PubidLiteral parsed or NULL. - */ - -static xmlChar * -htmlParsePubidLiteral(htmlParserCtxtPtr ctxt) { - const xmlChar *q; - xmlChar *ret = NULL; - /* - * Name ::= (Letter | '_') (NameChar)* - */ - if (CUR == '"') { - NEXT; - q = CUR_PTR; - while (IS_PUBIDCHAR_CH(CUR)) NEXT; - if (CUR != '"') { - htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, - "Unfinished PubidLiteral\n", NULL, NULL); - } else { - ret = xmlStrndup(q, CUR_PTR - q); - NEXT; - } - } else if (CUR == '\'') { - NEXT; - q = CUR_PTR; - while ((IS_PUBIDCHAR_CH(CUR)) && (CUR != '\'')) - NEXT; - if (CUR != '\'') { - htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, - "Unfinished PubidLiteral\n", NULL, NULL); - } else { - ret = xmlStrndup(q, CUR_PTR - q); - NEXT; - } - } else { - htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, - "PubidLiteral \" or ' expected\n", NULL, NULL); - } - - return(ret); -} - -/** - * htmlParseScript: - * @ctxt: an HTML parser context - * - * parse the content of an HTML SCRIPT or STYLE element - * http://www.w3.org/TR/html4/sgml/dtd.html#Script - * http://www.w3.org/TR/html4/sgml/dtd.html#StyleSheet - * http://www.w3.org/TR/html4/types.html#type-script - * http://www.w3.org/TR/html4/types.html#h-6.15 - * http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2.1 - * - * Script data ( %Script; in the DTD) can be the content of the SCRIPT - * element and the value of intrinsic event attributes. User agents must - * not evaluate script data as HTML markup but instead must pass it on as - * data to a script engine. - * NOTES: - * - The content is passed like CDATA - * - the attributes for style and scripting "onXXX" are also described - * as CDATA but SGML allows entities references in attributes so their - * processing is identical as other attributes - */ -static void -htmlParseScript(htmlParserCtxtPtr ctxt) { - xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 5]; - int nbchar = 0; - int cur,l; - - SHRINK; - cur = CUR_CHAR(l); - while (IS_CHAR_CH(cur)) { - if ((cur == '<') && (NXT(1) == '!') && (NXT(2) == '-') && - (NXT(3) == '-')) { - if ((nbchar != 0) && (ctxt->sax != NULL) && (!ctxt->disableSAX)) { - if (ctxt->sax->cdataBlock!= NULL) { - /* - * Insert as CDATA, which is the same as HTML_PRESERVE_NODE - */ - ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); - } else if (ctxt->sax->characters != NULL) { - ctxt->sax->characters(ctxt->userData, buf, nbchar); - } - } - nbchar = 0; - htmlParseComment(ctxt); - cur = CUR_CHAR(l); - continue; - } else if ((cur == '<') && (NXT(1) == '/')) { - /* - * One should break here, the specification is clear: - * Authors should therefore escape "</" within the content. - * Escape mechanisms are specific to each scripting or - * style sheet language. - * - * In recovery mode, only break if end tag match the - * current tag, effectively ignoring all tags inside the - * script/style block and treating the entire block as - * CDATA. - */ - if (ctxt->recovery) { - if (xmlStrncasecmp(ctxt->name, ctxt->input->cur+2, - xmlStrlen(ctxt->name)) == 0) - { - break; /* while */ - } else { - htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, - "Element %s embeds close tag\n", - ctxt->name, NULL); - } - } else { - if (((NXT(2) >= 'A') && (NXT(2) <= 'Z')) || - ((NXT(2) >= 'a') && (NXT(2) <= 'z'))) - { - break; /* while */ - } - } - } - COPY_BUF(l,buf,nbchar,cur); - if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) { - if (ctxt->sax->cdataBlock!= NULL) { - /* - * Insert as CDATA, which is the same as HTML_PRESERVE_NODE - */ - ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); - } else if (ctxt->sax->characters != NULL) { - ctxt->sax->characters(ctxt->userData, buf, nbchar); - } - nbchar = 0; - } - GROW; - NEXTL(l); - cur = CUR_CHAR(l); - } - - if ((!(IS_CHAR_CH(cur))) && (!((cur == 0) && (ctxt->progressive)))) { - htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, - "Invalid char in CDATA 0x%X\n", cur); - NEXT; - } - - if ((nbchar != 0) && (ctxt->sax != NULL) && (!ctxt->disableSAX)) { - if (ctxt->sax->cdataBlock!= NULL) { - /* - * Insert as CDATA, which is the same as HTML_PRESERVE_NODE - */ - ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); - } else if (ctxt->sax->characters != NULL) { - ctxt->sax->characters(ctxt->userData, buf, nbchar); - } - } -} - - -/** - * htmlParseCharData: - * @ctxt: an HTML parser context - * - * parse a CharData section. - * if we are within a CDATA section ']]>' marks an end of section. - * - * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) - */ - -static void -htmlParseCharData(htmlParserCtxtPtr ctxt) { - xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 5]; - int nbchar = 0; - int cur, l; - - SHRINK; - cur = CUR_CHAR(l); - while (((cur != '<') || (ctxt->token == '<')) && - ((cur != '&') || (ctxt->token == '&')) && - (IS_CHAR(cur))) { - COPY_BUF(l,buf,nbchar,cur); - if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) { - /* - * Ok the segment is to be consumed as chars. - */ - if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { - if (areBlanks(ctxt, buf, nbchar)) { - if (ctxt->sax->ignorableWhitespace != NULL) - ctxt->sax->ignorableWhitespace(ctxt->userData, - buf, nbchar); - } else { - htmlCheckParagraph(ctxt); - if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, buf, nbchar); - } - } - nbchar = 0; - } - NEXTL(l); - cur = CUR_CHAR(l); - if (cur == 0) { - SHRINK; - GROW; - cur = CUR_CHAR(l); - } - } - if (nbchar != 0) { - buf[nbchar] = 0; - - /* - * Ok the segment is to be consumed as chars. - */ - if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { - if (areBlanks(ctxt, buf, nbchar)) { - if (ctxt->sax->ignorableWhitespace != NULL) - ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar); - } else { - htmlCheckParagraph(ctxt); - if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, buf, nbchar); - } - } - } else { - /* - * Loop detection - */ - if (cur == 0) - ctxt->instate = XML_PARSER_EOF; - } -} - -/** - * htmlParseExternalID: - * @ctxt: an HTML parser context - * @publicID: a xmlChar** receiving PubidLiteral - * - * Parse an External ID or a Public ID - * - * [75] ExternalID ::= 'SYSTEM' S SystemLiteral - * | 'PUBLIC' S PubidLiteral S SystemLiteral - * - * [83] PublicID ::= 'PUBLIC' S PubidLiteral - * - * Returns the function returns SystemLiteral and in the second - * case publicID receives PubidLiteral, is strict is off - * it is possible to return NULL and have publicID set. - */ - -static xmlChar * -htmlParseExternalID(htmlParserCtxtPtr ctxt, xmlChar **publicID) { - xmlChar *URI = NULL; - - if ((UPPER == 'S') && (UPP(1) == 'Y') && - (UPP(2) == 'S') && (UPP(3) == 'T') && - (UPP(4) == 'E') && (UPP(5) == 'M')) { - SKIP(6); - if (!IS_BLANK_CH(CUR)) { - htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after 'SYSTEM'\n", NULL, NULL); - } - SKIP_BLANKS; - URI = htmlParseSystemLiteral(ctxt); - if (URI == NULL) { - htmlParseErr(ctxt, XML_ERR_URI_REQUIRED, - "htmlParseExternalID: SYSTEM, no URI\n", NULL, NULL); - } - } else if ((UPPER == 'P') && (UPP(1) == 'U') && - (UPP(2) == 'B') && (UPP(3) == 'L') && - (UPP(4) == 'I') && (UPP(5) == 'C')) { - SKIP(6); - if (!IS_BLANK_CH(CUR)) { - htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after 'PUBLIC'\n", NULL, NULL); - } - SKIP_BLANKS; - *publicID = htmlParsePubidLiteral(ctxt); - if (*publicID == NULL) { - htmlParseErr(ctxt, XML_ERR_PUBID_REQUIRED, - "htmlParseExternalID: PUBLIC, no Public Identifier\n", - NULL, NULL); - } - SKIP_BLANKS; - if ((CUR == '"') || (CUR == '\'')) { - URI = htmlParseSystemLiteral(ctxt); - } - } - return(URI); -} - -/** - * xmlParsePI: - * @ctxt: an XML parser context - * - * parse an XML Processing Instruction. - * - * [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' - */ -static void -htmlParsePI(htmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int len = 0; - int size = HTML_PARSER_BUFFER_SIZE; - int cur, l; - const xmlChar *target; - xmlParserInputState state; - int count = 0; - - if ((RAW == '<') && (NXT(1) == '?')) { - state = ctxt->instate; - ctxt->instate = XML_PARSER_PI; - /* - * this is a Processing Instruction. - */ - SKIP(2); - SHRINK; - - /* - * Parse the target name and check for special support like - * namespace. - */ - target = htmlParseName(ctxt); - if (target != NULL) { - if (RAW == '>') { - SKIP(1); - - /* - * SAX: PI detected. - */ - if ((ctxt->sax) && (!ctxt->disableSAX) && - (ctxt->sax->processingInstruction != NULL)) - ctxt->sax->processingInstruction(ctxt->userData, - target, NULL); - ctxt->instate = state; - return; - } - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - htmlErrMemory(ctxt, NULL); - ctxt->instate = state; - return; - } - cur = CUR; - if (!IS_BLANK(cur)) { - htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, - "ParsePI: PI %s space expected\n", target, NULL); - } - SKIP_BLANKS; - cur = CUR_CHAR(l); - while (IS_CHAR(cur) && (cur != '>')) { - if (len + 5 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - htmlErrMemory(ctxt, NULL); - xmlFree(buf); - ctxt->instate = state; - return; - } - buf = tmp; - } - count++; - if (count > 50) { - GROW; - count = 0; - } - COPY_BUF(l,buf,len,cur); - NEXTL(l); - cur = CUR_CHAR(l); - if (cur == 0) { - SHRINK; - GROW; - cur = CUR_CHAR(l); - } - } - buf[len] = 0; - if (cur != '>') { - htmlParseErr(ctxt, XML_ERR_PI_NOT_FINISHED, - "ParsePI: PI %s never end ...\n", target, NULL); - } else { - SKIP(1); - - /* - * SAX: PI detected. - */ - if ((ctxt->sax) && (!ctxt->disableSAX) && - (ctxt->sax->processingInstruction != NULL)) - ctxt->sax->processingInstruction(ctxt->userData, - target, buf); - } - xmlFree(buf); - } else { - htmlParseErr(ctxt, XML_ERR_PI_NOT_STARTED, - "PI is not started correctly", NULL, NULL); - } - ctxt->instate = state; - } -} - -/** - * htmlParseComment: - * @ctxt: an HTML parser context - * - * Parse an XML (SGML) comment <!-- .... --> - * - * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' - */ -static void -htmlParseComment(htmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int len; - int size = HTML_PARSER_BUFFER_SIZE; - int q, ql; - int r, rl; - int cur, l; - xmlParserInputState state; - - /* - * Check that there is a comment right here. - */ - if ((RAW != '<') || (NXT(1) != '!') || - (NXT(2) != '-') || (NXT(3) != '-')) return; - - state = ctxt->instate; - ctxt->instate = XML_PARSER_COMMENT; - SHRINK; - SKIP(4); - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - htmlErrMemory(ctxt, "buffer allocation failed\n"); - ctxt->instate = state; - return; - } - q = CUR_CHAR(ql); - NEXTL(ql); - r = CUR_CHAR(rl); - NEXTL(rl); - cur = CUR_CHAR(l); - len = 0; - while (IS_CHAR(cur) && - ((cur != '>') || - (r != '-') || (q != '-'))) { - if (len + 5 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlFree(buf); - htmlErrMemory(ctxt, "growing buffer failed\n"); - ctxt->instate = state; - return; - } - buf = tmp; - } - COPY_BUF(ql,buf,len,q); - q = r; - ql = rl; - r = cur; - rl = l; - NEXTL(l); - cur = CUR_CHAR(l); - if (cur == 0) { - SHRINK; - GROW; - cur = CUR_CHAR(l); - } - } - buf[len] = 0; - if (!IS_CHAR(cur)) { - htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, - "Comment not terminated \n<!--%.50s\n", buf, NULL); - xmlFree(buf); - } else { - NEXT; - if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->comment(ctxt->userData, buf); - xmlFree(buf); - } - ctxt->instate = state; -} - -/** - * htmlParseCharRef: - * @ctxt: an HTML parser context - * - * parse Reference declarations - * - * [66] CharRef ::= '&#' [0-9]+ ';' | - * '&#x' [0-9a-fA-F]+ ';' - * - * Returns the value parsed (as an int) - */ -int -htmlParseCharRef(htmlParserCtxtPtr ctxt) { - int val = 0; - - if ((ctxt == NULL) || (ctxt->input == NULL)) { - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "htmlParseCharRef: context error\n", - NULL, NULL); - return(0); - } - if ((CUR == '&') && (NXT(1) == '#') && - ((NXT(2) == 'x') || NXT(2) == 'X')) { - SKIP(3); - while (CUR != ';') { - if ((CUR >= '0') && (CUR <= '9')) - val = val * 16 + (CUR - '0'); - else if ((CUR >= 'a') && (CUR <= 'f')) - val = val * 16 + (CUR - 'a') + 10; - else if ((CUR >= 'A') && (CUR <= 'F')) - val = val * 16 + (CUR - 'A') + 10; - else { - htmlParseErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, - "htmlParseCharRef: invalid hexadecimal value\n", - NULL, NULL); - return(0); - } - NEXT; - } - if (CUR == ';') - NEXT; - } else if ((CUR == '&') && (NXT(1) == '#')) { - SKIP(2); - while (CUR != ';') { - if ((CUR >= '0') && (CUR <= '9')) - val = val * 10 + (CUR - '0'); - else { - htmlParseErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, - "htmlParseCharRef: invalid decimal value\n", - NULL, NULL); - return(0); - } - NEXT; - } - if (CUR == ';') - NEXT; - } else { - htmlParseErr(ctxt, XML_ERR_INVALID_CHARREF, - "htmlParseCharRef: invalid value\n", NULL, NULL); - } - /* - * Check the value IS_CHAR ... - */ - if (IS_CHAR(val)) { - return(val); - } else { - htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, - "htmlParseCharRef: invalid xmlChar value %d\n", - val); - } - return(0); -} - - -/** - * htmlParseDocTypeDecl: - * @ctxt: an HTML parser context - * - * parse a DOCTYPE declaration - * - * [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? - * ('[' (markupdecl | PEReference | S)* ']' S?)? '>' - */ - -static void -htmlParseDocTypeDecl(htmlParserCtxtPtr ctxt) { - const xmlChar *name; - xmlChar *ExternalID = NULL; - xmlChar *URI = NULL; - - /* - * We know that '<!DOCTYPE' has been detected. - */ - SKIP(9); - - SKIP_BLANKS; - - /* - * Parse the DOCTYPE name. - */ - name = htmlParseName(ctxt); - if (name == NULL) { - htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, - "htmlParseDocTypeDecl : no DOCTYPE name !\n", - NULL, NULL); - } - /* - * Check that upper(name) == "HTML" !!!!!!!!!!!!! - */ - - SKIP_BLANKS; - - /* - * Check for SystemID and ExternalID - */ - URI = htmlParseExternalID(ctxt, &ExternalID); - SKIP_BLANKS; - - /* - * We should be at the end of the DOCTYPE declaration. - */ - if (CUR != '>') { - htmlParseErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, - "DOCTYPE improperly terminated\n", NULL, NULL); - /* We shouldn't try to resynchronize ... */ - } - NEXT; - - /* - * Create or update the document accordingly to the DOCTYPE - */ - if ((ctxt->sax != NULL) && (ctxt->sax->internalSubset != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->internalSubset(ctxt->userData, name, ExternalID, URI); - - /* - * Cleanup, since we don't use all those identifiers - */ - if (URI != NULL) xmlFree(URI); - if (ExternalID != NULL) xmlFree(ExternalID); -} - -/** - * htmlParseAttribute: - * @ctxt: an HTML parser context - * @value: a xmlChar ** used to store the value of the attribute - * - * parse an attribute - * - * [41] Attribute ::= Name Eq AttValue - * - * [25] Eq ::= S? '=' S? - * - * With namespace: - * - * [NS 11] Attribute ::= QName Eq AttValue - * - * Also the case QName == xmlns:??? is handled independently as a namespace - * definition. - * - * Returns the attribute name, and the value in *value. - */ - -static const xmlChar * -htmlParseAttribute(htmlParserCtxtPtr ctxt, xmlChar **value) { - const xmlChar *name; - xmlChar *val = NULL; - - *value = NULL; - name = htmlParseHTMLName(ctxt); - if (name == NULL) { - htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, - "error parsing attribute name\n", NULL, NULL); - return(NULL); - } - - /* - * read the value - */ - SKIP_BLANKS; - if (CUR == '=') { - NEXT; - SKIP_BLANKS; - val = htmlParseAttValue(ctxt); - } else if (htmlIsBooleanAttr(name)) { - /* - * assume a minimized attribute - */ - val = xmlStrdup(name); - } - - *value = val; - return(name); -} - -/** - * htmlCheckEncoding: - * @ctxt: an HTML parser context - * @attvalue: the attribute value - * - * Checks an http-equiv attribute from a Meta tag to detect - * the encoding - * If a new encoding is detected the parser is switched to decode - * it and pass UTF8 - */ -static void -htmlCheckEncoding(htmlParserCtxtPtr ctxt, const xmlChar *attvalue) { - const xmlChar *encoding; - - if ((ctxt == NULL) || (attvalue == NULL)) - return; - - /* do not change encoding */ - if (ctxt->input->encoding != NULL) - return; - - encoding = xmlStrcasestr(attvalue, BAD_CAST"charset="); - if (encoding != NULL) { - encoding += 8; - } else { - encoding = xmlStrcasestr(attvalue, BAD_CAST"charset ="); - if (encoding != NULL) - encoding += 9; - } - if (encoding != NULL) { - xmlCharEncoding enc; - xmlCharEncodingHandlerPtr handler; - - while ((*encoding == ' ') || (*encoding == '\t')) encoding++; - - if (ctxt->input->encoding != NULL) - xmlFree((xmlChar *) ctxt->input->encoding); - ctxt->input->encoding = xmlStrdup(encoding); - - enc = xmlParseCharEncoding((const char *) encoding); - /* - * registered set of known encodings - */ - if (enc != XML_CHAR_ENCODING_ERROR) { - if (((enc == XML_CHAR_ENCODING_UTF16LE) || - (enc == XML_CHAR_ENCODING_UTF16BE) || - (enc == XML_CHAR_ENCODING_UCS4LE) || - (enc == XML_CHAR_ENCODING_UCS4BE)) && - (ctxt->input->buf != NULL) && - (ctxt->input->buf->encoder == NULL)) { - htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, - "htmlCheckEncoding: wrong encoding meta\n", - NULL, NULL); - } else { - xmlSwitchEncoding(ctxt, enc); - } - ctxt->charset = XML_CHAR_ENCODING_UTF8; - } else { - /* - * fallback for unknown encodings - */ - handler = xmlFindCharEncodingHandler((const char *) encoding); - if (handler != NULL) { - xmlSwitchToEncoding(ctxt, handler); - ctxt->charset = XML_CHAR_ENCODING_UTF8; - } else { - ctxt->errNo = XML_ERR_UNSUPPORTED_ENCODING; - } - } - - if ((ctxt->input->buf != NULL) && - (ctxt->input->buf->encoder != NULL) && - (ctxt->input->buf->raw != NULL) && - (ctxt->input->buf->buffer != NULL)) { - int nbchars; - int processed; - - /* - * convert as much as possible to the parser reading buffer. - */ - processed = ctxt->input->cur - ctxt->input->base; - xmlBufferShrink(ctxt->input->buf->buffer, processed); - nbchars = xmlCharEncInFunc(ctxt->input->buf->encoder, - ctxt->input->buf->buffer, - ctxt->input->buf->raw); - if (nbchars < 0) { - htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, - "htmlCheckEncoding: encoder error\n", - NULL, NULL); - } - ctxt->input->base = - ctxt->input->cur = ctxt->input->buf->buffer->content; - } - } -} - -/** - * htmlCheckMeta: - * @ctxt: an HTML parser context - * @atts: the attributes values - * - * Checks an attributes from a Meta tag - */ -static void -htmlCheckMeta(htmlParserCtxtPtr ctxt, const xmlChar **atts) { - int i; - const xmlChar *att, *value; - int http = 0; - const xmlChar *content = NULL; - - if ((ctxt == NULL) || (atts == NULL)) - return; - - i = 0; - att = atts[i++]; - while (att != NULL) { - value = atts[i++]; - if ((value != NULL) && (!xmlStrcasecmp(att, BAD_CAST"http-equiv")) - && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) - http = 1; - else if ((value != NULL) && (!xmlStrcasecmp(att, BAD_CAST"content"))) - content = value; - att = atts[i++]; - } - if ((http) && (content != NULL)) - htmlCheckEncoding(ctxt, content); - -} - -/** - * htmlParseStartTag: - * @ctxt: an HTML parser context - * - * parse a start of tag either for rule element or - * EmptyElement. In both case we don't parse the tag closing chars. - * - * [40] STag ::= '<' Name (S Attribute)* S? '>' - * - * [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' - * - * With namespace: - * - * [NS 8] STag ::= '<' QName (S Attribute)* S? '>' - * - * [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' - * - * Returns 0 in case of success and -1 in case of error. - */ - -static int -htmlParseStartTag(htmlParserCtxtPtr ctxt) { - const xmlChar *name; - const xmlChar *attname; - xmlChar *attvalue; - const xmlChar **atts; - int nbatts = 0; - int maxatts; - int meta = 0; - int i; - - if ((ctxt == NULL) || (ctxt->input == NULL)) { - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "htmlParseStartTag: context error\n", NULL, NULL); - return -1; - } - if (CUR != '<') return -1; - NEXT; - - atts = ctxt->atts; - maxatts = ctxt->maxatts; - - GROW; - name = htmlParseHTMLName(ctxt); - if (name == NULL) { - htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, - "htmlParseStartTag: invalid element name\n", - NULL, NULL); - /* Dump the bogus tag like browsers do */ - while ((IS_CHAR_CH(CUR)) && (CUR != '>')) - NEXT; - return -1; - } - if (xmlStrEqual(name, BAD_CAST"meta")) - meta = 1; - - /* - * Check for auto-closure of HTML elements. - */ - htmlAutoClose(ctxt, name); - - /* - * Check for implied HTML elements. - */ - htmlCheckImplied(ctxt, name); - - /* - * Avoid html at any level > 0, head at any level != 1 - * or any attempt to recurse body - */ - if ((ctxt->nameNr > 0) && (xmlStrEqual(name, BAD_CAST"html"))) { - htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, - "htmlParseStartTag: misplaced <html> tag\n", - name, NULL); - return 0; - } - if ((ctxt->nameNr != 1) && - (xmlStrEqual(name, BAD_CAST"head"))) { - htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, - "htmlParseStartTag: misplaced <head> tag\n", - name, NULL); - return 0; - } - if (xmlStrEqual(name, BAD_CAST"body")) { - int indx; - for (indx = 0;indx < ctxt->nameNr;indx++) { - if (xmlStrEqual(ctxt->nameTab[indx], BAD_CAST"body")) { - htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, - "htmlParseStartTag: misplaced <body> tag\n", - name, NULL); - while ((IS_CHAR_CH(CUR)) && (CUR != '>')) - NEXT; - return 0; - } - } - } - - /* - * Now parse the attributes, it ends up with the ending - * - * (S Attribute)* S? - */ - SKIP_BLANKS; - while ((IS_CHAR_CH(CUR)) && - (CUR != '>') && - ((CUR != '/') || (NXT(1) != '>'))) { - long cons = ctxt->nbChars; - - GROW; - attname = htmlParseAttribute(ctxt, &attvalue); - if (attname != NULL) { - - /* - * Well formedness requires at most one declaration of an attribute - */ - for (i = 0; i < nbatts;i += 2) { - if (xmlStrEqual(atts[i], attname)) { - htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_REDEFINED, - "Attribute %s redefined\n", attname, NULL); - if (attvalue != NULL) - xmlFree(attvalue); - goto failed; - } - } - - /* - * Add the pair to atts - */ - if (atts == NULL) { - maxatts = 22; /* allow for 10 attrs by default */ - atts = (const xmlChar **) - xmlMalloc(maxatts * sizeof(xmlChar *)); - if (atts == NULL) { - htmlErrMemory(ctxt, NULL); - if (attvalue != NULL) - xmlFree(attvalue); - goto failed; - } - ctxt->atts = atts; - ctxt->maxatts = maxatts; - } else if (nbatts + 4 > maxatts) { - const xmlChar **n; - - maxatts *= 2; - n = (const xmlChar **) xmlRealloc((void *) atts, - maxatts * sizeof(const xmlChar *)); - if (n == NULL) { - htmlErrMemory(ctxt, NULL); - if (attvalue != NULL) - xmlFree(attvalue); - goto failed; - } - atts = n; - ctxt->atts = atts; - ctxt->maxatts = maxatts; - } - atts[nbatts++] = attname; - atts[nbatts++] = attvalue; - atts[nbatts] = NULL; - atts[nbatts + 1] = NULL; - } - else { - if (attvalue != NULL) - xmlFree(attvalue); - /* Dump the bogus attribute string up to the next blank or - * the end of the tag. */ - while ((IS_CHAR_CH(CUR)) && - !(IS_BLANK_CH(CUR)) && (CUR != '>') && - ((CUR != '/') || (NXT(1) != '>'))) - NEXT; - } - -failed: - SKIP_BLANKS; - if (cons == ctxt->nbChars) { - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "htmlParseStartTag: problem parsing attributes\n", - NULL, NULL); - break; - } - } - - /* - * Handle specific association to the META tag - */ - if (meta) - htmlCheckMeta(ctxt, atts); - - /* - * SAX: Start of Element ! - */ - htmlnamePush(ctxt, name); - if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) { - if (nbatts != 0) - ctxt->sax->startElement(ctxt->userData, name, atts); - else - ctxt->sax->startElement(ctxt->userData, name, NULL); - } - - if (atts != NULL) { - for (i = 1;i < nbatts;i += 2) { - if (atts[i] != NULL) - xmlFree((xmlChar *) atts[i]); - } - } - - return 0; -} - -/** - * htmlParseEndTag: - * @ctxt: an HTML parser context - * - * parse an end of tag - * - * [42] ETag ::= '</' Name S? '>' - * - * With namespace - * - * [NS 9] ETag ::= '</' QName S? '>' - * - * Returns 1 if the current level should be closed. - */ - -static int -htmlParseEndTag(htmlParserCtxtPtr ctxt) -{ - const xmlChar *name; - const xmlChar *oldname; - int i, ret; - - if ((CUR != '<') || (NXT(1) != '/')) { - htmlParseErr(ctxt, XML_ERR_LTSLASH_REQUIRED, - "htmlParseEndTag: '</' not found\n", NULL, NULL); - return (0); - } - SKIP(2); - - name = htmlParseHTMLName(ctxt); - if (name == NULL) - return (0); - - /* - * We should definitely be at the ending "S? '>'" part - */ - SKIP_BLANKS; - if ((!IS_CHAR_CH(CUR)) || (CUR != '>')) { - htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, - "End tag : expected '>'\n", NULL, NULL); - if (ctxt->recovery) { - /* - * We're not at the ending > !! - * Error, unless in recover mode where we search forwards - * until we find a > - */ - while (CUR != '\0' && CUR != '>') NEXT; - NEXT; - } - } else - NEXT; - - /* - * If the name read is not one of the element in the parsing stack - * then return, it's just an error. - */ - for (i = (ctxt->nameNr - 1); i >= 0; i--) { - if (xmlStrEqual(name, ctxt->nameTab[i])) - break; - } - if (i < 0) { - htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, - "Unexpected end tag : %s\n", name, NULL); - return (0); - } - - - /* - * Check for auto-closure of HTML elements. - */ - - htmlAutoCloseOnClose(ctxt, name); - - /* - * Well formedness constraints, opening and closing must match. - * With the exception that the autoclose may have popped stuff out - * of the stack. - */ - if (!xmlStrEqual(name, ctxt->name)) { - if ((ctxt->name != NULL) && (!xmlStrEqual(ctxt->name, name))) { - htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, - "Opening and ending tag mismatch: %s and %s\n", - name, ctxt->name); - } - } - - /* - * SAX: End of Tag - */ - oldname = ctxt->name; - if ((oldname != NULL) && (xmlStrEqual(oldname, name))) { - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, name); - htmlnamePop(ctxt); - ret = 1; - } else { - ret = 0; - } - - return (ret); -} - - -/** - * htmlParseReference: - * @ctxt: an HTML parser context - * - * parse and handle entity references in content, - * this will end-up in a call to character() since this is either a - * CharRef, or a predefined entity. - */ -static void -htmlParseReference(htmlParserCtxtPtr ctxt) { - const htmlEntityDesc * ent; - xmlChar out[6]; - const xmlChar *name; - if (CUR != '&') return; - - if (NXT(1) == '#') { - unsigned int c; - int bits, i = 0; - - c = htmlParseCharRef(ctxt); - if (c == 0) - return; - - if (c < 0x80) { out[i++]= c; bits= -6; } - else if (c < 0x800) { out[i++]=((c >> 6) & 0x1F) | 0xC0; bits= 0; } - else if (c < 0x10000) { out[i++]=((c >> 12) & 0x0F) | 0xE0; bits= 6; } - else { out[i++]=((c >> 18) & 0x07) | 0xF0; bits= 12; } - - for ( ; bits >= 0; bits-= 6) { - out[i++]= ((c >> bits) & 0x3F) | 0x80; - } - out[i] = 0; - - htmlCheckParagraph(ctxt); - if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) - ctxt->sax->characters(ctxt->userData, out, i); - } else { - ent = htmlParseEntityRef(ctxt, &name); - if (name == NULL) { - htmlCheckParagraph(ctxt); - if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) - ctxt->sax->characters(ctxt->userData, BAD_CAST "&", 1); - return; - } - if ((ent == NULL) || !(ent->value > 0)) { - htmlCheckParagraph(ctxt); - if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) { - ctxt->sax->characters(ctxt->userData, BAD_CAST "&", 1); - ctxt->sax->characters(ctxt->userData, name, xmlStrlen(name)); - /* ctxt->sax->characters(ctxt->userData, BAD_CAST ";", 1); */ - } - } else { - unsigned int c; - int bits, i = 0; - - c = ent->value; - if (c < 0x80) - { out[i++]= c; bits= -6; } - else if (c < 0x800) - { out[i++]=((c >> 6) & 0x1F) | 0xC0; bits= 0; } - else if (c < 0x10000) - { out[i++]=((c >> 12) & 0x0F) | 0xE0; bits= 6; } - else - { out[i++]=((c >> 18) & 0x07) | 0xF0; bits= 12; } - - for ( ; bits >= 0; bits-= 6) { - out[i++]= ((c >> bits) & 0x3F) | 0x80; - } - out[i] = 0; - - htmlCheckParagraph(ctxt); - if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) - ctxt->sax->characters(ctxt->userData, out, i); - } - } -} - -/** - * htmlParseContent: - * @ctxt: an HTML parser context - * - * Parse a content: comment, sub-element, reference or text. - */ - -static void -htmlParseContent(htmlParserCtxtPtr ctxt) { - xmlChar *currentNode; - int depth; - - currentNode = xmlStrdup(ctxt->name); - depth = ctxt->nameNr; - for(;;) { - long cons = ctxt->nbChars; - - GROW; - /* - * Our tag or one of it's parent or children is ending. - */ - if ((CUR == '<') && (NXT(1) == '/')) { - if (htmlParseEndTag(ctxt) && - ((currentNode != NULL) || (ctxt->nameNr == 0))) { - if (currentNode != NULL) - xmlFree(currentNode); - return; - } - continue; /* while */ - } - - /* - * Has this node been popped out during parsing of - * the next element - */ - if ((ctxt->nameNr > 0) && (depth >= ctxt->nameNr) && - (!xmlStrEqual(currentNode, ctxt->name))) - { - if (currentNode != NULL) xmlFree(currentNode); - return; - } - - if ((CUR != 0) && ((xmlStrEqual(currentNode, BAD_CAST"script")) || - (xmlStrEqual(currentNode, BAD_CAST"style")))) { - /* - * Handle SCRIPT/STYLE separately - */ - htmlParseScript(ctxt); - } else { - /* - * Sometimes DOCTYPE arrives in the middle of the document - */ - if ((CUR == '<') && (NXT(1) == '!') && - (UPP(2) == 'D') && (UPP(3) == 'O') && - (UPP(4) == 'C') && (UPP(5) == 'T') && - (UPP(6) == 'Y') && (UPP(7) == 'P') && - (UPP(8) == 'E')) { - htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, - "Misplaced DOCTYPE declaration\n", - BAD_CAST "DOCTYPE" , NULL); - htmlParseDocTypeDecl(ctxt); - } - - /* - * First case : a comment - */ - if ((CUR == '<') && (NXT(1) == '!') && - (NXT(2) == '-') && (NXT(3) == '-')) { - htmlParseComment(ctxt); - } - - /* - * Second case : a Processing Instruction. - */ - else if ((CUR == '<') && (NXT(1) == '?')) { - htmlParsePI(ctxt); - } - - /* - * Third case : a sub-element. - */ - else if (CUR == '<') { - htmlParseElement(ctxt); - } - - /* - * Fourth case : a reference. If if has not been resolved, - * parsing returns it's Name, create the node - */ - else if (CUR == '&') { - htmlParseReference(ctxt); - } - - /* - * Fifth case : end of the resource - */ - else if (CUR == 0) { - htmlAutoCloseOnEnd(ctxt); - break; - } - - /* - * Last case, text. Note that References are handled directly. - */ - else { - htmlParseCharData(ctxt); - } - - if (cons == ctxt->nbChars) { - if (ctxt->node != NULL) { - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "detected an error in element content\n", - NULL, NULL); - } - break; - } - } - GROW; - } - if (currentNode != NULL) xmlFree(currentNode); -} - -/** - * htmlParseContent: - * @ctxt: an HTML parser context - * - * Parse a content: comment, sub-element, reference or text. - */ - -void -__htmlParseContent(void *ctxt) { - if (ctxt != NULL) - htmlParseContent((htmlParserCtxtPtr) ctxt); -} - -/** - * htmlParseElement: - * @ctxt: an HTML parser context - * - * parse an HTML element, this is highly recursive - * - * [39] element ::= EmptyElemTag | STag content ETag - * - * [41] Attribute ::= Name Eq AttValue - */ - -void -htmlParseElement(htmlParserCtxtPtr ctxt) { - const xmlChar *name; - xmlChar *currentNode = NULL; - const htmlElemDesc * info; - htmlParserNodeInfo node_info; - int failed; - int depth; - const xmlChar *oldptr; - - if ((ctxt == NULL) || (ctxt->input == NULL)) { - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "htmlParseElement: context error\n", NULL, NULL); - return; - } - /* Capture start position */ - if (ctxt->record_info) { - node_info.begin_pos = ctxt->input->consumed + - (CUR_PTR - ctxt->input->base); - node_info.begin_line = ctxt->input->line; - } - - failed = htmlParseStartTag(ctxt); - name = ctxt->name; - if (failed || (name == NULL)) { - if (CUR == '>') - NEXT; - return; - } - - /* - * Lookup the info for that element. - */ - info = htmlTagLookup(name); - if (info == NULL) { - htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, - "Tag %s invalid\n", name, NULL); - } - - /* - * Check for an Empty Element labeled the XML/SGML way - */ - if ((CUR == '/') && (NXT(1) == '>')) { - SKIP(2); - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, name); - htmlnamePop(ctxt); - return; - } - - if (CUR == '>') { - NEXT; - } else { - htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, - "Couldn't find end of Start Tag %s\n", name, NULL); - - /* - * end of parsing of this node. - */ - if (xmlStrEqual(name, ctxt->name)) { - nodePop(ctxt); - htmlnamePop(ctxt); - } - - /* - * Capture end position and add node - */ - if (ctxt->record_info) { - node_info.end_pos = ctxt->input->consumed + - (CUR_PTR - ctxt->input->base); - node_info.end_line = ctxt->input->line; - node_info.node = ctxt->node; - xmlParserAddNodeInfo(ctxt, &node_info); - } - return; - } - - /* - * Check for an Empty Element from DTD definition - */ - if ((info != NULL) && (info->empty)) { - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, name); - htmlnamePop(ctxt); - return; - } - - /* - * Parse the content of the element: - */ - currentNode = xmlStrdup(ctxt->name); - depth = ctxt->nameNr; - while (IS_CHAR_CH(CUR)) { - oldptr = ctxt->input->cur; - htmlParseContent(ctxt); - if (oldptr==ctxt->input->cur) break; - if (ctxt->nameNr < depth) break; - } - - /* - * Capture end position and add node - */ - if ( currentNode != NULL && ctxt->record_info ) { - node_info.end_pos = ctxt->input->consumed + - (CUR_PTR - ctxt->input->base); - node_info.end_line = ctxt->input->line; - node_info.node = ctxt->node; - xmlParserAddNodeInfo(ctxt, &node_info); - } - if (!IS_CHAR_CH(CUR)) { - htmlAutoCloseOnEnd(ctxt); - } - - if (currentNode != NULL) - xmlFree(currentNode); -} - -/** - * htmlParseDocument: - * @ctxt: an HTML parser context - * - * parse an HTML document (and build a tree if using the standard SAX - * interface). - * - * Returns 0, -1 in case of error. the parser context is augmented - * as a result of the parsing. - */ - -int -htmlParseDocument(htmlParserCtxtPtr ctxt) { - xmlDtdPtr dtd; - - xmlInitParser(); - - htmlDefaultSAXHandlerInit(); - - if ((ctxt == NULL) || (ctxt->input == NULL)) { - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "htmlParseDocument: context error\n", NULL, NULL); - return(XML_ERR_INTERNAL_ERROR); - } - ctxt->html = 1; - GROW; - /* - * SAX: beginning of the document processing. - */ - if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) - ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); - - /* - * Wipe out everything which is before the first '<' - */ - SKIP_BLANKS; - if (CUR == 0) { - htmlParseErr(ctxt, XML_ERR_DOCUMENT_EMPTY, - "Document is empty\n", NULL, NULL); - } - - if ((ctxt->sax) && (ctxt->sax->startDocument) && (!ctxt->disableSAX)) - ctxt->sax->startDocument(ctxt->userData); - - - /* - * Parse possible comments and PIs before any content - */ - while (((CUR == '<') && (NXT(1) == '!') && - (NXT(2) == '-') && (NXT(3) == '-')) || - ((CUR == '<') && (NXT(1) == '?'))) { - htmlParseComment(ctxt); - htmlParsePI(ctxt); - SKIP_BLANKS; - } - - - /* - * Then possibly doc type declaration(s) and more Misc - * (doctypedecl Misc*)? - */ - if ((CUR == '<') && (NXT(1) == '!') && - (UPP(2) == 'D') && (UPP(3) == 'O') && - (UPP(4) == 'C') && (UPP(5) == 'T') && - (UPP(6) == 'Y') && (UPP(7) == 'P') && - (UPP(8) == 'E')) { - htmlParseDocTypeDecl(ctxt); - } - SKIP_BLANKS; - - /* - * Parse possible comments and PIs before any content - */ - while (((CUR == '<') && (NXT(1) == '!') && - (NXT(2) == '-') && (NXT(3) == '-')) || - ((CUR == '<') && (NXT(1) == '?'))) { - htmlParseComment(ctxt); - htmlParsePI(ctxt); - SKIP_BLANKS; - } - - /* - * Time to start parsing the tree itself - */ - htmlParseContent(ctxt); - - /* - * autoclose - */ - if (CUR == 0) - htmlAutoCloseOnEnd(ctxt); - - - /* - * SAX: end of the document processing. - */ - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - - if (ctxt->myDoc != NULL) { - dtd = xmlGetIntSubset(ctxt->myDoc); - if (dtd == NULL) - ctxt->myDoc->intSubset = - xmlCreateIntSubset(ctxt->myDoc, BAD_CAST "html", - BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN", - BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd"); - } - if (! ctxt->wellFormed) return(-1); - return(0); -} - - -/************************************************************************ - * * - * Parser contexts handling * - * * - ************************************************************************/ - -/** - * htmlInitParserCtxt: - * @ctxt: an HTML parser context - * - * Initialize a parser context - * - * Returns 0 in case of success and -1 in case of error - */ - -static int -htmlInitParserCtxt(htmlParserCtxtPtr ctxt) -{ - htmlSAXHandler *sax; - - if (ctxt == NULL) return(-1); - memset(ctxt, 0, sizeof(htmlParserCtxt)); - - ctxt->dict = xmlDictCreate(); - if (ctxt->dict == NULL) { - htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); - return(-1); - } - sax = (htmlSAXHandler *) xmlMalloc(sizeof(htmlSAXHandler)); - if (sax == NULL) { - htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); - return(-1); - } - else - memset(sax, 0, sizeof(htmlSAXHandler)); - - /* Allocate the Input stack */ - ctxt->inputTab = (htmlParserInputPtr *) - xmlMalloc(5 * sizeof(htmlParserInputPtr)); - if (ctxt->inputTab == NULL) { - htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); - ctxt->inputNr = 0; - ctxt->inputMax = 0; - ctxt->input = NULL; - return(-1); - } - ctxt->inputNr = 0; - ctxt->inputMax = 5; - ctxt->input = NULL; - ctxt->version = NULL; - ctxt->encoding = NULL; - ctxt->standalone = -1; - ctxt->instate = XML_PARSER_START; - - /* Allocate the Node stack */ - ctxt->nodeTab = (htmlNodePtr *) xmlMalloc(10 * sizeof(htmlNodePtr)); - if (ctxt->nodeTab == NULL) { - htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); - ctxt->nodeNr = 0; - ctxt->nodeMax = 0; - ctxt->node = NULL; - ctxt->inputNr = 0; - ctxt->inputMax = 0; - ctxt->input = NULL; - return(-1); - } - ctxt->nodeNr = 0; - ctxt->nodeMax = 10; - ctxt->node = NULL; - - /* Allocate the Name stack */ - ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *)); - if (ctxt->nameTab == NULL) { - htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); - ctxt->nameNr = 0; - ctxt->nameMax = 10; - ctxt->name = NULL; - ctxt->nodeNr = 0; - ctxt->nodeMax = 0; - ctxt->node = NULL; - ctxt->inputNr = 0; - ctxt->inputMax = 0; - ctxt->input = NULL; - return(-1); - } - ctxt->nameNr = 0; - ctxt->nameMax = 10; - ctxt->name = NULL; - - if (sax == NULL) ctxt->sax = (xmlSAXHandlerPtr) &htmlDefaultSAXHandler; - else { - ctxt->sax = sax; - memcpy(sax, &htmlDefaultSAXHandler, sizeof(xmlSAXHandlerV1)); - } - ctxt->userData = ctxt; - ctxt->myDoc = NULL; - ctxt->wellFormed = 1; - ctxt->replaceEntities = 0; - ctxt->linenumbers = xmlLineNumbersDefaultValue; - ctxt->html = 1; - ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0; - ctxt->vctxt.userData = ctxt; - ctxt->vctxt.error = xmlParserValidityError; - ctxt->vctxt.warning = xmlParserValidityWarning; - ctxt->record_info = 0; - ctxt->validate = 0; - ctxt->nbChars = 0; - ctxt->checkIndex = 0; - ctxt->catalogs = NULL; - xmlInitNodeInfoSeq(&ctxt->node_seq); - return(0); -} - -/** - * htmlFreeParserCtxt: - * @ctxt: an HTML parser context - * - * Free all the memory used by a parser context. However the parsed - * document in ctxt->myDoc is not freed. - */ - -void -htmlFreeParserCtxt(htmlParserCtxtPtr ctxt) -{ - xmlFreeParserCtxt(ctxt); -} - -/** - * htmlNewParserCtxt: - * - * Allocate and initialize a new parser context. - * - * Returns the htmlParserCtxtPtr or NULL in case of allocation error - */ - -htmlParserCtxtPtr -htmlNewParserCtxt(void) -{ - xmlParserCtxtPtr ctxt; - - ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt)); - if (ctxt == NULL) { - htmlErrMemory(NULL, "NewParserCtxt: out of memory\n"); - return(NULL); - } - memset(ctxt, 0, sizeof(xmlParserCtxt)); - if (htmlInitParserCtxt(ctxt) < 0) { - htmlFreeParserCtxt(ctxt); - return(NULL); - } - return(ctxt); -} - -/** - * htmlCreateMemoryParserCtxt: - * @buffer: a pointer to a char array - * @size: the size of the array - * - * Create a parser context for an HTML in-memory document. - * - * Returns the new parser context or NULL - */ -htmlParserCtxtPtr -htmlCreateMemoryParserCtxt(const char *buffer, int size) { - xmlParserCtxtPtr ctxt; - xmlParserInputPtr input; - xmlParserInputBufferPtr buf; - - if (buffer == NULL) - return(NULL); - if (size <= 0) - return(NULL); - - ctxt = htmlNewParserCtxt(); - if (ctxt == NULL) - return(NULL); - - buf = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); - if (buf == NULL) return(NULL); - - input = xmlNewInputStream(ctxt); - if (input == NULL) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - input->filename = NULL; - input->buf = buf; - input->base = input->buf->buffer->content; - input->cur = input->buf->buffer->content; - input->end = &input->buf->buffer->content[input->buf->buffer->use]; - - inputPush(ctxt, input); - return(ctxt); -} - -/** - * htmlCreateDocParserCtxt: - * @cur: a pointer to an array of xmlChar - * @encoding: a free form C string describing the HTML document encoding, or NULL - * - * Create a parser context for an HTML document. - * - * TODO: check the need to add encoding handling there - * - * Returns the new parser context or NULL - */ -static htmlParserCtxtPtr -htmlCreateDocParserCtxt(const xmlChar *cur, - const char *encoding ATTRIBUTE_UNUSED) { - int len; - htmlParserCtxtPtr ctxt; - - if (cur == NULL) - return(NULL); - len = xmlStrlen(cur); - ctxt = htmlCreateMemoryParserCtxt((char *)cur, len); - - if (encoding != NULL) { - xmlCharEncoding enc; - xmlCharEncodingHandlerPtr handler; - - if (ctxt->input->encoding != NULL) - xmlFree((xmlChar *) ctxt->input->encoding); - ctxt->input->encoding = xmlStrdup((const xmlChar *) encoding); - - enc = xmlParseCharEncoding(encoding); - /* - * registered set of known encodings - */ - if (enc != XML_CHAR_ENCODING_ERROR) { - xmlSwitchEncoding(ctxt, enc); - if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { - htmlParseErr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "Unsupported encoding %s\n", - (const xmlChar *) encoding, NULL); - } - } else { - /* - * fallback for unknown encodings - */ - handler = xmlFindCharEncodingHandler((const char *) encoding); - if (handler != NULL) { - xmlSwitchToEncoding(ctxt, handler); - } else { - htmlParseErr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "Unsupported encoding %s\n", - (const xmlChar *) encoding, NULL); - } - } - } - return(ctxt); -} - -#ifdef LIBXML_PUSH_ENABLED -/************************************************************************ - * * - * Progressive parsing interfaces * - * * - ************************************************************************/ - -/** - * htmlParseLookupSequence: - * @ctxt: an HTML parser context - * @first: the first char to lookup - * @next: the next char to lookup or zero - * @third: the next char to lookup or zero - * @comment: flag to force checking inside comments - * - * Try to find if a sequence (first, next, third) or just (first next) or - * (first) is available in the input stream. - * This function has a side effect of (possibly) incrementing ctxt->checkIndex - * to avoid rescanning sequences of bytes, it DOES change the state of the - * parser, do not use liberally. - * This is basically similar to xmlParseLookupSequence() - * - * Returns the index to the current parsing point if the full sequence - * is available, -1 otherwise. - */ -static int -htmlParseLookupSequence(htmlParserCtxtPtr ctxt, xmlChar first, - xmlChar next, xmlChar third, int iscomment) { - int base, len; - htmlParserInputPtr in; - const xmlChar *buf; - int incomment = 0; - - in = ctxt->input; - if (in == NULL) return(-1); - base = in->cur - in->base; - if (base < 0) return(-1); - if (ctxt->checkIndex > base) - base = ctxt->checkIndex; - if (in->buf == NULL) { - buf = in->base; - len = in->length; - } else { - buf = in->buf->buffer->content; - len = in->buf->buffer->use; - } - /* take into account the sequence length */ - if (third) len -= 2; - else if (next) len --; - for (;base < len;base++) { - if (!incomment && (base + 4 < len) && !iscomment) { - if ((buf[base] == '<') && (buf[base + 1] == '!') && - (buf[base + 2] == '-') && (buf[base + 3] == '-')) { - incomment = 1; - /* do not increment past <! - some people use <!--> */ - base += 2; - } - } - if (incomment) { - if (base + 3 > len) - return(-1); - if ((buf[base] == '-') && (buf[base + 1] == '-') && - (buf[base + 2] == '>')) { - incomment = 0; - base += 2; - } - continue; - } - if (buf[base] == first) { - if (third != 0) { - if ((buf[base + 1] != next) || - (buf[base + 2] != third)) continue; - } else if (next != 0) { - if (buf[base + 1] != next) continue; - } - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - if (next == 0) - xmlGenericError(xmlGenericErrorContext, - "HPP: lookup '%c' found at %d\n", - first, base); - else if (third == 0) - xmlGenericError(xmlGenericErrorContext, - "HPP: lookup '%c%c' found at %d\n", - first, next, base); - else - xmlGenericError(xmlGenericErrorContext, - "HPP: lookup '%c%c%c' found at %d\n", - first, next, third, base); -#endif - return(base - (in->cur - in->base)); - } - } - ctxt->checkIndex = base; -#ifdef DEBUG_PUSH - if (next == 0) - xmlGenericError(xmlGenericErrorContext, - "HPP: lookup '%c' failed\n", first); - else if (third == 0) - xmlGenericError(xmlGenericErrorContext, - "HPP: lookup '%c%c' failed\n", first, next); - else - xmlGenericError(xmlGenericErrorContext, - "HPP: lookup '%c%c%c' failed\n", first, next, third); -#endif - return(-1); -} - -/** - * htmlParseTryOrFinish: - * @ctxt: an HTML parser context - * @terminate: last chunk indicator - * - * Try to progress on parsing - * - * Returns zero if no parsing was possible - */ -static int -htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { - int ret = 0; - htmlParserInputPtr in; - int avail = 0; - xmlChar cur, next; - -#ifdef DEBUG_PUSH - switch (ctxt->instate) { - case XML_PARSER_EOF: - xmlGenericError(xmlGenericErrorContext, - "HPP: try EOF\n"); break; - case XML_PARSER_START: - xmlGenericError(xmlGenericErrorContext, - "HPP: try START\n"); break; - case XML_PARSER_MISC: - xmlGenericError(xmlGenericErrorContext, - "HPP: try MISC\n");break; - case XML_PARSER_COMMENT: - xmlGenericError(xmlGenericErrorContext, - "HPP: try COMMENT\n");break; - case XML_PARSER_PROLOG: - xmlGenericError(xmlGenericErrorContext, - "HPP: try PROLOG\n");break; - case XML_PARSER_START_TAG: - xmlGenericError(xmlGenericErrorContext, - "HPP: try START_TAG\n");break; - case XML_PARSER_CONTENT: - xmlGenericError(xmlGenericErrorContext, - "HPP: try CONTENT\n");break; - case XML_PARSER_CDATA_SECTION: - xmlGenericError(xmlGenericErrorContext, - "HPP: try CDATA_SECTION\n");break; - case XML_PARSER_END_TAG: - xmlGenericError(xmlGenericErrorContext, - "HPP: try END_TAG\n");break; - case XML_PARSER_ENTITY_DECL: - xmlGenericError(xmlGenericErrorContext, - "HPP: try ENTITY_DECL\n");break; - case XML_PARSER_ENTITY_VALUE: - xmlGenericError(xmlGenericErrorContext, - "HPP: try ENTITY_VALUE\n");break; - case XML_PARSER_ATTRIBUTE_VALUE: - xmlGenericError(xmlGenericErrorContext, - "HPP: try ATTRIBUTE_VALUE\n");break; - case XML_PARSER_DTD: - xmlGenericError(xmlGenericErrorContext, - "HPP: try DTD\n");break; - case XML_PARSER_EPILOG: - xmlGenericError(xmlGenericErrorContext, - "HPP: try EPILOG\n");break; - case XML_PARSER_PI: - xmlGenericError(xmlGenericErrorContext, - "HPP: try PI\n");break; - case XML_PARSER_SYSTEM_LITERAL: - xmlGenericError(xmlGenericErrorContext, - "HPP: try SYSTEM_LITERAL\n");break; - } -#endif - - for(;;) { - - in = ctxt->input; - if (in == NULL) break; - if (in->buf == NULL) - avail = in->length - (in->cur - in->base); - else - avail = in->buf->buffer->use - (in->cur - in->base); - if ((avail == 0) && (terminate)) { - htmlAutoCloseOnEnd(ctxt); - if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) { - /* - * SAX: end of the document processing. - */ - ctxt->instate = XML_PARSER_EOF; - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - } - } - if (avail < 1) - goto done; - cur = in->cur[0]; - if (cur == 0) { - SKIP(1); - continue; - } - - switch (ctxt->instate) { - case XML_PARSER_EOF: - /* - * Document parsing is done ! - */ - goto done; - case XML_PARSER_START: - /* - * Very first chars read from the document flow. - */ - cur = in->cur[0]; - if (IS_BLANK_CH(cur)) { - SKIP_BLANKS; - if (in->buf == NULL) - avail = in->length - (in->cur - in->base); - else - avail = in->buf->buffer->use - (in->cur - in->base); - } - if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) - ctxt->sax->setDocumentLocator(ctxt->userData, - &xmlDefaultSAXLocator); - if ((ctxt->sax) && (ctxt->sax->startDocument) && - (!ctxt->disableSAX)) - ctxt->sax->startDocument(ctxt->userData); - - cur = in->cur[0]; - next = in->cur[1]; - if ((cur == '<') && (next == '!') && - (UPP(2) == 'D') && (UPP(3) == 'O') && - (UPP(4) == 'C') && (UPP(5) == 'T') && - (UPP(6) == 'Y') && (UPP(7) == 'P') && - (UPP(8) == 'E')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing internal subset\n"); -#endif - htmlParseDocTypeDecl(ctxt); - ctxt->instate = XML_PARSER_PROLOG; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering PROLOG\n"); -#endif - } else { - ctxt->instate = XML_PARSER_MISC; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering MISC\n"); -#endif - } - break; - case XML_PARSER_MISC: - SKIP_BLANKS; - if (in->buf == NULL) - avail = in->length - (in->cur - in->base); - else - avail = in->buf->buffer->use - (in->cur - in->base); - if (avail < 2) - goto done; - cur = in->cur[0]; - next = in->cur[1]; - if ((cur == '<') && (next == '!') && - (in->cur[2] == '-') && (in->cur[3] == '-')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '-', '-', '>', 1) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing Comment\n"); -#endif - htmlParseComment(ctxt); - ctxt->instate = XML_PARSER_MISC; - } else if ((cur == '<') && (next == '?')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing PI\n"); -#endif - htmlParsePI(ctxt); - ctxt->instate = XML_PARSER_MISC; - } else if ((cur == '<') && (next == '!') && - (UPP(2) == 'D') && (UPP(3) == 'O') && - (UPP(4) == 'C') && (UPP(5) == 'T') && - (UPP(6) == 'Y') && (UPP(7) == 'P') && - (UPP(8) == 'E')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing internal subset\n"); -#endif - htmlParseDocTypeDecl(ctxt); - ctxt->instate = XML_PARSER_PROLOG; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering PROLOG\n"); -#endif - } else if ((cur == '<') && (next == '!') && - (avail < 9)) { - goto done; - } else { - ctxt->instate = XML_PARSER_START_TAG; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering START_TAG\n"); -#endif - } - break; - case XML_PARSER_PROLOG: - SKIP_BLANKS; - if (in->buf == NULL) - avail = in->length - (in->cur - in->base); - else - avail = in->buf->buffer->use - (in->cur - in->base); - if (avail < 2) - goto done; - cur = in->cur[0]; - next = in->cur[1]; - if ((cur == '<') && (next == '!') && - (in->cur[2] == '-') && (in->cur[3] == '-')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '-', '-', '>', 1) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing Comment\n"); -#endif - htmlParseComment(ctxt); - ctxt->instate = XML_PARSER_PROLOG; - } else if ((cur == '<') && (next == '?')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing PI\n"); -#endif - htmlParsePI(ctxt); - ctxt->instate = XML_PARSER_PROLOG; - } else if ((cur == '<') && (next == '!') && - (avail < 4)) { - goto done; - } else { - ctxt->instate = XML_PARSER_START_TAG; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering START_TAG\n"); -#endif - } - break; - case XML_PARSER_EPILOG: - if (in->buf == NULL) - avail = in->length - (in->cur - in->base); - else - avail = in->buf->buffer->use - (in->cur - in->base); - if (avail < 1) - goto done; - cur = in->cur[0]; - if (IS_BLANK_CH(cur)) { - htmlParseCharData(ctxt); - goto done; - } - if (avail < 2) - goto done; - next = in->cur[1]; - if ((cur == '<') && (next == '!') && - (in->cur[2] == '-') && (in->cur[3] == '-')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '-', '-', '>', 1) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing Comment\n"); -#endif - htmlParseComment(ctxt); - ctxt->instate = XML_PARSER_EPILOG; - } else if ((cur == '<') && (next == '?')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing PI\n"); -#endif - htmlParsePI(ctxt); - ctxt->instate = XML_PARSER_EPILOG; - } else if ((cur == '<') && (next == '!') && - (avail < 4)) { - goto done; - } else { - ctxt->errNo = XML_ERR_DOCUMENT_END; - ctxt->wellFormed = 0; - ctxt->instate = XML_PARSER_EOF; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering EOF\n"); -#endif - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - goto done; - } - break; - case XML_PARSER_START_TAG: { - const xmlChar *name; - int failed; - const htmlElemDesc * info; - - if (avail < 2) - goto done; - cur = in->cur[0]; - if (cur != '<') { - ctxt->instate = XML_PARSER_CONTENT; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - } - if (in->cur[1] == '/') { - ctxt->instate = XML_PARSER_END_TAG; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering END_TAG\n"); -#endif - break; - } - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; - - failed = htmlParseStartTag(ctxt); - name = ctxt->name; - if (failed || - (name == NULL)) { - if (CUR == '>') - NEXT; - break; - } - - /* - * Lookup the info for that element. - */ - info = htmlTagLookup(name); - if (info == NULL) { - htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, - "Tag %s invalid\n", name, NULL); - } - - /* - * Check for an Empty Element labeled the XML/SGML way - */ - if ((CUR == '/') && (NXT(1) == '>')) { - SKIP(2); - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, name); - htmlnamePop(ctxt); - ctxt->instate = XML_PARSER_CONTENT; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - } - - if (CUR == '>') { - NEXT; - } else { - htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, - "Couldn't find end of Start Tag %s\n", - name, NULL); - - /* - * end of parsing of this node. - */ - if (xmlStrEqual(name, ctxt->name)) { - nodePop(ctxt); - htmlnamePop(ctxt); - } - - ctxt->instate = XML_PARSER_CONTENT; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - } - - /* - * Check for an Empty Element from DTD definition - */ - if ((info != NULL) && (info->empty)) { - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) - ctxt->sax->endElement(ctxt->userData, name); - htmlnamePop(ctxt); - } - ctxt->instate = XML_PARSER_CONTENT; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - } - case XML_PARSER_CONTENT: { - long cons; - /* - * Handle preparsed entities and charRef - */ - if (ctxt->token != 0) { - xmlChar chr[2] = { 0 , 0 } ; - - chr[0] = (xmlChar) ctxt->token; - htmlCheckParagraph(ctxt); - if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) - ctxt->sax->characters(ctxt->userData, chr, 1); - ctxt->token = 0; - ctxt->checkIndex = 0; - } - if ((avail == 1) && (terminate)) { - cur = in->cur[0]; - if ((cur != '<') && (cur != '&')) { - if (ctxt->sax != NULL) { - if (IS_BLANK_CH(cur)) { - if (ctxt->sax->ignorableWhitespace != NULL) - ctxt->sax->ignorableWhitespace( - ctxt->userData, &cur, 1); - } else { - htmlCheckParagraph(ctxt); - if (ctxt->sax->characters != NULL) - ctxt->sax->characters( - ctxt->userData, &cur, 1); - } - } - ctxt->token = 0; - ctxt->checkIndex = 0; - in->cur++; - break; - } - } - if (avail < 2) - goto done; - cur = in->cur[0]; - next = in->cur[1]; - cons = ctxt->nbChars; - if ((xmlStrEqual(ctxt->name, BAD_CAST"script")) || - (xmlStrEqual(ctxt->name, BAD_CAST"style"))) { - /* - * Handle SCRIPT/STYLE separately - */ - if (!terminate) { - int idx; - xmlChar val; - - idx = htmlParseLookupSequence(ctxt, '<', '/', 0, 0); - if (idx < 0) - goto done; - val = in->cur[idx + 2]; - if (val == 0) /* bad cut of input */ - goto done; - } - htmlParseScript(ctxt); - if ((cur == '<') && (next == '/')) { - ctxt->instate = XML_PARSER_END_TAG; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering END_TAG\n"); -#endif - break; - } - } else { - /* - * Sometimes DOCTYPE arrives in the middle of the document - */ - if ((cur == '<') && (next == '!') && - (UPP(2) == 'D') && (UPP(3) == 'O') && - (UPP(4) == 'C') && (UPP(5) == 'T') && - (UPP(6) == 'Y') && (UPP(7) == 'P') && - (UPP(8) == 'E')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; - htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, - "Misplaced DOCTYPE declaration\n", - BAD_CAST "DOCTYPE" , NULL); - htmlParseDocTypeDecl(ctxt); - } else if ((cur == '<') && (next == '!') && - (in->cur[2] == '-') && (in->cur[3] == '-')) { - if ((!terminate) && - (htmlParseLookupSequence( - ctxt, '-', '-', '>', 1) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing Comment\n"); -#endif - htmlParseComment(ctxt); - ctxt->instate = XML_PARSER_CONTENT; - } else if ((cur == '<') && (next == '?')) { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing PI\n"); -#endif - htmlParsePI(ctxt); - ctxt->instate = XML_PARSER_CONTENT; - } else if ((cur == '<') && (next == '!') && (avail < 4)) { - goto done; - } else if ((cur == '<') && (next == '/')) { - ctxt->instate = XML_PARSER_END_TAG; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering END_TAG\n"); -#endif - break; - } else if (cur == '<') { - ctxt->instate = XML_PARSER_START_TAG; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering START_TAG\n"); -#endif - break; - } else if (cur == '&') { - if ((!terminate) && - (htmlParseLookupSequence(ctxt, ';', 0, 0, 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing Reference\n"); -#endif - /* TODO: check generation of subtrees if noent !!! */ - htmlParseReference(ctxt); - } else { - /* - * check that the text sequence is complete - * before handing out the data to the parser - * to avoid problems with erroneous end of - * data detection. - */ - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '<', 0, 0, 0) < 0)) - goto done; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: Parsing char data\n"); -#endif - htmlParseCharData(ctxt); - } - } - if (cons == ctxt->nbChars) { - if (ctxt->node != NULL) { - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "detected an error in element content\n", - NULL, NULL); - } - NEXT; - break; - } - - break; - } - case XML_PARSER_END_TAG: - if (avail < 2) - goto done; - if ((!terminate) && - (htmlParseLookupSequence(ctxt, '>', 0, 0, 0) < 0)) - goto done; - htmlParseEndTag(ctxt); - if (ctxt->nameNr == 0) { - ctxt->instate = XML_PARSER_EPILOG; - } else { - ctxt->instate = XML_PARSER_CONTENT; - } - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_CDATA_SECTION: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == CDATA\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_DTD: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == DTD\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_COMMENT: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == COMMENT\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_PI: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == PI\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_ENTITY_DECL: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == ENTITY_DECL\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_ENTITY_VALUE: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == ENTITY_VALUE\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering DTD\n"); -#endif - break; - case XML_PARSER_ATTRIBUTE_VALUE: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == ATTRIBUTE_VALUE\n", - NULL, NULL); - ctxt->instate = XML_PARSER_START_TAG; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering START_TAG\n"); -#endif - break; - case XML_PARSER_SYSTEM_LITERAL: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == XML_PARSER_SYSTEM_LITERAL\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_IGNORE: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == XML_PARSER_IGNORE\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_PUBLIC_LITERAL: - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "HPP: internal error, state == XML_PARSER_LITERAL\n", - NULL, NULL); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "HPP: entering CONTENT\n"); -#endif - break; - - } - } -done: - if ((avail == 0) && (terminate)) { - htmlAutoCloseOnEnd(ctxt); - if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) { - /* - * SAX: end of the document processing. - */ - ctxt->instate = XML_PARSER_EOF; - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - } - } - if ((ctxt->myDoc != NULL) && - ((terminate) || (ctxt->instate == XML_PARSER_EOF) || - (ctxt->instate == XML_PARSER_EPILOG))) { - xmlDtdPtr dtd; - dtd = xmlGetIntSubset(ctxt->myDoc); - if (dtd == NULL) - ctxt->myDoc->intSubset = - xmlCreateIntSubset(ctxt->myDoc, BAD_CAST "html", - BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN", - BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd"); - } -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, "HPP: done %d\n", ret); -#endif - return(ret); -} - -/** - * htmlParseChunk: - * @ctxt: an HTML parser context - * @chunk: an char array - * @size: the size in byte of the chunk - * @terminate: last chunk indicator - * - * Parse a Chunk of memory - * - * Returns zero if no error, the xmlParserErrors otherwise. - */ -int -htmlParseChunk(htmlParserCtxtPtr ctxt, const char *chunk, int size, - int terminate) { - if ((ctxt == NULL) || (ctxt->input == NULL)) { - htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, - "htmlParseChunk: context error\n", NULL, NULL); - return(XML_ERR_INTERNAL_ERROR); - } - if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && - (ctxt->input->buf != NULL) && (ctxt->instate != XML_PARSER_EOF)) { - int base = ctxt->input->base - ctxt->input->buf->buffer->content; - int cur = ctxt->input->cur - ctxt->input->base; - int res; - - res = xmlParserInputBufferPush(ctxt->input->buf, size, chunk); - if (res < 0) { - ctxt->errNo = XML_PARSER_EOF; - ctxt->disableSAX = 1; - return (XML_PARSER_EOF); - } - ctxt->input->base = ctxt->input->buf->buffer->content + base; - ctxt->input->cur = ctxt->input->base + cur; - ctxt->input->end = - &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer->use]; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); -#endif - -#if 0 - if ((terminate) || (ctxt->input->buf->buffer->use > 80)) - htmlParseTryOrFinish(ctxt, terminate); -#endif - } else if (ctxt->instate != XML_PARSER_EOF) { - if ((ctxt->input != NULL) && ctxt->input->buf != NULL) { - xmlParserInputBufferPtr in = ctxt->input->buf; - if ((in->encoder != NULL) && (in->buffer != NULL) && - (in->raw != NULL)) { - int nbchars; - - nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); - if (nbchars < 0) { - htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, - "encoder error\n", NULL, NULL); - return(XML_ERR_INVALID_ENCODING); - } - } - } - } - htmlParseTryOrFinish(ctxt, terminate); - if (terminate) { - if ((ctxt->instate != XML_PARSER_EOF) && - (ctxt->instate != XML_PARSER_EPILOG) && - (ctxt->instate != XML_PARSER_MISC)) { - ctxt->errNo = XML_ERR_DOCUMENT_END; - ctxt->wellFormed = 0; - } - if (ctxt->instate != XML_PARSER_EOF) { - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - } - ctxt->instate = XML_PARSER_EOF; - } - return((xmlParserErrors) ctxt->errNo); -} - -/************************************************************************ - * * - * User entry points * - * * - ************************************************************************/ - -/** - * htmlCreatePushParserCtxt: - * @sax: a SAX handler - * @user_data: The user data returned on SAX callbacks - * @chunk: a pointer to an array of chars - * @size: number of chars in the array - * @filename: an optional file name or URI - * @enc: an optional encoding - * - * Create a parser context for using the HTML parser in push mode - * The value of @filename is used for fetching external entities - * and error/warning reports. - * - * Returns the new parser context or NULL - */ -htmlParserCtxtPtr -htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, void *user_data, - const char *chunk, int size, const char *filename, - xmlCharEncoding enc) { - htmlParserCtxtPtr ctxt; - htmlParserInputPtr inputStream; - xmlParserInputBufferPtr buf; - - xmlInitParser(); - - buf = xmlAllocParserInputBuffer(enc); - if (buf == NULL) return(NULL); - - ctxt = htmlNewParserCtxt(); - if (ctxt == NULL) { - xmlFreeParserInputBuffer(buf); - return(NULL); - } - if(enc==XML_CHAR_ENCODING_UTF8 || buf->encoder) - ctxt->charset=XML_CHAR_ENCODING_UTF8; - if (sax != NULL) { - if (ctxt->sax != (xmlSAXHandlerPtr) &htmlDefaultSAXHandler) - xmlFree(ctxt->sax); - ctxt->sax = (htmlSAXHandlerPtr) xmlMalloc(sizeof(htmlSAXHandler)); - if (ctxt->sax == NULL) { - xmlFree(buf); - xmlFree(ctxt); - return(NULL); - } - memcpy(ctxt->sax, sax, sizeof(htmlSAXHandler)); - if (user_data != NULL) - ctxt->userData = user_data; - } - if (filename == NULL) { - ctxt->directory = NULL; - } else { - ctxt->directory = xmlParserGetDirectory(filename); - } - - inputStream = htmlNewInputStream(ctxt); - if (inputStream == NULL) { - xmlFreeParserCtxt(ctxt); - xmlFree(buf); - return(NULL); - } - - if (filename == NULL) - inputStream->filename = NULL; - else - inputStream->filename = (char *) - xmlCanonicPath((const xmlChar *) filename); - inputStream->buf = buf; - inputStream->base = inputStream->buf->buffer->content; - inputStream->cur = inputStream->buf->buffer->content; - inputStream->end = - &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; - - inputPush(ctxt, inputStream); - - if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && - (ctxt->input->buf != NULL)) { - int base = ctxt->input->base - ctxt->input->buf->buffer->content; - int cur = ctxt->input->cur - ctxt->input->base; - - xmlParserInputBufferPush(ctxt->input->buf, size, chunk); - - ctxt->input->base = ctxt->input->buf->buffer->content + base; - ctxt->input->cur = ctxt->input->base + cur; - ctxt->input->end = - &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer->use]; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); -#endif - } - ctxt->progressive = 1; - - return(ctxt); -} -#endif /* LIBXML_PUSH_ENABLED */ - -/** - * htmlSAXParseDoc: - * @cur: a pointer to an array of xmlChar - * @encoding: a free form C string describing the HTML document encoding, or NULL - * @sax: the SAX handler block - * @userData: if using SAX, this pointer will be provided on callbacks. - * - * Parse an HTML in-memory document. If sax is not NULL, use the SAX callbacks - * to handle parse events. If sax is NULL, fallback to the default DOM - * behavior and return a tree. - * - * Returns the resulting document tree unless SAX is NULL or the document is - * not well formed. - */ - -htmlDocPtr -htmlSAXParseDoc(xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData) { - htmlDocPtr ret; - htmlParserCtxtPtr ctxt; - - xmlInitParser(); - - if (cur == NULL) return(NULL); - - - ctxt = htmlCreateDocParserCtxt(cur, encoding); - if (ctxt == NULL) return(NULL); - if (sax != NULL) { - if (ctxt->sax != NULL) xmlFree (ctxt->sax); - ctxt->sax = sax; - ctxt->userData = userData; - } - - htmlParseDocument(ctxt); - ret = ctxt->myDoc; - if (sax != NULL) { - ctxt->sax = NULL; - ctxt->userData = NULL; - } - htmlFreeParserCtxt(ctxt); - - return(ret); -} - -/** - * htmlParseDoc: - * @cur: a pointer to an array of xmlChar - * @encoding: a free form C string describing the HTML document encoding, or NULL - * - * parse an HTML in-memory document and build a tree. - * - * Returns the resulting document tree - */ - -htmlDocPtr -htmlParseDoc(xmlChar *cur, const char *encoding) { - return(htmlSAXParseDoc(cur, encoding, NULL, NULL)); -} - - -/** - * htmlCreateFileParserCtxt: - * @filename: the filename - * @encoding: a free form C string describing the HTML document encoding, or NULL - * - * Create a parser context for a file content. - * Automatic support for ZLIB/Compress compressed document is provided - * by default if found at compile-time. - * - * Returns the new parser context or NULL - */ -htmlParserCtxtPtr -htmlCreateFileParserCtxt(const char *filename, const char *encoding) -{ - htmlParserCtxtPtr ctxt; - htmlParserInputPtr inputStream; - char *canonicFilename; - /* htmlCharEncoding enc; */ - xmlChar *content, *content_line = (xmlChar *) "charset="; - - if (filename == NULL) - return(NULL); - - ctxt = htmlNewParserCtxt(); - if (ctxt == NULL) { - return(NULL); - } - canonicFilename = (char *) xmlCanonicPath((const xmlChar *) filename); - if (canonicFilename == NULL) { -#ifdef LIBXML_SAX1_ENABLED - if (xmlDefaultSAXHandler.error != NULL) { - xmlDefaultSAXHandler.error(NULL, "out of memory\n"); - } -#endif - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - inputStream = xmlLoadExternalEntity(canonicFilename, NULL, ctxt); - xmlFree(canonicFilename); - if (inputStream == NULL) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - inputPush(ctxt, inputStream); - - /* set encoding */ - if (encoding) { - content = xmlMallocAtomic (xmlStrlen(content_line) + strlen(encoding) + 1); - if (content) { - strcpy ((char *)content, (char *)content_line); - strcat ((char *)content, (char *)encoding); - htmlCheckEncoding (ctxt, content); - xmlFree (content); - } - } - - return(ctxt); -} - -/** - * htmlSAXParseFile: - * @filename: the filename - * @encoding: a free form C string describing the HTML document encoding, or NULL - * @sax: the SAX handler block - * @userData: if using SAX, this pointer will be provided on callbacks. - * - * parse an HTML file and build a tree. Automatic support for ZLIB/Compress - * compressed document is provided by default if found at compile-time. - * It use the given SAX function block to handle the parsing callback. - * If sax is NULL, fallback to the default DOM tree building routines. - * - * Returns the resulting document tree unless SAX is NULL or the document is - * not well formed. - */ - -htmlDocPtr -htmlSAXParseFile(const char *filename, const char *encoding, htmlSAXHandlerPtr sax, - void *userData) { - htmlDocPtr ret; - htmlParserCtxtPtr ctxt; - htmlSAXHandlerPtr oldsax = NULL; - - xmlInitParser(); - - ctxt = htmlCreateFileParserCtxt(filename, encoding); - if (ctxt == NULL) return(NULL); - if (sax != NULL) { - oldsax = ctxt->sax; - ctxt->sax = sax; - ctxt->userData = userData; - } - - htmlParseDocument(ctxt); - - ret = ctxt->myDoc; - if (sax != NULL) { - ctxt->sax = oldsax; - ctxt->userData = NULL; - } - htmlFreeParserCtxt(ctxt); - - return(ret); -} - -/** - * htmlParseFile: - * @filename: the filename - * @encoding: a free form C string describing the HTML document encoding, or NULL - * - * parse an HTML file and build a tree. Automatic support for ZLIB/Compress - * compressed document is provided by default if found at compile-time. - * - * Returns the resulting document tree - */ - -htmlDocPtr -htmlParseFile(const char *filename, const char *encoding) { - return(htmlSAXParseFile(filename, encoding, NULL, NULL)); -} - -/** - * htmlHandleOmittedElem: - * @val: int 0 or 1 - * - * Set and return the previous value for handling HTML omitted tags. - * - * Returns the last value for 0 for no handling, 1 for auto insertion. - */ - -int -htmlHandleOmittedElem(int val) { - int old = htmlOmittedDefaultValue; - - htmlOmittedDefaultValue = val; - return(old); -} - -/** - * htmlElementAllowedHere: - * @parent: HTML parent element - * @elt: HTML element - * - * Checks whether an HTML element may be a direct child of a parent element. - * Note - doesn't check for deprecated elements - * - * Returns 1 if allowed; 0 otherwise. - */ -int -htmlElementAllowedHere(const htmlElemDesc* parent, const xmlChar* elt) { - const char** p ; - - if ( ! elt || ! parent || ! parent->subelts ) - return 0 ; - - for ( p = parent->subelts; *p; ++p ) - if ( !xmlStrcmp((const xmlChar *)*p, elt) ) - return 1 ; - - return 0 ; -} -/** - * htmlElementStatusHere: - * @parent: HTML parent element - * @elt: HTML element - * - * Checks whether an HTML element may be a direct child of a parent element. - * and if so whether it is valid or deprecated. - * - * Returns one of HTML_VALID, HTML_DEPRECATED, HTML_INVALID - */ -htmlStatus -htmlElementStatusHere(const htmlElemDesc* parent, const htmlElemDesc* elt) { - if ( ! parent || ! elt ) - return HTML_INVALID ; - if ( ! htmlElementAllowedHere(parent, (const xmlChar*) elt->name ) ) - return HTML_INVALID ; - - return ( elt->dtd == 0 ) ? HTML_VALID : HTML_DEPRECATED ; -} -/** - * htmlAttrAllowed: - * @elt: HTML element - * @attr: HTML attribute - * @legacy: whether to allow deprecated attributes - * - * Checks whether an attribute is valid for an element - * Has full knowledge of Required and Deprecated attributes - * - * Returns one of HTML_REQUIRED, HTML_VALID, HTML_DEPRECATED, HTML_INVALID - */ -htmlStatus -htmlAttrAllowed(const htmlElemDesc* elt, const xmlChar* attr, int legacy) { - const char** p ; - - if ( !elt || ! attr ) - return HTML_INVALID ; - - if ( elt->attrs_req ) - for ( p = elt->attrs_req; *p; ++p) - if ( !xmlStrcmp((const xmlChar*)*p, attr) ) - return HTML_REQUIRED ; - - if ( elt->attrs_opt ) - for ( p = elt->attrs_opt; *p; ++p) - if ( !xmlStrcmp((const xmlChar*)*p, attr) ) - return HTML_VALID ; - - if ( legacy && elt->attrs_depr ) - for ( p = elt->attrs_depr; *p; ++p) - if ( !xmlStrcmp((const xmlChar*)*p, attr) ) - return HTML_DEPRECATED ; - - return HTML_INVALID ; -} -/** - * htmlNodeStatus: - * @node: an htmlNodePtr in a tree - * @legacy: whether to allow deprecated elements (YES is faster here - * for Element nodes) - * - * Checks whether the tree node is valid. Experimental (the author - * only uses the HTML enhancements in a SAX parser) - * - * Return: for Element nodes, a return from htmlElementAllowedHere (if - * legacy allowed) or htmlElementStatusHere (otherwise). - * for Attribute nodes, a return from htmlAttrAllowed - * for other nodes, HTML_NA (no checks performed) - */ -htmlStatus -htmlNodeStatus(const htmlNodePtr node, int legacy) { - if ( ! node ) - return HTML_INVALID ; - - switch ( node->type ) { - case XML_ELEMENT_NODE: - return legacy - ? ( htmlElementAllowedHere ( - htmlTagLookup(node->parent->name) , node->name - ) ? HTML_VALID : HTML_INVALID ) - : htmlElementStatusHere( - htmlTagLookup(node->parent->name) , - htmlTagLookup(node->name) ) - ; - case XML_ATTRIBUTE_NODE: - return htmlAttrAllowed( - htmlTagLookup(node->parent->name) , node->name, legacy) ; - default: return HTML_NA ; - } -} -/************************************************************************ - * * - * New set (2.6.0) of simpler and more flexible APIs * - * * - ************************************************************************/ -/** - * DICT_FREE: - * @str: a string - * - * Free a string if it is not owned by the "dict" dictionnary in the - * current scope - */ -#define DICT_FREE(str) \ - if ((str) && ((!dict) || \ - (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ - xmlFree((char *)(str)); - -/** - * htmlCtxtReset: - * @ctxt: an HTML parser context - * - * Reset a parser context - */ -void -htmlCtxtReset(htmlParserCtxtPtr ctxt) -{ - xmlParserInputPtr input; - xmlDictPtr dict; - - if (ctxt == NULL) - return; - - xmlInitParser(); - dict = ctxt->dict; - - while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ - xmlFreeInputStream(input); - } - ctxt->inputNr = 0; - ctxt->input = NULL; - - ctxt->spaceNr = 0; - if (ctxt->spaceTab != NULL) { - ctxt->spaceTab[0] = -1; - ctxt->space = &ctxt->spaceTab[0]; - } else { - ctxt->space = NULL; - } - - - ctxt->nodeNr = 0; - ctxt->node = NULL; - - ctxt->nameNr = 0; - ctxt->name = NULL; - - DICT_FREE(ctxt->version); - ctxt->version = NULL; - DICT_FREE(ctxt->encoding); - ctxt->encoding = NULL; - DICT_FREE(ctxt->directory); - ctxt->directory = NULL; - DICT_FREE(ctxt->extSubURI); - ctxt->extSubURI = NULL; - DICT_FREE(ctxt->extSubSystem); - ctxt->extSubSystem = NULL; - if (ctxt->myDoc != NULL) - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - - ctxt->standalone = -1; - ctxt->hasExternalSubset = 0; - ctxt->hasPErefs = 0; - ctxt->html = 1; - ctxt->external = 0; - ctxt->instate = XML_PARSER_START; - ctxt->token = 0; - - ctxt->wellFormed = 1; - ctxt->nsWellFormed = 1; - ctxt->valid = 1; - ctxt->vctxt.userData = ctxt; - ctxt->vctxt.error = xmlParserValidityError; - ctxt->vctxt.warning = xmlParserValidityWarning; - ctxt->record_info = 0; - ctxt->nbChars = 0; - ctxt->checkIndex = 0; - ctxt->inSubset = 0; - ctxt->errNo = XML_ERR_OK; - ctxt->depth = 0; - ctxt->charset = XML_CHAR_ENCODING_UTF8; - ctxt->catalogs = NULL; - xmlInitNodeInfoSeq(&ctxt->node_seq); - - if (ctxt->attsDefault != NULL) { - xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); - ctxt->attsDefault = NULL; - } - if (ctxt->attsSpecial != NULL) { - xmlHashFree(ctxt->attsSpecial, NULL); - ctxt->attsSpecial = NULL; - } -} - -/** - * htmlCtxtUseOptions: - * @ctxt: an HTML parser context - * @options: a combination of htmlParserOption(s) - * - * Applies the options to the parser context - * - * Returns 0 in case of success, the set of unknown or unimplemented options - * in case of error. - */ -int -htmlCtxtUseOptions(htmlParserCtxtPtr ctxt, int options) -{ - if (ctxt == NULL) - return(-1); - - if (options & HTML_PARSE_NOWARNING) { - ctxt->sax->warning = NULL; - ctxt->vctxt.warning = NULL; - options -= XML_PARSE_NOWARNING; - ctxt->options |= XML_PARSE_NOWARNING; - } - if (options & HTML_PARSE_NOERROR) { - ctxt->sax->error = NULL; - ctxt->vctxt.error = NULL; - ctxt->sax->fatalError = NULL; - options -= XML_PARSE_NOERROR; - ctxt->options |= XML_PARSE_NOERROR; - } - if (options & HTML_PARSE_PEDANTIC) { - ctxt->pedantic = 1; - options -= XML_PARSE_PEDANTIC; - ctxt->options |= XML_PARSE_PEDANTIC; - } else - ctxt->pedantic = 0; - if (options & XML_PARSE_NOBLANKS) { - ctxt->keepBlanks = 0; - ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace; - options -= XML_PARSE_NOBLANKS; - ctxt->options |= XML_PARSE_NOBLANKS; - } else - ctxt->keepBlanks = 1; - if (options & HTML_PARSE_RECOVER) { - ctxt->recovery = 1; - options -= HTML_PARSE_RECOVER; - } else - ctxt->recovery = 0; - if (options & HTML_PARSE_COMPACT) { - ctxt->options |= HTML_PARSE_COMPACT; - options -= HTML_PARSE_COMPACT; - } - ctxt->dictNames = 0; - return (options); -} - -/** - * htmlDoRead: - * @ctxt: an HTML parser context - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * @reuse: keep the context for reuse - * - * Common front-end for the htmlRead functions - * - * Returns the resulting document tree or NULL - */ -static htmlDocPtr -htmlDoRead(htmlParserCtxtPtr ctxt, const char *URL, const char *encoding, - int options, int reuse) -{ - htmlDocPtr ret; - - htmlCtxtUseOptions(ctxt, options); - ctxt->html = 1; - if (encoding != NULL) { - xmlCharEncodingHandlerPtr hdlr; - - hdlr = xmlFindCharEncodingHandler(encoding); - if (hdlr != NULL) - xmlSwitchToEncoding(ctxt, hdlr); - } - if ((URL != NULL) && (ctxt->input != NULL) && - (ctxt->input->filename == NULL)) - ctxt->input->filename = (char *) xmlStrdup((const xmlChar *) URL); - htmlParseDocument(ctxt); - ret = ctxt->myDoc; - ctxt->myDoc = NULL; - if (!reuse) { - if ((ctxt->dictNames) && - (ret != NULL) && - (ret->dict == ctxt->dict)) - ctxt->dict = NULL; - xmlFreeParserCtxt(ctxt); - } - return (ret); -} - -/** - * htmlReadDoc: - * @cur: a pointer to a zero terminated string - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an XML in-memory document and build a tree. - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlReadDoc(const xmlChar * cur, const char *URL, const char *encoding, int options) -{ - htmlParserCtxtPtr ctxt; - - if (cur == NULL) - return (NULL); - - xmlInitParser(); - ctxt = htmlCreateDocParserCtxt(cur, NULL); - if (ctxt == NULL) - return (NULL); - return (htmlDoRead(ctxt, URL, encoding, options, 0)); -} - -/** - * htmlReadFile: - * @filename: a file or URL - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an XML file from the filesystem or the network. - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlReadFile(const char *filename, const char *encoding, int options) -{ - htmlParserCtxtPtr ctxt; - - xmlInitParser(); - ctxt = htmlCreateFileParserCtxt(filename, encoding); - if (ctxt == NULL) - return (NULL); - return (htmlDoRead(ctxt, NULL, NULL, options, 0)); -} - -/** - * htmlReadMemory: - * @buffer: a pointer to a char array - * @size: the size of the array - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an XML in-memory document and build a tree. - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlReadMemory(const char *buffer, int size, const char *URL, const char *encoding, int options) -{ - htmlParserCtxtPtr ctxt; - - xmlInitParser(); - ctxt = xmlCreateMemoryParserCtxt(buffer, size); - if (ctxt == NULL) - return (NULL); - htmlDefaultSAXHandlerInit(); - if (ctxt->sax != NULL) - memcpy(ctxt->sax, &htmlDefaultSAXHandler, sizeof(xmlSAXHandlerV1)); - return (htmlDoRead(ctxt, URL, encoding, options, 0)); -} - -/** - * htmlReadFd: - * @fd: an open file descriptor - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an XML from a file descriptor and build a tree. - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlReadFd(int fd, const char *URL, const char *encoding, int options) -{ - htmlParserCtxtPtr ctxt; - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (fd < 0) - return (NULL); - - xmlInitParser(); - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - xmlFreeParserCtxt(ctxt); - return (NULL); - } - inputPush(ctxt, stream); - return (htmlDoRead(ctxt, URL, encoding, options, 0)); -} - -/** - * htmlReadIO: - * @ioread: an I/O read function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an HTML document from I/O functions and source and build a tree. - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlReadIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, - void *ioctx, const char *URL, const char *encoding, int options) -{ - htmlParserCtxtPtr ctxt; - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (ioread == NULL) - return (NULL); - xmlInitParser(); - - input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - ctxt = htmlNewParserCtxt(); - if (ctxt == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - xmlFreeParserCtxt(ctxt); - return (NULL); - } - inputPush(ctxt, stream); - return (htmlDoRead(ctxt, URL, encoding, options, 0)); -} - -/** - * htmlCtxtReadDoc: - * @ctxt: an HTML parser context - * @cur: a pointer to a zero terminated string - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an XML in-memory document and build a tree. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlCtxtReadDoc(htmlParserCtxtPtr ctxt, const xmlChar * cur, - const char *URL, const char *encoding, int options) -{ - xmlParserInputPtr stream; - - if (cur == NULL) - return (NULL); - if (ctxt == NULL) - return (NULL); - - htmlCtxtReset(ctxt); - - stream = xmlNewStringInputStream(ctxt, cur); - if (stream == NULL) { - return (NULL); - } - inputPush(ctxt, stream); - return (htmlDoRead(ctxt, URL, encoding, options, 1)); -} - -/** - * htmlCtxtReadFile: - * @ctxt: an HTML parser context - * @filename: a file or URL - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an XML file from the filesystem or the network. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlCtxtReadFile(htmlParserCtxtPtr ctxt, const char *filename, - const char *encoding, int options) -{ - xmlParserInputPtr stream; - - if (filename == NULL) - return (NULL); - if (ctxt == NULL) - return (NULL); - - htmlCtxtReset(ctxt); - - stream = xmlLoadExternalEntity(filename, NULL, ctxt); - if (stream == NULL) { - return (NULL); - } - inputPush(ctxt, stream); - return (htmlDoRead(ctxt, NULL, encoding, options, 1)); -} - -/** - * htmlCtxtReadMemory: - * @ctxt: an HTML parser context - * @buffer: a pointer to a char array - * @size: the size of the array - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an XML in-memory document and build a tree. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlCtxtReadMemory(htmlParserCtxtPtr ctxt, const char *buffer, int size, - const char *URL, const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (ctxt == NULL) - return (NULL); - if (buffer == NULL) - return (NULL); - - htmlCtxtReset(ctxt); - - input = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); - if (input == NULL) { - return(NULL); - } - - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - return(NULL); - } - - inputPush(ctxt, stream); - return (htmlDoRead(ctxt, URL, encoding, options, 1)); -} - -/** - * htmlCtxtReadFd: - * @ctxt: an HTML parser context - * @fd: an open file descriptor - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an XML from a file descriptor and build a tree. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlCtxtReadFd(htmlParserCtxtPtr ctxt, int fd, - const char *URL, const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (fd < 0) - return (NULL); - if (ctxt == NULL) - return (NULL); - - htmlCtxtReset(ctxt); - - - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - inputPush(ctxt, stream); - return (htmlDoRead(ctxt, URL, encoding, options, 1)); -} - -/** - * htmlCtxtReadIO: - * @ctxt: an HTML parser context - * @ioread: an I/O read function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of htmlParserOption(s) - * - * parse an HTML document from I/O functions and source and build a tree. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -htmlDocPtr -htmlCtxtReadIO(htmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, void *ioctx, - const char *URL, - const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (ioread == NULL) - return (NULL); - if (ctxt == NULL) - return (NULL); - - htmlCtxtReset(ctxt); - - input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - inputPush(ctxt, stream); - return (htmlDoRead(ctxt, URL, encoding, options, 1)); -} - -#define bottom_HTMLparser -#include "elfgcchack.h" -#endif /* LIBXML_HTML_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/HTMLtree.c b/ThirdParty/libxml2/vtklibxml2/HTMLtree.c deleted file mode 100644 index b6b02e5bab0..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/HTMLtree.c +++ /dev/null @@ -1,1213 +0,0 @@ -/* - * HTMLtree.c : implementation of access function for an HTML tree. - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - - -#define IN_LIBXML -#include "libxml.h" -#ifdef LIBXML_HTML_ENABLED - -#include <string.h> /* for memset() only ! */ - -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#include <libxml/xmlmemory.h> -#include <libxml/HTMLparser.h> -#include <libxml/HTMLtree.h> -#include <libxml/entities.h> -#include <libxml/valid.h> -#include <libxml/xmlerror.h> -#include <libxml/parserInternals.h> -#include <libxml/globals.h> -#include <libxml/uri.h> - -/************************************************************************ - * * - * Getting/Setting encoding meta tags * - * * - ************************************************************************/ - -/** - * htmlGetMetaEncoding: - * @doc: the document - * - * Encoding definition lookup in the Meta tags - * - * Returns the current encoding as flagged in the HTML source - */ -const xmlChar * -htmlGetMetaEncoding(htmlDocPtr doc) { - htmlNodePtr cur; - const xmlChar *content; - const xmlChar *encoding; - - if (doc == NULL) - return(NULL); - cur = doc->children; - - /* - * Search the html - */ - while (cur != NULL) { - if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { - if (xmlStrEqual(cur->name, BAD_CAST"html")) - break; - if (xmlStrEqual(cur->name, BAD_CAST"head")) - goto found_head; - if (xmlStrEqual(cur->name, BAD_CAST"meta")) - goto found_meta; - } - cur = cur->next; - } - if (cur == NULL) - return(NULL); - cur = cur->children; - - /* - * Search the head - */ - while (cur != NULL) { - if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { - if (xmlStrEqual(cur->name, BAD_CAST"head")) - break; - if (xmlStrEqual(cur->name, BAD_CAST"meta")) - goto found_meta; - } - cur = cur->next; - } - if (cur == NULL) - return(NULL); -found_head: - cur = cur->children; - - /* - * Search the meta elements - */ -found_meta: - while (cur != NULL) { - if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { - if (xmlStrEqual(cur->name, BAD_CAST"meta")) { - xmlAttrPtr attr = cur->properties; - int http; - const xmlChar *value; - - content = NULL; - http = 0; - while (attr != NULL) { - if ((attr->children != NULL) && - (attr->children->type == XML_TEXT_NODE) && - (attr->children->next == NULL)) { - value = attr->children->content; - if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv")) - && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) - http = 1; - else if ((value != NULL) - && (!xmlStrcasecmp(attr->name, BAD_CAST"content"))) - content = value; - if ((http != 0) && (content != NULL)) - goto found_content; - } - attr = attr->next; - } - } - } - cur = cur->next; - } - return(NULL); - -found_content: - encoding = xmlStrstr(content, BAD_CAST"charset="); - if (encoding == NULL) - encoding = xmlStrstr(content, BAD_CAST"Charset="); - if (encoding == NULL) - encoding = xmlStrstr(content, BAD_CAST"CHARSET="); - if (encoding != NULL) { - encoding += 8; - } else { - encoding = xmlStrstr(content, BAD_CAST"charset ="); - if (encoding == NULL) - encoding = xmlStrstr(content, BAD_CAST"Charset ="); - if (encoding == NULL) - encoding = xmlStrstr(content, BAD_CAST"CHARSET ="); - if (encoding != NULL) - encoding += 9; - } - if (encoding != NULL) { - while ((*encoding == ' ') || (*encoding == '\t')) encoding++; - } - return(encoding); -} - -/** - * htmlSetMetaEncoding: - * @doc: the document - * @encoding: the encoding string - * - * Sets the current encoding in the Meta tags - * NOTE: this will not change the document content encoding, just - * the META flag associated. - * - * Returns 0 in case of success and -1 in case of error - */ -int -htmlSetMetaEncoding(htmlDocPtr doc, const xmlChar *encoding) { - htmlNodePtr cur, meta; - const xmlChar *content; - char newcontent[100]; - - - if (doc == NULL) - return(-1); - - if (encoding != NULL) { - snprintf(newcontent, sizeof(newcontent), "text/html; charset=%s", - (char *)encoding); - newcontent[sizeof(newcontent) - 1] = 0; - } - - cur = doc->children; - - /* - * Search the html - */ - while (cur != NULL) { - if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { - if (xmlStrcasecmp(cur->name, BAD_CAST"html") == 0) - break; - if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0) - goto found_head; - if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) - goto found_meta; - } - cur = cur->next; - } - if (cur == NULL) - return(-1); - cur = cur->children; - - /* - * Search the head - */ - while (cur != NULL) { - if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { - if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0) - break; - if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) - goto found_meta; - } - cur = cur->next; - } - if (cur == NULL) - return(-1); -found_head: - if (cur->children == NULL) { - if (encoding == NULL) - return(0); - meta = xmlNewDocNode(doc, NULL, BAD_CAST"meta", NULL); - xmlAddChild(cur, meta); - xmlNewProp(meta, BAD_CAST"http-equiv", BAD_CAST"Content-Type"); - xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent); - return(0); - } - cur = cur->children; - -found_meta: - if (encoding != NULL) { - /* - * Create a new Meta element with the right attributes - */ - - meta = xmlNewDocNode(doc, NULL, BAD_CAST"meta", NULL); - xmlAddPrevSibling(cur, meta); - xmlNewProp(meta, BAD_CAST"http-equiv", BAD_CAST"Content-Type"); - xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent); - } - - /* - * Search and destroy all the remaining the meta elements carrying - * encoding informations - */ - while (cur != NULL) { - if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { - if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) { - xmlAttrPtr attr = cur->properties; - int http; - const xmlChar *value; - - content = NULL; - http = 0; - while (attr != NULL) { - if ((attr->children != NULL) && - (attr->children->type == XML_TEXT_NODE) && - (attr->children->next == NULL)) { - value = attr->children->content; - if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv")) - && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) - http = 1; - else - { - if ((value != NULL) && - (!xmlStrcasecmp(attr->name, BAD_CAST"content"))) - content = value; - } - if ((http != 0) && (content != NULL)) - break; - } - attr = attr->next; - } - if ((http != 0) && (content != NULL)) { - meta = cur; - cur = cur->next; - xmlUnlinkNode(meta); - xmlFreeNode(meta); - continue; - } - - } - } - cur = cur->next; - } - return(0); -} - -/** - * booleanHTMLAttrs: - * - * These are the HTML attributes which will be output - * in minimized form, i.e. <option selected="selected"> will be - * output as <option selected>, as per XSLT 1.0 16.2 "HTML Output Method" - * - */ -static const char* htmlBooleanAttrs[] = { - "checked", "compact", "declare", "defer", "disabled", "ismap", - "multiple", "nohref", "noresize", "noshade", "nowrap", "readonly", - "selected", NULL -}; - - -/** - * htmlIsBooleanAttr: - * @name: the name of the attribute to check - * - * Determine if a given attribute is a boolean attribute. - * - * returns: false if the attribute is not boolean, true otherwise. - */ -int -htmlIsBooleanAttr(const xmlChar *name) -{ - int i = 0; - - while (htmlBooleanAttrs[i] != NULL) { - if (xmlStrcasecmp((const xmlChar *)htmlBooleanAttrs[i], name) == 0) - return 1; - i++; - } - return 0; -} - -#ifdef LIBXML_OUTPUT_ENABLED -/************************************************************************ - * * - * Output error handlers * - * * - ************************************************************************/ -/** - * htmlSaveErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -htmlSaveErrMemory(const char *extra) -{ - __xmlSimpleError(XML_FROM_OUTPUT, XML_ERR_NO_MEMORY, NULL, NULL, extra); -} - -/** - * htmlSaveErr: - * @code: the error number - * @node: the location of the error. - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -htmlSaveErr(int code, xmlNodePtr node, const char *extra) -{ - const char *msg = NULL; - - switch(code) { - case XML_SAVE_NOT_UTF8: - msg = "string is not in UTF-8\n"; - break; - case XML_SAVE_CHAR_INVALID: - msg = "invalid character value\n"; - break; - case XML_SAVE_UNKNOWN_ENCODING: - msg = "unknown encoding %s\n"; - break; - case XML_SAVE_NO_DOCTYPE: - msg = "HTML has no DOCTYPE\n"; - break; - default: - msg = "unexpected error number\n"; - } - __xmlSimpleError(XML_FROM_OUTPUT, code, node, msg, extra); -} - -/************************************************************************ - * * - * Dumping HTML tree content to a simple buffer * - * * - ************************************************************************/ - -static int -htmlNodeDumpFormat(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, - int format); - -/** - * htmlNodeDumpFormat: - * @buf: the HTML buffer output - * @doc: the document - * @cur: the current node - * @format: should formatting spaces been added - * - * Dump an HTML node, recursive behaviour,children are printed too. - * - * Returns the number of byte written or -1 in case of error - */ -static int -htmlNodeDumpFormat(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, - int format) { - unsigned int use; - int ret; - xmlOutputBufferPtr outbuf; - - if (cur == NULL) { - return (-1); - } - if (buf == NULL) { - return (-1); - } - outbuf = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); - if (outbuf == NULL) { - htmlSaveErrMemory("allocating HTML output buffer"); - return (-1); - } - memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer)); - outbuf->buffer = buf; - outbuf->encoder = NULL; - outbuf->writecallback = NULL; - outbuf->closecallback = NULL; - outbuf->context = NULL; - outbuf->written = 0; - - use = buf->use; - htmlNodeDumpFormatOutput(outbuf, doc, cur, NULL, format); - xmlFree(outbuf); - ret = buf->use - use; - return (ret); -} - -/** - * htmlNodeDump: - * @buf: the HTML buffer output - * @doc: the document - * @cur: the current node - * - * Dump an HTML node, recursive behaviour,children are printed too, - * and formatting returns are added. - * - * Returns the number of byte written or -1 in case of error - */ -int -htmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur) { - xmlInitParser(); - - return(htmlNodeDumpFormat(buf, doc, cur, 1)); -} - -/** - * htmlNodeDumpFileFormat: - * @out: the FILE pointer - * @doc: the document - * @cur: the current node - * @encoding: the document encoding - * @format: should formatting spaces been added - * - * Dump an HTML node, recursive behaviour,children are printed too. - * - * TODO: if encoding == NULL try to save in the doc encoding - * - * returns: the number of byte written or -1 in case of failure. - */ -int -htmlNodeDumpFileFormat(FILE *out, xmlDocPtr doc, - xmlNodePtr cur, const char *encoding, int format) { - xmlOutputBufferPtr buf; - xmlCharEncodingHandlerPtr handler = NULL; - int ret; - - xmlInitParser(); - - if (encoding != NULL) { - xmlCharEncoding enc; - - enc = xmlParseCharEncoding(encoding); - if (enc != XML_CHAR_ENCODING_UTF8) { - handler = xmlFindCharEncodingHandler(encoding); - if (handler == NULL) - return(-1); - } - } - - /* - * Fallback to HTML or ASCII when the encoding is unspecified - */ - if (handler == NULL) - handler = xmlFindCharEncodingHandler("HTML"); - if (handler == NULL) - handler = xmlFindCharEncodingHandler("ascii"); - - /* - * save the content to a temp buffer. - */ - buf = xmlOutputBufferCreateFile(out, handler); - if (buf == NULL) return(0); - - htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format); - - ret = xmlOutputBufferClose(buf); - return(ret); -} - -/** - * htmlNodeDumpFile: - * @out: the FILE pointer - * @doc: the document - * @cur: the current node - * - * Dump an HTML node, recursive behaviour,children are printed too, - * and formatting returns are added. - */ -void -htmlNodeDumpFile(FILE *out, xmlDocPtr doc, xmlNodePtr cur) { - htmlNodeDumpFileFormat(out, doc, cur, NULL, 1); -} - -/** - * htmlDocDumpMemoryFormat: - * @cur: the document - * @mem: OUT: the memory pointer - * @size: OUT: the memory length - * @format: should formatting spaces been added - * - * Dump an HTML document in memory and return the xmlChar * and it's size. - * It's up to the caller to free the memory. - */ -void -htmlDocDumpMemoryFormat(xmlDocPtr cur, xmlChar**mem, int *size, int format) { - xmlOutputBufferPtr buf; - xmlCharEncodingHandlerPtr handler = NULL; - const char *encoding; - - xmlInitParser(); - - if ((mem == NULL) || (size == NULL)) - return; - if (cur == NULL) { - *mem = NULL; - *size = 0; - return; - } - - encoding = (const char *) htmlGetMetaEncoding(cur); - - if (encoding != NULL) { - xmlCharEncoding enc; - - enc = xmlParseCharEncoding(encoding); - if (enc != cur->charset) { - if (cur->charset != XML_CHAR_ENCODING_UTF8) { - /* - * Not supported yet - */ - *mem = NULL; - *size = 0; - return; - } - - handler = xmlFindCharEncodingHandler(encoding); - if (handler == NULL) { - *mem = NULL; - *size = 0; - return; - } - } else { - handler = xmlFindCharEncodingHandler(encoding); - } - } - - /* - * Fallback to HTML or ASCII when the encoding is unspecified - */ - if (handler == NULL) - handler = xmlFindCharEncodingHandler("HTML"); - if (handler == NULL) - handler = xmlFindCharEncodingHandler("ascii"); - - buf = xmlAllocOutputBuffer(handler); - if (buf == NULL) { - *mem = NULL; - *size = 0; - return; - } - - htmlDocContentDumpFormatOutput(buf, cur, NULL, format); - - xmlOutputBufferFlush(buf); - if (buf->conv != NULL) { - *size = buf->conv->use; - *mem = xmlStrndup(buf->conv->content, *size); - } else { - *size = buf->buffer->use; - *mem = xmlStrndup(buf->buffer->content, *size); - } - (void)xmlOutputBufferClose(buf); -} - -/** - * htmlDocDumpMemory: - * @cur: the document - * @mem: OUT: the memory pointer - * @size: OUT: the memory length - * - * Dump an HTML document in memory and return the xmlChar * and it's size. - * It's up to the caller to free the memory. - */ -void -htmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) { - htmlDocDumpMemoryFormat(cur, mem, size, 1); -} - - -/************************************************************************ - * * - * Dumping HTML tree content to an I/O output buffer * - * * - ************************************************************************/ - -void xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur); - -/** - * htmlDtdDumpOutput: - * @buf: the HTML buffer output - * @doc: the document - * @encoding: the encoding string - * - * TODO: check whether encoding is needed - * - * Dump the HTML document DTD, if any. - */ -static void -htmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, - const char *encoding ATTRIBUTE_UNUSED) { - xmlDtdPtr cur = doc->intSubset; - - if (cur == NULL) { - htmlSaveErr(XML_SAVE_NO_DOCTYPE, (xmlNodePtr) doc, NULL); - return; - } - xmlOutputBufferWriteString(buf, "<!DOCTYPE "); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - if (cur->ExternalID != NULL) { - xmlOutputBufferWriteString(buf, " PUBLIC "); - xmlBufferWriteQuotedString(buf->buffer, cur->ExternalID); - if (cur->SystemID != NULL) { - xmlOutputBufferWriteString(buf, " "); - xmlBufferWriteQuotedString(buf->buffer, cur->SystemID); - } - } else if (cur->SystemID != NULL) { - xmlOutputBufferWriteString(buf, " SYSTEM "); - xmlBufferWriteQuotedString(buf->buffer, cur->SystemID); - } - xmlOutputBufferWriteString(buf, ">\n"); -} - -/** - * htmlAttrDumpOutput: - * @buf: the HTML buffer output - * @doc: the document - * @cur: the attribute pointer - * @encoding: the encoding string - * - * Dump an HTML attribute - */ -static void -htmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur, - const char *encoding ATTRIBUTE_UNUSED) { - xmlChar *value; - - /* - * TODO: The html output method should not escape a & character - * occurring in an attribute value immediately followed by - * a { character (see Section B.7.1 of the HTML 4.0 Recommendation). - */ - - if (cur == NULL) { - return; - } - xmlOutputBufferWriteString(buf, " "); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWriteString(buf, ":"); - } - xmlOutputBufferWriteString(buf, (const char *)cur->name); - if ((cur->children != NULL) && (!htmlIsBooleanAttr(cur->name))) { - value = xmlNodeListGetString(doc, cur->children, 0); - if (value) { - xmlOutputBufferWriteString(buf, "="); - if ((cur->ns == NULL) && (cur->parent != NULL) && - (cur->parent->ns == NULL) && - ((!xmlStrcasecmp(cur->name, BAD_CAST "href")) || - (!xmlStrcasecmp(cur->name, BAD_CAST "action")) || - (!xmlStrcasecmp(cur->name, BAD_CAST "src")) || - ((!xmlStrcasecmp(cur->name, BAD_CAST "name")) && - (!xmlStrcasecmp(cur->parent->name, BAD_CAST "a"))))) { - xmlChar *escaped; - xmlChar *tmp = value; - - while (IS_BLANK_CH(*tmp)) tmp++; - - escaped = xmlURIEscapeStr(tmp, BAD_CAST"@/:=?;#%&,+"); - if (escaped != NULL) { - xmlBufferWriteQuotedString(buf->buffer, escaped); - xmlFree(escaped); - } else { - xmlBufferWriteQuotedString(buf->buffer, value); - } - } else { - xmlBufferWriteQuotedString(buf->buffer, value); - } - xmlFree(value); - } else { - xmlOutputBufferWriteString(buf, "=\"\""); - } - } -} - -/** - * htmlAttrListDumpOutput: - * @buf: the HTML buffer output - * @doc: the document - * @cur: the first attribute pointer - * @encoding: the encoding string - * - * Dump a list of HTML attributes - */ -static void -htmlAttrListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur, const char *encoding) { - if (cur == NULL) { - return; - } - while (cur != NULL) { - htmlAttrDumpOutput(buf, doc, cur, encoding); - cur = cur->next; - } -} - - - -/** - * htmlNodeListDumpOutput: - * @buf: the HTML buffer output - * @doc: the document - * @cur: the first node - * @encoding: the encoding string - * @format: should formatting spaces been added - * - * Dump an HTML node list, recursive behaviour,children are printed too. - */ -static void -htmlNodeListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, - xmlNodePtr cur, const char *encoding, int format) { - if (cur == NULL) { - return; - } - while (cur != NULL) { - htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format); - cur = cur->next; - } -} - -/** - * htmlNodeDumpFormatOutput: - * @buf: the HTML buffer output - * @doc: the document - * @cur: the current node - * @encoding: the encoding string - * @format: should formatting spaces been added - * - * Dump an HTML node, recursive behaviour,children are printed too. - */ -void -htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, - xmlNodePtr cur, const char *encoding, int format) { - const htmlElemDesc * info; - - xmlInitParser(); - - if ((cur == NULL) || (buf == NULL)) { - return; - } - /* - * Special cases. - */ - if (cur->type == XML_DTD_NODE) - return; - if ((cur->type == XML_HTML_DOCUMENT_NODE) || - (cur->type == XML_DOCUMENT_NODE)){ - htmlDocContentDumpOutput(buf, (xmlDocPtr) cur, encoding); - return; - } - if (cur->type == HTML_TEXT_NODE) { - if (cur->content != NULL) { - if (((cur->name == (const xmlChar *)xmlStringText) || - (cur->name != (const xmlChar *)xmlStringTextNoenc)) && - ((cur->parent == NULL) || - ((xmlStrcasecmp(cur->parent->name, BAD_CAST "script")) && - (xmlStrcasecmp(cur->parent->name, BAD_CAST "style"))))) { - xmlChar *buffer; - - buffer = xmlEncodeEntitiesReentrant(doc, cur->content); - if (buffer != NULL) { - xmlOutputBufferWriteString(buf, (const char *)buffer); - xmlFree(buffer); - } - } else { - xmlOutputBufferWriteString(buf, (const char *)cur->content); - } - } - return; - } - if (cur->type == HTML_COMMENT_NODE) { - if (cur->content != NULL) { - xmlOutputBufferWriteString(buf, "<!--"); - xmlOutputBufferWriteString(buf, (const char *)cur->content); - xmlOutputBufferWriteString(buf, "-->"); - } - return; - } - if (cur->type == HTML_PI_NODE) { - if (cur->name == NULL) - return; - xmlOutputBufferWriteString(buf, "<?"); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - if (cur->content != NULL) { - xmlOutputBufferWriteString(buf, " "); - xmlOutputBufferWriteString(buf, (const char *)cur->content); - } - xmlOutputBufferWriteString(buf, ">"); - return; - } - if (cur->type == HTML_ENTITY_REF_NODE) { - xmlOutputBufferWriteString(buf, "&"); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWriteString(buf, ";"); - return; - } - if (cur->type == HTML_PRESERVE_NODE) { - if (cur->content != NULL) { - xmlOutputBufferWriteString(buf, (const char *)cur->content); - } - return; - } - - /* - * Get specific HTML info for that node. - */ - if (cur->ns == NULL) - info = htmlTagLookup(cur->name); - else - info = NULL; - - xmlOutputBufferWriteString(buf, "<"); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWriteString(buf, ":"); - } - xmlOutputBufferWriteString(buf, (const char *)cur->name); - if (cur->nsDef) - xmlNsListDumpOutput(buf, cur->nsDef); - if (cur->properties != NULL) - htmlAttrListDumpOutput(buf, doc, cur->properties, encoding); - - if ((info != NULL) && (info->empty)) { - xmlOutputBufferWriteString(buf, ">"); - if ((format) && (!info->isinline) && (cur->next != NULL)) { - if ((cur->next->type != HTML_TEXT_NODE) && - (cur->next->type != HTML_ENTITY_REF_NODE) && - (cur->parent != NULL) && - (cur->parent->name != NULL) && - (cur->parent->name[0] != 'p')) /* p, pre, param */ - xmlOutputBufferWriteString(buf, "\n"); - } - return; - } - if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) && - (cur->children == NULL)) { - if ((info != NULL) && (info->saveEndTag != 0) && - (xmlStrcmp(BAD_CAST info->name, BAD_CAST "html")) && - (xmlStrcmp(BAD_CAST info->name, BAD_CAST "body"))) { - xmlOutputBufferWriteString(buf, ">"); - } else { - xmlOutputBufferWriteString(buf, "></"); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWriteString(buf, ":"); - } - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWriteString(buf, ">"); - } - if ((format) && (cur->next != NULL) && - (info != NULL) && (!info->isinline)) { - if ((cur->next->type != HTML_TEXT_NODE) && - (cur->next->type != HTML_ENTITY_REF_NODE) && - (cur->parent != NULL) && - (cur->parent->name != NULL) && - (cur->parent->name[0] != 'p')) /* p, pre, param */ - xmlOutputBufferWriteString(buf, "\n"); - } - return; - } - xmlOutputBufferWriteString(buf, ">"); - if ((cur->type != XML_ELEMENT_NODE) && - (cur->content != NULL)) { - /* - * Uses the OutputBuffer property to automatically convert - * invalids to charrefs - */ - - xmlOutputBufferWriteString(buf, (const char *) cur->content); - } - if (cur->children != NULL) { - if ((format) && (info != NULL) && (!info->isinline) && - (cur->children->type != HTML_TEXT_NODE) && - (cur->children->type != HTML_ENTITY_REF_NODE) && - (cur->children != cur->last) && - (cur->name != NULL) && - (cur->name[0] != 'p')) /* p, pre, param */ - xmlOutputBufferWriteString(buf, "\n"); - htmlNodeListDumpOutput(buf, doc, cur->children, encoding, format); - if ((format) && (info != NULL) && (!info->isinline) && - (cur->last->type != HTML_TEXT_NODE) && - (cur->last->type != HTML_ENTITY_REF_NODE) && - (cur->children != cur->last) && - (cur->name != NULL) && - (cur->name[0] != 'p')) /* p, pre, param */ - xmlOutputBufferWriteString(buf, "\n"); - } - xmlOutputBufferWriteString(buf, "</"); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWriteString(buf, ":"); - } - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWriteString(buf, ">"); - if ((format) && (info != NULL) && (!info->isinline) && - (cur->next != NULL)) { - if ((cur->next->type != HTML_TEXT_NODE) && - (cur->next->type != HTML_ENTITY_REF_NODE) && - (cur->parent != NULL) && - (cur->parent->name != NULL) && - (cur->parent->name[0] != 'p')) /* p, pre, param */ - xmlOutputBufferWriteString(buf, "\n"); - } -} - -/** - * htmlNodeDumpOutput: - * @buf: the HTML buffer output - * @doc: the document - * @cur: the current node - * @encoding: the encoding string - * - * Dump an HTML node, recursive behaviour,children are printed too, - * and formatting returns/spaces are added. - */ -void -htmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, - xmlNodePtr cur, const char *encoding) { - htmlNodeDumpFormatOutput(buf, doc, cur, encoding, 1); -} - -/** - * htmlDocContentDumpFormatOutput: - * @buf: the HTML buffer output - * @cur: the document - * @encoding: the encoding string - * @format: should formatting spaces been added - * - * Dump an HTML document. - */ -void -htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur, - const char *encoding, int format) { - int type; - - xmlInitParser(); - - if ((buf == NULL) || (cur == NULL)) - return; - - /* - * force to output the stuff as HTML, especially for entities - */ - type = cur->type; - cur->type = XML_HTML_DOCUMENT_NODE; - if (cur->intSubset != NULL) { - htmlDtdDumpOutput(buf, cur, NULL); - } - if (cur->children != NULL) { - htmlNodeListDumpOutput(buf, cur, cur->children, encoding, format); - } - xmlOutputBufferWriteString(buf, "\n"); - cur->type = (xmlElementType) type; -} - -/** - * htmlDocContentDumpOutput: - * @buf: the HTML buffer output - * @cur: the document - * @encoding: the encoding string - * - * Dump an HTML document. Formating return/spaces are added. - */ -void -htmlDocContentDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr cur, - const char *encoding) { - htmlDocContentDumpFormatOutput(buf, cur, encoding, 1); -} - -/************************************************************************ - * * - * Saving functions front-ends * - * * - ************************************************************************/ - -/** - * htmlDocDump: - * @f: the FILE* - * @cur: the document - * - * Dump an HTML document to an open FILE. - * - * returns: the number of byte written or -1 in case of failure. - */ -int -htmlDocDump(FILE *f, xmlDocPtr cur) { - xmlOutputBufferPtr buf; - xmlCharEncodingHandlerPtr handler = NULL; - const char *encoding; - int ret; - - xmlInitParser(); - - if ((cur == NULL) || (f == NULL)) { - return(-1); - } - - encoding = (const char *) htmlGetMetaEncoding(cur); - - if (encoding != NULL) { - xmlCharEncoding enc; - - enc = xmlParseCharEncoding(encoding); - if (enc != cur->charset) { - if (cur->charset != XML_CHAR_ENCODING_UTF8) { - /* - * Not supported yet - */ - return(-1); - } - - handler = xmlFindCharEncodingHandler(encoding); - if (handler == NULL) - return(-1); - } else { - handler = xmlFindCharEncodingHandler(encoding); - } - } - - /* - * Fallback to HTML or ASCII when the encoding is unspecified - */ - if (handler == NULL) - handler = xmlFindCharEncodingHandler("HTML"); - if (handler == NULL) - handler = xmlFindCharEncodingHandler("ascii"); - - buf = xmlOutputBufferCreateFile(f, handler); - if (buf == NULL) return(-1); - htmlDocContentDumpOutput(buf, cur, NULL); - - ret = xmlOutputBufferClose(buf); - return(ret); -} - -/** - * htmlSaveFile: - * @filename: the filename (or URL) - * @cur: the document - * - * Dump an HTML document to a file. If @filename is "-" the stdout file is - * used. - * returns: the number of byte written or -1 in case of failure. - */ -int -htmlSaveFile(const char *filename, xmlDocPtr cur) { - xmlOutputBufferPtr buf; - xmlCharEncodingHandlerPtr handler = NULL; - const char *encoding; - int ret; - - if ((cur == NULL) || (filename == NULL)) - return(-1); - - xmlInitParser(); - - encoding = (const char *) htmlGetMetaEncoding(cur); - - if (encoding != NULL) { - xmlCharEncoding enc; - - enc = xmlParseCharEncoding(encoding); - if (enc != cur->charset) { - if (cur->charset != XML_CHAR_ENCODING_UTF8) { - /* - * Not supported yet - */ - return(-1); - } - - handler = xmlFindCharEncodingHandler(encoding); - if (handler == NULL) - return(-1); - } - } - - /* - * Fallback to HTML or ASCII when the encoding is unspecified - */ - if (handler == NULL) - handler = xmlFindCharEncodingHandler("HTML"); - if (handler == NULL) - handler = xmlFindCharEncodingHandler("ascii"); - - /* - * save the content to a temp buffer. - */ - buf = xmlOutputBufferCreateFilename(filename, handler, cur->compression); - if (buf == NULL) return(0); - - htmlDocContentDumpOutput(buf, cur, NULL); - - ret = xmlOutputBufferClose(buf); - return(ret); -} - -/** - * htmlSaveFileFormat: - * @filename: the filename - * @cur: the document - * @format: should formatting spaces been added - * @encoding: the document encoding - * - * Dump an HTML document to a file using a given encoding. - * - * returns: the number of byte written or -1 in case of failure. - */ -int -htmlSaveFileFormat(const char *filename, xmlDocPtr cur, - const char *encoding, int format) { - xmlOutputBufferPtr buf; - xmlCharEncodingHandlerPtr handler = NULL; - int ret; - - if ((cur == NULL) || (filename == NULL)) - return(-1); - - xmlInitParser(); - - if (encoding != NULL) { - xmlCharEncoding enc; - - enc = xmlParseCharEncoding(encoding); - if (enc != cur->charset) { - if (cur->charset != XML_CHAR_ENCODING_UTF8) { - /* - * Not supported yet - */ - return(-1); - } - - handler = xmlFindCharEncodingHandler(encoding); - if (handler == NULL) - return(-1); - htmlSetMetaEncoding(cur, (const xmlChar *) encoding); - } - } else { - htmlSetMetaEncoding(cur, (const xmlChar *) "UTF-8"); - } - - /* - * Fallback to HTML or ASCII when the encoding is unspecified - */ - if (handler == NULL) - handler = xmlFindCharEncodingHandler("HTML"); - if (handler == NULL) - handler = xmlFindCharEncodingHandler("ascii"); - - /* - * save the content to a temp buffer. - */ - buf = xmlOutputBufferCreateFilename(filename, handler, 0); - if (buf == NULL) return(0); - - htmlDocContentDumpFormatOutput(buf, cur, encoding, format); - - ret = xmlOutputBufferClose(buf); - return(ret); -} - -/** - * htmlSaveFileEnc: - * @filename: the filename - * @cur: the document - * @encoding: the document encoding - * - * Dump an HTML document to a file using a given encoding - * and formatting returns/spaces are added. - * - * returns: the number of byte written or -1 in case of failure. - */ -int -htmlSaveFileEnc(const char *filename, xmlDocPtr cur, const char *encoding) { - return(htmlSaveFileFormat(filename, cur, encoding, 1)); -} - -#endif /* LIBXML_OUTPUT_ENABLED */ - -#define bottom_HTMLtree -#include "elfgcchack.h" -#endif /* LIBXML_HTML_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/SAX.c b/ThirdParty/libxml2/vtklibxml2/SAX.c deleted file mode 100644 index 6ce1859e0c2..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/SAX.c +++ /dev/null @@ -1,180 +0,0 @@ -/* - * SAX.c : Old SAX v1 handlers to build a tree. - * Deprecated except for compatibility - * - * See Copyright for the status of this software. - * - * Daniel Veillard <daniel@veillard.com> - */ - - -#define IN_LIBXML -#include "libxml.h" -#include <stdlib.h> -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/valid.h> -#include <libxml/entities.h> -#include <libxml/xmlerror.h> -#include <libxml/debugXML.h> -#include <libxml/xmlIO.h> -#include <libxml/SAX.h> -#include <libxml/uri.h> -#include <libxml/valid.h> -#include <libxml/HTMLtree.h> -#include <libxml/globals.h> -#include <libxml/SAX2.h> - -#ifdef LIBXML_LEGACY_ENABLED -#ifdef LIBXML_SAX1_ENABLED -/** - * initxmlDefaultSAXHandler: - * @hdlr: the SAX handler - * @warning: flag if non-zero sets the handler warning procedure - * - * Initialize the default XML SAX version 1 handler - * DEPRECATED: use xmlSAX2InitDefaultSAXHandler() for the new SAX2 blocks - */ -void -initxmlDefaultSAXHandler(xmlSAXHandlerV1 *hdlr, int warning) -{ - - if(hdlr->initialized == 1) - return; - - hdlr->internalSubset = xmlSAX2InternalSubset; - hdlr->externalSubset = xmlSAX2ExternalSubset; - hdlr->isStandalone = xmlSAX2IsStandalone; - hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; - hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; - hdlr->resolveEntity = xmlSAX2ResolveEntity; - hdlr->getEntity = xmlSAX2GetEntity; - hdlr->getParameterEntity = xmlSAX2GetParameterEntity; - hdlr->entityDecl = xmlSAX2EntityDecl; - hdlr->attributeDecl = xmlSAX2AttributeDecl; - hdlr->elementDecl = xmlSAX2ElementDecl; - hdlr->notationDecl = xmlSAX2NotationDecl; - hdlr->unparsedEntityDecl = xmlSAX2UnparsedEntityDecl; - hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; - hdlr->startDocument = xmlSAX2StartDocument; - hdlr->endDocument = xmlSAX2EndDocument; - hdlr->startElement = xmlSAX2StartElement; - hdlr->endElement = xmlSAX2EndElement; - hdlr->reference = xmlSAX2Reference; - hdlr->characters = xmlSAX2Characters; - hdlr->cdataBlock = xmlSAX2CDataBlock; - hdlr->ignorableWhitespace = xmlSAX2Characters; - hdlr->processingInstruction = xmlSAX2ProcessingInstruction; - if (warning == 0) - hdlr->warning = NULL; - else - hdlr->warning = xmlParserWarning; - hdlr->error = xmlParserError; - hdlr->fatalError = xmlParserError; - - hdlr->initialized = 1; -} - -#ifdef LIBXML_HTML_ENABLED - -/** - * inithtmlDefaultSAXHandler: - * @hdlr: the SAX handler - * - * Initialize the default HTML SAX version 1 handler - * DEPRECATED: use xmlSAX2InitHtmlDefaultSAXHandler() for the new SAX2 blocks - */ -void -inithtmlDefaultSAXHandler(xmlSAXHandlerV1 *hdlr) -{ - if(hdlr->initialized == 1) - return; - - hdlr->internalSubset = xmlSAX2InternalSubset; - hdlr->externalSubset = NULL; - hdlr->isStandalone = NULL; - hdlr->hasInternalSubset = NULL; - hdlr->hasExternalSubset = NULL; - hdlr->resolveEntity = NULL; - hdlr->getEntity = xmlSAX2GetEntity; - hdlr->getParameterEntity = NULL; - hdlr->entityDecl = NULL; - hdlr->attributeDecl = NULL; - hdlr->elementDecl = NULL; - hdlr->notationDecl = NULL; - hdlr->unparsedEntityDecl = NULL; - hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; - hdlr->startDocument = xmlSAX2StartDocument; - hdlr->endDocument = xmlSAX2EndDocument; - hdlr->startElement = xmlSAX2StartElement; - hdlr->endElement = xmlSAX2EndElement; - hdlr->reference = NULL; - hdlr->characters = xmlSAX2Characters; - hdlr->cdataBlock = xmlSAX2CDataBlock; - hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; - hdlr->processingInstruction = xmlSAX2ProcessingInstruction; - hdlr->comment = xmlSAX2Comment; - hdlr->warning = xmlParserWarning; - hdlr->error = xmlParserError; - hdlr->fatalError = xmlParserError; - - hdlr->initialized = 1; -} - -#endif /* LIBXML_HTML_ENABLED */ - -#ifdef LIBXML_DOCB_ENABLED -/** - * initdocbDefaultSAXHandler: - * @hdlr: the SAX handler - * - * Initialize the default DocBook SAX version 1 handler - * DEPRECATED: use xmlSAX2InitDocbDefaultSAXHandler() for the new SAX2 blocks - */ -void -initdocbDefaultSAXHandler(xmlSAXHandlerV1 *hdlr) -{ - if(hdlr->initialized == 1) - return; - - hdlr->internalSubset = xmlSAX2InternalSubset; - hdlr->externalSubset = NULL; - hdlr->isStandalone = xmlSAX2IsStandalone; - hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; - hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; - hdlr->resolveEntity = xmlSAX2ResolveEntity; - hdlr->getEntity = xmlSAX2GetEntity; - hdlr->getParameterEntity = NULL; - hdlr->entityDecl = xmlSAX2EntityDecl; - hdlr->attributeDecl = NULL; - hdlr->elementDecl = NULL; - hdlr->notationDecl = NULL; - hdlr->unparsedEntityDecl = NULL; - hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; - hdlr->startDocument = xmlSAX2StartDocument; - hdlr->endDocument = xmlSAX2EndDocument; - hdlr->startElement = xmlSAX2StartElement; - hdlr->endElement = xmlSAX2EndElement; - hdlr->reference = xmlSAX2Reference; - hdlr->characters = xmlSAX2Characters; - hdlr->cdataBlock = NULL; - hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; - hdlr->processingInstruction = NULL; - hdlr->comment = xmlSAX2Comment; - hdlr->warning = xmlParserWarning; - hdlr->error = xmlParserError; - hdlr->fatalError = xmlParserError; - - hdlr->initialized = 1; -} - -#endif /* LIBXML_DOCB_ENABLED */ - -#endif /* LIBXML_SAX1_ENABLED */ - -#define bottom_SAX -#include "elfgcchack.h" -#endif /* LIBXML_LEGACY_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/SAX2.c b/ThirdParty/libxml2/vtklibxml2/SAX2.c deleted file mode 100644 index 0ada943db40..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/SAX2.c +++ /dev/null @@ -1,2891 +0,0 @@ -/* - * SAX2.c : Default SAX2 handler to build a tree. - * - * See Copyright for the status of this software. - * - * Daniel Veillard <daniel@veillard.com> - */ - - -#define IN_LIBXML -#include "libxml.h" -#include <stdlib.h> -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/valid.h> -#include <libxml/entities.h> -#include <libxml/xmlerror.h> -#include <libxml/debugXML.h> -#include <libxml/xmlIO.h> -#include <libxml/SAX.h> -#include <libxml/uri.h> -#include <libxml/valid.h> -#include <libxml/HTMLtree.h> -#include <libxml/globals.h> - -/* #define DEBUG_SAX2 */ -/* #define DEBUG_SAX2_TREE */ - -/** - * TODO: - * - * macro to flag unimplemented blocks - * XML_CATALOG_PREFER user env to select between system/public prefered - * option. C.f. Richard Tobin <richard@cogsci.ed.ac.uk> - *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with - *> values "system" and "public". I have made the default be "system" to - *> match yours. - */ -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -/* - * xmlSAX2ErrMemory: - * @ctxt: an XML validation parser context - * @msg: a string to accompany the error message - */ -static void -xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt, const char *msg) { - if (ctxt != NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, "%s: out of memory\n", msg); - ctxt->errNo = XML_ERR_NO_MEMORY; - ctxt->instate = XML_PARSER_EOF; - ctxt->disableSAX = 1; - } -} - -/** - * xmlValidError: - * @ctxt: an XML validation parser context - * @error: the error number - * @msg: the error message - * @str1: extra data - * @str2: extra data - * - * Handle a validation error - */ -static void -xmlErrValid(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const char *str1, const char *str2) -{ - xmlStructuredErrorFunc schannel = NULL; - - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) { - ctxt->errNo = error; - if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC)) - schannel = ctxt->sax->serror; - __xmlRaiseError(schannel, - ctxt->vctxt.error, ctxt->vctxt.userData, - ctxt, NULL, XML_FROM_DTD, error, - XML_ERR_ERROR, NULL, 0, (const char *) str1, - (const char *) str2, NULL, 0, 0, - msg, (const char *) str1, (const char *) str2); - ctxt->valid = 0; - } else { - __xmlRaiseError(schannel, - NULL, NULL, - ctxt, NULL, XML_FROM_DTD, error, - XML_ERR_ERROR, NULL, 0, (const char *) str1, - (const char *) str2, NULL, 0, 0, - msg, (const char *) str1, (const char *) str2); - } -} - -/** - * xmlFatalErrMsg: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @str1: an error string - * @str2: an error string - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar *str1, const xmlChar *str2) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, - XML_ERR_FATAL, NULL, 0, - (const char *) str1, (const char *) str2, - NULL, 0, 0, msg, str1, str2); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - ctxt->valid = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlWarnMsg: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @str1: an error string - * @str2: an error string - * - * Handle a parser warning - */ -static void -xmlWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar *str1) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, - XML_ERR_WARNING, NULL, 0, - (const char *) str1, NULL, - NULL, 0, 0, msg, str1); -} - -/** - * xmlNsErrMsg: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @str1: an error string - * @str2: an error string - * - * Handle a namespace error - */ -static void -xmlNsErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar *str1, const xmlChar *str2) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, - XML_ERR_ERROR, NULL, 0, - (const char *) str1, (const char *) str2, - NULL, 0, 0, msg, str1, str2); -} - -/** - * xmlNsWarnMsg: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @str1: an error string - * - * Handle a namespace warning - */ -static void -xmlNsWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar *str1, const xmlChar *str2) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, - XML_ERR_WARNING, NULL, 0, - (const char *) str1, (const char *) str2, - NULL, 0, 0, msg, str1, str2); -} - -/** - * xmlSAX2GetPublicId: - * @ctx: the user data (XML parser context) - * - * Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" - * - * Returns a xmlChar * - */ -const xmlChar * -xmlSAX2GetPublicId(void *ctx ATTRIBUTE_UNUSED) -{ - /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ - return(NULL); -} - -/** - * xmlSAX2GetSystemId: - * @ctx: the user data (XML parser context) - * - * Provides the system ID, basically URL or filename e.g. - * http://www.sgmlsource.com/dtds/memo.dtd - * - * Returns a xmlChar * - */ -const xmlChar * -xmlSAX2GetSystemId(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - if ((ctx == NULL) || (ctxt->input == NULL)) return(NULL); - return((const xmlChar *) ctxt->input->filename); -} - -/** - * xmlSAX2GetLineNumber: - * @ctx: the user data (XML parser context) - * - * Provide the line number of the current parsing point. - * - * Returns an int - */ -int -xmlSAX2GetLineNumber(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - if ((ctx == NULL) || (ctxt->input == NULL)) return(0); - return(ctxt->input->line); -} - -/** - * xmlSAX2GetColumnNumber: - * @ctx: the user data (XML parser context) - * - * Provide the column number of the current parsing point. - * - * Returns an int - */ -int -xmlSAX2GetColumnNumber(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - if ((ctx == NULL) || (ctxt->input == NULL)) return(0); - return(ctxt->input->col); -} - -/** - * xmlSAX2IsStandalone: - * @ctx: the user data (XML parser context) - * - * Is this document tagged standalone ? - * - * Returns 1 if true - */ -int -xmlSAX2IsStandalone(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - if ((ctx == NULL) || (ctxt->myDoc == NULL)) return(0); - return(ctxt->myDoc->standalone == 1); -} - -/** - * xmlSAX2HasInternalSubset: - * @ctx: the user data (XML parser context) - * - * Does this document has an internal subset - * - * Returns 1 if true - */ -int -xmlSAX2HasInternalSubset(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return(0); - return(ctxt->myDoc->intSubset != NULL); -} - -/** - * xmlSAX2HasExternalSubset: - * @ctx: the user data (XML parser context) - * - * Does this document has an external subset - * - * Returns 1 if true - */ -int -xmlSAX2HasExternalSubset(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return(0); - return(ctxt->myDoc->extSubset != NULL); -} - -/** - * xmlSAX2InternalSubset: - * @ctx: the user data (XML parser context) - * @name: the root element name - * @ExternalID: the external ID - * @SystemID: the SYSTEM ID (e.g. filename or URL) - * - * Callback on internal subset declaration. - */ -void -xmlSAX2InternalSubset(void *ctx, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlDtdPtr dtd; - if (ctx == NULL) return; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2InternalSubset(%s, %s, %s)\n", - name, ExternalID, SystemID); -#endif - - if (ctxt->myDoc == NULL) - return; - dtd = xmlGetIntSubset(ctxt->myDoc); - if (dtd != NULL) { - if (ctxt->html) - return; - xmlUnlinkNode((xmlNodePtr) dtd); - xmlFreeDtd(dtd); - ctxt->myDoc->intSubset = NULL; - } - ctxt->myDoc->intSubset = - xmlCreateIntSubset(ctxt->myDoc, name, ExternalID, SystemID); - if (ctxt->myDoc->intSubset == NULL) - xmlSAX2ErrMemory(ctxt, "xmlSAX2InternalSubset"); -} - -/** - * xmlSAX2ExternalSubset: - * @ctx: the user data (XML parser context) - * @name: the root element name - * @ExternalID: the external ID - * @SystemID: the SYSTEM ID (e.g. filename or URL) - * - * Callback on external subset declaration. - */ -void -xmlSAX2ExternalSubset(void *ctx, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - if (ctx == NULL) return; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2ExternalSubset(%s, %s, %s)\n", - name, ExternalID, SystemID); -#endif - if (((ExternalID != NULL) || (SystemID != NULL)) && - (((ctxt->validate) || (ctxt->loadsubset != 0)) && - (ctxt->wellFormed && ctxt->myDoc))) { - /* - * Try to fetch and parse the external subset. - */ - xmlParserInputPtr oldinput; - int oldinputNr; - int oldinputMax; - xmlParserInputPtr *oldinputTab; - xmlParserInputPtr input = NULL; - xmlCharEncoding enc; - int oldcharset; - - /* - * Ask the Entity resolver to load the damn thing - */ - if ((ctxt->sax != NULL) && (ctxt->sax->resolveEntity != NULL)) - input = ctxt->sax->resolveEntity(ctxt->userData, ExternalID, - SystemID); - if (input == NULL) { - return; - } - - xmlNewDtd(ctxt->myDoc, name, ExternalID, SystemID); - - /* - * make sure we won't destroy the main document context - */ - oldinput = ctxt->input; - oldinputNr = ctxt->inputNr; - oldinputMax = ctxt->inputMax; - oldinputTab = ctxt->inputTab; - oldcharset = ctxt->charset; - - ctxt->inputTab = (xmlParserInputPtr *) - xmlMalloc(5 * sizeof(xmlParserInputPtr)); - if (ctxt->inputTab == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2ExternalSubset"); - ctxt->input = oldinput; - ctxt->inputNr = oldinputNr; - ctxt->inputMax = oldinputMax; - ctxt->inputTab = oldinputTab; - ctxt->charset = oldcharset; - return; - } - ctxt->inputNr = 0; - ctxt->inputMax = 5; - ctxt->input = NULL; - xmlPushInput(ctxt, input); - - /* - * On the fly encoding conversion if needed - */ - if (ctxt->input->length >= 4) { - enc = xmlDetectCharEncoding(ctxt->input->cur, 4); - xmlSwitchEncoding(ctxt, enc); - } - - if (input->filename == NULL) - input->filename = (char *) xmlCanonicPath(SystemID); - input->line = 1; - input->col = 1; - input->base = ctxt->input->cur; - input->cur = ctxt->input->cur; - input->free = NULL; - - /* - * let's parse that entity knowing it's an external subset. - */ - xmlParseExternalSubset(ctxt, ExternalID, SystemID); - - /* - * Free up the external entities - */ - - while (ctxt->inputNr > 1) - xmlPopInput(ctxt); - xmlFreeInputStream(ctxt->input); - xmlFree(ctxt->inputTab); - - /* - * Restore the parsing context of the main entity - */ - ctxt->input = oldinput; - ctxt->inputNr = oldinputNr; - ctxt->inputMax = oldinputMax; - ctxt->inputTab = oldinputTab; - ctxt->charset = oldcharset; - /* ctxt->wellFormed = oldwellFormed; */ - } -} - -/** - * xmlSAX2ResolveEntity: - * @ctx: the user data (XML parser context) - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * The entity loader, to control the loading of external entities, - * the application can either: - * - override this xmlSAX2ResolveEntity() callback in the SAX block - * - or better use the xmlSetExternalEntityLoader() function to - * set up it's own entity resolution routine - * - * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. - */ -xmlParserInputPtr -xmlSAX2ResolveEntity(void *ctx, const xmlChar *publicId, const xmlChar *systemId) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr ret; - xmlChar *URI; - const char *base = NULL; - - if (ctx == NULL) return(NULL); - if (ctxt->input != NULL) - base = ctxt->input->filename; - if (base == NULL) - base = ctxt->directory; - - URI = xmlBuildURI(systemId, (const xmlChar *) base); - -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2ResolveEntity(%s, %s)\n", publicId, systemId); -#endif - - ret = xmlLoadExternalEntity((const char *) URI, - (const char *) publicId, ctxt); - if (URI != NULL) - xmlFree(URI); - return(ret); -} - -/** - * xmlSAX2GetEntity: - * @ctx: the user data (XML parser context) - * @name: The entity name - * - * Get an entity by name - * - * Returns the xmlEntityPtr if found. - */ -xmlEntityPtr -xmlSAX2GetEntity(void *ctx, const xmlChar *name) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlEntityPtr ret = NULL; - - if (ctx == NULL) return(NULL); -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2GetEntity(%s)\n", name); -#endif - - if (ctxt->inSubset == 0) { - ret = xmlGetPredefinedEntity(name); - if (ret != NULL) - return(ret); - } - if ((ctxt->myDoc != NULL) && (ctxt->myDoc->standalone == 1)) { - if (ctxt->inSubset == 2) { - ctxt->myDoc->standalone = 0; - ret = xmlGetDocEntity(ctxt->myDoc, name); - ctxt->myDoc->standalone = 1; - } else { - ret = xmlGetDocEntity(ctxt->myDoc, name); - if (ret == NULL) { - ctxt->myDoc->standalone = 0; - ret = xmlGetDocEntity(ctxt->myDoc, name); - if (ret != NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NOT_STANDALONE, - "Entity(%s) document marked standalone but requires external subset\n", - name, NULL); - } - ctxt->myDoc->standalone = 1; - } - } - } else { - ret = xmlGetDocEntity(ctxt->myDoc, name); - } - if ((ret != NULL) && - ((ctxt->validate) || (ctxt->replaceEntities)) && - (ret->children == NULL) && - (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { - int val; - - /* - * for validation purposes we really need to fetch and - * parse the external entity - */ - xmlNodePtr children; - - val = xmlParseCtxtExternalEntity(ctxt, ret->URI, - ret->ExternalID, &children); - if (val == 0) { - xmlAddChildList((xmlNodePtr) ret, children); - } else { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_PROCESSING, - "Failure to process entity %s\n", name, NULL); - ctxt->validate = 0; - return(NULL); - } - ret->owner = 1; - ret->checked = 1; - } - return(ret); -} - -/** - * xmlSAX2GetParameterEntity: - * @ctx: the user data (XML parser context) - * @name: The entity name - * - * Get a parameter entity by name - * - * Returns the xmlEntityPtr if found. - */ -xmlEntityPtr -xmlSAX2GetParameterEntity(void *ctx, const xmlChar *name) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlEntityPtr ret; - - if (ctx == NULL) return(NULL); -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2GetParameterEntity(%s)\n", name); -#endif - - ret = xmlGetParameterEntity(ctxt->myDoc, name); - return(ret); -} - - -/** - * xmlSAX2EntityDecl: - * @ctx: the user data (XML parser context) - * @name: the entity name - * @type: the entity type - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @content: the entity value (without processing). - * - * An entity definition has been parsed - */ -void -xmlSAX2EntityDecl(void *ctx, const xmlChar *name, int type, - const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) -{ - xmlEntityPtr ent; - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - - if (ctx == NULL) return; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2EntityDecl(%s, %d, %s, %s, %s)\n", - name, type, publicId, systemId, content); -#endif - if (ctxt->inSubset == 1) { - ent = xmlAddDocEntity(ctxt->myDoc, name, type, publicId, - systemId, content); - if ((ent == NULL) && (ctxt->pedantic)) - xmlWarnMsg(ctxt, XML_WAR_ENTITY_REDEFINED, - "Entity(%s) already defined in the internal subset\n", - name); - if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { - xmlChar *URI; - const char *base = NULL; - - if (ctxt->input != NULL) - base = ctxt->input->filename; - if (base == NULL) - base = ctxt->directory; - - URI = xmlBuildURI(systemId, (const xmlChar *) base); - ent->URI = URI; - } - } else if (ctxt->inSubset == 2) { - ent = xmlAddDtdEntity(ctxt->myDoc, name, type, publicId, - systemId, content); - if ((ent == NULL) && (ctxt->pedantic) && - (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) - ctxt->sax->warning(ctxt->userData, - "Entity(%s) already defined in the external subset\n", name); - if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { - xmlChar *URI; - const char *base = NULL; - - if (ctxt->input != NULL) - base = ctxt->input->filename; - if (base == NULL) - base = ctxt->directory; - - URI = xmlBuildURI(systemId, (const xmlChar *) base); - ent->URI = URI; - } - } else { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_PROCESSING, - "SAX.xmlSAX2EntityDecl(%s) called while not in subset\n", - name, NULL); - } -} - -/** - * xmlSAX2AttributeDecl: - * @ctx: the user data (XML parser context) - * @elem: the name of the element - * @fullname: the attribute name - * @type: the attribute type - * @def: the type of default value - * @defaultValue: the attribute default value - * @tree: the tree of enumerated value set - * - * An attribute definition has been parsed - */ -void -xmlSAX2AttributeDecl(void *ctx, const xmlChar *elem, const xmlChar *fullname, - int type, int def, const xmlChar *defaultValue, - xmlEnumerationPtr tree) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlAttributePtr attr; - xmlChar *name = NULL, *prefix = NULL; - - if ((ctxt == NULL) || (ctxt->myDoc == NULL)) - return; - -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2AttributeDecl(%s, %s, %d, %d, %s, ...)\n", - elem, fullname, type, def, defaultValue); -#endif - if ((xmlStrEqual(fullname, BAD_CAST "xml:id")) && - (type != XML_ATTRIBUTE_ID)) { - /* - * Raise the error but keep the validity flag - */ - int tmp = ctxt->valid; - xmlErrValid(ctxt, XML_DTD_XMLID_TYPE, - "xml:id : attribute type should be ID\n", NULL, NULL); - ctxt->valid = tmp; - } - /* TODO: optimize name/prefix allocation */ - name = xmlSplitQName(ctxt, fullname, &prefix); - ctxt->vctxt.valid = 1; - if (ctxt->inSubset == 1) - attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, elem, - name, prefix, (xmlAttributeType) type, - (xmlAttributeDefault) def, defaultValue, tree); - else if (ctxt->inSubset == 2) - attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, elem, - name, prefix, (xmlAttributeType) type, - (xmlAttributeDefault) def, defaultValue, tree); - else { - xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, - "SAX.xmlSAX2AttributeDecl(%s) called while not in subset\n", - name, NULL); - xmlFreeEnumeration(tree); - return; - } -#ifdef LIBXML_VALID_ENABLED - if (ctxt->vctxt.valid == 0) - ctxt->valid = 0; - if ((attr != NULL) && (ctxt->validate) && (ctxt->wellFormed) && - (ctxt->myDoc->intSubset != NULL)) - ctxt->valid &= xmlValidateAttributeDecl(&ctxt->vctxt, ctxt->myDoc, - attr); -#endif /* LIBXML_VALID_ENABLED */ - if (prefix != NULL) - xmlFree(prefix); - if (name != NULL) - xmlFree(name); -} - -/** - * xmlSAX2ElementDecl: - * @ctx: the user data (XML parser context) - * @name: the element name - * @type: the element type - * @content: the element value tree - * - * An element definition has been parsed - */ -void -xmlSAX2ElementDecl(void *ctx, const xmlChar * name, int type, - xmlElementContentPtr content) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlElementPtr elem = NULL; - - if ((ctxt == NULL) || (ctxt->myDoc == NULL)) - return; - -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2ElementDecl(%s, %d, ...)\n", name, type); -#endif - - if (ctxt->inSubset == 1) - elem = xmlAddElementDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, - name, (xmlElementTypeVal) type, content); - else if (ctxt->inSubset == 2) - elem = xmlAddElementDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, - name, (xmlElementTypeVal) type, content); - else { - xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, - "SAX.xmlSAX2ElementDecl(%s) called while not in subset\n", - name, NULL); - return; - } -#ifdef LIBXML_VALID_ENABLED - if (elem == NULL) - ctxt->valid = 0; - if (ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) - ctxt->valid &= - xmlValidateElementDecl(&ctxt->vctxt, ctxt->myDoc, elem); -#endif /* LIBXML_VALID_ENABLED */ -} - -/** - * xmlSAX2NotationDecl: - * @ctx: the user data (XML parser context) - * @name: The name of the notation - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * What to do when a notation declaration has been parsed. - */ -void -xmlSAX2NotationDecl(void *ctx, const xmlChar *name, - const xmlChar *publicId, const xmlChar *systemId) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlNotationPtr nota = NULL; - - if ((ctxt == NULL) || (ctxt->myDoc == NULL)) - return; - -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2NotationDecl(%s, %s, %s)\n", name, publicId, systemId); -#endif - - if ((publicId == NULL) && (systemId == NULL)) { - xmlFatalErrMsg(ctxt, XML_ERR_NOTATION_PROCESSING, - "SAX.xmlSAX2NotationDecl(%s) externalID or PublicID missing\n", - name, NULL); - return; - } else if (ctxt->inSubset == 1) - nota = xmlAddNotationDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, name, - publicId, systemId); - else if (ctxt->inSubset == 2) - nota = xmlAddNotationDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, name, - publicId, systemId); - else { - xmlFatalErrMsg(ctxt, XML_ERR_NOTATION_PROCESSING, - "SAX.xmlSAX2NotationDecl(%s) called while not in subset\n", - name, NULL); - return; - } -#ifdef LIBXML_VALID_ENABLED - if (nota == NULL) ctxt->valid = 0; - if ((ctxt->validate) && (ctxt->wellFormed) && - (ctxt->myDoc->intSubset != NULL)) - ctxt->valid &= xmlValidateNotationDecl(&ctxt->vctxt, ctxt->myDoc, - nota); -#endif /* LIBXML_VALID_ENABLED */ -} - -/** - * xmlSAX2UnparsedEntityDecl: - * @ctx: the user data (XML parser context) - * @name: The name of the entity - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @notationName: the name of the notation - * - * What to do when an unparsed entity declaration is parsed - */ -void -xmlSAX2UnparsedEntityDecl(void *ctx, const xmlChar *name, - const xmlChar *publicId, const xmlChar *systemId, - const xmlChar *notationName) -{ - xmlEntityPtr ent; - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - if (ctx == NULL) return; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2UnparsedEntityDecl(%s, %s, %s, %s)\n", - name, publicId, systemId, notationName); -#endif - if (ctxt->inSubset == 1) { - ent = xmlAddDocEntity(ctxt->myDoc, name, - XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, - publicId, systemId, notationName); - if ((ent == NULL) && (ctxt->pedantic) && - (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) - ctxt->sax->warning(ctxt->userData, - "Entity(%s) already defined in the internal subset\n", name); - if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { - xmlChar *URI; - const char *base = NULL; - - if (ctxt->input != NULL) - base = ctxt->input->filename; - if (base == NULL) - base = ctxt->directory; - - URI = xmlBuildURI(systemId, (const xmlChar *) base); - ent->URI = URI; - } - } else if (ctxt->inSubset == 2) { - ent = xmlAddDtdEntity(ctxt->myDoc, name, - XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, - publicId, systemId, notationName); - if ((ent == NULL) && (ctxt->pedantic) && - (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) - ctxt->sax->warning(ctxt->userData, - "Entity(%s) already defined in the external subset\n", name); - if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { - xmlChar *URI; - const char *base = NULL; - - if (ctxt->input != NULL) - base = ctxt->input->filename; - if (base == NULL) - base = ctxt->directory; - - URI = xmlBuildURI(systemId, (const xmlChar *) base); - ent->URI = URI; - } - } else { - xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, - "SAX.xmlSAX2UnparsedEntityDecl(%s) called while not in subset\n", - name, NULL); - } -} - -/** - * xmlSAX2SetDocumentLocator: - * @ctx: the user data (XML parser context) - * @loc: A SAX Locator - * - * Receive the document locator at startup, actually xmlDefaultSAXLocator - * Everything is available on the context, so this is useless in our case. - */ -void -xmlSAX2SetDocumentLocator(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) -{ - /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2SetDocumentLocator()\n"); -#endif -} - -/** - * xmlSAX2StartDocument: - * @ctx: the user data (XML parser context) - * - * called when the document start being processed. - */ -void -xmlSAX2StartDocument(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlDocPtr doc; - - if (ctx == NULL) return; - -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2StartDocument()\n"); -#endif - if (ctxt->html) { -#ifdef LIBXML_HTML_ENABLED - if (ctxt->myDoc == NULL) - ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); - if (ctxt->myDoc == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); - return; - } -#else - xmlGenericError(xmlGenericErrorContext, - "libxml2 built without HTML support\n"); - ctxt->errNo = XML_ERR_INTERNAL_ERROR; - ctxt->instate = XML_PARSER_EOF; - ctxt->disableSAX = 1; - return; -#endif - } else { - doc = ctxt->myDoc = xmlNewDoc(ctxt->version); - if (doc != NULL) { - if (ctxt->encoding != NULL) - doc->encoding = xmlStrdup(ctxt->encoding); - else - doc->encoding = NULL; - doc->standalone = ctxt->standalone; - } else { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); - return; - } - if ((ctxt->dictNames) && (doc != NULL)) { - doc->dict = ctxt->dict; - xmlDictReference(doc->dict); - } - } - if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) && - (ctxt->input != NULL) && (ctxt->input->filename != NULL)) { - ctxt->myDoc->URL = xmlPathToURI((const xmlChar *)ctxt->input->filename); - if (ctxt->myDoc->URL == NULL) - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); - } -} - -/** - * xmlSAX2EndDocument: - * @ctx: the user data (XML parser context) - * - * called when the document end has been detected. - */ -void -xmlSAX2EndDocument(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2EndDocument()\n"); -#endif - if (ctx == NULL) return; -#ifdef LIBXML_VALID_ENABLED - if (ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) - ctxt->valid &= xmlValidateDocumentFinal(&ctxt->vctxt, ctxt->myDoc); -#endif /* LIBXML_VALID_ENABLED */ - - /* - * Grab the encoding if it was added on-the-fly - */ - if ((ctxt->encoding != NULL) && (ctxt->myDoc != NULL) && - (ctxt->myDoc->encoding == NULL)) { - ctxt->myDoc->encoding = ctxt->encoding; - ctxt->encoding = NULL; - } - if ((ctxt->inputTab != NULL) && - (ctxt->inputNr > 0) && (ctxt->inputTab[0] != NULL) && - (ctxt->inputTab[0]->encoding != NULL) && (ctxt->myDoc != NULL) && - (ctxt->myDoc->encoding == NULL)) { - ctxt->myDoc->encoding = xmlStrdup(ctxt->inputTab[0]->encoding); - } - if ((ctxt->charset != XML_CHAR_ENCODING_NONE) && (ctxt->myDoc != NULL) && - (ctxt->myDoc->charset == XML_CHAR_ENCODING_NONE)) { - ctxt->myDoc->charset = ctxt->charset; - } -} - -#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) -/** - * xmlSAX2AttributeInternal: - * @ctx: the user data (XML parser context) - * @fullname: The attribute name, including namespace prefix - * @value: The attribute value - * @prefix: the prefix on the element node - * - * Handle an attribute that has been read by the parser. - * The default handling is to convert the attribute into an - * DOM subtree and past it in a new xmlAttr element added to - * the element. - */ -static void -xmlSAX2AttributeInternal(void *ctx, const xmlChar *fullname, - const xmlChar *value, const xmlChar *prefix ATTRIBUTE_UNUSED) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlAttrPtr ret; - xmlChar *name; - xmlChar *ns; - xmlChar *nval; - xmlNsPtr namespace; - - /* - * Split the full name into a namespace prefix and the tag name - */ - name = xmlSplitQName(ctxt, fullname, &ns); - if ((name != NULL) && (name[0] == 0)) { - if (xmlStrEqual(ns, BAD_CAST "xmlns")) { - xmlNsErrMsg(ctxt, XML_ERR_NS_DECL_ERROR, - "invalid namespace declaration '%s'\n", - fullname, NULL); - } else { - xmlNsWarnMsg(ctxt, XML_WAR_NS_COLUMN, - "Avoid attribute ending with ':' like '%s'\n", - fullname, NULL); - } - if (ns != NULL) - xmlFree(ns); - ns = NULL; - xmlFree(name); - name = xmlStrdup(fullname); - } - if (name == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); - if (ns != NULL) - xmlFree(ns); - return; - } - -#ifdef LIBXML_VALID_ENABLED - /* - * Do the last stage of the attribute normalization - * Needed for HTML too: - * http://www.w3.org/TR/html4/types.html#h-6.2 - */ - ctxt->vctxt.valid = 1; - nval = xmlValidCtxtNormalizeAttributeValue(&ctxt->vctxt, - ctxt->myDoc, ctxt->node, - fullname, value); - if (ctxt->vctxt.valid != 1) { - ctxt->valid = 0; - } - if (nval != NULL) - value = nval; -#else - nval = NULL; -#endif /* LIBXML_VALID_ENABLED */ - - /* - * Check whether it's a namespace definition - */ - if ((!ctxt->html) && (ns == NULL) && - (name[0] == 'x') && (name[1] == 'm') && (name[2] == 'l') && - (name[3] == 'n') && (name[4] == 's') && (name[5] == 0)) { - xmlNsPtr nsret; - xmlChar *val; - - if (!ctxt->replaceEntities) { - ctxt->depth++; - val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, - 0,0,0); - ctxt->depth--; - } else { - val = (xmlChar *) value; - } - - if (val[0] != 0) { - xmlURIPtr uri; - - uri = xmlParseURI((const char *)val); - if (uri == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) - ctxt->sax->warning(ctxt->userData, - "xmlns: %s not a valid URI\n", val); - } else { - if (uri->scheme == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) - ctxt->sax->warning(ctxt->userData, - "xmlns: URI %s is not absolute\n", val); - } - xmlFreeURI(uri); - } - } - - /* a default namespace definition */ - nsret = xmlNewNs(ctxt->node, val, NULL); - -#ifdef LIBXML_VALID_ENABLED - /* - * Validate also for namespace decls, they are attributes from - * an XML-1.0 perspective - */ - if (nsret != NULL && ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) - ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, - ctxt->node, prefix, nsret, val); -#endif /* LIBXML_VALID_ENABLED */ - if (name != NULL) - xmlFree(name); - if (nval != NULL) - xmlFree(nval); - if (val != value) - xmlFree(val); - return; - } - if ((!ctxt->html) && - (ns != NULL) && (ns[0] == 'x') && (ns[1] == 'm') && (ns[2] == 'l') && - (ns[3] == 'n') && (ns[4] == 's') && (ns[5] == 0)) { - xmlNsPtr nsret; - xmlChar *val; - - if (!ctxt->replaceEntities) { - ctxt->depth++; - val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, - 0,0,0); - ctxt->depth--; - if (val == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); - xmlFree(ns); - if (name != NULL) - xmlFree(name); - return; - } - } else { - val = (xmlChar *) value; - } - - if (val[0] == 0) { - xmlNsErrMsg(ctxt, XML_NS_ERR_EMPTY, - "Empty namespace name for prefix %s\n", name, NULL); - } - if ((ctxt->pedantic != 0) && (val[0] != 0)) { - xmlURIPtr uri; - - uri = xmlParseURI((const char *)val); - if (uri == NULL) { - xmlNsWarnMsg(ctxt, XML_WAR_NS_URI, - "xmlns:%s: %s not a valid URI\n", name, value); - } else { - if (uri->scheme == NULL) { - xmlNsWarnMsg(ctxt, XML_WAR_NS_URI_RELATIVE, - "xmlns:%s: URI %s is not absolute\n", name, value); - } - xmlFreeURI(uri); - } - } - - /* a standard namespace definition */ - nsret = xmlNewNs(ctxt->node, val, name); - xmlFree(ns); -#ifdef LIBXML_VALID_ENABLED - /* - * Validate also for namespace decls, they are attributes from - * an XML-1.0 perspective - */ - if (nsret != NULL && ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) - ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, - ctxt->node, prefix, nsret, value); -#endif /* LIBXML_VALID_ENABLED */ - if (name != NULL) - xmlFree(name); - if (nval != NULL) - xmlFree(nval); - if (val != value) - xmlFree(val); - return; - } - - if (ns != NULL) { - xmlAttrPtr prop; - namespace = xmlSearchNs(ctxt->myDoc, ctxt->node, ns); - if (namespace == NULL) { - xmlNsErrMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, - "Namespace prefix %s of attribute %s is not defined\n", - ns, name); - } - - prop = ctxt->node->properties; - while (prop != NULL) { - if (prop->ns != NULL) { - if ((xmlStrEqual(name, prop->name)) && - ((namespace == prop->ns) || - (xmlStrEqual(namespace->href, prop->ns->href)))) { - xmlNsErrMsg(ctxt, XML_ERR_ATTRIBUTE_REDEFINED, - "Attribute %s in %s redefined\n", - name, namespace->href); - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) ctxt->disableSAX = 1; - goto error; - } - } - prop = prop->next; - } - } else { - namespace = NULL; - } - - /* !!!!!! <a toto:arg="" xmlns:toto="http://toto.com"> */ - ret = xmlNewNsPropEatName(ctxt->node, namespace, name, NULL); - - if (ret != NULL) { - if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { - xmlNodePtr tmp; - - ret->children = xmlStringGetNodeList(ctxt->myDoc, value); - tmp = ret->children; - while (tmp != NULL) { - tmp->parent = (xmlNodePtr) ret; - if (tmp->next == NULL) - ret->last = tmp; - tmp = tmp->next; - } - } else if (value != NULL) { - ret->children = xmlNewDocText(ctxt->myDoc, value); - ret->last = ret->children; - if (ret->children != NULL) - ret->children->parent = (xmlNodePtr) ret; - } - } - -#ifdef LIBXML_VALID_ENABLED - if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) { - - /* - * If we don't substitute entities, the validation should be - * done on a value with replaced entities anyway. - */ - if (!ctxt->replaceEntities) { - xmlChar *val; - - ctxt->depth++; - val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, - 0,0,0); - ctxt->depth--; - - if (val == NULL) - ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, - ctxt->myDoc, ctxt->node, ret, value); - else { - xmlChar *nvalnorm; - - /* - * Do the last stage of the attribute normalization - * It needs to be done twice ... it's an extra burden related - * to the ability to keep xmlSAX2References in attributes - */ - nvalnorm = xmlValidNormalizeAttributeValue(ctxt->myDoc, - ctxt->node, fullname, val); - if (nvalnorm != NULL) { - xmlFree(val); - val = nvalnorm; - } - - ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, - ctxt->myDoc, ctxt->node, ret, val); - xmlFree(val); - } - } else { - ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, - ctxt->node, ret, value); - } - } else -#endif /* LIBXML_VALID_ENABLED */ - if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) && - (((ctxt->replaceEntities == 0) && (ctxt->external != 2)) || - ((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) { - /* - * when validating, the ID registration is done at the attribute - * validation level. Otherwise we have to do specific handling here. - */ - if (xmlStrEqual(fullname, BAD_CAST "xml:id")) { - /* - * Add the xml:id value - * - * Open issue: normalization of the value. - */ - if (xmlValidateNCName(value, 1) != 0) { - xmlErrValid(ctxt, XML_DTD_XMLID_VALUE, - "xml:id : attribute value %s is not an NCName\n", - (const char *) value, NULL); - } - xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); - } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) - xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); - else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) - xmlAddRef(&ctxt->vctxt, ctxt->myDoc, value, ret); - } - -error: - if (nval != NULL) - xmlFree(nval); - if (ns != NULL) - xmlFree(ns); -} - -/* - * xmlCheckDefaultedAttributes: - * - * Check defaulted attributes from the DTD - */ -static void -xmlCheckDefaultedAttributes(xmlParserCtxtPtr ctxt, const xmlChar *name, - const xmlChar *prefix, const xmlChar **atts) { - xmlElementPtr elemDecl; - const xmlChar *att; - int internal = 1; - int i; - - elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->intSubset, name, prefix); - if (elemDecl == NULL) { - elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->extSubset, name, prefix); - internal = 0; - } - -process_external_subset: - - if (elemDecl != NULL) { - xmlAttributePtr attr = elemDecl->attributes; - /* - * Check against defaulted attributes from the external subset - * if the document is stamped as standalone - */ - if ((ctxt->myDoc->standalone == 1) && - (ctxt->myDoc->extSubset != NULL) && - (ctxt->validate)) { - while (attr != NULL) { - if ((attr->defaultValue != NULL) && - (xmlGetDtdQAttrDesc(ctxt->myDoc->extSubset, - attr->elem, attr->name, - attr->prefix) == attr) && - (xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset, - attr->elem, attr->name, - attr->prefix) == NULL)) { - xmlChar *fulln; - - if (attr->prefix != NULL) { - fulln = xmlStrdup(attr->prefix); - fulln = xmlStrcat(fulln, BAD_CAST ":"); - fulln = xmlStrcat(fulln, attr->name); - } else { - fulln = xmlStrdup(attr->name); - } - - /* - * Check that the attribute is not declared in the - * serialization - */ - att = NULL; - if (atts != NULL) { - i = 0; - att = atts[i]; - while (att != NULL) { - if (xmlStrEqual(att, fulln)) - break; - i += 2; - att = atts[i]; - } - } - if (att == NULL) { - xmlErrValid(ctxt, XML_DTD_STANDALONE_DEFAULTED, - "standalone: attribute %s on %s defaulted from external subset\n", - (const char *)fulln, - (const char *)attr->elem); - } - } - attr = attr->nexth; - } - } - - /* - * Actually insert defaulted values when needed - */ - attr = elemDecl->attributes; - while (attr != NULL) { - /* - * Make sure that attributes redefinition occuring in the - * internal subset are not overriden by definitions in the - * external subset. - */ - if (attr->defaultValue != NULL) { - /* - * the element should be instantiated in the tree if: - * - this is a namespace prefix - * - the user required for completion in the tree - * like XSLT - * - there isn't already an attribute definition - * in the internal subset overriding it. - */ - if (((attr->prefix != NULL) && - (xmlStrEqual(attr->prefix, BAD_CAST "xmlns"))) || - ((attr->prefix == NULL) && - (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) || - (ctxt->loadsubset & XML_COMPLETE_ATTRS)) { - xmlAttributePtr tst; - - tst = xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset, - attr->elem, attr->name, - attr->prefix); - if ((tst == attr) || (tst == NULL)) { - xmlChar fn[50]; - xmlChar *fulln; - - fulln = xmlBuildQName(attr->name, attr->prefix, fn, 50); - if (fulln == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); - return; - } - - /* - * Check that the attribute is not declared in the - * serialization - */ - att = NULL; - if (atts != NULL) { - i = 0; - att = atts[i]; - while (att != NULL) { - if (xmlStrEqual(att, fulln)) - break; - i += 2; - att = atts[i]; - } - } - if (att == NULL) { - xmlSAX2AttributeInternal(ctxt, fulln, - attr->defaultValue, prefix); - } - if ((fulln != fn) && (fulln != attr->name)) - xmlFree(fulln); - } - } - } - attr = attr->nexth; - } - if (internal == 1) { - elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->extSubset, - name, prefix); - internal = 0; - goto process_external_subset; - } - } -} - -/** - * xmlSAX2StartElement: - * @ctx: the user data (XML parser context) - * @fullname: The element name, including namespace prefix - * @atts: An array of name/value attributes pairs, NULL terminated - * - * called when an opening tag has been processed. - */ -void -xmlSAX2StartElement(void *ctx, const xmlChar *fullname, const xmlChar **atts) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlNodePtr ret; - xmlNodePtr parent; - xmlNsPtr ns; - xmlChar *name; - xmlChar *prefix; - const xmlChar *att; - const xmlChar *value; - int i; - - if ((ctx == NULL) || (fullname == NULL) || (ctxt->myDoc == NULL)) return; - parent = ctxt->node; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2StartElement(%s)\n", fullname); -#endif - - /* - * First check on validity: - */ - if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && - ((ctxt->myDoc->intSubset == NULL) || - ((ctxt->myDoc->intSubset->notations == NULL) && - (ctxt->myDoc->intSubset->elements == NULL) && - (ctxt->myDoc->intSubset->attributes == NULL) && - (ctxt->myDoc->intSubset->entities == NULL)))) { - xmlErrValid(ctxt, XML_ERR_NO_DTD, - "Validation failed: no DTD found !", NULL, NULL); - ctxt->validate = 0; - } - - - /* - * Split the full name into a namespace prefix and the tag name - */ - name = xmlSplitQName(ctxt, fullname, &prefix); - - - /* - * Note : the namespace resolution is deferred until the end of the - * attributes parsing, since local namespace can be defined as - * an attribute at this level. - */ - ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, name, NULL); - if (ret == NULL) { - if (prefix != NULL) - xmlFree(prefix); - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); - return; - } - if (ctxt->myDoc->children == NULL) { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, "Setting %s as root\n", name); -#endif - xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); - } else if (parent == NULL) { - parent = ctxt->myDoc->children; - } - ctxt->nodemem = -1; - if (ctxt->linenumbers) { - if (ctxt->input != NULL) { - if (ctxt->input->line < 65535) - ret->line = (short) ctxt->input->line; - else - ret->line = 65535; - } - } - - /* - * We are parsing a new node. - */ -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, "pushing(%s)\n", name); -#endif - nodePush(ctxt, ret); - - /* - * Link the child element - */ - if (parent != NULL) { - if (parent->type == XML_ELEMENT_NODE) { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "adding child %s to %s\n", name, parent->name); -#endif - xmlAddChild(parent, ret); - } else { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "adding sibling %s to ", name); - xmlDebugDumpOneNode(stderr, parent, 0); -#endif - xmlAddSibling(parent, ret); - } - } - - /* - * Insert all the defaulted attributes from the DTD especially namespaces - */ - if ((!ctxt->html) && - ((ctxt->myDoc->intSubset != NULL) || - (ctxt->myDoc->extSubset != NULL))) { - xmlCheckDefaultedAttributes(ctxt, name, prefix, atts); - } - - /* - * process all the attributes whose name start with "xmlns" - */ - if (atts != NULL) { - i = 0; - att = atts[i++]; - value = atts[i++]; - if (!ctxt->html) { - while ((att != NULL) && (value != NULL)) { - if ((att[0] == 'x') && (att[1] == 'm') && (att[2] == 'l') && - (att[3] == 'n') && (att[4] == 's')) - xmlSAX2AttributeInternal(ctxt, att, value, prefix); - - att = atts[i++]; - value = atts[i++]; - } - } - } - - /* - * Search the namespace, note that since the attributes have been - * processed, the local namespaces are available. - */ - ns = xmlSearchNs(ctxt->myDoc, ret, prefix); - if ((ns == NULL) && (parent != NULL)) - ns = xmlSearchNs(ctxt->myDoc, parent, prefix); - if ((prefix != NULL) && (ns == NULL)) { - ns = xmlNewNs(ret, NULL, prefix); - xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, - "Namespace prefix %s is not defined\n", - prefix, NULL); - } - - /* - * set the namespace node, making sure that if the default namspace - * is unbound on a parent we simply kee it NULL - */ - if ((ns != NULL) && (ns->href != NULL) && - ((ns->href[0] != 0) || (ns->prefix != NULL))) - xmlSetNs(ret, ns); - - /* - * process all the other attributes - */ - if (atts != NULL) { - i = 0; - att = atts[i++]; - value = atts[i++]; - if (ctxt->html) { - while (att != NULL) { - xmlSAX2AttributeInternal(ctxt, att, value, NULL); - att = atts[i++]; - value = atts[i++]; - } - } else { - while ((att != NULL) && (value != NULL)) { - if ((att[0] != 'x') || (att[1] != 'm') || (att[2] != 'l') || - (att[3] != 'n') || (att[4] != 's')) - xmlSAX2AttributeInternal(ctxt, att, value, NULL); - - /* - * Next ones - */ - att = atts[i++]; - value = atts[i++]; - } - } - } - -#ifdef LIBXML_VALID_ENABLED - /* - * If it's the Document root, finish the DTD validation and - * check the document root element for validity - */ - if ((ctxt->validate) && (ctxt->vctxt.finishDtd == XML_CTXT_FINISH_DTD_0)) { - int chk; - - chk = xmlValidateDtdFinal(&ctxt->vctxt, ctxt->myDoc); - if (chk <= 0) - ctxt->valid = 0; - if (chk < 0) - ctxt->wellFormed = 0; - ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); - ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_1; - } -#endif /* LIBXML_VALID_ENABLED */ - - if (prefix != NULL) - xmlFree(prefix); - -} - -/** - * xmlSAX2EndElement: - * @ctx: the user data (XML parser context) - * @name: The element name - * - * called when the end of an element has been detected. - */ -void -xmlSAX2EndElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserNodeInfo node_info; - xmlNodePtr cur; - - if (ctx == NULL) return; - cur = ctxt->node; -#ifdef DEBUG_SAX - if (name == NULL) - xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(NULL)\n"); - else - xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(%s)\n", name); -#endif - - /* Capture end position and add node */ - if (cur != NULL && ctxt->record_info) { - node_info.end_pos = ctxt->input->cur - ctxt->input->base; - node_info.end_line = ctxt->input->line; - node_info.node = cur; - xmlParserAddNodeInfo(ctxt, &node_info); - } - ctxt->nodemem = -1; - -#ifdef LIBXML_VALID_ENABLED - if (ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) - ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, - cur); -#endif /* LIBXML_VALID_ENABLED */ - - - /* - * end of parsing of this node. - */ -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, "popping(%s)\n", cur->name); -#endif - nodePop(ctxt); -} -#endif /* LIBXML_SAX1_ENABLED || LIBXML_HTML_ENABLE */ - -/* - * xmlSAX2TextNode: - * @ctxt: the parser context - * @str: the input string - * @len: the string length - * - * Remove the entities from an attribute value - * - * Returns the newly allocated string or NULL if not needed or error - */ -static xmlNodePtr -xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) { - xmlNodePtr ret; - const xmlChar *intern = NULL; - - /* - * Allocate - */ - if (ctxt->freeElems != NULL) { - ret = ctxt->freeElems; - ctxt->freeElems = ret->next; - ctxt->freeElemsNr--; - } else { - ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - } - if (ret == NULL) { - xmlErrMemory(ctxt, "xmlSAX2Characters"); - return(NULL); - } - memset(ret, 0, sizeof(xmlNode)); - /* - * intern the formatting blanks found between tags, or the - * very short strings - */ - if (ctxt->dictNames) { - xmlChar cur = str[len]; - - if ((len < (int) (2 * sizeof(void *))) && - (ctxt->options & XML_PARSE_COMPACT)) { - /* store the string in the node overrithing properties and nsDef */ - xmlChar *tmp = (xmlChar *) &(ret->properties); - memcpy(tmp, str, len); - tmp[len] = 0; - intern = tmp; - } else if ((len <= 3) && ((cur == '"') || (cur == '\'') || - ((cur == '<') && (str[len + 1] != '!')))) { - intern = xmlDictLookup(ctxt->dict, str, len); - } else if (IS_BLANK_CH(*str) && (len < 60) && (cur == '<') && - (str[len + 1] != '!')) { - int i; - - for (i = 1;i < len;i++) { - if (!IS_BLANK_CH(str[i])) goto skip; - } - intern = xmlDictLookup(ctxt->dict, str, len); - } - } -skip: - ret->type = XML_TEXT_NODE; - - ret->name = xmlStringText; - if (intern == NULL) { - ret->content = xmlStrndup(str, len); - if (ret->content == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2TextNode"); - xmlFree(ret); - return(NULL); - } - } else - ret->content = (xmlChar *) intern; - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(ret); - return(ret); -} - -#ifdef LIBXML_VALID_ENABLED -/* - * xmlSAX2DecodeAttrEntities: - * @ctxt: the parser context - * @str: the input string - * @len: the string length - * - * Remove the entities from an attribute value - * - * Returns the newly allocated string or NULL if not needed or error - */ -static xmlChar * -xmlSAX2DecodeAttrEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, - const xmlChar *end) { - const xmlChar *in; - xmlChar *ret; - - in = str; - while (in < end) - if (*in++ == '&') - goto decode; - return(NULL); -decode: - ctxt->depth++; - ret = xmlStringLenDecodeEntities(ctxt, str, end - str, - XML_SUBSTITUTE_REF, 0,0,0); - ctxt->depth--; - return(ret); -} -#endif /* LIBXML_VALID_ENABLED */ - -/** - * xmlSAX2AttributeNs: - * @ctx: the user data (XML parser context) - * @localname: the local name of the attribute - * @prefix: the attribute namespace prefix if available - * @URI: the attribute namespace name if available - * @value: Start of the attribute value - * @valueend: end of the attribute value - * - * Handle an attribute that has been read by the parser. - * The default handling is to convert the attribute into an - * DOM subtree and past it in a new xmlAttr element added to - * the element. - */ -static void -xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt, - const xmlChar * localname, - const xmlChar * prefix, - const xmlChar * value, - const xmlChar * valueend) -{ - xmlAttrPtr ret; - xmlNsPtr namespace = NULL; - xmlChar *dup = NULL; - - /* - * Note: if prefix == NULL, the attribute is not in the default namespace - */ - if (prefix != NULL) - namespace = xmlSearchNs(ctxt->myDoc, ctxt->node, prefix); - - /* - * allocate the node - */ - if (ctxt->freeAttrs != NULL) { - ret = ctxt->freeAttrs; - ctxt->freeAttrs = ret->next; - ctxt->freeAttrsNr--; - memset(ret, 0, sizeof(xmlAttr)); - ret->type = XML_ATTRIBUTE_NODE; - - ret->parent = ctxt->node; - ret->doc = ctxt->myDoc; - ret->ns = namespace; - - if (ctxt->dictNames) - ret->name = localname; - else - ret->name = xmlStrdup(localname); - - /* link at the end to preserv order, TODO speed up with a last */ - if (ctxt->node->properties == NULL) { - ctxt->node->properties = ret; - } else { - xmlAttrPtr prev = ctxt->node->properties; - - while (prev->next != NULL) prev = prev->next; - prev->next = ret; - ret->prev = prev; - } - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr)ret); - } else { - if (ctxt->dictNames) - ret = xmlNewNsPropEatName(ctxt->node, namespace, - (xmlChar *) localname, NULL); - else - ret = xmlNewNsProp(ctxt->node, namespace, localname, NULL); - if (ret == NULL) { - xmlErrMemory(ctxt, "xmlSAX2AttributeNs"); - return; - } - } - - if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { - xmlNodePtr tmp; - - /* - * We know that if there is an entity reference, then - * the string has been dup'ed and terminates with 0 - * otherwise with ' or " - */ - if (*valueend != 0) { - tmp = xmlSAX2TextNode(ctxt, value, valueend - value); - ret->children = tmp; - ret->last = tmp; - if (tmp != NULL) { - tmp->doc = ret->doc; - tmp->parent = (xmlNodePtr) ret; - } - } else { - ret->children = xmlStringLenGetNodeList(ctxt->myDoc, value, - valueend - value); - tmp = ret->children; - while (tmp != NULL) { - tmp->doc = ret->doc; - tmp->parent = (xmlNodePtr) ret; - if (tmp->next == NULL) - ret->last = tmp; - tmp = tmp->next; - } - } - } else if (value != NULL) { - xmlNodePtr tmp; - - tmp = xmlSAX2TextNode(ctxt, value, valueend - value); - ret->children = tmp; - ret->last = tmp; - if (tmp != NULL) { - tmp->doc = ret->doc; - tmp->parent = (xmlNodePtr) ret; - } - } - -#ifdef LIBXML_VALID_ENABLED - if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) { - /* - * If we don't substitute entities, the validation should be - * done on a value with replaced entities anyway. - */ - if (!ctxt->replaceEntities) { - dup = xmlSAX2DecodeAttrEntities(ctxt, value, valueend); - if (dup == NULL) { - if (*valueend == 0) { - ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, - ctxt->myDoc, ctxt->node, ret, value); - } else { - /* - * That should already be normalized. - * cheaper to finally allocate here than duplicate - * entry points in the full validation code - */ - dup = xmlStrndup(value, valueend - value); - - ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, - ctxt->myDoc, ctxt->node, ret, dup); - } - } else { - /* - * dup now contains a string of the flattened attribute - * content with entities substitued. Check if we need to - * apply an extra layer of normalization. - * It needs to be done twice ... it's an extra burden related - * to the ability to keep references in attributes - */ - if (ctxt->attsSpecial != NULL) { - xmlChar *nvalnorm; - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(localname, prefix, fn, 50); - if (fullname != NULL) { - ctxt->vctxt.valid = 1; - nvalnorm = xmlValidCtxtNormalizeAttributeValue( - &ctxt->vctxt, ctxt->myDoc, - ctxt->node, fullname, dup); - if (ctxt->vctxt.valid != 1) - ctxt->valid = 0; - - if ((fullname != fn) && (fullname != localname)) - xmlFree(fullname); - if (nvalnorm != NULL) { - xmlFree(dup); - dup = nvalnorm; - } - } - } - - ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, - ctxt->myDoc, ctxt->node, ret, dup); - } - } else { - /* - * if entities already have been substitued, then - * the attribute as passed is already normalized - */ - dup = xmlStrndup(value, valueend - value); - - ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, - ctxt->myDoc, ctxt->node, ret, dup); - } - } else -#endif /* LIBXML_VALID_ENABLED */ - if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) && - (((ctxt->replaceEntities == 0) && (ctxt->external != 2)) || - ((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) { - /* - * when validating, the ID registration is done at the attribute - * validation level. Otherwise we have to do specific handling here. - */ - if ((prefix == ctxt->str_xml) && - (localname[0] == 'i') && (localname[1] == 'd') && - (localname[2] == 0)) { - /* - * Add the xml:id value - * - * Open issue: normalization of the value. - */ - if (dup == NULL) - dup = xmlStrndup(value, valueend - value); -#ifdef LIBXML_VALID_ENABLED - if (xmlValidateNCName(dup, 1) != 0) { - xmlErrValid(ctxt, XML_DTD_XMLID_VALUE, - "xml:id : attribute value %s is not an NCName\n", - (const char *) dup, NULL); - } -#endif - xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); - } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) { - /* might be worth duplicate entry points and not copy */ - if (dup == NULL) - dup = xmlStrndup(value, valueend - value); - xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); - } else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) { - if (dup == NULL) - dup = xmlStrndup(value, valueend - value); - xmlAddRef(&ctxt->vctxt, ctxt->myDoc, dup, ret); - } - } - if (dup != NULL) - xmlFree(dup); -} - -/** - * xmlSAX2StartElementNs: - * @ctx: the user data (XML parser context) - * @localname: the local name of the element - * @prefix: the element namespace prefix if available - * @URI: the element namespace name if available - * @nb_namespaces: number of namespace definitions on that node - * @namespaces: pointer to the array of prefix/URI pairs namespace definitions - * @nb_attributes: the number of attributes on that node - * @nb_defaulted: the number of defaulted attributes. - * @attributes: pointer to the array of (localname/prefix/URI/value/end) - * attribute values. - * - * SAX2 callback when an element start has been detected by the parser. - * It provides the namespace informations for the element, as well as - * the new namespace declarations on the element. - */ -void -xmlSAX2StartElementNs(void *ctx, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI, - int nb_namespaces, - const xmlChar **namespaces, - int nb_attributes, - int nb_defaulted, - const xmlChar **attributes) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlNodePtr ret; - xmlNodePtr parent; - xmlNsPtr last = NULL, ns; - const xmlChar *uri, *pref; - int i, j; - - if (ctx == NULL) return; - parent = ctxt->node; - /* - * First check on validity: - */ - if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && - ((ctxt->myDoc->intSubset == NULL) || - ((ctxt->myDoc->intSubset->notations == NULL) && - (ctxt->myDoc->intSubset->elements == NULL) && - (ctxt->myDoc->intSubset->attributes == NULL) && - (ctxt->myDoc->intSubset->entities == NULL)))) { - xmlErrValid(ctxt, XML_ERR_NO_DTD, - "Validation failed: no DTD found !", NULL, NULL); - ctxt->validate = 0; - } - - /* - * allocate the node - */ - if (ctxt->freeElems != NULL) { - ret = ctxt->freeElems; - ctxt->freeElems = ret->next; - ctxt->freeElemsNr--; - memset(ret, 0, sizeof(xmlNode)); - ret->type = XML_ELEMENT_NODE; - - if (ctxt->dictNames) - ret->name = localname; - else { - ret->name = xmlStrdup(localname); - if (ret->name == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); - return; - } - } - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(ret); - } else { - if (ctxt->dictNames) - ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, - (xmlChar *) localname, NULL); - else - ret = xmlNewDocNode(ctxt->myDoc, NULL, localname, NULL); - if (ret == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); - return; - } - } - if (ctxt->linenumbers) { - if (ctxt->input != NULL) { - if (ctxt->input->line < 65535) - ret->line = (short) ctxt->input->line; - else - ret->line = 65535; - } - } - - if ((ctxt->myDoc->children == NULL) || (parent == NULL)) { - xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); - } - /* - * Build the namespace list - */ - for (i = 0,j = 0;j < nb_namespaces;j++) { - pref = namespaces[i++]; - uri = namespaces[i++]; - ns = xmlNewNs(NULL, uri, pref); - if (ns != NULL) { - if (last == NULL) { - ret->nsDef = last = ns; - } else { - last->next = ns; - last = ns; - } - if ((URI != NULL) && (prefix == pref)) - ret->ns = ns; - } else { - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); - return; - } -#ifdef LIBXML_VALID_ENABLED - if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) { - ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, - ret, prefix, ns, uri); - } -#endif /* LIBXML_VALID_ENABLED */ - } - ctxt->nodemem = -1; - - /* - * We are parsing a new node. - */ - nodePush(ctxt, ret); - - /* - * Link the child element - */ - if (parent != NULL) { - if (parent->type == XML_ELEMENT_NODE) { - xmlAddChild(parent, ret); - } else { - xmlAddSibling(parent, ret); - } - } - - /* - * Insert the defaulted attributes from the DTD only if requested: - */ - if ((nb_defaulted != 0) && - ((ctxt->loadsubset & XML_COMPLETE_ATTRS) == 0)) - nb_attributes -= nb_defaulted; - - /* - * Search the namespace if it wasn't already found - * Note that, if prefix is NULL, this searches for the default Ns - */ - if ((URI != NULL) && (ret->ns == NULL)) { - ret->ns = xmlSearchNs(ctxt->myDoc, parent, prefix); - if ((ret->ns == NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) { - ret->ns = xmlSearchNs(ctxt->myDoc, ret, prefix); - } - if (ret->ns == NULL) { - ns = xmlNewNs(ret, NULL, prefix); - if (ns == NULL) { - - xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); - return; - } - xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, - "Namespace prefix %s was not found\n", - prefix, NULL); - } - } - - /* - * process all the other attributes - */ - if (nb_attributes > 0) { - for (j = 0,i = 0;i < nb_attributes;i++,j+=5) { - xmlSAX2AttributeNs(ctxt, attributes[j], attributes[j+1], - attributes[j+3], attributes[j+4]); - } - } - -#ifdef LIBXML_VALID_ENABLED - /* - * If it's the Document root, finish the DTD validation and - * check the document root element for validity - */ - if ((ctxt->validate) && (ctxt->vctxt.finishDtd == XML_CTXT_FINISH_DTD_0)) { - int chk; - - chk = xmlValidateDtdFinal(&ctxt->vctxt, ctxt->myDoc); - if (chk <= 0) - ctxt->valid = 0; - if (chk < 0) - ctxt->wellFormed = 0; - ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); - ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_1; - } -#endif /* LIBXML_VALID_ENABLED */ -} - -/** - * xmlSAX2EndElementNs: - * @ctx: the user data (XML parser context) - * @localname: the local name of the element - * @prefix: the element namespace prefix if available - * @URI: the element namespace name if available - * - * SAX2 callback when an element end has been detected by the parser. - * It provides the namespace informations for the element. - */ -void -xmlSAX2EndElementNs(void *ctx, - const xmlChar * localname ATTRIBUTE_UNUSED, - const xmlChar * prefix ATTRIBUTE_UNUSED, - const xmlChar * URI ATTRIBUTE_UNUSED) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserNodeInfo node_info; - xmlNodePtr cur; - - if (ctx == NULL) return; - cur = ctxt->node; - /* Capture end position and add node */ - if ((ctxt->record_info) && (cur != NULL)) { - node_info.end_pos = ctxt->input->cur - ctxt->input->base; - node_info.end_line = ctxt->input->line; - node_info.node = cur; - xmlParserAddNodeInfo(ctxt, &node_info); - } - ctxt->nodemem = -1; - -#ifdef LIBXML_VALID_ENABLED - if (ctxt->validate && ctxt->wellFormed && - ctxt->myDoc && ctxt->myDoc->intSubset) - ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, cur); -#endif /* LIBXML_VALID_ENABLED */ - - /* - * end of parsing of this node. - */ - nodePop(ctxt); -} - -/** - * xmlSAX2Reference: - * @ctx: the user data (XML parser context) - * @name: The entity name - * - * called when an entity xmlSAX2Reference is detected. - */ -void -xmlSAX2Reference(void *ctx, const xmlChar *name) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlNodePtr ret; - - if (ctx == NULL) return; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2Reference(%s)\n", name); -#endif - if (name[0] == '#') - ret = xmlNewCharRef(ctxt->myDoc, name); - else - ret = xmlNewReference(ctxt->myDoc, name); -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "add xmlSAX2Reference %s to %s \n", name, ctxt->node->name); -#endif - xmlAddChild(ctxt->node, ret); -} - -/** - * xmlSAX2Characters: - * @ctx: the user data (XML parser context) - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some chars from the parser. - */ -void -xmlSAX2Characters(void *ctx, const xmlChar *ch, int len) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlNodePtr lastChild; - - if (ctx == NULL) return; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2Characters(%.30s, %d)\n", ch, len); -#endif - /* - * Handle the data if any. If there is no child - * add it as content, otherwise if the last child is text, - * concatenate it, else create a new node of type text. - */ - - if (ctxt->node == NULL) { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "add chars: ctxt->node == NULL !\n"); -#endif - return; - } - lastChild = ctxt->node->last; -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "add chars to %s \n", ctxt->node->name); -#endif - - /* - * Here we needed an accelerator mechanism in case of very large - * elements. Use an attribute in the structure !!! - */ - if (lastChild == NULL) { - lastChild = xmlSAX2TextNode(ctxt, ch, len); - if (lastChild != NULL) { - ctxt->node->children = lastChild; - ctxt->node->last = lastChild; - lastChild->parent = ctxt->node; - lastChild->doc = ctxt->node->doc; - ctxt->nodelen = len; - ctxt->nodemem = len + 1; - } else { - xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); - return; - } - } else { - int coalesceText = (lastChild != NULL) && - (lastChild->type == XML_TEXT_NODE) && - (lastChild->name == xmlStringText); - if ((coalesceText) && (ctxt->nodemem != 0)) { - /* - * The whole point of maintaining nodelen and nodemem, - * xmlTextConcat is too costly, i.e. compute length, - * reallocate a new buffer, move data, append ch. Here - * We try to minimaze realloc() uses and avoid copying - * and recomputing length over and over. - */ - if (lastChild->content == (xmlChar *)&(lastChild->properties)) { - lastChild->content = xmlStrdup(lastChild->content); - lastChild->properties = NULL; - } else if ((ctxt->nodemem == ctxt->nodelen + 1) && - (xmlDictOwns(ctxt->dict, lastChild->content))) { - lastChild->content = xmlStrdup(lastChild->content); - } - if (ctxt->nodelen + len >= ctxt->nodemem) { - xmlChar *newbuf; - int size; - - size = ctxt->nodemem + len; - size *= 2; - newbuf = (xmlChar *) xmlRealloc(lastChild->content,size); - if (newbuf == NULL) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); - return; - } - ctxt->nodemem = size; - lastChild->content = newbuf; - } - memcpy(&lastChild->content[ctxt->nodelen], ch, len); - ctxt->nodelen += len; - lastChild->content[ctxt->nodelen] = 0; - } else if (coalesceText) { - if (xmlTextConcat(lastChild, ch, len)) { - xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); - } - if (ctxt->node->children != NULL) { - ctxt->nodelen = xmlStrlen(lastChild->content); - ctxt->nodemem = ctxt->nodelen + 1; - } - } else { - /* Mixed content, first time */ - lastChild = xmlSAX2TextNode(ctxt, ch, len); - if (lastChild != NULL) { - xmlAddChild(ctxt->node, lastChild); - if (ctxt->node->children != NULL) { - ctxt->nodelen = len; - ctxt->nodemem = len + 1; - } - } - } - } -} - -/** - * xmlSAX2IgnorableWhitespace: - * @ctx: the user data (XML parser context) - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some ignorable whitespaces from the parser. - * UNUSED: by default the DOM building will use xmlSAX2Characters - */ -void -xmlSAX2IgnorableWhitespace(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED) -{ - /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2IgnorableWhitespace(%.30s, %d)\n", ch, len); -#endif -} - -/** - * xmlSAX2ProcessingInstruction: - * @ctx: the user data (XML parser context) - * @target: the target name - * @data: the PI data's - * - * A processing instruction has been parsed. - */ -void -xmlSAX2ProcessingInstruction(void *ctx, const xmlChar *target, - const xmlChar *data) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlNodePtr ret; - xmlNodePtr parent; - - if (ctx == NULL) return; - parent = ctxt->node; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.xmlSAX2ProcessingInstruction(%s, %s)\n", target, data); -#endif - - ret = xmlNewDocPI(ctxt->myDoc, target, data); - if (ret == NULL) return; - parent = ctxt->node; - - if (ctxt->linenumbers) { - if (ctxt->input != NULL) { - if (ctxt->input->line < 65535) - ret->line = (short) ctxt->input->line; - else - ret->line = 65535; - } - } - if (ctxt->inSubset == 1) { - xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); - return; - } else if (ctxt->inSubset == 2) { - xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); - return; - } - if ((ctxt->myDoc->children == NULL) || (parent == NULL)) { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "Setting PI %s as root\n", target); -#endif - xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); - return; - } - if (parent->type == XML_ELEMENT_NODE) { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "adding PI %s child to %s\n", target, parent->name); -#endif - xmlAddChild(parent, ret); - } else { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "adding PI %s sibling to ", target); - xmlDebugDumpOneNode(stderr, parent, 0); -#endif - xmlAddSibling(parent, ret); - } -} - -/** - * xmlSAX2Comment: - * @ctx: the user data (XML parser context) - * @value: the xmlSAX2Comment content - * - * A xmlSAX2Comment has been parsed. - */ -void -xmlSAX2Comment(void *ctx, const xmlChar *value) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlNodePtr ret; - xmlNodePtr parent; - - if (ctx == NULL) return; - parent = ctxt->node; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2Comment(%s)\n", value); -#endif - ret = xmlNewDocComment(ctxt->myDoc, value); - if (ret == NULL) return; - if (ctxt->linenumbers) { - if (ctxt->input != NULL) { - if (ctxt->input->line < 65535) - ret->line = (short) ctxt->input->line; - else - ret->line = 65535; - } - } - - if (ctxt->inSubset == 1) { - xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); - return; - } else if (ctxt->inSubset == 2) { - xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); - return; - } - if ((ctxt->myDoc->children == NULL) || (parent == NULL)) { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "Setting xmlSAX2Comment as root\n"); -#endif - xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); - return; - } - if (parent->type == XML_ELEMENT_NODE) { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "adding xmlSAX2Comment child to %s\n", parent->name); -#endif - xmlAddChild(parent, ret); - } else { -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "adding xmlSAX2Comment sibling to "); - xmlDebugDumpOneNode(stderr, parent, 0); -#endif - xmlAddSibling(parent, ret); - } -} - -/** - * xmlSAX2CDataBlock: - * @ctx: the user data (XML parser context) - * @value: The pcdata content - * @len: the block length - * - * called when a pcdata block has been parsed - */ -void -xmlSAX2CDataBlock(void *ctx, const xmlChar *value, int len) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlNodePtr ret, lastChild; - - if (ctx == NULL) return; -#ifdef DEBUG_SAX - xmlGenericError(xmlGenericErrorContext, - "SAX.pcdata(%.10s, %d)\n", value, len); -#endif - lastChild = xmlGetLastChild(ctxt->node); -#ifdef DEBUG_SAX_TREE - xmlGenericError(xmlGenericErrorContext, - "add chars to %s \n", ctxt->node->name); -#endif - if ((lastChild != NULL) && - (lastChild->type == XML_CDATA_SECTION_NODE)) { - xmlTextConcat(lastChild, value, len); - } else { - ret = xmlNewCDataBlock(ctxt->myDoc, value, len); - xmlAddChild(ctxt->node, ret); - } -} - -static int xmlSAX2DefaultVersionValue = 2; - -#ifdef LIBXML_SAX1_ENABLED -/** - * xmlSAXDefaultVersion: - * @version: the version, 1 or 2 - * - * Set the default version of SAX used globally by the library. - * By default, during initialization the default is set to 2. - * Note that it is generally a better coding style to use - * xmlSAXVersion() to set up the version explicitly for a given - * parsing context. - * - * Returns the previous value in case of success and -1 in case of error. - */ -int -xmlSAXDefaultVersion(int version) -{ - int ret = xmlSAX2DefaultVersionValue; - - if ((version != 1) && (version != 2)) - return(-1); - xmlSAX2DefaultVersionValue = version; - return(ret); -} -#endif /* LIBXML_SAX1_ENABLED */ - -/** - * xmlSAXVersion: - * @hdlr: the SAX handler - * @version: the version, 1 or 2 - * - * Initialize the default XML SAX handler according to the version - * - * Returns 0 in case of success and -1 in case of error. - */ -int -xmlSAXVersion(xmlSAXHandler *hdlr, int version) -{ - if (hdlr == NULL) return(-1); - if (version == 2) { - hdlr->startElement = NULL; - hdlr->endElement = NULL; - hdlr->startElementNs = xmlSAX2StartElementNs; - hdlr->endElementNs = xmlSAX2EndElementNs; - hdlr->serror = NULL; - hdlr->initialized = XML_SAX2_MAGIC; -#ifdef LIBXML_SAX1_ENABLED - } else if (version == 1) { - hdlr->startElement = xmlSAX2StartElement; - hdlr->endElement = xmlSAX2EndElement; - hdlr->initialized = 1; -#endif /* LIBXML_SAX1_ENABLED */ - } else - return(-1); - hdlr->internalSubset = xmlSAX2InternalSubset; - hdlr->externalSubset = xmlSAX2ExternalSubset; - hdlr->isStandalone = xmlSAX2IsStandalone; - hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; - hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; - hdlr->resolveEntity = xmlSAX2ResolveEntity; - hdlr->getEntity = xmlSAX2GetEntity; - hdlr->getParameterEntity = xmlSAX2GetParameterEntity; - hdlr->entityDecl = xmlSAX2EntityDecl; - hdlr->attributeDecl = xmlSAX2AttributeDecl; - hdlr->elementDecl = xmlSAX2ElementDecl; - hdlr->notationDecl = xmlSAX2NotationDecl; - hdlr->unparsedEntityDecl = xmlSAX2UnparsedEntityDecl; - hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; - hdlr->startDocument = xmlSAX2StartDocument; - hdlr->endDocument = xmlSAX2EndDocument; - hdlr->reference = xmlSAX2Reference; - hdlr->characters = xmlSAX2Characters; - hdlr->cdataBlock = xmlSAX2CDataBlock; - hdlr->ignorableWhitespace = xmlSAX2Characters; - hdlr->processingInstruction = xmlSAX2ProcessingInstruction; - hdlr->comment = xmlSAX2Comment; - hdlr->warning = xmlParserWarning; - hdlr->error = xmlParserError; - hdlr->fatalError = xmlParserError; - - return(0); -} - -/** - * xmlSAX2InitDefaultSAXHandler: - * @hdlr: the SAX handler - * @warning: flag if non-zero sets the handler warning procedure - * - * Initialize the default XML SAX2 handler - */ -void -xmlSAX2InitDefaultSAXHandler(xmlSAXHandler *hdlr, int warning) -{ - if ((hdlr == NULL) || (hdlr->initialized != 0)) - return; - - xmlSAXVersion(hdlr, xmlSAX2DefaultVersionValue); - if (warning == 0) - hdlr->warning = NULL; - else - hdlr->warning = xmlParserWarning; -} - -/** - * xmlDefaultSAXHandlerInit: - * - * Initialize the default SAX2 handler - */ -void -xmlDefaultSAXHandlerInit(void) -{ -#ifdef LIBXML_SAX1_ENABLED - xmlSAXVersion((xmlSAXHandlerPtr) &xmlDefaultSAXHandler, 1); -#endif /* LIBXML_SAX1_ENABLED */ -} - -#ifdef LIBXML_HTML_ENABLED - -/** - * xmlSAX2InitHtmlDefaultSAXHandler: - * @hdlr: the SAX handler - * - * Initialize the default HTML SAX2 handler - */ -void -xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr) -{ - if ((hdlr == NULL) || (hdlr->initialized != 0)) - return; - - hdlr->internalSubset = xmlSAX2InternalSubset; - hdlr->externalSubset = NULL; - hdlr->isStandalone = NULL; - hdlr->hasInternalSubset = NULL; - hdlr->hasExternalSubset = NULL; - hdlr->resolveEntity = NULL; - hdlr->getEntity = xmlSAX2GetEntity; - hdlr->getParameterEntity = NULL; - hdlr->entityDecl = NULL; - hdlr->attributeDecl = NULL; - hdlr->elementDecl = NULL; - hdlr->notationDecl = NULL; - hdlr->unparsedEntityDecl = NULL; - hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; - hdlr->startDocument = xmlSAX2StartDocument; - hdlr->endDocument = xmlSAX2EndDocument; - hdlr->startElement = xmlSAX2StartElement; - hdlr->endElement = xmlSAX2EndElement; - hdlr->reference = NULL; - hdlr->characters = xmlSAX2Characters; - hdlr->cdataBlock = xmlSAX2CDataBlock; - hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; - hdlr->processingInstruction = xmlSAX2ProcessingInstruction; - hdlr->comment = xmlSAX2Comment; - hdlr->warning = xmlParserWarning; - hdlr->error = xmlParserError; - hdlr->fatalError = xmlParserError; - - hdlr->initialized = 1; -} - -/** - * htmlDefaultSAXHandlerInit: - * - * Initialize the default SAX handler - */ -void -htmlDefaultSAXHandlerInit(void) -{ - xmlSAX2InitHtmlDefaultSAXHandler((xmlSAXHandlerPtr) &htmlDefaultSAXHandler); -} - -#endif /* LIBXML_HTML_ENABLED */ - -#ifdef LIBXML_DOCB_ENABLED - -/** - * xmlSAX2InitDocbDefaultSAXHandler: - * @hdlr: the SAX handler - * - * Initialize the default DocBook SAX2 handler - */ -void -xmlSAX2InitDocbDefaultSAXHandler(xmlSAXHandler *hdlr) -{ - if ((hdlr == NULL) || (hdlr->initialized != 0)) - return; - - hdlr->internalSubset = xmlSAX2InternalSubset; - hdlr->externalSubset = NULL; - hdlr->isStandalone = xmlSAX2IsStandalone; - hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; - hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; - hdlr->resolveEntity = xmlSAX2ResolveEntity; - hdlr->getEntity = xmlSAX2GetEntity; - hdlr->getParameterEntity = NULL; - hdlr->entityDecl = xmlSAX2EntityDecl; - hdlr->attributeDecl = NULL; - hdlr->elementDecl = NULL; - hdlr->notationDecl = NULL; - hdlr->unparsedEntityDecl = NULL; - hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; - hdlr->startDocument = xmlSAX2StartDocument; - hdlr->endDocument = xmlSAX2EndDocument; - hdlr->startElement = xmlSAX2StartElement; - hdlr->endElement = xmlSAX2EndElement; - hdlr->reference = xmlSAX2Reference; - hdlr->characters = xmlSAX2Characters; - hdlr->cdataBlock = NULL; - hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; - hdlr->processingInstruction = NULL; - hdlr->comment = xmlSAX2Comment; - hdlr->warning = xmlParserWarning; - hdlr->error = xmlParserError; - hdlr->fatalError = xmlParserError; - - hdlr->initialized = 1; -} - -/** - * docbDefaultSAXHandlerInit: - * - * Initialize the default SAX handler - */ -void -docbDefaultSAXHandlerInit(void) -{ - xmlSAX2InitDocbDefaultSAXHandler((xmlSAXHandlerPtr) &docbDefaultSAXHandler); -} - -#endif /* LIBXML_DOCB_ENABLED */ -#define bottom_SAX2 -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/c14n.c b/ThirdParty/libxml2/vtklibxml2/c14n.c deleted file mode 100644 index 71c67fe4c6b..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/c14n.c +++ /dev/null @@ -1,1928 +0,0 @@ -/* - * "Canonical XML" implementation - * http://www.w3.org/TR/xml-c14n - * - * "Exclusive XML Canonicalization" implementation - * http://www.w3.org/TR/xml-exc-c14n - * - * See Copyright for the status of this software. - * - * Author: Aleksey Sanin <aleksey@aleksey.com> - */ -#define IN_LIBXML -#include "libxml.h" -#ifdef LIBXML_C14N_ENABLED -#ifdef LIBXML_OUTPUT_ENABLED - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#include <string.h> - -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/uri.h> -#include <libxml/xmlerror.h> -#include <libxml/globals.h> -#include <libxml/xpathInternals.h> -#include <libxml/c14n.h> - -/************************************************************************ - * * - * Some declaration better left private ATM * - * * - ************************************************************************/ - -typedef enum { - XMLC14N_BEFORE_DOCUMENT_ELEMENT = 0, - XMLC14N_INSIDE_DOCUMENT_ELEMENT = 1, - XMLC14N_AFTER_DOCUMENT_ELEMENT = 2 -} xmlC14NPosition; - -typedef struct _xmlC14NVisibleNsStack { - int nsCurEnd; /* number of nodes in the set */ - int nsPrevStart; /* the begginning of the stack for previous visible node */ - int nsPrevEnd; /* the end of the stack for previous visible node */ - int nsMax; /* size of the array as allocated */ - xmlNsPtr *nsTab; /* array of ns in no particular order */ - xmlNodePtr *nodeTab; /* array of nodes in no particular order */ -} xmlC14NVisibleNsStack, *xmlC14NVisibleNsStackPtr; - -typedef struct _xmlC14NCtx { - /* input parameters */ - xmlDocPtr doc; - xmlC14NIsVisibleCallback is_visible_callback; - void* user_data; - int with_comments; - xmlOutputBufferPtr buf; - - /* position in the XML document */ - xmlC14NPosition pos; - int parent_is_doc; - xmlC14NVisibleNsStackPtr ns_rendered; - - /* exclusive canonicalization */ - int exclusive; - xmlChar **inclusive_ns_prefixes; - - /* error number */ - int error; -} xmlC14NCtx, *xmlC14NCtxPtr; - -static xmlC14NVisibleNsStackPtr xmlC14NVisibleNsStackCreate (void); -static void xmlC14NVisibleNsStackDestroy (xmlC14NVisibleNsStackPtr cur); -static void xmlC14NVisibleNsStackAdd (xmlC14NVisibleNsStackPtr cur, - xmlNsPtr ns, - xmlNodePtr node); -static void xmlC14NVisibleNsStackSave (xmlC14NVisibleNsStackPtr cur, - xmlC14NVisibleNsStackPtr state); -static void xmlC14NVisibleNsStackRestore (xmlC14NVisibleNsStackPtr cur, - xmlC14NVisibleNsStackPtr state); -static void xmlC14NVisibleNsStackShift (xmlC14NVisibleNsStackPtr cur); -static int xmlC14NVisibleNsStackFind (xmlC14NVisibleNsStackPtr cur, - xmlNsPtr ns); -static int xmlExcC14NVisibleNsStackFind (xmlC14NVisibleNsStackPtr cur, - xmlNsPtr ns, - xmlC14NCtxPtr ctx); - -static int xmlC14NIsNodeInNodeset (xmlNodeSetPtr nodes, - xmlNodePtr node, - xmlNodePtr parent); - - - -static int xmlC14NProcessNode(xmlC14NCtxPtr ctx, xmlNodePtr cur); -static int xmlC14NProcessNodeList(xmlC14NCtxPtr ctx, xmlNodePtr cur); -typedef enum { - XMLC14N_NORMALIZE_ATTR = 0, - XMLC14N_NORMALIZE_COMMENT = 1, - XMLC14N_NORMALIZE_PI = 2, - XMLC14N_NORMALIZE_TEXT = 3 -} xmlC14NNormalizationMode; - -static xmlChar *xmlC11NNormalizeString(const xmlChar * input, - xmlC14NNormalizationMode mode); - -#define xmlC11NNormalizeAttr( a ) \ - xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_ATTR) -#define xmlC11NNormalizeComment( a ) \ - xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_COMMENT) -#define xmlC11NNormalizePI( a ) \ - xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_PI) -#define xmlC11NNormalizeText( a ) \ - xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_TEXT) - -#define xmlC14NIsVisible( ctx, node, parent ) \ - (((ctx)->is_visible_callback != NULL) ? \ - (ctx)->is_visible_callback((ctx)->user_data, \ - (xmlNodePtr)(node), (xmlNodePtr)(parent)) : 1) - -/************************************************************************ - * * - * Some factorized error routines * - * * - ************************************************************************/ - -/** - * xmlC14NErrMemory: - * @extra: extra informations - * - * Handle a redefinition of memory error - */ -static void -xmlC14NErrMemory(const char *extra) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, - XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, extra, - NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); -} - -/** - * xmlC14NErrParam: - * @extra: extra informations - * - * Handle a redefinition of param error - */ -static void -xmlC14NErrParam(const char *extra) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, - XML_ERR_INTERNAL_ERROR, XML_ERR_ERROR, NULL, 0, extra, - NULL, NULL, 0, 0, - "Invalid parameter : %s\n", extra); -} - -/** - * xmlC14NErrInternal: - * @extra: extra informations - * - * Handle a redefinition of internal error - */ -static void -xmlC14NErrInternal(const char *extra) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, - XML_ERR_INTERNAL_ERROR, XML_ERR_ERROR, NULL, 0, extra, - NULL, NULL, 0, 0, - "Internal error : %s\n", extra); -} - -/** - * xmlC14NErrInvalidNode: - * @extra: extra informations - * - * Handle a redefinition of invalid node error - */ -static void -xmlC14NErrInvalidNode(const char *node_type, const char *extra) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, - XML_C14N_INVALID_NODE, XML_ERR_ERROR, NULL, 0, extra, - NULL, NULL, 0, 0, - "Node %s is invalid here : %s\n", node_type, extra); -} - -/** - * xmlC14NErrUnknownNode: - * @extra: extra informations - * - * Handle a redefinition of unknown node error - */ -static void -xmlC14NErrUnknownNode(int node_type, const char *extra) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, - XML_C14N_UNKNOW_NODE, XML_ERR_ERROR, NULL, 0, extra, - NULL, NULL, 0, 0, - "Unknown node type %d found : %s\n", node_type, extra); -} - -/** - * xmlC14NErrRelativeNamespace: - * @extra: extra informations - * - * Handle a redefinition of relative namespace error - */ -static void -xmlC14NErrRelativeNamespace(const char *ns_uri) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, - XML_C14N_RELATIVE_NAMESPACE, XML_ERR_ERROR, NULL, 0, NULL, - NULL, NULL, 0, 0, - "Relative namespace UR is invalid here : %s\n", ns_uri); -} - - - -/** - * xmlC14NErr: - * @ctxt: a C14N evaluation context - * @node: the context node - * @error: the erorr code - * @msg: the message - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -static void -xmlC14NErr(xmlC14NCtxPtr ctxt, xmlNodePtr node, int error, - const char * msg) -{ - if (ctxt != NULL) - ctxt->error = error; - __xmlRaiseError(NULL, NULL, NULL, - ctxt, node, XML_FROM_C14N, error, - XML_ERR_ERROR, NULL, 0, - NULL, NULL, NULL, 0, 0, msg); -} - -/************************************************************************ - * * - * The implementation internals * - * * - ************************************************************************/ -#define XML_NAMESPACES_DEFAULT 16 - -static int -xmlC14NIsNodeInNodeset(xmlNodeSetPtr nodes, xmlNodePtr node, xmlNodePtr parent) { - if((nodes != NULL) && (node != NULL)) { - if(node->type != XML_NAMESPACE_DECL) { - return(xmlXPathNodeSetContains(nodes, node)); - } else { - xmlNs ns; - - memcpy(&ns, node, sizeof(ns)); - - /* this is a libxml hack! check xpath.c for details */ - if((parent != NULL) && (parent->type == XML_ATTRIBUTE_NODE)) { - ns.next = (xmlNsPtr)parent->parent; - } else { - ns.next = (xmlNsPtr)parent; - } - - /* - * If the input is an XPath node-set, then the node-set must explicitly - * contain every node to be rendered to the canonical form. - */ - return(xmlXPathNodeSetContains(nodes, (xmlNodePtr)&ns)); - } - } - return(1); -} - -static xmlC14NVisibleNsStackPtr -xmlC14NVisibleNsStackCreate(void) { - xmlC14NVisibleNsStackPtr ret; - - ret = (xmlC14NVisibleNsStackPtr) xmlMalloc(sizeof(xmlC14NVisibleNsStack)); - if (ret == NULL) { - xmlC14NErrMemory("creating namespaces stack"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlC14NVisibleNsStack)); - return(ret); -} - -static void -xmlC14NVisibleNsStackDestroy(xmlC14NVisibleNsStackPtr cur) { - if(cur == NULL) { - xmlC14NErrParam("destroying namespaces stack"); - return; - } - if(cur->nsTab != NULL) { - memset(cur->nsTab, 0, cur->nsMax * sizeof(xmlNsPtr)); - xmlFree(cur->nsTab); - } - if(cur->nodeTab != NULL) { - memset(cur->nodeTab, 0, cur->nsMax * sizeof(xmlNodePtr)); - xmlFree(cur->nodeTab); - } - memset(cur, 0, sizeof(xmlC14NVisibleNsStack)); - xmlFree(cur); - -} - -static void -xmlC14NVisibleNsStackAdd(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns, xmlNodePtr node) { - if((cur == NULL) || - ((cur->nsTab == NULL) && (cur->nodeTab != NULL)) || - ((cur->nsTab != NULL) && (cur->nodeTab == NULL))) { - xmlC14NErrParam("adding namespace to stack"); - return; - } - - if ((cur->nsTab == NULL) && (cur->nodeTab == NULL)) { - cur->nsTab = (xmlNsPtr*) xmlMalloc(XML_NAMESPACES_DEFAULT * sizeof(xmlNsPtr)); - cur->nodeTab = (xmlNodePtr*) xmlMalloc(XML_NAMESPACES_DEFAULT * sizeof(xmlNodePtr)); - if ((cur->nsTab == NULL) || (cur->nodeTab == NULL)) { - xmlC14NErrMemory("adding node to stack"); - return; - } - memset(cur->nsTab, 0 , XML_NAMESPACES_DEFAULT * sizeof(xmlNsPtr)); - memset(cur->nodeTab, 0 , XML_NAMESPACES_DEFAULT * sizeof(xmlNodePtr)); - cur->nsMax = XML_NAMESPACES_DEFAULT; - } else if(cur->nsMax == cur->nsCurEnd) { - void *tmp; - int tmpSize; - - tmpSize = 2 * cur->nsMax; - tmp = xmlRealloc(cur->nsTab, tmpSize * sizeof(xmlNsPtr)); - if (tmp == NULL) { - xmlC14NErrMemory("adding node to stack"); - return; - } - cur->nsTab = (xmlNsPtr*)tmp; - - tmp = xmlRealloc(cur->nodeTab, tmpSize * sizeof(xmlNodePtr)); - if (tmp == NULL) { - xmlC14NErrMemory("adding node to stack"); - return; - } - cur->nodeTab = (xmlNodePtr*)tmp; - - cur->nsMax = tmpSize; - } - cur->nsTab[cur->nsCurEnd] = ns; - cur->nodeTab[cur->nsCurEnd] = node; - - ++cur->nsCurEnd; -} - -static void -xmlC14NVisibleNsStackSave(xmlC14NVisibleNsStackPtr cur, xmlC14NVisibleNsStackPtr state) { - if((cur == NULL) || (state == NULL)) { - xmlC14NErrParam("saving namespaces stack"); - return; - } - - state->nsCurEnd = cur->nsCurEnd; - state->nsPrevStart = cur->nsPrevStart; - state->nsPrevEnd = cur->nsPrevEnd; -} - -static void -xmlC14NVisibleNsStackRestore(xmlC14NVisibleNsStackPtr cur, xmlC14NVisibleNsStackPtr state) { - if((cur == NULL) || (state == NULL)) { - xmlC14NErrParam("restoring namespaces stack"); - return; - } - cur->nsCurEnd = state->nsCurEnd; - cur->nsPrevStart = state->nsPrevStart; - cur->nsPrevEnd = state->nsPrevEnd; -} - -static void -xmlC14NVisibleNsStackShift(xmlC14NVisibleNsStackPtr cur) { - if(cur == NULL) { - xmlC14NErrParam("shifting namespaces stack"); - return; - } - cur->nsPrevStart = cur->nsPrevEnd; - cur->nsPrevEnd = cur->nsCurEnd; -} - -static int -xmlC14NStrEqual(const xmlChar *str1, const xmlChar *str2) { - if (str1 == str2) return(1); - if (str1 == NULL) return((*str2) == '\0'); - if (str2 == NULL) return((*str1) == '\0'); - do { - if (*str1++ != *str2) return(0); - } while (*str2++); - return(1); -} - -/** - * xmlC14NVisibleNsStackFind: - * @ctx: the C14N context - * @ns: the namespace to check - * - * Checks whether the given namespace was already rendered or not - * - * Returns 1 if we already wrote this namespace or 0 otherwise - */ -static int -xmlC14NVisibleNsStackFind(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns) -{ - int i; - const xmlChar *prefix; - const xmlChar *href; - int has_empty_ns; - - if(cur == NULL) { - xmlC14NErrParam("searching namespaces stack (c14n)"); - return (0); - } - - /* - * if the default namespace xmlns="" is not defined yet then - * we do not want to print it out - */ - prefix = ((ns == NULL) || (ns->prefix == NULL)) ? BAD_CAST "" : ns->prefix; - href = ((ns == NULL) || (ns->href == NULL)) ? BAD_CAST "" : ns->href; - has_empty_ns = (xmlC14NStrEqual(prefix, NULL) && xmlC14NStrEqual(href, NULL)); - - if (cur->nsTab != NULL) { - int start = (has_empty_ns) ? 0 : cur->nsPrevStart; - for (i = cur->nsCurEnd - 1; i >= start; --i) { - xmlNsPtr ns1 = cur->nsTab[i]; - - if(xmlC14NStrEqual(prefix, (ns1 != NULL) ? ns1->prefix : NULL)) { - return(xmlC14NStrEqual(href, (ns1 != NULL) ? ns1->href : NULL)); - } - } - } - return(has_empty_ns); -} - -static int -xmlExcC14NVisibleNsStackFind(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns, xmlC14NCtxPtr ctx) { - int i; - const xmlChar *prefix; - const xmlChar *href; - int has_empty_ns; - - if(cur == NULL) { - xmlC14NErrParam("searching namespaces stack (exc c14n)"); - return (0); - } - - /* - * if the default namespace xmlns="" is not defined yet then - * we do not want to print it out - */ - prefix = ((ns == NULL) || (ns->prefix == NULL)) ? BAD_CAST "" : ns->prefix; - href = ((ns == NULL) || (ns->href == NULL)) ? BAD_CAST "" : ns->href; - has_empty_ns = (xmlC14NStrEqual(prefix, NULL) && xmlC14NStrEqual(href, NULL)); - - if (cur->nsTab != NULL) { - int start = 0; - for (i = cur->nsCurEnd - 1; i >= start; --i) { - xmlNsPtr ns1 = cur->nsTab[i]; - - if(xmlC14NStrEqual(prefix, (ns1 != NULL) ? ns1->prefix : NULL)) { - if(xmlC14NStrEqual(href, (ns1 != NULL) ? ns1->href : NULL)) { - return(xmlC14NIsVisible(ctx, ns1, cur->nodeTab[i])); - } else { - return(0); - } - } - } - } - return(has_empty_ns); -} - - - - -/** - * xmlC14NIsXmlNs: - * @ns: the namespace to check - * - * Checks whether the given namespace is a default "xml:" namespace - * with href="http://www.w3.org/XML/1998/namespace" - * - * Returns 1 if the node is default or 0 otherwise - */ - -/* todo: make it a define? */ -static int -xmlC14NIsXmlNs(xmlNsPtr ns) -{ - return ((ns != NULL) && - (xmlStrEqual(ns->prefix, BAD_CAST "xml")) && - (xmlStrEqual(ns->href, - BAD_CAST - "http://www.w3.org/XML/1998/namespace"))); -} - - -/** - * xmlC14NNsCompare: - * @ns1: the pointer to first namespace - * @ns2: the pointer to second namespace - * - * Compares the namespaces by names (prefixes). - * - * Returns -1 if ns1 < ns2, 0 if ns1 == ns2 or 1 if ns1 > ns2. - */ -static int -xmlC14NNsCompare(xmlNsPtr ns1, xmlNsPtr ns2) -{ - if (ns1 == ns2) - return (0); - if (ns1 == NULL) - return (-1); - if (ns2 == NULL) - return (1); - - return (xmlStrcmp(ns1->prefix, ns2->prefix)); -} - - -/** - * xmlC14NPrintNamespaces: - * @ns: the pointer to namespace - * @ctx: the C14N context - * - * Prints the given namespace to the output buffer from C14N context. - * - * Returns 1 on success or 0 on fail. - */ -static int -xmlC14NPrintNamespaces(const xmlNsPtr ns, xmlC14NCtxPtr ctx) -{ - - if ((ns == NULL) || (ctx == NULL)) { - xmlC14NErrParam("writing namespaces"); - return 0; - } - - if (ns->prefix != NULL) { - xmlOutputBufferWriteString(ctx->buf, " xmlns:"); - xmlOutputBufferWriteString(ctx->buf, (const char *) ns->prefix); - xmlOutputBufferWriteString(ctx->buf, "=\""); - } else { - xmlOutputBufferWriteString(ctx->buf, " xmlns=\""); - } - if(ns->href != NULL) { - xmlOutputBufferWriteString(ctx->buf, (const char *) ns->href); - } - xmlOutputBufferWriteString(ctx->buf, "\""); - return (1); -} - -/** - * xmlC14NProcessNamespacesAxis: - * @ctx: the C14N context - * @node: the current node - * - * Prints out canonical namespace axis of the current node to the - * buffer from C14N context as follows - * - * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) - * - * Namespace Axis - * Consider a list L containing only namespace nodes in the - * axis and in the node-set in lexicographic order (ascending). To begin - * processing L, if the first node is not the default namespace node (a node - * with no namespace URI and no local name), then generate a space followed - * by xmlns="" if and only if the following conditions are met: - * - the element E that owns the axis is in the node-set - * - The nearest ancestor element of E in the node-set has a default - * namespace node in the node-set (default namespace nodes always - * have non-empty values in XPath) - * The latter condition eliminates unnecessary occurrences of xmlns="" in - * the canonical form since an element only receives an xmlns="" if its - * default namespace is empty and if it has an immediate parent in the - * canonical form that has a non-empty default namespace. To finish - * processing L, simply process every namespace node in L, except omit - * namespace node with local name xml, which defines the xml prefix, - * if its string value is http://www.w3.org/XML/1998/namespace. - * - * Exclusive XML Canonicalization v 1.0 (http://www.w3.org/TR/xml-exc-c14n) - * Canonical XML applied to a document subset requires the search of the - * ancestor nodes of each orphan element node for attributes in the xml - * namespace, such as xml:lang and xml:space. These are copied into the - * element node except if a declaration of the same attribute is already - * in the attribute axis of the element (whether or not it is included in - * the document subset). This search and copying are omitted from the - * Exclusive XML Canonicalization method. - * - * Returns 0 on success or -1 on fail. - */ -static int -xmlC14NProcessNamespacesAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) -{ - xmlNodePtr n; - xmlNsPtr ns, tmp; - xmlListPtr list; - int already_rendered; - int has_empty_ns = 0; - - if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { - xmlC14NErrParam("processing namespaces axis (c14n)"); - return (-1); - } - - /* - * Create a sorted list to store element namespaces - */ - list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NNsCompare); - if (list == NULL) { - xmlC14NErrInternal("creating namespaces list (c14n)"); - return (-1); - } - - /* check all namespaces */ - for(n = cur; n != NULL; n = n->parent) { - for(ns = n->nsDef; ns != NULL; ns = ns->next) { - tmp = xmlSearchNs(cur->doc, cur, ns->prefix); - - if((tmp == ns) && !xmlC14NIsXmlNs(ns) && xmlC14NIsVisible(ctx, ns, cur)) { - already_rendered = xmlC14NVisibleNsStackFind(ctx->ns_rendered, ns); - if(visible) { - xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); - } - if(!already_rendered) { - xmlListInsert(list, ns); - } - if(xmlStrlen(ns->prefix) == 0) { - has_empty_ns = 1; - } - } - } - } - - /** - * if the first node is not the default namespace node (a node with no - * namespace URI and no local name), then generate a space followed by - * xmlns="" if and only if the following conditions are met: - * - the element E that owns the axis is in the node-set - * - the nearest ancestor element of E in the node-set has a default - * namespace node in the node-set (default namespace nodes always - * have non-empty values in XPath) - */ - if(visible && !has_empty_ns) { - static xmlNs ns_default; - - memset(&ns_default, 0, sizeof(ns_default)); - if(!xmlC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default)) { - xmlC14NPrintNamespaces(&ns_default, ctx); - } - } - - - /* - * print out all elements from list - */ - xmlListWalk(list, (xmlListWalker) xmlC14NPrintNamespaces, (const void *) ctx); - - /* - * Cleanup - */ - xmlListDelete(list); - return (0); -} - - -/** - * xmlExcC14NProcessNamespacesAxis: - * @ctx: the C14N context - * @node: the current node - * - * Prints out exclusive canonical namespace axis of the current node to the - * buffer from C14N context as follows - * - * Exclusive XML Canonicalization - * http://www.w3.org/TR/xml-exc-c14n - * - * If the element node is in the XPath subset then output the node in - * accordance with Canonical XML except for namespace nodes which are - * rendered as follows: - * - * 1. Render each namespace node iff: - * * it is visibly utilized by the immediate parent element or one of - * its attributes, or is present in InclusiveNamespaces PrefixList, and - * * its prefix and value do not appear in ns_rendered. ns_rendered is - * obtained by popping the state stack in order to obtain a list of - * prefixes and their values which have already been rendered by - * an output ancestor of the namespace node's parent element. - * 2. Append the rendered namespace node to the list ns_rendered of namespace - * nodes rendered by output ancestors. Push ns_rendered on state stack and - * recurse. - * 3. After the recursion returns, pop thestate stack. - * - * - * Returns 0 on success or -1 on fail. - */ -static int -xmlExcC14NProcessNamespacesAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) -{ - xmlNsPtr ns; - xmlListPtr list; - xmlAttrPtr attr; - int already_rendered; - int has_empty_ns = 0; - int has_visibly_utilized_empty_ns = 0; - int has_empty_ns_in_inclusive_list = 0; - - if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { - xmlC14NErrParam("processing namespaces axis (exc c14n)"); - return (-1); - } - - if(!ctx->exclusive) { - xmlC14NErrParam("processing namespaces axis (exc c14n)"); - return (-1); - - } - - /* - * Create a sorted list to store element namespaces - */ - list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NNsCompare); - if (list == NULL) { - xmlC14NErrInternal("creating namespaces list (exc c14n)"); - return (-1); - } - - /* - * process inclusive namespaces: - * All namespace nodes appearing on inclusive ns list are - * handled as provided in Canonical XML - */ - if(ctx->inclusive_ns_prefixes != NULL) { - xmlChar *prefix; - int i; - - for (i = 0; ctx->inclusive_ns_prefixes[i] != NULL; ++i) { - prefix = ctx->inclusive_ns_prefixes[i]; - /* - * Special values for namespace with empty prefix - */ - if (xmlStrEqual(prefix, BAD_CAST "#default") - || xmlStrEqual(prefix, BAD_CAST "")) { - prefix = NULL; - has_empty_ns_in_inclusive_list = 1; - } - - ns = xmlSearchNs(cur->doc, cur, prefix); - if((ns != NULL) && !xmlC14NIsXmlNs(ns) && xmlC14NIsVisible(ctx, ns, cur)) { - already_rendered = xmlC14NVisibleNsStackFind(ctx->ns_rendered, ns); - if(visible) { - xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); - } - if(!already_rendered) { - xmlListInsert(list, ns); - } - if(xmlStrlen(ns->prefix) == 0) { - has_empty_ns = 1; - } - } - } - } - - /* add node namespace */ - if(cur->ns != NULL) { - ns = cur->ns; - } else { - ns = xmlSearchNs(cur->doc, cur, NULL); - has_visibly_utilized_empty_ns = 1; - } - if((ns != NULL) && !xmlC14NIsXmlNs(ns)) { - if(visible && xmlC14NIsVisible(ctx, ns, cur)) { - if(!xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, ns, ctx)) { - xmlListInsert(list, ns); - } - } - if(visible) { - xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); - } - if(xmlStrlen(ns->prefix) == 0) { - has_empty_ns = 1; - } - } - - - /* add attributes */ - for(attr = cur->properties; attr != NULL; attr = attr->next) { - /* - * we need to check that attribute is visible and has non - * default namespace (XML Namespaces: "default namespaces - * do not apply directly to attributes") - */ - if((attr->ns != NULL) && !xmlC14NIsXmlNs(attr->ns) && xmlC14NIsVisible(ctx, attr, cur)) { - already_rendered = xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, attr->ns, ctx); - xmlC14NVisibleNsStackAdd(ctx->ns_rendered, attr->ns, cur); - if(!already_rendered && visible) { - xmlListInsert(list, attr->ns); - } - if(xmlStrlen(attr->ns->prefix) == 0) { - has_empty_ns = 1; - } - } else if((attr->ns != NULL) && (xmlStrlen(attr->ns->prefix) == 0) && (xmlStrlen(attr->ns->href) == 0)) { - has_visibly_utilized_empty_ns = 1; - } - } - - /* - * Process xmlns="" - */ - if(visible && has_visibly_utilized_empty_ns && - !has_empty_ns && !has_empty_ns_in_inclusive_list) { - static xmlNs ns_default; - - memset(&ns_default, 0, sizeof(ns_default)); - - already_rendered = xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default, ctx); - if(!already_rendered) { - xmlC14NPrintNamespaces(&ns_default, ctx); - } - } else if(visible && !has_empty_ns && has_empty_ns_in_inclusive_list) { - static xmlNs ns_default; - - memset(&ns_default, 0, sizeof(ns_default)); - if(!xmlC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default)) { - xmlC14NPrintNamespaces(&ns_default, ctx); - } - } - - - - /* - * print out all elements from list - */ - xmlListWalk(list, (xmlListWalker) xmlC14NPrintNamespaces, (const void *) ctx); - - /* - * Cleanup - */ - xmlListDelete(list); - return (0); -} - - -/** - * xmlC14NAttrsCompare: - * @attr1: the pointer tls o first attr - * @attr2: the pointer to second attr - * - * Prints the given attribute to the output buffer from C14N context. - * - * Returns -1 if attr1 < attr2, 0 if attr1 == attr2 or 1 if attr1 > attr2. - */ -static int -xmlC14NAttrsCompare(xmlAttrPtr attr1, xmlAttrPtr attr2) -{ - int ret = 0; - - /* - * Simple cases - */ - if (attr1 == attr2) - return (0); - if (attr1 == NULL) - return (-1); - if (attr2 == NULL) - return (1); - if (attr1->ns == attr2->ns) { - return (xmlStrcmp(attr1->name, attr2->name)); - } - - /* - * Attributes in the default namespace are first - * because the default namespace is not applied to - * unqualified attributes - */ - if (attr1->ns == NULL) - return (-1); - if (attr2->ns == NULL) - return (1); - if (attr1->ns->prefix == NULL) - return (-1); - if (attr2->ns->prefix == NULL) - return (1); - - ret = xmlStrcmp(attr1->ns->href, attr2->ns->href); - if (ret == 0) { - ret = xmlStrcmp(attr1->name, attr2->name); - } - return (ret); -} - - -/** - * xmlC14NPrintAttrs: - * @attr: the pointer to attr - * @ctx: the C14N context - * - * Prints out canonical attribute urrent node to the - * buffer from C14N context as follows - * - * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) - * - * Returns 1 on success or 0 on fail. - */ -static int -xmlC14NPrintAttrs(const xmlAttrPtr attr, xmlC14NCtxPtr ctx) -{ - xmlChar *value; - xmlChar *buffer; - - if ((attr == NULL) || (ctx == NULL)) { - xmlC14NErrParam("writing attributes"); - return (0); - } - - xmlOutputBufferWriteString(ctx->buf, " "); - if (attr->ns != NULL && xmlStrlen(attr->ns->prefix) > 0) { - xmlOutputBufferWriteString(ctx->buf, - (const char *) attr->ns->prefix); - xmlOutputBufferWriteString(ctx->buf, ":"); - } - xmlOutputBufferWriteString(ctx->buf, (const char *) attr->name); - xmlOutputBufferWriteString(ctx->buf, "=\""); - - value = xmlNodeListGetString(attr->doc, attr->children, 1); - /* todo: should we log an error if value==NULL ? */ - if (value != NULL) { - buffer = xmlC11NNormalizeAttr(value); - xmlFree(value); - if (buffer != NULL) { - xmlOutputBufferWriteString(ctx->buf, (const char *) buffer); - xmlFree(buffer); - } else { - xmlC14NErrInternal("normalizing attributes axis"); - return (0); - } - } - xmlOutputBufferWriteString(ctx->buf, "\""); - return (1); -} - -/** - * xmlC14NProcessAttrsAxis: - * @ctx: the C14N context - * @cur: the current node - * @parent_visible: the visibility of parent node - * - * Prints out canonical attribute axis of the current node to the - * buffer from C14N context as follows - * - * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) - * - * Attribute Axis - * In lexicographic order (ascending), process each node that - * is in the element's attribute axis and in the node-set. - * - * The processing of an element node E MUST be modified slightly - * when an XPath node-set is given as input and the element's - * parent is omitted from the node-set. - * - * - * Exclusive XML Canonicalization v 1.0 (http://www.w3.org/TR/xml-exc-c14n) - * - * Canonical XML applied to a document subset requires the search of the - * ancestor nodes of each orphan element node for attributes in the xml - * namespace, such as xml:lang and xml:space. These are copied into the - * element node except if a declaration of the same attribute is already - * in the attribute axis of the element (whether or not it is included in - * the document subset). This search and copying are omitted from the - * Exclusive XML Canonicalization method. - * - * Returns 0 on success or -1 on fail. - */ -static int -xmlC14NProcessAttrsAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int parent_visible) -{ - xmlAttrPtr attr; - xmlListPtr list; - - if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { - xmlC14NErrParam("processing attributes axis"); - return (-1); - } - - /* - * Create a sorted list to store element attributes - */ - list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NAttrsCompare); - if (list == NULL) { - xmlC14NErrInternal("creating attributes list"); - return (-1); - } - - /* - * Add all visible attributes from current node. - */ - attr = cur->properties; - while (attr != NULL) { - /* check that attribute is visible */ - if (xmlC14NIsVisible(ctx, attr, cur)) { - xmlListInsert(list, attr); - } - attr = attr->next; - } - - /* - * include attributes in "xml" namespace defined in ancestors - * (only for non-exclusive XML Canonicalization) - */ - if (parent_visible && (!ctx->exclusive) && (cur->parent != NULL) - && (!xmlC14NIsVisible(ctx, cur->parent, cur->parent->parent))) { - /* - * If XPath node-set is not specified then the parent is always - * visible! - */ - cur = cur->parent; - while (cur != NULL) { - attr = cur->properties; - while (attr != NULL) { - if ((attr->ns != NULL) - && (xmlStrEqual(attr->ns->prefix, BAD_CAST "xml"))) { - if (xmlListSearch(list, attr) == NULL) { - xmlListInsert(list, attr); - } - } - attr = attr->next; - } - cur = cur->parent; - } - } - - /* - * print out all elements from list - */ - xmlListWalk(list, (xmlListWalker) xmlC14NPrintAttrs, (const void *) ctx); - - /* - * Cleanup - */ - xmlListDelete(list); - return (0); -} - -/** - * xmlC14NCheckForRelativeNamespaces: - * @ctx: the C14N context - * @cur: the current element node - * - * Checks that current element node has no relative namespaces defined - * - * Returns 0 if the node has no relative namespaces or -1 otherwise. - */ -static int -xmlC14NCheckForRelativeNamespaces(xmlC14NCtxPtr ctx, xmlNodePtr cur) -{ - xmlNsPtr ns; - - if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { - xmlC14NErrParam("checking for relative namespaces"); - return (-1); - } - - ns = cur->nsDef; - while (ns != NULL) { - if (xmlStrlen(ns->href) > 0) { - xmlURIPtr uri; - - uri = xmlParseURI((const char *) ns->href); - if (uri == NULL) { - xmlC14NErrInternal("parsing namespace uri"); - return (-1); - } - if (xmlStrlen((const xmlChar *) uri->scheme) == 0) { - xmlC14NErrRelativeNamespace(uri->scheme); - xmlFreeURI(uri); - return (-1); - } - if ((xmlStrcasecmp((const xmlChar *) uri->scheme, BAD_CAST "urn") != 0) - && (xmlStrcasecmp((const xmlChar *) uri->scheme, BAD_CAST "dav") !=0) - && (xmlStrlen((const xmlChar *) uri->server) == 0)) { - xmlC14NErrRelativeNamespace(uri->scheme); - xmlFreeURI(uri); - return (-1); - } - xmlFreeURI(uri); - } - ns = ns->next; - } - return (0); -} - -/** - * xmlC14NProcessElementNode: - * @ctx: the pointer to C14N context object - * @cur: the node to process - * - * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) - * - * Element Nodes - * If the element is not in the node-set, then the result is obtained - * by processing the namespace axis, then the attribute axis, then - * processing the child nodes of the element that are in the node-set - * (in document order). If the element is in the node-set, then the result - * is an open angle bracket (<), the element QName, the result of - * processing the namespace axis, the result of processing the attribute - * axis, a close angle bracket (>), the result of processing the child - * nodes of the element that are in the node-set (in document order), an - * open angle bracket, a forward slash (/), the element QName, and a close - * angle bracket. - * - * Returns non-negative value on success or negative value on fail - */ -static int -xmlC14NProcessElementNode(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) -{ - int ret; - xmlC14NVisibleNsStack state; - int parent_is_doc = 0; - - if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { - xmlC14NErrParam("processing element node"); - return (-1); - } - - /* - * Check relative relative namespaces: - * implementations of XML canonicalization MUST report an operation - * failure on documents containing relative namespace URIs. - */ - if (xmlC14NCheckForRelativeNamespaces(ctx, cur) < 0) { - xmlC14NErrInternal("checking for relative namespaces"); - return (-1); - } - - - /* - * Save ns_rendered stack position - */ - memset(&state, 0, sizeof(state)); - xmlC14NVisibleNsStackSave(ctx->ns_rendered, &state); - - if (visible) { - if (ctx->parent_is_doc) { - /* save this flag into the stack */ - parent_is_doc = ctx->parent_is_doc; - ctx->parent_is_doc = 0; - ctx->pos = XMLC14N_INSIDE_DOCUMENT_ELEMENT; - } - xmlOutputBufferWriteString(ctx->buf, "<"); - - if ((cur->ns != NULL) && (xmlStrlen(cur->ns->prefix) > 0)) { - xmlOutputBufferWriteString(ctx->buf, - (const char *) cur->ns->prefix); - xmlOutputBufferWriteString(ctx->buf, ":"); - } - xmlOutputBufferWriteString(ctx->buf, (const char *) cur->name); - } - - if (!ctx->exclusive) { - ret = xmlC14NProcessNamespacesAxis(ctx, cur, visible); - } else { - ret = xmlExcC14NProcessNamespacesAxis(ctx, cur, visible); - } - if (ret < 0) { - xmlC14NErrInternal("processing namespaces axis"); - return (-1); - } - /* todo: shouldn't this go to "visible only"? */ - if(visible) { - xmlC14NVisibleNsStackShift(ctx->ns_rendered); - } - - ret = xmlC14NProcessAttrsAxis(ctx, cur, visible); - if (ret < 0) { - xmlC14NErrInternal("processing attributes axis"); - return (-1); - } - - if (visible) { - xmlOutputBufferWriteString(ctx->buf, ">"); - } - if (cur->children != NULL) { - ret = xmlC14NProcessNodeList(ctx, cur->children); - if (ret < 0) { - xmlC14NErrInternal("processing childrens list"); - return (-1); - } - } - if (visible) { - xmlOutputBufferWriteString(ctx->buf, "</"); - if ((cur->ns != NULL) && (xmlStrlen(cur->ns->prefix) > 0)) { - xmlOutputBufferWriteString(ctx->buf, - (const char *) cur->ns->prefix); - xmlOutputBufferWriteString(ctx->buf, ":"); - } - xmlOutputBufferWriteString(ctx->buf, (const char *) cur->name); - xmlOutputBufferWriteString(ctx->buf, ">"); - if (parent_is_doc) { - /* restore this flag from the stack for next node */ - ctx->parent_is_doc = parent_is_doc; - ctx->pos = XMLC14N_AFTER_DOCUMENT_ELEMENT; - } - } - - /* - * Restore ns_rendered stack position - */ - xmlC14NVisibleNsStackRestore(ctx->ns_rendered, &state); - return (0); -} - -/** - * xmlC14NProcessNode: - * @ctx: the pointer to C14N context object - * @cur: the node to process - * - * Processes the given node - * - * Returns non-negative value on success or negative value on fail - */ -static int -xmlC14NProcessNode(xmlC14NCtxPtr ctx, xmlNodePtr cur) -{ - int ret = 0; - int visible; - - if ((ctx == NULL) || (cur == NULL)) { - xmlC14NErrParam("processing node"); - return (-1); - } - - visible = xmlC14NIsVisible(ctx, cur, cur->parent); - switch (cur->type) { - case XML_ELEMENT_NODE: - ret = xmlC14NProcessElementNode(ctx, cur, visible); - break; - case XML_CDATA_SECTION_NODE: - case XML_TEXT_NODE: - /* - * Text Nodes - * the string value, except all ampersands are replaced - * by &, all open angle brackets (<) are replaced by <, all closing - * angle brackets (>) are replaced by >, and all #xD characters are - * replaced by 
. - */ - /* cdata sections are processed as text nodes */ - /* todo: verify that cdata sections are included in XPath nodes set */ - if ((visible) && (cur->content != NULL)) { - xmlChar *buffer; - - buffer = xmlC11NNormalizeText(cur->content); - if (buffer != NULL) { - xmlOutputBufferWriteString(ctx->buf, - (const char *) buffer); - xmlFree(buffer); - } else { - xmlC14NErrInternal("normalizing text node"); - return (-1); - } - } - break; - case XML_PI_NODE: - /* - * Processing Instruction (PI) Nodes- - * The opening PI symbol (<?), the PI target name of the node, - * a leading space and the string value if it is not empty, and - * the closing PI symbol (?>). If the string value is empty, - * then the leading space is not added. Also, a trailing #xA is - * rendered after the closing PI symbol for PI children of the - * root node with a lesser document order than the document - * element, and a leading #xA is rendered before the opening PI - * symbol of PI children of the root node with a greater document - * order than the document element. - */ - if (visible) { - if (ctx->pos == XMLC14N_AFTER_DOCUMENT_ELEMENT) { - xmlOutputBufferWriteString(ctx->buf, "\x0A<?"); - } else { - xmlOutputBufferWriteString(ctx->buf, "<?"); - } - - xmlOutputBufferWriteString(ctx->buf, - (const char *) cur->name); - if ((cur->content != NULL) && (*(cur->content) != '\0')) { - xmlChar *buffer; - - xmlOutputBufferWriteString(ctx->buf, " "); - - /* todo: do we need to normalize pi? */ - buffer = xmlC11NNormalizePI(cur->content); - if (buffer != NULL) { - xmlOutputBufferWriteString(ctx->buf, - (const char *) buffer); - xmlFree(buffer); - } else { - xmlC14NErrInternal("normalizing pi node"); - return (-1); - } - } - - if (ctx->pos == XMLC14N_BEFORE_DOCUMENT_ELEMENT) { - xmlOutputBufferWriteString(ctx->buf, "?>\x0A"); - } else { - xmlOutputBufferWriteString(ctx->buf, "?>"); - } - } - break; - case XML_COMMENT_NODE: - /* - * Comment Nodes - * Nothing if generating canonical XML without comments. For - * canonical XML with comments, generate the opening comment - * symbol (<!--), the string value of the node, and the - * closing comment symbol (-->). Also, a trailing #xA is rendered - * after the closing comment symbol for comment children of the - * root node with a lesser document order than the document - * element, and a leading #xA is rendered before the opening - * comment symbol of comment children of the root node with a - * greater document order than the document element. (Comment - * children of the root node represent comments outside of the - * top-level document element and outside of the document type - * declaration). - */ - if (visible && ctx->with_comments) { - if (ctx->pos == XMLC14N_AFTER_DOCUMENT_ELEMENT) { - xmlOutputBufferWriteString(ctx->buf, "\x0A<!--"); - } else { - xmlOutputBufferWriteString(ctx->buf, "<!--"); - } - - if (cur->content != NULL) { - xmlChar *buffer; - - /* todo: do we need to normalize comment? */ - buffer = xmlC11NNormalizeComment(cur->content); - if (buffer != NULL) { - xmlOutputBufferWriteString(ctx->buf, - (const char *) buffer); - xmlFree(buffer); - } else { - xmlC14NErrInternal("normalizing comment node"); - return (-1); - } - } - - if (ctx->pos == XMLC14N_BEFORE_DOCUMENT_ELEMENT) { - xmlOutputBufferWriteString(ctx->buf, "-->\x0A"); - } else { - xmlOutputBufferWriteString(ctx->buf, "-->"); - } - } - break; - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_FRAG_NODE: /* should be processed as document? */ -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: /* should be processed as document? */ -#endif -#ifdef LIBXML_HTML_ENABLED - case XML_HTML_DOCUMENT_NODE: /* should be processed as document? */ -#endif - if (cur->children != NULL) { - ctx->pos = XMLC14N_BEFORE_DOCUMENT_ELEMENT; - ctx->parent_is_doc = 1; - ret = xmlC14NProcessNodeList(ctx, cur->children); - } - break; - - case XML_ATTRIBUTE_NODE: - xmlC14NErrInvalidNode("XML_ATTRIBUTE_NODE", "processing node"); - return (-1); - case XML_NAMESPACE_DECL: - xmlC14NErrInvalidNode("XML_NAMESPACE_DECL", "processing node"); - return (-1); - case XML_ENTITY_REF_NODE: - xmlC14NErrInvalidNode("XML_ENTITY_REF_NODE", "processing node"); - return (-1); - case XML_ENTITY_NODE: - xmlC14NErrInvalidNode("XML_ENTITY_NODE", "processing node"); - return (-1); - - case XML_DOCUMENT_TYPE_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: -#ifdef LIBXML_XINCLUDE_ENABLED - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: -#endif - /* - * should be ignored according to "W3C Canonical XML" - */ - break; - default: - xmlC14NErrUnknownNode(cur->type, "processing node"); - return (-1); - } - - return (ret); -} - -/** - * xmlC14NProcessNodeList: - * @ctx: the pointer to C14N context object - * @cur: the node to start from - * - * Processes all nodes in the row starting from cur. - * - * Returns non-negative value on success or negative value on fail - */ -static int -xmlC14NProcessNodeList(xmlC14NCtxPtr ctx, xmlNodePtr cur) -{ - int ret; - - if (ctx == NULL) { - xmlC14NErrParam("processing node list"); - return (-1); - } - - for (ret = 0; cur != NULL && ret >= 0; cur = cur->next) { - ret = xmlC14NProcessNode(ctx, cur); - } - return (ret); -} - - -/** - * xmlC14NFreeCtx: - * @ctx: the pointer to C14N context object - * - * Cleanups the C14N context object. - */ - -static void -xmlC14NFreeCtx(xmlC14NCtxPtr ctx) -{ - if (ctx == NULL) { - xmlC14NErrParam("freeing context"); - return; - } - - if (ctx->ns_rendered != NULL) { - xmlC14NVisibleNsStackDestroy(ctx->ns_rendered); - } - xmlFree(ctx); -} - -/** - * xmlC14NNewCtx: - * @doc: the XML document for canonization - * @is_visible_callback:the function to use to determine is node visible - * or not - * @user_data: the first parameter for @is_visible_callback function - * (in most cases, it is nodes set) - * @inclusive_ns_prefixe the list of inclusive namespace prefixes - * ended with a NULL or NULL if there is no - * inclusive namespaces (only for exclusive - * canonicalization) - * @with_comments: include comments in the result (!=0) or not (==0) - * @buf: the output buffer to store canonical XML; this - * buffer MUST have encoder==NULL because C14N requires - * UTF-8 output - * - * Creates new C14N context object to store C14N parameters. - * - * Returns pointer to newly created object (success) or NULL (fail) - */ -static xmlC14NCtxPtr -xmlC14NNewCtx(xmlDocPtr doc, - xmlC14NIsVisibleCallback is_visible_callback, void* user_data, - int exclusive, xmlChar ** inclusive_ns_prefixes, - int with_comments, xmlOutputBufferPtr buf) -{ - xmlC14NCtxPtr ctx = NULL; - - if ((doc == NULL) || (buf == NULL)) { - xmlC14NErrParam("creating new context"); - return (NULL); - } - - /* - * Validate the encoding output buffer encoding - */ - if (buf->encoder != NULL) { - xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, -"xmlC14NNewCtx: output buffer encoder != NULL but C14N requires UTF8 output\n"); - return (NULL); - } - - /* - * Validate the XML document encoding value, if provided. - */ - if (doc->charset != XML_CHAR_ENCODING_UTF8) { - xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, - "xmlC14NNewCtx: source document not in UTF8\n"); - return (NULL); - } - - /* - * Allocate a new xmlC14NCtxPtr and fill the fields. - */ - ctx = (xmlC14NCtxPtr) xmlMalloc(sizeof(xmlC14NCtx)); - if (ctx == NULL) { - xmlC14NErrMemory("creating context"); - return (NULL); - } - memset(ctx, 0, sizeof(xmlC14NCtx)); - - /* - * initialize C14N context - */ - ctx->doc = doc; - ctx->with_comments = with_comments; - ctx->is_visible_callback = is_visible_callback; - ctx->user_data = user_data; - ctx->buf = buf; - ctx->parent_is_doc = 1; - ctx->pos = XMLC14N_BEFORE_DOCUMENT_ELEMENT; - ctx->ns_rendered = xmlC14NVisibleNsStackCreate(); - - if(ctx->ns_rendered == NULL) { - xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_CREATE_STACK, - "xmlC14NNewCtx: xmlC14NVisibleNsStackCreate failed\n"); - xmlC14NFreeCtx(ctx); - return (NULL); - } - - /* - * Set "exclusive" flag, create a nodes set for namespaces - * stack and remember list of incluseve prefixes - */ - if (exclusive) { - ctx->exclusive = 1; - ctx->inclusive_ns_prefixes = inclusive_ns_prefixes; - } - return (ctx); -} - -/** - * xmlC14NExecute: - * @doc: the XML document for canonization - * @is_visible_callback:the function to use to determine is node visible - * or not - * @user_data: the first parameter for @is_visible_callback function - * (in most cases, it is nodes set) - * @exclusive: the exclusive flag (0 - non-exclusive canonicalization; - * otherwise - exclusive canonicalization) - * @inclusive_ns_prefixes: the list of inclusive namespace prefixes - * ended with a NULL or NULL if there is no - * inclusive namespaces (only for exclusive - * canonicalization, ignored otherwise) - * @with_comments: include comments in the result (!=0) or not (==0) - * @buf: the output buffer to store canonical XML; this - * buffer MUST have encoder==NULL because C14N requires - * UTF-8 output - * - * Dumps the canonized image of given XML document into the provided buffer. - * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or - * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) - * - * Returns non-negative value on success or a negative value on fail - */ -int -xmlC14NExecute(xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback, - void* user_data, int exclusive, xmlChar **inclusive_ns_prefixes, - int with_comments, xmlOutputBufferPtr buf) { - - xmlC14NCtxPtr ctx; - int ret; - - if ((buf == NULL) || (doc == NULL)) { - xmlC14NErrParam("executing c14n"); - return (-1); - } - - /* - * Validate the encoding output buffer encoding - */ - if (buf->encoder != NULL) { - xmlC14NErr(NULL, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, -"xmlC14NExecute: output buffer encoder != NULL but C14N requires UTF8 output\n"); - return (-1); - } - - ctx = xmlC14NNewCtx(doc, is_visible_callback, user_data, - exclusive, inclusive_ns_prefixes, - with_comments, buf); - if (ctx == NULL) { - xmlC14NErr(NULL, (xmlNodePtr) doc, XML_C14N_CREATE_CTXT, - "xmlC14NExecute: unable to create C14N context\n"); - return (-1); - } - - - - /* - * Root Node - * The root node is the parent of the top-level document element. The - * result of processing each of its child nodes that is in the node-set - * in document order. The root node does not generate a byte order mark, - * XML declaration, nor anything from within the document type - * declaration. - */ - if (doc->children != NULL) { - ret = xmlC14NProcessNodeList(ctx, doc->children); - if (ret < 0) { - xmlC14NErrInternal("processing docs children list"); - xmlC14NFreeCtx(ctx); - return (-1); - } - } - - /* - * Flush buffer to get number of bytes written - */ - ret = xmlOutputBufferFlush(buf); - if (ret < 0) { - xmlC14NErrInternal("flushing output buffer"); - xmlC14NFreeCtx(ctx); - return (-1); - } - - /* - * Cleanup - */ - xmlC14NFreeCtx(ctx); - return (ret); -} - -/** - * xmlC14NDocSaveTo: - * @doc: the XML document for canonization - * @nodes: the nodes set to be included in the canonized image - * or NULL if all document nodes should be included - * @exclusive: the exclusive flag (0 - non-exclusive canonicalization; - * otherwise - exclusive canonicalization) - * @inclusive_ns_prefixes: the list of inclusive namespace prefixes - * ended with a NULL or NULL if there is no - * inclusive namespaces (only for exclusive - * canonicalization, ignored otherwise) - * @with_comments: include comments in the result (!=0) or not (==0) - * @buf: the output buffer to store canonical XML; this - * buffer MUST have encoder==NULL because C14N requires - * UTF-8 output - * - * Dumps the canonized image of given XML document into the provided buffer. - * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or - * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) - * - * Returns non-negative value on success or a negative value on fail - */ -int -xmlC14NDocSaveTo(xmlDocPtr doc, xmlNodeSetPtr nodes, - int exclusive, xmlChar ** inclusive_ns_prefixes, - int with_comments, xmlOutputBufferPtr buf) { - return(xmlC14NExecute(doc, - (xmlC14NIsVisibleCallback)xmlC14NIsNodeInNodeset, - nodes, - exclusive, - inclusive_ns_prefixes, - with_comments, - buf)); -} - - -/** - * xmlC14NDocDumpMemory: - * @doc: the XML document for canonization - * @nodes: the nodes set to be included in the canonized image - * or NULL if all document nodes should be included - * @exclusive: the exclusive flag (0 - non-exclusive canonicalization; - * otherwise - exclusive canonicalization) - * @inclusive_ns_prefixes: the list of inclusive namespace prefixes - * ended with a NULL or NULL if there is no - * inclusive namespaces (only for exclusive - * canonicalization, ignored otherwise) - * @with_comments: include comments in the result (!=0) or not (==0) - * @doc_txt_ptr: the memory pointer for allocated canonical XML text; - * the caller of this functions is responsible for calling - * xmlFree() to free allocated memory - * - * Dumps the canonized image of given XML document into memory. - * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or - * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) - * - * Returns the number of bytes written on success or a negative value on fail - */ -int -xmlC14NDocDumpMemory(xmlDocPtr doc, xmlNodeSetPtr nodes, - int exclusive, xmlChar ** inclusive_ns_prefixes, - int with_comments, xmlChar ** doc_txt_ptr) -{ - int ret; - xmlOutputBufferPtr buf; - - if (doc_txt_ptr == NULL) { - xmlC14NErrParam("dumping doc to memory"); - return (-1); - } - - *doc_txt_ptr = NULL; - - /* - * create memory buffer with UTF8 (default) encoding - */ - buf = xmlAllocOutputBuffer(NULL); - if (buf == NULL) { - xmlC14NErrMemory("creating output buffer"); - return (-1); - } - - /* - * canonize document and write to buffer - */ - ret = xmlC14NDocSaveTo(doc, nodes, exclusive, inclusive_ns_prefixes, - with_comments, buf); - if (ret < 0) { - xmlC14NErrInternal("saving doc to output buffer"); - (void) xmlOutputBufferClose(buf); - return (-1); - } - - ret = buf->buffer->use; - if (ret > 0) { - *doc_txt_ptr = xmlStrndup(buf->buffer->content, ret); - } - (void) xmlOutputBufferClose(buf); - - if ((*doc_txt_ptr == NULL) && (ret > 0)) { - xmlC14NErrMemory("coping canonicanized document"); - return (-1); - } - return (ret); -} - -/** - * xmlC14NDocSave: - * @doc: the XML document for canonization - * @nodes: the nodes set to be included in the canonized image - * or NULL if all document nodes should be included - * @exclusive: the exclusive flag (0 - non-exclusive canonicalization; - * otherwise - exclusive canonicalization) - * @inclusive_ns_prefixes: the list of inclusive namespace prefixes - * ended with a NULL or NULL if there is no - * inclusive namespaces (only for exclusive - * canonicalization, ignored otherwise) - * @with_comments: include comments in the result (!=0) or not (==0) - * @filename: the filename to store canonical XML image - * @compression: the compression level (zlib requred): - * -1 - libxml default, - * 0 - uncompressed, - * >0 - compression level - * - * Dumps the canonized image of given XML document into the file. - * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or - * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) - * - * Returns the number of bytes written success or a negative value on fail - */ -int -xmlC14NDocSave(xmlDocPtr doc, xmlNodeSetPtr nodes, - int exclusive, xmlChar ** inclusive_ns_prefixes, - int with_comments, const char *filename, int compression) -{ - xmlOutputBufferPtr buf; - int ret; - - if (filename == NULL) { - xmlC14NErrParam("saving doc"); - return (-1); - } -#ifdef HAVE_ZLIB_H - if (compression < 0) - compression = xmlGetCompressMode(); -#endif - - /* - * save the content to a temp buffer, use default UTF8 encoding. - */ - buf = xmlOutputBufferCreateFilename(filename, NULL, compression); - if (buf == NULL) { - xmlC14NErrInternal("creating temporary filename"); - return (-1); - } - - /* - * canonize document and write to buffer - */ - ret = xmlC14NDocSaveTo(doc, nodes, exclusive, inclusive_ns_prefixes, - with_comments, buf); - if (ret < 0) { - xmlC14NErrInternal("cannicanize document to buffer"); - (void) xmlOutputBufferClose(buf); - return (-1); - } - - /* - * get the numbers of bytes written - */ - ret = xmlOutputBufferClose(buf); - return (ret); -} - - - -/* - * Macro used to grow the current buffer. - */ -#define growBufferReentrant() { \ - buffer_size *= 2; \ - buffer = (xmlChar *) \ - xmlRealloc(buffer, buffer_size * sizeof(xmlChar)); \ - if (buffer == NULL) { \ - xmlC14NErrMemory("growing buffer"); \ - return(NULL); \ - } \ -} - -/** - * xmlC11NNormalizeString: - * @input: the input string - * @mode: the normalization mode (attribute, comment, PI or text) - * - * Converts a string to a canonical (normalized) format. The code is stolen - * from xmlEncodeEntitiesReentrant(). Added normalization of \x09, \x0a, \x0A - * and the @mode parameter - * - * Returns a normalized string (caller is responsible for calling xmlFree()) - * or NULL if an error occurs - */ -static xmlChar * -xmlC11NNormalizeString(const xmlChar * input, - xmlC14NNormalizationMode mode) -{ - const xmlChar *cur = input; - xmlChar *buffer = NULL; - xmlChar *out = NULL; - int buffer_size = 0; - - if (input == NULL) - return (NULL); - - /* - * allocate an translation buffer. - */ - buffer_size = 1000; - buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); - if (buffer == NULL) { - xmlC14NErrMemory("allocating buffer"); - return (NULL); - } - out = buffer; - - while (*cur != '\0') { - if ((out - buffer) > (buffer_size - 10)) { - int indx = out - buffer; - - growBufferReentrant(); - out = &buffer[indx]; - } - - if ((*cur == '<') && ((mode == XMLC14N_NORMALIZE_ATTR) || - (mode == XMLC14N_NORMALIZE_TEXT))) { - *out++ = '&'; - *out++ = 'l'; - *out++ = 't'; - *out++ = ';'; - } else if ((*cur == '>') && (mode == XMLC14N_NORMALIZE_TEXT)) { - *out++ = '&'; - *out++ = 'g'; - *out++ = 't'; - *out++ = ';'; - } else if ((*cur == '&') && ((mode == XMLC14N_NORMALIZE_ATTR) || - (mode == XMLC14N_NORMALIZE_TEXT))) { - *out++ = '&'; - *out++ = 'a'; - *out++ = 'm'; - *out++ = 'p'; - *out++ = ';'; - } else if ((*cur == '"') && (mode == XMLC14N_NORMALIZE_ATTR)) { - *out++ = '&'; - *out++ = 'q'; - *out++ = 'u'; - *out++ = 'o'; - *out++ = 't'; - *out++ = ';'; - } else if ((*cur == '\x09') && (mode == XMLC14N_NORMALIZE_ATTR)) { - *out++ = '&'; - *out++ = '#'; - *out++ = 'x'; - *out++ = '9'; - *out++ = ';'; - } else if ((*cur == '\x0A') && (mode == XMLC14N_NORMALIZE_ATTR)) { - *out++ = '&'; - *out++ = '#'; - *out++ = 'x'; - *out++ = 'A'; - *out++ = ';'; - } else if ((*cur == '\x0D') && ((mode == XMLC14N_NORMALIZE_ATTR) || - (mode == XMLC14N_NORMALIZE_TEXT) || - (mode == XMLC14N_NORMALIZE_COMMENT) || - (mode == XMLC14N_NORMALIZE_PI))) { - *out++ = '&'; - *out++ = '#'; - *out++ = 'x'; - *out++ = 'D'; - *out++ = ';'; - } else { - /* - * Works because on UTF-8, all extended sequences cannot - * result in bytes in the ASCII range. - */ - *out++ = *cur; - } - cur++; - } - *out++ = 0; - return (buffer); -} -#endif /* LIBXML_OUTPUT_ENABLED */ -#define bottom_c14n -#include "elfgcchack.h" -#endif /* LIBXML_C14N_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/catalog.c b/ThirdParty/libxml2/vtklibxml2/catalog.c deleted file mode 100644 index 44b711ed057..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/catalog.c +++ /dev/null @@ -1,3788 +0,0 @@ -/** - * catalog.c: set of generic Catalog related routines - * - * Reference: SGML Open Technical Resolution TR9401:1997. - * http://www.jclark.com/sp/catalog.htm - * - * XML Catalogs Working Draft 06 August 2001 - * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html - * - * See Copyright for the status of this software. - * - * Daniel.Veillard@imag.fr - */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_CATALOG_ENABLED -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/hash.h> -#include <libxml/uri.h> -#include <libxml/parserInternals.h> -#include <libxml/catalog.h> -#include <libxml/xmlerror.h> -#include <libxml/threads.h> -#include <libxml/globals.h> - -#define MAX_DELEGATE 50 -#define MAX_CATAL_DEPTH 50 - -/** - * TODO: - * - * macro to flag unimplemented blocks - * XML_CATALOG_PREFER user env to select between system/public prefered - * option. C.f. Richard Tobin <richard@cogsci.ed.ac.uk> - *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with - *> values "system" and "public". I have made the default be "system" to - *> match yours. - */ -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -#define XML_URN_PUBID "urn:publicid:" -#define XML_CATAL_BREAK ((xmlChar *) -1) -#ifndef XML_XML_DEFAULT_CATALOG -#define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog" -#endif -#ifndef XML_SGML_DEFAULT_CATALOG -#define XML_SGML_DEFAULT_CATALOG "file:///etc/sgml/catalog" -#endif - -#if defined(_WIN32) && defined(_MSC_VER) -#undef XML_XML_DEFAULT_CATALOG -static char XML_XML_DEFAULT_CATALOG[256] = "file:///etc/xml/catalog"; -void* __stdcall GetModuleHandleA(const char*); -unsigned long __stdcall GetModuleFileNameA(void*, char*, unsigned long); -#endif - -static xmlChar *xmlCatalogNormalizePublic(const xmlChar *pubID); -static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename); - -/************************************************************************ - * * - * Types, all private * - * * - ************************************************************************/ - -typedef enum { - XML_CATA_REMOVED = -1, - XML_CATA_NONE = 0, - XML_CATA_CATALOG, - XML_CATA_BROKEN_CATALOG, - XML_CATA_NEXT_CATALOG, - XML_CATA_GROUP, - XML_CATA_PUBLIC, - XML_CATA_SYSTEM, - XML_CATA_REWRITE_SYSTEM, - XML_CATA_DELEGATE_PUBLIC, - XML_CATA_DELEGATE_SYSTEM, - XML_CATA_URI, - XML_CATA_REWRITE_URI, - XML_CATA_DELEGATE_URI, - SGML_CATA_SYSTEM, - SGML_CATA_PUBLIC, - SGML_CATA_ENTITY, - SGML_CATA_PENTITY, - SGML_CATA_DOCTYPE, - SGML_CATA_LINKTYPE, - SGML_CATA_NOTATION, - SGML_CATA_DELEGATE, - SGML_CATA_BASE, - SGML_CATA_CATALOG, - SGML_CATA_DOCUMENT, - SGML_CATA_SGMLDECL -} xmlCatalogEntryType; - -typedef struct _xmlCatalogEntry xmlCatalogEntry; -typedef xmlCatalogEntry *xmlCatalogEntryPtr; -struct _xmlCatalogEntry { - struct _xmlCatalogEntry *next; - struct _xmlCatalogEntry *parent; - struct _xmlCatalogEntry *children; - xmlCatalogEntryType type; - xmlChar *name; - xmlChar *value; - xmlChar *URL; /* The expanded URL using the base */ - xmlCatalogPrefer prefer; - int dealloc; - int depth; - struct _xmlCatalogEntry *group; -}; - -typedef enum { - XML_XML_CATALOG_TYPE = 1, - XML_SGML_CATALOG_TYPE -} xmlCatalogType; - -#define XML_MAX_SGML_CATA_DEPTH 10 -struct _xmlCatalog { - xmlCatalogType type; /* either XML or SGML */ - - /* - * SGML Catalogs are stored as a simple hash table of catalog entries - * Catalog stack to check against overflows when building the - * SGML catalog - */ - char *catalTab[XML_MAX_SGML_CATA_DEPTH]; /* stack of catals */ - int catalNr; /* Number of current catal streams */ - int catalMax; /* Max number of catal streams */ - xmlHashTablePtr sgml; - - /* - * XML Catalogs are stored as a tree of Catalog entries - */ - xmlCatalogPrefer prefer; - xmlCatalogEntryPtr xml; -}; - -/************************************************************************ - * * - * Global variables * - * * - ************************************************************************/ - -/* - * Those are preferences - */ -static int xmlDebugCatalogs = 0; /* used for debugging */ -static xmlCatalogAllow xmlCatalogDefaultAllow = XML_CATA_ALLOW_ALL; -static xmlCatalogPrefer xmlCatalogDefaultPrefer = XML_CATA_PREFER_PUBLIC; - -/* - * Hash table containing all the trees of XML catalogs parsed by - * the application. - */ -static xmlHashTablePtr xmlCatalogXMLFiles = NULL; - -/* - * The default catalog in use by the application - */ -static xmlCatalogPtr xmlDefaultCatalog = NULL; - -/* - * A mutex for modifying the shared global catalog(s) - * xmlDefaultCatalog tree. - * It also protects xmlCatalogXMLFiles - * The core of this readers/writer scheme is in xmlFetchXMLCatalogFile() - */ -static xmlRMutexPtr xmlCatalogMutex = NULL; - -/* - * Whether the catalog support was initialized. - */ -static int xmlCatalogInitialized = 0; - -/************************************************************************ - * * - * Catalog error handlers * - * * - ************************************************************************/ - -/** - * xmlCatalogErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlCatalogErrMemory(const char *extra) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_CATALOG, - XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, - extra, NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); -} - -/** - * xmlCatalogErr: - * @catal: the Catalog entry - * @node: the context node - * @msg: the error message - * @extra: extra informations - * - * Handle a catalog error - */ -static void -xmlCatalogErr(xmlCatalogEntryPtr catal, xmlNodePtr node, int error, - const char *msg, const xmlChar *str1, const xmlChar *str2, - const xmlChar *str3) -{ - __xmlRaiseError(NULL, NULL, NULL, catal, node, XML_FROM_CATALOG, - error, XML_ERR_ERROR, NULL, 0, - (const char *) str1, (const char *) str2, - (const char *) str3, 0, 0, - msg, str1, str2, str3); -} - - -/************************************************************************ - * * - * Allocation and Freeing * - * * - ************************************************************************/ - -/** - * xmlNewCatalogEntry: - * @type: type of entry - * @name: name of the entry - * @value: value of the entry - * @prefer: the PUBLIC vs. SYSTEM current preference value - * @group: for members of a group, the group entry - * - * create a new Catalog entry, this type is shared both by XML and - * SGML catalogs, but the acceptable types values differs. - * - * Returns the xmlCatalogEntryPtr or NULL in case of error - */ -static xmlCatalogEntryPtr -xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name, - const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer, - xmlCatalogEntryPtr group) { - xmlCatalogEntryPtr ret; - xmlChar *normid = NULL; - - ret = (xmlCatalogEntryPtr) xmlMalloc(sizeof(xmlCatalogEntry)); - if (ret == NULL) { - xmlCatalogErrMemory("allocating catalog entry"); - return(NULL); - } - ret->next = NULL; - ret->parent = NULL; - ret->children = NULL; - ret->type = type; - if (type == XML_CATA_PUBLIC || type == XML_CATA_DELEGATE_PUBLIC) { - normid = xmlCatalogNormalizePublic(name); - if (normid != NULL) - name = (*normid != 0 ? normid : NULL); - } - if (name != NULL) - ret->name = xmlStrdup(name); - else - ret->name = NULL; - if (normid != NULL) - xmlFree(normid); - if (value != NULL) - ret->value = xmlStrdup(value); - else - ret->value = NULL; - if (URL == NULL) - URL = value; - if (URL != NULL) - ret->URL = xmlStrdup(URL); - else - ret->URL = NULL; - ret->prefer = prefer; - ret->dealloc = 0; - ret->depth = 0; - ret->group = group; - return(ret); -} - -static void -xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret); - -/** - * xmlFreeCatalogEntry: - * @ret: a Catalog entry - * - * Free the memory allocated to a Catalog entry - */ -static void -xmlFreeCatalogEntry(xmlCatalogEntryPtr ret) { - if (ret == NULL) - return; - /* - * Entries stored in the file hash must be deallocated - * only by the file hash cleaner ! - */ - if (ret->dealloc == 1) - return; - - if (xmlDebugCatalogs) { - if (ret->name != NULL) - xmlGenericError(xmlGenericErrorContext, - "Free catalog entry %s\n", ret->name); - else if (ret->value != NULL) - xmlGenericError(xmlGenericErrorContext, - "Free catalog entry %s\n", ret->value); - else - xmlGenericError(xmlGenericErrorContext, - "Free catalog entry\n"); - } - - if (ret->name != NULL) - xmlFree(ret->name); - if (ret->value != NULL) - xmlFree(ret->value); - if (ret->URL != NULL) - xmlFree(ret->URL); - xmlFree(ret); -} - -/** - * xmlFreeCatalogEntryList: - * @ret: a Catalog entry list - * - * Free the memory allocated to a full chained list of Catalog entries - */ -static void -xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret) { - xmlCatalogEntryPtr next; - - while (ret != NULL) { - next = ret->next; - xmlFreeCatalogEntry(ret); - ret = next; - } -} - -/** - * xmlFreeCatalogHashEntryList: - * @ret: a Catalog entry list - * - * Free the memory allocated to list of Catalog entries from the - * catalog file hash. - */ -static void -xmlFreeCatalogHashEntryList(xmlCatalogEntryPtr catal) { - xmlCatalogEntryPtr children, next; - - if (catal == NULL) - return; - - children = catal->children; - while (children != NULL) { - next = children->next; - children->dealloc = 0; - children->children = NULL; - xmlFreeCatalogEntry(children); - children = next; - } - catal->dealloc = 0; - xmlFreeCatalogEntry(catal); -} - -/** - * xmlCreateNewCatalog: - * @type: type of catalog - * @prefer: the PUBLIC vs. SYSTEM current preference value - * - * create a new Catalog, this type is shared both by XML and - * SGML catalogs, but the acceptable types values differs. - * - * Returns the xmlCatalogPtr or NULL in case of error - */ -static xmlCatalogPtr -xmlCreateNewCatalog(xmlCatalogType type, xmlCatalogPrefer prefer) { - xmlCatalogPtr ret; - - ret = (xmlCatalogPtr) xmlMalloc(sizeof(xmlCatalog)); - if (ret == NULL) { - xmlCatalogErrMemory("allocating catalog"); - return(NULL); - } - memset(ret, 0, sizeof(xmlCatalog)); - ret->type = type; - ret->catalNr = 0; - ret->catalMax = XML_MAX_SGML_CATA_DEPTH; - ret->prefer = prefer; - if (ret->type == XML_SGML_CATALOG_TYPE) - ret->sgml = xmlHashCreate(10); - return(ret); -} - -/** - * xmlFreeCatalog: - * @catal: a Catalog - * - * Free the memory allocated to a Catalog - */ -void -xmlFreeCatalog(xmlCatalogPtr catal) { - if (catal == NULL) - return; - if (catal->xml != NULL) - xmlFreeCatalogEntryList(catal->xml); - if (catal->sgml != NULL) - xmlHashFree(catal->sgml, - (xmlHashDeallocator) xmlFreeCatalogEntry); - xmlFree(catal); -} - -/************************************************************************ - * * - * Serializing Catalogs * - * * - ************************************************************************/ - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlCatalogDumpEntry: - * @entry: the catalog entry - * @out: the file. - * - * Serialize an SGML Catalog entry - */ -static void -xmlCatalogDumpEntry(xmlCatalogEntryPtr entry, FILE *out) { - if ((entry == NULL) || (out == NULL)) - return; - switch (entry->type) { - case SGML_CATA_ENTITY: - fprintf(out, "ENTITY "); break; - case SGML_CATA_PENTITY: - fprintf(out, "ENTITY %%"); break; - case SGML_CATA_DOCTYPE: - fprintf(out, "DOCTYPE "); break; - case SGML_CATA_LINKTYPE: - fprintf(out, "LINKTYPE "); break; - case SGML_CATA_NOTATION: - fprintf(out, "NOTATION "); break; - case SGML_CATA_PUBLIC: - fprintf(out, "PUBLIC "); break; - case SGML_CATA_SYSTEM: - fprintf(out, "SYSTEM "); break; - case SGML_CATA_DELEGATE: - fprintf(out, "DELEGATE "); break; - case SGML_CATA_BASE: - fprintf(out, "BASE "); break; - case SGML_CATA_CATALOG: - fprintf(out, "CATALOG "); break; - case SGML_CATA_DOCUMENT: - fprintf(out, "DOCUMENT "); break; - case SGML_CATA_SGMLDECL: - fprintf(out, "SGMLDECL "); break; - default: - return; - } - switch (entry->type) { - case SGML_CATA_ENTITY: - case SGML_CATA_PENTITY: - case SGML_CATA_DOCTYPE: - case SGML_CATA_LINKTYPE: - case SGML_CATA_NOTATION: - fprintf(out, "%s", (const char *) entry->name); break; - case SGML_CATA_PUBLIC: - case SGML_CATA_SYSTEM: - case SGML_CATA_SGMLDECL: - case SGML_CATA_DOCUMENT: - case SGML_CATA_CATALOG: - case SGML_CATA_BASE: - case SGML_CATA_DELEGATE: - fprintf(out, "\"%s\"", entry->name); break; - default: - break; - } - switch (entry->type) { - case SGML_CATA_ENTITY: - case SGML_CATA_PENTITY: - case SGML_CATA_DOCTYPE: - case SGML_CATA_LINKTYPE: - case SGML_CATA_NOTATION: - case SGML_CATA_PUBLIC: - case SGML_CATA_SYSTEM: - case SGML_CATA_DELEGATE: - fprintf(out, " \"%s\"", entry->value); break; - default: - break; - } - fprintf(out, "\n"); -} - -/** - * xmlDumpXMLCatalogNode: - * @catal: top catalog entry - * @catalog: pointer to the xml tree - * @doc: the containing document - * @ns: the current namespace - * @cgroup: group node for group members - * - * Serializes a Catalog entry, called by xmlDumpXMLCatalog and recursively - * for group entries - */ -static void xmlDumpXMLCatalogNode(xmlCatalogEntryPtr catal, xmlNodePtr catalog, - xmlDocPtr doc, xmlNsPtr ns, xmlCatalogEntryPtr cgroup) { - xmlNodePtr node; - xmlCatalogEntryPtr cur; - /* - * add all the catalog entries - */ - cur = catal; - while (cur != NULL) { - if (cur->group == cgroup) { - switch (cur->type) { - case XML_CATA_REMOVED: - break; - case XML_CATA_BROKEN_CATALOG: - case XML_CATA_CATALOG: - if (cur == catal) { - cur = cur->children; - continue; - } - break; - case XML_CATA_NEXT_CATALOG: - node = xmlNewDocNode(doc, ns, BAD_CAST "nextCatalog", NULL); - xmlSetProp(node, BAD_CAST "catalog", cur->value); - xmlAddChild(catalog, node); - break; - case XML_CATA_NONE: - break; - case XML_CATA_GROUP: - node = xmlNewDocNode(doc, ns, BAD_CAST "group", NULL); - xmlSetProp(node, BAD_CAST "id", cur->name); - if (cur->value != NULL) { - xmlNsPtr xns; - xns = xmlSearchNsByHref(doc, node, XML_XML_NAMESPACE); - if (xns != NULL) - xmlSetNsProp(node, xns, BAD_CAST "base", - cur->value); - } - switch (cur->prefer) { - case XML_CATA_PREFER_NONE: - break; - case XML_CATA_PREFER_PUBLIC: - xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "public"); - break; - case XML_CATA_PREFER_SYSTEM: - xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "system"); - break; - } - xmlDumpXMLCatalogNode(cur->next, node, doc, ns, cur); - xmlAddChild(catalog, node); - break; - case XML_CATA_PUBLIC: - node = xmlNewDocNode(doc, ns, BAD_CAST "public", NULL); - xmlSetProp(node, BAD_CAST "publicId", cur->name); - xmlSetProp(node, BAD_CAST "uri", cur->value); - xmlAddChild(catalog, node); - break; - case XML_CATA_SYSTEM: - node = xmlNewDocNode(doc, ns, BAD_CAST "system", NULL); - xmlSetProp(node, BAD_CAST "systemId", cur->name); - xmlSetProp(node, BAD_CAST "uri", cur->value); - xmlAddChild(catalog, node); - break; - case XML_CATA_REWRITE_SYSTEM: - node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteSystem", NULL); - xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name); - xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value); - xmlAddChild(catalog, node); - break; - case XML_CATA_DELEGATE_PUBLIC: - node = xmlNewDocNode(doc, ns, BAD_CAST "delegatePublic", NULL); - xmlSetProp(node, BAD_CAST "publicIdStartString", cur->name); - xmlSetProp(node, BAD_CAST "catalog", cur->value); - xmlAddChild(catalog, node); - break; - case XML_CATA_DELEGATE_SYSTEM: - node = xmlNewDocNode(doc, ns, BAD_CAST "delegateSystem", NULL); - xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name); - xmlSetProp(node, BAD_CAST "catalog", cur->value); - xmlAddChild(catalog, node); - break; - case XML_CATA_URI: - node = xmlNewDocNode(doc, ns, BAD_CAST "uri", NULL); - xmlSetProp(node, BAD_CAST "name", cur->name); - xmlSetProp(node, BAD_CAST "uri", cur->value); - xmlAddChild(catalog, node); - break; - case XML_CATA_REWRITE_URI: - node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteURI", NULL); - xmlSetProp(node, BAD_CAST "uriStartString", cur->name); - xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value); - xmlAddChild(catalog, node); - break; - case XML_CATA_DELEGATE_URI: - node = xmlNewDocNode(doc, ns, BAD_CAST "delegateURI", NULL); - xmlSetProp(node, BAD_CAST "uriStartString", cur->name); - xmlSetProp(node, BAD_CAST "catalog", cur->value); - xmlAddChild(catalog, node); - break; - case SGML_CATA_SYSTEM: - case SGML_CATA_PUBLIC: - case SGML_CATA_ENTITY: - case SGML_CATA_PENTITY: - case SGML_CATA_DOCTYPE: - case SGML_CATA_LINKTYPE: - case SGML_CATA_NOTATION: - case SGML_CATA_DELEGATE: - case SGML_CATA_BASE: - case SGML_CATA_CATALOG: - case SGML_CATA_DOCUMENT: - case SGML_CATA_SGMLDECL: - break; - } - } - cur = cur->next; - } -} - -static int -xmlDumpXMLCatalog(FILE *out, xmlCatalogEntryPtr catal) { - int ret; - xmlDocPtr doc; - xmlNsPtr ns; - xmlDtdPtr dtd; - xmlNodePtr catalog; - xmlOutputBufferPtr buf; - - /* - * Rebuild a catalog - */ - doc = xmlNewDoc(NULL); - if (doc == NULL) - return(-1); - dtd = xmlNewDtd(doc, BAD_CAST "catalog", - BAD_CAST "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN", -BAD_CAST "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"); - - xmlAddChild((xmlNodePtr) doc, (xmlNodePtr) dtd); - - ns = xmlNewNs(NULL, XML_CATALOGS_NAMESPACE, NULL); - if (ns == NULL) { - xmlFreeDoc(doc); - return(-1); - } - catalog = xmlNewDocNode(doc, ns, BAD_CAST "catalog", NULL); - if (catalog == NULL) { - xmlFreeNs(ns); - xmlFreeDoc(doc); - return(-1); - } - catalog->nsDef = ns; - xmlAddChild((xmlNodePtr) doc, catalog); - - xmlDumpXMLCatalogNode(catal, catalog, doc, ns, NULL); - - /* - * reserialize it - */ - buf = xmlOutputBufferCreateFile(out, NULL); - if (buf == NULL) { - xmlFreeDoc(doc); - return(-1); - } - ret = xmlSaveFormatFileTo(buf, doc, NULL, 1); - - /* - * Free it - */ - xmlFreeDoc(doc); - - return(ret); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/************************************************************************ - * * - * Converting SGML Catalogs to XML * - * * - ************************************************************************/ - -/** - * xmlCatalogConvertEntry: - * @entry: the entry - * @catal: pointer to the catalog being converted - * - * Convert one entry from the catalog - */ -static void -xmlCatalogConvertEntry(xmlCatalogEntryPtr entry, xmlCatalogPtr catal) { - if ((entry == NULL) || (catal == NULL) || (catal->sgml == NULL) || - (catal->xml == NULL)) - return; - switch (entry->type) { - case SGML_CATA_ENTITY: - entry->type = XML_CATA_PUBLIC; - break; - case SGML_CATA_PENTITY: - entry->type = XML_CATA_PUBLIC; - break; - case SGML_CATA_DOCTYPE: - entry->type = XML_CATA_PUBLIC; - break; - case SGML_CATA_LINKTYPE: - entry->type = XML_CATA_PUBLIC; - break; - case SGML_CATA_NOTATION: - entry->type = XML_CATA_PUBLIC; - break; - case SGML_CATA_PUBLIC: - entry->type = XML_CATA_PUBLIC; - break; - case SGML_CATA_SYSTEM: - entry->type = XML_CATA_SYSTEM; - break; - case SGML_CATA_DELEGATE: - entry->type = XML_CATA_DELEGATE_PUBLIC; - break; - case SGML_CATA_CATALOG: - entry->type = XML_CATA_CATALOG; - break; - default: - xmlHashRemoveEntry(catal->sgml, entry->name, - (xmlHashDeallocator) xmlFreeCatalogEntry); - return; - } - /* - * Conversion successful, remove from the SGML catalog - * and add it to the default XML one - */ - xmlHashRemoveEntry(catal->sgml, entry->name, NULL); - entry->parent = catal->xml; - entry->next = NULL; - if (catal->xml->children == NULL) - catal->xml->children = entry; - else { - xmlCatalogEntryPtr prev; - - prev = catal->xml->children; - while (prev->next != NULL) - prev = prev->next; - prev->next = entry; - } -} - -/** - * xmlConvertSGMLCatalog: - * @catal: the catalog - * - * Convert all the SGML catalog entries as XML ones - * - * Returns the number of entries converted if successful, -1 otherwise - */ -int -xmlConvertSGMLCatalog(xmlCatalogPtr catal) { - - if ((catal == NULL) || (catal->type != XML_SGML_CATALOG_TYPE)) - return(-1); - - if (xmlDebugCatalogs) { - xmlGenericError(xmlGenericErrorContext, - "Converting SGML catalog to XML\n"); - } - xmlHashScan(catal->sgml, - (xmlHashScanner) xmlCatalogConvertEntry, - &catal); - return(0); -} - -/************************************************************************ - * * - * Helper function * - * * - ************************************************************************/ - -/** - * xmlCatalogUnWrapURN: - * @urn: an "urn:publicid:" to unwrap - * - * Expand the URN into the equivalent Public Identifier - * - * Returns the new identifier or NULL, the string must be deallocated - * by the caller. - */ -static xmlChar * -xmlCatalogUnWrapURN(const xmlChar *urn) { - xmlChar result[2000]; - unsigned int i = 0; - - if (xmlStrncmp(urn, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) - return(NULL); - urn += sizeof(XML_URN_PUBID) - 1; - - while (*urn != 0) { - if (i > sizeof(result) - 4) - break; - if (*urn == '+') { - result[i++] = ' '; - urn++; - } else if (*urn == ':') { - result[i++] = '/'; - result[i++] = '/'; - urn++; - } else if (*urn == ';') { - result[i++] = ':'; - result[i++] = ':'; - urn++; - } else if (*urn == '%') { - if ((urn[1] == '2') && (urn[2] == 'B')) - result[i++] = '+'; - else if ((urn[1] == '3') && (urn[2] == 'A')) - result[i++] = ':'; - else if ((urn[1] == '2') && (urn[2] == 'F')) - result[i++] = '/'; - else if ((urn[1] == '3') && (urn[2] == 'B')) - result[i++] = ';'; - else if ((urn[1] == '2') && (urn[2] == '7')) - result[i++] = '\''; - else if ((urn[1] == '3') && (urn[2] == 'F')) - result[i++] = '?'; - else if ((urn[1] == '2') && (urn[2] == '3')) - result[i++] = '#'; - else if ((urn[1] == '2') && (urn[2] == '5')) - result[i++] = '%'; - else { - result[i++] = *urn; - urn++; - continue; - } - urn += 3; - } else { - result[i++] = *urn; - urn++; - } - } - result[i] = 0; - - return(xmlStrdup(result)); -} - -/** - * xmlParseCatalogFile: - * @filename: the filename - * - * parse an XML file and build a tree. It's like xmlParseFile() - * except it bypass all catalog lookups. - * - * Returns the resulting document tree or NULL in case of error - */ - -xmlDocPtr -xmlParseCatalogFile(const char *filename) { - xmlDocPtr ret; - xmlParserCtxtPtr ctxt; - char *directory = NULL; - xmlParserInputPtr inputStream; - xmlParserInputBufferPtr buf; - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { -#ifdef LIBXML_SAX1_ENABLED - if (xmlDefaultSAXHandler.error != NULL) { - xmlDefaultSAXHandler.error(NULL, "out of memory\n"); - } -#endif - return(NULL); - } - - buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); - if (buf == NULL) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - inputStream = xmlNewInputStream(ctxt); - if (inputStream == NULL) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - inputStream->filename = (char *) xmlCanonicPath((const xmlChar *)filename); - inputStream->buf = buf; - inputStream->base = inputStream->buf->buffer->content; - inputStream->cur = inputStream->buf->buffer->content; - inputStream->end = - &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; - - inputPush(ctxt, inputStream); - if ((ctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory(filename); - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = directory; - ctxt->valid = 0; - ctxt->validate = 0; - ctxt->loadsubset = 0; - ctxt->pedantic = 0; - ctxt->dictNames = 1; - - xmlParseDocument(ctxt); - - if (ctxt->wellFormed) - ret = ctxt->myDoc; - else { - ret = NULL; - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - xmlFreeParserCtxt(ctxt); - - return(ret); -} - -/** - * xmlLoadFileContent: - * @filename: a file path - * - * Load a file content into memory. - * - * Returns a pointer to the 0 terminated string or NULL in case of error - */ -static xmlChar * -xmlLoadFileContent(const char *filename) -{ -#ifdef HAVE_STAT - int fd; -#else - FILE *fd; -#endif - int len; - long size; - -#ifdef HAVE_STAT - struct stat info; -#endif - xmlChar *content; - - if (filename == NULL) - return (NULL); - -#ifdef HAVE_STAT - if (stat(filename, &info) < 0) - return (NULL); -#endif - -#ifdef HAVE_STAT - if ((fd = open(filename, O_RDONLY)) < 0) -#else - if ((fd = fopen(filename, "rb")) == NULL) -#endif - { - return (NULL); - } -#ifdef HAVE_STAT - size = info.st_size; -#else - if (fseek(fd, 0, SEEK_END) || (size = ftell(fd)) == EOF || fseek(fd, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ - fclose(fd); - return (NULL); - } -#endif - content = xmlMallocAtomic(size + 10); - if (content == NULL) { - xmlCatalogErrMemory("allocating catalog data"); - return (NULL); - } -#ifdef HAVE_STAT - len = read(fd, content, size); -#else - len = fread(content, 1, size, fd); -#endif - if (len < 0) { - xmlFree(content); - return (NULL); - } -#ifdef HAVE_STAT - close(fd); -#else - fclose(fd); -#endif - content[len] = 0; - - return(content); -} - -/** - * xmlCatalogNormalizePublic: - * @pubID: the public ID string - * - * Normalizes the Public Identifier - * - * Implements 6.2. Public Identifier Normalization - * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html - * - * Returns the new string or NULL, the string must be deallocated - * by the caller. - */ -static xmlChar * -xmlCatalogNormalizePublic(const xmlChar *pubID) -{ - int ok = 1; - int white; - const xmlChar *p; - xmlChar *ret; - xmlChar *q; - - if (pubID == NULL) - return(NULL); - - white = 1; - for (p = pubID;*p != 0 && ok;p++) { - if (!xmlIsBlank_ch(*p)) - white = 0; - else if (*p == 0x20 && !white) - white = 1; - else - ok = 0; - } - if (ok && !white) /* is normalized */ - return(NULL); - - ret = xmlStrdup(pubID); - q = ret; - white = 0; - for (p = pubID;*p != 0;p++) { - if (xmlIsBlank_ch(*p)) { - if (q != ret) - white = 1; - } else { - if (white) { - *(q++) = 0x20; - white = 0; - } - *(q++) = *p; - } - } - *q = 0; - return(ret); -} - -/************************************************************************ - * * - * The XML Catalog parser * - * * - ************************************************************************/ - -static xmlCatalogEntryPtr -xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename); -static void -xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer, - xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup); -static xmlChar * -xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID, - const xmlChar *sysID); -static xmlChar * -xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI); - - -/** - * xmlGetXMLCatalogEntryType: - * @name: the name - * - * lookup the internal type associated to an XML catalog entry name - * - * Returns the type associated with that name - */ -static xmlCatalogEntryType -xmlGetXMLCatalogEntryType(const xmlChar *name) { - xmlCatalogEntryType type = XML_CATA_NONE; - if (xmlStrEqual(name, (const xmlChar *) "system")) - type = XML_CATA_SYSTEM; - else if (xmlStrEqual(name, (const xmlChar *) "public")) - type = XML_CATA_PUBLIC; - else if (xmlStrEqual(name, (const xmlChar *) "rewriteSystem")) - type = XML_CATA_REWRITE_SYSTEM; - else if (xmlStrEqual(name, (const xmlChar *) "delegatePublic")) - type = XML_CATA_DELEGATE_PUBLIC; - else if (xmlStrEqual(name, (const xmlChar *) "delegateSystem")) - type = XML_CATA_DELEGATE_SYSTEM; - else if (xmlStrEqual(name, (const xmlChar *) "uri")) - type = XML_CATA_URI; - else if (xmlStrEqual(name, (const xmlChar *) "rewriteURI")) - type = XML_CATA_REWRITE_URI; - else if (xmlStrEqual(name, (const xmlChar *) "delegateURI")) - type = XML_CATA_DELEGATE_URI; - else if (xmlStrEqual(name, (const xmlChar *) "nextCatalog")) - type = XML_CATA_NEXT_CATALOG; - else if (xmlStrEqual(name, (const xmlChar *) "catalog")) - type = XML_CATA_CATALOG; - return(type); -} - -/** - * xmlParseXMLCatalogOneNode: - * @cur: the XML node - * @type: the type of Catalog entry - * @name: the name of the node - * @attrName: the attribute holding the value - * @uriAttrName: the attribute holding the URI-Reference - * @prefer: the PUBLIC vs. SYSTEM current preference value - * @cgroup: the group which includes this node - * - * Finishes the examination of an XML tree node of a catalog and build - * a Catalog entry from it. - * - * Returns the new Catalog entry node or NULL in case of error. - */ -static xmlCatalogEntryPtr -xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type, - const xmlChar *name, const xmlChar *attrName, - const xmlChar *uriAttrName, xmlCatalogPrefer prefer, - xmlCatalogEntryPtr cgroup) { - int ok = 1; - xmlChar *uriValue; - xmlChar *nameValue = NULL; - xmlChar *base = NULL; - xmlChar *URL = NULL; - xmlCatalogEntryPtr ret = NULL; - - if (attrName != NULL) { - nameValue = xmlGetProp(cur, attrName); - if (nameValue == NULL) { - xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR, - "%s entry lacks '%s'\n", name, attrName, NULL); - ok = 0; - } - } - uriValue = xmlGetProp(cur, uriAttrName); - if (uriValue == NULL) { - xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR, - "%s entry lacks '%s'\n", name, uriAttrName, NULL); - ok = 0; - } - if (!ok) { - if (nameValue != NULL) - xmlFree(nameValue); - if (uriValue != NULL) - xmlFree(uriValue); - return(NULL); - } - - base = xmlNodeGetBase(cur->doc, cur); - URL = xmlBuildURI(uriValue, base); - if (URL != NULL) { - if (xmlDebugCatalogs > 1) { - if (nameValue != NULL) - xmlGenericError(xmlGenericErrorContext, - "Found %s: '%s' '%s'\n", name, nameValue, URL); - else - xmlGenericError(xmlGenericErrorContext, - "Found %s: '%s'\n", name, URL); - } - ret = xmlNewCatalogEntry(type, nameValue, uriValue, URL, prefer, cgroup); - } else { - xmlCatalogErr(ret, cur, XML_CATALOG_ENTRY_BROKEN, - "%s entry '%s' broken ?: %s\n", name, uriAttrName, uriValue); - } - if (nameValue != NULL) - xmlFree(nameValue); - if (uriValue != NULL) - xmlFree(uriValue); - if (base != NULL) - xmlFree(base); - if (URL != NULL) - xmlFree(URL); - return(ret); -} - -/** - * xmlParseXMLCatalogNode: - * @cur: the XML node - * @prefer: the PUBLIC vs. SYSTEM current preference value - * @parent: the parent Catalog entry - * @cgroup: the group which includes this node - * - * Examines an XML tree node of a catalog and build - * a Catalog entry from it adding it to its parent. The examination can - * be recursive. - */ -static void -xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer, - xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup) -{ - xmlChar *base = NULL; - xmlCatalogEntryPtr entry = NULL; - - if (cur == NULL) - return; - if (xmlStrEqual(cur->name, BAD_CAST "group")) { - xmlChar *prop; - xmlCatalogPrefer pref = XML_CATA_PREFER_NONE; - - prop = xmlGetProp(cur, BAD_CAST "prefer"); - if (prop != NULL) { - if (xmlStrEqual(prop, BAD_CAST "system")) { - prefer = XML_CATA_PREFER_SYSTEM; - } else if (xmlStrEqual(prop, BAD_CAST "public")) { - prefer = XML_CATA_PREFER_PUBLIC; - } else { - xmlCatalogErr(parent, cur, XML_CATALOG_PREFER_VALUE, - "Invalid value for prefer: '%s'\n", - prop, NULL, NULL); - } - xmlFree(prop); - pref = prefer; - } - prop = xmlGetProp(cur, BAD_CAST "id"); - base = xmlGetNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE); - entry = xmlNewCatalogEntry(XML_CATA_GROUP, prop, base, NULL, pref, cgroup); - xmlFree(prop); - } else if (xmlStrEqual(cur->name, BAD_CAST "public")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_PUBLIC, - BAD_CAST "public", BAD_CAST "publicId", BAD_CAST "uri", prefer, cgroup); - } else if (xmlStrEqual(cur->name, BAD_CAST "system")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_SYSTEM, - BAD_CAST "system", BAD_CAST "systemId", BAD_CAST "uri", prefer, cgroup); - } else if (xmlStrEqual(cur->name, BAD_CAST "rewriteSystem")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_SYSTEM, - BAD_CAST "rewriteSystem", BAD_CAST "systemIdStartString", - BAD_CAST "rewritePrefix", prefer, cgroup); - } else if (xmlStrEqual(cur->name, BAD_CAST "delegatePublic")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_PUBLIC, - BAD_CAST "delegatePublic", BAD_CAST "publicIdStartString", - BAD_CAST "catalog", prefer, cgroup); - } else if (xmlStrEqual(cur->name, BAD_CAST "delegateSystem")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_SYSTEM, - BAD_CAST "delegateSystem", BAD_CAST "systemIdStartString", - BAD_CAST "catalog", prefer, cgroup); - } else if (xmlStrEqual(cur->name, BAD_CAST "uri")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_URI, - BAD_CAST "uri", BAD_CAST "name", - BAD_CAST "uri", prefer, cgroup); - } else if (xmlStrEqual(cur->name, BAD_CAST "rewriteURI")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_URI, - BAD_CAST "rewriteURI", BAD_CAST "uriStartString", - BAD_CAST "rewritePrefix", prefer, cgroup); - } else if (xmlStrEqual(cur->name, BAD_CAST "delegateURI")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_URI, - BAD_CAST "delegateURI", BAD_CAST "uriStartString", - BAD_CAST "catalog", prefer, cgroup); - } else if (xmlStrEqual(cur->name, BAD_CAST "nextCatalog")) { - entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_NEXT_CATALOG, - BAD_CAST "nextCatalog", NULL, - BAD_CAST "catalog", prefer, cgroup); - } - if (entry != NULL) { - if (parent != NULL) { - entry->parent = parent; - if (parent->children == NULL) - parent->children = entry; - else { - xmlCatalogEntryPtr prev; - - prev = parent->children; - while (prev->next != NULL) - prev = prev->next; - prev->next = entry; - } - } - if (entry->type == XML_CATA_GROUP) { - /* - * Recurse to propagate prefer to the subtree - * (xml:base handling is automated) - */ - xmlParseXMLCatalogNodeList(cur->children, prefer, parent, entry); - } - } - if (base != NULL) - xmlFree(base); -} - -/** - * xmlParseXMLCatalogNodeList: - * @cur: the XML node list of siblings - * @prefer: the PUBLIC vs. SYSTEM current preference value - * @parent: the parent Catalog entry - * @cgroup: the group which includes this list - * - * Examines a list of XML sibling nodes of a catalog and build - * a list of Catalog entry from it adding it to the parent. - * The examination will recurse to examine node subtrees. - */ -static void -xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer, - xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup) { - while (cur != NULL) { - if ((cur->ns != NULL) && (cur->ns->href != NULL) && - (xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) { - xmlParseXMLCatalogNode(cur, prefer, parent, cgroup); - } - cur = cur->next; - } - /* TODO: sort the list according to REWRITE lengths and prefer value */ -} - -/** - * xmlParseXMLCatalogFile: - * @prefer: the PUBLIC vs. SYSTEM current preference value - * @filename: the filename for the catalog - * - * Parses the catalog file to extract the XML tree and then analyze the - * tree to build a list of Catalog entries corresponding to this catalog - * - * Returns the resulting Catalog entries list - */ -static xmlCatalogEntryPtr -xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) { - xmlDocPtr doc; - xmlNodePtr cur; - xmlChar *prop; - xmlCatalogEntryPtr parent = NULL; - - if (filename == NULL) - return(NULL); - - doc = xmlParseCatalogFile((const char *) filename); - if (doc == NULL) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Failed to parse catalog %s\n", filename); - return(NULL); - } - - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "%d Parsing catalog %s\n", xmlGetThreadId(), filename); - - cur = xmlDocGetRootElement(doc); - if ((cur != NULL) && (xmlStrEqual(cur->name, BAD_CAST "catalog")) && - (cur->ns != NULL) && (cur->ns->href != NULL) && - (xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) { - - parent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, - (const xmlChar *)filename, NULL, prefer, NULL); - if (parent == NULL) { - xmlFreeDoc(doc); - return(NULL); - } - - prop = xmlGetProp(cur, BAD_CAST "prefer"); - if (prop != NULL) { - if (xmlStrEqual(prop, BAD_CAST "system")) { - prefer = XML_CATA_PREFER_SYSTEM; - } else if (xmlStrEqual(prop, BAD_CAST "public")) { - prefer = XML_CATA_PREFER_PUBLIC; - } else { - xmlCatalogErr(NULL, cur, XML_CATALOG_PREFER_VALUE, - "Invalid value for prefer: '%s'\n", - prop, NULL, NULL); - } - xmlFree(prop); - } - cur = cur->children; - xmlParseXMLCatalogNodeList(cur, prefer, parent, NULL); - } else { - xmlCatalogErr(NULL, (xmlNodePtr) doc, XML_CATALOG_NOT_CATALOG, - "File %s is not an XML Catalog\n", - filename, NULL, NULL); - xmlFreeDoc(doc); - return(NULL); - } - xmlFreeDoc(doc); - return(parent); -} - -/** - * xmlFetchXMLCatalogFile: - * @catal: an existing but incomplete catalog entry - * - * Fetch and parse the subcatalog referenced by an entry - * - * Returns 0 in case of success, -1 otherwise - */ -static int -xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) { - xmlCatalogEntryPtr doc; - - if (catal == NULL) - return(-1); - if (catal->URL == NULL) - return(-1); - if (catal->children != NULL) - return(-1); - - /* - * lock the whole catalog for modification - */ - xmlRMutexLock(xmlCatalogMutex); - if (catal->children != NULL) { - /* Okay someone else did it in the meantime */ - xmlRMutexUnlock(xmlCatalogMutex); - return(0); - } - - if (xmlCatalogXMLFiles != NULL) { - doc = (xmlCatalogEntryPtr) - xmlHashLookup(xmlCatalogXMLFiles, catal->URL); - if (doc != NULL) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Found %s in file hash\n", catal->URL); - - if (catal->type == XML_CATA_CATALOG) - catal->children = doc->children; - else - catal->children = doc; - catal->dealloc = 0; - xmlRMutexUnlock(xmlCatalogMutex); - return(0); - } - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "%s not found in file hash\n", catal->URL); - } - - /* - * Fetch and parse. Note that xmlParseXMLCatalogFile does not - * use the existing catalog, there is no recursion allowed at - * that level. - */ - doc = xmlParseXMLCatalogFile(catal->prefer, catal->URL); - if (doc == NULL) { - catal->type = XML_CATA_BROKEN_CATALOG; - xmlRMutexUnlock(xmlCatalogMutex); - return(-1); - } - - if (catal->type == XML_CATA_CATALOG) - catal->children = doc->children; - else - catal->children = doc; - - doc->dealloc = 1; - - if (xmlCatalogXMLFiles == NULL) - xmlCatalogXMLFiles = xmlHashCreate(10); - if (xmlCatalogXMLFiles != NULL) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "%s added to file hash\n", catal->URL); - xmlHashAddEntry(xmlCatalogXMLFiles, catal->URL, doc); - } - xmlRMutexUnlock(xmlCatalogMutex); - return(0); -} - -/************************************************************************ - * * - * XML Catalog handling * - * * - ************************************************************************/ - -/** - * xmlAddXMLCatalog: - * @catal: top of an XML catalog - * @type: the type of record to add to the catalog - * @orig: the system, public or prefix to match (or NULL) - * @replace: the replacement value for the match - * - * Add an entry in the XML catalog, it may overwrite existing but - * different entries. - * - * Returns 0 if successful, -1 otherwise - */ -static int -xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type, - const xmlChar *orig, const xmlChar *replace) { - xmlCatalogEntryPtr cur; - xmlCatalogEntryType typ; - int doregister = 0; - - if ((catal == NULL) || - ((catal->type != XML_CATA_CATALOG) && - (catal->type != XML_CATA_BROKEN_CATALOG))) - return(-1); - if (catal->children == NULL) { - xmlFetchXMLCatalogFile(catal); - } - if (catal->children == NULL) - doregister = 1; - - typ = xmlGetXMLCatalogEntryType(type); - if (typ == XML_CATA_NONE) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Failed to add unknown element %s to catalog\n", type); - return(-1); - } - - cur = catal->children; - /* - * Might be a simple "update in place" - */ - if (cur != NULL) { - while (cur != NULL) { - if ((orig != NULL) && (cur->type == typ) && - (xmlStrEqual(orig, cur->name))) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Updating element %s to catalog\n", type); - if (cur->value != NULL) - xmlFree(cur->value); - if (cur->URL != NULL) - xmlFree(cur->URL); - cur->value = xmlStrdup(replace); - cur->URL = xmlStrdup(replace); - return(0); - } - if (cur->next == NULL) - break; - cur = cur->next; - } - } - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Adding element %s to catalog\n", type); - if (cur == NULL) - catal->children = xmlNewCatalogEntry(typ, orig, replace, - NULL, catal->prefer, NULL); - else - cur->next = xmlNewCatalogEntry(typ, orig, replace, - NULL, catal->prefer, NULL); - if (doregister) { - catal->type = XML_CATA_CATALOG; - cur = xmlHashLookup(xmlCatalogXMLFiles, catal->URL); - if (cur != NULL) - cur->children = catal->children; - } - - return(0); -} - -/** - * xmlDelXMLCatalog: - * @catal: top of an XML catalog - * @value: the value to remove from the catalog - * - * Remove entries in the XML catalog where the value or the URI - * is equal to @value - * - * Returns the number of entries removed if successful, -1 otherwise - */ -static int -xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) { - xmlCatalogEntryPtr cur; - int ret = 0; - - if ((catal == NULL) || - ((catal->type != XML_CATA_CATALOG) && - (catal->type != XML_CATA_BROKEN_CATALOG))) - return(-1); - if (value == NULL) - return(-1); - if (catal->children == NULL) { - xmlFetchXMLCatalogFile(catal); - } - - /* - * Scan the children - */ - cur = catal->children; - while (cur != NULL) { - if (((cur->name != NULL) && (xmlStrEqual(value, cur->name))) || - (xmlStrEqual(value, cur->value))) { - if (xmlDebugCatalogs) { - if (cur->name != NULL) - xmlGenericError(xmlGenericErrorContext, - "Removing element %s from catalog\n", cur->name); - else - xmlGenericError(xmlGenericErrorContext, - "Removing element %s from catalog\n", cur->value); - } - cur->type = XML_CATA_REMOVED; - } - cur = cur->next; - } - return(ret); -} - -/** - * xmlCatalogXMLResolve: - * @catal: a catalog list - * @pubID: the public ID string - * @sysID: the system ID string - * - * Do a complete resolution lookup of an External Identifier for a - * list of catalog entries. - * - * Implements (or tries to) 7.1. External Identifier Resolution - * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html - * - * Returns the URI of the resource or NULL if not found - */ -static xmlChar * -xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID, - const xmlChar *sysID) { - xmlChar *ret = NULL; - xmlCatalogEntryPtr cur; - int haveDelegate = 0; - int haveNext = 0; - - /* - * protection against loops - */ - if (catal->depth > MAX_CATAL_DEPTH) { - xmlCatalogErr(catal, NULL, XML_CATALOG_RECURSION, - "Detected recursion in catalog %s\n", - catal->name, NULL, NULL); - return(NULL); - } - catal->depth++; - - /* - * First tries steps 2/ 3/ 4/ if a system ID is provided. - */ - if (sysID != NULL) { - xmlCatalogEntryPtr rewrite = NULL; - int lenrewrite = 0, len; - cur = catal; - haveDelegate = 0; - while (cur != NULL) { - switch (cur->type) { - case XML_CATA_SYSTEM: - if (xmlStrEqual(sysID, cur->name)) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Found system match %s, using %s\n", - cur->name, cur->URL); - catal->depth--; - return(xmlStrdup(cur->URL)); - } - break; - case XML_CATA_REWRITE_SYSTEM: - len = xmlStrlen(cur->name); - if ((len > lenrewrite) && - (!xmlStrncmp(sysID, cur->name, len))) { - lenrewrite = len; - rewrite = cur; - } - break; - case XML_CATA_DELEGATE_SYSTEM: - if (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name))) - haveDelegate++; - break; - case XML_CATA_NEXT_CATALOG: - haveNext++; - break; - default: - break; - } - cur = cur->next; - } - if (rewrite != NULL) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Using rewriting rule %s\n", rewrite->name); - ret = xmlStrdup(rewrite->URL); - if (ret != NULL) - ret = xmlStrcat(ret, &sysID[lenrewrite]); - catal->depth--; - return(ret); - } - if (haveDelegate) { - const xmlChar *delegates[MAX_DELEGATE]; - int nbList = 0, i; - - /* - * Assume the entries have been sorted by decreasing substring - * matches when the list was produced. - */ - cur = catal; - while (cur != NULL) { - if ((cur->type == XML_CATA_DELEGATE_SYSTEM) && - (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))) { - for (i = 0;i < nbList;i++) - if (xmlStrEqual(cur->URL, delegates[i])) - break; - if (i < nbList) { - cur = cur->next; - continue; - } - if (nbList < MAX_DELEGATE) - delegates[nbList++] = cur->URL; - - if (cur->children == NULL) { - xmlFetchXMLCatalogFile(cur); - } - if (cur->children != NULL) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Trying system delegate %s\n", cur->URL); - ret = xmlCatalogListXMLResolve( - cur->children, NULL, sysID); - if (ret != NULL) { - catal->depth--; - return(ret); - } - } - } - cur = cur->next; - } - /* - * Apply the cut algorithm explained in 4/ - */ - catal->depth--; - return(XML_CATAL_BREAK); - } - } - /* - * Then tries 5/ 6/ if a public ID is provided - */ - if (pubID != NULL) { - cur = catal; - haveDelegate = 0; - while (cur != NULL) { - switch (cur->type) { - case XML_CATA_PUBLIC: - if (xmlStrEqual(pubID, cur->name)) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Found public match %s\n", cur->name); - catal->depth--; - return(xmlStrdup(cur->URL)); - } - break; - case XML_CATA_DELEGATE_PUBLIC: - if (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)) && - (cur->prefer == XML_CATA_PREFER_PUBLIC)) - haveDelegate++; - break; - case XML_CATA_NEXT_CATALOG: - if (sysID == NULL) - haveNext++; - break; - default: - break; - } - cur = cur->next; - } - if (haveDelegate) { - const xmlChar *delegates[MAX_DELEGATE]; - int nbList = 0, i; - - /* - * Assume the entries have been sorted by decreasing substring - * matches when the list was produced. - */ - cur = catal; - while (cur != NULL) { - if ((cur->type == XML_CATA_DELEGATE_PUBLIC) && - (cur->prefer == XML_CATA_PREFER_PUBLIC) && - (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)))) { - - for (i = 0;i < nbList;i++) - if (xmlStrEqual(cur->URL, delegates[i])) - break; - if (i < nbList) { - cur = cur->next; - continue; - } - if (nbList < MAX_DELEGATE) - delegates[nbList++] = cur->URL; - - if (cur->children == NULL) { - xmlFetchXMLCatalogFile(cur); - } - if (cur->children != NULL) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Trying public delegate %s\n", cur->URL); - ret = xmlCatalogListXMLResolve( - cur->children, pubID, NULL); - if (ret != NULL) { - catal->depth--; - return(ret); - } - } - } - cur = cur->next; - } - /* - * Apply the cut algorithm explained in 4/ - */ - catal->depth--; - return(XML_CATAL_BREAK); - } - } - if (haveNext) { - cur = catal; - while (cur != NULL) { - if (cur->type == XML_CATA_NEXT_CATALOG) { - if (cur->children == NULL) { - xmlFetchXMLCatalogFile(cur); - } - if (cur->children != NULL) { - ret = xmlCatalogListXMLResolve(cur->children, pubID, sysID); - if (ret != NULL) { - catal->depth--; - return(ret); - } - } - } - cur = cur->next; - } - } - - catal->depth--; - return(NULL); -} - -/** - * xmlCatalogXMLResolveURI: - * @catal: a catalog list - * @URI: the URI - * @sysID: the system ID string - * - * Do a complete resolution lookup of an External Identifier for a - * list of catalog entries. - * - * Implements (or tries to) 7.2.2. URI Resolution - * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html - * - * Returns the URI of the resource or NULL if not found - */ -static xmlChar * -xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) { - xmlChar *ret = NULL; - xmlCatalogEntryPtr cur; - int haveDelegate = 0; - int haveNext = 0; - xmlCatalogEntryPtr rewrite = NULL; - int lenrewrite = 0, len; - - if (catal == NULL) - return(NULL); - - if (URI == NULL) - return(NULL); - - /* - * First tries steps 2/ 3/ 4/ if a system ID is provided. - */ - cur = catal; - haveDelegate = 0; - while (cur != NULL) { - switch (cur->type) { - case XML_CATA_URI: - if (xmlStrEqual(URI, cur->name)) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Found URI match %s\n", cur->name); - return(xmlStrdup(cur->URL)); - } - break; - case XML_CATA_REWRITE_URI: - len = xmlStrlen(cur->name); - if ((len > lenrewrite) && - (!xmlStrncmp(URI, cur->name, len))) { - lenrewrite = len; - rewrite = cur; - } - break; - case XML_CATA_DELEGATE_URI: - if (!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name))) - haveDelegate++; - break; - case XML_CATA_NEXT_CATALOG: - haveNext++; - break; - default: - break; - } - cur = cur->next; - } - if (rewrite != NULL) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Using rewriting rule %s\n", rewrite->name); - ret = xmlStrdup(rewrite->URL); - if (ret != NULL) - ret = xmlStrcat(ret, &URI[lenrewrite]); - return(ret); - } - if (haveDelegate) { - const xmlChar *delegates[MAX_DELEGATE]; - int nbList = 0, i; - - /* - * Assume the entries have been sorted by decreasing substring - * matches when the list was produced. - */ - cur = catal; - while (cur != NULL) { - if (((cur->type == XML_CATA_DELEGATE_SYSTEM) || - (cur->type == XML_CATA_DELEGATE_URI)) && - (!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))) { - for (i = 0;i < nbList;i++) - if (xmlStrEqual(cur->URL, delegates[i])) - break; - if (i < nbList) { - cur = cur->next; - continue; - } - if (nbList < MAX_DELEGATE) - delegates[nbList++] = cur->URL; - - if (cur->children == NULL) { - xmlFetchXMLCatalogFile(cur); - } - if (cur->children != NULL) { - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Trying URI delegate %s\n", cur->URL); - ret = xmlCatalogListXMLResolveURI( - cur->children, URI); - if (ret != NULL) - return(ret); - } - } - cur = cur->next; - } - /* - * Apply the cut algorithm explained in 4/ - */ - return(XML_CATAL_BREAK); - } - if (haveNext) { - cur = catal; - while (cur != NULL) { - if (cur->type == XML_CATA_NEXT_CATALOG) { - if (cur->children == NULL) { - xmlFetchXMLCatalogFile(cur); - } - if (cur->children != NULL) { - ret = xmlCatalogListXMLResolveURI(cur->children, URI); - if (ret != NULL) - return(ret); - } - } - cur = cur->next; - } - } - - return(NULL); -} - -/** - * xmlCatalogListXMLResolve: - * @catal: a catalog list - * @pubID: the public ID string - * @sysID: the system ID string - * - * Do a complete resolution lookup of an External Identifier for a - * list of catalogs - * - * Implements (or tries to) 7.1. External Identifier Resolution - * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html - * - * Returns the URI of the resource or NULL if not found - */ -static xmlChar * -xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID, - const xmlChar *sysID) { - xmlChar *ret = NULL; - xmlChar *urnID = NULL; - xmlChar *normid; - - if (catal == NULL) - return(NULL); - if ((pubID == NULL) && (sysID == NULL)) - return(NULL); - - normid = xmlCatalogNormalizePublic(pubID); - if (normid != NULL) - pubID = (*normid != 0 ? normid : NULL); - - if (!xmlStrncmp(pubID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) { - urnID = xmlCatalogUnWrapURN(pubID); - if (xmlDebugCatalogs) { - if (urnID == NULL) - xmlGenericError(xmlGenericErrorContext, - "Public URN ID %s expanded to NULL\n", pubID); - else - xmlGenericError(xmlGenericErrorContext, - "Public URN ID expanded to %s\n", urnID); - } - ret = xmlCatalogListXMLResolve(catal, urnID, sysID); - if (urnID != NULL) - xmlFree(urnID); - if (normid != NULL) - xmlFree(normid); - return(ret); - } - if (!xmlStrncmp(sysID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) { - urnID = xmlCatalogUnWrapURN(sysID); - if (xmlDebugCatalogs) { - if (urnID == NULL) - xmlGenericError(xmlGenericErrorContext, - "System URN ID %s expanded to NULL\n", sysID); - else - xmlGenericError(xmlGenericErrorContext, - "System URN ID expanded to %s\n", urnID); - } - if (pubID == NULL) - ret = xmlCatalogListXMLResolve(catal, urnID, NULL); - else if (xmlStrEqual(pubID, urnID)) - ret = xmlCatalogListXMLResolve(catal, pubID, NULL); - else { - ret = xmlCatalogListXMLResolve(catal, pubID, urnID); - } - if (urnID != NULL) - xmlFree(urnID); - if (normid != NULL) - xmlFree(normid); - return(ret); - } - while (catal != NULL) { - if (catal->type == XML_CATA_CATALOG) { - if (catal->children == NULL) { - xmlFetchXMLCatalogFile(catal); - } - if (catal->children != NULL) { - ret = xmlCatalogXMLResolve(catal->children, pubID, sysID); - if (ret != NULL) { - if (normid != NULL) - xmlFree(normid); - return(ret); - } - } - } - catal = catal->next; - } - if (normid != NULL) - xmlFree(normid); - return(ret); -} - -/** - * xmlCatalogListXMLResolveURI: - * @catal: a catalog list - * @URI: the URI - * - * Do a complete resolution lookup of an URI for a list of catalogs - * - * Implements (or tries to) 7.2. URI Resolution - * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html - * - * Returns the URI of the resource or NULL if not found - */ -static xmlChar * -xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) { - xmlChar *ret = NULL; - xmlChar *urnID = NULL; - - if (catal == NULL) - return(NULL); - if (URI == NULL) - return(NULL); - - if (!xmlStrncmp(URI, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) { - urnID = xmlCatalogUnWrapURN(URI); - if (xmlDebugCatalogs) { - if (urnID == NULL) - xmlGenericError(xmlGenericErrorContext, - "URN ID %s expanded to NULL\n", URI); - else - xmlGenericError(xmlGenericErrorContext, - "URN ID expanded to %s\n", urnID); - } - ret = xmlCatalogListXMLResolve(catal, urnID, NULL); - if (urnID != NULL) - xmlFree(urnID); - return(ret); - } - while (catal != NULL) { - if (catal->type == XML_CATA_CATALOG) { - if (catal->children == NULL) { - xmlFetchXMLCatalogFile(catal); - } - if (catal->children != NULL) { - ret = xmlCatalogXMLResolveURI(catal->children, URI); - if (ret != NULL) - return(ret); - } - } - catal = catal->next; - } - return(ret); -} - -/************************************************************************ - * * - * The SGML Catalog parser * - * * - ************************************************************************/ - - -#define RAW *cur -#define NEXT cur++; -#define SKIP(x) cur += x; - -#define SKIP_BLANKS while (IS_BLANK_CH(*cur)) NEXT; - -/** - * xmlParseSGMLCatalogComment: - * @cur: the current character - * - * Skip a comment in an SGML catalog - * - * Returns new current character - */ -static const xmlChar * -xmlParseSGMLCatalogComment(const xmlChar *cur) { - if ((cur[0] != '-') || (cur[1] != '-')) - return(cur); - SKIP(2); - while ((cur[0] != 0) && ((cur[0] != '-') || ((cur[1] != '-')))) - NEXT; - if (cur[0] == 0) { - return(NULL); - } - return(cur + 2); -} - -/** - * xmlParseSGMLCatalogPubid: - * @cur: the current character - * @id: the return location - * - * Parse an SGML catalog ID - * - * Returns new current character and store the value in @id - */ -static const xmlChar * -xmlParseSGMLCatalogPubid(const xmlChar *cur, xmlChar **id) { - xmlChar *buf = NULL, *tmp; - int len = 0; - int size = 50; - xmlChar stop; - int count = 0; - - *id = NULL; - - if (RAW == '"') { - NEXT; - stop = '"'; - } else if (RAW == '\'') { - NEXT; - stop = '\''; - } else { - stop = ' '; - } - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlCatalogErrMemory("allocating public ID"); - return(NULL); - } - while (IS_PUBIDCHAR_CH(*cur) || (*cur == '?')) { - if ((*cur == stop) && (stop != ' ')) - break; - if ((stop == ' ') && (IS_BLANK_CH(*cur))) - break; - if (len + 1 >= size) { - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlCatalogErrMemory("allocating public ID"); - xmlFree(buf); - return(NULL); - } - buf = tmp; - } - buf[len++] = *cur; - count++; - NEXT; - } - buf[len] = 0; - if (stop == ' ') { - if (!IS_BLANK_CH(*cur)) { - xmlFree(buf); - return(NULL); - } - } else { - if (*cur != stop) { - xmlFree(buf); - return(NULL); - } - NEXT; - } - *id = buf; - return(cur); -} - -/** - * xmlParseSGMLCatalogName: - * @cur: the current character - * @name: the return location - * - * Parse an SGML catalog name - * - * Returns new current character and store the value in @name - */ -static const xmlChar * -xmlParseSGMLCatalogName(const xmlChar *cur, xmlChar **name) { - xmlChar buf[XML_MAX_NAMELEN + 5]; - int len = 0; - int c; - - *name = NULL; - - /* - * Handler for more complex cases - */ - c = *cur; - if ((!IS_LETTER(c) && (c != '_') && (c != ':'))) { - return(NULL); - } - - while (((IS_LETTER(c)) || (IS_DIGIT(c)) || - (c == '.') || (c == '-') || - (c == '_') || (c == ':'))) { - buf[len++] = c; - cur++; - c = *cur; - if (len >= XML_MAX_NAMELEN) - return(NULL); - } - *name = xmlStrndup(buf, len); - return(cur); -} - -/** - * xmlGetSGMLCatalogEntryType: - * @name: the entry name - * - * Get the Catalog entry type for a given SGML Catalog name - * - * Returns Catalog entry type - */ -static xmlCatalogEntryType -xmlGetSGMLCatalogEntryType(const xmlChar *name) { - xmlCatalogEntryType type = XML_CATA_NONE; - if (xmlStrEqual(name, (const xmlChar *) "SYSTEM")) - type = SGML_CATA_SYSTEM; - else if (xmlStrEqual(name, (const xmlChar *) "PUBLIC")) - type = SGML_CATA_PUBLIC; - else if (xmlStrEqual(name, (const xmlChar *) "DELEGATE")) - type = SGML_CATA_DELEGATE; - else if (xmlStrEqual(name, (const xmlChar *) "ENTITY")) - type = SGML_CATA_ENTITY; - else if (xmlStrEqual(name, (const xmlChar *) "DOCTYPE")) - type = SGML_CATA_DOCTYPE; - else if (xmlStrEqual(name, (const xmlChar *) "LINKTYPE")) - type = SGML_CATA_LINKTYPE; - else if (xmlStrEqual(name, (const xmlChar *) "NOTATION")) - type = SGML_CATA_NOTATION; - else if (xmlStrEqual(name, (const xmlChar *) "SGMLDECL")) - type = SGML_CATA_SGMLDECL; - else if (xmlStrEqual(name, (const xmlChar *) "DOCUMENT")) - type = SGML_CATA_DOCUMENT; - else if (xmlStrEqual(name, (const xmlChar *) "CATALOG")) - type = SGML_CATA_CATALOG; - else if (xmlStrEqual(name, (const xmlChar *) "BASE")) - type = SGML_CATA_BASE; - return(type); -} - -/** - * xmlParseSGMLCatalog: - * @catal: the SGML Catalog - * @value: the content of the SGML Catalog serialization - * @file: the filepath for the catalog - * @super: should this be handled as a Super Catalog in which case - * parsing is not recursive - * - * Parse an SGML catalog content and fill up the @catal hash table with - * the new entries found. - * - * Returns 0 in case of success, -1 in case of error. - */ -static int -xmlParseSGMLCatalog(xmlCatalogPtr catal, const xmlChar *value, - const char *file, int super) { - const xmlChar *cur = value; - xmlChar *base = NULL; - int res; - - if ((cur == NULL) || (file == NULL)) - return(-1); - base = xmlStrdup((const xmlChar *) file); - - while ((cur != NULL) && (cur[0] != 0)) { - SKIP_BLANKS; - if (cur[0] == 0) - break; - if ((cur[0] == '-') && (cur[1] == '-')) { - cur = xmlParseSGMLCatalogComment(cur); - if (cur == NULL) { - /* error */ - break; - } - } else { - xmlChar *sysid = NULL; - xmlChar *name = NULL; - xmlCatalogEntryType type = XML_CATA_NONE; - - cur = xmlParseSGMLCatalogName(cur, &name); - if (name == NULL) { - /* error */ - break; - } - if (!IS_BLANK_CH(*cur)) { - /* error */ - break; - } - SKIP_BLANKS; - if (xmlStrEqual(name, (const xmlChar *) "SYSTEM")) - type = SGML_CATA_SYSTEM; - else if (xmlStrEqual(name, (const xmlChar *) "PUBLIC")) - type = SGML_CATA_PUBLIC; - else if (xmlStrEqual(name, (const xmlChar *) "DELEGATE")) - type = SGML_CATA_DELEGATE; - else if (xmlStrEqual(name, (const xmlChar *) "ENTITY")) - type = SGML_CATA_ENTITY; - else if (xmlStrEqual(name, (const xmlChar *) "DOCTYPE")) - type = SGML_CATA_DOCTYPE; - else if (xmlStrEqual(name, (const xmlChar *) "LINKTYPE")) - type = SGML_CATA_LINKTYPE; - else if (xmlStrEqual(name, (const xmlChar *) "NOTATION")) - type = SGML_CATA_NOTATION; - else if (xmlStrEqual(name, (const xmlChar *) "SGMLDECL")) - type = SGML_CATA_SGMLDECL; - else if (xmlStrEqual(name, (const xmlChar *) "DOCUMENT")) - type = SGML_CATA_DOCUMENT; - else if (xmlStrEqual(name, (const xmlChar *) "CATALOG")) - type = SGML_CATA_CATALOG; - else if (xmlStrEqual(name, (const xmlChar *) "BASE")) - type = SGML_CATA_BASE; - else if (xmlStrEqual(name, (const xmlChar *) "OVERRIDE")) { - xmlFree(name); - cur = xmlParseSGMLCatalogName(cur, &name); - if (name == NULL) { - /* error */ - break; - } - xmlFree(name); - continue; - } - xmlFree(name); - name = NULL; - - switch(type) { - case SGML_CATA_ENTITY: - if (*cur == '%') - type = SGML_CATA_PENTITY; - case SGML_CATA_PENTITY: - case SGML_CATA_DOCTYPE: - case SGML_CATA_LINKTYPE: - case SGML_CATA_NOTATION: - cur = xmlParseSGMLCatalogName(cur, &name); - if (cur == NULL) { - /* error */ - break; - } - if (!IS_BLANK_CH(*cur)) { - /* error */ - break; - } - SKIP_BLANKS; - cur = xmlParseSGMLCatalogPubid(cur, &sysid); - if (cur == NULL) { - /* error */ - break; - } - break; - case SGML_CATA_PUBLIC: - case SGML_CATA_SYSTEM: - case SGML_CATA_DELEGATE: - cur = xmlParseSGMLCatalogPubid(cur, &name); - if (cur == NULL) { - /* error */ - break; - } - if (type != SGML_CATA_SYSTEM) { - xmlChar *normid; - - normid = xmlCatalogNormalizePublic(name); - if (normid != NULL) { - if (name != NULL) - xmlFree(name); - if (*normid != 0) - name = normid; - else { - xmlFree(normid); - name = NULL; - } - } - } - if (!IS_BLANK_CH(*cur)) { - /* error */ - break; - } - SKIP_BLANKS; - cur = xmlParseSGMLCatalogPubid(cur, &sysid); - if (cur == NULL) { - /* error */ - break; - } - break; - case SGML_CATA_BASE: - case SGML_CATA_CATALOG: - case SGML_CATA_DOCUMENT: - case SGML_CATA_SGMLDECL: - cur = xmlParseSGMLCatalogPubid(cur, &sysid); - if (cur == NULL) { - /* error */ - break; - } - break; - default: - break; - } - if (cur == NULL) { - if (name != NULL) - xmlFree(name); - if (sysid != NULL) - xmlFree(sysid); - break; - } else if (type == SGML_CATA_BASE) { - if (base != NULL) - xmlFree(base); - base = xmlStrdup(sysid); - } else if ((type == SGML_CATA_PUBLIC) || - (type == SGML_CATA_SYSTEM)) { - xmlChar *filename; - - filename = xmlBuildURI(sysid, base); - if (filename != NULL) { - xmlCatalogEntryPtr entry; - - entry = xmlNewCatalogEntry(type, name, filename, - NULL, XML_CATA_PREFER_NONE, NULL); - res = xmlHashAddEntry(catal->sgml, name, entry); - if (res < 0) { - xmlFreeCatalogEntry(entry); - } - xmlFree(filename); - } - - } else if (type == SGML_CATA_CATALOG) { - if (super) { - xmlCatalogEntryPtr entry; - - entry = xmlNewCatalogEntry(type, sysid, NULL, NULL, - XML_CATA_PREFER_NONE, NULL); - res = xmlHashAddEntry(catal->sgml, sysid, entry); - if (res < 0) { - xmlFreeCatalogEntry(entry); - } - } else { - xmlChar *filename; - - filename = xmlBuildURI(sysid, base); - if (filename != NULL) { - xmlExpandCatalog(catal, (const char *)filename); - xmlFree(filename); - } - } - } - /* - * drop anything else we won't handle it - */ - if (name != NULL) - xmlFree(name); - if (sysid != NULL) - xmlFree(sysid); - } - } - if (base != NULL) - xmlFree(base); - if (cur == NULL) - return(-1); - return(0); -} - -/************************************************************************ - * * - * SGML Catalog handling * - * * - ************************************************************************/ - -/** - * xmlCatalogGetSGMLPublic: - * @catal: an SGML catalog hash - * @pubID: the public ID string - * - * Try to lookup the catalog local reference associated to a public ID - * - * Returns the local resource if found or NULL otherwise. - */ -static const xmlChar * -xmlCatalogGetSGMLPublic(xmlHashTablePtr catal, const xmlChar *pubID) { - xmlCatalogEntryPtr entry; - xmlChar *normid; - - if (catal == NULL) - return(NULL); - - normid = xmlCatalogNormalizePublic(pubID); - if (normid != NULL) - pubID = (*normid != 0 ? normid : NULL); - - entry = (xmlCatalogEntryPtr) xmlHashLookup(catal, pubID); - if (entry == NULL) { - if (normid != NULL) - xmlFree(normid); - return(NULL); - } - if (entry->type == SGML_CATA_PUBLIC) { - if (normid != NULL) - xmlFree(normid); - return(entry->URL); - } - if (normid != NULL) - xmlFree(normid); - return(NULL); -} - -/** - * xmlCatalogGetSGMLSystem: - * @catal: an SGML catalog hash - * @sysID: the system ID string - * - * Try to lookup the catalog local reference for a system ID - * - * Returns the local resource if found or NULL otherwise. - */ -static const xmlChar * -xmlCatalogGetSGMLSystem(xmlHashTablePtr catal, const xmlChar *sysID) { - xmlCatalogEntryPtr entry; - - if (catal == NULL) - return(NULL); - - entry = (xmlCatalogEntryPtr) xmlHashLookup(catal, sysID); - if (entry == NULL) - return(NULL); - if (entry->type == SGML_CATA_SYSTEM) - return(entry->URL); - return(NULL); -} - -/** - * xmlCatalogSGMLResolve: - * @catal: the SGML catalog - * @pubID: the public ID string - * @sysID: the system ID string - * - * Do a complete resolution lookup of an External Identifier - * - * Returns the URI of the resource or NULL if not found - */ -static const xmlChar * -xmlCatalogSGMLResolve(xmlCatalogPtr catal, const xmlChar *pubID, - const xmlChar *sysID) { - const xmlChar *ret = NULL; - - if (catal->sgml == NULL) - return(NULL); - - if (pubID != NULL) - ret = xmlCatalogGetSGMLPublic(catal->sgml, pubID); - if (ret != NULL) - return(ret); - if (sysID != NULL) - ret = xmlCatalogGetSGMLSystem(catal->sgml, sysID); - return(NULL); -} - -/************************************************************************ - * * - * Specific Public interfaces * - * * - ************************************************************************/ - -/** - * xmlLoadSGMLSuperCatalog: - * @filename: a file path - * - * Load an SGML super catalog. It won't expand CATALOG or DELEGATE - * references. This is only needed for manipulating SGML Super Catalogs - * like adding and removing CATALOG or DELEGATE entries. - * - * Returns the catalog parsed or NULL in case of error - */ -xmlCatalogPtr -xmlLoadSGMLSuperCatalog(const char *filename) -{ - xmlChar *content; - xmlCatalogPtr catal; - int ret; - - content = xmlLoadFileContent(filename); - if (content == NULL) - return(NULL); - - catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer); - if (catal == NULL) { - xmlFree(content); - return(NULL); - } - - ret = xmlParseSGMLCatalog(catal, content, filename, 1); - xmlFree(content); - if (ret < 0) { - xmlFreeCatalog(catal); - return(NULL); - } - return (catal); -} - -/** - * xmlLoadACatalog: - * @filename: a file path - * - * Load the catalog and build the associated data structures. - * This can be either an XML Catalog or an SGML Catalog - * It will recurse in SGML CATALOG entries. On the other hand XML - * Catalogs are not handled recursively. - * - * Returns the catalog parsed or NULL in case of error - */ -xmlCatalogPtr -xmlLoadACatalog(const char *filename) -{ - xmlChar *content; - xmlChar *first; - xmlCatalogPtr catal; - int ret; - - content = xmlLoadFileContent(filename); - if (content == NULL) - return(NULL); - - - first = content; - - while ((*first != 0) && (*first != '-') && (*first != '<') && - (!(((*first >= 'A') && (*first <= 'Z')) || - ((*first >= 'a') && (*first <= 'z'))))) - first++; - - if (*first != '<') { - catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer); - if (catal == NULL) { - xmlFree(content); - return(NULL); - } - ret = xmlParseSGMLCatalog(catal, content, filename, 0); - if (ret < 0) { - xmlFreeCatalog(catal); - xmlFree(content); - return(NULL); - } - } else { - catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, xmlCatalogDefaultPrefer); - if (catal == NULL) { - xmlFree(content); - return(NULL); - } - catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, - NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL); - } - xmlFree(content); - return (catal); -} - -/** - * xmlExpandCatalog: - * @catal: a catalog - * @filename: a file path - * - * Load the catalog and expand the existing catal structure. - * This can be either an XML Catalog or an SGML Catalog - * - * Returns 0 in case of success, -1 in case of error - */ -static int -xmlExpandCatalog(xmlCatalogPtr catal, const char *filename) -{ - int ret; - - if ((catal == NULL) || (filename == NULL)) - return(-1); - - - if (catal->type == XML_SGML_CATALOG_TYPE) { - xmlChar *content; - - content = xmlLoadFileContent(filename); - if (content == NULL) - return(-1); - - ret = xmlParseSGMLCatalog(catal, content, filename, 0); - if (ret < 0) { - xmlFree(content); - return(-1); - } - xmlFree(content); - } else { - xmlCatalogEntryPtr tmp, cur; - tmp = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, - NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL); - - cur = catal->xml; - if (cur == NULL) { - catal->xml = tmp; - } else { - while (cur->next != NULL) cur = cur->next; - cur->next = tmp; - } - } - return (0); -} - -/** - * xmlACatalogResolveSystem: - * @catal: a Catalog - * @sysID: the system ID string - * - * Try to lookup the catalog resource for a system ID - * - * Returns the resource if found or NULL otherwise, the value returned - * must be freed by the caller. - */ -xmlChar * -xmlACatalogResolveSystem(xmlCatalogPtr catal, const xmlChar *sysID) { - xmlChar *ret = NULL; - - if ((sysID == NULL) || (catal == NULL)) - return(NULL); - - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Resolve sysID %s\n", sysID); - - if (catal->type == XML_XML_CATALOG_TYPE) { - ret = xmlCatalogListXMLResolve(catal->xml, NULL, sysID); - if (ret == XML_CATAL_BREAK) - ret = NULL; - } else { - const xmlChar *sgml; - - sgml = xmlCatalogGetSGMLSystem(catal->sgml, sysID); - if (sgml != NULL) - ret = xmlStrdup(sgml); - } - return(ret); -} - -/** - * xmlACatalogResolvePublic: - * @catal: a Catalog - * @pubID: the public ID string - * - * Try to lookup the catalog local reference associated to a public ID in that catalog - * - * Returns the local resource if found or NULL otherwise, the value returned - * must be freed by the caller. - */ -xmlChar * -xmlACatalogResolvePublic(xmlCatalogPtr catal, const xmlChar *pubID) { - xmlChar *ret = NULL; - - if ((pubID == NULL) || (catal == NULL)) - return(NULL); - - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Resolve pubID %s\n", pubID); - - if (catal->type == XML_XML_CATALOG_TYPE) { - ret = xmlCatalogListXMLResolve(catal->xml, pubID, NULL); - if (ret == XML_CATAL_BREAK) - ret = NULL; - } else { - const xmlChar *sgml; - - sgml = xmlCatalogGetSGMLPublic(catal->sgml, pubID); - if (sgml != NULL) - ret = xmlStrdup(sgml); - } - return(ret); -} - -/** - * xmlACatalogResolve: - * @catal: a Catalog - * @pubID: the public ID string - * @sysID: the system ID string - * - * Do a complete resolution lookup of an External Identifier - * - * Returns the URI of the resource or NULL if not found, it must be freed - * by the caller. - */ -xmlChar * -xmlACatalogResolve(xmlCatalogPtr catal, const xmlChar * pubID, - const xmlChar * sysID) -{ - xmlChar *ret = NULL; - - if (((pubID == NULL) && (sysID == NULL)) || (catal == NULL)) - return (NULL); - - if (xmlDebugCatalogs) { - if ((pubID != NULL) && (sysID != NULL)) { - xmlGenericError(xmlGenericErrorContext, - "Resolve: pubID %s sysID %s\n", pubID, sysID); - } else if (pubID != NULL) { - xmlGenericError(xmlGenericErrorContext, - "Resolve: pubID %s\n", pubID); - } else { - xmlGenericError(xmlGenericErrorContext, - "Resolve: sysID %s\n", sysID); - } - } - - if (catal->type == XML_XML_CATALOG_TYPE) { - ret = xmlCatalogListXMLResolve(catal->xml, pubID, sysID); - if (ret == XML_CATAL_BREAK) - ret = NULL; - } else { - const xmlChar *sgml; - - sgml = xmlCatalogSGMLResolve(catal, pubID, sysID); - if (sgml != NULL) - ret = xmlStrdup(sgml); - } - return (ret); -} - -/** - * xmlACatalogResolveURI: - * @catal: a Catalog - * @URI: the URI - * - * Do a complete resolution lookup of an URI - * - * Returns the URI of the resource or NULL if not found, it must be freed - * by the caller. - */ -xmlChar * -xmlACatalogResolveURI(xmlCatalogPtr catal, const xmlChar *URI) { - xmlChar *ret = NULL; - - if ((URI == NULL) || (catal == NULL)) - return(NULL); - - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Resolve URI %s\n", URI); - - if (catal->type == XML_XML_CATALOG_TYPE) { - ret = xmlCatalogListXMLResolveURI(catal->xml, URI); - if (ret == XML_CATAL_BREAK) - ret = NULL; - } else { - const xmlChar *sgml; - - sgml = xmlCatalogSGMLResolve(catal, NULL, URI); - if (sgml != NULL) - sgml = xmlStrdup(sgml); - } - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlACatalogDump: - * @catal: a Catalog - * @out: the file. - * - * Dump the given catalog to the given file. - */ -void -xmlACatalogDump(xmlCatalogPtr catal, FILE *out) { - if ((out == NULL) || (catal == NULL)) - return; - - if (catal->type == XML_XML_CATALOG_TYPE) { - xmlDumpXMLCatalog(out, catal->xml); - } else { - xmlHashScan(catal->sgml, - (xmlHashScanner) xmlCatalogDumpEntry, out); - } -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlACatalogAdd: - * @catal: a Catalog - * @type: the type of record to add to the catalog - * @orig: the system, public or prefix to match - * @replace: the replacement value for the match - * - * Add an entry in the catalog, it may overwrite existing but - * different entries. - * - * Returns 0 if successful, -1 otherwise - */ -int -xmlACatalogAdd(xmlCatalogPtr catal, const xmlChar * type, - const xmlChar * orig, const xmlChar * replace) -{ - int res = -1; - - if (catal == NULL) - return(-1); - - if (catal->type == XML_XML_CATALOG_TYPE) { - res = xmlAddXMLCatalog(catal->xml, type, orig, replace); - } else { - xmlCatalogEntryType cattype; - - cattype = xmlGetSGMLCatalogEntryType(type); - if (cattype != XML_CATA_NONE) { - xmlCatalogEntryPtr entry; - - entry = xmlNewCatalogEntry(cattype, orig, replace, NULL, - XML_CATA_PREFER_NONE, NULL); - if (catal->sgml == NULL) - catal->sgml = xmlHashCreate(10); - res = xmlHashAddEntry(catal->sgml, orig, entry); - } - } - return (res); -} - -/** - * xmlACatalogRemove: - * @catal: a Catalog - * @value: the value to remove - * - * Remove an entry from the catalog - * - * Returns the number of entries removed if successful, -1 otherwise - */ -int -xmlACatalogRemove(xmlCatalogPtr catal, const xmlChar *value) { - int res = -1; - - if ((catal == NULL) || (value == NULL)) - return(-1); - - if (catal->type == XML_XML_CATALOG_TYPE) { - res = xmlDelXMLCatalog(catal->xml, value); - } else { - res = xmlHashRemoveEntry(catal->sgml, value, - (xmlHashDeallocator) xmlFreeCatalogEntry); - if (res == 0) - res = 1; - } - return(res); -} - -/** - * xmlNewCatalog: - * @sgml: should this create an SGML catalog - * - * create a new Catalog. - * - * Returns the xmlCatalogPtr or NULL in case of error - */ -xmlCatalogPtr -xmlNewCatalog(int sgml) { - xmlCatalogPtr catal = NULL; - - if (sgml) { - catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, - xmlCatalogDefaultPrefer); - if ((catal != NULL) && (catal->sgml == NULL)) - catal->sgml = xmlHashCreate(10); - } else - catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, - xmlCatalogDefaultPrefer); - return(catal); -} - -/** - * xmlCatalogIsEmpty: - * @catal: should this create an SGML catalog - * - * Check is a catalog is empty - * - * Returns 1 if the catalog is empty, 0 if not, amd -1 in case of error. - */ -int -xmlCatalogIsEmpty(xmlCatalogPtr catal) { - if (catal == NULL) - return(-1); - - if (catal->type == XML_XML_CATALOG_TYPE) { - if (catal->xml == NULL) - return(1); - if ((catal->xml->type != XML_CATA_CATALOG) && - (catal->xml->type != XML_CATA_BROKEN_CATALOG)) - return(-1); - if (catal->xml->children == NULL) - return(1); - return(0); - } else { - int res; - - if (catal->sgml == NULL) - return(1); - res = xmlHashSize(catal->sgml); - if (res == 0) - return(1); - if (res < 0) - return(-1); - } - return(0); -} - -/************************************************************************ - * * - * Public interfaces manipulating the global shared default catalog * - * * - ************************************************************************/ - -/** - * xmlInitializeCatalogData: - * - * Do the catalog initialization only of global data, doesn't try to load - * any catalog actually. - * this function is not thread safe, catalog initialization should - * preferably be done once at startup - */ -static void -xmlInitializeCatalogData(void) { - if (xmlCatalogInitialized != 0) - return; - - if (getenv("XML_DEBUG_CATALOG")) - xmlDebugCatalogs = 1; - xmlCatalogMutex = xmlNewRMutex(); - - xmlCatalogInitialized = 1; -} -/** - * xmlInitializeCatalog: - * - * Do the catalog initialization. - * this function is not thread safe, catalog initialization should - * preferably be done once at startup - */ -void -xmlInitializeCatalog(void) { - if (xmlCatalogInitialized != 0) - return; - - xmlInitializeCatalogData(); - xmlRMutexLock(xmlCatalogMutex); - - if (getenv("XML_DEBUG_CATALOG")) - xmlDebugCatalogs = 1; - - if (xmlDefaultCatalog == NULL) { - const char *catalogs; - char *path; - const char *cur, *paths; - xmlCatalogPtr catal; - xmlCatalogEntryPtr *nextent; - - catalogs = (const char *) getenv("XML_CATALOG_FILES"); - if (catalogs == NULL) -#if defined(_WIN32) && defined(_MSC_VER) - { - void* hmodule; - hmodule = GetModuleHandleA("libxml2.dll"); - if (hmodule == NULL) - hmodule = GetModuleHandleA(NULL); - if (hmodule != NULL) { - char buf[256]; - unsigned long len = GetModuleFileNameA(hmodule, buf, 255); - if (len != 0) { - char* p = &(buf[len]); - while (*p != '\\' && p > buf) - p--; - if (p != buf) { - xmlChar* uri; - strncpy(p, "\\..\\etc\\catalog", 255 - (p - buf)); - uri = xmlCanonicPath(buf); - if (uri != NULL) { - strncpy(XML_XML_DEFAULT_CATALOG, uri, 255); - xmlFree(uri); - } - } - } - } - catalogs = XML_XML_DEFAULT_CATALOG; - } -#else - catalogs = XML_XML_DEFAULT_CATALOG; -#endif - - catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, - xmlCatalogDefaultPrefer); - if (catal != NULL) { - /* the XML_CATALOG_FILES envvar is allowed to contain a - space-separated list of entries. */ - cur = catalogs; - nextent = &catal->xml; - while (*cur != '\0') { - while (xmlIsBlank_ch(*cur)) - cur++; - if (*cur != 0) { - paths = cur; - while ((*cur != 0) && (!xmlIsBlank_ch(*cur))) - cur++; - path = (char *) xmlStrndup((const xmlChar *)paths, cur - paths); - if (path != NULL) { - *nextent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, - NULL, BAD_CAST path, xmlCatalogDefaultPrefer, NULL); - if (*nextent != NULL) - nextent = &((*nextent)->next); - xmlFree(path); - } - } - } - xmlDefaultCatalog = catal; - } - } - - xmlRMutexUnlock(xmlCatalogMutex); -} - - -/** - * xmlLoadCatalog: - * @filename: a file path - * - * Load the catalog and makes its definitions effective for the default - * external entity loader. It will recurse in SGML CATALOG entries. - * this function is not thread safe, catalog initialization should - * preferably be done once at startup - * - * Returns 0 in case of success -1 in case of error - */ -int -xmlLoadCatalog(const char *filename) -{ - int ret; - xmlCatalogPtr catal; - - if (!xmlCatalogInitialized) - xmlInitializeCatalogData(); - - xmlRMutexLock(xmlCatalogMutex); - - if (xmlDefaultCatalog == NULL) { - catal = xmlLoadACatalog(filename); - if (catal == NULL) { - xmlRMutexUnlock(xmlCatalogMutex); - return(-1); - } - - xmlDefaultCatalog = catal; - xmlRMutexUnlock(xmlCatalogMutex); - return(0); - } - - ret = xmlExpandCatalog(xmlDefaultCatalog, filename); - xmlRMutexUnlock(xmlCatalogMutex); - return(ret); -} - -/** - * xmlLoadCatalogs: - * @pathss: a list of directories separated by a colon or a space. - * - * Load the catalogs and makes their definitions effective for the default - * external entity loader. - * this function is not thread safe, catalog initialization should - * preferably be done once at startup - */ -void -xmlLoadCatalogs(const char *pathss) { - const char *cur; - const char *paths; - xmlChar *path; - - if (pathss == NULL) - return; - - cur = pathss; - while (*cur != 0) { - while (xmlIsBlank_ch(*cur)) cur++; - if (*cur != 0) { - paths = cur; - while ((*cur != 0) && (*cur != ':') && (!xmlIsBlank_ch(*cur))) - cur++; - path = xmlStrndup((const xmlChar *)paths, cur - paths); - if (path != NULL) { - xmlLoadCatalog((const char *) path); - xmlFree(path); - } - } - while (*cur == ':') - cur++; - } -} - -/** - * xmlCatalogCleanup: - * - * Free up all the memory associated with catalogs - */ -void -xmlCatalogCleanup(void) { - if (xmlCatalogInitialized == 0) - return; - - xmlRMutexLock(xmlCatalogMutex); - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Catalogs cleanup\n"); - if (xmlCatalogXMLFiles != NULL) - xmlHashFree(xmlCatalogXMLFiles, - (xmlHashDeallocator)xmlFreeCatalogHashEntryList); - xmlCatalogXMLFiles = NULL; - if (xmlDefaultCatalog != NULL) - xmlFreeCatalog(xmlDefaultCatalog); - xmlDefaultCatalog = NULL; - xmlDebugCatalogs = 0; - xmlCatalogInitialized = 0; - xmlRMutexUnlock(xmlCatalogMutex); - xmlFreeRMutex(xmlCatalogMutex); -} - -/** - * xmlCatalogResolveSystem: - * @sysID: the system ID string - * - * Try to lookup the catalog resource for a system ID - * - * Returns the resource if found or NULL otherwise, the value returned - * must be freed by the caller. - */ -xmlChar * -xmlCatalogResolveSystem(const xmlChar *sysID) { - xmlChar *ret; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - ret = xmlACatalogResolveSystem(xmlDefaultCatalog, sysID); - return(ret); -} - -/** - * xmlCatalogResolvePublic: - * @pubID: the public ID string - * - * Try to lookup the catalog reference associated to a public ID - * - * Returns the resource if found or NULL otherwise, the value returned - * must be freed by the caller. - */ -xmlChar * -xmlCatalogResolvePublic(const xmlChar *pubID) { - xmlChar *ret; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - ret = xmlACatalogResolvePublic(xmlDefaultCatalog, pubID); - return(ret); -} - -/** - * xmlCatalogResolve: - * @pubID: the public ID string - * @sysID: the system ID string - * - * Do a complete resolution lookup of an External Identifier - * - * Returns the URI of the resource or NULL if not found, it must be freed - * by the caller. - */ -xmlChar * -xmlCatalogResolve(const xmlChar *pubID, const xmlChar *sysID) { - xmlChar *ret; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - ret = xmlACatalogResolve(xmlDefaultCatalog, pubID, sysID); - return(ret); -} - -/** - * xmlCatalogResolveURI: - * @URI: the URI - * - * Do a complete resolution lookup of an URI - * - * Returns the URI of the resource or NULL if not found, it must be freed - * by the caller. - */ -xmlChar * -xmlCatalogResolveURI(const xmlChar *URI) { - xmlChar *ret; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - ret = xmlACatalogResolveURI(xmlDefaultCatalog, URI); - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlCatalogDump: - * @out: the file. - * - * Dump all the global catalog content to the given file. - */ -void -xmlCatalogDump(FILE *out) { - if (out == NULL) - return; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - xmlACatalogDump(xmlDefaultCatalog, out); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlCatalogAdd: - * @type: the type of record to add to the catalog - * @orig: the system, public or prefix to match - * @replace: the replacement value for the match - * - * Add an entry in the catalog, it may overwrite existing but - * different entries. - * If called before any other catalog routine, allows to override the - * default shared catalog put in place by xmlInitializeCatalog(); - * - * Returns 0 if successful, -1 otherwise - */ -int -xmlCatalogAdd(const xmlChar *type, const xmlChar *orig, const xmlChar *replace) { - int res = -1; - - if (!xmlCatalogInitialized) - xmlInitializeCatalogData(); - - xmlRMutexLock(xmlCatalogMutex); - /* - * Specific case where one want to override the default catalog - * put in place by xmlInitializeCatalog(); - */ - if ((xmlDefaultCatalog == NULL) && - (xmlStrEqual(type, BAD_CAST "catalog"))) { - xmlDefaultCatalog = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, - xmlCatalogDefaultPrefer); - xmlDefaultCatalog->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, - orig, NULL, xmlCatalogDefaultPrefer, NULL); - - xmlRMutexUnlock(xmlCatalogMutex); - return(0); - } - - res = xmlACatalogAdd(xmlDefaultCatalog, type, orig, replace); - xmlRMutexUnlock(xmlCatalogMutex); - return(res); -} - -/** - * xmlCatalogRemove: - * @value: the value to remove - * - * Remove an entry from the catalog - * - * Returns the number of entries removed if successful, -1 otherwise - */ -int -xmlCatalogRemove(const xmlChar *value) { - int res; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - xmlRMutexLock(xmlCatalogMutex); - res = xmlACatalogRemove(xmlDefaultCatalog, value); - xmlRMutexUnlock(xmlCatalogMutex); - return(res); -} - -/** - * xmlCatalogConvert: - * - * Convert all the SGML catalog entries as XML ones - * - * Returns the number of entries converted if successful, -1 otherwise - */ -int -xmlCatalogConvert(void) { - int res = -1; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - xmlRMutexLock(xmlCatalogMutex); - res = xmlConvertSGMLCatalog(xmlDefaultCatalog); - xmlRMutexUnlock(xmlCatalogMutex); - return(res); -} - -/************************************************************************ - * * - * Public interface manipulating the common preferences * - * * - ************************************************************************/ - -/** - * xmlCatalogGetDefaults: - * - * Used to get the user preference w.r.t. to what catalogs should - * be accepted - * - * Returns the current xmlCatalogAllow value - */ -xmlCatalogAllow -xmlCatalogGetDefaults(void) { - return(xmlCatalogDefaultAllow); -} - -/** - * xmlCatalogSetDefaults: - * @allow: what catalogs should be accepted - * - * Used to set the user preference w.r.t. to what catalogs should - * be accepted - */ -void -xmlCatalogSetDefaults(xmlCatalogAllow allow) { - if (xmlDebugCatalogs) { - switch (allow) { - case XML_CATA_ALLOW_NONE: - xmlGenericError(xmlGenericErrorContext, - "Disabling catalog usage\n"); - break; - case XML_CATA_ALLOW_GLOBAL: - xmlGenericError(xmlGenericErrorContext, - "Allowing only global catalogs\n"); - break; - case XML_CATA_ALLOW_DOCUMENT: - xmlGenericError(xmlGenericErrorContext, - "Allowing only catalogs from the document\n"); - break; - case XML_CATA_ALLOW_ALL: - xmlGenericError(xmlGenericErrorContext, - "Allowing all catalogs\n"); - break; - } - } - xmlCatalogDefaultAllow = allow; -} - -/** - * xmlCatalogSetDefaultPrefer: - * @prefer: the default preference for delegation - * - * Allows to set the preference between public and system for deletion - * in XML Catalog resolution. C.f. section 4.1.1 of the spec - * Values accepted are XML_CATA_PREFER_PUBLIC or XML_CATA_PREFER_SYSTEM - * - * Returns the previous value of the default preference for delegation - */ -xmlCatalogPrefer -xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer) { - xmlCatalogPrefer ret = xmlCatalogDefaultPrefer; - - if (prefer == XML_CATA_PREFER_NONE) - return(ret); - - if (xmlDebugCatalogs) { - switch (prefer) { - case XML_CATA_PREFER_PUBLIC: - xmlGenericError(xmlGenericErrorContext, - "Setting catalog preference to PUBLIC\n"); - break; - case XML_CATA_PREFER_SYSTEM: - xmlGenericError(xmlGenericErrorContext, - "Setting catalog preference to SYSTEM\n"); - break; - case XML_CATA_PREFER_NONE: - break; - } - } - xmlCatalogDefaultPrefer = prefer; - return(ret); -} - -/** - * xmlCatalogSetDebug: - * @level: the debug level of catalogs required - * - * Used to set the debug level for catalog operation, 0 disable - * debugging, 1 enable it - * - * Returns the previous value of the catalog debugging level - */ -int -xmlCatalogSetDebug(int level) { - int ret = xmlDebugCatalogs; - - if (level <= 0) - xmlDebugCatalogs = 0; - else - xmlDebugCatalogs = level; - return(ret); -} - -/************************************************************************ - * * - * Minimal interfaces used for per-document catalogs by the parser * - * * - ************************************************************************/ - -/** - * xmlCatalogFreeLocal: - * @catalogs: a document's list of catalogs - * - * Free up the memory associated to the catalog list - */ -void -xmlCatalogFreeLocal(void *catalogs) { - xmlCatalogEntryPtr catal; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - catal = (xmlCatalogEntryPtr) catalogs; - if (catal != NULL) - xmlFreeCatalogEntryList(catal); -} - - -/** - * xmlCatalogAddLocal: - * @catalogs: a document's list of catalogs - * @URL: the URL to a new local catalog - * - * Add the new entry to the catalog list - * - * Returns the updated list - */ -void * -xmlCatalogAddLocal(void *catalogs, const xmlChar *URL) { - xmlCatalogEntryPtr catal, add; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - if (URL == NULL) - return(catalogs); - - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Adding document catalog %s\n", URL); - - add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL, NULL, - xmlCatalogDefaultPrefer, NULL); - if (add == NULL) - return(catalogs); - - catal = (xmlCatalogEntryPtr) catalogs; - if (catal == NULL) - return((void *) add); - - while (catal->next != NULL) - catal = catal->next; - catal->next = add; - return(catalogs); -} - -/** - * xmlCatalogLocalResolve: - * @catalogs: a document's list of catalogs - * @pubID: the public ID string - * @sysID: the system ID string - * - * Do a complete resolution lookup of an External Identifier using a - * document's private catalog list - * - * Returns the URI of the resource or NULL if not found, it must be freed - * by the caller. - */ -xmlChar * -xmlCatalogLocalResolve(void *catalogs, const xmlChar *pubID, - const xmlChar *sysID) { - xmlCatalogEntryPtr catal; - xmlChar *ret; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - if ((pubID == NULL) && (sysID == NULL)) - return(NULL); - - if (xmlDebugCatalogs) { - if ((pubID != NULL) && (sysID != NULL)) { - xmlGenericError(xmlGenericErrorContext, - "Local Resolve: pubID %s sysID %s\n", pubID, sysID); - } else if (pubID != NULL) { - xmlGenericError(xmlGenericErrorContext, - "Local Resolve: pubID %s\n", pubID); - } else { - xmlGenericError(xmlGenericErrorContext, - "Local Resolve: sysID %s\n", sysID); - } - } - - catal = (xmlCatalogEntryPtr) catalogs; - if (catal == NULL) - return(NULL); - ret = xmlCatalogListXMLResolve(catal, pubID, sysID); - if ((ret != NULL) && (ret != XML_CATAL_BREAK)) - return(ret); - return(NULL); -} - -/** - * xmlCatalogLocalResolveURI: - * @catalogs: a document's list of catalogs - * @URI: the URI - * - * Do a complete resolution lookup of an URI using a - * document's private catalog list - * - * Returns the URI of the resource or NULL if not found, it must be freed - * by the caller. - */ -xmlChar * -xmlCatalogLocalResolveURI(void *catalogs, const xmlChar *URI) { - xmlCatalogEntryPtr catal; - xmlChar *ret; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - if (URI == NULL) - return(NULL); - - if (xmlDebugCatalogs) - xmlGenericError(xmlGenericErrorContext, - "Resolve URI %s\n", URI); - - catal = (xmlCatalogEntryPtr) catalogs; - if (catal == NULL) - return(NULL); - ret = xmlCatalogListXMLResolveURI(catal, URI); - if ((ret != NULL) && (ret != XML_CATAL_BREAK)) - return(ret); - return(NULL); -} - -/************************************************************************ - * * - * Deprecated interfaces * - * * - ************************************************************************/ -/** - * xmlCatalogGetSystem: - * @sysID: the system ID string - * - * Try to lookup the catalog reference associated to a system ID - * DEPRECATED, use xmlCatalogResolveSystem() - * - * Returns the resource if found or NULL otherwise. - */ -const xmlChar * -xmlCatalogGetSystem(const xmlChar *sysID) { - xmlChar *ret; - static xmlChar result[1000]; - static int msg = 0; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - if (msg == 0) { - xmlGenericError(xmlGenericErrorContext, - "Use of deprecated xmlCatalogGetSystem() call\n"); - msg++; - } - - if (sysID == NULL) - return(NULL); - - /* - * Check first the XML catalogs - */ - if (xmlDefaultCatalog != NULL) { - ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, NULL, sysID); - if ((ret != NULL) && (ret != XML_CATAL_BREAK)) { - snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret); - result[sizeof(result) - 1] = 0; - return(result); - } - } - - if (xmlDefaultCatalog != NULL) - return(xmlCatalogGetSGMLSystem(xmlDefaultCatalog->sgml, sysID)); - return(NULL); -} - -/** - * xmlCatalogGetPublic: - * @pubID: the public ID string - * - * Try to lookup the catalog reference associated to a public ID - * DEPRECATED, use xmlCatalogResolvePublic() - * - * Returns the resource if found or NULL otherwise. - */ -const xmlChar * -xmlCatalogGetPublic(const xmlChar *pubID) { - xmlChar *ret; - static xmlChar result[1000]; - static int msg = 0; - - if (!xmlCatalogInitialized) - xmlInitializeCatalog(); - - if (msg == 0) { - xmlGenericError(xmlGenericErrorContext, - "Use of deprecated xmlCatalogGetPublic() call\n"); - msg++; - } - - if (pubID == NULL) - return(NULL); - - /* - * Check first the XML catalogs - */ - if (xmlDefaultCatalog != NULL) { - ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, pubID, NULL); - if ((ret != NULL) && (ret != XML_CATAL_BREAK)) { - snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret); - result[sizeof(result) - 1] = 0; - return(result); - } - } - - if (xmlDefaultCatalog != NULL) - return(xmlCatalogGetSGMLPublic(xmlDefaultCatalog->sgml, pubID)); - return(NULL); -} - -#define bottom_catalog -#include "elfgcchack.h" -#endif /* LIBXML_CATALOG_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/chvalid.c b/ThirdParty/libxml2/vtklibxml2/chvalid.c deleted file mode 100644 index 602c32a91a2..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/chvalid.c +++ /dev/null @@ -1,336 +0,0 @@ -/* - * chvalid.c: this module implements the character range - * validation APIs - * - * This file is automatically generated from the cvs source - * definition files using the genChRanges.py Python script - * - * Generation date: Mon Mar 27 11:09:48 2006 - * Sources: chvalid.def - * William Brack <wbrack@mmm.com.hk> - */ - -#define IN_LIBXML -#include "libxml.h" -#include <libxml/chvalid.h> - -/* - * The initial tables ({func_name}_tab) are used to validate whether a - * single-byte character is within the specified group. Each table - * contains 256 bytes, with each byte representing one of the 256 - * possible characters. If the table byte is set, the character is - * allowed. - * - */ -const unsigned char xmlIsPubidChar_tab[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 }; - -static const xmlChSRange xmlIsBaseChar_srng[] = { {0x100, 0x131}, - {0x134, 0x13e}, {0x141, 0x148}, {0x14a, 0x17e}, {0x180, 0x1c3}, - {0x1cd, 0x1f0}, {0x1f4, 0x1f5}, {0x1fa, 0x217}, {0x250, 0x2a8}, - {0x2bb, 0x2c1}, {0x386, 0x386}, {0x388, 0x38a}, {0x38c, 0x38c}, - {0x38e, 0x3a1}, {0x3a3, 0x3ce}, {0x3d0, 0x3d6}, {0x3da, 0x3da}, - {0x3dc, 0x3dc}, {0x3de, 0x3de}, {0x3e0, 0x3e0}, {0x3e2, 0x3f3}, - {0x401, 0x40c}, {0x40e, 0x44f}, {0x451, 0x45c}, {0x45e, 0x481}, - {0x490, 0x4c4}, {0x4c7, 0x4c8}, {0x4cb, 0x4cc}, {0x4d0, 0x4eb}, - {0x4ee, 0x4f5}, {0x4f8, 0x4f9}, {0x531, 0x556}, {0x559, 0x559}, - {0x561, 0x586}, {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a}, - {0x641, 0x64a}, {0x671, 0x6b7}, {0x6ba, 0x6be}, {0x6c0, 0x6ce}, - {0x6d0, 0x6d3}, {0x6d5, 0x6d5}, {0x6e5, 0x6e6}, {0x905, 0x939}, - {0x93d, 0x93d}, {0x958, 0x961}, {0x985, 0x98c}, {0x98f, 0x990}, - {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, {0x9b6, 0x9b9}, - {0x9dc, 0x9dd}, {0x9df, 0x9e1}, {0x9f0, 0x9f1}, {0xa05, 0xa0a}, - {0xa0f, 0xa10}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa32, 0xa33}, - {0xa35, 0xa36}, {0xa38, 0xa39}, {0xa59, 0xa5c}, {0xa5e, 0xa5e}, - {0xa72, 0xa74}, {0xa85, 0xa8b}, {0xa8d, 0xa8d}, {0xa8f, 0xa91}, - {0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab2, 0xab3}, {0xab5, 0xab9}, - {0xabd, 0xabd}, {0xae0, 0xae0}, {0xb05, 0xb0c}, {0xb0f, 0xb10}, - {0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb32, 0xb33}, {0xb36, 0xb39}, - {0xb3d, 0xb3d}, {0xb5c, 0xb5d}, {0xb5f, 0xb61}, {0xb85, 0xb8a}, - {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xb99, 0xb9a}, {0xb9c, 0xb9c}, - {0xb9e, 0xb9f}, {0xba3, 0xba4}, {0xba8, 0xbaa}, {0xbae, 0xbb5}, - {0xbb7, 0xbb9}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, - {0xc2a, 0xc33}, {0xc35, 0xc39}, {0xc60, 0xc61}, {0xc85, 0xc8c}, - {0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, - {0xcde, 0xcde}, {0xce0, 0xce1}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, - {0xd12, 0xd28}, {0xd2a, 0xd39}, {0xd60, 0xd61}, {0xe01, 0xe2e}, - {0xe30, 0xe30}, {0xe32, 0xe33}, {0xe40, 0xe45}, {0xe81, 0xe82}, - {0xe84, 0xe84}, {0xe87, 0xe88}, {0xe8a, 0xe8a}, {0xe8d, 0xe8d}, - {0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xea5, 0xea5}, - {0xea7, 0xea7}, {0xeaa, 0xeab}, {0xead, 0xeae}, {0xeb0, 0xeb0}, - {0xeb2, 0xeb3}, {0xebd, 0xebd}, {0xec0, 0xec4}, {0xf40, 0xf47}, - {0xf49, 0xf69}, {0x10a0, 0x10c5}, {0x10d0, 0x10f6}, {0x1100, 0x1100}, - {0x1102, 0x1103}, {0x1105, 0x1107}, {0x1109, 0x1109}, {0x110b, 0x110c}, - {0x110e, 0x1112}, {0x113c, 0x113c}, {0x113e, 0x113e}, {0x1140, 0x1140}, - {0x114c, 0x114c}, {0x114e, 0x114e}, {0x1150, 0x1150}, {0x1154, 0x1155}, - {0x1159, 0x1159}, {0x115f, 0x1161}, {0x1163, 0x1163}, {0x1165, 0x1165}, - {0x1167, 0x1167}, {0x1169, 0x1169}, {0x116d, 0x116e}, {0x1172, 0x1173}, - {0x1175, 0x1175}, {0x119e, 0x119e}, {0x11a8, 0x11a8}, {0x11ab, 0x11ab}, - {0x11ae, 0x11af}, {0x11b7, 0x11b8}, {0x11ba, 0x11ba}, {0x11bc, 0x11c2}, - {0x11eb, 0x11eb}, {0x11f0, 0x11f0}, {0x11f9, 0x11f9}, {0x1e00, 0x1e9b}, - {0x1ea0, 0x1ef9}, {0x1f00, 0x1f15}, {0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, - {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f59, 0x1f59}, {0x1f5b, 0x1f5b}, - {0x1f5d, 0x1f5d}, {0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc}, - {0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fcc}, {0x1fd0, 0x1fd3}, - {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffc}, - {0x2126, 0x2126}, {0x212a, 0x212b}, {0x212e, 0x212e}, {0x2180, 0x2182}, - {0x3041, 0x3094}, {0x30a1, 0x30fa}, {0x3105, 0x312c}, {0xac00, 0xd7a3}}; -const xmlChRangeGroup xmlIsBaseCharGroup = - {197, 0, xmlIsBaseChar_srng, (xmlChLRangePtr)0}; - -static const xmlChSRange xmlIsChar_srng[] = { {0x100, 0xd7ff}, - {0xe000, 0xfffd}}; -static const xmlChLRange xmlIsChar_lrng[] = { {0x10000, 0x10ffff}}; -const xmlChRangeGroup xmlIsCharGroup = - {2, 1, xmlIsChar_srng, xmlIsChar_lrng}; - -static const xmlChSRange xmlIsCombining_srng[] = { {0x300, 0x345}, - {0x360, 0x361}, {0x483, 0x486}, {0x591, 0x5a1}, {0x5a3, 0x5b9}, - {0x5bb, 0x5bd}, {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4}, - {0x64b, 0x652}, {0x670, 0x670}, {0x6d6, 0x6dc}, {0x6dd, 0x6df}, - {0x6e0, 0x6e4}, {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x901, 0x903}, - {0x93c, 0x93c}, {0x93e, 0x94c}, {0x94d, 0x94d}, {0x951, 0x954}, - {0x962, 0x963}, {0x981, 0x983}, {0x9bc, 0x9bc}, {0x9be, 0x9be}, - {0x9bf, 0x9bf}, {0x9c0, 0x9c4}, {0x9c7, 0x9c8}, {0x9cb, 0x9cd}, - {0x9d7, 0x9d7}, {0x9e2, 0x9e3}, {0xa02, 0xa02}, {0xa3c, 0xa3c}, - {0xa3e, 0xa3e}, {0xa3f, 0xa3f}, {0xa40, 0xa42}, {0xa47, 0xa48}, - {0xa4b, 0xa4d}, {0xa70, 0xa71}, {0xa81, 0xa83}, {0xabc, 0xabc}, - {0xabe, 0xac5}, {0xac7, 0xac9}, {0xacb, 0xacd}, {0xb01, 0xb03}, - {0xb3c, 0xb3c}, {0xb3e, 0xb43}, {0xb47, 0xb48}, {0xb4b, 0xb4d}, - {0xb56, 0xb57}, {0xb82, 0xb83}, {0xbbe, 0xbc2}, {0xbc6, 0xbc8}, - {0xbca, 0xbcd}, {0xbd7, 0xbd7}, {0xc01, 0xc03}, {0xc3e, 0xc44}, - {0xc46, 0xc48}, {0xc4a, 0xc4d}, {0xc55, 0xc56}, {0xc82, 0xc83}, - {0xcbe, 0xcc4}, {0xcc6, 0xcc8}, {0xcca, 0xccd}, {0xcd5, 0xcd6}, - {0xd02, 0xd03}, {0xd3e, 0xd43}, {0xd46, 0xd48}, {0xd4a, 0xd4d}, - {0xd57, 0xd57}, {0xe31, 0xe31}, {0xe34, 0xe3a}, {0xe47, 0xe4e}, - {0xeb1, 0xeb1}, {0xeb4, 0xeb9}, {0xebb, 0xebc}, {0xec8, 0xecd}, - {0xf18, 0xf19}, {0xf35, 0xf35}, {0xf37, 0xf37}, {0xf39, 0xf39}, - {0xf3e, 0xf3e}, {0xf3f, 0xf3f}, {0xf71, 0xf84}, {0xf86, 0xf8b}, - {0xf90, 0xf95}, {0xf97, 0xf97}, {0xf99, 0xfad}, {0xfb1, 0xfb7}, - {0xfb9, 0xfb9}, {0x20d0, 0x20dc}, {0x20e1, 0x20e1}, {0x302a, 0x302f}, - {0x3099, 0x3099}, {0x309a, 0x309a}}; -const xmlChRangeGroup xmlIsCombiningGroup = - {95, 0, xmlIsCombining_srng, (xmlChLRangePtr)0}; - -static const xmlChSRange xmlIsDigit_srng[] = { {0x660, 0x669}, - {0x6f0, 0x6f9}, {0x966, 0x96f}, {0x9e6, 0x9ef}, {0xa66, 0xa6f}, - {0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbef}, {0xc66, 0xc6f}, - {0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, - {0xf20, 0xf29}}; -const xmlChRangeGroup xmlIsDigitGroup = - {14, 0, xmlIsDigit_srng, (xmlChLRangePtr)0}; - -static const xmlChSRange xmlIsExtender_srng[] = { {0x2d0, 0x2d0}, - {0x2d1, 0x2d1}, {0x387, 0x387}, {0x640, 0x640}, {0xe46, 0xe46}, - {0xec6, 0xec6}, {0x3005, 0x3005}, {0x3031, 0x3035}, {0x309d, 0x309e}, - {0x30fc, 0x30fe}}; -const xmlChRangeGroup xmlIsExtenderGroup = - {10, 0, xmlIsExtender_srng, (xmlChLRangePtr)0}; - -static const xmlChSRange xmlIsIdeographic_srng[] = { {0x3007, 0x3007}, - {0x3021, 0x3029}, {0x4e00, 0x9fa5}}; -const xmlChRangeGroup xmlIsIdeographicGroup = - {3, 0, xmlIsIdeographic_srng, (xmlChLRangePtr)0}; - - -/** - * xmlCharInRange: - * @val: character to be validated - * @rptr: pointer to range to be used to validate - * - * Does a binary search of the range table to determine if char - * is valid - * - * Returns: true if character valid, false otherwise - */ -int -xmlCharInRange (unsigned int val, const xmlChRangeGroup *rptr) { - int low, high, mid; - const xmlChSRange *sptr; - const xmlChLRange *lptr; - - if (rptr == NULL) return(0); - if (val < 0x10000) { /* is val in 'short' or 'long' array? */ - if (rptr->nbShortRange == 0) - return 0; - low = 0; - high = rptr->nbShortRange - 1; - sptr = rptr->shortRange; - while (low <= high) { - mid = (low + high) / 2; - if ((unsigned short) val < sptr[mid].low) { - high = mid - 1; - } else { - if ((unsigned short) val > sptr[mid].high) { - low = mid + 1; - } else { - return 1; - } - } - } - } else { - if (rptr->nbLongRange == 0) { - return 0; - } - low = 0; - high = rptr->nbLongRange - 1; - lptr = rptr->longRange; - while (low <= high) { - mid = (low + high) / 2; - if (val < lptr[mid].low) { - high = mid - 1; - } else { - if (val > lptr[mid].high) { - low = mid + 1; - } else { - return 1; - } - } - } - } - return 0; -} - - -/** - * xmlIsBaseChar: - * @ch: character to validate - * - * This function is DEPRECATED. - * Use xmlIsBaseChar_ch or xmlIsBaseCharQ instead - * - * Returns true if argument valid, false otherwise - */ -int -xmlIsBaseChar(unsigned int ch) { - return(xmlIsBaseCharQ(ch)); -} - - -/** - * xmlIsBlank: - * @ch: character to validate - * - * This function is DEPRECATED. - * Use xmlIsBlank_ch or xmlIsBlankQ instead - * - * Returns true if argument valid, false otherwise - */ -int -xmlIsBlank(unsigned int ch) { - return(xmlIsBlankQ(ch)); -} - - -/** - * xmlIsChar: - * @ch: character to validate - * - * This function is DEPRECATED. - * Use xmlIsChar_ch or xmlIsCharQ instead - * - * Returns true if argument valid, false otherwise - */ -int -xmlIsChar(unsigned int ch) { - return(xmlIsCharQ(ch)); -} - - -/** - * xmlIsCombining: - * @ch: character to validate - * - * This function is DEPRECATED. - * Use xmlIsCombiningQ instead - * - * Returns true if argument valid, false otherwise - */ -int -xmlIsCombining(unsigned int ch) { - return(xmlIsCombiningQ(ch)); -} - - -/** - * xmlIsDigit: - * @ch: character to validate - * - * This function is DEPRECATED. - * Use xmlIsDigit_ch or xmlIsDigitQ instead - * - * Returns true if argument valid, false otherwise - */ -int -xmlIsDigit(unsigned int ch) { - return(xmlIsDigitQ(ch)); -} - - -/** - * xmlIsExtender: - * @ch: character to validate - * - * This function is DEPRECATED. - * Use xmlIsExtender_ch or xmlIsExtenderQ instead - * - * Returns true if argument valid, false otherwise - */ -int -xmlIsExtender(unsigned int ch) { - return(xmlIsExtenderQ(ch)); -} - - -/** - * xmlIsIdeographic: - * @ch: character to validate - * - * This function is DEPRECATED. - * Use xmlIsIdeographicQ instead - * - * Returns true if argument valid, false otherwise - */ -int -xmlIsIdeographic(unsigned int ch) { - return(xmlIsIdeographicQ(ch)); -} - - -/** - * xmlIsPubidChar: - * @ch: character to validate - * - * This function is DEPRECATED. - * Use xmlIsPubidChar_ch or xmlIsPubidCharQ instead - * - * Returns true if argument valid, false otherwise - */ -int -xmlIsPubidChar(unsigned int ch) { - return(xmlIsPubidCharQ(ch)); -} - -#define bottom_chvalid -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/config_cmake.h.in b/ThirdParty/libxml2/vtklibxml2/config_cmake.h.in deleted file mode 100644 index 156ff4c3378..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/config_cmake.h.in +++ /dev/null @@ -1,263 +0,0 @@ -/* Define if getaddrinfo is there */ -#cmakedefine HAVE_GETADDRINFO - -/* Define to 1 if you have the <ansidecl.h> header file. */ -#cmakedefine HAVE_ANSIDECL_H 1 - -/* Define to 1 if you have the <arpa/inet.h> header file. */ -#cmakedefine HAVE_ARPA_INET_H 1 - -/* Define to 1 if you have the <arpa/nameser.h> header file. */ -#cmakedefine HAVE_ARPA_NAMESER_H 1 - -/* Whether struct sockaddr::__ss_family exists */ -#cmakedefine HAVE_BROKEN_SS_FAMILY - -/* Define to 1 if you have the `class' function. */ -#cmakedefine HAVE_CLASS - -/* Define to 1 if you have the <ctype.h> header file. */ -#cmakedefine HAVE_CTYPE_H 1 - -/* Define to 1 if you have the <dirent.h> header file. */ -#cmakedefine HAVE_DIRENT_H 1 - -/* Define to 1 if you have the <dlfcn.h> header file. */ -#cmakedefine HAVE_DLFCN_H 1 - -/* Have dlopen based dso */ -#cmakedefine HAVE_DLOPEN - -/* Define to 1 if you have the <dl.h> header file. */ -#cmakedefine HAVE_DL_H 1 - -/* Define to 1 if you have the <errno.h> header file. */ -#cmakedefine HAVE_ERRNO_H 1 - -/* Define to 1 if you have the <fcntl.h> header file. */ -#cmakedefine HAVE_FCNTL_H 1 - -/* Define to 1 if you have the `finite' function. */ -#cmakedefine HAVE_FINITE 1 - -/* Define to 1 if you have the <float.h> header file. */ -#cmakedefine HAVE_FLOAT_H 1 - -/* Define to 1 if you have the `fpclass' function. */ -#cmakedefine HAVE_FPCLASS 1 - -/* Define to 1 if you have the `fprintf' function. */ -#cmakedefine HAVE_FPRINTF 1 - -/* Define to 1 if you have the `fp_class' function. */ -#cmakedefine HAVE_FP_CLASS 1 - -/* Define to 1 if you have the <fp_class.h> header file. */ -#cmakedefine HAVE_FP_CLASS_H 1 - -/* Define to 1 if you have the `ftime' function. */ -#cmakedefine HAVE_FTIME 1 - -/* Define to 1 if you have the `gettimeofday' function. */ -#cmakedefine HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the <ieeefp.h> header file. */ -#cmakedefine HAVE_IEEEFP_H 1 - -/* Define to 1 if you have the <inttypes.h> header file. */ -#cmakedefine HAVE_INTTYPES_H 1 - -/* Define if history library is there (-lhistory) */ -#cmakedefine HAVE_LIBHISTORY - -/* Define if readline library is there (-lreadline) */ -#cmakedefine HAVE_LIBREADLINE - -/* Have compression library */ -#cmakedefine HAVE_LIBZ 1 - -/* Define to 1 if you have the <limits.h> header file. */ -#cmakedefine HAVE_LIMITS_H 1 - -/* Define to 1 if you have the `localtime' function. */ -#cmakedefine HAVE_LOCALTIME 1 - -/* Define to 1 if you have the <malloc.h> header file. */ -#cmakedefine HAVE_MALLOC_H 1 - -/* Define to 1 if you have the <math.h> header file. */ -#cmakedefine HAVE_MATH_H 1 - -/* Define to 1 if you have the <memory.h> header file. */ -#cmakedefine HAVE_MEMORY_H 1 - -/* Define to 1 if you have the <nan.h> header file. */ -#cmakedefine HAVE_NAN_H 1 - -/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ -#cmakedefine HAVE_NDIR_H 1 - -/* Define to 1 if you have the <netdb.h> header file. */ -#cmakedefine HAVE_NETDB_H 1 - -/* Define to 1 if you have the <netinet/in.h> header file. */ -#cmakedefine HAVE_NETINET_IN_H 1 - -/* Define to 1 if you have the `printf' function. */ -#cmakedefine HAVE_PRINTF 1 - -/* Define if <pthread.h> is there */ -#cmakedefine HAVE_PTHREAD_H - -/* Define to 1 if you have the <resolv.h> header file. */ -#cmakedefine HAVE_RESOLV_H 1 - -/* Have shl_load based dso */ -#cmakedefine HAVE_SHLLOAD 1 - -/* Define to 1 if you have the `signal' function. */ -#cmakedefine HAVE_SIGNAL 1 - -/* Define to 1 if you have the <signal.h> header file. */ -#cmakedefine HAVE_SIGNAL_H 1 - -/* Define to 1 if you have the `snprintf' function. */ -#cmakedefine HAVE_SNPRINTF 1 - -/* Define to 1 if you have the `sprintf' function. */ -#cmakedefine HAVE_SPRINTF 1 - -/* Define to 1 if you have the `sscanf' function. */ -#cmakedefine HAVE_SSCANF 1 - -/* Define to 1 if you have the `stat' function. */ -#cmakedefine HAVE_STAT 1 - -/* Define to 1 if you have the <stdarg.h> header file. */ -#cmakedefine HAVE_STDARG_H 1 - -/* Define to 1 if you have the <stdint.h> header file. */ -#cmakedefine HAVE_STDINT_H 1 - -/* Define to 1 if you have the <stdlib.h> header file. */ -#cmakedefine HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `strdup' function. */ -#cmakedefine HAVE_STRDUP 1 - -/* Define to 1 if you have the `strerror' function. */ -#cmakedefine HAVE_STRERROR 1 - -/* Define to 1 if you have the `strftime' function. */ -#cmakedefine HAVE_STRFTIME 1 - -/* Define to 1 if you have the <strings.h> header file. */ -#cmakedefine HAVE_STRINGS_H 1 - -/* Define to 1 if you have the <string.h> header file. */ -#cmakedefine HAVE_STRING_H 1 - -/* Define to 1 if you have the `strndup' function. */ -#cmakedefine HAVE_STRNDUP 1 - -/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'. - */ -#cmakedefine HAVE_SYS_DIR_H 1 - -/* Define to 1 if you have the <sys/mman.h> header file. */ -#cmakedefine HAVE_SYS_MMAN_H 1 - -/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'. - */ -#cmakedefine HAVE_SYS_NDIR_H 1 - -/* Define to 1 if you have the <sys/select.h> header file. */ -#cmakedefine HAVE_SYS_SELECT_H 1 - -/* Define to 1 if you have the <sys/socket.h> header file. */ -#cmakedefine HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#cmakedefine HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the <sys/timeb.h> header file. */ -#cmakedefine HAVE_SYS_TIMEB_H 1 - -/* Define to 1 if you have the <sys/time.h> header file. */ -#cmakedefine HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the <sys/types.h> header file. */ -#cmakedefine HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the <time.h> header file. */ -#cmakedefine HAVE_TIME_H 1 - -/* Define to 1 if you have the <unistd.h> header file. */ -#cmakedefine HAVE_UNISTD_H 1 - -/* Whether va_copy() is available */ -#cmakedefine HAVE_VA_COPY 1 - -/* Define to 1 if you have the `vfprintf' function. */ -#cmakedefine HAVE_VFPRINTF 1 - -/* Define to 1 if you have the `vsnprintf' function. */ -#cmakedefine HAVE_VSNPRINTF 1 - -/* Define to 1 if you have the `vsprintf' function. */ -#cmakedefine HAVE_VSPRINTF 1 - -/* Define to 1 if you have the <vtk_zlib.h> header file. */ -#cmakedefine HAVE_VTK_ZLIB_H - -/* Define to 1 if you have the <zlib.h> header file. */ -#cmakedefine HAVE_ZLIB_H 1 - -/* Define to 1 if you have the `_stat' function. */ -#cmakedefine HAVE__STAT 1 - -/* Whether __va_copy() is available */ -#cmakedefine HAVE___VA_COPY 1 - -/* Name of package */ -#cmakedefine PACKAGE "@PACKAGE@" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "@PACKAGE_NAME@" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "@PACKAGE_STRING@" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "@PACKAGE_TARNAME@" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "@PACKAGE_VERSION@" - -/* Support for IPv6 */ -#cmakedefine SUPPORT_IP6 - -/* Version number of package */ -#cmakedefine VERSION "@VERSION@" - -/* Determine what socket length (socklen_t) data type is */ -#cmakedefine XML_SOCKLEN_T @XML_SOCKLEN_T@ - -/* Using the Win32 Socket implementation */ -#cmakedefine _WINSOCKAPI_ - -/* Win32 Std C name mangling work-around */ -#if defined(_MSC_VER) && !defined(HAVE_SNPRINTF) -# define snprintf _snprintf -#endif - -/* ss_family is not defined here, use __ss_family instead */ -/* #undef ss_family */ - -/* Win32 Std C name mangling work-around */ -#if defined(_MSC_VER) && (_MSC_VER < 1500) && !defined(HAVE_VSNPRINTF) -# define vsnprintf _vsnprintf -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/debugXML.c b/ThirdParty/libxml2/vtklibxml2/debugXML.c deleted file mode 100644 index 93d400228b8..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/debugXML.c +++ /dev/null @@ -1,3264 +0,0 @@ -/* - * debugXML.c : This is a set of routines used for debugging the tree - * produced by the XML parser. - * - * See Copyright for the status of this software. - * - * Daniel Veillard <daniel@veillard.com> - */ - -#define IN_LIBXML -#include "libxml.h" -#ifdef LIBXML_DEBUG_ENABLED - -#include <string.h> -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/valid.h> -#include <libxml/debugXML.h> -#include <libxml/HTMLtree.h> -#include <libxml/HTMLparser.h> -#include <libxml/xmlerror.h> -#include <libxml/globals.h> -#include <libxml/xpathInternals.h> -#include <libxml/uri.h> -#ifdef LIBXML_SCHEMAS_ENABLED -#include <libxml/relaxng.h> -#endif - -#define DUMP_TEXT_TYPE 1 - -typedef struct _xmlDebugCtxt xmlDebugCtxt; -typedef xmlDebugCtxt *xmlDebugCtxtPtr; -struct _xmlDebugCtxt { - FILE *output; /* the output file */ - char shift[101]; /* used for indenting */ - int depth; /* current depth */ - xmlDocPtr doc; /* current document */ - xmlNodePtr node; /* current node */ - xmlDictPtr dict; /* the doc dictionnary */ - int check; /* do just checkings */ - int errors; /* number of errors found */ - int nodict; /* if the document has no dictionnary */ - int options; /* options */ -}; - -static void xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node); - -static void -xmlCtxtDumpInitCtxt(xmlDebugCtxtPtr ctxt) -{ - int i; - - ctxt->depth = 0; - ctxt->check = 0; - ctxt->errors = 0; - ctxt->output = stdout; - ctxt->doc = NULL; - ctxt->node = NULL; - ctxt->dict = NULL; - ctxt->nodict = 0; - ctxt->options = 0; - for (i = 0; i < 100; i++) - ctxt->shift[i] = ' '; - ctxt->shift[100] = 0; -} - -static void -xmlCtxtDumpCleanCtxt(xmlDebugCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - /* remove the ATTRIBUTE_UNUSED when this is added */ -} - -/** - * xmlNsCheckScope: - * @node: the node - * @ns: the namespace node - * - * Check that a given namespace is in scope on a node. - * - * Returns 1 if in scope, -1 in case of argument error, - * -2 if the namespace is not in scope, and -3 if not on - * an ancestor node. - */ -static int -xmlNsCheckScope(xmlNodePtr node, xmlNsPtr ns) -{ - xmlNsPtr cur; - - if ((node == NULL) || (ns == NULL)) - return(-1); - - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE) && - (node->type != XML_DOCUMENT_NODE) && - (node->type != XML_TEXT_NODE) && - (node->type != XML_HTML_DOCUMENT_NODE) && - (node->type != XML_XINCLUDE_START)) - return(-2); - - while ((node != NULL) && - ((node->type == XML_ELEMENT_NODE) || - (node->type == XML_ATTRIBUTE_NODE) || - (node->type == XML_TEXT_NODE) || - (node->type == XML_XINCLUDE_START))) { - if ((node->type == XML_ELEMENT_NODE) || - (node->type == XML_XINCLUDE_START)) { - cur = node->nsDef; - while (cur != NULL) { - if (cur == ns) - return(1); - if (xmlStrEqual(cur->prefix, ns->prefix)) - return(-2); - cur = cur->next; - } - } - node = node->parent; - } - /* the xml namespace may be declared on the document node */ - if ((node != NULL) && - ((node->type == XML_DOCUMENT_NODE) || - (node->type == XML_HTML_DOCUMENT_NODE))) { - xmlNsPtr oldNs = ((xmlDocPtr) node)->oldNs; - if (oldNs == ns) - return(1); - } - return(-3); -} - -static void -xmlCtxtDumpSpaces(xmlDebugCtxtPtr ctxt) -{ - if (ctxt->check) - return; - if ((ctxt->output != NULL) && (ctxt->depth > 0)) { - if (ctxt->depth < 50) - fprintf(ctxt->output, &ctxt->shift[100 - 2 * ctxt->depth]); - else - fprintf(ctxt->output, ctxt->shift); - } -} - -/** - * xmlDebugErr: - * @ctxt: a debug context - * @error: the error code - * - * Handle a debug error. - */ -static void -xmlDebugErr(xmlDebugCtxtPtr ctxt, int error, const char *msg) -{ - ctxt->errors++; - __xmlRaiseError(NULL, NULL, NULL, - NULL, ctxt->node, XML_FROM_CHECK, - error, XML_ERR_ERROR, NULL, 0, - NULL, NULL, NULL, 0, 0, - msg); -} -static void -xmlDebugErr2(xmlDebugCtxtPtr ctxt, int error, const char *msg, int extra) -{ - ctxt->errors++; - __xmlRaiseError(NULL, NULL, NULL, - NULL, ctxt->node, XML_FROM_CHECK, - error, XML_ERR_ERROR, NULL, 0, - NULL, NULL, NULL, 0, 0, - msg, extra); -} -static void -xmlDebugErr3(xmlDebugCtxtPtr ctxt, int error, const char *msg, const char *extra) -{ - ctxt->errors++; - __xmlRaiseError(NULL, NULL, NULL, - NULL, ctxt->node, XML_FROM_CHECK, - error, XML_ERR_ERROR, NULL, 0, - NULL, NULL, NULL, 0, 0, - msg, extra); -} - -/** - * xmlCtxtNsCheckScope: - * @ctxt: the debugging context - * @node: the node - * @ns: the namespace node - * - * Report if a given namespace is is not in scope. - */ -static void -xmlCtxtNsCheckScope(xmlDebugCtxtPtr ctxt, xmlNodePtr node, xmlNsPtr ns) -{ - int ret; - - ret = xmlNsCheckScope(node, ns); - if (ret == -2) { - if (ns->prefix == NULL) - xmlDebugErr(ctxt, XML_CHECK_NS_SCOPE, - "Reference to default namespace not in scope\n"); - else - xmlDebugErr3(ctxt, XML_CHECK_NS_SCOPE, - "Reference to namespace '%s' not in scope\n", - (char *) ns->prefix); - } - if (ret == -3) { - if (ns->prefix == NULL) - xmlDebugErr(ctxt, XML_CHECK_NS_ANCESTOR, - "Reference to default namespace not on ancestor\n"); - else - xmlDebugErr3(ctxt, XML_CHECK_NS_ANCESTOR, - "Reference to namespace '%s' not on ancestor\n", - (char *) ns->prefix); - } -} - -/** - * xmlCtxtCheckString: - * @ctxt: the debug context - * @str: the string - * - * Do debugging on the string, currently it just checks the UTF-8 content - */ -static void -xmlCtxtCheckString(xmlDebugCtxtPtr ctxt, const xmlChar * str) -{ - if (str == NULL) return; - if (ctxt->check) { - if (!xmlCheckUTF8(str)) { - xmlDebugErr3(ctxt, XML_CHECK_NOT_UTF8, - "String is not UTF-8 %s", (const char *) str); - } - } -} - -/** - * xmlCtxtCheckName: - * @ctxt: the debug context - * @name: the name - * - * Do debugging on the name, for example the dictionnary status and - * conformance to the Name production. - */ -static void -xmlCtxtCheckName(xmlDebugCtxtPtr ctxt, const xmlChar * name) -{ - if (ctxt->check) { - if (name == NULL) { - xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Name is NULL"); - return; - } - if (xmlValidateName(name, 0)) { - xmlDebugErr3(ctxt, XML_CHECK_NOT_NCNAME, - "Name is not an NCName '%s'", (const char *) name); - } - if ((ctxt->dict != NULL) && - (!xmlDictOwns(ctxt->dict, name))) { - xmlDebugErr3(ctxt, XML_CHECK_OUTSIDE_DICT, - "Name is not from the document dictionnary '%s'", - (const char *) name); - } - } -} - -static void -xmlCtxtGenericNodeCheck(xmlDebugCtxtPtr ctxt, xmlNodePtr node) { - xmlDocPtr doc; - xmlDictPtr dict; - - doc = node->doc; - - if (node->parent == NULL) - xmlDebugErr(ctxt, XML_CHECK_NO_PARENT, - "Node has no parent\n"); - if (node->doc == NULL) { - xmlDebugErr(ctxt, XML_CHECK_NO_DOC, - "Node has no doc\n"); - dict = NULL; - } else { - dict = doc->dict; - if ((dict == NULL) && (ctxt->nodict == 0)) { -#if 0 - /* desactivated right now as it raises too many errors */ - if (doc->type == XML_DOCUMENT_NODE) - xmlDebugErr(ctxt, XML_CHECK_NO_DICT, - "Document has no dictionnary\n"); -#endif - ctxt->nodict = 1; - } - if (ctxt->doc == NULL) - ctxt->doc = doc; - - if (ctxt->dict == NULL) { - ctxt->dict = dict; - } - } - if ((node->parent != NULL) && (node->doc != node->parent->doc) && - (!xmlStrEqual(node->name, BAD_CAST "pseudoroot"))) - xmlDebugErr(ctxt, XML_CHECK_WRONG_DOC, - "Node doc differs from parent's one\n"); - if (node->prev == NULL) { - if (node->type == XML_ATTRIBUTE_NODE) { - if ((node->parent != NULL) && - (node != (xmlNodePtr) node->parent->properties)) - xmlDebugErr(ctxt, XML_CHECK_NO_PREV, - "Attr has no prev and not first of attr list\n"); - - } else if ((node->parent != NULL) && (node->parent->children != node)) - xmlDebugErr(ctxt, XML_CHECK_NO_PREV, - "Node has no prev and not first of parent list\n"); - } else { - if (node->prev->next != node) - xmlDebugErr(ctxt, XML_CHECK_WRONG_PREV, - "Node prev->next : back link wrong\n"); - } - if (node->next == NULL) { - if ((node->parent != NULL) && (node->type != XML_ATTRIBUTE_NODE) && - (node->parent->last != node)) - xmlDebugErr(ctxt, XML_CHECK_NO_NEXT, - "Node has no next and not last of parent list\n"); - } else { - if (node->next->prev != node) - xmlDebugErr(ctxt, XML_CHECK_WRONG_NEXT, - "Node next->prev : forward link wrong\n"); - if (node->next->parent != node->parent) - xmlDebugErr(ctxt, XML_CHECK_WRONG_PARENT, - "Node next->prev : forward link wrong\n"); - } - if (node->type == XML_ELEMENT_NODE) { - xmlNsPtr ns; - - ns = node->nsDef; - while (ns != NULL) { - xmlCtxtNsCheckScope(ctxt, node, ns); - ns = ns->next; - } - if (node->ns != NULL) - xmlCtxtNsCheckScope(ctxt, node, node->ns); - } else if (node->type == XML_ATTRIBUTE_NODE) { - if (node->ns != NULL) - xmlCtxtNsCheckScope(ctxt, node, node->ns); - } - - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE) && - (node->type != XML_ELEMENT_DECL) && - (node->type != XML_ATTRIBUTE_DECL) && - (node->type != XML_DTD_NODE) && - (node->type != XML_ELEMENT_DECL) && - (node->type != XML_HTML_DOCUMENT_NODE) && - (node->type != XML_DOCUMENT_NODE)) { - if (node->content != NULL) - xmlCtxtCheckString(ctxt, (const xmlChar *) node->content); - } - switch (node->type) { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - xmlCtxtCheckName(ctxt, node->name); - break; - case XML_TEXT_NODE: - if ((node->name == xmlStringText) || - (node->name == xmlStringTextNoenc)) - break; - /* some case of entity substitution can lead to this */ - if ((ctxt->dict != NULL) && - (node->name == xmlDictLookup(ctxt->dict, BAD_CAST "nbktext", - 7))) - break; - - xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME, - "Text node has wrong name '%s'", - (const char *) node->name); - break; - case XML_COMMENT_NODE: - if (node->name == xmlStringComment) - break; - xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME, - "Comment node has wrong name '%s'", - (const char *) node->name); - break; - case XML_PI_NODE: - xmlCtxtCheckName(ctxt, node->name); - break; - case XML_CDATA_SECTION_NODE: - if (node->name == NULL) - break; - xmlDebugErr3(ctxt, XML_CHECK_NAME_NOT_NULL, - "CData section has non NULL name '%s'", - (const char *) node->name); - break; - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: - break; - } -} - -static void -xmlCtxtDumpString(xmlDebugCtxtPtr ctxt, const xmlChar * str) -{ - int i; - - if (ctxt->check) { - return; - } - /* TODO: check UTF8 content of the string */ - if (str == NULL) { - fprintf(ctxt->output, "(NULL)"); - return; - } - for (i = 0; i < 40; i++) - if (str[i] == 0) - return; - else if (IS_BLANK_CH(str[i])) - fputc(' ', ctxt->output); - else if (str[i] >= 0x80) - fprintf(ctxt->output, "#%X", str[i]); - else - fputc(str[i], ctxt->output); - fprintf(ctxt->output, "..."); -} - -static void -xmlCtxtDumpDtdNode(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd) -{ - xmlCtxtDumpSpaces(ctxt); - - if (dtd == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "DTD node is NULL\n"); - return; - } - - if (dtd->type != XML_DTD_NODE) { - xmlDebugErr(ctxt, XML_CHECK_NOT_DTD, - "Node is not a DTD"); - return; - } - if (!ctxt->check) { - if (dtd->name != NULL) - fprintf(ctxt->output, "DTD(%s)", (char *) dtd->name); - else - fprintf(ctxt->output, "DTD"); - if (dtd->ExternalID != NULL) - fprintf(ctxt->output, ", PUBLIC %s", (char *) dtd->ExternalID); - if (dtd->SystemID != NULL) - fprintf(ctxt->output, ", SYSTEM %s", (char *) dtd->SystemID); - fprintf(ctxt->output, "\n"); - } - /* - * Do a bit of checking - */ - xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) dtd); -} - -static void -xmlCtxtDumpAttrDecl(xmlDebugCtxtPtr ctxt, xmlAttributePtr attr) -{ - xmlCtxtDumpSpaces(ctxt); - - if (attr == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "Attribute declaration is NULL\n"); - return; - } - if (attr->type != XML_ATTRIBUTE_DECL) { - xmlDebugErr(ctxt, XML_CHECK_NOT_ATTR_DECL, - "Node is not an attribute declaration"); - return; - } - if (attr->name != NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "ATTRDECL(%s)", (char *) attr->name); - } else - xmlDebugErr(ctxt, XML_CHECK_NO_NAME, - "Node attribute declaration has no name"); - if (attr->elem != NULL) { - if (!ctxt->check) - fprintf(ctxt->output, " for %s", (char *) attr->elem); - } else - xmlDebugErr(ctxt, XML_CHECK_NO_ELEM, - "Node attribute declaration has no element name"); - if (!ctxt->check) { - switch (attr->atype) { - case XML_ATTRIBUTE_CDATA: - fprintf(ctxt->output, " CDATA"); - break; - case XML_ATTRIBUTE_ID: - fprintf(ctxt->output, " ID"); - break; - case XML_ATTRIBUTE_IDREF: - fprintf(ctxt->output, " IDREF"); - break; - case XML_ATTRIBUTE_IDREFS: - fprintf(ctxt->output, " IDREFS"); - break; - case XML_ATTRIBUTE_ENTITY: - fprintf(ctxt->output, " ENTITY"); - break; - case XML_ATTRIBUTE_ENTITIES: - fprintf(ctxt->output, " ENTITIES"); - break; - case XML_ATTRIBUTE_NMTOKEN: - fprintf(ctxt->output, " NMTOKEN"); - break; - case XML_ATTRIBUTE_NMTOKENS: - fprintf(ctxt->output, " NMTOKENS"); - break; - case XML_ATTRIBUTE_ENUMERATION: - fprintf(ctxt->output, " ENUMERATION"); - break; - case XML_ATTRIBUTE_NOTATION: - fprintf(ctxt->output, " NOTATION "); - break; - } - if (attr->tree != NULL) { - int indx; - xmlEnumerationPtr cur = attr->tree; - - for (indx = 0; indx < 5; indx++) { - if (indx != 0) - fprintf(ctxt->output, "|%s", (char *) cur->name); - else - fprintf(ctxt->output, " (%s", (char *) cur->name); - cur = cur->next; - if (cur == NULL) - break; - } - if (cur == NULL) - fprintf(ctxt->output, ")"); - else - fprintf(ctxt->output, "...)"); - } - switch (attr->def) { - case XML_ATTRIBUTE_NONE: - break; - case XML_ATTRIBUTE_REQUIRED: - fprintf(ctxt->output, " REQUIRED"); - break; - case XML_ATTRIBUTE_IMPLIED: - fprintf(ctxt->output, " IMPLIED"); - break; - case XML_ATTRIBUTE_FIXED: - fprintf(ctxt->output, " FIXED"); - break; - } - if (attr->defaultValue != NULL) { - fprintf(ctxt->output, "\""); - xmlCtxtDumpString(ctxt, attr->defaultValue); - fprintf(ctxt->output, "\""); - } - fprintf(ctxt->output, "\n"); - } - - /* - * Do a bit of checking - */ - xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr); -} - -static void -xmlCtxtDumpElemDecl(xmlDebugCtxtPtr ctxt, xmlElementPtr elem) -{ - xmlCtxtDumpSpaces(ctxt); - - if (elem == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "Element declaration is NULL\n"); - return; - } - if (elem->type != XML_ELEMENT_DECL) { - xmlDebugErr(ctxt, XML_CHECK_NOT_ELEM_DECL, - "Node is not an element declaration"); - return; - } - if (elem->name != NULL) { - if (!ctxt->check) { - fprintf(ctxt->output, "ELEMDECL("); - xmlCtxtDumpString(ctxt, elem->name); - fprintf(ctxt->output, ")"); - } - } else - xmlDebugErr(ctxt, XML_CHECK_NO_NAME, - "Element declaration has no name"); - if (!ctxt->check) { - switch (elem->etype) { - case XML_ELEMENT_TYPE_UNDEFINED: - fprintf(ctxt->output, ", UNDEFINED"); - break; - case XML_ELEMENT_TYPE_EMPTY: - fprintf(ctxt->output, ", EMPTY"); - break; - case XML_ELEMENT_TYPE_ANY: - fprintf(ctxt->output, ", ANY"); - break; - case XML_ELEMENT_TYPE_MIXED: - fprintf(ctxt->output, ", MIXED "); - break; - case XML_ELEMENT_TYPE_ELEMENT: - fprintf(ctxt->output, ", MIXED "); - break; - } - if ((elem->type != XML_ELEMENT_NODE) && (elem->content != NULL)) { - char buf[5001]; - - buf[0] = 0; - xmlSnprintfElementContent(buf, 5000, elem->content, 1); - buf[5000] = 0; - fprintf(ctxt->output, "%s", buf); - } - fprintf(ctxt->output, "\n"); - } - - /* - * Do a bit of checking - */ - xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) elem); -} - -static void -xmlCtxtDumpEntityDecl(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent) -{ - xmlCtxtDumpSpaces(ctxt); - - if (ent == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "Entity declaration is NULL\n"); - return; - } - if (ent->type != XML_ENTITY_DECL) { - xmlDebugErr(ctxt, XML_CHECK_NOT_ENTITY_DECL, - "Node is not an entity declaration"); - return; - } - if (ent->name != NULL) { - if (!ctxt->check) { - fprintf(ctxt->output, "ENTITYDECL("); - xmlCtxtDumpString(ctxt, ent->name); - fprintf(ctxt->output, ")"); - } - } else - xmlDebugErr(ctxt, XML_CHECK_NO_NAME, - "Entity declaration has no name"); - if (!ctxt->check) { - switch (ent->etype) { - case XML_INTERNAL_GENERAL_ENTITY: - fprintf(ctxt->output, ", internal\n"); - break; - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - fprintf(ctxt->output, ", external parsed\n"); - break; - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - fprintf(ctxt->output, ", unparsed\n"); - break; - case XML_INTERNAL_PARAMETER_ENTITY: - fprintf(ctxt->output, ", parameter\n"); - break; - case XML_EXTERNAL_PARAMETER_ENTITY: - fprintf(ctxt->output, ", external parameter\n"); - break; - case XML_INTERNAL_PREDEFINED_ENTITY: - fprintf(ctxt->output, ", predefined\n"); - break; - } - if (ent->ExternalID) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, " ExternalID=%s\n", - (char *) ent->ExternalID); - } - if (ent->SystemID) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, " SystemID=%s\n", - (char *) ent->SystemID); - } - if (ent->URI != NULL) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, " URI=%s\n", (char *) ent->URI); - } - if (ent->content) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, " content="); - xmlCtxtDumpString(ctxt, ent->content); - fprintf(ctxt->output, "\n"); - } - } - - /* - * Do a bit of checking - */ - xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) ent); -} - -static void -xmlCtxtDumpNamespace(xmlDebugCtxtPtr ctxt, xmlNsPtr ns) -{ - xmlCtxtDumpSpaces(ctxt); - - if (ns == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "namespace node is NULL\n"); - return; - } - if (ns->type != XML_NAMESPACE_DECL) { - xmlDebugErr(ctxt, XML_CHECK_NOT_NS_DECL, - "Node is not a namespace declaration"); - return; - } - if (ns->href == NULL) { - if (ns->prefix != NULL) - xmlDebugErr3(ctxt, XML_CHECK_NO_HREF, - "Incomplete namespace %s href=NULL\n", - (char *) ns->prefix); - else - xmlDebugErr(ctxt, XML_CHECK_NO_HREF, - "Incomplete default namespace href=NULL\n"); - } else { - if (!ctxt->check) { - if (ns->prefix != NULL) - fprintf(ctxt->output, "namespace %s href=", - (char *) ns->prefix); - else - fprintf(ctxt->output, "default namespace href="); - - xmlCtxtDumpString(ctxt, ns->href); - fprintf(ctxt->output, "\n"); - } - } -} - -static void -xmlCtxtDumpNamespaceList(xmlDebugCtxtPtr ctxt, xmlNsPtr ns) -{ - while (ns != NULL) { - xmlCtxtDumpNamespace(ctxt, ns); - ns = ns->next; - } -} - -static void -xmlCtxtDumpEntity(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent) -{ - xmlCtxtDumpSpaces(ctxt); - - if (ent == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "Entity is NULL\n"); - return; - } - if (!ctxt->check) { - switch (ent->etype) { - case XML_INTERNAL_GENERAL_ENTITY: - fprintf(ctxt->output, "INTERNAL_GENERAL_ENTITY "); - break; - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - fprintf(ctxt->output, "EXTERNAL_GENERAL_PARSED_ENTITY "); - break; - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - fprintf(ctxt->output, "EXTERNAL_GENERAL_UNPARSED_ENTITY "); - break; - case XML_INTERNAL_PARAMETER_ENTITY: - fprintf(ctxt->output, "INTERNAL_PARAMETER_ENTITY "); - break; - case XML_EXTERNAL_PARAMETER_ENTITY: - fprintf(ctxt->output, "EXTERNAL_PARAMETER_ENTITY "); - break; - default: - fprintf(ctxt->output, "ENTITY_%d ! ", (int) ent->etype); - } - fprintf(ctxt->output, "%s\n", ent->name); - if (ent->ExternalID) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "ExternalID=%s\n", - (char *) ent->ExternalID); - } - if (ent->SystemID) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "SystemID=%s\n", (char *) ent->SystemID); - } - if (ent->URI) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "URI=%s\n", (char *) ent->URI); - } - if (ent->content) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "content="); - xmlCtxtDumpString(ctxt, ent->content); - fprintf(ctxt->output, "\n"); - } - } -} - -/** - * xmlCtxtDumpAttr: - * @output: the FILE * for the output - * @attr: the attribute - * @depth: the indentation level. - * - * Dumps debug information for the attribute - */ -static void -xmlCtxtDumpAttr(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr) -{ - xmlCtxtDumpSpaces(ctxt); - - if (attr == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "Attr is NULL"); - return; - } - if (!ctxt->check) { - fprintf(ctxt->output, "ATTRIBUTE "); - xmlCtxtDumpString(ctxt, attr->name); - fprintf(ctxt->output, "\n"); - if (attr->children != NULL) { - ctxt->depth++; - xmlCtxtDumpNodeList(ctxt, attr->children); - ctxt->depth--; - } - } - if (attr->name == NULL) - xmlDebugErr(ctxt, XML_CHECK_NO_NAME, - "Attribute has no name"); - - /* - * Do a bit of checking - */ - xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr); -} - -/** - * xmlCtxtDumpAttrList: - * @output: the FILE * for the output - * @attr: the attribute list - * @depth: the indentation level. - * - * Dumps debug information for the attribute list - */ -static void -xmlCtxtDumpAttrList(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr) -{ - while (attr != NULL) { - xmlCtxtDumpAttr(ctxt, attr); - attr = attr->next; - } -} - -/** - * xmlCtxtDumpOneNode: - * @output: the FILE * for the output - * @node: the node - * @depth: the indentation level. - * - * Dumps debug information for the element node, it is not recursive - */ -static void -xmlCtxtDumpOneNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node) -{ - if (node == NULL) { - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "node is NULL\n"); - } - return; - } - ctxt->node = node; - - switch (node->type) { - case XML_ELEMENT_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "ELEMENT "); - if ((node->ns != NULL) && (node->ns->prefix != NULL)) { - xmlCtxtDumpString(ctxt, node->ns->prefix); - fprintf(ctxt->output, ":"); - } - xmlCtxtDumpString(ctxt, node->name); - fprintf(ctxt->output, "\n"); - } - break; - case XML_ATTRIBUTE_NODE: - if (!ctxt->check) - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "Error, ATTRIBUTE found here\n"); - xmlCtxtGenericNodeCheck(ctxt, node); - return; - case XML_TEXT_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - if (node->name == (const xmlChar *) xmlStringTextNoenc) - fprintf(ctxt->output, "TEXT no enc"); - else - fprintf(ctxt->output, "TEXT"); - if (ctxt->options & DUMP_TEXT_TYPE) { - if (node->content == (xmlChar *) &(node->properties)) - fprintf(ctxt->output, " compact\n"); - else if (xmlDictOwns(ctxt->dict, node->content) == 1) - fprintf(ctxt->output, " interned\n"); - else - fprintf(ctxt->output, "\n"); - } else - fprintf(ctxt->output, "\n"); - } - break; - case XML_CDATA_SECTION_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "CDATA_SECTION\n"); - } - break; - case XML_ENTITY_REF_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "ENTITY_REF(%s)\n", - (char *) node->name); - } - break; - case XML_ENTITY_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "ENTITY\n"); - } - break; - case XML_PI_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "PI %s\n", (char *) node->name); - } - break; - case XML_COMMENT_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "COMMENT\n"); - } - break; - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - } - fprintf(ctxt->output, "Error, DOCUMENT found here\n"); - xmlCtxtGenericNodeCheck(ctxt, node); - return; - case XML_DOCUMENT_TYPE_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "DOCUMENT_TYPE\n"); - } - break; - case XML_DOCUMENT_FRAG_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "DOCUMENT_FRAG\n"); - } - break; - case XML_NOTATION_NODE: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "NOTATION\n"); - } - break; - case XML_DTD_NODE: - xmlCtxtDumpDtdNode(ctxt, (xmlDtdPtr) node); - return; - case XML_ELEMENT_DECL: - xmlCtxtDumpElemDecl(ctxt, (xmlElementPtr) node); - return; - case XML_ATTRIBUTE_DECL: - xmlCtxtDumpAttrDecl(ctxt, (xmlAttributePtr) node); - return; - case XML_ENTITY_DECL: - xmlCtxtDumpEntityDecl(ctxt, (xmlEntityPtr) node); - return; - case XML_NAMESPACE_DECL: - xmlCtxtDumpNamespace(ctxt, (xmlNsPtr) node); - return; - case XML_XINCLUDE_START: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "INCLUDE START\n"); - } - return; - case XML_XINCLUDE_END: - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "INCLUDE END\n"); - } - return; - default: - if (!ctxt->check) - xmlCtxtDumpSpaces(ctxt); - xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE, - "Unknown node type %d\n", node->type); - return; - } - if (node->doc == NULL) { - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - } - fprintf(ctxt->output, "PBM: doc == NULL !!!\n"); - } - ctxt->depth++; - if ((node->type == XML_ELEMENT_NODE) && (node->nsDef != NULL)) - xmlCtxtDumpNamespaceList(ctxt, node->nsDef); - if ((node->type == XML_ELEMENT_NODE) && (node->properties != NULL)) - xmlCtxtDumpAttrList(ctxt, node->properties); - if (node->type != XML_ENTITY_REF_NODE) { - if ((node->type != XML_ELEMENT_NODE) && (node->content != NULL)) { - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "content="); - xmlCtxtDumpString(ctxt, node->content); - fprintf(ctxt->output, "\n"); - } - } - } else { - xmlEntityPtr ent; - - ent = xmlGetDocEntity(node->doc, node->name); - if (ent != NULL) - xmlCtxtDumpEntity(ctxt, ent); - } - ctxt->depth--; - - /* - * Do a bit of checking - */ - xmlCtxtGenericNodeCheck(ctxt, node); -} - -/** - * xmlCtxtDumpNode: - * @output: the FILE * for the output - * @node: the node - * @depth: the indentation level. - * - * Dumps debug information for the element node, it is recursive - */ -static void -xmlCtxtDumpNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node) -{ - if (node == NULL) { - if (!ctxt->check) { - xmlCtxtDumpSpaces(ctxt); - fprintf(ctxt->output, "node is NULL\n"); - } - return; - } - xmlCtxtDumpOneNode(ctxt, node); - if ((node->type != XML_NAMESPACE_DECL) && - (node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) { - ctxt->depth++; - xmlCtxtDumpNodeList(ctxt, node->children); - ctxt->depth--; - } -} - -/** - * xmlCtxtDumpNodeList: - * @output: the FILE * for the output - * @node: the node list - * @depth: the indentation level. - * - * Dumps debug information for the list of element node, it is recursive - */ -static void -xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node) -{ - while (node != NULL) { - xmlCtxtDumpNode(ctxt, node); - node = node->next; - } -} - -static void -xmlCtxtDumpDocHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) -{ - if (doc == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "DOCUMENT == NULL !\n"); - return; - } - ctxt->node = (xmlNodePtr) doc; - - switch (doc->type) { - case XML_ELEMENT_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_ELEMENT, - "Misplaced ELEMENT node\n"); - break; - case XML_ATTRIBUTE_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_ATTRIBUTE, - "Misplaced ATTRIBUTE node\n"); - break; - case XML_TEXT_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_TEXT, - "Misplaced TEXT node\n"); - break; - case XML_CDATA_SECTION_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_CDATA, - "Misplaced CDATA node\n"); - break; - case XML_ENTITY_REF_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITYREF, - "Misplaced ENTITYREF node\n"); - break; - case XML_ENTITY_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITY, - "Misplaced ENTITY node\n"); - break; - case XML_PI_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_PI, - "Misplaced PI node\n"); - break; - case XML_COMMENT_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_COMMENT, - "Misplaced COMMENT node\n"); - break; - case XML_DOCUMENT_NODE: - if (!ctxt->check) - fprintf(ctxt->output, "DOCUMENT\n"); - break; - case XML_HTML_DOCUMENT_NODE: - if (!ctxt->check) - fprintf(ctxt->output, "HTML DOCUMENT\n"); - break; - case XML_DOCUMENT_TYPE_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_DOCTYPE, - "Misplaced DOCTYPE node\n"); - break; - case XML_DOCUMENT_FRAG_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_FRAGMENT, - "Misplaced FRAGMENT node\n"); - break; - case XML_NOTATION_NODE: - xmlDebugErr(ctxt, XML_CHECK_FOUND_NOTATION, - "Misplaced NOTATION node\n"); - break; - default: - xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE, - "Unknown node type %d\n", doc->type); - } -} - -/** - * xmlCtxtDumpDocumentHead: - * @output: the FILE * for the output - * @doc: the document - * - * Dumps debug information cncerning the document, not recursive - */ -static void -xmlCtxtDumpDocumentHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) -{ - if (doc == NULL) return; - xmlCtxtDumpDocHead(ctxt, doc); - if (!ctxt->check) { - if (doc->name != NULL) { - fprintf(ctxt->output, "name="); - xmlCtxtDumpString(ctxt, BAD_CAST doc->name); - fprintf(ctxt->output, "\n"); - } - if (doc->version != NULL) { - fprintf(ctxt->output, "version="); - xmlCtxtDumpString(ctxt, doc->version); - fprintf(ctxt->output, "\n"); - } - if (doc->encoding != NULL) { - fprintf(ctxt->output, "encoding="); - xmlCtxtDumpString(ctxt, doc->encoding); - fprintf(ctxt->output, "\n"); - } - if (doc->URL != NULL) { - fprintf(ctxt->output, "URL="); - xmlCtxtDumpString(ctxt, doc->URL); - fprintf(ctxt->output, "\n"); - } - if (doc->standalone) - fprintf(ctxt->output, "standalone=true\n"); - } - if (doc->oldNs != NULL) - xmlCtxtDumpNamespaceList(ctxt, doc->oldNs); -} - -/** - * xmlCtxtDumpDocument: - * @output: the FILE * for the output - * @doc: the document - * - * Dumps debug information for the document, it's recursive - */ -static void -xmlCtxtDumpDocument(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) -{ - if (doc == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "DOCUMENT == NULL !\n"); - return; - } - xmlCtxtDumpDocumentHead(ctxt, doc); - if (((doc->type == XML_DOCUMENT_NODE) || - (doc->type == XML_HTML_DOCUMENT_NODE)) - && (doc->children != NULL)) { - ctxt->depth++; - xmlCtxtDumpNodeList(ctxt, doc->children); - ctxt->depth--; - } -} - -static void -xmlCtxtDumpEntityCallback(xmlEntityPtr cur, xmlDebugCtxtPtr ctxt) -{ - if (cur == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "Entity is NULL"); - return; - } - if (!ctxt->check) { - fprintf(ctxt->output, "%s : ", (char *) cur->name); - switch (cur->etype) { - case XML_INTERNAL_GENERAL_ENTITY: - fprintf(ctxt->output, "INTERNAL GENERAL, "); - break; - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - fprintf(ctxt->output, "EXTERNAL PARSED, "); - break; - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - fprintf(ctxt->output, "EXTERNAL UNPARSED, "); - break; - case XML_INTERNAL_PARAMETER_ENTITY: - fprintf(ctxt->output, "INTERNAL PARAMETER, "); - break; - case XML_EXTERNAL_PARAMETER_ENTITY: - fprintf(ctxt->output, "EXTERNAL PARAMETER, "); - break; - default: - xmlDebugErr2(ctxt, XML_CHECK_ENTITY_TYPE, - "Unknown entity type %d\n", cur->etype); - } - if (cur->ExternalID != NULL) - fprintf(ctxt->output, "ID \"%s\"", (char *) cur->ExternalID); - if (cur->SystemID != NULL) - fprintf(ctxt->output, "SYSTEM \"%s\"", (char *) cur->SystemID); - if (cur->orig != NULL) - fprintf(ctxt->output, "\n orig \"%s\"", (char *) cur->orig); - if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) - fprintf(ctxt->output, "\n content \"%s\"", - (char *) cur->content); - fprintf(ctxt->output, "\n"); - } -} - -/** - * xmlCtxtDumpEntities: - * @output: the FILE * for the output - * @doc: the document - * - * Dumps debug information for all the entities in use by the document - */ -static void -xmlCtxtDumpEntities(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) -{ - if (doc == NULL) return; - xmlCtxtDumpDocHead(ctxt, doc); - if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { - xmlEntitiesTablePtr table = (xmlEntitiesTablePtr) - doc->intSubset->entities; - - if (!ctxt->check) - fprintf(ctxt->output, "Entities in internal subset\n"); - xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback, - ctxt); - } else - fprintf(ctxt->output, "No entities in internal subset\n"); - if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { - xmlEntitiesTablePtr table = (xmlEntitiesTablePtr) - doc->extSubset->entities; - - if (!ctxt->check) - fprintf(ctxt->output, "Entities in external subset\n"); - xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback, - ctxt); - } else if (!ctxt->check) - fprintf(ctxt->output, "No entities in external subset\n"); -} - -/** - * xmlCtxtDumpDTD: - * @output: the FILE * for the output - * @dtd: the DTD - * - * Dumps debug information for the DTD - */ -static void -xmlCtxtDumpDTD(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd) -{ - if (dtd == NULL) { - if (!ctxt->check) - fprintf(ctxt->output, "DTD is NULL\n"); - return; - } - xmlCtxtDumpDtdNode(ctxt, dtd); - if (dtd->children == NULL) - fprintf(ctxt->output, " DTD is empty\n"); - else { - ctxt->depth++; - xmlCtxtDumpNodeList(ctxt, dtd->children); - ctxt->depth--; - } -} - -/************************************************************************ - * * - * Public entry points for dump * - * * - ************************************************************************/ - -/** - * xmlDebugDumpString: - * @output: the FILE * for the output - * @str: the string - * - * Dumps informations about the string, shorten it if necessary - */ -void -xmlDebugDumpString(FILE * output, const xmlChar * str) -{ - int i; - - if (output == NULL) - output = stdout; - if (str == NULL) { - fprintf(output, "(NULL)"); - return; - } - for (i = 0; i < 40; i++) - if (str[i] == 0) - return; - else if (IS_BLANK_CH(str[i])) - fputc(' ', output); - else if (str[i] >= 0x80) - fprintf(output, "#%X", str[i]); - else - fputc(str[i], output); - fprintf(output, "..."); -} - -/** - * xmlDebugDumpAttr: - * @output: the FILE * for the output - * @attr: the attribute - * @depth: the indentation level. - * - * Dumps debug information for the attribute - */ -void -xmlDebugDumpAttr(FILE *output, xmlAttrPtr attr, int depth) { - xmlDebugCtxt ctxt; - - if (output == NULL) return; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.output = output; - ctxt.depth = depth; - xmlCtxtDumpAttr(&ctxt, attr); - xmlCtxtDumpCleanCtxt(&ctxt); -} - - -/** - * xmlDebugDumpEntities: - * @output: the FILE * for the output - * @doc: the document - * - * Dumps debug information for all the entities in use by the document - */ -void -xmlDebugDumpEntities(FILE * output, xmlDocPtr doc) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) return; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.output = output; - xmlCtxtDumpEntities(&ctxt, doc); - xmlCtxtDumpCleanCtxt(&ctxt); -} - -/** - * xmlDebugDumpAttrList: - * @output: the FILE * for the output - * @attr: the attribute list - * @depth: the indentation level. - * - * Dumps debug information for the attribute list - */ -void -xmlDebugDumpAttrList(FILE * output, xmlAttrPtr attr, int depth) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) return; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.output = output; - ctxt.depth = depth; - xmlCtxtDumpAttrList(&ctxt, attr); - xmlCtxtDumpCleanCtxt(&ctxt); -} - -/** - * xmlDebugDumpOneNode: - * @output: the FILE * for the output - * @node: the node - * @depth: the indentation level. - * - * Dumps debug information for the element node, it is not recursive - */ -void -xmlDebugDumpOneNode(FILE * output, xmlNodePtr node, int depth) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) return; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.output = output; - ctxt.depth = depth; - xmlCtxtDumpOneNode(&ctxt, node); - xmlCtxtDumpCleanCtxt(&ctxt); -} - -/** - * xmlDebugDumpNode: - * @output: the FILE * for the output - * @node: the node - * @depth: the indentation level. - * - * Dumps debug information for the element node, it is recursive - */ -void -xmlDebugDumpNode(FILE * output, xmlNodePtr node, int depth) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) - output = stdout; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.output = output; - ctxt.depth = depth; - xmlCtxtDumpNode(&ctxt, node); - xmlCtxtDumpCleanCtxt(&ctxt); -} - -/** - * xmlDebugDumpNodeList: - * @output: the FILE * for the output - * @node: the node list - * @depth: the indentation level. - * - * Dumps debug information for the list of element node, it is recursive - */ -void -xmlDebugDumpNodeList(FILE * output, xmlNodePtr node, int depth) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) - output = stdout; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.output = output; - ctxt.depth = depth; - xmlCtxtDumpNodeList(&ctxt, node); - xmlCtxtDumpCleanCtxt(&ctxt); -} - -/** - * xmlDebugDumpDocumentHead: - * @output: the FILE * for the output - * @doc: the document - * - * Dumps debug information cncerning the document, not recursive - */ -void -xmlDebugDumpDocumentHead(FILE * output, xmlDocPtr doc) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) - output = stdout; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.options |= DUMP_TEXT_TYPE; - ctxt.output = output; - xmlCtxtDumpDocumentHead(&ctxt, doc); - xmlCtxtDumpCleanCtxt(&ctxt); -} - -/** - * xmlDebugDumpDocument: - * @output: the FILE * for the output - * @doc: the document - * - * Dumps debug information for the document, it's recursive - */ -void -xmlDebugDumpDocument(FILE * output, xmlDocPtr doc) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) - output = stdout; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.options |= DUMP_TEXT_TYPE; - ctxt.output = output; - xmlCtxtDumpDocument(&ctxt, doc); - xmlCtxtDumpCleanCtxt(&ctxt); -} - -/** - * xmlDebugDumpDTD: - * @output: the FILE * for the output - * @dtd: the DTD - * - * Dumps debug information for the DTD - */ -void -xmlDebugDumpDTD(FILE * output, xmlDtdPtr dtd) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) - output = stdout; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.options |= DUMP_TEXT_TYPE; - ctxt.output = output; - xmlCtxtDumpDTD(&ctxt, dtd); - xmlCtxtDumpCleanCtxt(&ctxt); -} - -/************************************************************************ - * * - * Public entry points for checkings * - * * - ************************************************************************/ - -/** - * xmlDebugCheckDocument: - * @output: the FILE * for the output - * @doc: the document - * - * Check the document for potential content problems, and output - * the errors to @output - * - * Returns the number of errors found - */ -int -xmlDebugCheckDocument(FILE * output, xmlDocPtr doc) -{ - xmlDebugCtxt ctxt; - - if (output == NULL) - output = stdout; - xmlCtxtDumpInitCtxt(&ctxt); - ctxt.output = output; - ctxt.check = 1; - xmlCtxtDumpDocument(&ctxt, doc); - xmlCtxtDumpCleanCtxt(&ctxt); - return(ctxt.errors); -} - -/************************************************************************ - * * - * Helpers for Shell * - * * - ************************************************************************/ - -/** - * xmlLsCountNode: - * @node: the node to count - * - * Count the children of @node. - * - * Returns the number of children of @node. - */ -int -xmlLsCountNode(xmlNodePtr node) { - int ret = 0; - xmlNodePtr list = NULL; - - if (node == NULL) - return(0); - - switch (node->type) { - case XML_ELEMENT_NODE: - list = node->children; - break; - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - list = ((xmlDocPtr) node)->children; - break; - case XML_ATTRIBUTE_NODE: - list = ((xmlAttrPtr) node)->children; - break; - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - if (node->content != NULL) { - ret = xmlStrlen(node->content); - } - break; - case XML_ENTITY_REF_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_ENTITY_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - ret = 1; - break; - } - for (;list != NULL;ret++) - list = list->next; - return(ret); -} - -/** - * xmlLsOneNode: - * @output: the FILE * for the output - * @node: the node to dump - * - * Dump to @output the type and name of @node. - */ -void -xmlLsOneNode(FILE *output, xmlNodePtr node) { - if (output == NULL) return; - if (node == NULL) { - fprintf(output, "NULL\n"); - return; - } - switch (node->type) { - case XML_ELEMENT_NODE: - fprintf(output, "-"); - break; - case XML_ATTRIBUTE_NODE: - fprintf(output, "a"); - break; - case XML_TEXT_NODE: - fprintf(output, "t"); - break; - case XML_CDATA_SECTION_NODE: - fprintf(output, "C"); - break; - case XML_ENTITY_REF_NODE: - fprintf(output, "e"); - break; - case XML_ENTITY_NODE: - fprintf(output, "E"); - break; - case XML_PI_NODE: - fprintf(output, "p"); - break; - case XML_COMMENT_NODE: - fprintf(output, "c"); - break; - case XML_DOCUMENT_NODE: - fprintf(output, "d"); - break; - case XML_HTML_DOCUMENT_NODE: - fprintf(output, "h"); - break; - case XML_DOCUMENT_TYPE_NODE: - fprintf(output, "T"); - break; - case XML_DOCUMENT_FRAG_NODE: - fprintf(output, "F"); - break; - case XML_NOTATION_NODE: - fprintf(output, "N"); - break; - case XML_NAMESPACE_DECL: - fprintf(output, "n"); - break; - default: - fprintf(output, "?"); - } - if (node->type != XML_NAMESPACE_DECL) { - if (node->properties != NULL) - fprintf(output, "a"); - else - fprintf(output, "-"); - if (node->nsDef != NULL) - fprintf(output, "n"); - else - fprintf(output, "-"); - } - - fprintf(output, " %8d ", xmlLsCountNode(node)); - - switch (node->type) { - case XML_ELEMENT_NODE: - if (node->name != NULL) - fprintf(output, "%s", (const char *) node->name); - break; - case XML_ATTRIBUTE_NODE: - if (node->name != NULL) - fprintf(output, "%s", (const char *) node->name); - break; - case XML_TEXT_NODE: - if (node->content != NULL) { - xmlDebugDumpString(output, node->content); - } - break; - case XML_CDATA_SECTION_NODE: - break; - case XML_ENTITY_REF_NODE: - if (node->name != NULL) - fprintf(output, "%s", (const char *) node->name); - break; - case XML_ENTITY_NODE: - if (node->name != NULL) - fprintf(output, "%s", (const char *) node->name); - break; - case XML_PI_NODE: - if (node->name != NULL) - fprintf(output, "%s", (const char *) node->name); - break; - case XML_COMMENT_NODE: - break; - case XML_DOCUMENT_NODE: - break; - case XML_HTML_DOCUMENT_NODE: - break; - case XML_DOCUMENT_TYPE_NODE: - break; - case XML_DOCUMENT_FRAG_NODE: - break; - case XML_NOTATION_NODE: - break; - case XML_NAMESPACE_DECL: { - xmlNsPtr ns = (xmlNsPtr) node; - - if (ns->prefix == NULL) - fprintf(output, "default -> %s", (char *)ns->href); - else - fprintf(output, "%s -> %s", (char *)ns->prefix, - (char *)ns->href); - break; - } - default: - if (node->name != NULL) - fprintf(output, "%s", (const char *) node->name); - } - fprintf(output, "\n"); -} - -/** - * xmlBoolToText: - * @boolval: a bool to turn into text - * - * Convenient way to turn bool into text - * - * Returns a pointer to either "True" or "False" - */ -const char * -xmlBoolToText(int boolval) -{ - if (boolval) - return("True"); - else - return("False"); -} - -#ifdef LIBXML_XPATH_ENABLED -/**************************************************************** - * * - * The XML shell related functions * - * * - ****************************************************************/ - - - -/* - * TODO: Improvement/cleanups for the XML shell - * - allow to shell out an editor on a subpart - * - cleanup function registrations (with help) and calling - * - provide registration routines - */ - -/** - * xmlShellPrintXPathError: - * @errorType: valid xpath error id - * @arg: the argument that cause xpath to fail - * - * Print the xpath error to libxml default error channel - */ -void -xmlShellPrintXPathError(int errorType, const char *arg) -{ - const char *default_arg = "Result"; - - if (!arg) - arg = default_arg; - - switch (errorType) { - case XPATH_UNDEFINED: - xmlGenericError(xmlGenericErrorContext, - "%s: no such node\n", arg); - break; - - case XPATH_BOOLEAN: - xmlGenericError(xmlGenericErrorContext, - "%s is a Boolean\n", arg); - break; - case XPATH_NUMBER: - xmlGenericError(xmlGenericErrorContext, - "%s is a number\n", arg); - break; - case XPATH_STRING: - xmlGenericError(xmlGenericErrorContext, - "%s is a string\n", arg); - break; - case XPATH_POINT: - xmlGenericError(xmlGenericErrorContext, - "%s is a point\n", arg); - break; - case XPATH_RANGE: - xmlGenericError(xmlGenericErrorContext, - "%s is a range\n", arg); - break; - case XPATH_LOCATIONSET: - xmlGenericError(xmlGenericErrorContext, - "%s is a range\n", arg); - break; - case XPATH_USERS: - xmlGenericError(xmlGenericErrorContext, - "%s is user-defined\n", arg); - break; - case XPATH_XSLT_TREE: - xmlGenericError(xmlGenericErrorContext, - "%s is an XSLT value tree\n", arg); - break; - } -#if 0 - xmlGenericError(xmlGenericErrorContext, - "Try casting the result string function (xpath builtin)\n", - arg); -#endif -} - - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlShellPrintNodeCtxt: - * @ctxt : a non-null shell context - * @node : a non-null node to print to the output FILE - * - * Print node to the output FILE - */ -static void -xmlShellPrintNodeCtxt(xmlShellCtxtPtr ctxt,xmlNodePtr node) -{ - FILE *fp; - - if (!node) - return; - if (ctxt == NULL) - fp = stdout; - else - fp = ctxt->output; - - if (node->type == XML_DOCUMENT_NODE) - xmlDocDump(fp, (xmlDocPtr) node); - else if (node->type == XML_ATTRIBUTE_NODE) - xmlDebugDumpAttrList(fp, (xmlAttrPtr) node, 0); - else - xmlElemDump(fp, node->doc, node); - - fprintf(fp, "\n"); -} - -/** - * xmlShellPrintNode: - * @node : a non-null node to print to the output FILE - * - * Print node to the output FILE - */ -void -xmlShellPrintNode(xmlNodePtr node) -{ - xmlShellPrintNodeCtxt(NULL, node); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlShellPrintXPathResultCtxt: - * @ctxt: a valid shell context - * @list: a valid result generated by an xpath evaluation - * - * Prints result to the output FILE - */ -static void -xmlShellPrintXPathResultCtxt(xmlShellCtxtPtr ctxt,xmlXPathObjectPtr list) -{ - if (!ctxt) - return; - - if (list != NULL) { - switch (list->type) { - case XPATH_NODESET:{ -#ifdef LIBXML_OUTPUT_ENABLED - int indx; - - if (list->nodesetval) { - for (indx = 0; indx < list->nodesetval->nodeNr; - indx++) { - xmlShellPrintNodeCtxt(ctxt, - list->nodesetval->nodeTab[indx]); - } - } else { - xmlGenericError(xmlGenericErrorContext, - "Empty node set\n"); - } - break; -#else - xmlGenericError(xmlGenericErrorContext, - "Node set\n"); -#endif /* LIBXML_OUTPUT_ENABLED */ - } - case XPATH_BOOLEAN: - xmlGenericError(xmlGenericErrorContext, - "Is a Boolean:%s\n", - xmlBoolToText(list->boolval)); - break; - case XPATH_NUMBER: - xmlGenericError(xmlGenericErrorContext, - "Is a number:%0g\n", list->floatval); - break; - case XPATH_STRING: - xmlGenericError(xmlGenericErrorContext, - "Is a string:%s\n", list->stringval); - break; - - default: - xmlShellPrintXPathError(list->type, NULL); - } - } -} - -/** - * xmlShellPrintXPathResult: - * @list: a valid result generated by an xpath evaluation - * - * Prints result to the output FILE - */ -void -xmlShellPrintXPathResult(xmlXPathObjectPtr list) -{ - xmlShellPrintXPathResultCtxt(NULL, list); -} - -/** - * xmlShellList: - * @ctxt: the shell context - * @arg: unused - * @node: a node - * @node2: unused - * - * Implements the XML shell function "ls" - * Does an Unix like listing of the given node (like a directory) - * - * Returns 0 - */ -int -xmlShellList(xmlShellCtxtPtr ctxt, - char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlNodePtr cur; - if (!ctxt) - return (0); - if (node == NULL) { - fprintf(ctxt->output, "NULL\n"); - return (0); - } - if ((node->type == XML_DOCUMENT_NODE) || - (node->type == XML_HTML_DOCUMENT_NODE)) { - cur = ((xmlDocPtr) node)->children; - } else if (node->type == XML_NAMESPACE_DECL) { - xmlLsOneNode(ctxt->output, node); - return (0); - } else if (node->children != NULL) { - cur = node->children; - } else { - xmlLsOneNode(ctxt->output, node); - return (0); - } - while (cur != NULL) { - xmlLsOneNode(ctxt->output, cur); - cur = cur->next; - } - return (0); -} - -/** - * xmlShellBase: - * @ctxt: the shell context - * @arg: unused - * @node: a node - * @node2: unused - * - * Implements the XML shell function "base" - * dumps the current XML base of the node - * - * Returns 0 - */ -int -xmlShellBase(xmlShellCtxtPtr ctxt, - char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlChar *base; - if (!ctxt) - return 0; - if (node == NULL) { - fprintf(ctxt->output, "NULL\n"); - return (0); - } - - base = xmlNodeGetBase(node->doc, node); - - if (base == NULL) { - fprintf(ctxt->output, " No base found !!!\n"); - } else { - fprintf(ctxt->output, "%s\n", base); - xmlFree(base); - } - return (0); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlShellSetBase: - * @ctxt: the shell context - * @arg: the new base - * @node: a node - * @node2: unused - * - * Implements the XML shell function "setbase" - * change the current XML base of the node - * - * Returns 0 - */ -static int -xmlShellSetBase(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, - char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlNodeSetBase(node, (xmlChar*) arg); - return (0); -} -#endif - -#ifdef LIBXML_XPATH_ENABLED -/** - * xmlShellRegisterNamespace: - * @ctxt: the shell context - * @arg: a string in prefix=nsuri format - * @node: unused - * @node2: unused - * - * Implements the XML shell function "setns" - * register/unregister a prefix=namespace pair - * on the XPath context - * - * Returns 0 on success and a negative value otherwise. - */ -static int -xmlShellRegisterNamespace(xmlShellCtxtPtr ctxt, char *arg, - xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlChar* nsListDup; - xmlChar* prefix; - xmlChar* href; - xmlChar* next; - - nsListDup = xmlStrdup((xmlChar *) arg); - next = nsListDup; - while(next != NULL) { - /* skip spaces */ - /*while((*next) == ' ') next++;*/ - if((*next) == '\0') break; - - /* find prefix */ - prefix = next; - next = (xmlChar*)xmlStrchr(next, '='); - if(next == NULL) { - fprintf(ctxt->output, "setns: prefix=[nsuri] required\n"); - xmlFree(nsListDup); - return(-1); - } - *(next++) = '\0'; - - /* find href */ - href = next; - next = (xmlChar*)xmlStrchr(next, ' '); - if(next != NULL) { - *(next++) = '\0'; - } - - /* do register namespace */ - if(xmlXPathRegisterNs(ctxt->pctxt, prefix, href) != 0) { - fprintf(ctxt->output,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", prefix, href); - xmlFree(nsListDup); - return(-1); - } - } - - xmlFree(nsListDup); - return(0); -} -/** - * xmlShellRegisterRootNamespaces: - * @ctxt: the shell context - * @arg: unused - * @node: the root element - * @node2: unused - * - * Implements the XML shell function "setrootns" - * which registers all namespaces declarations found on the root element. - * - * Returns 0 on success and a negative value otherwise. - */ -static int -xmlShellRegisterRootNamespaces(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, - xmlNodePtr root, xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlNsPtr ns; - - if ((root == NULL) || (root->type != XML_ELEMENT_NODE) || - (root->nsDef == NULL) || (ctxt == NULL) || (ctxt->pctxt == NULL)) - return(-1); - ns = root->nsDef; - while (ns != NULL) { - if (ns->prefix == NULL) - xmlXPathRegisterNs(ctxt->pctxt, BAD_CAST "defaultns", ns->href); - else - xmlXPathRegisterNs(ctxt->pctxt, ns->prefix, ns->href); - ns = ns->next; - } - return(0); -} -#endif - -/** - * xmlShellGrep: - * @ctxt: the shell context - * @arg: the string or regular expression to find - * @node: a node - * @node2: unused - * - * Implements the XML shell function "grep" - * dumps informations about the node (namespace, attributes, content). - * - * Returns 0 - */ -static int -xmlShellGrep(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, - char *arg, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - if (!ctxt) - return (0); - if (node == NULL) - return (0); - if (arg == NULL) - return (0); -#ifdef LIBXML_REGEXP_ENABLED - if ((xmlStrchr((xmlChar *) arg, '?')) || - (xmlStrchr((xmlChar *) arg, '*')) || - (xmlStrchr((xmlChar *) arg, '.')) || - (xmlStrchr((xmlChar *) arg, '['))) { - } -#endif - while (node != NULL) { - if (node->type == XML_COMMENT_NODE) { - if (xmlStrstr(node->content, (xmlChar *) arg)) { - - fprintf(ctxt->output, "%s : ", xmlGetNodePath(node)); - xmlShellList(ctxt, NULL, node, NULL); - } - } else if (node->type == XML_TEXT_NODE) { - if (xmlStrstr(node->content, (xmlChar *) arg)) { - - fprintf(ctxt->output, "%s : ", xmlGetNodePath(node->parent)); - xmlShellList(ctxt, NULL, node->parent, NULL); - } - } - - /* - * Browse the full subtree, deep first - */ - - if ((node->type == XML_DOCUMENT_NODE) || - (node->type == XML_HTML_DOCUMENT_NODE)) { - node = ((xmlDocPtr) node)->children; - } else if ((node->children != NULL) - && (node->type != XML_ENTITY_REF_NODE)) { - /* deep first */ - node = node->children; - } else if (node->next != NULL) { - /* then siblings */ - node = node->next; - } else { - /* go up to parents->next if needed */ - while (node != NULL) { - if (node->parent != NULL) { - node = node->parent; - } - if (node->next != NULL) { - node = node->next; - break; - } - if (node->parent == NULL) { - node = NULL; - break; - } - } - } - } - return (0); -} - -/** - * xmlShellDir: - * @ctxt: the shell context - * @arg: unused - * @node: a node - * @node2: unused - * - * Implements the XML shell function "dir" - * dumps informations about the node (namespace, attributes, content). - * - * Returns 0 - */ -int -xmlShellDir(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, - char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - if (!ctxt) - return (0); - if (node == NULL) { - fprintf(ctxt->output, "NULL\n"); - return (0); - } - if ((node->type == XML_DOCUMENT_NODE) || - (node->type == XML_HTML_DOCUMENT_NODE)) { - xmlDebugDumpDocumentHead(ctxt->output, (xmlDocPtr) node); - } else if (node->type == XML_ATTRIBUTE_NODE) { - xmlDebugDumpAttr(ctxt->output, (xmlAttrPtr) node, 0); - } else { - xmlDebugDumpOneNode(ctxt->output, node, 0); - } - return (0); -} - -/** - * xmlShellSetContent: - * @ctxt: the shell context - * @value: the content as a string - * @node: a node - * @node2: unused - * - * Implements the XML shell function "dir" - * dumps informations about the node (namespace, attributes, content). - * - * Returns 0 - */ -static int -xmlShellSetContent(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, - char *value, xmlNodePtr node, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlNodePtr results; - xmlParserErrors ret; - - if (!ctxt) - return (0); - if (node == NULL) { - fprintf(ctxt->output, "NULL\n"); - return (0); - } - if (value == NULL) { - fprintf(ctxt->output, "NULL\n"); - return (0); - } - - ret = xmlParseInNodeContext(node, value, strlen(value), 0, &results); - if (ret == XML_ERR_OK) { - if (node->children != NULL) { - xmlFreeNodeList(node->children); - node->children = NULL; - node->last = NULL; - } - xmlAddChildList(node, results); - } else { - fprintf(ctxt->output, "failed to parse content\n"); - } - return (0); -} - -#ifdef LIBXML_SCHEMAS_ENABLED -/** - * xmlShellRNGValidate: - * @ctxt: the shell context - * @schemas: the path to the Relax-NG schemas - * @node: a node - * @node2: unused - * - * Implements the XML shell function "relaxng" - * validating the instance against a Relax-NG schemas - * - * Returns 0 - */ -static int -xmlShellRNGValidate(xmlShellCtxtPtr sctxt, char *schemas, - xmlNodePtr node ATTRIBUTE_UNUSED, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlRelaxNGPtr relaxngschemas; - xmlRelaxNGParserCtxtPtr ctxt; - xmlRelaxNGValidCtxtPtr vctxt; - int ret; - - ctxt = xmlRelaxNGNewParserCtxt(schemas); - xmlRelaxNGSetParserErrors(ctxt, - (xmlRelaxNGValidityErrorFunc) fprintf, - (xmlRelaxNGValidityWarningFunc) fprintf, - stderr); - relaxngschemas = xmlRelaxNGParse(ctxt); - xmlRelaxNGFreeParserCtxt(ctxt); - if (relaxngschemas == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Relax-NG schema %s failed to compile\n", schemas); - return(-1); - } - vctxt = xmlRelaxNGNewValidCtxt(relaxngschemas); - xmlRelaxNGSetValidErrors(vctxt, - (xmlRelaxNGValidityErrorFunc) fprintf, - (xmlRelaxNGValidityWarningFunc) fprintf, - stderr); - ret = xmlRelaxNGValidateDoc(vctxt, sctxt->doc); - if (ret == 0) { - fprintf(stderr, "%s validates\n", sctxt->filename); - } else if (ret > 0) { - fprintf(stderr, "%s fails to validate\n", sctxt->filename); - } else { - fprintf(stderr, "%s validation generated an internal error\n", - sctxt->filename); - } - xmlRelaxNGFreeValidCtxt(vctxt); - if (relaxngschemas != NULL) - xmlRelaxNGFree(relaxngschemas); - return(0); -} -#endif - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlShellCat: - * @ctxt: the shell context - * @arg: unused - * @node: a node - * @node2: unused - * - * Implements the XML shell function "cat" - * dumps the serialization node content (XML or HTML). - * - * Returns 0 - */ -int -xmlShellCat(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, - xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - if (!ctxt) - return (0); - if (node == NULL) { - fprintf(ctxt->output, "NULL\n"); - return (0); - } - if (ctxt->doc->type == XML_HTML_DOCUMENT_NODE) { -#ifdef LIBXML_HTML_ENABLED - if (node->type == XML_HTML_DOCUMENT_NODE) - htmlDocDump(ctxt->output, (htmlDocPtr) node); - else - htmlNodeDumpFile(ctxt->output, ctxt->doc, node); -#else - if (node->type == XML_DOCUMENT_NODE) - xmlDocDump(ctxt->output, (xmlDocPtr) node); - else - xmlElemDump(ctxt->output, ctxt->doc, node); -#endif /* LIBXML_HTML_ENABLED */ - } else { - if (node->type == XML_DOCUMENT_NODE) - xmlDocDump(ctxt->output, (xmlDocPtr) node); - else - xmlElemDump(ctxt->output, ctxt->doc, node); - } - fprintf(ctxt->output, "\n"); - return (0); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlShellLoad: - * @ctxt: the shell context - * @filename: the file name - * @node: unused - * @node2: unused - * - * Implements the XML shell function "load" - * loads a new document specified by the filename - * - * Returns 0 or -1 if loading failed - */ -int -xmlShellLoad(xmlShellCtxtPtr ctxt, char *filename, - xmlNodePtr node ATTRIBUTE_UNUSED, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlDocPtr doc; - int html = 0; - - if ((ctxt == NULL) || (filename == NULL)) return(-1); - if (ctxt->doc != NULL) - html = (ctxt->doc->type == XML_HTML_DOCUMENT_NODE); - - if (html) { -#ifdef LIBXML_HTML_ENABLED - doc = htmlParseFile(filename, NULL); -#else - fprintf(ctxt->output, "HTML support not compiled in\n"); - doc = NULL; -#endif /* LIBXML_HTML_ENABLED */ - } else { - doc = xmlReadFile(filename,NULL,0); - } - if (doc != NULL) { - if (ctxt->loaded == 1) { - xmlFreeDoc(ctxt->doc); - } - ctxt->loaded = 1; -#ifdef LIBXML_XPATH_ENABLED - xmlXPathFreeContext(ctxt->pctxt); -#endif /* LIBXML_XPATH_ENABLED */ - xmlFree(ctxt->filename); - ctxt->doc = doc; - ctxt->node = (xmlNodePtr) doc; -#ifdef LIBXML_XPATH_ENABLED - ctxt->pctxt = xmlXPathNewContext(doc); -#endif /* LIBXML_XPATH_ENABLED */ - ctxt->filename = (char *) xmlCanonicPath((xmlChar *) filename); - } else - return (-1); - return (0); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlShellWrite: - * @ctxt: the shell context - * @filename: the file name - * @node: a node in the tree - * @node2: unused - * - * Implements the XML shell function "write" - * Write the current node to the filename, it saves the serialization - * of the subtree under the @node specified - * - * Returns 0 or -1 in case of error - */ -int -xmlShellWrite(xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - if (node == NULL) - return (-1); - if ((filename == NULL) || (filename[0] == 0)) { - return (-1); - } -#ifdef W_OK - if (access((char *) filename, W_OK)) { - xmlGenericError(xmlGenericErrorContext, - "Cannot write to %s\n", filename); - return (-1); - } -#endif - switch (node->type) { - case XML_DOCUMENT_NODE: - if (xmlSaveFile((char *) filename, ctxt->doc) < -1) { - xmlGenericError(xmlGenericErrorContext, - "Failed to write to %s\n", filename); - return (-1); - } - break; - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_HTML_ENABLED - if (htmlSaveFile((char *) filename, ctxt->doc) < 0) { - xmlGenericError(xmlGenericErrorContext, - "Failed to write to %s\n", filename); - return (-1); - } -#else - if (xmlSaveFile((char *) filename, ctxt->doc) < -1) { - xmlGenericError(xmlGenericErrorContext, - "Failed to write to %s\n", filename); - return (-1); - } -#endif /* LIBXML_HTML_ENABLED */ - break; - default:{ - FILE *f; - - f = fopen((char *) filename, "w"); - if (f == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Failed to write to %s\n", filename); - return (-1); - } - xmlElemDump(f, ctxt->doc, node); - fclose(f); - } - } - return (0); -} - -/** - * xmlShellSave: - * @ctxt: the shell context - * @filename: the file name (optional) - * @node: unused - * @node2: unused - * - * Implements the XML shell function "save" - * Write the current document to the filename, or it's original name - * - * Returns 0 or -1 in case of error - */ -int -xmlShellSave(xmlShellCtxtPtr ctxt, char *filename, - xmlNodePtr node ATTRIBUTE_UNUSED, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - if ((ctxt == NULL) || (ctxt->doc == NULL)) - return (-1); - if ((filename == NULL) || (filename[0] == 0)) - filename = ctxt->filename; - if (filename == NULL) - return (-1); -#ifdef W_OK - if (access((char *) filename, W_OK)) { - xmlGenericError(xmlGenericErrorContext, - "Cannot save to %s\n", filename); - return (-1); - } -#endif - switch (ctxt->doc->type) { - case XML_DOCUMENT_NODE: - if (xmlSaveFile((char *) filename, ctxt->doc) < 0) { - xmlGenericError(xmlGenericErrorContext, - "Failed to save to %s\n", filename); - } - break; - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_HTML_ENABLED - if (htmlSaveFile((char *) filename, ctxt->doc) < 0) { - xmlGenericError(xmlGenericErrorContext, - "Failed to save to %s\n", filename); - } -#else - if (xmlSaveFile((char *) filename, ctxt->doc) < 0) { - xmlGenericError(xmlGenericErrorContext, - "Failed to save to %s\n", filename); - } -#endif /* LIBXML_HTML_ENABLED */ - break; - default: - xmlGenericError(xmlGenericErrorContext, - "To save to subparts of a document use the 'write' command\n"); - return (-1); - - } - return (0); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -#ifdef LIBXML_VALID_ENABLED -/** - * xmlShellValidate: - * @ctxt: the shell context - * @dtd: the DTD URI (optional) - * @node: unused - * @node2: unused - * - * Implements the XML shell function "validate" - * Validate the document, if a DTD path is provided, then the validation - * is done against the given DTD. - * - * Returns 0 or -1 in case of error - */ -int -xmlShellValidate(xmlShellCtxtPtr ctxt, char *dtd, - xmlNodePtr node ATTRIBUTE_UNUSED, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlValidCtxt vctxt; - int res = -1; - - if ((ctxt == NULL) || (ctxt->doc == NULL)) return(-1); - vctxt.userData = stderr; - vctxt.error = (xmlValidityErrorFunc) fprintf; - vctxt.warning = (xmlValidityWarningFunc) fprintf; - - if ((dtd == NULL) || (dtd[0] == 0)) { - res = xmlValidateDocument(&vctxt, ctxt->doc); - } else { - xmlDtdPtr subset; - - subset = xmlParseDTD(NULL, (xmlChar *) dtd); - if (subset != NULL) { - res = xmlValidateDtd(&vctxt, ctxt->doc, subset); - - xmlFreeDtd(subset); - } - } - return (res); -} -#endif /* LIBXML_VALID_ENABLED */ - -/** - * xmlShellDu: - * @ctxt: the shell context - * @arg: unused - * @tree: a node defining a subtree - * @node2: unused - * - * Implements the XML shell function "du" - * show the structure of the subtree under node @tree - * If @tree is null, the command works on the current node. - * - * Returns 0 or -1 in case of error - */ -int -xmlShellDu(xmlShellCtxtPtr ctxt, - char *arg ATTRIBUTE_UNUSED, xmlNodePtr tree, - xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlNodePtr node; - int indent = 0, i; - - if (!ctxt) - return (-1); - - if (tree == NULL) - return (-1); - node = tree; - while (node != NULL) { - if ((node->type == XML_DOCUMENT_NODE) || - (node->type == XML_HTML_DOCUMENT_NODE)) { - fprintf(ctxt->output, "/\n"); - } else if (node->type == XML_ELEMENT_NODE) { - for (i = 0; i < indent; i++) - fprintf(ctxt->output, " "); - fprintf(ctxt->output, "%s\n", node->name); - } else { - } - - /* - * Browse the full subtree, deep first - */ - - if ((node->type == XML_DOCUMENT_NODE) || - (node->type == XML_HTML_DOCUMENT_NODE)) { - node = ((xmlDocPtr) node)->children; - } else if ((node->children != NULL) - && (node->type != XML_ENTITY_REF_NODE)) { - /* deep first */ - node = node->children; - indent++; - } else if ((node != tree) && (node->next != NULL)) { - /* then siblings */ - node = node->next; - } else if (node != tree) { - /* go up to parents->next if needed */ - while (node != tree) { - if (node->parent != NULL) { - node = node->parent; - indent--; - } - if ((node != tree) && (node->next != NULL)) { - node = node->next; - break; - } - if (node->parent == NULL) { - node = NULL; - break; - } - if (node == tree) { - node = NULL; - break; - } - } - /* exit condition */ - if (node == tree) - node = NULL; - } else - node = NULL; - } - return (0); -} - -/** - * xmlShellPwd: - * @ctxt: the shell context - * @buffer: the output buffer - * @node: a node - * @node2: unused - * - * Implements the XML shell function "pwd" - * Show the full path from the root to the node, if needed building - * thumblers when similar elements exists at a given ancestor level. - * The output is compatible with XPath commands. - * - * Returns 0 or -1 in case of error - */ -int -xmlShellPwd(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *buffer, - xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) -{ - xmlChar *path; - - if ((node == NULL) || (buffer == NULL)) - return (-1); - - path = xmlGetNodePath(node); - if (path == NULL) - return (-1); - - /* - * This test prevents buffer overflow, because this routine - * is only called by xmlShell, in which the second argument is - * 500 chars long. - * It is a dirty hack before a cleaner solution is found. - * Documentation should mention that the second argument must - * be at least 500 chars long, and could be stripped if too long. - */ - snprintf(buffer, 499, "%s", path); - buffer[499] = '0'; - xmlFree(path); - - return (0); -} - -/** - * xmlShell: - * @doc: the initial document - * @filename: the output buffer - * @input: the line reading function - * @output: the output FILE*, defaults to stdout if NULL - * - * Implements the XML shell - * This allow to load, validate, view, modify and save a document - * using a environment similar to a UNIX commandline. - */ -void -xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, - FILE * output) -{ - char prompt[500] = "/ > "; - char *cmdline = NULL, *cur; - int nbargs; - char command[100]; - char arg[400]; - int i; - xmlShellCtxtPtr ctxt; - xmlXPathObjectPtr list; - - if (doc == NULL) - return; - if (filename == NULL) - return; - if (input == NULL) - return; - if (output == NULL) - output = stdout; - ctxt = (xmlShellCtxtPtr) xmlMalloc(sizeof(xmlShellCtxt)); - if (ctxt == NULL) - return; - ctxt->loaded = 0; - ctxt->doc = doc; - ctxt->input = input; - ctxt->output = output; - ctxt->filename = (char *) xmlStrdup((xmlChar *) filename); - ctxt->node = (xmlNodePtr) ctxt->doc; - -#ifdef LIBXML_XPATH_ENABLED - ctxt->pctxt = xmlXPathNewContext(ctxt->doc); - if (ctxt->pctxt == NULL) { - xmlFree(ctxt); - return; - } -#endif /* LIBXML_XPATH_ENABLED */ - while (1) { - if (ctxt->node == (xmlNodePtr) ctxt->doc) - snprintf(prompt, sizeof(prompt), "%s > ", "/"); - else if ((ctxt->node != NULL) && (ctxt->node->name)) - snprintf(prompt, sizeof(prompt), "%s > ", ctxt->node->name); - else - snprintf(prompt, sizeof(prompt), "? > "); - prompt[sizeof(prompt) - 1] = 0; - - /* - * Get a new command line - */ - cmdline = ctxt->input(prompt); - if (cmdline == NULL) - break; - - /* - * Parse the command itself - */ - cur = cmdline; - nbargs = 0; - while ((*cur == ' ') || (*cur == '\t')) - cur++; - i = 0; - while ((*cur != ' ') && (*cur != '\t') && - (*cur != '\n') && (*cur != '\r')) { - if (*cur == 0) - break; - command[i++] = *cur++; - } - command[i] = 0; - if (i == 0) - continue; - nbargs++; - - /* - * Parse the argument - */ - while ((*cur == ' ') || (*cur == '\t')) - cur++; - i = 0; - while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) { - if (*cur == 0) - break; - arg[i++] = *cur++; - } - arg[i] = 0; - if (i != 0) - nbargs++; - - /* - * start interpreting the command - */ - if (!strcmp(command, "exit")) - break; - if (!strcmp(command, "quit")) - break; - if (!strcmp(command, "bye")) - break; - if (!strcmp(command, "help")) { - fprintf(ctxt->output, "\tbase display XML base of the node\n"); - fprintf(ctxt->output, "\tsetbase URI change the XML base of the node\n"); - fprintf(ctxt->output, "\tbye leave shell\n"); - fprintf(ctxt->output, "\tcat [node] display node or current node\n"); - fprintf(ctxt->output, "\tcd [path] change directory to path or to root\n"); - fprintf(ctxt->output, "\tdir [path] dumps informations about the node (namespace, attributes, content)\n"); - fprintf(ctxt->output, "\tdu [path] show the structure of the subtree under path or the current node\n"); - fprintf(ctxt->output, "\texit leave shell\n"); - fprintf(ctxt->output, "\thelp display this help\n"); - fprintf(ctxt->output, "\tfree display memory usage\n"); - fprintf(ctxt->output, "\tload [name] load a new document with name\n"); - fprintf(ctxt->output, "\tls [path] list contents of path or the current directory\n"); - fprintf(ctxt->output, "\tset xml_fragment replace the current node content with the fragment parsed in context\n"); -#ifdef LIBXML_XPATH_ENABLED - fprintf(ctxt->output, "\txpath expr evaluate the XPath expression in that context and print the result\n"); - fprintf(ctxt->output, "\tsetns nsreg register a namespace to a prefix in the XPath evaluation context\n"); - fprintf(ctxt->output, "\t format for nsreg is: prefix=[nsuri] (i.e. prefix= unsets a prefix)\n"); - fprintf(ctxt->output, "\tsetrootns register all namespace found on the root element\n"); - fprintf(ctxt->output, "\t the default namespace if any uses 'defaultns' prefix\n"); -#endif /* LIBXML_XPATH_ENABLED */ - fprintf(ctxt->output, "\tpwd display current working directory\n"); - fprintf(ctxt->output, "\tquit leave shell\n"); -#ifdef LIBXML_OUTPUT_ENABLED - fprintf(ctxt->output, "\tsave [name] save this document to name or the original name\n"); - fprintf(ctxt->output, "\twrite [name] write the current node to the filename\n"); -#endif /* LIBXML_OUTPUT_ENABLED */ -#ifdef LIBXML_VALID_ENABLED - fprintf(ctxt->output, "\tvalidate check the document for errors\n"); -#endif /* LIBXML_VALID_ENABLED */ -#ifdef LIBXML_SCHEMAS_ENABLED - fprintf(ctxt->output, "\trelaxng rng validate the document agaisnt the Relax-NG schemas\n"); -#endif - fprintf(ctxt->output, "\tgrep string search for a string in the subtree\n"); -#ifdef LIBXML_VALID_ENABLED - } else if (!strcmp(command, "validate")) { - xmlShellValidate(ctxt, arg, NULL, NULL); -#endif /* LIBXML_VALID_ENABLED */ - } else if (!strcmp(command, "load")) { - xmlShellLoad(ctxt, arg, NULL, NULL); -#ifdef LIBXML_SCHEMAS_ENABLED - } else if (!strcmp(command, "relaxng")) { - xmlShellRNGValidate(ctxt, arg, NULL, NULL); -#endif -#ifdef LIBXML_OUTPUT_ENABLED - } else if (!strcmp(command, "save")) { - xmlShellSave(ctxt, arg, NULL, NULL); - } else if (!strcmp(command, "write")) { - if ((arg == NULL) || (arg[0] == 0)) - xmlGenericError(xmlGenericErrorContext, - "Write command requires a filename argument\n"); - else - xmlShellWrite(ctxt, arg, NULL, NULL); -#endif /* LIBXML_OUTPUT_ENABLED */ - } else if (!strcmp(command, "grep")) { - xmlShellGrep(ctxt, arg, ctxt->node, NULL); - } else if (!strcmp(command, "free")) { - if (arg[0] == 0) { - xmlMemShow(ctxt->output, 0); - } else { - int len = 0; - - sscanf(arg, "%d", &len); - xmlMemShow(ctxt->output, len); - } - } else if (!strcmp(command, "pwd")) { - char dir[500]; - - if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL)) - fprintf(ctxt->output, "%s\n", dir); - } else if (!strcmp(command, "du")) { - xmlShellDu(ctxt, NULL, ctxt->node, NULL); - } else if (!strcmp(command, "base")) { - xmlShellBase(ctxt, NULL, ctxt->node, NULL); - } else if (!strcmp(command, "set")) { - xmlShellSetContent(ctxt, arg, ctxt->node, NULL); -#ifdef LIBXML_XPATH_ENABLED - } else if (!strcmp(command, "setns")) { - if (arg[0] == 0) { - xmlGenericError(xmlGenericErrorContext, - "setns: prefix=[nsuri] required\n"); - } else { - xmlShellRegisterNamespace(ctxt, arg, NULL, NULL); - } - } else if (!strcmp(command, "setrootns")) { - xmlNodePtr root; - - root = xmlDocGetRootElement(ctxt->doc); - xmlShellRegisterRootNamespaces(ctxt, NULL, root, NULL); - } else if (!strcmp(command, "xpath")) { - if (arg[0] == 0) { - xmlGenericError(xmlGenericErrorContext, - "xpath: expression required\n"); - } else { - ctxt->pctxt->node = ctxt->node; - list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); - xmlXPathDebugDumpObject(ctxt->output, list, 0); - xmlXPathFreeObject(list); - } -#endif /* LIBXML_XPATH_ENABLED */ -#ifdef LIBXML_TREE_ENABLED - } else if (!strcmp(command, "setbase")) { - xmlShellSetBase(ctxt, arg, ctxt->node, NULL); -#endif - } else if ((!strcmp(command, "ls")) || (!strcmp(command, "dir"))) { - int dir = (!strcmp(command, "dir")); - - if (arg[0] == 0) { - if (dir) - xmlShellDir(ctxt, NULL, ctxt->node, NULL); - else - xmlShellList(ctxt, NULL, ctxt->node, NULL); - } else { - ctxt->pctxt->node = ctxt->node; -#ifdef LIBXML_XPATH_ENABLED - ctxt->pctxt->node = ctxt->node; - list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); -#else - list = NULL; -#endif /* LIBXML_XPATH_ENABLED */ - if (list != NULL) { - switch (list->type) { - case XPATH_UNDEFINED: - xmlGenericError(xmlGenericErrorContext, - "%s: no such node\n", arg); - break; - case XPATH_NODESET:{ - int indx; - - if (list->nodesetval == NULL) - break; - - for (indx = 0; - indx < list->nodesetval->nodeNr; - indx++) { - if (dir) - xmlShellDir(ctxt, NULL, - list->nodesetval-> - nodeTab[indx], NULL); - else - xmlShellList(ctxt, NULL, - list->nodesetval-> - nodeTab[indx], NULL); - } - break; - } - case XPATH_BOOLEAN: - xmlGenericError(xmlGenericErrorContext, - "%s is a Boolean\n", arg); - break; - case XPATH_NUMBER: - xmlGenericError(xmlGenericErrorContext, - "%s is a number\n", arg); - break; - case XPATH_STRING: - xmlGenericError(xmlGenericErrorContext, - "%s is a string\n", arg); - break; - case XPATH_POINT: - xmlGenericError(xmlGenericErrorContext, - "%s is a point\n", arg); - break; - case XPATH_RANGE: - xmlGenericError(xmlGenericErrorContext, - "%s is a range\n", arg); - break; - case XPATH_LOCATIONSET: - xmlGenericError(xmlGenericErrorContext, - "%s is a range\n", arg); - break; - case XPATH_USERS: - xmlGenericError(xmlGenericErrorContext, - "%s is user-defined\n", arg); - break; - case XPATH_XSLT_TREE: - xmlGenericError(xmlGenericErrorContext, - "%s is an XSLT value tree\n", - arg); - break; - } -#ifdef LIBXML_XPATH_ENABLED - xmlXPathFreeObject(list); -#endif - } else { - xmlGenericError(xmlGenericErrorContext, - "%s: no such node\n", arg); - } - ctxt->pctxt->node = NULL; - } - } else if (!strcmp(command, "cd")) { - if (arg[0] == 0) { - ctxt->node = (xmlNodePtr) ctxt->doc; - } else { -#ifdef LIBXML_XPATH_ENABLED - ctxt->pctxt->node = ctxt->node; - list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); -#else - list = NULL; -#endif /* LIBXML_XPATH_ENABLED */ - if (list != NULL) { - switch (list->type) { - case XPATH_UNDEFINED: - xmlGenericError(xmlGenericErrorContext, - "%s: no such node\n", arg); - break; - case XPATH_NODESET: - if (list->nodesetval != NULL) { - if (list->nodesetval->nodeNr == 1) { - ctxt->node = list->nodesetval->nodeTab[0]; - if ((ctxt->node != NULL) && - (ctxt->node->type == - XML_NAMESPACE_DECL)) { - xmlGenericError(xmlGenericErrorContext, - "cannot cd to namespace\n"); - ctxt->node = NULL; - } - } else - xmlGenericError(xmlGenericErrorContext, - "%s is a %d Node Set\n", - arg, - list->nodesetval->nodeNr); - } else - xmlGenericError(xmlGenericErrorContext, - "%s is an empty Node Set\n", - arg); - break; - case XPATH_BOOLEAN: - xmlGenericError(xmlGenericErrorContext, - "%s is a Boolean\n", arg); - break; - case XPATH_NUMBER: - xmlGenericError(xmlGenericErrorContext, - "%s is a number\n", arg); - break; - case XPATH_STRING: - xmlGenericError(xmlGenericErrorContext, - "%s is a string\n", arg); - break; - case XPATH_POINT: - xmlGenericError(xmlGenericErrorContext, - "%s is a point\n", arg); - break; - case XPATH_RANGE: - xmlGenericError(xmlGenericErrorContext, - "%s is a range\n", arg); - break; - case XPATH_LOCATIONSET: - xmlGenericError(xmlGenericErrorContext, - "%s is a range\n", arg); - break; - case XPATH_USERS: - xmlGenericError(xmlGenericErrorContext, - "%s is user-defined\n", arg); - break; - case XPATH_XSLT_TREE: - xmlGenericError(xmlGenericErrorContext, - "%s is an XSLT value tree\n", - arg); - break; - } -#ifdef LIBXML_XPATH_ENABLED - xmlXPathFreeObject(list); -#endif - } else { - xmlGenericError(xmlGenericErrorContext, - "%s: no such node\n", arg); - } - ctxt->pctxt->node = NULL; - } -#ifdef LIBXML_OUTPUT_ENABLED - } else if (!strcmp(command, "cat")) { - if (arg[0] == 0) { - xmlShellCat(ctxt, NULL, ctxt->node, NULL); - } else { - ctxt->pctxt->node = ctxt->node; -#ifdef LIBXML_XPATH_ENABLED - ctxt->pctxt->node = ctxt->node; - list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); -#else - list = NULL; -#endif /* LIBXML_XPATH_ENABLED */ - if (list != NULL) { - switch (list->type) { - case XPATH_UNDEFINED: - xmlGenericError(xmlGenericErrorContext, - "%s: no such node\n", arg); - break; - case XPATH_NODESET:{ - int indx; - - if (list->nodesetval == NULL) - break; - - for (indx = 0; - indx < list->nodesetval->nodeNr; - indx++) { - if (i > 0) - fprintf(ctxt->output, " -------\n"); - xmlShellCat(ctxt, NULL, - list->nodesetval-> - nodeTab[indx], NULL); - } - break; - } - case XPATH_BOOLEAN: - xmlGenericError(xmlGenericErrorContext, - "%s is a Boolean\n", arg); - break; - case XPATH_NUMBER: - xmlGenericError(xmlGenericErrorContext, - "%s is a number\n", arg); - break; - case XPATH_STRING: - xmlGenericError(xmlGenericErrorContext, - "%s is a string\n", arg); - break; - case XPATH_POINT: - xmlGenericError(xmlGenericErrorContext, - "%s is a point\n", arg); - break; - case XPATH_RANGE: - xmlGenericError(xmlGenericErrorContext, - "%s is a range\n", arg); - break; - case XPATH_LOCATIONSET: - xmlGenericError(xmlGenericErrorContext, - "%s is a range\n", arg); - break; - case XPATH_USERS: - xmlGenericError(xmlGenericErrorContext, - "%s is user-defined\n", arg); - break; - case XPATH_XSLT_TREE: - xmlGenericError(xmlGenericErrorContext, - "%s is an XSLT value tree\n", - arg); - break; - } -#ifdef LIBXML_XPATH_ENABLED - xmlXPathFreeObject(list); -#endif - } else { - xmlGenericError(xmlGenericErrorContext, - "%s: no such node\n", arg); - } - ctxt->pctxt->node = NULL; - } -#endif /* LIBXML_OUTPUT_ENABLED */ - } else { - xmlGenericError(xmlGenericErrorContext, - "Unknown command %s\n", command); - } - free(cmdline); /* not xmlFree here ! */ - } -#ifdef LIBXML_XPATH_ENABLED - xmlXPathFreeContext(ctxt->pctxt); -#endif /* LIBXML_XPATH_ENABLED */ - if (ctxt->loaded) { - xmlFreeDoc(ctxt->doc); - } - if (ctxt->filename != NULL) - xmlFree(ctxt->filename); - xmlFree(ctxt); - if (cmdline != NULL) - free(cmdline); /* not xmlFree here ! */ -} - -#endif /* LIBXML_XPATH_ENABLED */ -#define bottom_debugXML -#include "elfgcchack.h" -#endif /* LIBXML_DEBUG_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/dict.c b/ThirdParty/libxml2/vtklibxml2/dict.c deleted file mode 100644 index 5fa919c159f..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/dict.c +++ /dev/null @@ -1,901 +0,0 @@ -/* - * dict.c: dictionary of reusable strings, just used to avoid allocation - * and freeing operations. - * - * Copyright (C) 2003 Daniel Veillard. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - * Author: daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#include <libxml/tree.h> -#include <libxml/dict.h> -#include <libxml/xmlmemory.h> -#include <libxml/xmlerror.h> -#include <libxml/globals.h> - -#define MAX_HASH_LEN 4 -#define MIN_DICT_SIZE 128 -#define MAX_DICT_HASH 8 * 2048 - -/* #define ALLOW_REMOVAL */ -/* #define DEBUG_GROW */ - -/* - * An entry in the dictionnary - */ -typedef struct _xmlDictEntry xmlDictEntry; -typedef xmlDictEntry *xmlDictEntryPtr; -struct _xmlDictEntry { - struct _xmlDictEntry *next; - const xmlChar *name; - int len; - int valid; -}; - -typedef struct _xmlDictStrings xmlDictStrings; -typedef xmlDictStrings *xmlDictStringsPtr; -struct _xmlDictStrings { - xmlDictStringsPtr next; - xmlChar *free; - xmlChar *end; - int size; - int nbStrings; - xmlChar array[1]; -}; -/* - * The entire dictionnary - */ -struct _xmlDict { - int ref_counter; - xmlRMutexPtr mutex; - - struct _xmlDictEntry *dict; - int size; - int nbElems; - xmlDictStringsPtr strings; - - struct _xmlDict *subdict; -}; - -/* - * A mutex for modifying the reference counter for shared - * dictionaries. - */ -static xmlRMutexPtr xmlDictMutex = NULL; - -/* - * Whether the dictionary mutex was initialized. - */ -static int xmlDictInitialized = 0; - -/** - * xmlInitializeDict: - * - * Do the dictionary mutex initialization. - * this function is not thread safe, initialization should - * preferably be done once at startup - */ -static int xmlInitializeDict(void) { - if (xmlDictInitialized) - return(1); - - if ((xmlDictMutex = xmlNewRMutex()) == NULL) - return(0); - - xmlDictInitialized = 1; - return(1); -} - -/** - * xmlDictCleanup: - * - * Free the dictionary mutex. - */ -void -xmlDictCleanup(void) { - if (!xmlDictInitialized) - return; - - xmlFreeRMutex(xmlDictMutex); - - xmlDictInitialized = 0; -} - -/* - * xmlDictAddString: - * @dict: the dictionnary - * @name: the name of the userdata - * @len: the length of the name, if -1 it is recomputed - * - * Add the string to the array[s] - * - * Returns the pointer of the local string, or NULL in case of error. - */ -static const xmlChar * -xmlDictAddString(xmlDictPtr dict, const xmlChar *name, int namelen) { - xmlDictStringsPtr pool; - const xmlChar *ret; - int size = 0; /* + sizeof(_xmlDictStrings) == 1024 */ - - pool = dict->strings; - while (pool != NULL) { - if (pool->end - pool->free > namelen) - goto found_pool; - if (pool->size > size) size = pool->size; - pool = pool->next; - } - /* - * Not found, need to allocate - */ - if (pool == NULL) { - if (size == 0) size = 1000; - else size *= 4; /* exponential growth */ - if (size < 4 * namelen) - size = 4 * namelen; /* just in case ! */ - pool = (xmlDictStringsPtr) xmlMalloc(sizeof(xmlDictStrings) + size); - if (pool == NULL) - return(NULL); - pool->size = size; - pool->nbStrings = 0; - pool->free = &pool->array[0]; - pool->end = &pool->array[size]; - pool->next = dict->strings; - dict->strings = pool; - } -found_pool: - ret = pool->free; - memcpy(pool->free, name, namelen); - pool->free += namelen; - *(pool->free++) = 0; - return(ret); -} - -/* - * xmlDictAddQString: - * @dict: the dictionnary - * @prefix: the prefix of the userdata - * @name: the name of the userdata - * @len: the length of the name, if -1 it is recomputed - * - * Add the QName to the array[s] - * - * Returns the pointer of the local string, or NULL in case of error. - */ -static const xmlChar * -xmlDictAddQString(xmlDictPtr dict, const xmlChar *prefix, - const xmlChar *name, int namelen) -{ - xmlDictStringsPtr pool; - const xmlChar *ret; - int size = 0; /* + sizeof(_xmlDictStrings) == 1024 */ - int plen; - - if (prefix == NULL) return(xmlDictAddString(dict, name, namelen)); - plen = xmlStrlen(prefix); - - pool = dict->strings; - while (pool != NULL) { - if (pool->end - pool->free > namelen) - goto found_pool; - if (pool->size > size) size = pool->size; - pool = pool->next; - } - /* - * Not found, need to allocate - */ - if (pool == NULL) { - if (size == 0) size = 1000; - else size *= 4; /* exponential growth */ - if (size < 4 * namelen) - size = 4 * namelen; /* just in case ! */ - pool = (xmlDictStringsPtr) xmlMalloc(sizeof(xmlDictStrings) + size); - if (pool == NULL) - return(NULL); - pool->size = size; - pool->nbStrings = 0; - pool->free = &pool->array[0]; - pool->end = &pool->array[size]; - pool->next = dict->strings; - dict->strings = pool; - } -found_pool: - ret = pool->free; - memcpy(pool->free, prefix, plen); - pool->free += plen; - *(pool->free++) = ':'; - namelen -= plen + 1; - memcpy(pool->free, name, namelen); - pool->free += namelen; - *(pool->free++) = 0; - return(ret); -} - -/* - * xmlDictComputeKey: - * Calculate the hash key - */ -static unsigned long -xmlDictComputeKey(const xmlChar *name, int namelen) { - unsigned long value = 0L; - - if (name == NULL) return(0); - value = *name; - value <<= 5; - if (namelen > 10) { - value += name[namelen - 1]; - namelen = 10; - } - switch (namelen) { - case 10: value += name[9]; - case 9: value += name[8]; - case 8: value += name[7]; - case 7: value += name[6]; - case 6: value += name[5]; - case 5: value += name[4]; - case 4: value += name[3]; - case 3: value += name[2]; - case 2: value += name[1]; - default: break; - } - return(value); -} - -/* - * xmlDictComputeQKey: - * Calculate the hash key - */ -static unsigned long -xmlDictComputeQKey(const xmlChar *prefix, const xmlChar *name, int len) -{ - unsigned long value = 0L; - int plen; - - if (prefix == NULL) - return(xmlDictComputeKey(name, len)); - - plen = xmlStrlen(prefix); - if (plen == 0) - value += 30 * (unsigned long) ':'; - else - value += 30 * (*prefix); - - if (len > 10) { - value += name[len - (plen + 1 + 1)]; - len = 10; - if (plen > 10) - plen = 10; - } - switch (plen) { - case 10: value += prefix[9]; - case 9: value += prefix[8]; - case 8: value += prefix[7]; - case 7: value += prefix[6]; - case 6: value += prefix[5]; - case 5: value += prefix[4]; - case 4: value += prefix[3]; - case 3: value += prefix[2]; - case 2: value += prefix[1]; - case 1: value += prefix[0]; - default: break; - } - len -= plen; - if (len > 0) { - value += (unsigned long) ':'; - len--; - } - switch (len) { - case 10: value += name[9]; - case 9: value += name[8]; - case 8: value += name[7]; - case 7: value += name[6]; - case 6: value += name[5]; - case 5: value += name[4]; - case 4: value += name[3]; - case 3: value += name[2]; - case 2: value += name[1]; - case 1: value += name[0]; - default: break; - } - return(value); -} - -/** - * xmlDictCreate: - * - * Create a new dictionary - * - * Returns the newly created dictionnary, or NULL if an error occured. - */ -xmlDictPtr -xmlDictCreate(void) { - xmlDictPtr dict; - - if (!xmlDictInitialized) - if (!xmlInitializeDict()) - return(NULL); - - dict = xmlMalloc(sizeof(xmlDict)); - if (dict) { - dict->ref_counter = 1; - - dict->size = MIN_DICT_SIZE; - dict->nbElems = 0; - dict->dict = xmlMalloc(MIN_DICT_SIZE * sizeof(xmlDictEntry)); - dict->strings = NULL; - dict->subdict = NULL; - if (dict->dict) { - if ((dict->mutex = xmlNewRMutex()) != NULL) { - memset(dict->dict, 0, MIN_DICT_SIZE * sizeof(xmlDictEntry)); - return(dict); - } - xmlFree(dict->dict); - } - xmlFree(dict); - } - return(NULL); -} - -/** - * xmlDictCreateSub: - * @sub: an existing dictionnary - * - * Create a new dictionary, inheriting strings from the read-only - * dictionnary @sub. On lookup, strings are first searched in the - * new dictionnary, then in @sub, and if not found are created in the - * new dictionnary. - * - * Returns the newly created dictionnary, or NULL if an error occured. - */ -xmlDictPtr -xmlDictCreateSub(xmlDictPtr sub) { - xmlDictPtr dict = xmlDictCreate(); - - if ((dict != NULL) && (sub != NULL)) { - dict->subdict = sub; - xmlDictReference(dict->subdict); - } - return(dict); -} - -/** - * xmlDictReference: - * @dict: the dictionnary - * - * Increment the reference counter of a dictionary - * - * Returns 0 in case of success and -1 in case of error - */ -int -xmlDictReference(xmlDictPtr dict) { - if (!xmlDictInitialized) - if (!xmlInitializeDict()) - return(-1); - - if (dict == NULL) return -1; - xmlRMutexLock(xmlDictMutex); - dict->ref_counter++; - xmlRMutexUnlock(xmlDictMutex); - return(0); -} - -/** - * xmlDictGrow: - * @dict: the dictionnary - * @size: the new size of the dictionnary - * - * resize the dictionnary - * - * Returns 0 in case of success, -1 in case of failure - */ -static int -xmlDictGrow(xmlDictPtr dict, int size) { - unsigned long key; - int oldsize, i; - xmlDictEntryPtr iter, next; - struct _xmlDictEntry *olddict; -#ifdef DEBUG_GROW - unsigned long nbElem = 0; -#endif - - if (dict == NULL) - return(-1); - if (size < 8) - return(-1); - if (size > 8 * 2048) - return(-1); - - oldsize = dict->size; - olddict = dict->dict; - if (olddict == NULL) - return(-1); - - dict->dict = xmlMalloc(size * sizeof(xmlDictEntry)); - if (dict->dict == NULL) { - dict->dict = olddict; - return(-1); - } - memset(dict->dict, 0, size * sizeof(xmlDictEntry)); - dict->size = size; - - /* If the two loops are merged, there would be situations where - a new entry needs to allocated and data copied into it from - the main dict. So instead, we run through the array twice, first - copying all the elements in the main array (where we can't get - conflicts) and then the rest, so we only free (and don't allocate) - */ - for (i = 0; i < oldsize; i++) { - if (olddict[i].valid == 0) - continue; - key = xmlDictComputeKey(olddict[i].name, olddict[i].len) % dict->size; - memcpy(&(dict->dict[key]), &(olddict[i]), sizeof(xmlDictEntry)); - dict->dict[key].next = NULL; -#ifdef DEBUG_GROW - nbElem++; -#endif - } - - for (i = 0; i < oldsize; i++) { - iter = olddict[i].next; - while (iter) { - next = iter->next; - - /* - * put back the entry in the new dict - */ - - key = xmlDictComputeKey(iter->name, iter->len) % dict->size; - if (dict->dict[key].valid == 0) { - memcpy(&(dict->dict[key]), iter, sizeof(xmlDictEntry)); - dict->dict[key].next = NULL; - dict->dict[key].valid = 1; - xmlFree(iter); - } else { - iter->next = dict->dict[key].next; - dict->dict[key].next = iter; - } - -#ifdef DEBUG_GROW - nbElem++; -#endif - - iter = next; - } - } - - xmlFree(olddict); - -#ifdef DEBUG_GROW - xmlGenericError(xmlGenericErrorContext, - "xmlDictGrow : from %d to %d, %d elems\n", oldsize, size, nbElem); -#endif - - return(0); -} - -/** - * xmlDictFree: - * @dict: the dictionnary - * - * Free the hash @dict and its contents. The userdata is - * deallocated with @f if provided. - */ -void -xmlDictFree(xmlDictPtr dict) { - int i; - xmlDictEntryPtr iter; - xmlDictEntryPtr next; - int inside_dict = 0; - xmlDictStringsPtr pool, nextp; - - if (dict == NULL) - return; - - if (!xmlDictInitialized) - if (!xmlInitializeDict()) - return; - - /* decrement the counter, it may be shared by a parser and docs */ - xmlRMutexLock(xmlDictMutex); - dict->ref_counter--; - if (dict->ref_counter > 0) { - xmlRMutexUnlock(xmlDictMutex); - return; - } - - xmlRMutexUnlock(xmlDictMutex); - - if (dict->subdict != NULL) { - xmlDictFree(dict->subdict); - } - - if (dict->dict) { - for(i = 0; ((i < dict->size) && (dict->nbElems > 0)); i++) { - iter = &(dict->dict[i]); - if (iter->valid == 0) - continue; - inside_dict = 1; - while (iter) { - next = iter->next; - if (!inside_dict) - xmlFree(iter); - dict->nbElems--; - inside_dict = 0; - iter = next; - } - inside_dict = 0; - } - xmlFree(dict->dict); - } - pool = dict->strings; - while (pool != NULL) { - nextp = pool->next; - xmlFree(pool); - pool = nextp; - } - xmlFreeRMutex(dict->mutex); - xmlFree(dict); -} - -/** - * xmlDictLookup: - * @dict: the dictionnary - * @name: the name of the userdata - * @len: the length of the name, if -1 it is recomputed - * - * Add the @name to the dictionnary @dict if not present. - * - * Returns the internal copy of the name or NULL in case of internal error - */ -const xmlChar * -xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len) { - unsigned long key, okey, nbi = 0; - xmlDictEntryPtr entry; - xmlDictEntryPtr insert; - const xmlChar *ret; - - if ((dict == NULL) || (name == NULL)) - return(NULL); - - if (len < 0) - len = xmlStrlen(name); - - /* - * Check for duplicate and insertion location. - */ - okey = xmlDictComputeKey(name, len); - key = okey % dict->size; - if (dict->dict[key].valid == 0) { - insert = NULL; - } else { - for (insert = &(dict->dict[key]); insert->next != NULL; - insert = insert->next) { -#ifdef __GNUC__ - if (insert->len == len) { - if (!memcmp(insert->name, name, len)) - return(insert->name); - } -#else - if ((insert->len == len) && - (!xmlStrncmp(insert->name, name, len))) - return(insert->name); -#endif - nbi++; - } -#ifdef __GNUC__ - if (insert->len == len) { - if (!memcmp(insert->name, name, len)) - return(insert->name); - } -#else - if ((insert->len == len) && - (!xmlStrncmp(insert->name, name, len))) - return(insert->name); -#endif - } - - if (dict->subdict) { - key = okey % dict->subdict->size; - if (dict->subdict->dict[key].valid != 0) { - xmlDictEntryPtr tmp; - - for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL; - tmp = tmp->next) { -#ifdef __GNUC__ - if (tmp->len == len) { - if (!memcmp(tmp->name, name, len)) - return(tmp->name); - } -#else - if ((tmp->len == len) && - (!xmlStrncmp(tmp->name, name, len))) - return(tmp->name); -#endif - nbi++; - } -#ifdef __GNUC__ - if (tmp->len == len) { - if (!memcmp(tmp->name, name, len)) - return(tmp->name); - } -#else - if ((tmp->len == len) && - (!xmlStrncmp(tmp->name, name, len))) - return(tmp->name); -#endif - } - key = okey % dict->size; - } - - ret = xmlDictAddString(dict, name, len); - if (ret == NULL) - return(NULL); - if (insert == NULL) { - entry = &(dict->dict[key]); - } else { - entry = xmlMalloc(sizeof(xmlDictEntry)); - if (entry == NULL) - return(NULL); - } - entry->name = ret; - entry->len = len; - entry->next = NULL; - entry->valid = 1; - - - if (insert != NULL) - insert->next = entry; - - dict->nbElems++; - - if ((nbi > MAX_HASH_LEN) && - (dict->size <= ((MAX_DICT_HASH / 2) / MAX_HASH_LEN))) - xmlDictGrow(dict, MAX_HASH_LEN * 2 * dict->size); - /* Note that entry may have been freed at this point by xmlDictGrow */ - - return(ret); -} - -/** - * xmlDictExists: - * @dict: the dictionnary - * @name: the name of the userdata - * @len: the length of the name, if -1 it is recomputed - * - * Check if the @name exists in the dictionnary @dict. - * - * Returns the internal copy of the name or NULL if not found. - */ -const xmlChar * -xmlDictExists(xmlDictPtr dict, const xmlChar *name, int len) { - unsigned long key, okey, nbi = 0; - xmlDictEntryPtr insert; - - if ((dict == NULL) || (name == NULL)) - return(NULL); - - if (len < 0) - len = xmlStrlen(name); - - /* - * Check for duplicate and insertion location. - */ - okey = xmlDictComputeKey(name, len); - key = okey % dict->size; - if (dict->dict[key].valid == 0) { - insert = NULL; - } else { - for (insert = &(dict->dict[key]); insert->next != NULL; - insert = insert->next) { -#ifdef __GNUC__ - if (insert->len == len) { - if (!memcmp(insert->name, name, len)) - return(insert->name); - } -#else - if ((insert->len == len) && - (!xmlStrncmp(insert->name, name, len))) - return(insert->name); -#endif - nbi++; - } -#ifdef __GNUC__ - if (insert->len == len) { - if (!memcmp(insert->name, name, len)) - return(insert->name); - } -#else - if ((insert->len == len) && - (!xmlStrncmp(insert->name, name, len))) - return(insert->name); -#endif - } - - if (dict->subdict) { - key = okey % dict->subdict->size; - if (dict->subdict->dict[key].valid != 0) { - xmlDictEntryPtr tmp; - - for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL; - tmp = tmp->next) { -#ifdef __GNUC__ - if (tmp->len == len) { - if (!memcmp(tmp->name, name, len)) - return(tmp->name); - } -#else - if ((tmp->len == len) && - (!xmlStrncmp(tmp->name, name, len))) - return(tmp->name); -#endif - nbi++; - } -#ifdef __GNUC__ - if (tmp->len == len) { - if (!memcmp(tmp->name, name, len)) - return(tmp->name); - } -#else - if ((tmp->len == len) && - (!xmlStrncmp(tmp->name, name, len))) - return(tmp->name); -#endif - } - key = okey % dict->size; - } - - /* not found */ - return(NULL); -} - -/** - * xmlDictQLookup: - * @dict: the dictionnary - * @prefix: the prefix - * @name: the name - * - * Add the QName @prefix:@name to the hash @dict if not present. - * - * Returns the internal copy of the QName or NULL in case of internal error - */ -const xmlChar * -xmlDictQLookup(xmlDictPtr dict, const xmlChar *prefix, const xmlChar *name) { - unsigned long okey, key, nbi = 0; - xmlDictEntryPtr entry; - xmlDictEntryPtr insert; - const xmlChar *ret; - int len; - - if ((dict == NULL) || (name == NULL)) - return(NULL); - - len = xmlStrlen(name); - if (prefix != NULL) - len += 1 + xmlStrlen(prefix); - - /* - * Check for duplicate and insertion location. - */ - okey = xmlDictComputeQKey(prefix, name, len); - key = okey % dict->size; - if (dict->dict[key].valid == 0) { - insert = NULL; - } else { - for (insert = &(dict->dict[key]); insert->next != NULL; - insert = insert->next) { - if ((insert->len == len) && - (xmlStrQEqual(prefix, name, insert->name))) - return(insert->name); - nbi++; - } - if ((insert->len == len) && - (xmlStrQEqual(prefix, name, insert->name))) - return(insert->name); - } - - if (dict->subdict) { - key = okey % dict->subdict->size; - if (dict->subdict->dict[key].valid != 0) { - xmlDictEntryPtr tmp; - for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL; - tmp = tmp->next) { - if ((tmp->len == len) && - (xmlStrQEqual(prefix, name, tmp->name))) - return(tmp->name); - nbi++; - } - if ((tmp->len == len) && - (xmlStrQEqual(prefix, name, tmp->name))) - return(tmp->name); - } - key = okey % dict->size; - } - - ret = xmlDictAddQString(dict, prefix, name, len); - if (ret == NULL) - return(NULL); - if (insert == NULL) { - entry = &(dict->dict[key]); - } else { - entry = xmlMalloc(sizeof(xmlDictEntry)); - if (entry == NULL) - return(NULL); - } - entry->name = ret; - entry->len = len; - entry->next = NULL; - entry->valid = 1; - - if (insert != NULL) - insert->next = entry; - - dict->nbElems++; - - if ((nbi > MAX_HASH_LEN) && - (dict->size <= ((MAX_DICT_HASH / 2) / MAX_HASH_LEN))) - xmlDictGrow(dict, MAX_HASH_LEN * 2 * dict->size); - /* Note that entry may have been freed at this point by xmlDictGrow */ - - return(ret); -} - -/** - * xmlDictOwns: - * @dict: the dictionnary - * @str: the string - * - * check if a string is owned by the disctionary - * - * Returns 1 if true, 0 if false and -1 in case of error - * -1 in case of error - */ -int -xmlDictOwns(xmlDictPtr dict, const xmlChar *str) { - xmlDictStringsPtr pool; - - if ((dict == NULL) || (str == NULL)) - return(-1); - pool = dict->strings; - while (pool != NULL) { - if ((str >= &pool->array[0]) && (str <= pool->free)) - return(1); - pool = pool->next; - } - if (dict->subdict) - return(xmlDictOwns(dict->subdict, str)); - return(0); -} - -/** - * xmlDictSize: - * @dict: the dictionnary - * - * Query the number of elements installed in the hash @dict. - * - * Returns the number of elements in the dictionnary or - * -1 in case of error - */ -int -xmlDictSize(xmlDictPtr dict) { - if (dict == NULL) - return(-1); - if (dict->subdict) - return(dict->nbElems + dict->subdict->nbElems); - return(dict->nbElems); -} - - -#define bottom_dict -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/elfgcchack.h b/ThirdParty/libxml2/vtklibxml2/elfgcchack.h deleted file mode 100644 index bb1b7790349..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/elfgcchack.h +++ /dev/null @@ -1,17428 +0,0 @@ -/* - * elfgcchack.h: hack by Arjan van de Ven <arjanv@redhat.com> to speed - * up the code when using gcc for call within the library. - * - * Based on the analysis http://people.redhat.com/drepper/dsohowto.pdf - * from Ulrich drepper. Rewritten to be generated from the XML description - * file for libxml2 API - * autogenerated with xsltproc doc/elfgcchack.xsl doc/libxml2-api.xml - */ - -#if 0 /* Disable this feature in VTK until the mangling can be handled. */ -#ifdef IN_LIBXML -#ifdef __GNUC__ -#ifdef PIC -#ifdef linux -#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) - -#include "libxml/c14n.h" -#include "libxml/catalog.h" -#include "libxml/chvalid.h" -#include "libxml/debugXML.h" -#include "libxml/dict.h" -#include "libxml/DOCBparser.h" -#include "libxml/encoding.h" -#include "libxml/entities.h" -#include "libxml/globals.h" -#include "libxml/hash.h" -#include "libxml/HTMLparser.h" -#include "libxml/HTMLtree.h" -#include "libxml/list.h" -#include "libxml/nanoftp.h" -#include "libxml/nanohttp.h" -#include "libxml/parser.h" -#include "libxml/parserInternals.h" -#include "libxml/pattern.h" -#include "libxml/relaxng.h" -#include "libxml/SAX2.h" -#include "libxml/SAX.h" -#include "libxml/schemasInternals.h" -#include "libxml/schematron.h" -#include "libxml/threads.h" -#include "libxml/tree.h" -#include "libxml/uri.h" -#include "libxml/valid.h" -#include "libxml/xinclude.h" -#include "libxml/xlink.h" -#include "libxml/xmlautomata.h" -#include "libxml/xmlerror.h" -#include "libxml/xmlexports.h" -#include "libxml/xmlIO.h" -#include "libxml/xmlmemory.h" -#include "libxml/xmlreader.h" -#include "libxml/xmlregexp.h" -#include "libxml/xmlsave.h" -#include "libxml/xmlschemas.h" -#include "libxml/xmlschemastypes.h" -#include "libxml/xmlstring.h" -#include "libxml/xmlunicode.h" -#include "libxml/xmlversion.h" -#include "libxml/xmlwriter.h" -#include "libxml/xpath.h" -#include "libxml/xpathInternals.h" -#include "libxml/xpointer.h" -#include "libxml/xmlmodule.h" - -/* special hot spot not exported ones */ - -#ifdef bottom_globals -#undef __xmlGenericError -extern __typeof (__xmlGenericError) __xmlGenericError __attribute((alias("__xmlGenericError__internal_alias"))); -#else -#ifndef __xmlGenericError -extern __typeof (__xmlGenericError) __xmlGenericError__internal_alias __attribute((visibility("hidden"))); -#define __xmlGenericError __xmlGenericError__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef __xmlGenericErrorContext -extern __typeof (__xmlGenericErrorContext) __xmlGenericErrorContext __attribute((alias("__xmlGenericErrorContext__internal_alias"))); -#else -#ifndef __xmlGenericErrorContext -extern __typeof (__xmlGenericErrorContext) __xmlGenericErrorContext__internal_alias __attribute((visibility("hidden"))); -#define __xmlGenericErrorContext __xmlGenericErrorContext__internal_alias -#endif -#endif - -/* list generated from libxml2-api.xml */ -#if defined(LIBXML_DOCB_ENABLED) -#ifdef bottom_DOCBparser -#undef docbCreatePushParserCtxt -extern __typeof (docbCreatePushParserCtxt) docbCreatePushParserCtxt __attribute((alias("docbCreatePushParserCtxt__internal_alias"))); -#else -#ifndef docbCreatePushParserCtxt -extern __typeof (docbCreatePushParserCtxt) docbCreatePushParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define docbCreatePushParserCtxt docbCreatePushParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlAttrAllowed -extern __typeof (htmlAttrAllowed) htmlAttrAllowed __attribute((alias("htmlAttrAllowed__internal_alias"))); -#else -#ifndef htmlAttrAllowed -extern __typeof (htmlAttrAllowed) htmlAttrAllowed__internal_alias __attribute((visibility("hidden"))); -#define htmlAttrAllowed htmlAttrAllowed__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlAutoCloseTag -extern __typeof (htmlAutoCloseTag) htmlAutoCloseTag __attribute((alias("htmlAutoCloseTag__internal_alias"))); -#else -#ifndef htmlAutoCloseTag -extern __typeof (htmlAutoCloseTag) htmlAutoCloseTag__internal_alias __attribute((visibility("hidden"))); -#define htmlAutoCloseTag htmlAutoCloseTag__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCreateFileParserCtxt -extern __typeof (htmlCreateFileParserCtxt) htmlCreateFileParserCtxt __attribute((alias("htmlCreateFileParserCtxt__internal_alias"))); -#else -#ifndef htmlCreateFileParserCtxt -extern __typeof (htmlCreateFileParserCtxt) htmlCreateFileParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define htmlCreateFileParserCtxt htmlCreateFileParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCreateMemoryParserCtxt -extern __typeof (htmlCreateMemoryParserCtxt) htmlCreateMemoryParserCtxt __attribute((alias("htmlCreateMemoryParserCtxt__internal_alias"))); -#else -#ifndef htmlCreateMemoryParserCtxt -extern __typeof (htmlCreateMemoryParserCtxt) htmlCreateMemoryParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define htmlCreateMemoryParserCtxt htmlCreateMemoryParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCreatePushParserCtxt -extern __typeof (htmlCreatePushParserCtxt) htmlCreatePushParserCtxt __attribute((alias("htmlCreatePushParserCtxt__internal_alias"))); -#else -#ifndef htmlCreatePushParserCtxt -extern __typeof (htmlCreatePushParserCtxt) htmlCreatePushParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define htmlCreatePushParserCtxt htmlCreatePushParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCtxtReadDoc -extern __typeof (htmlCtxtReadDoc) htmlCtxtReadDoc __attribute((alias("htmlCtxtReadDoc__internal_alias"))); -#else -#ifndef htmlCtxtReadDoc -extern __typeof (htmlCtxtReadDoc) htmlCtxtReadDoc__internal_alias __attribute((visibility("hidden"))); -#define htmlCtxtReadDoc htmlCtxtReadDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCtxtReadFd -extern __typeof (htmlCtxtReadFd) htmlCtxtReadFd __attribute((alias("htmlCtxtReadFd__internal_alias"))); -#else -#ifndef htmlCtxtReadFd -extern __typeof (htmlCtxtReadFd) htmlCtxtReadFd__internal_alias __attribute((visibility("hidden"))); -#define htmlCtxtReadFd htmlCtxtReadFd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCtxtReadFile -extern __typeof (htmlCtxtReadFile) htmlCtxtReadFile __attribute((alias("htmlCtxtReadFile__internal_alias"))); -#else -#ifndef htmlCtxtReadFile -extern __typeof (htmlCtxtReadFile) htmlCtxtReadFile__internal_alias __attribute((visibility("hidden"))); -#define htmlCtxtReadFile htmlCtxtReadFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCtxtReadIO -extern __typeof (htmlCtxtReadIO) htmlCtxtReadIO __attribute((alias("htmlCtxtReadIO__internal_alias"))); -#else -#ifndef htmlCtxtReadIO -extern __typeof (htmlCtxtReadIO) htmlCtxtReadIO__internal_alias __attribute((visibility("hidden"))); -#define htmlCtxtReadIO htmlCtxtReadIO__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCtxtReadMemory -extern __typeof (htmlCtxtReadMemory) htmlCtxtReadMemory __attribute((alias("htmlCtxtReadMemory__internal_alias"))); -#else -#ifndef htmlCtxtReadMemory -extern __typeof (htmlCtxtReadMemory) htmlCtxtReadMemory__internal_alias __attribute((visibility("hidden"))); -#define htmlCtxtReadMemory htmlCtxtReadMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCtxtReset -extern __typeof (htmlCtxtReset) htmlCtxtReset __attribute((alias("htmlCtxtReset__internal_alias"))); -#else -#ifndef htmlCtxtReset -extern __typeof (htmlCtxtReset) htmlCtxtReset__internal_alias __attribute((visibility("hidden"))); -#define htmlCtxtReset htmlCtxtReset__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlCtxtUseOptions -extern __typeof (htmlCtxtUseOptions) htmlCtxtUseOptions __attribute((alias("htmlCtxtUseOptions__internal_alias"))); -#else -#ifndef htmlCtxtUseOptions -extern __typeof (htmlCtxtUseOptions) htmlCtxtUseOptions__internal_alias __attribute((visibility("hidden"))); -#define htmlCtxtUseOptions htmlCtxtUseOptions__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_SAX2 -#undef htmlDefaultSAXHandlerInit -extern __typeof (htmlDefaultSAXHandlerInit) htmlDefaultSAXHandlerInit __attribute((alias("htmlDefaultSAXHandlerInit__internal_alias"))); -#else -#ifndef htmlDefaultSAXHandlerInit -extern __typeof (htmlDefaultSAXHandlerInit) htmlDefaultSAXHandlerInit__internal_alias __attribute((visibility("hidden"))); -#define htmlDefaultSAXHandlerInit htmlDefaultSAXHandlerInit__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlDocContentDumpFormatOutput -extern __typeof (htmlDocContentDumpFormatOutput) htmlDocContentDumpFormatOutput __attribute((alias("htmlDocContentDumpFormatOutput__internal_alias"))); -#else -#ifndef htmlDocContentDumpFormatOutput -extern __typeof (htmlDocContentDumpFormatOutput) htmlDocContentDumpFormatOutput__internal_alias __attribute((visibility("hidden"))); -#define htmlDocContentDumpFormatOutput htmlDocContentDumpFormatOutput__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlDocContentDumpOutput -extern __typeof (htmlDocContentDumpOutput) htmlDocContentDumpOutput __attribute((alias("htmlDocContentDumpOutput__internal_alias"))); -#else -#ifndef htmlDocContentDumpOutput -extern __typeof (htmlDocContentDumpOutput) htmlDocContentDumpOutput__internal_alias __attribute((visibility("hidden"))); -#define htmlDocContentDumpOutput htmlDocContentDumpOutput__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlDocDump -extern __typeof (htmlDocDump) htmlDocDump __attribute((alias("htmlDocDump__internal_alias"))); -#else -#ifndef htmlDocDump -extern __typeof (htmlDocDump) htmlDocDump__internal_alias __attribute((visibility("hidden"))); -#define htmlDocDump htmlDocDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlDocDumpMemory -extern __typeof (htmlDocDumpMemory) htmlDocDumpMemory __attribute((alias("htmlDocDumpMemory__internal_alias"))); -#else -#ifndef htmlDocDumpMemory -extern __typeof (htmlDocDumpMemory) htmlDocDumpMemory__internal_alias __attribute((visibility("hidden"))); -#define htmlDocDumpMemory htmlDocDumpMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlDocDumpMemoryFormat -extern __typeof (htmlDocDumpMemoryFormat) htmlDocDumpMemoryFormat __attribute((alias("htmlDocDumpMemoryFormat__internal_alias"))); -#else -#ifndef htmlDocDumpMemoryFormat -extern __typeof (htmlDocDumpMemoryFormat) htmlDocDumpMemoryFormat__internal_alias __attribute((visibility("hidden"))); -#define htmlDocDumpMemoryFormat htmlDocDumpMemoryFormat__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlElementAllowedHere -extern __typeof (htmlElementAllowedHere) htmlElementAllowedHere __attribute((alias("htmlElementAllowedHere__internal_alias"))); -#else -#ifndef htmlElementAllowedHere -extern __typeof (htmlElementAllowedHere) htmlElementAllowedHere__internal_alias __attribute((visibility("hidden"))); -#define htmlElementAllowedHere htmlElementAllowedHere__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlElementStatusHere -extern __typeof (htmlElementStatusHere) htmlElementStatusHere __attribute((alias("htmlElementStatusHere__internal_alias"))); -#else -#ifndef htmlElementStatusHere -extern __typeof (htmlElementStatusHere) htmlElementStatusHere__internal_alias __attribute((visibility("hidden"))); -#define htmlElementStatusHere htmlElementStatusHere__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlEncodeEntities -extern __typeof (htmlEncodeEntities) htmlEncodeEntities __attribute((alias("htmlEncodeEntities__internal_alias"))); -#else -#ifndef htmlEncodeEntities -extern __typeof (htmlEncodeEntities) htmlEncodeEntities__internal_alias __attribute((visibility("hidden"))); -#define htmlEncodeEntities htmlEncodeEntities__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlEntityLookup -extern __typeof (htmlEntityLookup) htmlEntityLookup __attribute((alias("htmlEntityLookup__internal_alias"))); -#else -#ifndef htmlEntityLookup -extern __typeof (htmlEntityLookup) htmlEntityLookup__internal_alias __attribute((visibility("hidden"))); -#define htmlEntityLookup htmlEntityLookup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlEntityValueLookup -extern __typeof (htmlEntityValueLookup) htmlEntityValueLookup __attribute((alias("htmlEntityValueLookup__internal_alias"))); -#else -#ifndef htmlEntityValueLookup -extern __typeof (htmlEntityValueLookup) htmlEntityValueLookup__internal_alias __attribute((visibility("hidden"))); -#define htmlEntityValueLookup htmlEntityValueLookup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlFreeParserCtxt -extern __typeof (htmlFreeParserCtxt) htmlFreeParserCtxt __attribute((alias("htmlFreeParserCtxt__internal_alias"))); -#else -#ifndef htmlFreeParserCtxt -extern __typeof (htmlFreeParserCtxt) htmlFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define htmlFreeParserCtxt htmlFreeParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlGetMetaEncoding -extern __typeof (htmlGetMetaEncoding) htmlGetMetaEncoding __attribute((alias("htmlGetMetaEncoding__internal_alias"))); -#else -#ifndef htmlGetMetaEncoding -extern __typeof (htmlGetMetaEncoding) htmlGetMetaEncoding__internal_alias __attribute((visibility("hidden"))); -#define htmlGetMetaEncoding htmlGetMetaEncoding__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlHandleOmittedElem -extern __typeof (htmlHandleOmittedElem) htmlHandleOmittedElem __attribute((alias("htmlHandleOmittedElem__internal_alias"))); -#else -#ifndef htmlHandleOmittedElem -extern __typeof (htmlHandleOmittedElem) htmlHandleOmittedElem__internal_alias __attribute((visibility("hidden"))); -#define htmlHandleOmittedElem htmlHandleOmittedElem__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlInitAutoClose -extern __typeof (htmlInitAutoClose) htmlInitAutoClose __attribute((alias("htmlInitAutoClose__internal_alias"))); -#else -#ifndef htmlInitAutoClose -extern __typeof (htmlInitAutoClose) htmlInitAutoClose__internal_alias __attribute((visibility("hidden"))); -#define htmlInitAutoClose htmlInitAutoClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlIsAutoClosed -extern __typeof (htmlIsAutoClosed) htmlIsAutoClosed __attribute((alias("htmlIsAutoClosed__internal_alias"))); -#else -#ifndef htmlIsAutoClosed -extern __typeof (htmlIsAutoClosed) htmlIsAutoClosed__internal_alias __attribute((visibility("hidden"))); -#define htmlIsAutoClosed htmlIsAutoClosed__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlIsBooleanAttr -extern __typeof (htmlIsBooleanAttr) htmlIsBooleanAttr __attribute((alias("htmlIsBooleanAttr__internal_alias"))); -#else -#ifndef htmlIsBooleanAttr -extern __typeof (htmlIsBooleanAttr) htmlIsBooleanAttr__internal_alias __attribute((visibility("hidden"))); -#define htmlIsBooleanAttr htmlIsBooleanAttr__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlIsScriptAttribute -extern __typeof (htmlIsScriptAttribute) htmlIsScriptAttribute __attribute((alias("htmlIsScriptAttribute__internal_alias"))); -#else -#ifndef htmlIsScriptAttribute -extern __typeof (htmlIsScriptAttribute) htmlIsScriptAttribute__internal_alias __attribute((visibility("hidden"))); -#define htmlIsScriptAttribute htmlIsScriptAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlNewDoc -extern __typeof (htmlNewDoc) htmlNewDoc __attribute((alias("htmlNewDoc__internal_alias"))); -#else -#ifndef htmlNewDoc -extern __typeof (htmlNewDoc) htmlNewDoc__internal_alias __attribute((visibility("hidden"))); -#define htmlNewDoc htmlNewDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlNewDocNoDtD -extern __typeof (htmlNewDocNoDtD) htmlNewDocNoDtD __attribute((alias("htmlNewDocNoDtD__internal_alias"))); -#else -#ifndef htmlNewDocNoDtD -extern __typeof (htmlNewDocNoDtD) htmlNewDocNoDtD__internal_alias __attribute((visibility("hidden"))); -#define htmlNewDocNoDtD htmlNewDocNoDtD__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlNodeDump -extern __typeof (htmlNodeDump) htmlNodeDump __attribute((alias("htmlNodeDump__internal_alias"))); -#else -#ifndef htmlNodeDump -extern __typeof (htmlNodeDump) htmlNodeDump__internal_alias __attribute((visibility("hidden"))); -#define htmlNodeDump htmlNodeDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlNodeDumpFile -extern __typeof (htmlNodeDumpFile) htmlNodeDumpFile __attribute((alias("htmlNodeDumpFile__internal_alias"))); -#else -#ifndef htmlNodeDumpFile -extern __typeof (htmlNodeDumpFile) htmlNodeDumpFile__internal_alias __attribute((visibility("hidden"))); -#define htmlNodeDumpFile htmlNodeDumpFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlNodeDumpFileFormat -extern __typeof (htmlNodeDumpFileFormat) htmlNodeDumpFileFormat __attribute((alias("htmlNodeDumpFileFormat__internal_alias"))); -#else -#ifndef htmlNodeDumpFileFormat -extern __typeof (htmlNodeDumpFileFormat) htmlNodeDumpFileFormat__internal_alias __attribute((visibility("hidden"))); -#define htmlNodeDumpFileFormat htmlNodeDumpFileFormat__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlNodeDumpFormatOutput -extern __typeof (htmlNodeDumpFormatOutput) htmlNodeDumpFormatOutput __attribute((alias("htmlNodeDumpFormatOutput__internal_alias"))); -#else -#ifndef htmlNodeDumpFormatOutput -extern __typeof (htmlNodeDumpFormatOutput) htmlNodeDumpFormatOutput__internal_alias __attribute((visibility("hidden"))); -#define htmlNodeDumpFormatOutput htmlNodeDumpFormatOutput__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlNodeDumpOutput -extern __typeof (htmlNodeDumpOutput) htmlNodeDumpOutput __attribute((alias("htmlNodeDumpOutput__internal_alias"))); -#else -#ifndef htmlNodeDumpOutput -extern __typeof (htmlNodeDumpOutput) htmlNodeDumpOutput__internal_alias __attribute((visibility("hidden"))); -#define htmlNodeDumpOutput htmlNodeDumpOutput__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlNodeStatus -extern __typeof (htmlNodeStatus) htmlNodeStatus __attribute((alias("htmlNodeStatus__internal_alias"))); -#else -#ifndef htmlNodeStatus -extern __typeof (htmlNodeStatus) htmlNodeStatus__internal_alias __attribute((visibility("hidden"))); -#define htmlNodeStatus htmlNodeStatus__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlParseCharRef -extern __typeof (htmlParseCharRef) htmlParseCharRef __attribute((alias("htmlParseCharRef__internal_alias"))); -#else -#ifndef htmlParseCharRef -extern __typeof (htmlParseCharRef) htmlParseCharRef__internal_alias __attribute((visibility("hidden"))); -#define htmlParseCharRef htmlParseCharRef__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlParseChunk -extern __typeof (htmlParseChunk) htmlParseChunk __attribute((alias("htmlParseChunk__internal_alias"))); -#else -#ifndef htmlParseChunk -extern __typeof (htmlParseChunk) htmlParseChunk__internal_alias __attribute((visibility("hidden"))); -#define htmlParseChunk htmlParseChunk__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlParseDoc -extern __typeof (htmlParseDoc) htmlParseDoc __attribute((alias("htmlParseDoc__internal_alias"))); -#else -#ifndef htmlParseDoc -extern __typeof (htmlParseDoc) htmlParseDoc__internal_alias __attribute((visibility("hidden"))); -#define htmlParseDoc htmlParseDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlParseDocument -extern __typeof (htmlParseDocument) htmlParseDocument __attribute((alias("htmlParseDocument__internal_alias"))); -#else -#ifndef htmlParseDocument -extern __typeof (htmlParseDocument) htmlParseDocument__internal_alias __attribute((visibility("hidden"))); -#define htmlParseDocument htmlParseDocument__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlParseElement -extern __typeof (htmlParseElement) htmlParseElement __attribute((alias("htmlParseElement__internal_alias"))); -#else -#ifndef htmlParseElement -extern __typeof (htmlParseElement) htmlParseElement__internal_alias __attribute((visibility("hidden"))); -#define htmlParseElement htmlParseElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlParseEntityRef -extern __typeof (htmlParseEntityRef) htmlParseEntityRef __attribute((alias("htmlParseEntityRef__internal_alias"))); -#else -#ifndef htmlParseEntityRef -extern __typeof (htmlParseEntityRef) htmlParseEntityRef__internal_alias __attribute((visibility("hidden"))); -#define htmlParseEntityRef htmlParseEntityRef__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlParseFile -extern __typeof (htmlParseFile) htmlParseFile __attribute((alias("htmlParseFile__internal_alias"))); -#else -#ifndef htmlParseFile -extern __typeof (htmlParseFile) htmlParseFile__internal_alias __attribute((visibility("hidden"))); -#define htmlParseFile htmlParseFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlReadDoc -extern __typeof (htmlReadDoc) htmlReadDoc __attribute((alias("htmlReadDoc__internal_alias"))); -#else -#ifndef htmlReadDoc -extern __typeof (htmlReadDoc) htmlReadDoc__internal_alias __attribute((visibility("hidden"))); -#define htmlReadDoc htmlReadDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlReadFd -extern __typeof (htmlReadFd) htmlReadFd __attribute((alias("htmlReadFd__internal_alias"))); -#else -#ifndef htmlReadFd -extern __typeof (htmlReadFd) htmlReadFd__internal_alias __attribute((visibility("hidden"))); -#define htmlReadFd htmlReadFd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlReadFile -extern __typeof (htmlReadFile) htmlReadFile __attribute((alias("htmlReadFile__internal_alias"))); -#else -#ifndef htmlReadFile -extern __typeof (htmlReadFile) htmlReadFile__internal_alias __attribute((visibility("hidden"))); -#define htmlReadFile htmlReadFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlReadIO -extern __typeof (htmlReadIO) htmlReadIO __attribute((alias("htmlReadIO__internal_alias"))); -#else -#ifndef htmlReadIO -extern __typeof (htmlReadIO) htmlReadIO__internal_alias __attribute((visibility("hidden"))); -#define htmlReadIO htmlReadIO__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlReadMemory -extern __typeof (htmlReadMemory) htmlReadMemory __attribute((alias("htmlReadMemory__internal_alias"))); -#else -#ifndef htmlReadMemory -extern __typeof (htmlReadMemory) htmlReadMemory__internal_alias __attribute((visibility("hidden"))); -#define htmlReadMemory htmlReadMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlSAXParseDoc -extern __typeof (htmlSAXParseDoc) htmlSAXParseDoc __attribute((alias("htmlSAXParseDoc__internal_alias"))); -#else -#ifndef htmlSAXParseDoc -extern __typeof (htmlSAXParseDoc) htmlSAXParseDoc__internal_alias __attribute((visibility("hidden"))); -#define htmlSAXParseDoc htmlSAXParseDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlSAXParseFile -extern __typeof (htmlSAXParseFile) htmlSAXParseFile __attribute((alias("htmlSAXParseFile__internal_alias"))); -#else -#ifndef htmlSAXParseFile -extern __typeof (htmlSAXParseFile) htmlSAXParseFile__internal_alias __attribute((visibility("hidden"))); -#define htmlSAXParseFile htmlSAXParseFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlSaveFile -extern __typeof (htmlSaveFile) htmlSaveFile __attribute((alias("htmlSaveFile__internal_alias"))); -#else -#ifndef htmlSaveFile -extern __typeof (htmlSaveFile) htmlSaveFile__internal_alias __attribute((visibility("hidden"))); -#define htmlSaveFile htmlSaveFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlSaveFileEnc -extern __typeof (htmlSaveFileEnc) htmlSaveFileEnc __attribute((alias("htmlSaveFileEnc__internal_alias"))); -#else -#ifndef htmlSaveFileEnc -extern __typeof (htmlSaveFileEnc) htmlSaveFileEnc__internal_alias __attribute((visibility("hidden"))); -#define htmlSaveFileEnc htmlSaveFileEnc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlSaveFileFormat -extern __typeof (htmlSaveFileFormat) htmlSaveFileFormat __attribute((alias("htmlSaveFileFormat__internal_alias"))); -#else -#ifndef htmlSaveFileFormat -extern __typeof (htmlSaveFileFormat) htmlSaveFileFormat__internal_alias __attribute((visibility("hidden"))); -#define htmlSaveFileFormat htmlSaveFileFormat__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLtree -#undef htmlSetMetaEncoding -extern __typeof (htmlSetMetaEncoding) htmlSetMetaEncoding __attribute((alias("htmlSetMetaEncoding__internal_alias"))); -#else -#ifndef htmlSetMetaEncoding -extern __typeof (htmlSetMetaEncoding) htmlSetMetaEncoding__internal_alias __attribute((visibility("hidden"))); -#define htmlSetMetaEncoding htmlSetMetaEncoding__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_HTMLparser -#undef htmlTagLookup -extern __typeof (htmlTagLookup) htmlTagLookup __attribute((alias("htmlTagLookup__internal_alias"))); -#else -#ifndef htmlTagLookup -extern __typeof (htmlTagLookup) htmlTagLookup__internal_alias __attribute((visibility("hidden"))); -#define htmlTagLookup htmlTagLookup__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef inputPop -extern __typeof (inputPop) inputPop __attribute((alias("inputPop__internal_alias"))); -#else -#ifndef inputPop -extern __typeof (inputPop) inputPop__internal_alias __attribute((visibility("hidden"))); -#define inputPop inputPop__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef inputPush -extern __typeof (inputPush) inputPush __attribute((alias("inputPush__internal_alias"))); -#else -#ifndef inputPush -extern __typeof (inputPush) inputPush__internal_alias __attribute((visibility("hidden"))); -#define inputPush inputPush__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef namePop -extern __typeof (namePop) namePop __attribute((alias("namePop__internal_alias"))); -#else -#ifndef namePop -extern __typeof (namePop) namePop__internal_alias __attribute((visibility("hidden"))); -#define namePop namePop__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef namePush -extern __typeof (namePush) namePush __attribute((alias("namePush__internal_alias"))); -#else -#ifndef namePush -extern __typeof (namePush) namePush__internal_alias __attribute((visibility("hidden"))); -#define namePush namePush__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef nodePop -extern __typeof (nodePop) nodePop __attribute((alias("nodePop__internal_alias"))); -#else -#ifndef nodePop -extern __typeof (nodePop) nodePop__internal_alias __attribute((visibility("hidden"))); -#define nodePop nodePop__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef nodePush -extern __typeof (nodePush) nodePush __attribute((alias("nodePush__internal_alias"))); -#else -#ifndef nodePush -extern __typeof (nodePush) nodePush__internal_alias __attribute((visibility("hidden"))); -#define nodePush nodePush__internal_alias -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef valuePop -extern __typeof (valuePop) valuePop __attribute((alias("valuePop__internal_alias"))); -#else -#ifndef valuePop -extern __typeof (valuePop) valuePop__internal_alias __attribute((visibility("hidden"))); -#define valuePop valuePop__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef valuePush -extern __typeof (valuePush) valuePush __attribute((alias("valuePush__internal_alias"))); -#else -#ifndef valuePush -extern __typeof (valuePush) valuePush__internal_alias __attribute((visibility("hidden"))); -#define valuePush valuePush__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlACatalogAdd -extern __typeof (xmlACatalogAdd) xmlACatalogAdd __attribute((alias("xmlACatalogAdd__internal_alias"))); -#else -#ifndef xmlACatalogAdd -extern __typeof (xmlACatalogAdd) xmlACatalogAdd__internal_alias __attribute((visibility("hidden"))); -#define xmlACatalogAdd xmlACatalogAdd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_catalog -#undef xmlACatalogDump -extern __typeof (xmlACatalogDump) xmlACatalogDump __attribute((alias("xmlACatalogDump__internal_alias"))); -#else -#ifndef xmlACatalogDump -extern __typeof (xmlACatalogDump) xmlACatalogDump__internal_alias __attribute((visibility("hidden"))); -#define xmlACatalogDump xmlACatalogDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlACatalogRemove -extern __typeof (xmlACatalogRemove) xmlACatalogRemove __attribute((alias("xmlACatalogRemove__internal_alias"))); -#else -#ifndef xmlACatalogRemove -extern __typeof (xmlACatalogRemove) xmlACatalogRemove__internal_alias __attribute((visibility("hidden"))); -#define xmlACatalogRemove xmlACatalogRemove__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlACatalogResolve -extern __typeof (xmlACatalogResolve) xmlACatalogResolve __attribute((alias("xmlACatalogResolve__internal_alias"))); -#else -#ifndef xmlACatalogResolve -extern __typeof (xmlACatalogResolve) xmlACatalogResolve__internal_alias __attribute((visibility("hidden"))); -#define xmlACatalogResolve xmlACatalogResolve__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlACatalogResolvePublic -extern __typeof (xmlACatalogResolvePublic) xmlACatalogResolvePublic __attribute((alias("xmlACatalogResolvePublic__internal_alias"))); -#else -#ifndef xmlACatalogResolvePublic -extern __typeof (xmlACatalogResolvePublic) xmlACatalogResolvePublic__internal_alias __attribute((visibility("hidden"))); -#define xmlACatalogResolvePublic xmlACatalogResolvePublic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlACatalogResolveSystem -extern __typeof (xmlACatalogResolveSystem) xmlACatalogResolveSystem __attribute((alias("xmlACatalogResolveSystem__internal_alias"))); -#else -#ifndef xmlACatalogResolveSystem -extern __typeof (xmlACatalogResolveSystem) xmlACatalogResolveSystem__internal_alias __attribute((visibility("hidden"))); -#define xmlACatalogResolveSystem xmlACatalogResolveSystem__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlACatalogResolveURI -extern __typeof (xmlACatalogResolveURI) xmlACatalogResolveURI __attribute((alias("xmlACatalogResolveURI__internal_alias"))); -#else -#ifndef xmlACatalogResolveURI -extern __typeof (xmlACatalogResolveURI) xmlACatalogResolveURI__internal_alias __attribute((visibility("hidden"))); -#define xmlACatalogResolveURI xmlACatalogResolveURI__internal_alias -#endif -#endif -#endif - -#ifdef bottom_valid -#undef xmlAddAttributeDecl -extern __typeof (xmlAddAttributeDecl) xmlAddAttributeDecl __attribute((alias("xmlAddAttributeDecl__internal_alias"))); -#else -#ifndef xmlAddAttributeDecl -extern __typeof (xmlAddAttributeDecl) xmlAddAttributeDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlAddAttributeDecl xmlAddAttributeDecl__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlAddChild -extern __typeof (xmlAddChild) xmlAddChild __attribute((alias("xmlAddChild__internal_alias"))); -#else -#ifndef xmlAddChild -extern __typeof (xmlAddChild) xmlAddChild__internal_alias __attribute((visibility("hidden"))); -#define xmlAddChild xmlAddChild__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlAddChildList -extern __typeof (xmlAddChildList) xmlAddChildList __attribute((alias("xmlAddChildList__internal_alias"))); -#else -#ifndef xmlAddChildList -extern __typeof (xmlAddChildList) xmlAddChildList__internal_alias __attribute((visibility("hidden"))); -#define xmlAddChildList xmlAddChildList__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlAddDocEntity -extern __typeof (xmlAddDocEntity) xmlAddDocEntity __attribute((alias("xmlAddDocEntity__internal_alias"))); -#else -#ifndef xmlAddDocEntity -extern __typeof (xmlAddDocEntity) xmlAddDocEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlAddDocEntity xmlAddDocEntity__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlAddDtdEntity -extern __typeof (xmlAddDtdEntity) xmlAddDtdEntity __attribute((alias("xmlAddDtdEntity__internal_alias"))); -#else -#ifndef xmlAddDtdEntity -extern __typeof (xmlAddDtdEntity) xmlAddDtdEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlAddDtdEntity xmlAddDtdEntity__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlAddElementDecl -extern __typeof (xmlAddElementDecl) xmlAddElementDecl __attribute((alias("xmlAddElementDecl__internal_alias"))); -#else -#ifndef xmlAddElementDecl -extern __typeof (xmlAddElementDecl) xmlAddElementDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlAddElementDecl xmlAddElementDecl__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlAddEncodingAlias -extern __typeof (xmlAddEncodingAlias) xmlAddEncodingAlias __attribute((alias("xmlAddEncodingAlias__internal_alias"))); -#else -#ifndef xmlAddEncodingAlias -extern __typeof (xmlAddEncodingAlias) xmlAddEncodingAlias__internal_alias __attribute((visibility("hidden"))); -#define xmlAddEncodingAlias xmlAddEncodingAlias__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlAddID -extern __typeof (xmlAddID) xmlAddID __attribute((alias("xmlAddID__internal_alias"))); -#else -#ifndef xmlAddID -extern __typeof (xmlAddID) xmlAddID__internal_alias __attribute((visibility("hidden"))); -#define xmlAddID xmlAddID__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlAddNextSibling -extern __typeof (xmlAddNextSibling) xmlAddNextSibling __attribute((alias("xmlAddNextSibling__internal_alias"))); -#else -#ifndef xmlAddNextSibling -extern __typeof (xmlAddNextSibling) xmlAddNextSibling__internal_alias __attribute((visibility("hidden"))); -#define xmlAddNextSibling xmlAddNextSibling__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlAddNotationDecl -extern __typeof (xmlAddNotationDecl) xmlAddNotationDecl __attribute((alias("xmlAddNotationDecl__internal_alias"))); -#else -#ifndef xmlAddNotationDecl -extern __typeof (xmlAddNotationDecl) xmlAddNotationDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlAddNotationDecl xmlAddNotationDecl__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlAddPrevSibling -extern __typeof (xmlAddPrevSibling) xmlAddPrevSibling __attribute((alias("xmlAddPrevSibling__internal_alias"))); -#else -#ifndef xmlAddPrevSibling -extern __typeof (xmlAddPrevSibling) xmlAddPrevSibling__internal_alias __attribute((visibility("hidden"))); -#define xmlAddPrevSibling xmlAddPrevSibling__internal_alias -#endif -#endif -#endif - -#ifdef bottom_valid -#undef xmlAddRef -extern __typeof (xmlAddRef) xmlAddRef __attribute((alias("xmlAddRef__internal_alias"))); -#else -#ifndef xmlAddRef -extern __typeof (xmlAddRef) xmlAddRef__internal_alias __attribute((visibility("hidden"))); -#define xmlAddRef xmlAddRef__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlAddSibling -extern __typeof (xmlAddSibling) xmlAddSibling __attribute((alias("xmlAddSibling__internal_alias"))); -#else -#ifndef xmlAddSibling -extern __typeof (xmlAddSibling) xmlAddSibling__internal_alias __attribute((visibility("hidden"))); -#define xmlAddSibling xmlAddSibling__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlAllocOutputBuffer -extern __typeof (xmlAllocOutputBuffer) xmlAllocOutputBuffer __attribute((alias("xmlAllocOutputBuffer__internal_alias"))); -#else -#ifndef xmlAllocOutputBuffer -extern __typeof (xmlAllocOutputBuffer) xmlAllocOutputBuffer__internal_alias __attribute((visibility("hidden"))); -#define xmlAllocOutputBuffer xmlAllocOutputBuffer__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlAllocParserInputBuffer -extern __typeof (xmlAllocParserInputBuffer) xmlAllocParserInputBuffer __attribute((alias("xmlAllocParserInputBuffer__internal_alias"))); -#else -#ifndef xmlAllocParserInputBuffer -extern __typeof (xmlAllocParserInputBuffer) xmlAllocParserInputBuffer__internal_alias __attribute((visibility("hidden"))); -#define xmlAllocParserInputBuffer xmlAllocParserInputBuffer__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlAttrSerializeTxtContent -extern __typeof (xmlAttrSerializeTxtContent) xmlAttrSerializeTxtContent __attribute((alias("xmlAttrSerializeTxtContent__internal_alias"))); -#else -#ifndef xmlAttrSerializeTxtContent -extern __typeof (xmlAttrSerializeTxtContent) xmlAttrSerializeTxtContent__internal_alias __attribute((visibility("hidden"))); -#define xmlAttrSerializeTxtContent xmlAttrSerializeTxtContent__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataCompile -extern __typeof (xmlAutomataCompile) xmlAutomataCompile __attribute((alias("xmlAutomataCompile__internal_alias"))); -#else -#ifndef xmlAutomataCompile -extern __typeof (xmlAutomataCompile) xmlAutomataCompile__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataCompile xmlAutomataCompile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataGetInitState -extern __typeof (xmlAutomataGetInitState) xmlAutomataGetInitState __attribute((alias("xmlAutomataGetInitState__internal_alias"))); -#else -#ifndef xmlAutomataGetInitState -extern __typeof (xmlAutomataGetInitState) xmlAutomataGetInitState__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataGetInitState xmlAutomataGetInitState__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataIsDeterminist -extern __typeof (xmlAutomataIsDeterminist) xmlAutomataIsDeterminist __attribute((alias("xmlAutomataIsDeterminist__internal_alias"))); -#else -#ifndef xmlAutomataIsDeterminist -extern __typeof (xmlAutomataIsDeterminist) xmlAutomataIsDeterminist__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataIsDeterminist xmlAutomataIsDeterminist__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewAllTrans -extern __typeof (xmlAutomataNewAllTrans) xmlAutomataNewAllTrans __attribute((alias("xmlAutomataNewAllTrans__internal_alias"))); -#else -#ifndef xmlAutomataNewAllTrans -extern __typeof (xmlAutomataNewAllTrans) xmlAutomataNewAllTrans__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewAllTrans xmlAutomataNewAllTrans__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewCountTrans -extern __typeof (xmlAutomataNewCountTrans) xmlAutomataNewCountTrans __attribute((alias("xmlAutomataNewCountTrans__internal_alias"))); -#else -#ifndef xmlAutomataNewCountTrans -extern __typeof (xmlAutomataNewCountTrans) xmlAutomataNewCountTrans__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewCountTrans xmlAutomataNewCountTrans__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewCountTrans2 -extern __typeof (xmlAutomataNewCountTrans2) xmlAutomataNewCountTrans2 __attribute((alias("xmlAutomataNewCountTrans2__internal_alias"))); -#else -#ifndef xmlAutomataNewCountTrans2 -extern __typeof (xmlAutomataNewCountTrans2) xmlAutomataNewCountTrans2__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewCountTrans2 xmlAutomataNewCountTrans2__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewCountedTrans -extern __typeof (xmlAutomataNewCountedTrans) xmlAutomataNewCountedTrans __attribute((alias("xmlAutomataNewCountedTrans__internal_alias"))); -#else -#ifndef xmlAutomataNewCountedTrans -extern __typeof (xmlAutomataNewCountedTrans) xmlAutomataNewCountedTrans__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewCountedTrans xmlAutomataNewCountedTrans__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewCounter -extern __typeof (xmlAutomataNewCounter) xmlAutomataNewCounter __attribute((alias("xmlAutomataNewCounter__internal_alias"))); -#else -#ifndef xmlAutomataNewCounter -extern __typeof (xmlAutomataNewCounter) xmlAutomataNewCounter__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewCounter xmlAutomataNewCounter__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewCounterTrans -extern __typeof (xmlAutomataNewCounterTrans) xmlAutomataNewCounterTrans __attribute((alias("xmlAutomataNewCounterTrans__internal_alias"))); -#else -#ifndef xmlAutomataNewCounterTrans -extern __typeof (xmlAutomataNewCounterTrans) xmlAutomataNewCounterTrans__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewCounterTrans xmlAutomataNewCounterTrans__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewEpsilon -extern __typeof (xmlAutomataNewEpsilon) xmlAutomataNewEpsilon __attribute((alias("xmlAutomataNewEpsilon__internal_alias"))); -#else -#ifndef xmlAutomataNewEpsilon -extern __typeof (xmlAutomataNewEpsilon) xmlAutomataNewEpsilon__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewEpsilon xmlAutomataNewEpsilon__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewNegTrans -extern __typeof (xmlAutomataNewNegTrans) xmlAutomataNewNegTrans __attribute((alias("xmlAutomataNewNegTrans__internal_alias"))); -#else -#ifndef xmlAutomataNewNegTrans -extern __typeof (xmlAutomataNewNegTrans) xmlAutomataNewNegTrans__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewNegTrans xmlAutomataNewNegTrans__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewOnceTrans -extern __typeof (xmlAutomataNewOnceTrans) xmlAutomataNewOnceTrans __attribute((alias("xmlAutomataNewOnceTrans__internal_alias"))); -#else -#ifndef xmlAutomataNewOnceTrans -extern __typeof (xmlAutomataNewOnceTrans) xmlAutomataNewOnceTrans__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewOnceTrans xmlAutomataNewOnceTrans__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewOnceTrans2 -extern __typeof (xmlAutomataNewOnceTrans2) xmlAutomataNewOnceTrans2 __attribute((alias("xmlAutomataNewOnceTrans2__internal_alias"))); -#else -#ifndef xmlAutomataNewOnceTrans2 -extern __typeof (xmlAutomataNewOnceTrans2) xmlAutomataNewOnceTrans2__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewOnceTrans2 xmlAutomataNewOnceTrans2__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewState -extern __typeof (xmlAutomataNewState) xmlAutomataNewState __attribute((alias("xmlAutomataNewState__internal_alias"))); -#else -#ifndef xmlAutomataNewState -extern __typeof (xmlAutomataNewState) xmlAutomataNewState__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewState xmlAutomataNewState__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewTransition -extern __typeof (xmlAutomataNewTransition) xmlAutomataNewTransition __attribute((alias("xmlAutomataNewTransition__internal_alias"))); -#else -#ifndef xmlAutomataNewTransition -extern __typeof (xmlAutomataNewTransition) xmlAutomataNewTransition__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewTransition xmlAutomataNewTransition__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataNewTransition2 -extern __typeof (xmlAutomataNewTransition2) xmlAutomataNewTransition2 __attribute((alias("xmlAutomataNewTransition2__internal_alias"))); -#else -#ifndef xmlAutomataNewTransition2 -extern __typeof (xmlAutomataNewTransition2) xmlAutomataNewTransition2__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataNewTransition2 xmlAutomataNewTransition2__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlAutomataSetFinalState -extern __typeof (xmlAutomataSetFinalState) xmlAutomataSetFinalState __attribute((alias("xmlAutomataSetFinalState__internal_alias"))); -#else -#ifndef xmlAutomataSetFinalState -extern __typeof (xmlAutomataSetFinalState) xmlAutomataSetFinalState__internal_alias __attribute((visibility("hidden"))); -#define xmlAutomataSetFinalState xmlAutomataSetFinalState__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlBoolToText -extern __typeof (xmlBoolToText) xmlBoolToText __attribute((alias("xmlBoolToText__internal_alias"))); -#else -#ifndef xmlBoolToText -extern __typeof (xmlBoolToText) xmlBoolToText__internal_alias __attribute((visibility("hidden"))); -#define xmlBoolToText xmlBoolToText__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferAdd -extern __typeof (xmlBufferAdd) xmlBufferAdd __attribute((alias("xmlBufferAdd__internal_alias"))); -#else -#ifndef xmlBufferAdd -extern __typeof (xmlBufferAdd) xmlBufferAdd__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferAdd xmlBufferAdd__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferAddHead -extern __typeof (xmlBufferAddHead) xmlBufferAddHead __attribute((alias("xmlBufferAddHead__internal_alias"))); -#else -#ifndef xmlBufferAddHead -extern __typeof (xmlBufferAddHead) xmlBufferAddHead__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferAddHead xmlBufferAddHead__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferCCat -extern __typeof (xmlBufferCCat) xmlBufferCCat __attribute((alias("xmlBufferCCat__internal_alias"))); -#else -#ifndef xmlBufferCCat -extern __typeof (xmlBufferCCat) xmlBufferCCat__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferCCat xmlBufferCCat__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferCat -extern __typeof (xmlBufferCat) xmlBufferCat __attribute((alias("xmlBufferCat__internal_alias"))); -#else -#ifndef xmlBufferCat -extern __typeof (xmlBufferCat) xmlBufferCat__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferCat xmlBufferCat__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferContent -extern __typeof (xmlBufferContent) xmlBufferContent __attribute((alias("xmlBufferContent__internal_alias"))); -#else -#ifndef xmlBufferContent -extern __typeof (xmlBufferContent) xmlBufferContent__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferContent xmlBufferContent__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferCreate -extern __typeof (xmlBufferCreate) xmlBufferCreate __attribute((alias("xmlBufferCreate__internal_alias"))); -#else -#ifndef xmlBufferCreate -extern __typeof (xmlBufferCreate) xmlBufferCreate__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferCreate xmlBufferCreate__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferCreateSize -extern __typeof (xmlBufferCreateSize) xmlBufferCreateSize __attribute((alias("xmlBufferCreateSize__internal_alias"))); -#else -#ifndef xmlBufferCreateSize -extern __typeof (xmlBufferCreateSize) xmlBufferCreateSize__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferCreateSize xmlBufferCreateSize__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferCreateStatic -extern __typeof (xmlBufferCreateStatic) xmlBufferCreateStatic __attribute((alias("xmlBufferCreateStatic__internal_alias"))); -#else -#ifndef xmlBufferCreateStatic -extern __typeof (xmlBufferCreateStatic) xmlBufferCreateStatic__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferCreateStatic xmlBufferCreateStatic__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferDump -extern __typeof (xmlBufferDump) xmlBufferDump __attribute((alias("xmlBufferDump__internal_alias"))); -#else -#ifndef xmlBufferDump -extern __typeof (xmlBufferDump) xmlBufferDump__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferDump xmlBufferDump__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferEmpty -extern __typeof (xmlBufferEmpty) xmlBufferEmpty __attribute((alias("xmlBufferEmpty__internal_alias"))); -#else -#ifndef xmlBufferEmpty -extern __typeof (xmlBufferEmpty) xmlBufferEmpty__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferEmpty xmlBufferEmpty__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferFree -extern __typeof (xmlBufferFree) xmlBufferFree __attribute((alias("xmlBufferFree__internal_alias"))); -#else -#ifndef xmlBufferFree -extern __typeof (xmlBufferFree) xmlBufferFree__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferFree xmlBufferFree__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferGrow -extern __typeof (xmlBufferGrow) xmlBufferGrow __attribute((alias("xmlBufferGrow__internal_alias"))); -#else -#ifndef xmlBufferGrow -extern __typeof (xmlBufferGrow) xmlBufferGrow__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferGrow xmlBufferGrow__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferLength -extern __typeof (xmlBufferLength) xmlBufferLength __attribute((alias("xmlBufferLength__internal_alias"))); -#else -#ifndef xmlBufferLength -extern __typeof (xmlBufferLength) xmlBufferLength__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferLength xmlBufferLength__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferResize -extern __typeof (xmlBufferResize) xmlBufferResize __attribute((alias("xmlBufferResize__internal_alias"))); -#else -#ifndef xmlBufferResize -extern __typeof (xmlBufferResize) xmlBufferResize__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferResize xmlBufferResize__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferSetAllocationScheme -extern __typeof (xmlBufferSetAllocationScheme) xmlBufferSetAllocationScheme __attribute((alias("xmlBufferSetAllocationScheme__internal_alias"))); -#else -#ifndef xmlBufferSetAllocationScheme -extern __typeof (xmlBufferSetAllocationScheme) xmlBufferSetAllocationScheme__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferSetAllocationScheme xmlBufferSetAllocationScheme__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferShrink -extern __typeof (xmlBufferShrink) xmlBufferShrink __attribute((alias("xmlBufferShrink__internal_alias"))); -#else -#ifndef xmlBufferShrink -extern __typeof (xmlBufferShrink) xmlBufferShrink__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferShrink xmlBufferShrink__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferWriteCHAR -extern __typeof (xmlBufferWriteCHAR) xmlBufferWriteCHAR __attribute((alias("xmlBufferWriteCHAR__internal_alias"))); -#else -#ifndef xmlBufferWriteCHAR -extern __typeof (xmlBufferWriteCHAR) xmlBufferWriteCHAR__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferWriteCHAR xmlBufferWriteCHAR__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferWriteChar -extern __typeof (xmlBufferWriteChar) xmlBufferWriteChar __attribute((alias("xmlBufferWriteChar__internal_alias"))); -#else -#ifndef xmlBufferWriteChar -extern __typeof (xmlBufferWriteChar) xmlBufferWriteChar__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferWriteChar xmlBufferWriteChar__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBufferWriteQuotedString -extern __typeof (xmlBufferWriteQuotedString) xmlBufferWriteQuotedString __attribute((alias("xmlBufferWriteQuotedString__internal_alias"))); -#else -#ifndef xmlBufferWriteQuotedString -extern __typeof (xmlBufferWriteQuotedString) xmlBufferWriteQuotedString__internal_alias __attribute((visibility("hidden"))); -#define xmlBufferWriteQuotedString xmlBufferWriteQuotedString__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlBuildQName -extern __typeof (xmlBuildQName) xmlBuildQName __attribute((alias("xmlBuildQName__internal_alias"))); -#else -#ifndef xmlBuildQName -extern __typeof (xmlBuildQName) xmlBuildQName__internal_alias __attribute((visibility("hidden"))); -#define xmlBuildQName xmlBuildQName__internal_alias -#endif -#endif - -#ifdef bottom_uri -#undef xmlBuildRelativeURI -extern __typeof (xmlBuildRelativeURI) xmlBuildRelativeURI __attribute((alias("xmlBuildRelativeURI__internal_alias"))); -#else -#ifndef xmlBuildRelativeURI -extern __typeof (xmlBuildRelativeURI) xmlBuildRelativeURI__internal_alias __attribute((visibility("hidden"))); -#define xmlBuildRelativeURI xmlBuildRelativeURI__internal_alias -#endif -#endif - -#ifdef bottom_uri -#undef xmlBuildURI -extern __typeof (xmlBuildURI) xmlBuildURI __attribute((alias("xmlBuildURI__internal_alias"))); -#else -#ifndef xmlBuildURI -extern __typeof (xmlBuildURI) xmlBuildURI__internal_alias __attribute((visibility("hidden"))); -#define xmlBuildURI xmlBuildURI__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlByteConsumed -extern __typeof (xmlByteConsumed) xmlByteConsumed __attribute((alias("xmlByteConsumed__internal_alias"))); -#else -#ifndef xmlByteConsumed -extern __typeof (xmlByteConsumed) xmlByteConsumed__internal_alias __attribute((visibility("hidden"))); -#define xmlByteConsumed xmlByteConsumed__internal_alias -#endif -#endif - -#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_c14n -#undef xmlC14NDocDumpMemory -extern __typeof (xmlC14NDocDumpMemory) xmlC14NDocDumpMemory __attribute((alias("xmlC14NDocDumpMemory__internal_alias"))); -#else -#ifndef xmlC14NDocDumpMemory -extern __typeof (xmlC14NDocDumpMemory) xmlC14NDocDumpMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlC14NDocDumpMemory xmlC14NDocDumpMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_c14n -#undef xmlC14NDocSave -extern __typeof (xmlC14NDocSave) xmlC14NDocSave __attribute((alias("xmlC14NDocSave__internal_alias"))); -#else -#ifndef xmlC14NDocSave -extern __typeof (xmlC14NDocSave) xmlC14NDocSave__internal_alias __attribute((visibility("hidden"))); -#define xmlC14NDocSave xmlC14NDocSave__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_c14n -#undef xmlC14NDocSaveTo -extern __typeof (xmlC14NDocSaveTo) xmlC14NDocSaveTo __attribute((alias("xmlC14NDocSaveTo__internal_alias"))); -#else -#ifndef xmlC14NDocSaveTo -extern __typeof (xmlC14NDocSaveTo) xmlC14NDocSaveTo__internal_alias __attribute((visibility("hidden"))); -#define xmlC14NDocSaveTo xmlC14NDocSaveTo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_c14n -#undef xmlC14NExecute -extern __typeof (xmlC14NExecute) xmlC14NExecute __attribute((alias("xmlC14NExecute__internal_alias"))); -#else -#ifndef xmlC14NExecute -extern __typeof (xmlC14NExecute) xmlC14NExecute__internal_alias __attribute((visibility("hidden"))); -#define xmlC14NExecute xmlC14NExecute__internal_alias -#endif -#endif -#endif - -#ifdef bottom_uri -#undef xmlCanonicPath -extern __typeof (xmlCanonicPath) xmlCanonicPath __attribute((alias("xmlCanonicPath__internal_alias"))); -#else -#ifndef xmlCanonicPath -extern __typeof (xmlCanonicPath) xmlCanonicPath__internal_alias __attribute((visibility("hidden"))); -#define xmlCanonicPath xmlCanonicPath__internal_alias -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogAdd -extern __typeof (xmlCatalogAdd) xmlCatalogAdd __attribute((alias("xmlCatalogAdd__internal_alias"))); -#else -#ifndef xmlCatalogAdd -extern __typeof (xmlCatalogAdd) xmlCatalogAdd__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogAdd xmlCatalogAdd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogAddLocal -extern __typeof (xmlCatalogAddLocal) xmlCatalogAddLocal __attribute((alias("xmlCatalogAddLocal__internal_alias"))); -#else -#ifndef xmlCatalogAddLocal -extern __typeof (xmlCatalogAddLocal) xmlCatalogAddLocal__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogAddLocal xmlCatalogAddLocal__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogCleanup -extern __typeof (xmlCatalogCleanup) xmlCatalogCleanup __attribute((alias("xmlCatalogCleanup__internal_alias"))); -#else -#ifndef xmlCatalogCleanup -extern __typeof (xmlCatalogCleanup) xmlCatalogCleanup__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogCleanup xmlCatalogCleanup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogConvert -extern __typeof (xmlCatalogConvert) xmlCatalogConvert __attribute((alias("xmlCatalogConvert__internal_alias"))); -#else -#ifndef xmlCatalogConvert -extern __typeof (xmlCatalogConvert) xmlCatalogConvert__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogConvert xmlCatalogConvert__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogDump -extern __typeof (xmlCatalogDump) xmlCatalogDump __attribute((alias("xmlCatalogDump__internal_alias"))); -#else -#ifndef xmlCatalogDump -extern __typeof (xmlCatalogDump) xmlCatalogDump__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogDump xmlCatalogDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogFreeLocal -extern __typeof (xmlCatalogFreeLocal) xmlCatalogFreeLocal __attribute((alias("xmlCatalogFreeLocal__internal_alias"))); -#else -#ifndef xmlCatalogFreeLocal -extern __typeof (xmlCatalogFreeLocal) xmlCatalogFreeLocal__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogFreeLocal xmlCatalogFreeLocal__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogGetDefaults -extern __typeof (xmlCatalogGetDefaults) xmlCatalogGetDefaults __attribute((alias("xmlCatalogGetDefaults__internal_alias"))); -#else -#ifndef xmlCatalogGetDefaults -extern __typeof (xmlCatalogGetDefaults) xmlCatalogGetDefaults__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogGetDefaults xmlCatalogGetDefaults__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogGetPublic -extern __typeof (xmlCatalogGetPublic) xmlCatalogGetPublic __attribute((alias("xmlCatalogGetPublic__internal_alias"))); -#else -#ifndef xmlCatalogGetPublic -extern __typeof (xmlCatalogGetPublic) xmlCatalogGetPublic__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogGetPublic xmlCatalogGetPublic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogGetSystem -extern __typeof (xmlCatalogGetSystem) xmlCatalogGetSystem __attribute((alias("xmlCatalogGetSystem__internal_alias"))); -#else -#ifndef xmlCatalogGetSystem -extern __typeof (xmlCatalogGetSystem) xmlCatalogGetSystem__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogGetSystem xmlCatalogGetSystem__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogIsEmpty -extern __typeof (xmlCatalogIsEmpty) xmlCatalogIsEmpty __attribute((alias("xmlCatalogIsEmpty__internal_alias"))); -#else -#ifndef xmlCatalogIsEmpty -extern __typeof (xmlCatalogIsEmpty) xmlCatalogIsEmpty__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogIsEmpty xmlCatalogIsEmpty__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogLocalResolve -extern __typeof (xmlCatalogLocalResolve) xmlCatalogLocalResolve __attribute((alias("xmlCatalogLocalResolve__internal_alias"))); -#else -#ifndef xmlCatalogLocalResolve -extern __typeof (xmlCatalogLocalResolve) xmlCatalogLocalResolve__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogLocalResolve xmlCatalogLocalResolve__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogLocalResolveURI -extern __typeof (xmlCatalogLocalResolveURI) xmlCatalogLocalResolveURI __attribute((alias("xmlCatalogLocalResolveURI__internal_alias"))); -#else -#ifndef xmlCatalogLocalResolveURI -extern __typeof (xmlCatalogLocalResolveURI) xmlCatalogLocalResolveURI__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogLocalResolveURI xmlCatalogLocalResolveURI__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogRemove -extern __typeof (xmlCatalogRemove) xmlCatalogRemove __attribute((alias("xmlCatalogRemove__internal_alias"))); -#else -#ifndef xmlCatalogRemove -extern __typeof (xmlCatalogRemove) xmlCatalogRemove__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogRemove xmlCatalogRemove__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogResolve -extern __typeof (xmlCatalogResolve) xmlCatalogResolve __attribute((alias("xmlCatalogResolve__internal_alias"))); -#else -#ifndef xmlCatalogResolve -extern __typeof (xmlCatalogResolve) xmlCatalogResolve__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogResolve xmlCatalogResolve__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogResolvePublic -extern __typeof (xmlCatalogResolvePublic) xmlCatalogResolvePublic __attribute((alias("xmlCatalogResolvePublic__internal_alias"))); -#else -#ifndef xmlCatalogResolvePublic -extern __typeof (xmlCatalogResolvePublic) xmlCatalogResolvePublic__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogResolvePublic xmlCatalogResolvePublic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogResolveSystem -extern __typeof (xmlCatalogResolveSystem) xmlCatalogResolveSystem __attribute((alias("xmlCatalogResolveSystem__internal_alias"))); -#else -#ifndef xmlCatalogResolveSystem -extern __typeof (xmlCatalogResolveSystem) xmlCatalogResolveSystem__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogResolveSystem xmlCatalogResolveSystem__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogResolveURI -extern __typeof (xmlCatalogResolveURI) xmlCatalogResolveURI __attribute((alias("xmlCatalogResolveURI__internal_alias"))); -#else -#ifndef xmlCatalogResolveURI -extern __typeof (xmlCatalogResolveURI) xmlCatalogResolveURI__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogResolveURI xmlCatalogResolveURI__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogSetDebug -extern __typeof (xmlCatalogSetDebug) xmlCatalogSetDebug __attribute((alias("xmlCatalogSetDebug__internal_alias"))); -#else -#ifndef xmlCatalogSetDebug -extern __typeof (xmlCatalogSetDebug) xmlCatalogSetDebug__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogSetDebug xmlCatalogSetDebug__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogSetDefaultPrefer -extern __typeof (xmlCatalogSetDefaultPrefer) xmlCatalogSetDefaultPrefer __attribute((alias("xmlCatalogSetDefaultPrefer__internal_alias"))); -#else -#ifndef xmlCatalogSetDefaultPrefer -extern __typeof (xmlCatalogSetDefaultPrefer) xmlCatalogSetDefaultPrefer__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogSetDefaultPrefer xmlCatalogSetDefaultPrefer__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlCatalogSetDefaults -extern __typeof (xmlCatalogSetDefaults) xmlCatalogSetDefaults __attribute((alias("xmlCatalogSetDefaults__internal_alias"))); -#else -#ifndef xmlCatalogSetDefaults -extern __typeof (xmlCatalogSetDefaults) xmlCatalogSetDefaults__internal_alias __attribute((visibility("hidden"))); -#define xmlCatalogSetDefaults xmlCatalogSetDefaults__internal_alias -#endif -#endif -#endif - -#ifdef bottom_encoding -#undef xmlCharEncCloseFunc -extern __typeof (xmlCharEncCloseFunc) xmlCharEncCloseFunc __attribute((alias("xmlCharEncCloseFunc__internal_alias"))); -#else -#ifndef xmlCharEncCloseFunc -extern __typeof (xmlCharEncCloseFunc) xmlCharEncCloseFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlCharEncCloseFunc xmlCharEncCloseFunc__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlCharEncFirstLine -extern __typeof (xmlCharEncFirstLine) xmlCharEncFirstLine __attribute((alias("xmlCharEncFirstLine__internal_alias"))); -#else -#ifndef xmlCharEncFirstLine -extern __typeof (xmlCharEncFirstLine) xmlCharEncFirstLine__internal_alias __attribute((visibility("hidden"))); -#define xmlCharEncFirstLine xmlCharEncFirstLine__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlCharEncInFunc -extern __typeof (xmlCharEncInFunc) xmlCharEncInFunc __attribute((alias("xmlCharEncInFunc__internal_alias"))); -#else -#ifndef xmlCharEncInFunc -extern __typeof (xmlCharEncInFunc) xmlCharEncInFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlCharEncInFunc xmlCharEncInFunc__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlCharEncOutFunc -extern __typeof (xmlCharEncOutFunc) xmlCharEncOutFunc __attribute((alias("xmlCharEncOutFunc__internal_alias"))); -#else -#ifndef xmlCharEncOutFunc -extern __typeof (xmlCharEncOutFunc) xmlCharEncOutFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlCharEncOutFunc xmlCharEncOutFunc__internal_alias -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlCharInRange -extern __typeof (xmlCharInRange) xmlCharInRange __attribute((alias("xmlCharInRange__internal_alias"))); -#else -#ifndef xmlCharInRange -extern __typeof (xmlCharInRange) xmlCharInRange__internal_alias __attribute((visibility("hidden"))); -#define xmlCharInRange xmlCharInRange__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlCharStrdup -extern __typeof (xmlCharStrdup) xmlCharStrdup __attribute((alias("xmlCharStrdup__internal_alias"))); -#else -#ifndef xmlCharStrdup -extern __typeof (xmlCharStrdup) xmlCharStrdup__internal_alias __attribute((visibility("hidden"))); -#define xmlCharStrdup xmlCharStrdup__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlCharStrndup -extern __typeof (xmlCharStrndup) xmlCharStrndup __attribute((alias("xmlCharStrndup__internal_alias"))); -#else -#ifndef xmlCharStrndup -extern __typeof (xmlCharStrndup) xmlCharStrndup__internal_alias __attribute((visibility("hidden"))); -#define xmlCharStrndup xmlCharStrndup__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlCheckFilename -extern __typeof (xmlCheckFilename) xmlCheckFilename __attribute((alias("xmlCheckFilename__internal_alias"))); -#else -#ifndef xmlCheckFilename -extern __typeof (xmlCheckFilename) xmlCheckFilename__internal_alias __attribute((visibility("hidden"))); -#define xmlCheckFilename xmlCheckFilename__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlCheckHTTPInput -extern __typeof (xmlCheckHTTPInput) xmlCheckHTTPInput __attribute((alias("xmlCheckHTTPInput__internal_alias"))); -#else -#ifndef xmlCheckHTTPInput -extern __typeof (xmlCheckHTTPInput) xmlCheckHTTPInput__internal_alias __attribute((visibility("hidden"))); -#define xmlCheckHTTPInput xmlCheckHTTPInput__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCheckLanguageID -extern __typeof (xmlCheckLanguageID) xmlCheckLanguageID __attribute((alias("xmlCheckLanguageID__internal_alias"))); -#else -#ifndef xmlCheckLanguageID -extern __typeof (xmlCheckLanguageID) xmlCheckLanguageID__internal_alias __attribute((visibility("hidden"))); -#define xmlCheckLanguageID xmlCheckLanguageID__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlCheckUTF8 -extern __typeof (xmlCheckUTF8) xmlCheckUTF8 __attribute((alias("xmlCheckUTF8__internal_alias"))); -#else -#ifndef xmlCheckUTF8 -extern __typeof (xmlCheckUTF8) xmlCheckUTF8__internal_alias __attribute((visibility("hidden"))); -#define xmlCheckUTF8 xmlCheckUTF8__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlCheckVersion -extern __typeof (xmlCheckVersion) xmlCheckVersion __attribute((alias("xmlCheckVersion__internal_alias"))); -#else -#ifndef xmlCheckVersion -extern __typeof (xmlCheckVersion) xmlCheckVersion__internal_alias __attribute((visibility("hidden"))); -#define xmlCheckVersion xmlCheckVersion__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlCleanupCharEncodingHandlers -extern __typeof (xmlCleanupCharEncodingHandlers) xmlCleanupCharEncodingHandlers __attribute((alias("xmlCleanupCharEncodingHandlers__internal_alias"))); -#else -#ifndef xmlCleanupCharEncodingHandlers -extern __typeof (xmlCleanupCharEncodingHandlers) xmlCleanupCharEncodingHandlers__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupCharEncodingHandlers xmlCleanupCharEncodingHandlers__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlCleanupEncodingAliases -extern __typeof (xmlCleanupEncodingAliases) xmlCleanupEncodingAliases __attribute((alias("xmlCleanupEncodingAliases__internal_alias"))); -#else -#ifndef xmlCleanupEncodingAliases -extern __typeof (xmlCleanupEncodingAliases) xmlCleanupEncodingAliases__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupEncodingAliases xmlCleanupEncodingAliases__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlCleanupGlobals -extern __typeof (xmlCleanupGlobals) xmlCleanupGlobals __attribute((alias("xmlCleanupGlobals__internal_alias"))); -#else -#ifndef xmlCleanupGlobals -extern __typeof (xmlCleanupGlobals) xmlCleanupGlobals__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupGlobals xmlCleanupGlobals__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlCleanupInputCallbacks -extern __typeof (xmlCleanupInputCallbacks) xmlCleanupInputCallbacks __attribute((alias("xmlCleanupInputCallbacks__internal_alias"))); -#else -#ifndef xmlCleanupInputCallbacks -extern __typeof (xmlCleanupInputCallbacks) xmlCleanupInputCallbacks__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupInputCallbacks xmlCleanupInputCallbacks__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlCleanupMemory -extern __typeof (xmlCleanupMemory) xmlCleanupMemory __attribute((alias("xmlCleanupMemory__internal_alias"))); -#else -#ifndef xmlCleanupMemory -extern __typeof (xmlCleanupMemory) xmlCleanupMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupMemory xmlCleanupMemory__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlCleanupOutputCallbacks -extern __typeof (xmlCleanupOutputCallbacks) xmlCleanupOutputCallbacks __attribute((alias("xmlCleanupOutputCallbacks__internal_alias"))); -#else -#ifndef xmlCleanupOutputCallbacks -extern __typeof (xmlCleanupOutputCallbacks) xmlCleanupOutputCallbacks__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupOutputCallbacks xmlCleanupOutputCallbacks__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlCleanupParser -extern __typeof (xmlCleanupParser) xmlCleanupParser __attribute((alias("xmlCleanupParser__internal_alias"))); -#else -#ifndef xmlCleanupParser -extern __typeof (xmlCleanupParser) xmlCleanupParser__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupParser xmlCleanupParser__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlCleanupPredefinedEntities -extern __typeof (xmlCleanupPredefinedEntities) xmlCleanupPredefinedEntities __attribute((alias("xmlCleanupPredefinedEntities__internal_alias"))); -#else -#ifndef xmlCleanupPredefinedEntities -extern __typeof (xmlCleanupPredefinedEntities) xmlCleanupPredefinedEntities__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupPredefinedEntities xmlCleanupPredefinedEntities__internal_alias -#endif -#endif -#endif - -#ifdef bottom_threads -#undef xmlCleanupThreads -extern __typeof (xmlCleanupThreads) xmlCleanupThreads __attribute((alias("xmlCleanupThreads__internal_alias"))); -#else -#ifndef xmlCleanupThreads -extern __typeof (xmlCleanupThreads) xmlCleanupThreads__internal_alias __attribute((visibility("hidden"))); -#define xmlCleanupThreads xmlCleanupThreads__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlClearNodeInfoSeq -extern __typeof (xmlClearNodeInfoSeq) xmlClearNodeInfoSeq __attribute((alias("xmlClearNodeInfoSeq__internal_alias"))); -#else -#ifndef xmlClearNodeInfoSeq -extern __typeof (xmlClearNodeInfoSeq) xmlClearNodeInfoSeq__internal_alias __attribute((visibility("hidden"))); -#define xmlClearNodeInfoSeq xmlClearNodeInfoSeq__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlClearParserCtxt -extern __typeof (xmlClearParserCtxt) xmlClearParserCtxt __attribute((alias("xmlClearParserCtxt__internal_alias"))); -#else -#ifndef xmlClearParserCtxt -extern __typeof (xmlClearParserCtxt) xmlClearParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlClearParserCtxt xmlClearParserCtxt__internal_alias -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlConvertSGMLCatalog -extern __typeof (xmlConvertSGMLCatalog) xmlConvertSGMLCatalog __attribute((alias("xmlConvertSGMLCatalog__internal_alias"))); -#else -#ifndef xmlConvertSGMLCatalog -extern __typeof (xmlConvertSGMLCatalog) xmlConvertSGMLCatalog__internal_alias __attribute((visibility("hidden"))); -#define xmlConvertSGMLCatalog xmlConvertSGMLCatalog__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_valid -#undef xmlCopyAttributeTable -extern __typeof (xmlCopyAttributeTable) xmlCopyAttributeTable __attribute((alias("xmlCopyAttributeTable__internal_alias"))); -#else -#ifndef xmlCopyAttributeTable -extern __typeof (xmlCopyAttributeTable) xmlCopyAttributeTable__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyAttributeTable xmlCopyAttributeTable__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlCopyChar -extern __typeof (xmlCopyChar) xmlCopyChar __attribute((alias("xmlCopyChar__internal_alias"))); -#else -#ifndef xmlCopyChar -extern __typeof (xmlCopyChar) xmlCopyChar__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyChar xmlCopyChar__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlCopyCharMultiByte -extern __typeof (xmlCopyCharMultiByte) xmlCopyCharMultiByte __attribute((alias("xmlCopyCharMultiByte__internal_alias"))); -#else -#ifndef xmlCopyCharMultiByte -extern __typeof (xmlCopyCharMultiByte) xmlCopyCharMultiByte__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyCharMultiByte xmlCopyCharMultiByte__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlCopyDoc -extern __typeof (xmlCopyDoc) xmlCopyDoc __attribute((alias("xmlCopyDoc__internal_alias"))); -#else -#ifndef xmlCopyDoc -extern __typeof (xmlCopyDoc) xmlCopyDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyDoc xmlCopyDoc__internal_alias -#endif -#endif -#endif - -#ifdef bottom_valid -#undef xmlCopyDocElementContent -extern __typeof (xmlCopyDocElementContent) xmlCopyDocElementContent __attribute((alias("xmlCopyDocElementContent__internal_alias"))); -#else -#ifndef xmlCopyDocElementContent -extern __typeof (xmlCopyDocElementContent) xmlCopyDocElementContent__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyDocElementContent xmlCopyDocElementContent__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlCopyDtd -extern __typeof (xmlCopyDtd) xmlCopyDtd __attribute((alias("xmlCopyDtd__internal_alias"))); -#else -#ifndef xmlCopyDtd -extern __typeof (xmlCopyDtd) xmlCopyDtd__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyDtd xmlCopyDtd__internal_alias -#endif -#endif -#endif - -#ifdef bottom_valid -#undef xmlCopyElementContent -extern __typeof (xmlCopyElementContent) xmlCopyElementContent __attribute((alias("xmlCopyElementContent__internal_alias"))); -#else -#ifndef xmlCopyElementContent -extern __typeof (xmlCopyElementContent) xmlCopyElementContent__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyElementContent xmlCopyElementContent__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_valid -#undef xmlCopyElementTable -extern __typeof (xmlCopyElementTable) xmlCopyElementTable __attribute((alias("xmlCopyElementTable__internal_alias"))); -#else -#ifndef xmlCopyElementTable -extern __typeof (xmlCopyElementTable) xmlCopyElementTable__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyElementTable xmlCopyElementTable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_entities -#undef xmlCopyEntitiesTable -extern __typeof (xmlCopyEntitiesTable) xmlCopyEntitiesTable __attribute((alias("xmlCopyEntitiesTable__internal_alias"))); -#else -#ifndef xmlCopyEntitiesTable -extern __typeof (xmlCopyEntitiesTable) xmlCopyEntitiesTable__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyEntitiesTable xmlCopyEntitiesTable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_valid -#undef xmlCopyEnumeration -extern __typeof (xmlCopyEnumeration) xmlCopyEnumeration __attribute((alias("xmlCopyEnumeration__internal_alias"))); -#else -#ifndef xmlCopyEnumeration -extern __typeof (xmlCopyEnumeration) xmlCopyEnumeration__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyEnumeration xmlCopyEnumeration__internal_alias -#endif -#endif -#endif - -#ifdef bottom_error -#undef xmlCopyError -extern __typeof (xmlCopyError) xmlCopyError __attribute((alias("xmlCopyError__internal_alias"))); -#else -#ifndef xmlCopyError -extern __typeof (xmlCopyError) xmlCopyError__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyError xmlCopyError__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlCopyNamespace -extern __typeof (xmlCopyNamespace) xmlCopyNamespace __attribute((alias("xmlCopyNamespace__internal_alias"))); -#else -#ifndef xmlCopyNamespace -extern __typeof (xmlCopyNamespace) xmlCopyNamespace__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyNamespace xmlCopyNamespace__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlCopyNamespaceList -extern __typeof (xmlCopyNamespaceList) xmlCopyNamespaceList __attribute((alias("xmlCopyNamespaceList__internal_alias"))); -#else -#ifndef xmlCopyNamespaceList -extern __typeof (xmlCopyNamespaceList) xmlCopyNamespaceList__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyNamespaceList xmlCopyNamespaceList__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlCopyNode -extern __typeof (xmlCopyNode) xmlCopyNode __attribute((alias("xmlCopyNode__internal_alias"))); -#else -#ifndef xmlCopyNode -extern __typeof (xmlCopyNode) xmlCopyNode__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyNode xmlCopyNode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlCopyNodeList -extern __typeof (xmlCopyNodeList) xmlCopyNodeList __attribute((alias("xmlCopyNodeList__internal_alias"))); -#else -#ifndef xmlCopyNodeList -extern __typeof (xmlCopyNodeList) xmlCopyNodeList__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyNodeList xmlCopyNodeList__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_valid -#undef xmlCopyNotationTable -extern __typeof (xmlCopyNotationTable) xmlCopyNotationTable __attribute((alias("xmlCopyNotationTable__internal_alias"))); -#else -#ifndef xmlCopyNotationTable -extern __typeof (xmlCopyNotationTable) xmlCopyNotationTable__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyNotationTable xmlCopyNotationTable__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlCopyProp -extern __typeof (xmlCopyProp) xmlCopyProp __attribute((alias("xmlCopyProp__internal_alias"))); -#else -#ifndef xmlCopyProp -extern __typeof (xmlCopyProp) xmlCopyProp__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyProp xmlCopyProp__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlCopyPropList -extern __typeof (xmlCopyPropList) xmlCopyPropList __attribute((alias("xmlCopyPropList__internal_alias"))); -#else -#ifndef xmlCopyPropList -extern __typeof (xmlCopyPropList) xmlCopyPropList__internal_alias __attribute((visibility("hidden"))); -#define xmlCopyPropList xmlCopyPropList__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCreateDocParserCtxt -extern __typeof (xmlCreateDocParserCtxt) xmlCreateDocParserCtxt __attribute((alias("xmlCreateDocParserCtxt__internal_alias"))); -#else -#ifndef xmlCreateDocParserCtxt -extern __typeof (xmlCreateDocParserCtxt) xmlCreateDocParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateDocParserCtxt xmlCreateDocParserCtxt__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlCreateEntitiesTable -extern __typeof (xmlCreateEntitiesTable) xmlCreateEntitiesTable __attribute((alias("xmlCreateEntitiesTable__internal_alias"))); -#else -#ifndef xmlCreateEntitiesTable -extern __typeof (xmlCreateEntitiesTable) xmlCreateEntitiesTable__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateEntitiesTable xmlCreateEntitiesTable__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCreateEntityParserCtxt -extern __typeof (xmlCreateEntityParserCtxt) xmlCreateEntityParserCtxt __attribute((alias("xmlCreateEntityParserCtxt__internal_alias"))); -#else -#ifndef xmlCreateEntityParserCtxt -extern __typeof (xmlCreateEntityParserCtxt) xmlCreateEntityParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateEntityParserCtxt xmlCreateEntityParserCtxt__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlCreateEnumeration -extern __typeof (xmlCreateEnumeration) xmlCreateEnumeration __attribute((alias("xmlCreateEnumeration__internal_alias"))); -#else -#ifndef xmlCreateEnumeration -extern __typeof (xmlCreateEnumeration) xmlCreateEnumeration__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateEnumeration xmlCreateEnumeration__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCreateFileParserCtxt -extern __typeof (xmlCreateFileParserCtxt) xmlCreateFileParserCtxt __attribute((alias("xmlCreateFileParserCtxt__internal_alias"))); -#else -#ifndef xmlCreateFileParserCtxt -extern __typeof (xmlCreateFileParserCtxt) xmlCreateFileParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateFileParserCtxt xmlCreateFileParserCtxt__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCreateIOParserCtxt -extern __typeof (xmlCreateIOParserCtxt) xmlCreateIOParserCtxt __attribute((alias("xmlCreateIOParserCtxt__internal_alias"))); -#else -#ifndef xmlCreateIOParserCtxt -extern __typeof (xmlCreateIOParserCtxt) xmlCreateIOParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateIOParserCtxt xmlCreateIOParserCtxt__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlCreateIntSubset -extern __typeof (xmlCreateIntSubset) xmlCreateIntSubset __attribute((alias("xmlCreateIntSubset__internal_alias"))); -#else -#ifndef xmlCreateIntSubset -extern __typeof (xmlCreateIntSubset) xmlCreateIntSubset__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateIntSubset xmlCreateIntSubset__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCreateMemoryParserCtxt -extern __typeof (xmlCreateMemoryParserCtxt) xmlCreateMemoryParserCtxt __attribute((alias("xmlCreateMemoryParserCtxt__internal_alias"))); -#else -#ifndef xmlCreateMemoryParserCtxt -extern __typeof (xmlCreateMemoryParserCtxt) xmlCreateMemoryParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateMemoryParserCtxt xmlCreateMemoryParserCtxt__internal_alias -#endif -#endif - -#if defined(LIBXML_PUSH_ENABLED) -#ifdef bottom_parser -#undef xmlCreatePushParserCtxt -extern __typeof (xmlCreatePushParserCtxt) xmlCreatePushParserCtxt __attribute((alias("xmlCreatePushParserCtxt__internal_alias"))); -#else -#ifndef xmlCreatePushParserCtxt -extern __typeof (xmlCreatePushParserCtxt) xmlCreatePushParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlCreatePushParserCtxt xmlCreatePushParserCtxt__internal_alias -#endif -#endif -#endif - -#ifdef bottom_uri -#undef xmlCreateURI -extern __typeof (xmlCreateURI) xmlCreateURI __attribute((alias("xmlCreateURI__internal_alias"))); -#else -#ifndef xmlCreateURI -extern __typeof (xmlCreateURI) xmlCreateURI__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateURI xmlCreateURI__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCreateURLParserCtxt -extern __typeof (xmlCreateURLParserCtxt) xmlCreateURLParserCtxt __attribute((alias("xmlCreateURLParserCtxt__internal_alias"))); -#else -#ifndef xmlCreateURLParserCtxt -extern __typeof (xmlCreateURLParserCtxt) xmlCreateURLParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlCreateURLParserCtxt xmlCreateURLParserCtxt__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlCtxtGetLastError -extern __typeof (xmlCtxtGetLastError) xmlCtxtGetLastError __attribute((alias("xmlCtxtGetLastError__internal_alias"))); -#else -#ifndef xmlCtxtGetLastError -extern __typeof (xmlCtxtGetLastError) xmlCtxtGetLastError__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtGetLastError xmlCtxtGetLastError__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCtxtReadDoc -extern __typeof (xmlCtxtReadDoc) xmlCtxtReadDoc __attribute((alias("xmlCtxtReadDoc__internal_alias"))); -#else -#ifndef xmlCtxtReadDoc -extern __typeof (xmlCtxtReadDoc) xmlCtxtReadDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtReadDoc xmlCtxtReadDoc__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCtxtReadFd -extern __typeof (xmlCtxtReadFd) xmlCtxtReadFd __attribute((alias("xmlCtxtReadFd__internal_alias"))); -#else -#ifndef xmlCtxtReadFd -extern __typeof (xmlCtxtReadFd) xmlCtxtReadFd__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtReadFd xmlCtxtReadFd__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCtxtReadFile -extern __typeof (xmlCtxtReadFile) xmlCtxtReadFile __attribute((alias("xmlCtxtReadFile__internal_alias"))); -#else -#ifndef xmlCtxtReadFile -extern __typeof (xmlCtxtReadFile) xmlCtxtReadFile__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtReadFile xmlCtxtReadFile__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCtxtReadIO -extern __typeof (xmlCtxtReadIO) xmlCtxtReadIO __attribute((alias("xmlCtxtReadIO__internal_alias"))); -#else -#ifndef xmlCtxtReadIO -extern __typeof (xmlCtxtReadIO) xmlCtxtReadIO__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtReadIO xmlCtxtReadIO__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCtxtReadMemory -extern __typeof (xmlCtxtReadMemory) xmlCtxtReadMemory __attribute((alias("xmlCtxtReadMemory__internal_alias"))); -#else -#ifndef xmlCtxtReadMemory -extern __typeof (xmlCtxtReadMemory) xmlCtxtReadMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtReadMemory xmlCtxtReadMemory__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCtxtReset -extern __typeof (xmlCtxtReset) xmlCtxtReset __attribute((alias("xmlCtxtReset__internal_alias"))); -#else -#ifndef xmlCtxtReset -extern __typeof (xmlCtxtReset) xmlCtxtReset__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtReset xmlCtxtReset__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlCtxtResetLastError -extern __typeof (xmlCtxtResetLastError) xmlCtxtResetLastError __attribute((alias("xmlCtxtResetLastError__internal_alias"))); -#else -#ifndef xmlCtxtResetLastError -extern __typeof (xmlCtxtResetLastError) xmlCtxtResetLastError__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtResetLastError xmlCtxtResetLastError__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCtxtResetPush -extern __typeof (xmlCtxtResetPush) xmlCtxtResetPush __attribute((alias("xmlCtxtResetPush__internal_alias"))); -#else -#ifndef xmlCtxtResetPush -extern __typeof (xmlCtxtResetPush) xmlCtxtResetPush__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtResetPush xmlCtxtResetPush__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlCtxtUseOptions -extern __typeof (xmlCtxtUseOptions) xmlCtxtUseOptions __attribute((alias("xmlCtxtUseOptions__internal_alias"))); -#else -#ifndef xmlCtxtUseOptions -extern __typeof (xmlCtxtUseOptions) xmlCtxtUseOptions__internal_alias __attribute((visibility("hidden"))); -#define xmlCtxtUseOptions xmlCtxtUseOptions__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlCurrentChar -extern __typeof (xmlCurrentChar) xmlCurrentChar __attribute((alias("xmlCurrentChar__internal_alias"))); -#else -#ifndef xmlCurrentChar -extern __typeof (xmlCurrentChar) xmlCurrentChar__internal_alias __attribute((visibility("hidden"))); -#define xmlCurrentChar xmlCurrentChar__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlDOMWrapAdoptNode -extern __typeof (xmlDOMWrapAdoptNode) xmlDOMWrapAdoptNode __attribute((alias("xmlDOMWrapAdoptNode__internal_alias"))); -#else -#ifndef xmlDOMWrapAdoptNode -extern __typeof (xmlDOMWrapAdoptNode) xmlDOMWrapAdoptNode__internal_alias __attribute((visibility("hidden"))); -#define xmlDOMWrapAdoptNode xmlDOMWrapAdoptNode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlDOMWrapCloneNode -extern __typeof (xmlDOMWrapCloneNode) xmlDOMWrapCloneNode __attribute((alias("xmlDOMWrapCloneNode__internal_alias"))); -#else -#ifndef xmlDOMWrapCloneNode -extern __typeof (xmlDOMWrapCloneNode) xmlDOMWrapCloneNode__internal_alias __attribute((visibility("hidden"))); -#define xmlDOMWrapCloneNode xmlDOMWrapCloneNode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlDOMWrapFreeCtxt -extern __typeof (xmlDOMWrapFreeCtxt) xmlDOMWrapFreeCtxt __attribute((alias("xmlDOMWrapFreeCtxt__internal_alias"))); -#else -#ifndef xmlDOMWrapFreeCtxt -extern __typeof (xmlDOMWrapFreeCtxt) xmlDOMWrapFreeCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlDOMWrapFreeCtxt xmlDOMWrapFreeCtxt__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlDOMWrapNewCtxt -extern __typeof (xmlDOMWrapNewCtxt) xmlDOMWrapNewCtxt __attribute((alias("xmlDOMWrapNewCtxt__internal_alias"))); -#else -#ifndef xmlDOMWrapNewCtxt -extern __typeof (xmlDOMWrapNewCtxt) xmlDOMWrapNewCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlDOMWrapNewCtxt xmlDOMWrapNewCtxt__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlDOMWrapReconcileNamespaces -extern __typeof (xmlDOMWrapReconcileNamespaces) xmlDOMWrapReconcileNamespaces __attribute((alias("xmlDOMWrapReconcileNamespaces__internal_alias"))); -#else -#ifndef xmlDOMWrapReconcileNamespaces -extern __typeof (xmlDOMWrapReconcileNamespaces) xmlDOMWrapReconcileNamespaces__internal_alias __attribute((visibility("hidden"))); -#define xmlDOMWrapReconcileNamespaces xmlDOMWrapReconcileNamespaces__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlDOMWrapRemoveNode -extern __typeof (xmlDOMWrapRemoveNode) xmlDOMWrapRemoveNode __attribute((alias("xmlDOMWrapRemoveNode__internal_alias"))); -#else -#ifndef xmlDOMWrapRemoveNode -extern __typeof (xmlDOMWrapRemoveNode) xmlDOMWrapRemoveNode__internal_alias __attribute((visibility("hidden"))); -#define xmlDOMWrapRemoveNode xmlDOMWrapRemoveNode__internal_alias -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugCheckDocument -extern __typeof (xmlDebugCheckDocument) xmlDebugCheckDocument __attribute((alias("xmlDebugCheckDocument__internal_alias"))); -#else -#ifndef xmlDebugCheckDocument -extern __typeof (xmlDebugCheckDocument) xmlDebugCheckDocument__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugCheckDocument xmlDebugCheckDocument__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpAttr -extern __typeof (xmlDebugDumpAttr) xmlDebugDumpAttr __attribute((alias("xmlDebugDumpAttr__internal_alias"))); -#else -#ifndef xmlDebugDumpAttr -extern __typeof (xmlDebugDumpAttr) xmlDebugDumpAttr__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpAttr xmlDebugDumpAttr__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpAttrList -extern __typeof (xmlDebugDumpAttrList) xmlDebugDumpAttrList __attribute((alias("xmlDebugDumpAttrList__internal_alias"))); -#else -#ifndef xmlDebugDumpAttrList -extern __typeof (xmlDebugDumpAttrList) xmlDebugDumpAttrList__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpAttrList xmlDebugDumpAttrList__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpDTD -extern __typeof (xmlDebugDumpDTD) xmlDebugDumpDTD __attribute((alias("xmlDebugDumpDTD__internal_alias"))); -#else -#ifndef xmlDebugDumpDTD -extern __typeof (xmlDebugDumpDTD) xmlDebugDumpDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpDTD xmlDebugDumpDTD__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpDocument -extern __typeof (xmlDebugDumpDocument) xmlDebugDumpDocument __attribute((alias("xmlDebugDumpDocument__internal_alias"))); -#else -#ifndef xmlDebugDumpDocument -extern __typeof (xmlDebugDumpDocument) xmlDebugDumpDocument__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpDocument xmlDebugDumpDocument__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpDocumentHead -extern __typeof (xmlDebugDumpDocumentHead) xmlDebugDumpDocumentHead __attribute((alias("xmlDebugDumpDocumentHead__internal_alias"))); -#else -#ifndef xmlDebugDumpDocumentHead -extern __typeof (xmlDebugDumpDocumentHead) xmlDebugDumpDocumentHead__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpDocumentHead xmlDebugDumpDocumentHead__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpEntities -extern __typeof (xmlDebugDumpEntities) xmlDebugDumpEntities __attribute((alias("xmlDebugDumpEntities__internal_alias"))); -#else -#ifndef xmlDebugDumpEntities -extern __typeof (xmlDebugDumpEntities) xmlDebugDumpEntities__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpEntities xmlDebugDumpEntities__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpNode -extern __typeof (xmlDebugDumpNode) xmlDebugDumpNode __attribute((alias("xmlDebugDumpNode__internal_alias"))); -#else -#ifndef xmlDebugDumpNode -extern __typeof (xmlDebugDumpNode) xmlDebugDumpNode__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpNode xmlDebugDumpNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpNodeList -extern __typeof (xmlDebugDumpNodeList) xmlDebugDumpNodeList __attribute((alias("xmlDebugDumpNodeList__internal_alias"))); -#else -#ifndef xmlDebugDumpNodeList -extern __typeof (xmlDebugDumpNodeList) xmlDebugDumpNodeList__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpNodeList xmlDebugDumpNodeList__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpOneNode -extern __typeof (xmlDebugDumpOneNode) xmlDebugDumpOneNode __attribute((alias("xmlDebugDumpOneNode__internal_alias"))); -#else -#ifndef xmlDebugDumpOneNode -extern __typeof (xmlDebugDumpOneNode) xmlDebugDumpOneNode__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpOneNode xmlDebugDumpOneNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlDebugDumpString -extern __typeof (xmlDebugDumpString) xmlDebugDumpString __attribute((alias("xmlDebugDumpString__internal_alias"))); -#else -#ifndef xmlDebugDumpString -extern __typeof (xmlDebugDumpString) xmlDebugDumpString__internal_alias __attribute((visibility("hidden"))); -#define xmlDebugDumpString xmlDebugDumpString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlDecodeEntities -extern __typeof (xmlDecodeEntities) xmlDecodeEntities __attribute((alias("xmlDecodeEntities__internal_alias"))); -#else -#ifndef xmlDecodeEntities -extern __typeof (xmlDecodeEntities) xmlDecodeEntities__internal_alias __attribute((visibility("hidden"))); -#define xmlDecodeEntities xmlDecodeEntities__internal_alias -#endif -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlDefaultSAXHandlerInit -extern __typeof (xmlDefaultSAXHandlerInit) xmlDefaultSAXHandlerInit __attribute((alias("xmlDefaultSAXHandlerInit__internal_alias"))); -#else -#ifndef xmlDefaultSAXHandlerInit -extern __typeof (xmlDefaultSAXHandlerInit) xmlDefaultSAXHandlerInit__internal_alias __attribute((visibility("hidden"))); -#define xmlDefaultSAXHandlerInit xmlDefaultSAXHandlerInit__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlDelEncodingAlias -extern __typeof (xmlDelEncodingAlias) xmlDelEncodingAlias __attribute((alias("xmlDelEncodingAlias__internal_alias"))); -#else -#ifndef xmlDelEncodingAlias -extern __typeof (xmlDelEncodingAlias) xmlDelEncodingAlias__internal_alias __attribute((visibility("hidden"))); -#define xmlDelEncodingAlias xmlDelEncodingAlias__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlDeregisterNodeDefault -extern __typeof (xmlDeregisterNodeDefault) xmlDeregisterNodeDefault __attribute((alias("xmlDeregisterNodeDefault__internal_alias"))); -#else -#ifndef xmlDeregisterNodeDefault -extern __typeof (xmlDeregisterNodeDefault) xmlDeregisterNodeDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlDeregisterNodeDefault xmlDeregisterNodeDefault__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlDetectCharEncoding -extern __typeof (xmlDetectCharEncoding) xmlDetectCharEncoding __attribute((alias("xmlDetectCharEncoding__internal_alias"))); -#else -#ifndef xmlDetectCharEncoding -extern __typeof (xmlDetectCharEncoding) xmlDetectCharEncoding__internal_alias __attribute((visibility("hidden"))); -#define xmlDetectCharEncoding xmlDetectCharEncoding__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictCleanup -extern __typeof (xmlDictCleanup) xmlDictCleanup __attribute((alias("xmlDictCleanup__internal_alias"))); -#else -#ifndef xmlDictCleanup -extern __typeof (xmlDictCleanup) xmlDictCleanup__internal_alias __attribute((visibility("hidden"))); -#define xmlDictCleanup xmlDictCleanup__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictCreate -extern __typeof (xmlDictCreate) xmlDictCreate __attribute((alias("xmlDictCreate__internal_alias"))); -#else -#ifndef xmlDictCreate -extern __typeof (xmlDictCreate) xmlDictCreate__internal_alias __attribute((visibility("hidden"))); -#define xmlDictCreate xmlDictCreate__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictCreateSub -extern __typeof (xmlDictCreateSub) xmlDictCreateSub __attribute((alias("xmlDictCreateSub__internal_alias"))); -#else -#ifndef xmlDictCreateSub -extern __typeof (xmlDictCreateSub) xmlDictCreateSub__internal_alias __attribute((visibility("hidden"))); -#define xmlDictCreateSub xmlDictCreateSub__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictExists -extern __typeof (xmlDictExists) xmlDictExists __attribute((alias("xmlDictExists__internal_alias"))); -#else -#ifndef xmlDictExists -extern __typeof (xmlDictExists) xmlDictExists__internal_alias __attribute((visibility("hidden"))); -#define xmlDictExists xmlDictExists__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictFree -extern __typeof (xmlDictFree) xmlDictFree __attribute((alias("xmlDictFree__internal_alias"))); -#else -#ifndef xmlDictFree -extern __typeof (xmlDictFree) xmlDictFree__internal_alias __attribute((visibility("hidden"))); -#define xmlDictFree xmlDictFree__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictLookup -extern __typeof (xmlDictLookup) xmlDictLookup __attribute((alias("xmlDictLookup__internal_alias"))); -#else -#ifndef xmlDictLookup -extern __typeof (xmlDictLookup) xmlDictLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlDictLookup xmlDictLookup__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictOwns -extern __typeof (xmlDictOwns) xmlDictOwns __attribute((alias("xmlDictOwns__internal_alias"))); -#else -#ifndef xmlDictOwns -extern __typeof (xmlDictOwns) xmlDictOwns__internal_alias __attribute((visibility("hidden"))); -#define xmlDictOwns xmlDictOwns__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictQLookup -extern __typeof (xmlDictQLookup) xmlDictQLookup __attribute((alias("xmlDictQLookup__internal_alias"))); -#else -#ifndef xmlDictQLookup -extern __typeof (xmlDictQLookup) xmlDictQLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlDictQLookup xmlDictQLookup__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictReference -extern __typeof (xmlDictReference) xmlDictReference __attribute((alias("xmlDictReference__internal_alias"))); -#else -#ifndef xmlDictReference -extern __typeof (xmlDictReference) xmlDictReference__internal_alias __attribute((visibility("hidden"))); -#define xmlDictReference xmlDictReference__internal_alias -#endif -#endif - -#ifdef bottom_dict -#undef xmlDictSize -extern __typeof (xmlDictSize) xmlDictSize __attribute((alias("xmlDictSize__internal_alias"))); -#else -#ifndef xmlDictSize -extern __typeof (xmlDictSize) xmlDictSize__internal_alias __attribute((visibility("hidden"))); -#define xmlDictSize xmlDictSize__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlDocCopyNode -extern __typeof (xmlDocCopyNode) xmlDocCopyNode __attribute((alias("xmlDocCopyNode__internal_alias"))); -#else -#ifndef xmlDocCopyNode -extern __typeof (xmlDocCopyNode) xmlDocCopyNode__internal_alias __attribute((visibility("hidden"))); -#define xmlDocCopyNode xmlDocCopyNode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlDocCopyNodeList -extern __typeof (xmlDocCopyNodeList) xmlDocCopyNodeList __attribute((alias("xmlDocCopyNodeList__internal_alias"))); -#else -#ifndef xmlDocCopyNodeList -extern __typeof (xmlDocCopyNodeList) xmlDocCopyNodeList__internal_alias __attribute((visibility("hidden"))); -#define xmlDocCopyNodeList xmlDocCopyNodeList__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlDocDump -extern __typeof (xmlDocDump) xmlDocDump __attribute((alias("xmlDocDump__internal_alias"))); -#else -#ifndef xmlDocDump -extern __typeof (xmlDocDump) xmlDocDump__internal_alias __attribute((visibility("hidden"))); -#define xmlDocDump xmlDocDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlDocDumpFormatMemory -extern __typeof (xmlDocDumpFormatMemory) xmlDocDumpFormatMemory __attribute((alias("xmlDocDumpFormatMemory__internal_alias"))); -#else -#ifndef xmlDocDumpFormatMemory -extern __typeof (xmlDocDumpFormatMemory) xmlDocDumpFormatMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlDocDumpFormatMemory xmlDocDumpFormatMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlDocDumpFormatMemoryEnc -extern __typeof (xmlDocDumpFormatMemoryEnc) xmlDocDumpFormatMemoryEnc __attribute((alias("xmlDocDumpFormatMemoryEnc__internal_alias"))); -#else -#ifndef xmlDocDumpFormatMemoryEnc -extern __typeof (xmlDocDumpFormatMemoryEnc) xmlDocDumpFormatMemoryEnc__internal_alias __attribute((visibility("hidden"))); -#define xmlDocDumpFormatMemoryEnc xmlDocDumpFormatMemoryEnc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlDocDumpMemory -extern __typeof (xmlDocDumpMemory) xmlDocDumpMemory __attribute((alias("xmlDocDumpMemory__internal_alias"))); -#else -#ifndef xmlDocDumpMemory -extern __typeof (xmlDocDumpMemory) xmlDocDumpMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlDocDumpMemory xmlDocDumpMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlDocDumpMemoryEnc -extern __typeof (xmlDocDumpMemoryEnc) xmlDocDumpMemoryEnc __attribute((alias("xmlDocDumpMemoryEnc__internal_alias"))); -#else -#ifndef xmlDocDumpMemoryEnc -extern __typeof (xmlDocDumpMemoryEnc) xmlDocDumpMemoryEnc__internal_alias __attribute((visibility("hidden"))); -#define xmlDocDumpMemoryEnc xmlDocDumpMemoryEnc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlDocFormatDump -extern __typeof (xmlDocFormatDump) xmlDocFormatDump __attribute((alias("xmlDocFormatDump__internal_alias"))); -#else -#ifndef xmlDocFormatDump -extern __typeof (xmlDocFormatDump) xmlDocFormatDump__internal_alias __attribute((visibility("hidden"))); -#define xmlDocFormatDump xmlDocFormatDump__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlDocGetRootElement -extern __typeof (xmlDocGetRootElement) xmlDocGetRootElement __attribute((alias("xmlDocGetRootElement__internal_alias"))); -#else -#ifndef xmlDocGetRootElement -extern __typeof (xmlDocGetRootElement) xmlDocGetRootElement__internal_alias __attribute((visibility("hidden"))); -#define xmlDocGetRootElement xmlDocGetRootElement__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_tree -#undef xmlDocSetRootElement -extern __typeof (xmlDocSetRootElement) xmlDocSetRootElement __attribute((alias("xmlDocSetRootElement__internal_alias"))); -#else -#ifndef xmlDocSetRootElement -extern __typeof (xmlDocSetRootElement) xmlDocSetRootElement__internal_alias __attribute((visibility("hidden"))); -#define xmlDocSetRootElement xmlDocSetRootElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_valid -#undef xmlDumpAttributeDecl -extern __typeof (xmlDumpAttributeDecl) xmlDumpAttributeDecl __attribute((alias("xmlDumpAttributeDecl__internal_alias"))); -#else -#ifndef xmlDumpAttributeDecl -extern __typeof (xmlDumpAttributeDecl) xmlDumpAttributeDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlDumpAttributeDecl xmlDumpAttributeDecl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_valid -#undef xmlDumpAttributeTable -extern __typeof (xmlDumpAttributeTable) xmlDumpAttributeTable __attribute((alias("xmlDumpAttributeTable__internal_alias"))); -#else -#ifndef xmlDumpAttributeTable -extern __typeof (xmlDumpAttributeTable) xmlDumpAttributeTable__internal_alias __attribute((visibility("hidden"))); -#define xmlDumpAttributeTable xmlDumpAttributeTable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_valid -#undef xmlDumpElementDecl -extern __typeof (xmlDumpElementDecl) xmlDumpElementDecl __attribute((alias("xmlDumpElementDecl__internal_alias"))); -#else -#ifndef xmlDumpElementDecl -extern __typeof (xmlDumpElementDecl) xmlDumpElementDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlDumpElementDecl xmlDumpElementDecl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_valid -#undef xmlDumpElementTable -extern __typeof (xmlDumpElementTable) xmlDumpElementTable __attribute((alias("xmlDumpElementTable__internal_alias"))); -#else -#ifndef xmlDumpElementTable -extern __typeof (xmlDumpElementTable) xmlDumpElementTable__internal_alias __attribute((visibility("hidden"))); -#define xmlDumpElementTable xmlDumpElementTable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_entities -#undef xmlDumpEntitiesTable -extern __typeof (xmlDumpEntitiesTable) xmlDumpEntitiesTable __attribute((alias("xmlDumpEntitiesTable__internal_alias"))); -#else -#ifndef xmlDumpEntitiesTable -extern __typeof (xmlDumpEntitiesTable) xmlDumpEntitiesTable__internal_alias __attribute((visibility("hidden"))); -#define xmlDumpEntitiesTable xmlDumpEntitiesTable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_entities -#undef xmlDumpEntityDecl -extern __typeof (xmlDumpEntityDecl) xmlDumpEntityDecl __attribute((alias("xmlDumpEntityDecl__internal_alias"))); -#else -#ifndef xmlDumpEntityDecl -extern __typeof (xmlDumpEntityDecl) xmlDumpEntityDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlDumpEntityDecl xmlDumpEntityDecl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_valid -#undef xmlDumpNotationDecl -extern __typeof (xmlDumpNotationDecl) xmlDumpNotationDecl __attribute((alias("xmlDumpNotationDecl__internal_alias"))); -#else -#ifndef xmlDumpNotationDecl -extern __typeof (xmlDumpNotationDecl) xmlDumpNotationDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlDumpNotationDecl xmlDumpNotationDecl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_valid -#undef xmlDumpNotationTable -extern __typeof (xmlDumpNotationTable) xmlDumpNotationTable __attribute((alias("xmlDumpNotationTable__internal_alias"))); -#else -#ifndef xmlDumpNotationTable -extern __typeof (xmlDumpNotationTable) xmlDumpNotationTable__internal_alias __attribute((visibility("hidden"))); -#define xmlDumpNotationTable xmlDumpNotationTable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlElemDump -extern __typeof (xmlElemDump) xmlElemDump __attribute((alias("xmlElemDump__internal_alias"))); -#else -#ifndef xmlElemDump -extern __typeof (xmlElemDump) xmlElemDump__internal_alias __attribute((visibility("hidden"))); -#define xmlElemDump xmlElemDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlEncodeEntities -extern __typeof (xmlEncodeEntities) xmlEncodeEntities __attribute((alias("xmlEncodeEntities__internal_alias"))); -#else -#ifndef xmlEncodeEntities -extern __typeof (xmlEncodeEntities) xmlEncodeEntities__internal_alias __attribute((visibility("hidden"))); -#define xmlEncodeEntities xmlEncodeEntities__internal_alias -#endif -#endif -#endif - -#ifdef bottom_entities -#undef xmlEncodeEntitiesReentrant -extern __typeof (xmlEncodeEntitiesReentrant) xmlEncodeEntitiesReentrant __attribute((alias("xmlEncodeEntitiesReentrant__internal_alias"))); -#else -#ifndef xmlEncodeEntitiesReentrant -extern __typeof (xmlEncodeEntitiesReentrant) xmlEncodeEntitiesReentrant__internal_alias __attribute((visibility("hidden"))); -#define xmlEncodeEntitiesReentrant xmlEncodeEntitiesReentrant__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlEncodeSpecialChars -extern __typeof (xmlEncodeSpecialChars) xmlEncodeSpecialChars __attribute((alias("xmlEncodeSpecialChars__internal_alias"))); -#else -#ifndef xmlEncodeSpecialChars -extern __typeof (xmlEncodeSpecialChars) xmlEncodeSpecialChars__internal_alias __attribute((visibility("hidden"))); -#define xmlEncodeSpecialChars xmlEncodeSpecialChars__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlErrMemory -extern __typeof (xmlErrMemory) xmlErrMemory __attribute((alias("xmlErrMemory__internal_alias"))); -#else -#ifndef xmlErrMemory -extern __typeof (xmlErrMemory) xmlErrMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlErrMemory xmlErrMemory__internal_alias -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpCtxtNbCons -extern __typeof (xmlExpCtxtNbCons) xmlExpCtxtNbCons __attribute((alias("xmlExpCtxtNbCons__internal_alias"))); -#else -#ifndef xmlExpCtxtNbCons -extern __typeof (xmlExpCtxtNbCons) xmlExpCtxtNbCons__internal_alias __attribute((visibility("hidden"))); -#define xmlExpCtxtNbCons xmlExpCtxtNbCons__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpCtxtNbNodes -extern __typeof (xmlExpCtxtNbNodes) xmlExpCtxtNbNodes __attribute((alias("xmlExpCtxtNbNodes__internal_alias"))); -#else -#ifndef xmlExpCtxtNbNodes -extern __typeof (xmlExpCtxtNbNodes) xmlExpCtxtNbNodes__internal_alias __attribute((visibility("hidden"))); -#define xmlExpCtxtNbNodes xmlExpCtxtNbNodes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpDump -extern __typeof (xmlExpDump) xmlExpDump __attribute((alias("xmlExpDump__internal_alias"))); -#else -#ifndef xmlExpDump -extern __typeof (xmlExpDump) xmlExpDump__internal_alias __attribute((visibility("hidden"))); -#define xmlExpDump xmlExpDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpExpDerive -extern __typeof (xmlExpExpDerive) xmlExpExpDerive __attribute((alias("xmlExpExpDerive__internal_alias"))); -#else -#ifndef xmlExpExpDerive -extern __typeof (xmlExpExpDerive) xmlExpExpDerive__internal_alias __attribute((visibility("hidden"))); -#define xmlExpExpDerive xmlExpExpDerive__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpFree -extern __typeof (xmlExpFree) xmlExpFree __attribute((alias("xmlExpFree__internal_alias"))); -#else -#ifndef xmlExpFree -extern __typeof (xmlExpFree) xmlExpFree__internal_alias __attribute((visibility("hidden"))); -#define xmlExpFree xmlExpFree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpFreeCtxt -extern __typeof (xmlExpFreeCtxt) xmlExpFreeCtxt __attribute((alias("xmlExpFreeCtxt__internal_alias"))); -#else -#ifndef xmlExpFreeCtxt -extern __typeof (xmlExpFreeCtxt) xmlExpFreeCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlExpFreeCtxt xmlExpFreeCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpGetLanguage -extern __typeof (xmlExpGetLanguage) xmlExpGetLanguage __attribute((alias("xmlExpGetLanguage__internal_alias"))); -#else -#ifndef xmlExpGetLanguage -extern __typeof (xmlExpGetLanguage) xmlExpGetLanguage__internal_alias __attribute((visibility("hidden"))); -#define xmlExpGetLanguage xmlExpGetLanguage__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpGetStart -extern __typeof (xmlExpGetStart) xmlExpGetStart __attribute((alias("xmlExpGetStart__internal_alias"))); -#else -#ifndef xmlExpGetStart -extern __typeof (xmlExpGetStart) xmlExpGetStart__internal_alias __attribute((visibility("hidden"))); -#define xmlExpGetStart xmlExpGetStart__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpIsNillable -extern __typeof (xmlExpIsNillable) xmlExpIsNillable __attribute((alias("xmlExpIsNillable__internal_alias"))); -#else -#ifndef xmlExpIsNillable -extern __typeof (xmlExpIsNillable) xmlExpIsNillable__internal_alias __attribute((visibility("hidden"))); -#define xmlExpIsNillable xmlExpIsNillable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpMaxToken -extern __typeof (xmlExpMaxToken) xmlExpMaxToken __attribute((alias("xmlExpMaxToken__internal_alias"))); -#else -#ifndef xmlExpMaxToken -extern __typeof (xmlExpMaxToken) xmlExpMaxToken__internal_alias __attribute((visibility("hidden"))); -#define xmlExpMaxToken xmlExpMaxToken__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpNewAtom -extern __typeof (xmlExpNewAtom) xmlExpNewAtom __attribute((alias("xmlExpNewAtom__internal_alias"))); -#else -#ifndef xmlExpNewAtom -extern __typeof (xmlExpNewAtom) xmlExpNewAtom__internal_alias __attribute((visibility("hidden"))); -#define xmlExpNewAtom xmlExpNewAtom__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpNewCtxt -extern __typeof (xmlExpNewCtxt) xmlExpNewCtxt __attribute((alias("xmlExpNewCtxt__internal_alias"))); -#else -#ifndef xmlExpNewCtxt -extern __typeof (xmlExpNewCtxt) xmlExpNewCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlExpNewCtxt xmlExpNewCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpNewOr -extern __typeof (xmlExpNewOr) xmlExpNewOr __attribute((alias("xmlExpNewOr__internal_alias"))); -#else -#ifndef xmlExpNewOr -extern __typeof (xmlExpNewOr) xmlExpNewOr__internal_alias __attribute((visibility("hidden"))); -#define xmlExpNewOr xmlExpNewOr__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpNewRange -extern __typeof (xmlExpNewRange) xmlExpNewRange __attribute((alias("xmlExpNewRange__internal_alias"))); -#else -#ifndef xmlExpNewRange -extern __typeof (xmlExpNewRange) xmlExpNewRange__internal_alias __attribute((visibility("hidden"))); -#define xmlExpNewRange xmlExpNewRange__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpNewSeq -extern __typeof (xmlExpNewSeq) xmlExpNewSeq __attribute((alias("xmlExpNewSeq__internal_alias"))); -#else -#ifndef xmlExpNewSeq -extern __typeof (xmlExpNewSeq) xmlExpNewSeq__internal_alias __attribute((visibility("hidden"))); -#define xmlExpNewSeq xmlExpNewSeq__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpParse -extern __typeof (xmlExpParse) xmlExpParse __attribute((alias("xmlExpParse__internal_alias"))); -#else -#ifndef xmlExpParse -extern __typeof (xmlExpParse) xmlExpParse__internal_alias __attribute((visibility("hidden"))); -#define xmlExpParse xmlExpParse__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpRef -extern __typeof (xmlExpRef) xmlExpRef __attribute((alias("xmlExpRef__internal_alias"))); -#else -#ifndef xmlExpRef -extern __typeof (xmlExpRef) xmlExpRef__internal_alias __attribute((visibility("hidden"))); -#define xmlExpRef xmlExpRef__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpStringDerive -extern __typeof (xmlExpStringDerive) xmlExpStringDerive __attribute((alias("xmlExpStringDerive__internal_alias"))); -#else -#ifndef xmlExpStringDerive -extern __typeof (xmlExpStringDerive) xmlExpStringDerive__internal_alias __attribute((visibility("hidden"))); -#define xmlExpStringDerive xmlExpStringDerive__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlExpSubsume -extern __typeof (xmlExpSubsume) xmlExpSubsume __attribute((alias("xmlExpSubsume__internal_alias"))); -#else -#ifndef xmlExpSubsume -extern __typeof (xmlExpSubsume) xmlExpSubsume__internal_alias __attribute((visibility("hidden"))); -#define xmlExpSubsume xmlExpSubsume__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlFileClose -extern __typeof (xmlFileClose) xmlFileClose __attribute((alias("xmlFileClose__internal_alias"))); -#else -#ifndef xmlFileClose -extern __typeof (xmlFileClose) xmlFileClose__internal_alias __attribute((visibility("hidden"))); -#define xmlFileClose xmlFileClose__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlFileMatch -extern __typeof (xmlFileMatch) xmlFileMatch __attribute((alias("xmlFileMatch__internal_alias"))); -#else -#ifndef xmlFileMatch -extern __typeof (xmlFileMatch) xmlFileMatch__internal_alias __attribute((visibility("hidden"))); -#define xmlFileMatch xmlFileMatch__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlFileOpen -extern __typeof (xmlFileOpen) xmlFileOpen __attribute((alias("xmlFileOpen__internal_alias"))); -#else -#ifndef xmlFileOpen -extern __typeof (xmlFileOpen) xmlFileOpen__internal_alias __attribute((visibility("hidden"))); -#define xmlFileOpen xmlFileOpen__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlFileRead -extern __typeof (xmlFileRead) xmlFileRead __attribute((alias("xmlFileRead__internal_alias"))); -#else -#ifndef xmlFileRead -extern __typeof (xmlFileRead) xmlFileRead__internal_alias __attribute((visibility("hidden"))); -#define xmlFileRead xmlFileRead__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlFindCharEncodingHandler -extern __typeof (xmlFindCharEncodingHandler) xmlFindCharEncodingHandler __attribute((alias("xmlFindCharEncodingHandler__internal_alias"))); -#else -#ifndef xmlFindCharEncodingHandler -extern __typeof (xmlFindCharEncodingHandler) xmlFindCharEncodingHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlFindCharEncodingHandler xmlFindCharEncodingHandler__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlFreeAttributeTable -extern __typeof (xmlFreeAttributeTable) xmlFreeAttributeTable __attribute((alias("xmlFreeAttributeTable__internal_alias"))); -#else -#ifndef xmlFreeAttributeTable -extern __typeof (xmlFreeAttributeTable) xmlFreeAttributeTable__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeAttributeTable xmlFreeAttributeTable__internal_alias -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlFreeAutomata -extern __typeof (xmlFreeAutomata) xmlFreeAutomata __attribute((alias("xmlFreeAutomata__internal_alias"))); -#else -#ifndef xmlFreeAutomata -extern __typeof (xmlFreeAutomata) xmlFreeAutomata__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeAutomata xmlFreeAutomata__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlFreeCatalog -extern __typeof (xmlFreeCatalog) xmlFreeCatalog __attribute((alias("xmlFreeCatalog__internal_alias"))); -#else -#ifndef xmlFreeCatalog -extern __typeof (xmlFreeCatalog) xmlFreeCatalog__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeCatalog xmlFreeCatalog__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlFreeDoc -extern __typeof (xmlFreeDoc) xmlFreeDoc __attribute((alias("xmlFreeDoc__internal_alias"))); -#else -#ifndef xmlFreeDoc -extern __typeof (xmlFreeDoc) xmlFreeDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeDoc xmlFreeDoc__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlFreeDocElementContent -extern __typeof (xmlFreeDocElementContent) xmlFreeDocElementContent __attribute((alias("xmlFreeDocElementContent__internal_alias"))); -#else -#ifndef xmlFreeDocElementContent -extern __typeof (xmlFreeDocElementContent) xmlFreeDocElementContent__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeDocElementContent xmlFreeDocElementContent__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlFreeDtd -extern __typeof (xmlFreeDtd) xmlFreeDtd __attribute((alias("xmlFreeDtd__internal_alias"))); -#else -#ifndef xmlFreeDtd -extern __typeof (xmlFreeDtd) xmlFreeDtd__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeDtd xmlFreeDtd__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlFreeElementContent -extern __typeof (xmlFreeElementContent) xmlFreeElementContent __attribute((alias("xmlFreeElementContent__internal_alias"))); -#else -#ifndef xmlFreeElementContent -extern __typeof (xmlFreeElementContent) xmlFreeElementContent__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeElementContent xmlFreeElementContent__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlFreeElementTable -extern __typeof (xmlFreeElementTable) xmlFreeElementTable __attribute((alias("xmlFreeElementTable__internal_alias"))); -#else -#ifndef xmlFreeElementTable -extern __typeof (xmlFreeElementTable) xmlFreeElementTable__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeElementTable xmlFreeElementTable__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlFreeEntitiesTable -extern __typeof (xmlFreeEntitiesTable) xmlFreeEntitiesTable __attribute((alias("xmlFreeEntitiesTable__internal_alias"))); -#else -#ifndef xmlFreeEntitiesTable -extern __typeof (xmlFreeEntitiesTable) xmlFreeEntitiesTable__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeEntitiesTable xmlFreeEntitiesTable__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlFreeEnumeration -extern __typeof (xmlFreeEnumeration) xmlFreeEnumeration __attribute((alias("xmlFreeEnumeration__internal_alias"))); -#else -#ifndef xmlFreeEnumeration -extern __typeof (xmlFreeEnumeration) xmlFreeEnumeration__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeEnumeration xmlFreeEnumeration__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlFreeIDTable -extern __typeof (xmlFreeIDTable) xmlFreeIDTable __attribute((alias("xmlFreeIDTable__internal_alias"))); -#else -#ifndef xmlFreeIDTable -extern __typeof (xmlFreeIDTable) xmlFreeIDTable__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeIDTable xmlFreeIDTable__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlFreeInputStream -extern __typeof (xmlFreeInputStream) xmlFreeInputStream __attribute((alias("xmlFreeInputStream__internal_alias"))); -#else -#ifndef xmlFreeInputStream -extern __typeof (xmlFreeInputStream) xmlFreeInputStream__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeInputStream xmlFreeInputStream__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlFreeMutex -extern __typeof (xmlFreeMutex) xmlFreeMutex __attribute((alias("xmlFreeMutex__internal_alias"))); -#else -#ifndef xmlFreeMutex -extern __typeof (xmlFreeMutex) xmlFreeMutex__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeMutex xmlFreeMutex__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlFreeNode -extern __typeof (xmlFreeNode) xmlFreeNode __attribute((alias("xmlFreeNode__internal_alias"))); -#else -#ifndef xmlFreeNode -extern __typeof (xmlFreeNode) xmlFreeNode__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeNode xmlFreeNode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlFreeNodeList -extern __typeof (xmlFreeNodeList) xmlFreeNodeList __attribute((alias("xmlFreeNodeList__internal_alias"))); -#else -#ifndef xmlFreeNodeList -extern __typeof (xmlFreeNodeList) xmlFreeNodeList__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeNodeList xmlFreeNodeList__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlFreeNotationTable -extern __typeof (xmlFreeNotationTable) xmlFreeNotationTable __attribute((alias("xmlFreeNotationTable__internal_alias"))); -#else -#ifndef xmlFreeNotationTable -extern __typeof (xmlFreeNotationTable) xmlFreeNotationTable__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeNotationTable xmlFreeNotationTable__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlFreeNs -extern __typeof (xmlFreeNs) xmlFreeNs __attribute((alias("xmlFreeNs__internal_alias"))); -#else -#ifndef xmlFreeNs -extern __typeof (xmlFreeNs) xmlFreeNs__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeNs xmlFreeNs__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlFreeNsList -extern __typeof (xmlFreeNsList) xmlFreeNsList __attribute((alias("xmlFreeNsList__internal_alias"))); -#else -#ifndef xmlFreeNsList -extern __typeof (xmlFreeNsList) xmlFreeNsList__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeNsList xmlFreeNsList__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlFreeParserCtxt -extern __typeof (xmlFreeParserCtxt) xmlFreeParserCtxt __attribute((alias("xmlFreeParserCtxt__internal_alias"))); -#else -#ifndef xmlFreeParserCtxt -extern __typeof (xmlFreeParserCtxt) xmlFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeParserCtxt xmlFreeParserCtxt__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlFreeParserInputBuffer -extern __typeof (xmlFreeParserInputBuffer) xmlFreeParserInputBuffer __attribute((alias("xmlFreeParserInputBuffer__internal_alias"))); -#else -#ifndef xmlFreeParserInputBuffer -extern __typeof (xmlFreeParserInputBuffer) xmlFreeParserInputBuffer__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeParserInputBuffer xmlFreeParserInputBuffer__internal_alias -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlFreePattern -extern __typeof (xmlFreePattern) xmlFreePattern __attribute((alias("xmlFreePattern__internal_alias"))); -#else -#ifndef xmlFreePattern -extern __typeof (xmlFreePattern) xmlFreePattern__internal_alias __attribute((visibility("hidden"))); -#define xmlFreePattern xmlFreePattern__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlFreePatternList -extern __typeof (xmlFreePatternList) xmlFreePatternList __attribute((alias("xmlFreePatternList__internal_alias"))); -#else -#ifndef xmlFreePatternList -extern __typeof (xmlFreePatternList) xmlFreePatternList__internal_alias __attribute((visibility("hidden"))); -#define xmlFreePatternList xmlFreePatternList__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlFreeProp -extern __typeof (xmlFreeProp) xmlFreeProp __attribute((alias("xmlFreeProp__internal_alias"))); -#else -#ifndef xmlFreeProp -extern __typeof (xmlFreeProp) xmlFreeProp__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeProp xmlFreeProp__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlFreePropList -extern __typeof (xmlFreePropList) xmlFreePropList __attribute((alias("xmlFreePropList__internal_alias"))); -#else -#ifndef xmlFreePropList -extern __typeof (xmlFreePropList) xmlFreePropList__internal_alias __attribute((visibility("hidden"))); -#define xmlFreePropList xmlFreePropList__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlFreeRMutex -extern __typeof (xmlFreeRMutex) xmlFreeRMutex __attribute((alias("xmlFreeRMutex__internal_alias"))); -#else -#ifndef xmlFreeRMutex -extern __typeof (xmlFreeRMutex) xmlFreeRMutex__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeRMutex xmlFreeRMutex__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlFreeRefTable -extern __typeof (xmlFreeRefTable) xmlFreeRefTable __attribute((alias("xmlFreeRefTable__internal_alias"))); -#else -#ifndef xmlFreeRefTable -extern __typeof (xmlFreeRefTable) xmlFreeRefTable__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeRefTable xmlFreeRefTable__internal_alias -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlFreeStreamCtxt -extern __typeof (xmlFreeStreamCtxt) xmlFreeStreamCtxt __attribute((alias("xmlFreeStreamCtxt__internal_alias"))); -#else -#ifndef xmlFreeStreamCtxt -extern __typeof (xmlFreeStreamCtxt) xmlFreeStreamCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeStreamCtxt xmlFreeStreamCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlFreeTextReader -extern __typeof (xmlFreeTextReader) xmlFreeTextReader __attribute((alias("xmlFreeTextReader__internal_alias"))); -#else -#ifndef xmlFreeTextReader -extern __typeof (xmlFreeTextReader) xmlFreeTextReader__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeTextReader xmlFreeTextReader__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlFreeTextWriter -extern __typeof (xmlFreeTextWriter) xmlFreeTextWriter __attribute((alias("xmlFreeTextWriter__internal_alias"))); -#else -#ifndef xmlFreeTextWriter -extern __typeof (xmlFreeTextWriter) xmlFreeTextWriter__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeTextWriter xmlFreeTextWriter__internal_alias -#endif -#endif -#endif - -#ifdef bottom_uri -#undef xmlFreeURI -extern __typeof (xmlFreeURI) xmlFreeURI __attribute((alias("xmlFreeURI__internal_alias"))); -#else -#ifndef xmlFreeURI -extern __typeof (xmlFreeURI) xmlFreeURI__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeURI xmlFreeURI__internal_alias -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlFreeValidCtxt -extern __typeof (xmlFreeValidCtxt) xmlFreeValidCtxt __attribute((alias("xmlFreeValidCtxt__internal_alias"))); -#else -#ifndef xmlFreeValidCtxt -extern __typeof (xmlFreeValidCtxt) xmlFreeValidCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlFreeValidCtxt xmlFreeValidCtxt__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlGcMemGet -extern __typeof (xmlGcMemGet) xmlGcMemGet __attribute((alias("xmlGcMemGet__internal_alias"))); -#else -#ifndef xmlGcMemGet -extern __typeof (xmlGcMemGet) xmlGcMemGet__internal_alias __attribute((visibility("hidden"))); -#define xmlGcMemGet xmlGcMemGet__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlGcMemSetup -extern __typeof (xmlGcMemSetup) xmlGcMemSetup __attribute((alias("xmlGcMemSetup__internal_alias"))); -#else -#ifndef xmlGcMemSetup -extern __typeof (xmlGcMemSetup) xmlGcMemSetup__internal_alias __attribute((visibility("hidden"))); -#define xmlGcMemSetup xmlGcMemSetup__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetBufferAllocationScheme -extern __typeof (xmlGetBufferAllocationScheme) xmlGetBufferAllocationScheme __attribute((alias("xmlGetBufferAllocationScheme__internal_alias"))); -#else -#ifndef xmlGetBufferAllocationScheme -extern __typeof (xmlGetBufferAllocationScheme) xmlGetBufferAllocationScheme__internal_alias __attribute((visibility("hidden"))); -#define xmlGetBufferAllocationScheme xmlGetBufferAllocationScheme__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlGetCharEncodingHandler -extern __typeof (xmlGetCharEncodingHandler) xmlGetCharEncodingHandler __attribute((alias("xmlGetCharEncodingHandler__internal_alias"))); -#else -#ifndef xmlGetCharEncodingHandler -extern __typeof (xmlGetCharEncodingHandler) xmlGetCharEncodingHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlGetCharEncodingHandler xmlGetCharEncodingHandler__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlGetCharEncodingName -extern __typeof (xmlGetCharEncodingName) xmlGetCharEncodingName __attribute((alias("xmlGetCharEncodingName__internal_alias"))); -#else -#ifndef xmlGetCharEncodingName -extern __typeof (xmlGetCharEncodingName) xmlGetCharEncodingName__internal_alias __attribute((visibility("hidden"))); -#define xmlGetCharEncodingName xmlGetCharEncodingName__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetCompressMode -extern __typeof (xmlGetCompressMode) xmlGetCompressMode __attribute((alias("xmlGetCompressMode__internal_alias"))); -#else -#ifndef xmlGetCompressMode -extern __typeof (xmlGetCompressMode) xmlGetCompressMode__internal_alias __attribute((visibility("hidden"))); -#define xmlGetCompressMode xmlGetCompressMode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetDocCompressMode -extern __typeof (xmlGetDocCompressMode) xmlGetDocCompressMode __attribute((alias("xmlGetDocCompressMode__internal_alias"))); -#else -#ifndef xmlGetDocCompressMode -extern __typeof (xmlGetDocCompressMode) xmlGetDocCompressMode__internal_alias __attribute((visibility("hidden"))); -#define xmlGetDocCompressMode xmlGetDocCompressMode__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlGetDocEntity -extern __typeof (xmlGetDocEntity) xmlGetDocEntity __attribute((alias("xmlGetDocEntity__internal_alias"))); -#else -#ifndef xmlGetDocEntity -extern __typeof (xmlGetDocEntity) xmlGetDocEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlGetDocEntity xmlGetDocEntity__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlGetDtdAttrDesc -extern __typeof (xmlGetDtdAttrDesc) xmlGetDtdAttrDesc __attribute((alias("xmlGetDtdAttrDesc__internal_alias"))); -#else -#ifndef xmlGetDtdAttrDesc -extern __typeof (xmlGetDtdAttrDesc) xmlGetDtdAttrDesc__internal_alias __attribute((visibility("hidden"))); -#define xmlGetDtdAttrDesc xmlGetDtdAttrDesc__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlGetDtdElementDesc -extern __typeof (xmlGetDtdElementDesc) xmlGetDtdElementDesc __attribute((alias("xmlGetDtdElementDesc__internal_alias"))); -#else -#ifndef xmlGetDtdElementDesc -extern __typeof (xmlGetDtdElementDesc) xmlGetDtdElementDesc__internal_alias __attribute((visibility("hidden"))); -#define xmlGetDtdElementDesc xmlGetDtdElementDesc__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlGetDtdEntity -extern __typeof (xmlGetDtdEntity) xmlGetDtdEntity __attribute((alias("xmlGetDtdEntity__internal_alias"))); -#else -#ifndef xmlGetDtdEntity -extern __typeof (xmlGetDtdEntity) xmlGetDtdEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlGetDtdEntity xmlGetDtdEntity__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlGetDtdNotationDesc -extern __typeof (xmlGetDtdNotationDesc) xmlGetDtdNotationDesc __attribute((alias("xmlGetDtdNotationDesc__internal_alias"))); -#else -#ifndef xmlGetDtdNotationDesc -extern __typeof (xmlGetDtdNotationDesc) xmlGetDtdNotationDesc__internal_alias __attribute((visibility("hidden"))); -#define xmlGetDtdNotationDesc xmlGetDtdNotationDesc__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlGetDtdQAttrDesc -extern __typeof (xmlGetDtdQAttrDesc) xmlGetDtdQAttrDesc __attribute((alias("xmlGetDtdQAttrDesc__internal_alias"))); -#else -#ifndef xmlGetDtdQAttrDesc -extern __typeof (xmlGetDtdQAttrDesc) xmlGetDtdQAttrDesc__internal_alias __attribute((visibility("hidden"))); -#define xmlGetDtdQAttrDesc xmlGetDtdQAttrDesc__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlGetDtdQElementDesc -extern __typeof (xmlGetDtdQElementDesc) xmlGetDtdQElementDesc __attribute((alias("xmlGetDtdQElementDesc__internal_alias"))); -#else -#ifndef xmlGetDtdQElementDesc -extern __typeof (xmlGetDtdQElementDesc) xmlGetDtdQElementDesc__internal_alias __attribute((visibility("hidden"))); -#define xmlGetDtdQElementDesc xmlGetDtdQElementDesc__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlGetEncodingAlias -extern __typeof (xmlGetEncodingAlias) xmlGetEncodingAlias __attribute((alias("xmlGetEncodingAlias__internal_alias"))); -#else -#ifndef xmlGetEncodingAlias -extern __typeof (xmlGetEncodingAlias) xmlGetEncodingAlias__internal_alias __attribute((visibility("hidden"))); -#define xmlGetEncodingAlias xmlGetEncodingAlias__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlGetExternalEntityLoader -extern __typeof (xmlGetExternalEntityLoader) xmlGetExternalEntityLoader __attribute((alias("xmlGetExternalEntityLoader__internal_alias"))); -#else -#ifndef xmlGetExternalEntityLoader -extern __typeof (xmlGetExternalEntityLoader) xmlGetExternalEntityLoader__internal_alias __attribute((visibility("hidden"))); -#define xmlGetExternalEntityLoader xmlGetExternalEntityLoader__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlGetFeature -extern __typeof (xmlGetFeature) xmlGetFeature __attribute((alias("xmlGetFeature__internal_alias"))); -#else -#ifndef xmlGetFeature -extern __typeof (xmlGetFeature) xmlGetFeature__internal_alias __attribute((visibility("hidden"))); -#define xmlGetFeature xmlGetFeature__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlGetFeaturesList -extern __typeof (xmlGetFeaturesList) xmlGetFeaturesList __attribute((alias("xmlGetFeaturesList__internal_alias"))); -#else -#ifndef xmlGetFeaturesList -extern __typeof (xmlGetFeaturesList) xmlGetFeaturesList__internal_alias __attribute((visibility("hidden"))); -#define xmlGetFeaturesList xmlGetFeaturesList__internal_alias -#endif -#endif -#endif - -#ifdef bottom_threads -#undef xmlGetGlobalState -extern __typeof (xmlGetGlobalState) xmlGetGlobalState __attribute((alias("xmlGetGlobalState__internal_alias"))); -#else -#ifndef xmlGetGlobalState -extern __typeof (xmlGetGlobalState) xmlGetGlobalState__internal_alias __attribute((visibility("hidden"))); -#define xmlGetGlobalState xmlGetGlobalState__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlGetID -extern __typeof (xmlGetID) xmlGetID __attribute((alias("xmlGetID__internal_alias"))); -#else -#ifndef xmlGetID -extern __typeof (xmlGetID) xmlGetID__internal_alias __attribute((visibility("hidden"))); -#define xmlGetID xmlGetID__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetIntSubset -extern __typeof (xmlGetIntSubset) xmlGetIntSubset __attribute((alias("xmlGetIntSubset__internal_alias"))); -#else -#ifndef xmlGetIntSubset -extern __typeof (xmlGetIntSubset) xmlGetIntSubset__internal_alias __attribute((visibility("hidden"))); -#define xmlGetIntSubset xmlGetIntSubset__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetLastChild -extern __typeof (xmlGetLastChild) xmlGetLastChild __attribute((alias("xmlGetLastChild__internal_alias"))); -#else -#ifndef xmlGetLastChild -extern __typeof (xmlGetLastChild) xmlGetLastChild__internal_alias __attribute((visibility("hidden"))); -#define xmlGetLastChild xmlGetLastChild__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlGetLastError -extern __typeof (xmlGetLastError) xmlGetLastError __attribute((alias("xmlGetLastError__internal_alias"))); -#else -#ifndef xmlGetLastError -extern __typeof (xmlGetLastError) xmlGetLastError__internal_alias __attribute((visibility("hidden"))); -#define xmlGetLastError xmlGetLastError__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetLineNo -extern __typeof (xmlGetLineNo) xmlGetLineNo __attribute((alias("xmlGetLineNo__internal_alias"))); -#else -#ifndef xmlGetLineNo -extern __typeof (xmlGetLineNo) xmlGetLineNo__internal_alias __attribute((visibility("hidden"))); -#define xmlGetLineNo xmlGetLineNo__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetNoNsProp -extern __typeof (xmlGetNoNsProp) xmlGetNoNsProp __attribute((alias("xmlGetNoNsProp__internal_alias"))); -#else -#ifndef xmlGetNoNsProp -extern __typeof (xmlGetNoNsProp) xmlGetNoNsProp__internal_alias __attribute((visibility("hidden"))); -#define xmlGetNoNsProp xmlGetNoNsProp__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_tree -#undef xmlGetNodePath -extern __typeof (xmlGetNodePath) xmlGetNodePath __attribute((alias("xmlGetNodePath__internal_alias"))); -#else -#ifndef xmlGetNodePath -extern __typeof (xmlGetNodePath) xmlGetNodePath__internal_alias __attribute((visibility("hidden"))); -#define xmlGetNodePath xmlGetNodePath__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_tree -#undef xmlGetNsList -extern __typeof (xmlGetNsList) xmlGetNsList __attribute((alias("xmlGetNsList__internal_alias"))); -#else -#ifndef xmlGetNsList -extern __typeof (xmlGetNsList) xmlGetNsList__internal_alias __attribute((visibility("hidden"))); -#define xmlGetNsList xmlGetNsList__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetNsProp -extern __typeof (xmlGetNsProp) xmlGetNsProp __attribute((alias("xmlGetNsProp__internal_alias"))); -#else -#ifndef xmlGetNsProp -extern __typeof (xmlGetNsProp) xmlGetNsProp__internal_alias __attribute((visibility("hidden"))); -#define xmlGetNsProp xmlGetNsProp__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlGetParameterEntity -extern __typeof (xmlGetParameterEntity) xmlGetParameterEntity __attribute((alias("xmlGetParameterEntity__internal_alias"))); -#else -#ifndef xmlGetParameterEntity -extern __typeof (xmlGetParameterEntity) xmlGetParameterEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlGetParameterEntity xmlGetParameterEntity__internal_alias -#endif -#endif - -#ifdef bottom_entities -#undef xmlGetPredefinedEntity -extern __typeof (xmlGetPredefinedEntity) xmlGetPredefinedEntity __attribute((alias("xmlGetPredefinedEntity__internal_alias"))); -#else -#ifndef xmlGetPredefinedEntity -extern __typeof (xmlGetPredefinedEntity) xmlGetPredefinedEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlGetPredefinedEntity xmlGetPredefinedEntity__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlGetProp -extern __typeof (xmlGetProp) xmlGetProp __attribute((alias("xmlGetProp__internal_alias"))); -#else -#ifndef xmlGetProp -extern __typeof (xmlGetProp) xmlGetProp__internal_alias __attribute((visibility("hidden"))); -#define xmlGetProp xmlGetProp__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlGetRefs -extern __typeof (xmlGetRefs) xmlGetRefs __attribute((alias("xmlGetRefs__internal_alias"))); -#else -#ifndef xmlGetRefs -extern __typeof (xmlGetRefs) xmlGetRefs__internal_alias __attribute((visibility("hidden"))); -#define xmlGetRefs xmlGetRefs__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlGetThreadId -extern __typeof (xmlGetThreadId) xmlGetThreadId __attribute((alias("xmlGetThreadId__internal_alias"))); -#else -#ifndef xmlGetThreadId -extern __typeof (xmlGetThreadId) xmlGetThreadId__internal_alias __attribute((visibility("hidden"))); -#define xmlGetThreadId xmlGetThreadId__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlGetUTF8Char -extern __typeof (xmlGetUTF8Char) xmlGetUTF8Char __attribute((alias("xmlGetUTF8Char__internal_alias"))); -#else -#ifndef xmlGetUTF8Char -extern __typeof (xmlGetUTF8Char) xmlGetUTF8Char__internal_alias __attribute((visibility("hidden"))); -#define xmlGetUTF8Char xmlGetUTF8Char__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlHandleEntity -extern __typeof (xmlHandleEntity) xmlHandleEntity __attribute((alias("xmlHandleEntity__internal_alias"))); -#else -#ifndef xmlHandleEntity -extern __typeof (xmlHandleEntity) xmlHandleEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlHandleEntity xmlHandleEntity__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlHasFeature -extern __typeof (xmlHasFeature) xmlHasFeature __attribute((alias("xmlHasFeature__internal_alias"))); -#else -#ifndef xmlHasFeature -extern __typeof (xmlHasFeature) xmlHasFeature__internal_alias __attribute((visibility("hidden"))); -#define xmlHasFeature xmlHasFeature__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlHasNsProp -extern __typeof (xmlHasNsProp) xmlHasNsProp __attribute((alias("xmlHasNsProp__internal_alias"))); -#else -#ifndef xmlHasNsProp -extern __typeof (xmlHasNsProp) xmlHasNsProp__internal_alias __attribute((visibility("hidden"))); -#define xmlHasNsProp xmlHasNsProp__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlHasProp -extern __typeof (xmlHasProp) xmlHasProp __attribute((alias("xmlHasProp__internal_alias"))); -#else -#ifndef xmlHasProp -extern __typeof (xmlHasProp) xmlHasProp__internal_alias __attribute((visibility("hidden"))); -#define xmlHasProp xmlHasProp__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashAddEntry -extern __typeof (xmlHashAddEntry) xmlHashAddEntry __attribute((alias("xmlHashAddEntry__internal_alias"))); -#else -#ifndef xmlHashAddEntry -extern __typeof (xmlHashAddEntry) xmlHashAddEntry__internal_alias __attribute((visibility("hidden"))); -#define xmlHashAddEntry xmlHashAddEntry__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashAddEntry2 -extern __typeof (xmlHashAddEntry2) xmlHashAddEntry2 __attribute((alias("xmlHashAddEntry2__internal_alias"))); -#else -#ifndef xmlHashAddEntry2 -extern __typeof (xmlHashAddEntry2) xmlHashAddEntry2__internal_alias __attribute((visibility("hidden"))); -#define xmlHashAddEntry2 xmlHashAddEntry2__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashAddEntry3 -extern __typeof (xmlHashAddEntry3) xmlHashAddEntry3 __attribute((alias("xmlHashAddEntry3__internal_alias"))); -#else -#ifndef xmlHashAddEntry3 -extern __typeof (xmlHashAddEntry3) xmlHashAddEntry3__internal_alias __attribute((visibility("hidden"))); -#define xmlHashAddEntry3 xmlHashAddEntry3__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashCopy -extern __typeof (xmlHashCopy) xmlHashCopy __attribute((alias("xmlHashCopy__internal_alias"))); -#else -#ifndef xmlHashCopy -extern __typeof (xmlHashCopy) xmlHashCopy__internal_alias __attribute((visibility("hidden"))); -#define xmlHashCopy xmlHashCopy__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashCreate -extern __typeof (xmlHashCreate) xmlHashCreate __attribute((alias("xmlHashCreate__internal_alias"))); -#else -#ifndef xmlHashCreate -extern __typeof (xmlHashCreate) xmlHashCreate__internal_alias __attribute((visibility("hidden"))); -#define xmlHashCreate xmlHashCreate__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashCreateDict -extern __typeof (xmlHashCreateDict) xmlHashCreateDict __attribute((alias("xmlHashCreateDict__internal_alias"))); -#else -#ifndef xmlHashCreateDict -extern __typeof (xmlHashCreateDict) xmlHashCreateDict__internal_alias __attribute((visibility("hidden"))); -#define xmlHashCreateDict xmlHashCreateDict__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashFree -extern __typeof (xmlHashFree) xmlHashFree __attribute((alias("xmlHashFree__internal_alias"))); -#else -#ifndef xmlHashFree -extern __typeof (xmlHashFree) xmlHashFree__internal_alias __attribute((visibility("hidden"))); -#define xmlHashFree xmlHashFree__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashLookup -extern __typeof (xmlHashLookup) xmlHashLookup __attribute((alias("xmlHashLookup__internal_alias"))); -#else -#ifndef xmlHashLookup -extern __typeof (xmlHashLookup) xmlHashLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlHashLookup xmlHashLookup__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashLookup2 -extern __typeof (xmlHashLookup2) xmlHashLookup2 __attribute((alias("xmlHashLookup2__internal_alias"))); -#else -#ifndef xmlHashLookup2 -extern __typeof (xmlHashLookup2) xmlHashLookup2__internal_alias __attribute((visibility("hidden"))); -#define xmlHashLookup2 xmlHashLookup2__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashLookup3 -extern __typeof (xmlHashLookup3) xmlHashLookup3 __attribute((alias("xmlHashLookup3__internal_alias"))); -#else -#ifndef xmlHashLookup3 -extern __typeof (xmlHashLookup3) xmlHashLookup3__internal_alias __attribute((visibility("hidden"))); -#define xmlHashLookup3 xmlHashLookup3__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashQLookup -extern __typeof (xmlHashQLookup) xmlHashQLookup __attribute((alias("xmlHashQLookup__internal_alias"))); -#else -#ifndef xmlHashQLookup -extern __typeof (xmlHashQLookup) xmlHashQLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlHashQLookup xmlHashQLookup__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashQLookup2 -extern __typeof (xmlHashQLookup2) xmlHashQLookup2 __attribute((alias("xmlHashQLookup2__internal_alias"))); -#else -#ifndef xmlHashQLookup2 -extern __typeof (xmlHashQLookup2) xmlHashQLookup2__internal_alias __attribute((visibility("hidden"))); -#define xmlHashQLookup2 xmlHashQLookup2__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashQLookup3 -extern __typeof (xmlHashQLookup3) xmlHashQLookup3 __attribute((alias("xmlHashQLookup3__internal_alias"))); -#else -#ifndef xmlHashQLookup3 -extern __typeof (xmlHashQLookup3) xmlHashQLookup3__internal_alias __attribute((visibility("hidden"))); -#define xmlHashQLookup3 xmlHashQLookup3__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashRemoveEntry -extern __typeof (xmlHashRemoveEntry) xmlHashRemoveEntry __attribute((alias("xmlHashRemoveEntry__internal_alias"))); -#else -#ifndef xmlHashRemoveEntry -extern __typeof (xmlHashRemoveEntry) xmlHashRemoveEntry__internal_alias __attribute((visibility("hidden"))); -#define xmlHashRemoveEntry xmlHashRemoveEntry__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashRemoveEntry2 -extern __typeof (xmlHashRemoveEntry2) xmlHashRemoveEntry2 __attribute((alias("xmlHashRemoveEntry2__internal_alias"))); -#else -#ifndef xmlHashRemoveEntry2 -extern __typeof (xmlHashRemoveEntry2) xmlHashRemoveEntry2__internal_alias __attribute((visibility("hidden"))); -#define xmlHashRemoveEntry2 xmlHashRemoveEntry2__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashRemoveEntry3 -extern __typeof (xmlHashRemoveEntry3) xmlHashRemoveEntry3 __attribute((alias("xmlHashRemoveEntry3__internal_alias"))); -#else -#ifndef xmlHashRemoveEntry3 -extern __typeof (xmlHashRemoveEntry3) xmlHashRemoveEntry3__internal_alias __attribute((visibility("hidden"))); -#define xmlHashRemoveEntry3 xmlHashRemoveEntry3__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashScan -extern __typeof (xmlHashScan) xmlHashScan __attribute((alias("xmlHashScan__internal_alias"))); -#else -#ifndef xmlHashScan -extern __typeof (xmlHashScan) xmlHashScan__internal_alias __attribute((visibility("hidden"))); -#define xmlHashScan xmlHashScan__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashScan3 -extern __typeof (xmlHashScan3) xmlHashScan3 __attribute((alias("xmlHashScan3__internal_alias"))); -#else -#ifndef xmlHashScan3 -extern __typeof (xmlHashScan3) xmlHashScan3__internal_alias __attribute((visibility("hidden"))); -#define xmlHashScan3 xmlHashScan3__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashScanFull -extern __typeof (xmlHashScanFull) xmlHashScanFull __attribute((alias("xmlHashScanFull__internal_alias"))); -#else -#ifndef xmlHashScanFull -extern __typeof (xmlHashScanFull) xmlHashScanFull__internal_alias __attribute((visibility("hidden"))); -#define xmlHashScanFull xmlHashScanFull__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashScanFull3 -extern __typeof (xmlHashScanFull3) xmlHashScanFull3 __attribute((alias("xmlHashScanFull3__internal_alias"))); -#else -#ifndef xmlHashScanFull3 -extern __typeof (xmlHashScanFull3) xmlHashScanFull3__internal_alias __attribute((visibility("hidden"))); -#define xmlHashScanFull3 xmlHashScanFull3__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashSize -extern __typeof (xmlHashSize) xmlHashSize __attribute((alias("xmlHashSize__internal_alias"))); -#else -#ifndef xmlHashSize -extern __typeof (xmlHashSize) xmlHashSize__internal_alias __attribute((visibility("hidden"))); -#define xmlHashSize xmlHashSize__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashUpdateEntry -extern __typeof (xmlHashUpdateEntry) xmlHashUpdateEntry __attribute((alias("xmlHashUpdateEntry__internal_alias"))); -#else -#ifndef xmlHashUpdateEntry -extern __typeof (xmlHashUpdateEntry) xmlHashUpdateEntry__internal_alias __attribute((visibility("hidden"))); -#define xmlHashUpdateEntry xmlHashUpdateEntry__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashUpdateEntry2 -extern __typeof (xmlHashUpdateEntry2) xmlHashUpdateEntry2 __attribute((alias("xmlHashUpdateEntry2__internal_alias"))); -#else -#ifndef xmlHashUpdateEntry2 -extern __typeof (xmlHashUpdateEntry2) xmlHashUpdateEntry2__internal_alias __attribute((visibility("hidden"))); -#define xmlHashUpdateEntry2 xmlHashUpdateEntry2__internal_alias -#endif -#endif - -#ifdef bottom_hash -#undef xmlHashUpdateEntry3 -extern __typeof (xmlHashUpdateEntry3) xmlHashUpdateEntry3 __attribute((alias("xmlHashUpdateEntry3__internal_alias"))); -#else -#ifndef xmlHashUpdateEntry3 -extern __typeof (xmlHashUpdateEntry3) xmlHashUpdateEntry3__internal_alias __attribute((visibility("hidden"))); -#define xmlHashUpdateEntry3 xmlHashUpdateEntry3__internal_alias -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOFTPClose -extern __typeof (xmlIOFTPClose) xmlIOFTPClose __attribute((alias("xmlIOFTPClose__internal_alias"))); -#else -#ifndef xmlIOFTPClose -extern __typeof (xmlIOFTPClose) xmlIOFTPClose__internal_alias __attribute((visibility("hidden"))); -#define xmlIOFTPClose xmlIOFTPClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOFTPMatch -extern __typeof (xmlIOFTPMatch) xmlIOFTPMatch __attribute((alias("xmlIOFTPMatch__internal_alias"))); -#else -#ifndef xmlIOFTPMatch -extern __typeof (xmlIOFTPMatch) xmlIOFTPMatch__internal_alias __attribute((visibility("hidden"))); -#define xmlIOFTPMatch xmlIOFTPMatch__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOFTPOpen -extern __typeof (xmlIOFTPOpen) xmlIOFTPOpen __attribute((alias("xmlIOFTPOpen__internal_alias"))); -#else -#ifndef xmlIOFTPOpen -extern __typeof (xmlIOFTPOpen) xmlIOFTPOpen__internal_alias __attribute((visibility("hidden"))); -#define xmlIOFTPOpen xmlIOFTPOpen__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOFTPRead -extern __typeof (xmlIOFTPRead) xmlIOFTPRead __attribute((alias("xmlIOFTPRead__internal_alias"))); -#else -#ifndef xmlIOFTPRead -extern __typeof (xmlIOFTPRead) xmlIOFTPRead__internal_alias __attribute((visibility("hidden"))); -#define xmlIOFTPRead xmlIOFTPRead__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOHTTPClose -extern __typeof (xmlIOHTTPClose) xmlIOHTTPClose __attribute((alias("xmlIOHTTPClose__internal_alias"))); -#else -#ifndef xmlIOHTTPClose -extern __typeof (xmlIOHTTPClose) xmlIOHTTPClose__internal_alias __attribute((visibility("hidden"))); -#define xmlIOHTTPClose xmlIOHTTPClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOHTTPMatch -extern __typeof (xmlIOHTTPMatch) xmlIOHTTPMatch __attribute((alias("xmlIOHTTPMatch__internal_alias"))); -#else -#ifndef xmlIOHTTPMatch -extern __typeof (xmlIOHTTPMatch) xmlIOHTTPMatch__internal_alias __attribute((visibility("hidden"))); -#define xmlIOHTTPMatch xmlIOHTTPMatch__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOHTTPOpen -extern __typeof (xmlIOHTTPOpen) xmlIOHTTPOpen __attribute((alias("xmlIOHTTPOpen__internal_alias"))); -#else -#ifndef xmlIOHTTPOpen -extern __typeof (xmlIOHTTPOpen) xmlIOHTTPOpen__internal_alias __attribute((visibility("hidden"))); -#define xmlIOHTTPOpen xmlIOHTTPOpen__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOHTTPOpenW -extern __typeof (xmlIOHTTPOpenW) xmlIOHTTPOpenW __attribute((alias("xmlIOHTTPOpenW__internal_alias"))); -#else -#ifndef xmlIOHTTPOpenW -extern __typeof (xmlIOHTTPOpenW) xmlIOHTTPOpenW__internal_alias __attribute((visibility("hidden"))); -#define xmlIOHTTPOpenW xmlIOHTTPOpenW__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlIOHTTPRead -extern __typeof (xmlIOHTTPRead) xmlIOHTTPRead __attribute((alias("xmlIOHTTPRead__internal_alias"))); -#else -#ifndef xmlIOHTTPRead -extern __typeof (xmlIOHTTPRead) xmlIOHTTPRead__internal_alias __attribute((visibility("hidden"))); -#define xmlIOHTTPRead xmlIOHTTPRead__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_parser -#undef xmlIOParseDTD -extern __typeof (xmlIOParseDTD) xmlIOParseDTD __attribute((alias("xmlIOParseDTD__internal_alias"))); -#else -#ifndef xmlIOParseDTD -extern __typeof (xmlIOParseDTD) xmlIOParseDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlIOParseDTD xmlIOParseDTD__internal_alias -#endif -#endif -#endif - -#ifdef bottom_encoding -#undef xmlInitCharEncodingHandlers -extern __typeof (xmlInitCharEncodingHandlers) xmlInitCharEncodingHandlers __attribute((alias("xmlInitCharEncodingHandlers__internal_alias"))); -#else -#ifndef xmlInitCharEncodingHandlers -extern __typeof (xmlInitCharEncodingHandlers) xmlInitCharEncodingHandlers__internal_alias __attribute((visibility("hidden"))); -#define xmlInitCharEncodingHandlers xmlInitCharEncodingHandlers__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlInitGlobals -extern __typeof (xmlInitGlobals) xmlInitGlobals __attribute((alias("xmlInitGlobals__internal_alias"))); -#else -#ifndef xmlInitGlobals -extern __typeof (xmlInitGlobals) xmlInitGlobals__internal_alias __attribute((visibility("hidden"))); -#define xmlInitGlobals xmlInitGlobals__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlInitMemory -extern __typeof (xmlInitMemory) xmlInitMemory __attribute((alias("xmlInitMemory__internal_alias"))); -#else -#ifndef xmlInitMemory -extern __typeof (xmlInitMemory) xmlInitMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlInitMemory xmlInitMemory__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlInitNodeInfoSeq -extern __typeof (xmlInitNodeInfoSeq) xmlInitNodeInfoSeq __attribute((alias("xmlInitNodeInfoSeq__internal_alias"))); -#else -#ifndef xmlInitNodeInfoSeq -extern __typeof (xmlInitNodeInfoSeq) xmlInitNodeInfoSeq__internal_alias __attribute((visibility("hidden"))); -#define xmlInitNodeInfoSeq xmlInitNodeInfoSeq__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlInitParser -extern __typeof (xmlInitParser) xmlInitParser __attribute((alias("xmlInitParser__internal_alias"))); -#else -#ifndef xmlInitParser -extern __typeof (xmlInitParser) xmlInitParser__internal_alias __attribute((visibility("hidden"))); -#define xmlInitParser xmlInitParser__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlInitParserCtxt -extern __typeof (xmlInitParserCtxt) xmlInitParserCtxt __attribute((alias("xmlInitParserCtxt__internal_alias"))); -#else -#ifndef xmlInitParserCtxt -extern __typeof (xmlInitParserCtxt) xmlInitParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlInitParserCtxt xmlInitParserCtxt__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlInitThreads -extern __typeof (xmlInitThreads) xmlInitThreads __attribute((alias("xmlInitThreads__internal_alias"))); -#else -#ifndef xmlInitThreads -extern __typeof (xmlInitThreads) xmlInitThreads__internal_alias __attribute((visibility("hidden"))); -#define xmlInitThreads xmlInitThreads__internal_alias -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlInitializeCatalog -extern __typeof (xmlInitializeCatalog) xmlInitializeCatalog __attribute((alias("xmlInitializeCatalog__internal_alias"))); -#else -#ifndef xmlInitializeCatalog -extern __typeof (xmlInitializeCatalog) xmlInitializeCatalog__internal_alias __attribute((visibility("hidden"))); -#define xmlInitializeCatalog xmlInitializeCatalog__internal_alias -#endif -#endif -#endif - -#ifdef bottom_globals -#undef xmlInitializeGlobalState -extern __typeof (xmlInitializeGlobalState) xmlInitializeGlobalState __attribute((alias("xmlInitializeGlobalState__internal_alias"))); -#else -#ifndef xmlInitializeGlobalState -extern __typeof (xmlInitializeGlobalState) xmlInitializeGlobalState__internal_alias __attribute((visibility("hidden"))); -#define xmlInitializeGlobalState xmlInitializeGlobalState__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlInitializePredefinedEntities -extern __typeof (xmlInitializePredefinedEntities) xmlInitializePredefinedEntities __attribute((alias("xmlInitializePredefinedEntities__internal_alias"))); -#else -#ifndef xmlInitializePredefinedEntities -extern __typeof (xmlInitializePredefinedEntities) xmlInitializePredefinedEntities__internal_alias __attribute((visibility("hidden"))); -#define xmlInitializePredefinedEntities xmlInitializePredefinedEntities__internal_alias -#endif -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlIsBaseChar -extern __typeof (xmlIsBaseChar) xmlIsBaseChar __attribute((alias("xmlIsBaseChar__internal_alias"))); -#else -#ifndef xmlIsBaseChar -extern __typeof (xmlIsBaseChar) xmlIsBaseChar__internal_alias __attribute((visibility("hidden"))); -#define xmlIsBaseChar xmlIsBaseChar__internal_alias -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlIsBlank -extern __typeof (xmlIsBlank) xmlIsBlank __attribute((alias("xmlIsBlank__internal_alias"))); -#else -#ifndef xmlIsBlank -extern __typeof (xmlIsBlank) xmlIsBlank__internal_alias __attribute((visibility("hidden"))); -#define xmlIsBlank xmlIsBlank__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlIsBlankNode -extern __typeof (xmlIsBlankNode) xmlIsBlankNode __attribute((alias("xmlIsBlankNode__internal_alias"))); -#else -#ifndef xmlIsBlankNode -extern __typeof (xmlIsBlankNode) xmlIsBlankNode__internal_alias __attribute((visibility("hidden"))); -#define xmlIsBlankNode xmlIsBlankNode__internal_alias -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlIsChar -extern __typeof (xmlIsChar) xmlIsChar __attribute((alias("xmlIsChar__internal_alias"))); -#else -#ifndef xmlIsChar -extern __typeof (xmlIsChar) xmlIsChar__internal_alias __attribute((visibility("hidden"))); -#define xmlIsChar xmlIsChar__internal_alias -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlIsCombining -extern __typeof (xmlIsCombining) xmlIsCombining __attribute((alias("xmlIsCombining__internal_alias"))); -#else -#ifndef xmlIsCombining -extern __typeof (xmlIsCombining) xmlIsCombining__internal_alias __attribute((visibility("hidden"))); -#define xmlIsCombining xmlIsCombining__internal_alias -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlIsDigit -extern __typeof (xmlIsDigit) xmlIsDigit __attribute((alias("xmlIsDigit__internal_alias"))); -#else -#ifndef xmlIsDigit -extern __typeof (xmlIsDigit) xmlIsDigit__internal_alias __attribute((visibility("hidden"))); -#define xmlIsDigit xmlIsDigit__internal_alias -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlIsExtender -extern __typeof (xmlIsExtender) xmlIsExtender __attribute((alias("xmlIsExtender__internal_alias"))); -#else -#ifndef xmlIsExtender -extern __typeof (xmlIsExtender) xmlIsExtender__internal_alias __attribute((visibility("hidden"))); -#define xmlIsExtender xmlIsExtender__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlIsID -extern __typeof (xmlIsID) xmlIsID __attribute((alias("xmlIsID__internal_alias"))); -#else -#ifndef xmlIsID -extern __typeof (xmlIsID) xmlIsID__internal_alias __attribute((visibility("hidden"))); -#define xmlIsID xmlIsID__internal_alias -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlIsIdeographic -extern __typeof (xmlIsIdeographic) xmlIsIdeographic __attribute((alias("xmlIsIdeographic__internal_alias"))); -#else -#ifndef xmlIsIdeographic -extern __typeof (xmlIsIdeographic) xmlIsIdeographic__internal_alias __attribute((visibility("hidden"))); -#define xmlIsIdeographic xmlIsIdeographic__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlIsLetter -extern __typeof (xmlIsLetter) xmlIsLetter __attribute((alias("xmlIsLetter__internal_alias"))); -#else -#ifndef xmlIsLetter -extern __typeof (xmlIsLetter) xmlIsLetter__internal_alias __attribute((visibility("hidden"))); -#define xmlIsLetter xmlIsLetter__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlIsMainThread -extern __typeof (xmlIsMainThread) xmlIsMainThread __attribute((alias("xmlIsMainThread__internal_alias"))); -#else -#ifndef xmlIsMainThread -extern __typeof (xmlIsMainThread) xmlIsMainThread__internal_alias __attribute((visibility("hidden"))); -#define xmlIsMainThread xmlIsMainThread__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlIsMixedElement -extern __typeof (xmlIsMixedElement) xmlIsMixedElement __attribute((alias("xmlIsMixedElement__internal_alias"))); -#else -#ifndef xmlIsMixedElement -extern __typeof (xmlIsMixedElement) xmlIsMixedElement__internal_alias __attribute((visibility("hidden"))); -#define xmlIsMixedElement xmlIsMixedElement__internal_alias -#endif -#endif - -#ifdef bottom_chvalid -#undef xmlIsPubidChar -extern __typeof (xmlIsPubidChar) xmlIsPubidChar __attribute((alias("xmlIsPubidChar__internal_alias"))); -#else -#ifndef xmlIsPubidChar -extern __typeof (xmlIsPubidChar) xmlIsPubidChar__internal_alias __attribute((visibility("hidden"))); -#define xmlIsPubidChar xmlIsPubidChar__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlIsRef -extern __typeof (xmlIsRef) xmlIsRef __attribute((alias("xmlIsRef__internal_alias"))); -#else -#ifndef xmlIsRef -extern __typeof (xmlIsRef) xmlIsRef__internal_alias __attribute((visibility("hidden"))); -#define xmlIsRef xmlIsRef__internal_alias -#endif -#endif - -#ifdef bottom_xmlsave -#undef xmlIsXHTML -extern __typeof (xmlIsXHTML) xmlIsXHTML __attribute((alias("xmlIsXHTML__internal_alias"))); -#else -#ifndef xmlIsXHTML -extern __typeof (xmlIsXHTML) xmlIsXHTML__internal_alias __attribute((visibility("hidden"))); -#define xmlIsXHTML xmlIsXHTML__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlKeepBlanksDefault -extern __typeof (xmlKeepBlanksDefault) xmlKeepBlanksDefault __attribute((alias("xmlKeepBlanksDefault__internal_alias"))); -#else -#ifndef xmlKeepBlanksDefault -extern __typeof (xmlKeepBlanksDefault) xmlKeepBlanksDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlKeepBlanksDefault xmlKeepBlanksDefault__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlLineNumbersDefault -extern __typeof (xmlLineNumbersDefault) xmlLineNumbersDefault __attribute((alias("xmlLineNumbersDefault__internal_alias"))); -#else -#ifndef xmlLineNumbersDefault -extern __typeof (xmlLineNumbersDefault) xmlLineNumbersDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlLineNumbersDefault xmlLineNumbersDefault__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlLinkGetData -extern __typeof (xmlLinkGetData) xmlLinkGetData __attribute((alias("xmlLinkGetData__internal_alias"))); -#else -#ifndef xmlLinkGetData -extern __typeof (xmlLinkGetData) xmlLinkGetData__internal_alias __attribute((visibility("hidden"))); -#define xmlLinkGetData xmlLinkGetData__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListAppend -extern __typeof (xmlListAppend) xmlListAppend __attribute((alias("xmlListAppend__internal_alias"))); -#else -#ifndef xmlListAppend -extern __typeof (xmlListAppend) xmlListAppend__internal_alias __attribute((visibility("hidden"))); -#define xmlListAppend xmlListAppend__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListClear -extern __typeof (xmlListClear) xmlListClear __attribute((alias("xmlListClear__internal_alias"))); -#else -#ifndef xmlListClear -extern __typeof (xmlListClear) xmlListClear__internal_alias __attribute((visibility("hidden"))); -#define xmlListClear xmlListClear__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListCopy -extern __typeof (xmlListCopy) xmlListCopy __attribute((alias("xmlListCopy__internal_alias"))); -#else -#ifndef xmlListCopy -extern __typeof (xmlListCopy) xmlListCopy__internal_alias __attribute((visibility("hidden"))); -#define xmlListCopy xmlListCopy__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListCreate -extern __typeof (xmlListCreate) xmlListCreate __attribute((alias("xmlListCreate__internal_alias"))); -#else -#ifndef xmlListCreate -extern __typeof (xmlListCreate) xmlListCreate__internal_alias __attribute((visibility("hidden"))); -#define xmlListCreate xmlListCreate__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListDelete -extern __typeof (xmlListDelete) xmlListDelete __attribute((alias("xmlListDelete__internal_alias"))); -#else -#ifndef xmlListDelete -extern __typeof (xmlListDelete) xmlListDelete__internal_alias __attribute((visibility("hidden"))); -#define xmlListDelete xmlListDelete__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListDup -extern __typeof (xmlListDup) xmlListDup __attribute((alias("xmlListDup__internal_alias"))); -#else -#ifndef xmlListDup -extern __typeof (xmlListDup) xmlListDup__internal_alias __attribute((visibility("hidden"))); -#define xmlListDup xmlListDup__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListEmpty -extern __typeof (xmlListEmpty) xmlListEmpty __attribute((alias("xmlListEmpty__internal_alias"))); -#else -#ifndef xmlListEmpty -extern __typeof (xmlListEmpty) xmlListEmpty__internal_alias __attribute((visibility("hidden"))); -#define xmlListEmpty xmlListEmpty__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListEnd -extern __typeof (xmlListEnd) xmlListEnd __attribute((alias("xmlListEnd__internal_alias"))); -#else -#ifndef xmlListEnd -extern __typeof (xmlListEnd) xmlListEnd__internal_alias __attribute((visibility("hidden"))); -#define xmlListEnd xmlListEnd__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListFront -extern __typeof (xmlListFront) xmlListFront __attribute((alias("xmlListFront__internal_alias"))); -#else -#ifndef xmlListFront -extern __typeof (xmlListFront) xmlListFront__internal_alias __attribute((visibility("hidden"))); -#define xmlListFront xmlListFront__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListInsert -extern __typeof (xmlListInsert) xmlListInsert __attribute((alias("xmlListInsert__internal_alias"))); -#else -#ifndef xmlListInsert -extern __typeof (xmlListInsert) xmlListInsert__internal_alias __attribute((visibility("hidden"))); -#define xmlListInsert xmlListInsert__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListMerge -extern __typeof (xmlListMerge) xmlListMerge __attribute((alias("xmlListMerge__internal_alias"))); -#else -#ifndef xmlListMerge -extern __typeof (xmlListMerge) xmlListMerge__internal_alias __attribute((visibility("hidden"))); -#define xmlListMerge xmlListMerge__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListPopBack -extern __typeof (xmlListPopBack) xmlListPopBack __attribute((alias("xmlListPopBack__internal_alias"))); -#else -#ifndef xmlListPopBack -extern __typeof (xmlListPopBack) xmlListPopBack__internal_alias __attribute((visibility("hidden"))); -#define xmlListPopBack xmlListPopBack__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListPopFront -extern __typeof (xmlListPopFront) xmlListPopFront __attribute((alias("xmlListPopFront__internal_alias"))); -#else -#ifndef xmlListPopFront -extern __typeof (xmlListPopFront) xmlListPopFront__internal_alias __attribute((visibility("hidden"))); -#define xmlListPopFront xmlListPopFront__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListPushBack -extern __typeof (xmlListPushBack) xmlListPushBack __attribute((alias("xmlListPushBack__internal_alias"))); -#else -#ifndef xmlListPushBack -extern __typeof (xmlListPushBack) xmlListPushBack__internal_alias __attribute((visibility("hidden"))); -#define xmlListPushBack xmlListPushBack__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListPushFront -extern __typeof (xmlListPushFront) xmlListPushFront __attribute((alias("xmlListPushFront__internal_alias"))); -#else -#ifndef xmlListPushFront -extern __typeof (xmlListPushFront) xmlListPushFront__internal_alias __attribute((visibility("hidden"))); -#define xmlListPushFront xmlListPushFront__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListRemoveAll -extern __typeof (xmlListRemoveAll) xmlListRemoveAll __attribute((alias("xmlListRemoveAll__internal_alias"))); -#else -#ifndef xmlListRemoveAll -extern __typeof (xmlListRemoveAll) xmlListRemoveAll__internal_alias __attribute((visibility("hidden"))); -#define xmlListRemoveAll xmlListRemoveAll__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListRemoveFirst -extern __typeof (xmlListRemoveFirst) xmlListRemoveFirst __attribute((alias("xmlListRemoveFirst__internal_alias"))); -#else -#ifndef xmlListRemoveFirst -extern __typeof (xmlListRemoveFirst) xmlListRemoveFirst__internal_alias __attribute((visibility("hidden"))); -#define xmlListRemoveFirst xmlListRemoveFirst__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListRemoveLast -extern __typeof (xmlListRemoveLast) xmlListRemoveLast __attribute((alias("xmlListRemoveLast__internal_alias"))); -#else -#ifndef xmlListRemoveLast -extern __typeof (xmlListRemoveLast) xmlListRemoveLast__internal_alias __attribute((visibility("hidden"))); -#define xmlListRemoveLast xmlListRemoveLast__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListReverse -extern __typeof (xmlListReverse) xmlListReverse __attribute((alias("xmlListReverse__internal_alias"))); -#else -#ifndef xmlListReverse -extern __typeof (xmlListReverse) xmlListReverse__internal_alias __attribute((visibility("hidden"))); -#define xmlListReverse xmlListReverse__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListReverseSearch -extern __typeof (xmlListReverseSearch) xmlListReverseSearch __attribute((alias("xmlListReverseSearch__internal_alias"))); -#else -#ifndef xmlListReverseSearch -extern __typeof (xmlListReverseSearch) xmlListReverseSearch__internal_alias __attribute((visibility("hidden"))); -#define xmlListReverseSearch xmlListReverseSearch__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListReverseWalk -extern __typeof (xmlListReverseWalk) xmlListReverseWalk __attribute((alias("xmlListReverseWalk__internal_alias"))); -#else -#ifndef xmlListReverseWalk -extern __typeof (xmlListReverseWalk) xmlListReverseWalk__internal_alias __attribute((visibility("hidden"))); -#define xmlListReverseWalk xmlListReverseWalk__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListSearch -extern __typeof (xmlListSearch) xmlListSearch __attribute((alias("xmlListSearch__internal_alias"))); -#else -#ifndef xmlListSearch -extern __typeof (xmlListSearch) xmlListSearch__internal_alias __attribute((visibility("hidden"))); -#define xmlListSearch xmlListSearch__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListSize -extern __typeof (xmlListSize) xmlListSize __attribute((alias("xmlListSize__internal_alias"))); -#else -#ifndef xmlListSize -extern __typeof (xmlListSize) xmlListSize__internal_alias __attribute((visibility("hidden"))); -#define xmlListSize xmlListSize__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListSort -extern __typeof (xmlListSort) xmlListSort __attribute((alias("xmlListSort__internal_alias"))); -#else -#ifndef xmlListSort -extern __typeof (xmlListSort) xmlListSort__internal_alias __attribute((visibility("hidden"))); -#define xmlListSort xmlListSort__internal_alias -#endif -#endif - -#ifdef bottom_list -#undef xmlListWalk -extern __typeof (xmlListWalk) xmlListWalk __attribute((alias("xmlListWalk__internal_alias"))); -#else -#ifndef xmlListWalk -extern __typeof (xmlListWalk) xmlListWalk__internal_alias __attribute((visibility("hidden"))); -#define xmlListWalk xmlListWalk__internal_alias -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlLoadACatalog -extern __typeof (xmlLoadACatalog) xmlLoadACatalog __attribute((alias("xmlLoadACatalog__internal_alias"))); -#else -#ifndef xmlLoadACatalog -extern __typeof (xmlLoadACatalog) xmlLoadACatalog__internal_alias __attribute((visibility("hidden"))); -#define xmlLoadACatalog xmlLoadACatalog__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlLoadCatalog -extern __typeof (xmlLoadCatalog) xmlLoadCatalog __attribute((alias("xmlLoadCatalog__internal_alias"))); -#else -#ifndef xmlLoadCatalog -extern __typeof (xmlLoadCatalog) xmlLoadCatalog__internal_alias __attribute((visibility("hidden"))); -#define xmlLoadCatalog xmlLoadCatalog__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlLoadCatalogs -extern __typeof (xmlLoadCatalogs) xmlLoadCatalogs __attribute((alias("xmlLoadCatalogs__internal_alias"))); -#else -#ifndef xmlLoadCatalogs -extern __typeof (xmlLoadCatalogs) xmlLoadCatalogs__internal_alias __attribute((visibility("hidden"))); -#define xmlLoadCatalogs xmlLoadCatalogs__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlLoadExternalEntity -extern __typeof (xmlLoadExternalEntity) xmlLoadExternalEntity __attribute((alias("xmlLoadExternalEntity__internal_alias"))); -#else -#ifndef xmlLoadExternalEntity -extern __typeof (xmlLoadExternalEntity) xmlLoadExternalEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlLoadExternalEntity xmlLoadExternalEntity__internal_alias -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlLoadSGMLSuperCatalog -extern __typeof (xmlLoadSGMLSuperCatalog) xmlLoadSGMLSuperCatalog __attribute((alias("xmlLoadSGMLSuperCatalog__internal_alias"))); -#else -#ifndef xmlLoadSGMLSuperCatalog -extern __typeof (xmlLoadSGMLSuperCatalog) xmlLoadSGMLSuperCatalog__internal_alias __attribute((visibility("hidden"))); -#define xmlLoadSGMLSuperCatalog xmlLoadSGMLSuperCatalog__internal_alias -#endif -#endif -#endif - -#ifdef bottom_threads -#undef xmlLockLibrary -extern __typeof (xmlLockLibrary) xmlLockLibrary __attribute((alias("xmlLockLibrary__internal_alias"))); -#else -#ifndef xmlLockLibrary -extern __typeof (xmlLockLibrary) xmlLockLibrary__internal_alias __attribute((visibility("hidden"))); -#define xmlLockLibrary xmlLockLibrary__internal_alias -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlLsCountNode -extern __typeof (xmlLsCountNode) xmlLsCountNode __attribute((alias("xmlLsCountNode__internal_alias"))); -#else -#ifndef xmlLsCountNode -extern __typeof (xmlLsCountNode) xmlLsCountNode__internal_alias __attribute((visibility("hidden"))); -#define xmlLsCountNode xmlLsCountNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_debugXML -#undef xmlLsOneNode -extern __typeof (xmlLsOneNode) xmlLsOneNode __attribute((alias("xmlLsOneNode__internal_alias"))); -#else -#ifndef xmlLsOneNode -extern __typeof (xmlLsOneNode) xmlLsOneNode__internal_alias __attribute((visibility("hidden"))); -#define xmlLsOneNode xmlLsOneNode__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMallocAtomicLoc -extern __typeof (xmlMallocAtomicLoc) xmlMallocAtomicLoc __attribute((alias("xmlMallocAtomicLoc__internal_alias"))); -#else -#ifndef xmlMallocAtomicLoc -extern __typeof (xmlMallocAtomicLoc) xmlMallocAtomicLoc__internal_alias __attribute((visibility("hidden"))); -#define xmlMallocAtomicLoc xmlMallocAtomicLoc__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMallocLoc -extern __typeof (xmlMallocLoc) xmlMallocLoc __attribute((alias("xmlMallocLoc__internal_alias"))); -#else -#ifndef xmlMallocLoc -extern __typeof (xmlMallocLoc) xmlMallocLoc__internal_alias __attribute((visibility("hidden"))); -#define xmlMallocLoc xmlMallocLoc__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemBlocks -extern __typeof (xmlMemBlocks) xmlMemBlocks __attribute((alias("xmlMemBlocks__internal_alias"))); -#else -#ifndef xmlMemBlocks -extern __typeof (xmlMemBlocks) xmlMemBlocks__internal_alias __attribute((visibility("hidden"))); -#define xmlMemBlocks xmlMemBlocks__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemDisplay -extern __typeof (xmlMemDisplay) xmlMemDisplay __attribute((alias("xmlMemDisplay__internal_alias"))); -#else -#ifndef xmlMemDisplay -extern __typeof (xmlMemDisplay) xmlMemDisplay__internal_alias __attribute((visibility("hidden"))); -#define xmlMemDisplay xmlMemDisplay__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemFree -extern __typeof (xmlMemFree) xmlMemFree __attribute((alias("xmlMemFree__internal_alias"))); -#else -#ifndef xmlMemFree -extern __typeof (xmlMemFree) xmlMemFree__internal_alias __attribute((visibility("hidden"))); -#define xmlMemFree xmlMemFree__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemGet -extern __typeof (xmlMemGet) xmlMemGet __attribute((alias("xmlMemGet__internal_alias"))); -#else -#ifndef xmlMemGet -extern __typeof (xmlMemGet) xmlMemGet__internal_alias __attribute((visibility("hidden"))); -#define xmlMemGet xmlMemGet__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemMalloc -extern __typeof (xmlMemMalloc) xmlMemMalloc __attribute((alias("xmlMemMalloc__internal_alias"))); -#else -#ifndef xmlMemMalloc -extern __typeof (xmlMemMalloc) xmlMemMalloc__internal_alias __attribute((visibility("hidden"))); -#define xmlMemMalloc xmlMemMalloc__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemRealloc -extern __typeof (xmlMemRealloc) xmlMemRealloc __attribute((alias("xmlMemRealloc__internal_alias"))); -#else -#ifndef xmlMemRealloc -extern __typeof (xmlMemRealloc) xmlMemRealloc__internal_alias __attribute((visibility("hidden"))); -#define xmlMemRealloc xmlMemRealloc__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemSetup -extern __typeof (xmlMemSetup) xmlMemSetup __attribute((alias("xmlMemSetup__internal_alias"))); -#else -#ifndef xmlMemSetup -extern __typeof (xmlMemSetup) xmlMemSetup__internal_alias __attribute((visibility("hidden"))); -#define xmlMemSetup xmlMemSetup__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemShow -extern __typeof (xmlMemShow) xmlMemShow __attribute((alias("xmlMemShow__internal_alias"))); -#else -#ifndef xmlMemShow -extern __typeof (xmlMemShow) xmlMemShow__internal_alias __attribute((visibility("hidden"))); -#define xmlMemShow xmlMemShow__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemStrdupLoc -extern __typeof (xmlMemStrdupLoc) xmlMemStrdupLoc __attribute((alias("xmlMemStrdupLoc__internal_alias"))); -#else -#ifndef xmlMemStrdupLoc -extern __typeof (xmlMemStrdupLoc) xmlMemStrdupLoc__internal_alias __attribute((visibility("hidden"))); -#define xmlMemStrdupLoc xmlMemStrdupLoc__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemUsed -extern __typeof (xmlMemUsed) xmlMemUsed __attribute((alias("xmlMemUsed__internal_alias"))); -#else -#ifndef xmlMemUsed -extern __typeof (xmlMemUsed) xmlMemUsed__internal_alias __attribute((visibility("hidden"))); -#define xmlMemUsed xmlMemUsed__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemoryDump -extern __typeof (xmlMemoryDump) xmlMemoryDump __attribute((alias("xmlMemoryDump__internal_alias"))); -#else -#ifndef xmlMemoryDump -extern __typeof (xmlMemoryDump) xmlMemoryDump__internal_alias __attribute((visibility("hidden"))); -#define xmlMemoryDump xmlMemoryDump__internal_alias -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlMemoryStrdup -extern __typeof (xmlMemoryStrdup) xmlMemoryStrdup __attribute((alias("xmlMemoryStrdup__internal_alias"))); -#else -#ifndef xmlMemoryStrdup -extern __typeof (xmlMemoryStrdup) xmlMemoryStrdup__internal_alias __attribute((visibility("hidden"))); -#define xmlMemoryStrdup xmlMemoryStrdup__internal_alias -#endif -#endif - -#if defined(LIBXML_MODULES_ENABLED) -#ifdef bottom_xmlmodule -#undef xmlModuleClose -extern __typeof (xmlModuleClose) xmlModuleClose __attribute((alias("xmlModuleClose__internal_alias"))); -#else -#ifndef xmlModuleClose -extern __typeof (xmlModuleClose) xmlModuleClose__internal_alias __attribute((visibility("hidden"))); -#define xmlModuleClose xmlModuleClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_MODULES_ENABLED) -#ifdef bottom_xmlmodule -#undef xmlModuleFree -extern __typeof (xmlModuleFree) xmlModuleFree __attribute((alias("xmlModuleFree__internal_alias"))); -#else -#ifndef xmlModuleFree -extern __typeof (xmlModuleFree) xmlModuleFree__internal_alias __attribute((visibility("hidden"))); -#define xmlModuleFree xmlModuleFree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_MODULES_ENABLED) -#ifdef bottom_xmlmodule -#undef xmlModuleOpen -extern __typeof (xmlModuleOpen) xmlModuleOpen __attribute((alias("xmlModuleOpen__internal_alias"))); -#else -#ifndef xmlModuleOpen -extern __typeof (xmlModuleOpen) xmlModuleOpen__internal_alias __attribute((visibility("hidden"))); -#define xmlModuleOpen xmlModuleOpen__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_MODULES_ENABLED) -#ifdef bottom_xmlmodule -#undef xmlModuleSymbol -extern __typeof (xmlModuleSymbol) xmlModuleSymbol __attribute((alias("xmlModuleSymbol__internal_alias"))); -#else -#ifndef xmlModuleSymbol -extern __typeof (xmlModuleSymbol) xmlModuleSymbol__internal_alias __attribute((visibility("hidden"))); -#define xmlModuleSymbol xmlModuleSymbol__internal_alias -#endif -#endif -#endif - -#ifdef bottom_threads -#undef xmlMutexLock -extern __typeof (xmlMutexLock) xmlMutexLock __attribute((alias("xmlMutexLock__internal_alias"))); -#else -#ifndef xmlMutexLock -extern __typeof (xmlMutexLock) xmlMutexLock__internal_alias __attribute((visibility("hidden"))); -#define xmlMutexLock xmlMutexLock__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlMutexUnlock -extern __typeof (xmlMutexUnlock) xmlMutexUnlock __attribute((alias("xmlMutexUnlock__internal_alias"))); -#else -#ifndef xmlMutexUnlock -extern __typeof (xmlMutexUnlock) xmlMutexUnlock__internal_alias __attribute((visibility("hidden"))); -#define xmlMutexUnlock xmlMutexUnlock__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlNamespaceParseNCName -extern __typeof (xmlNamespaceParseNCName) xmlNamespaceParseNCName __attribute((alias("xmlNamespaceParseNCName__internal_alias"))); -#else -#ifndef xmlNamespaceParseNCName -extern __typeof (xmlNamespaceParseNCName) xmlNamespaceParseNCName__internal_alias __attribute((visibility("hidden"))); -#define xmlNamespaceParseNCName xmlNamespaceParseNCName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlNamespaceParseNSDef -extern __typeof (xmlNamespaceParseNSDef) xmlNamespaceParseNSDef __attribute((alias("xmlNamespaceParseNSDef__internal_alias"))); -#else -#ifndef xmlNamespaceParseNSDef -extern __typeof (xmlNamespaceParseNSDef) xmlNamespaceParseNSDef__internal_alias __attribute((visibility("hidden"))); -#define xmlNamespaceParseNSDef xmlNamespaceParseNSDef__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlNamespaceParseQName -extern __typeof (xmlNamespaceParseQName) xmlNamespaceParseQName __attribute((alias("xmlNamespaceParseQName__internal_alias"))); -#else -#ifndef xmlNamespaceParseQName -extern __typeof (xmlNamespaceParseQName) xmlNamespaceParseQName__internal_alias __attribute((visibility("hidden"))); -#define xmlNamespaceParseQName xmlNamespaceParseQName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPCheckResponse -extern __typeof (xmlNanoFTPCheckResponse) xmlNanoFTPCheckResponse __attribute((alias("xmlNanoFTPCheckResponse__internal_alias"))); -#else -#ifndef xmlNanoFTPCheckResponse -extern __typeof (xmlNanoFTPCheckResponse) xmlNanoFTPCheckResponse__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPCheckResponse xmlNanoFTPCheckResponse__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPCleanup -extern __typeof (xmlNanoFTPCleanup) xmlNanoFTPCleanup __attribute((alias("xmlNanoFTPCleanup__internal_alias"))); -#else -#ifndef xmlNanoFTPCleanup -extern __typeof (xmlNanoFTPCleanup) xmlNanoFTPCleanup__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPCleanup xmlNanoFTPCleanup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPClose -extern __typeof (xmlNanoFTPClose) xmlNanoFTPClose __attribute((alias("xmlNanoFTPClose__internal_alias"))); -#else -#ifndef xmlNanoFTPClose -extern __typeof (xmlNanoFTPClose) xmlNanoFTPClose__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPClose xmlNanoFTPClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPCloseConnection -extern __typeof (xmlNanoFTPCloseConnection) xmlNanoFTPCloseConnection __attribute((alias("xmlNanoFTPCloseConnection__internal_alias"))); -#else -#ifndef xmlNanoFTPCloseConnection -extern __typeof (xmlNanoFTPCloseConnection) xmlNanoFTPCloseConnection__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPCloseConnection xmlNanoFTPCloseConnection__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPConnect -extern __typeof (xmlNanoFTPConnect) xmlNanoFTPConnect __attribute((alias("xmlNanoFTPConnect__internal_alias"))); -#else -#ifndef xmlNanoFTPConnect -extern __typeof (xmlNanoFTPConnect) xmlNanoFTPConnect__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPConnect xmlNanoFTPConnect__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPConnectTo -extern __typeof (xmlNanoFTPConnectTo) xmlNanoFTPConnectTo __attribute((alias("xmlNanoFTPConnectTo__internal_alias"))); -#else -#ifndef xmlNanoFTPConnectTo -extern __typeof (xmlNanoFTPConnectTo) xmlNanoFTPConnectTo__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPConnectTo xmlNanoFTPConnectTo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPCwd -extern __typeof (xmlNanoFTPCwd) xmlNanoFTPCwd __attribute((alias("xmlNanoFTPCwd__internal_alias"))); -#else -#ifndef xmlNanoFTPCwd -extern __typeof (xmlNanoFTPCwd) xmlNanoFTPCwd__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPCwd xmlNanoFTPCwd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPDele -extern __typeof (xmlNanoFTPDele) xmlNanoFTPDele __attribute((alias("xmlNanoFTPDele__internal_alias"))); -#else -#ifndef xmlNanoFTPDele -extern __typeof (xmlNanoFTPDele) xmlNanoFTPDele__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPDele xmlNanoFTPDele__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPFreeCtxt -extern __typeof (xmlNanoFTPFreeCtxt) xmlNanoFTPFreeCtxt __attribute((alias("xmlNanoFTPFreeCtxt__internal_alias"))); -#else -#ifndef xmlNanoFTPFreeCtxt -extern __typeof (xmlNanoFTPFreeCtxt) xmlNanoFTPFreeCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPFreeCtxt xmlNanoFTPFreeCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPGet -extern __typeof (xmlNanoFTPGet) xmlNanoFTPGet __attribute((alias("xmlNanoFTPGet__internal_alias"))); -#else -#ifndef xmlNanoFTPGet -extern __typeof (xmlNanoFTPGet) xmlNanoFTPGet__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPGet xmlNanoFTPGet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPGetConnection -extern __typeof (xmlNanoFTPGetConnection) xmlNanoFTPGetConnection __attribute((alias("xmlNanoFTPGetConnection__internal_alias"))); -#else -#ifndef xmlNanoFTPGetConnection -extern __typeof (xmlNanoFTPGetConnection) xmlNanoFTPGetConnection__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPGetConnection xmlNanoFTPGetConnection__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPGetResponse -extern __typeof (xmlNanoFTPGetResponse) xmlNanoFTPGetResponse __attribute((alias("xmlNanoFTPGetResponse__internal_alias"))); -#else -#ifndef xmlNanoFTPGetResponse -extern __typeof (xmlNanoFTPGetResponse) xmlNanoFTPGetResponse__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPGetResponse xmlNanoFTPGetResponse__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPGetSocket -extern __typeof (xmlNanoFTPGetSocket) xmlNanoFTPGetSocket __attribute((alias("xmlNanoFTPGetSocket__internal_alias"))); -#else -#ifndef xmlNanoFTPGetSocket -extern __typeof (xmlNanoFTPGetSocket) xmlNanoFTPGetSocket__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPGetSocket xmlNanoFTPGetSocket__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPInit -extern __typeof (xmlNanoFTPInit) xmlNanoFTPInit __attribute((alias("xmlNanoFTPInit__internal_alias"))); -#else -#ifndef xmlNanoFTPInit -extern __typeof (xmlNanoFTPInit) xmlNanoFTPInit__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPInit xmlNanoFTPInit__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPList -extern __typeof (xmlNanoFTPList) xmlNanoFTPList __attribute((alias("xmlNanoFTPList__internal_alias"))); -#else -#ifndef xmlNanoFTPList -extern __typeof (xmlNanoFTPList) xmlNanoFTPList__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPList xmlNanoFTPList__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPNewCtxt -extern __typeof (xmlNanoFTPNewCtxt) xmlNanoFTPNewCtxt __attribute((alias("xmlNanoFTPNewCtxt__internal_alias"))); -#else -#ifndef xmlNanoFTPNewCtxt -extern __typeof (xmlNanoFTPNewCtxt) xmlNanoFTPNewCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPNewCtxt xmlNanoFTPNewCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPOpen -extern __typeof (xmlNanoFTPOpen) xmlNanoFTPOpen __attribute((alias("xmlNanoFTPOpen__internal_alias"))); -#else -#ifndef xmlNanoFTPOpen -extern __typeof (xmlNanoFTPOpen) xmlNanoFTPOpen__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPOpen xmlNanoFTPOpen__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPProxy -extern __typeof (xmlNanoFTPProxy) xmlNanoFTPProxy __attribute((alias("xmlNanoFTPProxy__internal_alias"))); -#else -#ifndef xmlNanoFTPProxy -extern __typeof (xmlNanoFTPProxy) xmlNanoFTPProxy__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPProxy xmlNanoFTPProxy__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPQuit -extern __typeof (xmlNanoFTPQuit) xmlNanoFTPQuit __attribute((alias("xmlNanoFTPQuit__internal_alias"))); -#else -#ifndef xmlNanoFTPQuit -extern __typeof (xmlNanoFTPQuit) xmlNanoFTPQuit__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPQuit xmlNanoFTPQuit__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPRead -extern __typeof (xmlNanoFTPRead) xmlNanoFTPRead __attribute((alias("xmlNanoFTPRead__internal_alias"))); -#else -#ifndef xmlNanoFTPRead -extern __typeof (xmlNanoFTPRead) xmlNanoFTPRead__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPRead xmlNanoFTPRead__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPScanProxy -extern __typeof (xmlNanoFTPScanProxy) xmlNanoFTPScanProxy __attribute((alias("xmlNanoFTPScanProxy__internal_alias"))); -#else -#ifndef xmlNanoFTPScanProxy -extern __typeof (xmlNanoFTPScanProxy) xmlNanoFTPScanProxy__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPScanProxy xmlNanoFTPScanProxy__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_FTP_ENABLED) -#ifdef bottom_nanoftp -#undef xmlNanoFTPUpdateURL -extern __typeof (xmlNanoFTPUpdateURL) xmlNanoFTPUpdateURL __attribute((alias("xmlNanoFTPUpdateURL__internal_alias"))); -#else -#ifndef xmlNanoFTPUpdateURL -extern __typeof (xmlNanoFTPUpdateURL) xmlNanoFTPUpdateURL__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoFTPUpdateURL xmlNanoFTPUpdateURL__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPAuthHeader -extern __typeof (xmlNanoHTTPAuthHeader) xmlNanoHTTPAuthHeader __attribute((alias("xmlNanoHTTPAuthHeader__internal_alias"))); -#else -#ifndef xmlNanoHTTPAuthHeader -extern __typeof (xmlNanoHTTPAuthHeader) xmlNanoHTTPAuthHeader__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPAuthHeader xmlNanoHTTPAuthHeader__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPCleanup -extern __typeof (xmlNanoHTTPCleanup) xmlNanoHTTPCleanup __attribute((alias("xmlNanoHTTPCleanup__internal_alias"))); -#else -#ifndef xmlNanoHTTPCleanup -extern __typeof (xmlNanoHTTPCleanup) xmlNanoHTTPCleanup__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPCleanup xmlNanoHTTPCleanup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPClose -extern __typeof (xmlNanoHTTPClose) xmlNanoHTTPClose __attribute((alias("xmlNanoHTTPClose__internal_alias"))); -#else -#ifndef xmlNanoHTTPClose -extern __typeof (xmlNanoHTTPClose) xmlNanoHTTPClose__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPClose xmlNanoHTTPClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPContentLength -extern __typeof (xmlNanoHTTPContentLength) xmlNanoHTTPContentLength __attribute((alias("xmlNanoHTTPContentLength__internal_alias"))); -#else -#ifndef xmlNanoHTTPContentLength -extern __typeof (xmlNanoHTTPContentLength) xmlNanoHTTPContentLength__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPContentLength xmlNanoHTTPContentLength__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPEncoding -extern __typeof (xmlNanoHTTPEncoding) xmlNanoHTTPEncoding __attribute((alias("xmlNanoHTTPEncoding__internal_alias"))); -#else -#ifndef xmlNanoHTTPEncoding -extern __typeof (xmlNanoHTTPEncoding) xmlNanoHTTPEncoding__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPEncoding xmlNanoHTTPEncoding__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPFetch -extern __typeof (xmlNanoHTTPFetch) xmlNanoHTTPFetch __attribute((alias("xmlNanoHTTPFetch__internal_alias"))); -#else -#ifndef xmlNanoHTTPFetch -extern __typeof (xmlNanoHTTPFetch) xmlNanoHTTPFetch__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPFetch xmlNanoHTTPFetch__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPInit -extern __typeof (xmlNanoHTTPInit) xmlNanoHTTPInit __attribute((alias("xmlNanoHTTPInit__internal_alias"))); -#else -#ifndef xmlNanoHTTPInit -extern __typeof (xmlNanoHTTPInit) xmlNanoHTTPInit__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPInit xmlNanoHTTPInit__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPMethod -extern __typeof (xmlNanoHTTPMethod) xmlNanoHTTPMethod __attribute((alias("xmlNanoHTTPMethod__internal_alias"))); -#else -#ifndef xmlNanoHTTPMethod -extern __typeof (xmlNanoHTTPMethod) xmlNanoHTTPMethod__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPMethod xmlNanoHTTPMethod__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPMethodRedir -extern __typeof (xmlNanoHTTPMethodRedir) xmlNanoHTTPMethodRedir __attribute((alias("xmlNanoHTTPMethodRedir__internal_alias"))); -#else -#ifndef xmlNanoHTTPMethodRedir -extern __typeof (xmlNanoHTTPMethodRedir) xmlNanoHTTPMethodRedir__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPMethodRedir xmlNanoHTTPMethodRedir__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPMimeType -extern __typeof (xmlNanoHTTPMimeType) xmlNanoHTTPMimeType __attribute((alias("xmlNanoHTTPMimeType__internal_alias"))); -#else -#ifndef xmlNanoHTTPMimeType -extern __typeof (xmlNanoHTTPMimeType) xmlNanoHTTPMimeType__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPMimeType xmlNanoHTTPMimeType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPOpen -extern __typeof (xmlNanoHTTPOpen) xmlNanoHTTPOpen __attribute((alias("xmlNanoHTTPOpen__internal_alias"))); -#else -#ifndef xmlNanoHTTPOpen -extern __typeof (xmlNanoHTTPOpen) xmlNanoHTTPOpen__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPOpen xmlNanoHTTPOpen__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPOpenRedir -extern __typeof (xmlNanoHTTPOpenRedir) xmlNanoHTTPOpenRedir __attribute((alias("xmlNanoHTTPOpenRedir__internal_alias"))); -#else -#ifndef xmlNanoHTTPOpenRedir -extern __typeof (xmlNanoHTTPOpenRedir) xmlNanoHTTPOpenRedir__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPOpenRedir xmlNanoHTTPOpenRedir__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPRead -extern __typeof (xmlNanoHTTPRead) xmlNanoHTTPRead __attribute((alias("xmlNanoHTTPRead__internal_alias"))); -#else -#ifndef xmlNanoHTTPRead -extern __typeof (xmlNanoHTTPRead) xmlNanoHTTPRead__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPRead xmlNanoHTTPRead__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPRedir -extern __typeof (xmlNanoHTTPRedir) xmlNanoHTTPRedir __attribute((alias("xmlNanoHTTPRedir__internal_alias"))); -#else -#ifndef xmlNanoHTTPRedir -extern __typeof (xmlNanoHTTPRedir) xmlNanoHTTPRedir__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPRedir xmlNanoHTTPRedir__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPReturnCode -extern __typeof (xmlNanoHTTPReturnCode) xmlNanoHTTPReturnCode __attribute((alias("xmlNanoHTTPReturnCode__internal_alias"))); -#else -#ifndef xmlNanoHTTPReturnCode -extern __typeof (xmlNanoHTTPReturnCode) xmlNanoHTTPReturnCode__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPReturnCode xmlNanoHTTPReturnCode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPSave -extern __typeof (xmlNanoHTTPSave) xmlNanoHTTPSave __attribute((alias("xmlNanoHTTPSave__internal_alias"))); -#else -#ifndef xmlNanoHTTPSave -extern __typeof (xmlNanoHTTPSave) xmlNanoHTTPSave__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPSave xmlNanoHTTPSave__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_nanohttp -#undef xmlNanoHTTPScanProxy -extern __typeof (xmlNanoHTTPScanProxy) xmlNanoHTTPScanProxy __attribute((alias("xmlNanoHTTPScanProxy__internal_alias"))); -#else -#ifndef xmlNanoHTTPScanProxy -extern __typeof (xmlNanoHTTPScanProxy) xmlNanoHTTPScanProxy__internal_alias __attribute((visibility("hidden"))); -#define xmlNanoHTTPScanProxy xmlNanoHTTPScanProxy__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlNewAutomata -extern __typeof (xmlNewAutomata) xmlNewAutomata __attribute((alias("xmlNewAutomata__internal_alias"))); -#else -#ifndef xmlNewAutomata -extern __typeof (xmlNewAutomata) xmlNewAutomata__internal_alias __attribute((visibility("hidden"))); -#define xmlNewAutomata xmlNewAutomata__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewCDataBlock -extern __typeof (xmlNewCDataBlock) xmlNewCDataBlock __attribute((alias("xmlNewCDataBlock__internal_alias"))); -#else -#ifndef xmlNewCDataBlock -extern __typeof (xmlNewCDataBlock) xmlNewCDataBlock__internal_alias __attribute((visibility("hidden"))); -#define xmlNewCDataBlock xmlNewCDataBlock__internal_alias -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlNewCatalog -extern __typeof (xmlNewCatalog) xmlNewCatalog __attribute((alias("xmlNewCatalog__internal_alias"))); -#else -#ifndef xmlNewCatalog -extern __typeof (xmlNewCatalog) xmlNewCatalog__internal_alias __attribute((visibility("hidden"))); -#define xmlNewCatalog xmlNewCatalog__internal_alias -#endif -#endif -#endif - -#ifdef bottom_encoding -#undef xmlNewCharEncodingHandler -extern __typeof (xmlNewCharEncodingHandler) xmlNewCharEncodingHandler __attribute((alias("xmlNewCharEncodingHandler__internal_alias"))); -#else -#ifndef xmlNewCharEncodingHandler -extern __typeof (xmlNewCharEncodingHandler) xmlNewCharEncodingHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlNewCharEncodingHandler xmlNewCharEncodingHandler__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewCharRef -extern __typeof (xmlNewCharRef) xmlNewCharRef __attribute((alias("xmlNewCharRef__internal_alias"))); -#else -#ifndef xmlNewCharRef -extern __typeof (xmlNewCharRef) xmlNewCharRef__internal_alias __attribute((visibility("hidden"))); -#define xmlNewCharRef xmlNewCharRef__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlNewChild -extern __typeof (xmlNewChild) xmlNewChild __attribute((alias("xmlNewChild__internal_alias"))); -#else -#ifndef xmlNewChild -extern __typeof (xmlNewChild) xmlNewChild__internal_alias __attribute((visibility("hidden"))); -#define xmlNewChild xmlNewChild__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewComment -extern __typeof (xmlNewComment) xmlNewComment __attribute((alias("xmlNewComment__internal_alias"))); -#else -#ifndef xmlNewComment -extern __typeof (xmlNewComment) xmlNewComment__internal_alias __attribute((visibility("hidden"))); -#define xmlNewComment xmlNewComment__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDoc -extern __typeof (xmlNewDoc) xmlNewDoc __attribute((alias("xmlNewDoc__internal_alias"))); -#else -#ifndef xmlNewDoc -extern __typeof (xmlNewDoc) xmlNewDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDoc xmlNewDoc__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDocComment -extern __typeof (xmlNewDocComment) xmlNewDocComment __attribute((alias("xmlNewDocComment__internal_alias"))); -#else -#ifndef xmlNewDocComment -extern __typeof (xmlNewDocComment) xmlNewDocComment__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocComment xmlNewDocComment__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlNewDocElementContent -extern __typeof (xmlNewDocElementContent) xmlNewDocElementContent __attribute((alias("xmlNewDocElementContent__internal_alias"))); -#else -#ifndef xmlNewDocElementContent -extern __typeof (xmlNewDocElementContent) xmlNewDocElementContent__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocElementContent xmlNewDocElementContent__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlNewDocFragment -extern __typeof (xmlNewDocFragment) xmlNewDocFragment __attribute((alias("xmlNewDocFragment__internal_alias"))); -#else -#ifndef xmlNewDocFragment -extern __typeof (xmlNewDocFragment) xmlNewDocFragment__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocFragment xmlNewDocFragment__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDocNode -extern __typeof (xmlNewDocNode) xmlNewDocNode __attribute((alias("xmlNewDocNode__internal_alias"))); -#else -#ifndef xmlNewDocNode -extern __typeof (xmlNewDocNode) xmlNewDocNode__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocNode xmlNewDocNode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDocNodeEatName -extern __typeof (xmlNewDocNodeEatName) xmlNewDocNodeEatName __attribute((alias("xmlNewDocNodeEatName__internal_alias"))); -#else -#ifndef xmlNewDocNodeEatName -extern __typeof (xmlNewDocNodeEatName) xmlNewDocNodeEatName__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocNodeEatName xmlNewDocNodeEatName__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDocPI -extern __typeof (xmlNewDocPI) xmlNewDocPI __attribute((alias("xmlNewDocPI__internal_alias"))); -#else -#ifndef xmlNewDocPI -extern __typeof (xmlNewDocPI) xmlNewDocPI__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocPI xmlNewDocPI__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDocProp -extern __typeof (xmlNewDocProp) xmlNewDocProp __attribute((alias("xmlNewDocProp__internal_alias"))); -#else -#ifndef xmlNewDocProp -extern __typeof (xmlNewDocProp) xmlNewDocProp__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocProp xmlNewDocProp__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlNewDocRawNode -extern __typeof (xmlNewDocRawNode) xmlNewDocRawNode __attribute((alias("xmlNewDocRawNode__internal_alias"))); -#else -#ifndef xmlNewDocRawNode -extern __typeof (xmlNewDocRawNode) xmlNewDocRawNode__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocRawNode xmlNewDocRawNode__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDocText -extern __typeof (xmlNewDocText) xmlNewDocText __attribute((alias("xmlNewDocText__internal_alias"))); -#else -#ifndef xmlNewDocText -extern __typeof (xmlNewDocText) xmlNewDocText__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocText xmlNewDocText__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDocTextLen -extern __typeof (xmlNewDocTextLen) xmlNewDocTextLen __attribute((alias("xmlNewDocTextLen__internal_alias"))); -#else -#ifndef xmlNewDocTextLen -extern __typeof (xmlNewDocTextLen) xmlNewDocTextLen__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDocTextLen xmlNewDocTextLen__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewDtd -extern __typeof (xmlNewDtd) xmlNewDtd __attribute((alias("xmlNewDtd__internal_alias"))); -#else -#ifndef xmlNewDtd -extern __typeof (xmlNewDtd) xmlNewDtd__internal_alias __attribute((visibility("hidden"))); -#define xmlNewDtd xmlNewDtd__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlNewElementContent -extern __typeof (xmlNewElementContent) xmlNewElementContent __attribute((alias("xmlNewElementContent__internal_alias"))); -#else -#ifndef xmlNewElementContent -extern __typeof (xmlNewElementContent) xmlNewElementContent__internal_alias __attribute((visibility("hidden"))); -#define xmlNewElementContent xmlNewElementContent__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlNewEntityInputStream -extern __typeof (xmlNewEntityInputStream) xmlNewEntityInputStream __attribute((alias("xmlNewEntityInputStream__internal_alias"))); -#else -#ifndef xmlNewEntityInputStream -extern __typeof (xmlNewEntityInputStream) xmlNewEntityInputStream__internal_alias __attribute((visibility("hidden"))); -#define xmlNewEntityInputStream xmlNewEntityInputStream__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlNewGlobalNs -extern __typeof (xmlNewGlobalNs) xmlNewGlobalNs __attribute((alias("xmlNewGlobalNs__internal_alias"))); -#else -#ifndef xmlNewGlobalNs -extern __typeof (xmlNewGlobalNs) xmlNewGlobalNs__internal_alias __attribute((visibility("hidden"))); -#define xmlNewGlobalNs xmlNewGlobalNs__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlNewIOInputStream -extern __typeof (xmlNewIOInputStream) xmlNewIOInputStream __attribute((alias("xmlNewIOInputStream__internal_alias"))); -#else -#ifndef xmlNewIOInputStream -extern __typeof (xmlNewIOInputStream) xmlNewIOInputStream__internal_alias __attribute((visibility("hidden"))); -#define xmlNewIOInputStream xmlNewIOInputStream__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlNewInputFromFile -extern __typeof (xmlNewInputFromFile) xmlNewInputFromFile __attribute((alias("xmlNewInputFromFile__internal_alias"))); -#else -#ifndef xmlNewInputFromFile -extern __typeof (xmlNewInputFromFile) xmlNewInputFromFile__internal_alias __attribute((visibility("hidden"))); -#define xmlNewInputFromFile xmlNewInputFromFile__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlNewInputStream -extern __typeof (xmlNewInputStream) xmlNewInputStream __attribute((alias("xmlNewInputStream__internal_alias"))); -#else -#ifndef xmlNewInputStream -extern __typeof (xmlNewInputStream) xmlNewInputStream__internal_alias __attribute((visibility("hidden"))); -#define xmlNewInputStream xmlNewInputStream__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlNewMutex -extern __typeof (xmlNewMutex) xmlNewMutex __attribute((alias("xmlNewMutex__internal_alias"))); -#else -#ifndef xmlNewMutex -extern __typeof (xmlNewMutex) xmlNewMutex__internal_alias __attribute((visibility("hidden"))); -#define xmlNewMutex xmlNewMutex__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewNode -extern __typeof (xmlNewNode) xmlNewNode __attribute((alias("xmlNewNode__internal_alias"))); -#else -#ifndef xmlNewNode -extern __typeof (xmlNewNode) xmlNewNode__internal_alias __attribute((visibility("hidden"))); -#define xmlNewNode xmlNewNode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewNodeEatName -extern __typeof (xmlNewNodeEatName) xmlNewNodeEatName __attribute((alias("xmlNewNodeEatName__internal_alias"))); -#else -#ifndef xmlNewNodeEatName -extern __typeof (xmlNewNodeEatName) xmlNewNodeEatName__internal_alias __attribute((visibility("hidden"))); -#define xmlNewNodeEatName xmlNewNodeEatName__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewNs -extern __typeof (xmlNewNs) xmlNewNs __attribute((alias("xmlNewNs__internal_alias"))); -#else -#ifndef xmlNewNs -extern __typeof (xmlNewNs) xmlNewNs__internal_alias __attribute((visibility("hidden"))); -#define xmlNewNs xmlNewNs__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewNsProp -extern __typeof (xmlNewNsProp) xmlNewNsProp __attribute((alias("xmlNewNsProp__internal_alias"))); -#else -#ifndef xmlNewNsProp -extern __typeof (xmlNewNsProp) xmlNewNsProp__internal_alias __attribute((visibility("hidden"))); -#define xmlNewNsProp xmlNewNsProp__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewNsPropEatName -extern __typeof (xmlNewNsPropEatName) xmlNewNsPropEatName __attribute((alias("xmlNewNsPropEatName__internal_alias"))); -#else -#ifndef xmlNewNsPropEatName -extern __typeof (xmlNewNsPropEatName) xmlNewNsPropEatName__internal_alias __attribute((visibility("hidden"))); -#define xmlNewNsPropEatName xmlNewNsPropEatName__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewPI -extern __typeof (xmlNewPI) xmlNewPI __attribute((alias("xmlNewPI__internal_alias"))); -#else -#ifndef xmlNewPI -extern __typeof (xmlNewPI) xmlNewPI__internal_alias __attribute((visibility("hidden"))); -#define xmlNewPI xmlNewPI__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlNewParserCtxt -extern __typeof (xmlNewParserCtxt) xmlNewParserCtxt __attribute((alias("xmlNewParserCtxt__internal_alias"))); -#else -#ifndef xmlNewParserCtxt -extern __typeof (xmlNewParserCtxt) xmlNewParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlNewParserCtxt xmlNewParserCtxt__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlNewProp -extern __typeof (xmlNewProp) xmlNewProp __attribute((alias("xmlNewProp__internal_alias"))); -#else -#ifndef xmlNewProp -extern __typeof (xmlNewProp) xmlNewProp__internal_alias __attribute((visibility("hidden"))); -#define xmlNewProp xmlNewProp__internal_alias -#endif -#endif -#endif - -#ifdef bottom_threads -#undef xmlNewRMutex -extern __typeof (xmlNewRMutex) xmlNewRMutex __attribute((alias("xmlNewRMutex__internal_alias"))); -#else -#ifndef xmlNewRMutex -extern __typeof (xmlNewRMutex) xmlNewRMutex__internal_alias __attribute((visibility("hidden"))); -#define xmlNewRMutex xmlNewRMutex__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewReference -extern __typeof (xmlNewReference) xmlNewReference __attribute((alias("xmlNewReference__internal_alias"))); -#else -#ifndef xmlNewReference -extern __typeof (xmlNewReference) xmlNewReference__internal_alias __attribute((visibility("hidden"))); -#define xmlNewReference xmlNewReference__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlNewStringInputStream -extern __typeof (xmlNewStringInputStream) xmlNewStringInputStream __attribute((alias("xmlNewStringInputStream__internal_alias"))); -#else -#ifndef xmlNewStringInputStream -extern __typeof (xmlNewStringInputStream) xmlNewStringInputStream__internal_alias __attribute((visibility("hidden"))); -#define xmlNewStringInputStream xmlNewStringInputStream__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewText -extern __typeof (xmlNewText) xmlNewText __attribute((alias("xmlNewText__internal_alias"))); -#else -#ifndef xmlNewText -extern __typeof (xmlNewText) xmlNewText__internal_alias __attribute((visibility("hidden"))); -#define xmlNewText xmlNewText__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlNewTextChild -extern __typeof (xmlNewTextChild) xmlNewTextChild __attribute((alias("xmlNewTextChild__internal_alias"))); -#else -#ifndef xmlNewTextChild -extern __typeof (xmlNewTextChild) xmlNewTextChild__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextChild xmlNewTextChild__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlNewTextLen -extern __typeof (xmlNewTextLen) xmlNewTextLen __attribute((alias("xmlNewTextLen__internal_alias"))); -#else -#ifndef xmlNewTextLen -extern __typeof (xmlNewTextLen) xmlNewTextLen__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextLen xmlNewTextLen__internal_alias -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlNewTextReader -extern __typeof (xmlNewTextReader) xmlNewTextReader __attribute((alias("xmlNewTextReader__internal_alias"))); -#else -#ifndef xmlNewTextReader -extern __typeof (xmlNewTextReader) xmlNewTextReader__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextReader xmlNewTextReader__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlNewTextReaderFilename -extern __typeof (xmlNewTextReaderFilename) xmlNewTextReaderFilename __attribute((alias("xmlNewTextReaderFilename__internal_alias"))); -#else -#ifndef xmlNewTextReaderFilename -extern __typeof (xmlNewTextReaderFilename) xmlNewTextReaderFilename__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextReaderFilename xmlNewTextReaderFilename__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlNewTextWriter -extern __typeof (xmlNewTextWriter) xmlNewTextWriter __attribute((alias("xmlNewTextWriter__internal_alias"))); -#else -#ifndef xmlNewTextWriter -extern __typeof (xmlNewTextWriter) xmlNewTextWriter__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextWriter xmlNewTextWriter__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlNewTextWriterDoc -extern __typeof (xmlNewTextWriterDoc) xmlNewTextWriterDoc __attribute((alias("xmlNewTextWriterDoc__internal_alias"))); -#else -#ifndef xmlNewTextWriterDoc -extern __typeof (xmlNewTextWriterDoc) xmlNewTextWriterDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextWriterDoc xmlNewTextWriterDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlNewTextWriterFilename -extern __typeof (xmlNewTextWriterFilename) xmlNewTextWriterFilename __attribute((alias("xmlNewTextWriterFilename__internal_alias"))); -#else -#ifndef xmlNewTextWriterFilename -extern __typeof (xmlNewTextWriterFilename) xmlNewTextWriterFilename__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextWriterFilename xmlNewTextWriterFilename__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlNewTextWriterMemory -extern __typeof (xmlNewTextWriterMemory) xmlNewTextWriterMemory __attribute((alias("xmlNewTextWriterMemory__internal_alias"))); -#else -#ifndef xmlNewTextWriterMemory -extern __typeof (xmlNewTextWriterMemory) xmlNewTextWriterMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextWriterMemory xmlNewTextWriterMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlNewTextWriterPushParser -extern __typeof (xmlNewTextWriterPushParser) xmlNewTextWriterPushParser __attribute((alias("xmlNewTextWriterPushParser__internal_alias"))); -#else -#ifndef xmlNewTextWriterPushParser -extern __typeof (xmlNewTextWriterPushParser) xmlNewTextWriterPushParser__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextWriterPushParser xmlNewTextWriterPushParser__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlNewTextWriterTree -extern __typeof (xmlNewTextWriterTree) xmlNewTextWriterTree __attribute((alias("xmlNewTextWriterTree__internal_alias"))); -#else -#ifndef xmlNewTextWriterTree -extern __typeof (xmlNewTextWriterTree) xmlNewTextWriterTree__internal_alias __attribute((visibility("hidden"))); -#define xmlNewTextWriterTree xmlNewTextWriterTree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlNewValidCtxt -extern __typeof (xmlNewValidCtxt) xmlNewValidCtxt __attribute((alias("xmlNewValidCtxt__internal_alias"))); -#else -#ifndef xmlNewValidCtxt -extern __typeof (xmlNewValidCtxt) xmlNewValidCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlNewValidCtxt xmlNewValidCtxt__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlNextChar -extern __typeof (xmlNextChar) xmlNextChar __attribute((alias("xmlNextChar__internal_alias"))); -#else -#ifndef xmlNextChar -extern __typeof (xmlNextChar) xmlNextChar__internal_alias __attribute((visibility("hidden"))); -#define xmlNextChar xmlNextChar__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlNoNetExternalEntityLoader -extern __typeof (xmlNoNetExternalEntityLoader) xmlNoNetExternalEntityLoader __attribute((alias("xmlNoNetExternalEntityLoader__internal_alias"))); -#else -#ifndef xmlNoNetExternalEntityLoader -extern __typeof (xmlNoNetExternalEntityLoader) xmlNoNetExternalEntityLoader__internal_alias __attribute((visibility("hidden"))); -#define xmlNoNetExternalEntityLoader xmlNoNetExternalEntityLoader__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeAddContent -extern __typeof (xmlNodeAddContent) xmlNodeAddContent __attribute((alias("xmlNodeAddContent__internal_alias"))); -#else -#ifndef xmlNodeAddContent -extern __typeof (xmlNodeAddContent) xmlNodeAddContent__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeAddContent xmlNodeAddContent__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeAddContentLen -extern __typeof (xmlNodeAddContentLen) xmlNodeAddContentLen __attribute((alias("xmlNodeAddContentLen__internal_alias"))); -#else -#ifndef xmlNodeAddContentLen -extern __typeof (xmlNodeAddContentLen) xmlNodeAddContentLen__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeAddContentLen xmlNodeAddContentLen__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeBufGetContent -extern __typeof (xmlNodeBufGetContent) xmlNodeBufGetContent __attribute((alias("xmlNodeBufGetContent__internal_alias"))); -#else -#ifndef xmlNodeBufGetContent -extern __typeof (xmlNodeBufGetContent) xmlNodeBufGetContent__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeBufGetContent xmlNodeBufGetContent__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlNodeDump -extern __typeof (xmlNodeDump) xmlNodeDump __attribute((alias("xmlNodeDump__internal_alias"))); -#else -#ifndef xmlNodeDump -extern __typeof (xmlNodeDump) xmlNodeDump__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeDump xmlNodeDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlNodeDumpOutput -extern __typeof (xmlNodeDumpOutput) xmlNodeDumpOutput __attribute((alias("xmlNodeDumpOutput__internal_alias"))); -#else -#ifndef xmlNodeDumpOutput -extern __typeof (xmlNodeDumpOutput) xmlNodeDumpOutput__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeDumpOutput xmlNodeDumpOutput__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeGetBase -extern __typeof (xmlNodeGetBase) xmlNodeGetBase __attribute((alias("xmlNodeGetBase__internal_alias"))); -#else -#ifndef xmlNodeGetBase -extern __typeof (xmlNodeGetBase) xmlNodeGetBase__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeGetBase xmlNodeGetBase__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeGetContent -extern __typeof (xmlNodeGetContent) xmlNodeGetContent __attribute((alias("xmlNodeGetContent__internal_alias"))); -#else -#ifndef xmlNodeGetContent -extern __typeof (xmlNodeGetContent) xmlNodeGetContent__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeGetContent xmlNodeGetContent__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeGetLang -extern __typeof (xmlNodeGetLang) xmlNodeGetLang __attribute((alias("xmlNodeGetLang__internal_alias"))); -#else -#ifndef xmlNodeGetLang -extern __typeof (xmlNodeGetLang) xmlNodeGetLang__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeGetLang xmlNodeGetLang__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeGetSpacePreserve -extern __typeof (xmlNodeGetSpacePreserve) xmlNodeGetSpacePreserve __attribute((alias("xmlNodeGetSpacePreserve__internal_alias"))); -#else -#ifndef xmlNodeGetSpacePreserve -extern __typeof (xmlNodeGetSpacePreserve) xmlNodeGetSpacePreserve__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeGetSpacePreserve xmlNodeGetSpacePreserve__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeIsText -extern __typeof (xmlNodeIsText) xmlNodeIsText __attribute((alias("xmlNodeIsText__internal_alias"))); -#else -#ifndef xmlNodeIsText -extern __typeof (xmlNodeIsText) xmlNodeIsText__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeIsText xmlNodeIsText__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlNodeListGetRawString -extern __typeof (xmlNodeListGetRawString) xmlNodeListGetRawString __attribute((alias("xmlNodeListGetRawString__internal_alias"))); -#else -#ifndef xmlNodeListGetRawString -extern __typeof (xmlNodeListGetRawString) xmlNodeListGetRawString__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeListGetRawString xmlNodeListGetRawString__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeListGetString -extern __typeof (xmlNodeListGetString) xmlNodeListGetString __attribute((alias("xmlNodeListGetString__internal_alias"))); -#else -#ifndef xmlNodeListGetString -extern __typeof (xmlNodeListGetString) xmlNodeListGetString__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeListGetString xmlNodeListGetString__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_tree -#undef xmlNodeSetBase -extern __typeof (xmlNodeSetBase) xmlNodeSetBase __attribute((alias("xmlNodeSetBase__internal_alias"))); -#else -#ifndef xmlNodeSetBase -extern __typeof (xmlNodeSetBase) xmlNodeSetBase__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeSetBase xmlNodeSetBase__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlNodeSetContent -extern __typeof (xmlNodeSetContent) xmlNodeSetContent __attribute((alias("xmlNodeSetContent__internal_alias"))); -#else -#ifndef xmlNodeSetContent -extern __typeof (xmlNodeSetContent) xmlNodeSetContent__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeSetContent xmlNodeSetContent__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlNodeSetContentLen -extern __typeof (xmlNodeSetContentLen) xmlNodeSetContentLen __attribute((alias("xmlNodeSetContentLen__internal_alias"))); -#else -#ifndef xmlNodeSetContentLen -extern __typeof (xmlNodeSetContentLen) xmlNodeSetContentLen__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeSetContentLen xmlNodeSetContentLen__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlNodeSetLang -extern __typeof (xmlNodeSetLang) xmlNodeSetLang __attribute((alias("xmlNodeSetLang__internal_alias"))); -#else -#ifndef xmlNodeSetLang -extern __typeof (xmlNodeSetLang) xmlNodeSetLang__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeSetLang xmlNodeSetLang__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlNodeSetName -extern __typeof (xmlNodeSetName) xmlNodeSetName __attribute((alias("xmlNodeSetName__internal_alias"))); -#else -#ifndef xmlNodeSetName -extern __typeof (xmlNodeSetName) xmlNodeSetName__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeSetName xmlNodeSetName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlNodeSetSpacePreserve -extern __typeof (xmlNodeSetSpacePreserve) xmlNodeSetSpacePreserve __attribute((alias("xmlNodeSetSpacePreserve__internal_alias"))); -#else -#ifndef xmlNodeSetSpacePreserve -extern __typeof (xmlNodeSetSpacePreserve) xmlNodeSetSpacePreserve__internal_alias __attribute((visibility("hidden"))); -#define xmlNodeSetSpacePreserve xmlNodeSetSpacePreserve__internal_alias -#endif -#endif -#endif - -#ifdef bottom_uri -#undef xmlNormalizeURIPath -extern __typeof (xmlNormalizeURIPath) xmlNormalizeURIPath __attribute((alias("xmlNormalizeURIPath__internal_alias"))); -#else -#ifndef xmlNormalizeURIPath -extern __typeof (xmlNormalizeURIPath) xmlNormalizeURIPath__internal_alias __attribute((visibility("hidden"))); -#define xmlNormalizeURIPath xmlNormalizeURIPath__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlNormalizeWindowsPath -extern __typeof (xmlNormalizeWindowsPath) xmlNormalizeWindowsPath __attribute((alias("xmlNormalizeWindowsPath__internal_alias"))); -#else -#ifndef xmlNormalizeWindowsPath -extern __typeof (xmlNormalizeWindowsPath) xmlNormalizeWindowsPath__internal_alias __attribute((visibility("hidden"))); -#define xmlNormalizeWindowsPath xmlNormalizeWindowsPath__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferClose -extern __typeof (xmlOutputBufferClose) xmlOutputBufferClose __attribute((alias("xmlOutputBufferClose__internal_alias"))); -#else -#ifndef xmlOutputBufferClose -extern __typeof (xmlOutputBufferClose) xmlOutputBufferClose__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferClose xmlOutputBufferClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferCreateBuffer -extern __typeof (xmlOutputBufferCreateBuffer) xmlOutputBufferCreateBuffer __attribute((alias("xmlOutputBufferCreateBuffer__internal_alias"))); -#else -#ifndef xmlOutputBufferCreateBuffer -extern __typeof (xmlOutputBufferCreateBuffer) xmlOutputBufferCreateBuffer__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferCreateBuffer xmlOutputBufferCreateBuffer__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferCreateFd -extern __typeof (xmlOutputBufferCreateFd) xmlOutputBufferCreateFd __attribute((alias("xmlOutputBufferCreateFd__internal_alias"))); -#else -#ifndef xmlOutputBufferCreateFd -extern __typeof (xmlOutputBufferCreateFd) xmlOutputBufferCreateFd__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferCreateFd xmlOutputBufferCreateFd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferCreateFile -extern __typeof (xmlOutputBufferCreateFile) xmlOutputBufferCreateFile __attribute((alias("xmlOutputBufferCreateFile__internal_alias"))); -#else -#ifndef xmlOutputBufferCreateFile -extern __typeof (xmlOutputBufferCreateFile) xmlOutputBufferCreateFile__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferCreateFile xmlOutputBufferCreateFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferCreateFilename -extern __typeof (xmlOutputBufferCreateFilename) xmlOutputBufferCreateFilename __attribute((alias("xmlOutputBufferCreateFilename__internal_alias"))); -#else -#ifndef xmlOutputBufferCreateFilename -extern __typeof (xmlOutputBufferCreateFilename) xmlOutputBufferCreateFilename__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferCreateFilename xmlOutputBufferCreateFilename__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlOutputBufferCreateFilenameDefault -extern __typeof (xmlOutputBufferCreateFilenameDefault) xmlOutputBufferCreateFilenameDefault __attribute((alias("xmlOutputBufferCreateFilenameDefault__internal_alias"))); -#else -#ifndef xmlOutputBufferCreateFilenameDefault -extern __typeof (xmlOutputBufferCreateFilenameDefault) xmlOutputBufferCreateFilenameDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferCreateFilenameDefault xmlOutputBufferCreateFilenameDefault__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferCreateIO -extern __typeof (xmlOutputBufferCreateIO) xmlOutputBufferCreateIO __attribute((alias("xmlOutputBufferCreateIO__internal_alias"))); -#else -#ifndef xmlOutputBufferCreateIO -extern __typeof (xmlOutputBufferCreateIO) xmlOutputBufferCreateIO__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferCreateIO xmlOutputBufferCreateIO__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferFlush -extern __typeof (xmlOutputBufferFlush) xmlOutputBufferFlush __attribute((alias("xmlOutputBufferFlush__internal_alias"))); -#else -#ifndef xmlOutputBufferFlush -extern __typeof (xmlOutputBufferFlush) xmlOutputBufferFlush__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferFlush xmlOutputBufferFlush__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferWrite -extern __typeof (xmlOutputBufferWrite) xmlOutputBufferWrite __attribute((alias("xmlOutputBufferWrite__internal_alias"))); -#else -#ifndef xmlOutputBufferWrite -extern __typeof (xmlOutputBufferWrite) xmlOutputBufferWrite__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferWrite xmlOutputBufferWrite__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferWriteEscape -extern __typeof (xmlOutputBufferWriteEscape) xmlOutputBufferWriteEscape __attribute((alias("xmlOutputBufferWriteEscape__internal_alias"))); -#else -#ifndef xmlOutputBufferWriteEscape -extern __typeof (xmlOutputBufferWriteEscape) xmlOutputBufferWriteEscape__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferWriteEscape xmlOutputBufferWriteEscape__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlOutputBufferWriteString -extern __typeof (xmlOutputBufferWriteString) xmlOutputBufferWriteString __attribute((alias("xmlOutputBufferWriteString__internal_alias"))); -#else -#ifndef xmlOutputBufferWriteString -extern __typeof (xmlOutputBufferWriteString) xmlOutputBufferWriteString__internal_alias __attribute((visibility("hidden"))); -#define xmlOutputBufferWriteString xmlOutputBufferWriteString__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseAttValue -extern __typeof (xmlParseAttValue) xmlParseAttValue __attribute((alias("xmlParseAttValue__internal_alias"))); -#else -#ifndef xmlParseAttValue -extern __typeof (xmlParseAttValue) xmlParseAttValue__internal_alias __attribute((visibility("hidden"))); -#define xmlParseAttValue xmlParseAttValue__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseAttribute -extern __typeof (xmlParseAttribute) xmlParseAttribute __attribute((alias("xmlParseAttribute__internal_alias"))); -#else -#ifndef xmlParseAttribute -extern __typeof (xmlParseAttribute) xmlParseAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlParseAttribute xmlParseAttribute__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseAttributeListDecl -extern __typeof (xmlParseAttributeListDecl) xmlParseAttributeListDecl __attribute((alias("xmlParseAttributeListDecl__internal_alias"))); -#else -#ifndef xmlParseAttributeListDecl -extern __typeof (xmlParseAttributeListDecl) xmlParseAttributeListDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseAttributeListDecl xmlParseAttributeListDecl__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseAttributeType -extern __typeof (xmlParseAttributeType) xmlParseAttributeType __attribute((alias("xmlParseAttributeType__internal_alias"))); -#else -#ifndef xmlParseAttributeType -extern __typeof (xmlParseAttributeType) xmlParseAttributeType__internal_alias __attribute((visibility("hidden"))); -#define xmlParseAttributeType xmlParseAttributeType__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseBalancedChunkMemory -extern __typeof (xmlParseBalancedChunkMemory) xmlParseBalancedChunkMemory __attribute((alias("xmlParseBalancedChunkMemory__internal_alias"))); -#else -#ifndef xmlParseBalancedChunkMemory -extern __typeof (xmlParseBalancedChunkMemory) xmlParseBalancedChunkMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlParseBalancedChunkMemory xmlParseBalancedChunkMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseBalancedChunkMemoryRecover -extern __typeof (xmlParseBalancedChunkMemoryRecover) xmlParseBalancedChunkMemoryRecover __attribute((alias("xmlParseBalancedChunkMemoryRecover__internal_alias"))); -#else -#ifndef xmlParseBalancedChunkMemoryRecover -extern __typeof (xmlParseBalancedChunkMemoryRecover) xmlParseBalancedChunkMemoryRecover__internal_alias __attribute((visibility("hidden"))); -#define xmlParseBalancedChunkMemoryRecover xmlParseBalancedChunkMemoryRecover__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseCDSect -extern __typeof (xmlParseCDSect) xmlParseCDSect __attribute((alias("xmlParseCDSect__internal_alias"))); -#else -#ifndef xmlParseCDSect -extern __typeof (xmlParseCDSect) xmlParseCDSect__internal_alias __attribute((visibility("hidden"))); -#define xmlParseCDSect xmlParseCDSect__internal_alias -#endif -#endif - -#if defined(LIBXML_CATALOG_ENABLED) -#ifdef bottom_catalog -#undef xmlParseCatalogFile -extern __typeof (xmlParseCatalogFile) xmlParseCatalogFile __attribute((alias("xmlParseCatalogFile__internal_alias"))); -#else -#ifndef xmlParseCatalogFile -extern __typeof (xmlParseCatalogFile) xmlParseCatalogFile__internal_alias __attribute((visibility("hidden"))); -#define xmlParseCatalogFile xmlParseCatalogFile__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseCharData -extern __typeof (xmlParseCharData) xmlParseCharData __attribute((alias("xmlParseCharData__internal_alias"))); -#else -#ifndef xmlParseCharData -extern __typeof (xmlParseCharData) xmlParseCharData__internal_alias __attribute((visibility("hidden"))); -#define xmlParseCharData xmlParseCharData__internal_alias -#endif -#endif - -#ifdef bottom_encoding -#undef xmlParseCharEncoding -extern __typeof (xmlParseCharEncoding) xmlParseCharEncoding __attribute((alias("xmlParseCharEncoding__internal_alias"))); -#else -#ifndef xmlParseCharEncoding -extern __typeof (xmlParseCharEncoding) xmlParseCharEncoding__internal_alias __attribute((visibility("hidden"))); -#define xmlParseCharEncoding xmlParseCharEncoding__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseCharRef -extern __typeof (xmlParseCharRef) xmlParseCharRef __attribute((alias("xmlParseCharRef__internal_alias"))); -#else -#ifndef xmlParseCharRef -extern __typeof (xmlParseCharRef) xmlParseCharRef__internal_alias __attribute((visibility("hidden"))); -#define xmlParseCharRef xmlParseCharRef__internal_alias -#endif -#endif - -#if defined(LIBXML_PUSH_ENABLED) -#ifdef bottom_parser -#undef xmlParseChunk -extern __typeof (xmlParseChunk) xmlParseChunk __attribute((alias("xmlParseChunk__internal_alias"))); -#else -#ifndef xmlParseChunk -extern __typeof (xmlParseChunk) xmlParseChunk__internal_alias __attribute((visibility("hidden"))); -#define xmlParseChunk xmlParseChunk__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseComment -extern __typeof (xmlParseComment) xmlParseComment __attribute((alias("xmlParseComment__internal_alias"))); -#else -#ifndef xmlParseComment -extern __typeof (xmlParseComment) xmlParseComment__internal_alias __attribute((visibility("hidden"))); -#define xmlParseComment xmlParseComment__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseContent -extern __typeof (xmlParseContent) xmlParseContent __attribute((alias("xmlParseContent__internal_alias"))); -#else -#ifndef xmlParseContent -extern __typeof (xmlParseContent) xmlParseContent__internal_alias __attribute((visibility("hidden"))); -#define xmlParseContent xmlParseContent__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseCtxtExternalEntity -extern __typeof (xmlParseCtxtExternalEntity) xmlParseCtxtExternalEntity __attribute((alias("xmlParseCtxtExternalEntity__internal_alias"))); -#else -#ifndef xmlParseCtxtExternalEntity -extern __typeof (xmlParseCtxtExternalEntity) xmlParseCtxtExternalEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlParseCtxtExternalEntity xmlParseCtxtExternalEntity__internal_alias -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_parser -#undef xmlParseDTD -extern __typeof (xmlParseDTD) xmlParseDTD __attribute((alias("xmlParseDTD__internal_alias"))); -#else -#ifndef xmlParseDTD -extern __typeof (xmlParseDTD) xmlParseDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlParseDTD xmlParseDTD__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseDefaultDecl -extern __typeof (xmlParseDefaultDecl) xmlParseDefaultDecl __attribute((alias("xmlParseDefaultDecl__internal_alias"))); -#else -#ifndef xmlParseDefaultDecl -extern __typeof (xmlParseDefaultDecl) xmlParseDefaultDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseDefaultDecl xmlParseDefaultDecl__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseDoc -extern __typeof (xmlParseDoc) xmlParseDoc __attribute((alias("xmlParseDoc__internal_alias"))); -#else -#ifndef xmlParseDoc -extern __typeof (xmlParseDoc) xmlParseDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlParseDoc xmlParseDoc__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseDocTypeDecl -extern __typeof (xmlParseDocTypeDecl) xmlParseDocTypeDecl __attribute((alias("xmlParseDocTypeDecl__internal_alias"))); -#else -#ifndef xmlParseDocTypeDecl -extern __typeof (xmlParseDocTypeDecl) xmlParseDocTypeDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseDocTypeDecl xmlParseDocTypeDecl__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseDocument -extern __typeof (xmlParseDocument) xmlParseDocument __attribute((alias("xmlParseDocument__internal_alias"))); -#else -#ifndef xmlParseDocument -extern __typeof (xmlParseDocument) xmlParseDocument__internal_alias __attribute((visibility("hidden"))); -#define xmlParseDocument xmlParseDocument__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseElement -extern __typeof (xmlParseElement) xmlParseElement __attribute((alias("xmlParseElement__internal_alias"))); -#else -#ifndef xmlParseElement -extern __typeof (xmlParseElement) xmlParseElement__internal_alias __attribute((visibility("hidden"))); -#define xmlParseElement xmlParseElement__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseElementChildrenContentDecl -extern __typeof (xmlParseElementChildrenContentDecl) xmlParseElementChildrenContentDecl __attribute((alias("xmlParseElementChildrenContentDecl__internal_alias"))); -#else -#ifndef xmlParseElementChildrenContentDecl -extern __typeof (xmlParseElementChildrenContentDecl) xmlParseElementChildrenContentDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseElementChildrenContentDecl xmlParseElementChildrenContentDecl__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseElementContentDecl -extern __typeof (xmlParseElementContentDecl) xmlParseElementContentDecl __attribute((alias("xmlParseElementContentDecl__internal_alias"))); -#else -#ifndef xmlParseElementContentDecl -extern __typeof (xmlParseElementContentDecl) xmlParseElementContentDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseElementContentDecl xmlParseElementContentDecl__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseElementDecl -extern __typeof (xmlParseElementDecl) xmlParseElementDecl __attribute((alias("xmlParseElementDecl__internal_alias"))); -#else -#ifndef xmlParseElementDecl -extern __typeof (xmlParseElementDecl) xmlParseElementDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseElementDecl xmlParseElementDecl__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseElementMixedContentDecl -extern __typeof (xmlParseElementMixedContentDecl) xmlParseElementMixedContentDecl __attribute((alias("xmlParseElementMixedContentDecl__internal_alias"))); -#else -#ifndef xmlParseElementMixedContentDecl -extern __typeof (xmlParseElementMixedContentDecl) xmlParseElementMixedContentDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseElementMixedContentDecl xmlParseElementMixedContentDecl__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseEncName -extern __typeof (xmlParseEncName) xmlParseEncName __attribute((alias("xmlParseEncName__internal_alias"))); -#else -#ifndef xmlParseEncName -extern __typeof (xmlParseEncName) xmlParseEncName__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEncName xmlParseEncName__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseEncodingDecl -extern __typeof (xmlParseEncodingDecl) xmlParseEncodingDecl __attribute((alias("xmlParseEncodingDecl__internal_alias"))); -#else -#ifndef xmlParseEncodingDecl -extern __typeof (xmlParseEncodingDecl) xmlParseEncodingDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEncodingDecl xmlParseEncodingDecl__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseEndTag -extern __typeof (xmlParseEndTag) xmlParseEndTag __attribute((alias("xmlParseEndTag__internal_alias"))); -#else -#ifndef xmlParseEndTag -extern __typeof (xmlParseEndTag) xmlParseEndTag__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEndTag xmlParseEndTag__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseEntity -extern __typeof (xmlParseEntity) xmlParseEntity __attribute((alias("xmlParseEntity__internal_alias"))); -#else -#ifndef xmlParseEntity -extern __typeof (xmlParseEntity) xmlParseEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEntity xmlParseEntity__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseEntityDecl -extern __typeof (xmlParseEntityDecl) xmlParseEntityDecl __attribute((alias("xmlParseEntityDecl__internal_alias"))); -#else -#ifndef xmlParseEntityDecl -extern __typeof (xmlParseEntityDecl) xmlParseEntityDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEntityDecl xmlParseEntityDecl__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseEntityRef -extern __typeof (xmlParseEntityRef) xmlParseEntityRef __attribute((alias("xmlParseEntityRef__internal_alias"))); -#else -#ifndef xmlParseEntityRef -extern __typeof (xmlParseEntityRef) xmlParseEntityRef__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEntityRef xmlParseEntityRef__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseEntityValue -extern __typeof (xmlParseEntityValue) xmlParseEntityValue __attribute((alias("xmlParseEntityValue__internal_alias"))); -#else -#ifndef xmlParseEntityValue -extern __typeof (xmlParseEntityValue) xmlParseEntityValue__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEntityValue xmlParseEntityValue__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseEnumeratedType -extern __typeof (xmlParseEnumeratedType) xmlParseEnumeratedType __attribute((alias("xmlParseEnumeratedType__internal_alias"))); -#else -#ifndef xmlParseEnumeratedType -extern __typeof (xmlParseEnumeratedType) xmlParseEnumeratedType__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEnumeratedType xmlParseEnumeratedType__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseEnumerationType -extern __typeof (xmlParseEnumerationType) xmlParseEnumerationType __attribute((alias("xmlParseEnumerationType__internal_alias"))); -#else -#ifndef xmlParseEnumerationType -extern __typeof (xmlParseEnumerationType) xmlParseEnumerationType__internal_alias __attribute((visibility("hidden"))); -#define xmlParseEnumerationType xmlParseEnumerationType__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseExtParsedEnt -extern __typeof (xmlParseExtParsedEnt) xmlParseExtParsedEnt __attribute((alias("xmlParseExtParsedEnt__internal_alias"))); -#else -#ifndef xmlParseExtParsedEnt -extern __typeof (xmlParseExtParsedEnt) xmlParseExtParsedEnt__internal_alias __attribute((visibility("hidden"))); -#define xmlParseExtParsedEnt xmlParseExtParsedEnt__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseExternalEntity -extern __typeof (xmlParseExternalEntity) xmlParseExternalEntity __attribute((alias("xmlParseExternalEntity__internal_alias"))); -#else -#ifndef xmlParseExternalEntity -extern __typeof (xmlParseExternalEntity) xmlParseExternalEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlParseExternalEntity xmlParseExternalEntity__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseExternalID -extern __typeof (xmlParseExternalID) xmlParseExternalID __attribute((alias("xmlParseExternalID__internal_alias"))); -#else -#ifndef xmlParseExternalID -extern __typeof (xmlParseExternalID) xmlParseExternalID__internal_alias __attribute((visibility("hidden"))); -#define xmlParseExternalID xmlParseExternalID__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseExternalSubset -extern __typeof (xmlParseExternalSubset) xmlParseExternalSubset __attribute((alias("xmlParseExternalSubset__internal_alias"))); -#else -#ifndef xmlParseExternalSubset -extern __typeof (xmlParseExternalSubset) xmlParseExternalSubset__internal_alias __attribute((visibility("hidden"))); -#define xmlParseExternalSubset xmlParseExternalSubset__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseFile -extern __typeof (xmlParseFile) xmlParseFile __attribute((alias("xmlParseFile__internal_alias"))); -#else -#ifndef xmlParseFile -extern __typeof (xmlParseFile) xmlParseFile__internal_alias __attribute((visibility("hidden"))); -#define xmlParseFile xmlParseFile__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseInNodeContext -extern __typeof (xmlParseInNodeContext) xmlParseInNodeContext __attribute((alias("xmlParseInNodeContext__internal_alias"))); -#else -#ifndef xmlParseInNodeContext -extern __typeof (xmlParseInNodeContext) xmlParseInNodeContext__internal_alias __attribute((visibility("hidden"))); -#define xmlParseInNodeContext xmlParseInNodeContext__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseMarkupDecl -extern __typeof (xmlParseMarkupDecl) xmlParseMarkupDecl __attribute((alias("xmlParseMarkupDecl__internal_alias"))); -#else -#ifndef xmlParseMarkupDecl -extern __typeof (xmlParseMarkupDecl) xmlParseMarkupDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseMarkupDecl xmlParseMarkupDecl__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseMemory -extern __typeof (xmlParseMemory) xmlParseMemory __attribute((alias("xmlParseMemory__internal_alias"))); -#else -#ifndef xmlParseMemory -extern __typeof (xmlParseMemory) xmlParseMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlParseMemory xmlParseMemory__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseMisc -extern __typeof (xmlParseMisc) xmlParseMisc __attribute((alias("xmlParseMisc__internal_alias"))); -#else -#ifndef xmlParseMisc -extern __typeof (xmlParseMisc) xmlParseMisc__internal_alias __attribute((visibility("hidden"))); -#define xmlParseMisc xmlParseMisc__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseName -extern __typeof (xmlParseName) xmlParseName __attribute((alias("xmlParseName__internal_alias"))); -#else -#ifndef xmlParseName -extern __typeof (xmlParseName) xmlParseName__internal_alias __attribute((visibility("hidden"))); -#define xmlParseName xmlParseName__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlParseNamespace -extern __typeof (xmlParseNamespace) xmlParseNamespace __attribute((alias("xmlParseNamespace__internal_alias"))); -#else -#ifndef xmlParseNamespace -extern __typeof (xmlParseNamespace) xmlParseNamespace__internal_alias __attribute((visibility("hidden"))); -#define xmlParseNamespace xmlParseNamespace__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseNmtoken -extern __typeof (xmlParseNmtoken) xmlParseNmtoken __attribute((alias("xmlParseNmtoken__internal_alias"))); -#else -#ifndef xmlParseNmtoken -extern __typeof (xmlParseNmtoken) xmlParseNmtoken__internal_alias __attribute((visibility("hidden"))); -#define xmlParseNmtoken xmlParseNmtoken__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseNotationDecl -extern __typeof (xmlParseNotationDecl) xmlParseNotationDecl __attribute((alias("xmlParseNotationDecl__internal_alias"))); -#else -#ifndef xmlParseNotationDecl -extern __typeof (xmlParseNotationDecl) xmlParseNotationDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseNotationDecl xmlParseNotationDecl__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseNotationType -extern __typeof (xmlParseNotationType) xmlParseNotationType __attribute((alias("xmlParseNotationType__internal_alias"))); -#else -#ifndef xmlParseNotationType -extern __typeof (xmlParseNotationType) xmlParseNotationType__internal_alias __attribute((visibility("hidden"))); -#define xmlParseNotationType xmlParseNotationType__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParsePEReference -extern __typeof (xmlParsePEReference) xmlParsePEReference __attribute((alias("xmlParsePEReference__internal_alias"))); -#else -#ifndef xmlParsePEReference -extern __typeof (xmlParsePEReference) xmlParsePEReference__internal_alias __attribute((visibility("hidden"))); -#define xmlParsePEReference xmlParsePEReference__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParsePI -extern __typeof (xmlParsePI) xmlParsePI __attribute((alias("xmlParsePI__internal_alias"))); -#else -#ifndef xmlParsePI -extern __typeof (xmlParsePI) xmlParsePI__internal_alias __attribute((visibility("hidden"))); -#define xmlParsePI xmlParsePI__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParsePITarget -extern __typeof (xmlParsePITarget) xmlParsePITarget __attribute((alias("xmlParsePITarget__internal_alias"))); -#else -#ifndef xmlParsePITarget -extern __typeof (xmlParsePITarget) xmlParsePITarget__internal_alias __attribute((visibility("hidden"))); -#define xmlParsePITarget xmlParsePITarget__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParsePubidLiteral -extern __typeof (xmlParsePubidLiteral) xmlParsePubidLiteral __attribute((alias("xmlParsePubidLiteral__internal_alias"))); -#else -#ifndef xmlParsePubidLiteral -extern __typeof (xmlParsePubidLiteral) xmlParsePubidLiteral__internal_alias __attribute((visibility("hidden"))); -#define xmlParsePubidLiteral xmlParsePubidLiteral__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlParseQuotedString -extern __typeof (xmlParseQuotedString) xmlParseQuotedString __attribute((alias("xmlParseQuotedString__internal_alias"))); -#else -#ifndef xmlParseQuotedString -extern __typeof (xmlParseQuotedString) xmlParseQuotedString__internal_alias __attribute((visibility("hidden"))); -#define xmlParseQuotedString xmlParseQuotedString__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseReference -extern __typeof (xmlParseReference) xmlParseReference __attribute((alias("xmlParseReference__internal_alias"))); -#else -#ifndef xmlParseReference -extern __typeof (xmlParseReference) xmlParseReference__internal_alias __attribute((visibility("hidden"))); -#define xmlParseReference xmlParseReference__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseSDDecl -extern __typeof (xmlParseSDDecl) xmlParseSDDecl __attribute((alias("xmlParseSDDecl__internal_alias"))); -#else -#ifndef xmlParseSDDecl -extern __typeof (xmlParseSDDecl) xmlParseSDDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseSDDecl xmlParseSDDecl__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlParseStartTag -extern __typeof (xmlParseStartTag) xmlParseStartTag __attribute((alias("xmlParseStartTag__internal_alias"))); -#else -#ifndef xmlParseStartTag -extern __typeof (xmlParseStartTag) xmlParseStartTag__internal_alias __attribute((visibility("hidden"))); -#define xmlParseStartTag xmlParseStartTag__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseSystemLiteral -extern __typeof (xmlParseSystemLiteral) xmlParseSystemLiteral __attribute((alias("xmlParseSystemLiteral__internal_alias"))); -#else -#ifndef xmlParseSystemLiteral -extern __typeof (xmlParseSystemLiteral) xmlParseSystemLiteral__internal_alias __attribute((visibility("hidden"))); -#define xmlParseSystemLiteral xmlParseSystemLiteral__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseTextDecl -extern __typeof (xmlParseTextDecl) xmlParseTextDecl __attribute((alias("xmlParseTextDecl__internal_alias"))); -#else -#ifndef xmlParseTextDecl -extern __typeof (xmlParseTextDecl) xmlParseTextDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseTextDecl xmlParseTextDecl__internal_alias -#endif -#endif - -#ifdef bottom_uri -#undef xmlParseURI -extern __typeof (xmlParseURI) xmlParseURI __attribute((alias("xmlParseURI__internal_alias"))); -#else -#ifndef xmlParseURI -extern __typeof (xmlParseURI) xmlParseURI__internal_alias __attribute((visibility("hidden"))); -#define xmlParseURI xmlParseURI__internal_alias -#endif -#endif - -#ifdef bottom_uri -#undef xmlParseURIRaw -extern __typeof (xmlParseURIRaw) xmlParseURIRaw __attribute((alias("xmlParseURIRaw__internal_alias"))); -#else -#ifndef xmlParseURIRaw -extern __typeof (xmlParseURIRaw) xmlParseURIRaw__internal_alias __attribute((visibility("hidden"))); -#define xmlParseURIRaw xmlParseURIRaw__internal_alias -#endif -#endif - -#ifdef bottom_uri -#undef xmlParseURIReference -extern __typeof (xmlParseURIReference) xmlParseURIReference __attribute((alias("xmlParseURIReference__internal_alias"))); -#else -#ifndef xmlParseURIReference -extern __typeof (xmlParseURIReference) xmlParseURIReference__internal_alias __attribute((visibility("hidden"))); -#define xmlParseURIReference xmlParseURIReference__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseVersionInfo -extern __typeof (xmlParseVersionInfo) xmlParseVersionInfo __attribute((alias("xmlParseVersionInfo__internal_alias"))); -#else -#ifndef xmlParseVersionInfo -extern __typeof (xmlParseVersionInfo) xmlParseVersionInfo__internal_alias __attribute((visibility("hidden"))); -#define xmlParseVersionInfo xmlParseVersionInfo__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseVersionNum -extern __typeof (xmlParseVersionNum) xmlParseVersionNum __attribute((alias("xmlParseVersionNum__internal_alias"))); -#else -#ifndef xmlParseVersionNum -extern __typeof (xmlParseVersionNum) xmlParseVersionNum__internal_alias __attribute((visibility("hidden"))); -#define xmlParseVersionNum xmlParseVersionNum__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParseXMLDecl -extern __typeof (xmlParseXMLDecl) xmlParseXMLDecl __attribute((alias("xmlParseXMLDecl__internal_alias"))); -#else -#ifndef xmlParseXMLDecl -extern __typeof (xmlParseXMLDecl) xmlParseXMLDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlParseXMLDecl xmlParseXMLDecl__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlParserAddNodeInfo -extern __typeof (xmlParserAddNodeInfo) xmlParserAddNodeInfo __attribute((alias("xmlParserAddNodeInfo__internal_alias"))); -#else -#ifndef xmlParserAddNodeInfo -extern __typeof (xmlParserAddNodeInfo) xmlParserAddNodeInfo__internal_alias __attribute((visibility("hidden"))); -#define xmlParserAddNodeInfo xmlParserAddNodeInfo__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlParserError -extern __typeof (xmlParserError) xmlParserError __attribute((alias("xmlParserError__internal_alias"))); -#else -#ifndef xmlParserError -extern __typeof (xmlParserError) xmlParserError__internal_alias __attribute((visibility("hidden"))); -#define xmlParserError xmlParserError__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlParserFindNodeInfo -extern __typeof (xmlParserFindNodeInfo) xmlParserFindNodeInfo __attribute((alias("xmlParserFindNodeInfo__internal_alias"))); -#else -#ifndef xmlParserFindNodeInfo -extern __typeof (xmlParserFindNodeInfo) xmlParserFindNodeInfo__internal_alias __attribute((visibility("hidden"))); -#define xmlParserFindNodeInfo xmlParserFindNodeInfo__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlParserFindNodeInfoIndex -extern __typeof (xmlParserFindNodeInfoIndex) xmlParserFindNodeInfoIndex __attribute((alias("xmlParserFindNodeInfoIndex__internal_alias"))); -#else -#ifndef xmlParserFindNodeInfoIndex -extern __typeof (xmlParserFindNodeInfoIndex) xmlParserFindNodeInfoIndex__internal_alias __attribute((visibility("hidden"))); -#define xmlParserFindNodeInfoIndex xmlParserFindNodeInfoIndex__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserGetDirectory -extern __typeof (xmlParserGetDirectory) xmlParserGetDirectory __attribute((alias("xmlParserGetDirectory__internal_alias"))); -#else -#ifndef xmlParserGetDirectory -extern __typeof (xmlParserGetDirectory) xmlParserGetDirectory__internal_alias __attribute((visibility("hidden"))); -#define xmlParserGetDirectory xmlParserGetDirectory__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlParserHandlePEReference -extern __typeof (xmlParserHandlePEReference) xmlParserHandlePEReference __attribute((alias("xmlParserHandlePEReference__internal_alias"))); -#else -#ifndef xmlParserHandlePEReference -extern __typeof (xmlParserHandlePEReference) xmlParserHandlePEReference__internal_alias __attribute((visibility("hidden"))); -#define xmlParserHandlePEReference xmlParserHandlePEReference__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlParserHandleReference -extern __typeof (xmlParserHandleReference) xmlParserHandleReference __attribute((alias("xmlParserHandleReference__internal_alias"))); -#else -#ifndef xmlParserHandleReference -extern __typeof (xmlParserHandleReference) xmlParserHandleReference__internal_alias __attribute((visibility("hidden"))); -#define xmlParserHandleReference xmlParserHandleReference__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferCreateFd -extern __typeof (xmlParserInputBufferCreateFd) xmlParserInputBufferCreateFd __attribute((alias("xmlParserInputBufferCreateFd__internal_alias"))); -#else -#ifndef xmlParserInputBufferCreateFd -extern __typeof (xmlParserInputBufferCreateFd) xmlParserInputBufferCreateFd__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferCreateFd xmlParserInputBufferCreateFd__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferCreateFile -extern __typeof (xmlParserInputBufferCreateFile) xmlParserInputBufferCreateFile __attribute((alias("xmlParserInputBufferCreateFile__internal_alias"))); -#else -#ifndef xmlParserInputBufferCreateFile -extern __typeof (xmlParserInputBufferCreateFile) xmlParserInputBufferCreateFile__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferCreateFile xmlParserInputBufferCreateFile__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferCreateFilename -extern __typeof (xmlParserInputBufferCreateFilename) xmlParserInputBufferCreateFilename __attribute((alias("xmlParserInputBufferCreateFilename__internal_alias"))); -#else -#ifndef xmlParserInputBufferCreateFilename -extern __typeof (xmlParserInputBufferCreateFilename) xmlParserInputBufferCreateFilename__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferCreateFilename xmlParserInputBufferCreateFilename__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferCreateFilenameDefault -extern __typeof (xmlParserInputBufferCreateFilenameDefault) xmlParserInputBufferCreateFilenameDefault __attribute((alias("xmlParserInputBufferCreateFilenameDefault__internal_alias"))); -#else -#ifndef xmlParserInputBufferCreateFilenameDefault -extern __typeof (xmlParserInputBufferCreateFilenameDefault) xmlParserInputBufferCreateFilenameDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferCreateFilenameDefault xmlParserInputBufferCreateFilenameDefault__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferCreateIO -extern __typeof (xmlParserInputBufferCreateIO) xmlParserInputBufferCreateIO __attribute((alias("xmlParserInputBufferCreateIO__internal_alias"))); -#else -#ifndef xmlParserInputBufferCreateIO -extern __typeof (xmlParserInputBufferCreateIO) xmlParserInputBufferCreateIO__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferCreateIO xmlParserInputBufferCreateIO__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferCreateMem -extern __typeof (xmlParserInputBufferCreateMem) xmlParserInputBufferCreateMem __attribute((alias("xmlParserInputBufferCreateMem__internal_alias"))); -#else -#ifndef xmlParserInputBufferCreateMem -extern __typeof (xmlParserInputBufferCreateMem) xmlParserInputBufferCreateMem__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferCreateMem xmlParserInputBufferCreateMem__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferCreateStatic -extern __typeof (xmlParserInputBufferCreateStatic) xmlParserInputBufferCreateStatic __attribute((alias("xmlParserInputBufferCreateStatic__internal_alias"))); -#else -#ifndef xmlParserInputBufferCreateStatic -extern __typeof (xmlParserInputBufferCreateStatic) xmlParserInputBufferCreateStatic__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferCreateStatic xmlParserInputBufferCreateStatic__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferGrow -extern __typeof (xmlParserInputBufferGrow) xmlParserInputBufferGrow __attribute((alias("xmlParserInputBufferGrow__internal_alias"))); -#else -#ifndef xmlParserInputBufferGrow -extern __typeof (xmlParserInputBufferGrow) xmlParserInputBufferGrow__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferGrow xmlParserInputBufferGrow__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferPush -extern __typeof (xmlParserInputBufferPush) xmlParserInputBufferPush __attribute((alias("xmlParserInputBufferPush__internal_alias"))); -#else -#ifndef xmlParserInputBufferPush -extern __typeof (xmlParserInputBufferPush) xmlParserInputBufferPush__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferPush xmlParserInputBufferPush__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlParserInputBufferRead -extern __typeof (xmlParserInputBufferRead) xmlParserInputBufferRead __attribute((alias("xmlParserInputBufferRead__internal_alias"))); -#else -#ifndef xmlParserInputBufferRead -extern __typeof (xmlParserInputBufferRead) xmlParserInputBufferRead__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputBufferRead xmlParserInputBufferRead__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlParserInputGrow -extern __typeof (xmlParserInputGrow) xmlParserInputGrow __attribute((alias("xmlParserInputGrow__internal_alias"))); -#else -#ifndef xmlParserInputGrow -extern __typeof (xmlParserInputGrow) xmlParserInputGrow__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputGrow xmlParserInputGrow__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlParserInputRead -extern __typeof (xmlParserInputRead) xmlParserInputRead __attribute((alias("xmlParserInputRead__internal_alias"))); -#else -#ifndef xmlParserInputRead -extern __typeof (xmlParserInputRead) xmlParserInputRead__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputRead xmlParserInputRead__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlParserInputShrink -extern __typeof (xmlParserInputShrink) xmlParserInputShrink __attribute((alias("xmlParserInputShrink__internal_alias"))); -#else -#ifndef xmlParserInputShrink -extern __typeof (xmlParserInputShrink) xmlParserInputShrink__internal_alias __attribute((visibility("hidden"))); -#define xmlParserInputShrink xmlParserInputShrink__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlParserPrintFileContext -extern __typeof (xmlParserPrintFileContext) xmlParserPrintFileContext __attribute((alias("xmlParserPrintFileContext__internal_alias"))); -#else -#ifndef xmlParserPrintFileContext -extern __typeof (xmlParserPrintFileContext) xmlParserPrintFileContext__internal_alias __attribute((visibility("hidden"))); -#define xmlParserPrintFileContext xmlParserPrintFileContext__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlParserPrintFileInfo -extern __typeof (xmlParserPrintFileInfo) xmlParserPrintFileInfo __attribute((alias("xmlParserPrintFileInfo__internal_alias"))); -#else -#ifndef xmlParserPrintFileInfo -extern __typeof (xmlParserPrintFileInfo) xmlParserPrintFileInfo__internal_alias __attribute((visibility("hidden"))); -#define xmlParserPrintFileInfo xmlParserPrintFileInfo__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlParserValidityError -extern __typeof (xmlParserValidityError) xmlParserValidityError __attribute((alias("xmlParserValidityError__internal_alias"))); -#else -#ifndef xmlParserValidityError -extern __typeof (xmlParserValidityError) xmlParserValidityError__internal_alias __attribute((visibility("hidden"))); -#define xmlParserValidityError xmlParserValidityError__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlParserValidityWarning -extern __typeof (xmlParserValidityWarning) xmlParserValidityWarning __attribute((alias("xmlParserValidityWarning__internal_alias"))); -#else -#ifndef xmlParserValidityWarning -extern __typeof (xmlParserValidityWarning) xmlParserValidityWarning__internal_alias __attribute((visibility("hidden"))); -#define xmlParserValidityWarning xmlParserValidityWarning__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlParserWarning -extern __typeof (xmlParserWarning) xmlParserWarning __attribute((alias("xmlParserWarning__internal_alias"))); -#else -#ifndef xmlParserWarning -extern __typeof (xmlParserWarning) xmlParserWarning__internal_alias __attribute((visibility("hidden"))); -#define xmlParserWarning xmlParserWarning__internal_alias -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlPatternFromRoot -extern __typeof (xmlPatternFromRoot) xmlPatternFromRoot __attribute((alias("xmlPatternFromRoot__internal_alias"))); -#else -#ifndef xmlPatternFromRoot -extern __typeof (xmlPatternFromRoot) xmlPatternFromRoot__internal_alias __attribute((visibility("hidden"))); -#define xmlPatternFromRoot xmlPatternFromRoot__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlPatternGetStreamCtxt -extern __typeof (xmlPatternGetStreamCtxt) xmlPatternGetStreamCtxt __attribute((alias("xmlPatternGetStreamCtxt__internal_alias"))); -#else -#ifndef xmlPatternGetStreamCtxt -extern __typeof (xmlPatternGetStreamCtxt) xmlPatternGetStreamCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlPatternGetStreamCtxt xmlPatternGetStreamCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlPatternMatch -extern __typeof (xmlPatternMatch) xmlPatternMatch __attribute((alias("xmlPatternMatch__internal_alias"))); -#else -#ifndef xmlPatternMatch -extern __typeof (xmlPatternMatch) xmlPatternMatch__internal_alias __attribute((visibility("hidden"))); -#define xmlPatternMatch xmlPatternMatch__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlPatternMaxDepth -extern __typeof (xmlPatternMaxDepth) xmlPatternMaxDepth __attribute((alias("xmlPatternMaxDepth__internal_alias"))); -#else -#ifndef xmlPatternMaxDepth -extern __typeof (xmlPatternMaxDepth) xmlPatternMaxDepth__internal_alias __attribute((visibility("hidden"))); -#define xmlPatternMaxDepth xmlPatternMaxDepth__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlPatternMinDepth -extern __typeof (xmlPatternMinDepth) xmlPatternMinDepth __attribute((alias("xmlPatternMinDepth__internal_alias"))); -#else -#ifndef xmlPatternMinDepth -extern __typeof (xmlPatternMinDepth) xmlPatternMinDepth__internal_alias __attribute((visibility("hidden"))); -#define xmlPatternMinDepth xmlPatternMinDepth__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlPatternStreamable -extern __typeof (xmlPatternStreamable) xmlPatternStreamable __attribute((alias("xmlPatternStreamable__internal_alias"))); -#else -#ifndef xmlPatternStreamable -extern __typeof (xmlPatternStreamable) xmlPatternStreamable__internal_alias __attribute((visibility("hidden"))); -#define xmlPatternStreamable xmlPatternStreamable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlPatterncompile -extern __typeof (xmlPatterncompile) xmlPatterncompile __attribute((alias("xmlPatterncompile__internal_alias"))); -#else -#ifndef xmlPatterncompile -extern __typeof (xmlPatterncompile) xmlPatterncompile__internal_alias __attribute((visibility("hidden"))); -#define xmlPatterncompile xmlPatterncompile__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlPedanticParserDefault -extern __typeof (xmlPedanticParserDefault) xmlPedanticParserDefault __attribute((alias("xmlPedanticParserDefault__internal_alias"))); -#else -#ifndef xmlPedanticParserDefault -extern __typeof (xmlPedanticParserDefault) xmlPedanticParserDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlPedanticParserDefault xmlPedanticParserDefault__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlPopInput -extern __typeof (xmlPopInput) xmlPopInput __attribute((alias("xmlPopInput__internal_alias"))); -#else -#ifndef xmlPopInput -extern __typeof (xmlPopInput) xmlPopInput__internal_alias __attribute((visibility("hidden"))); -#define xmlPopInput xmlPopInput__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlPopInputCallbacks -extern __typeof (xmlPopInputCallbacks) xmlPopInputCallbacks __attribute((alias("xmlPopInputCallbacks__internal_alias"))); -#else -#ifndef xmlPopInputCallbacks -extern __typeof (xmlPopInputCallbacks) xmlPopInputCallbacks__internal_alias __attribute((visibility("hidden"))); -#define xmlPopInputCallbacks xmlPopInputCallbacks__internal_alias -#endif -#endif - -#ifdef bottom_uri -#undef xmlPrintURI -extern __typeof (xmlPrintURI) xmlPrintURI __attribute((alias("xmlPrintURI__internal_alias"))); -#else -#ifndef xmlPrintURI -extern __typeof (xmlPrintURI) xmlPrintURI__internal_alias __attribute((visibility("hidden"))); -#define xmlPrintURI xmlPrintURI__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlPushInput -extern __typeof (xmlPushInput) xmlPushInput __attribute((alias("xmlPushInput__internal_alias"))); -#else -#ifndef xmlPushInput -extern __typeof (xmlPushInput) xmlPushInput__internal_alias __attribute((visibility("hidden"))); -#define xmlPushInput xmlPushInput__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlRMutexLock -extern __typeof (xmlRMutexLock) xmlRMutexLock __attribute((alias("xmlRMutexLock__internal_alias"))); -#else -#ifndef xmlRMutexLock -extern __typeof (xmlRMutexLock) xmlRMutexLock__internal_alias __attribute((visibility("hidden"))); -#define xmlRMutexLock xmlRMutexLock__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlRMutexUnlock -extern __typeof (xmlRMutexUnlock) xmlRMutexUnlock __attribute((alias("xmlRMutexUnlock__internal_alias"))); -#else -#ifndef xmlRMutexUnlock -extern __typeof (xmlRMutexUnlock) xmlRMutexUnlock__internal_alias __attribute((visibility("hidden"))); -#define xmlRMutexUnlock xmlRMutexUnlock__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlReadDoc -extern __typeof (xmlReadDoc) xmlReadDoc __attribute((alias("xmlReadDoc__internal_alias"))); -#else -#ifndef xmlReadDoc -extern __typeof (xmlReadDoc) xmlReadDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlReadDoc xmlReadDoc__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlReadFd -extern __typeof (xmlReadFd) xmlReadFd __attribute((alias("xmlReadFd__internal_alias"))); -#else -#ifndef xmlReadFd -extern __typeof (xmlReadFd) xmlReadFd__internal_alias __attribute((visibility("hidden"))); -#define xmlReadFd xmlReadFd__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlReadFile -extern __typeof (xmlReadFile) xmlReadFile __attribute((alias("xmlReadFile__internal_alias"))); -#else -#ifndef xmlReadFile -extern __typeof (xmlReadFile) xmlReadFile__internal_alias __attribute((visibility("hidden"))); -#define xmlReadFile xmlReadFile__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlReadIO -extern __typeof (xmlReadIO) xmlReadIO __attribute((alias("xmlReadIO__internal_alias"))); -#else -#ifndef xmlReadIO -extern __typeof (xmlReadIO) xmlReadIO__internal_alias __attribute((visibility("hidden"))); -#define xmlReadIO xmlReadIO__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlReadMemory -extern __typeof (xmlReadMemory) xmlReadMemory __attribute((alias("xmlReadMemory__internal_alias"))); -#else -#ifndef xmlReadMemory -extern __typeof (xmlReadMemory) xmlReadMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlReadMemory xmlReadMemory__internal_alias -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderForDoc -extern __typeof (xmlReaderForDoc) xmlReaderForDoc __attribute((alias("xmlReaderForDoc__internal_alias"))); -#else -#ifndef xmlReaderForDoc -extern __typeof (xmlReaderForDoc) xmlReaderForDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderForDoc xmlReaderForDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderForFd -extern __typeof (xmlReaderForFd) xmlReaderForFd __attribute((alias("xmlReaderForFd__internal_alias"))); -#else -#ifndef xmlReaderForFd -extern __typeof (xmlReaderForFd) xmlReaderForFd__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderForFd xmlReaderForFd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderForFile -extern __typeof (xmlReaderForFile) xmlReaderForFile __attribute((alias("xmlReaderForFile__internal_alias"))); -#else -#ifndef xmlReaderForFile -extern __typeof (xmlReaderForFile) xmlReaderForFile__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderForFile xmlReaderForFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderForIO -extern __typeof (xmlReaderForIO) xmlReaderForIO __attribute((alias("xmlReaderForIO__internal_alias"))); -#else -#ifndef xmlReaderForIO -extern __typeof (xmlReaderForIO) xmlReaderForIO__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderForIO xmlReaderForIO__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderForMemory -extern __typeof (xmlReaderForMemory) xmlReaderForMemory __attribute((alias("xmlReaderForMemory__internal_alias"))); -#else -#ifndef xmlReaderForMemory -extern __typeof (xmlReaderForMemory) xmlReaderForMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderForMemory xmlReaderForMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderNewDoc -extern __typeof (xmlReaderNewDoc) xmlReaderNewDoc __attribute((alias("xmlReaderNewDoc__internal_alias"))); -#else -#ifndef xmlReaderNewDoc -extern __typeof (xmlReaderNewDoc) xmlReaderNewDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderNewDoc xmlReaderNewDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderNewFd -extern __typeof (xmlReaderNewFd) xmlReaderNewFd __attribute((alias("xmlReaderNewFd__internal_alias"))); -#else -#ifndef xmlReaderNewFd -extern __typeof (xmlReaderNewFd) xmlReaderNewFd__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderNewFd xmlReaderNewFd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderNewFile -extern __typeof (xmlReaderNewFile) xmlReaderNewFile __attribute((alias("xmlReaderNewFile__internal_alias"))); -#else -#ifndef xmlReaderNewFile -extern __typeof (xmlReaderNewFile) xmlReaderNewFile__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderNewFile xmlReaderNewFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderNewIO -extern __typeof (xmlReaderNewIO) xmlReaderNewIO __attribute((alias("xmlReaderNewIO__internal_alias"))); -#else -#ifndef xmlReaderNewIO -extern __typeof (xmlReaderNewIO) xmlReaderNewIO__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderNewIO xmlReaderNewIO__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderNewMemory -extern __typeof (xmlReaderNewMemory) xmlReaderNewMemory __attribute((alias("xmlReaderNewMemory__internal_alias"))); -#else -#ifndef xmlReaderNewMemory -extern __typeof (xmlReaderNewMemory) xmlReaderNewMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderNewMemory xmlReaderNewMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderNewWalker -extern __typeof (xmlReaderNewWalker) xmlReaderNewWalker __attribute((alias("xmlReaderNewWalker__internal_alias"))); -#else -#ifndef xmlReaderNewWalker -extern __typeof (xmlReaderNewWalker) xmlReaderNewWalker__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderNewWalker xmlReaderNewWalker__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlReaderWalker -extern __typeof (xmlReaderWalker) xmlReaderWalker __attribute((alias("xmlReaderWalker__internal_alias"))); -#else -#ifndef xmlReaderWalker -extern __typeof (xmlReaderWalker) xmlReaderWalker__internal_alias __attribute((visibility("hidden"))); -#define xmlReaderWalker xmlReaderWalker__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlmemory -#undef xmlReallocLoc -extern __typeof (xmlReallocLoc) xmlReallocLoc __attribute((alias("xmlReallocLoc__internal_alias"))); -#else -#ifndef xmlReallocLoc -extern __typeof (xmlReallocLoc) xmlReallocLoc__internal_alias __attribute((visibility("hidden"))); -#define xmlReallocLoc xmlReallocLoc__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlReconciliateNs -extern __typeof (xmlReconciliateNs) xmlReconciliateNs __attribute((alias("xmlReconciliateNs__internal_alias"))); -#else -#ifndef xmlReconciliateNs -extern __typeof (xmlReconciliateNs) xmlReconciliateNs__internal_alias __attribute((visibility("hidden"))); -#define xmlReconciliateNs xmlReconciliateNs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlRecoverDoc -extern __typeof (xmlRecoverDoc) xmlRecoverDoc __attribute((alias("xmlRecoverDoc__internal_alias"))); -#else -#ifndef xmlRecoverDoc -extern __typeof (xmlRecoverDoc) xmlRecoverDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlRecoverDoc xmlRecoverDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlRecoverFile -extern __typeof (xmlRecoverFile) xmlRecoverFile __attribute((alias("xmlRecoverFile__internal_alias"))); -#else -#ifndef xmlRecoverFile -extern __typeof (xmlRecoverFile) xmlRecoverFile__internal_alias __attribute((visibility("hidden"))); -#define xmlRecoverFile xmlRecoverFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlRecoverMemory -extern __typeof (xmlRecoverMemory) xmlRecoverMemory __attribute((alias("xmlRecoverMemory__internal_alias"))); -#else -#ifndef xmlRecoverMemory -extern __typeof (xmlRecoverMemory) xmlRecoverMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlRecoverMemory xmlRecoverMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegExecErrInfo -extern __typeof (xmlRegExecErrInfo) xmlRegExecErrInfo __attribute((alias("xmlRegExecErrInfo__internal_alias"))); -#else -#ifndef xmlRegExecErrInfo -extern __typeof (xmlRegExecErrInfo) xmlRegExecErrInfo__internal_alias __attribute((visibility("hidden"))); -#define xmlRegExecErrInfo xmlRegExecErrInfo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegExecNextValues -extern __typeof (xmlRegExecNextValues) xmlRegExecNextValues __attribute((alias("xmlRegExecNextValues__internal_alias"))); -#else -#ifndef xmlRegExecNextValues -extern __typeof (xmlRegExecNextValues) xmlRegExecNextValues__internal_alias __attribute((visibility("hidden"))); -#define xmlRegExecNextValues xmlRegExecNextValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegExecPushString -extern __typeof (xmlRegExecPushString) xmlRegExecPushString __attribute((alias("xmlRegExecPushString__internal_alias"))); -#else -#ifndef xmlRegExecPushString -extern __typeof (xmlRegExecPushString) xmlRegExecPushString__internal_alias __attribute((visibility("hidden"))); -#define xmlRegExecPushString xmlRegExecPushString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegExecPushString2 -extern __typeof (xmlRegExecPushString2) xmlRegExecPushString2 __attribute((alias("xmlRegExecPushString2__internal_alias"))); -#else -#ifndef xmlRegExecPushString2 -extern __typeof (xmlRegExecPushString2) xmlRegExecPushString2__internal_alias __attribute((visibility("hidden"))); -#define xmlRegExecPushString2 xmlRegExecPushString2__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegFreeExecCtxt -extern __typeof (xmlRegFreeExecCtxt) xmlRegFreeExecCtxt __attribute((alias("xmlRegFreeExecCtxt__internal_alias"))); -#else -#ifndef xmlRegFreeExecCtxt -extern __typeof (xmlRegFreeExecCtxt) xmlRegFreeExecCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlRegFreeExecCtxt xmlRegFreeExecCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegFreeRegexp -extern __typeof (xmlRegFreeRegexp) xmlRegFreeRegexp __attribute((alias("xmlRegFreeRegexp__internal_alias"))); -#else -#ifndef xmlRegFreeRegexp -extern __typeof (xmlRegFreeRegexp) xmlRegFreeRegexp__internal_alias __attribute((visibility("hidden"))); -#define xmlRegFreeRegexp xmlRegFreeRegexp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegNewExecCtxt -extern __typeof (xmlRegNewExecCtxt) xmlRegNewExecCtxt __attribute((alias("xmlRegNewExecCtxt__internal_alias"))); -#else -#ifndef xmlRegNewExecCtxt -extern __typeof (xmlRegNewExecCtxt) xmlRegNewExecCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlRegNewExecCtxt xmlRegNewExecCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegexpCompile -extern __typeof (xmlRegexpCompile) xmlRegexpCompile __attribute((alias("xmlRegexpCompile__internal_alias"))); -#else -#ifndef xmlRegexpCompile -extern __typeof (xmlRegexpCompile) xmlRegexpCompile__internal_alias __attribute((visibility("hidden"))); -#define xmlRegexpCompile xmlRegexpCompile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegexpExec -extern __typeof (xmlRegexpExec) xmlRegexpExec __attribute((alias("xmlRegexpExec__internal_alias"))); -#else -#ifndef xmlRegexpExec -extern __typeof (xmlRegexpExec) xmlRegexpExec__internal_alias __attribute((visibility("hidden"))); -#define xmlRegexpExec xmlRegexpExec__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegexpIsDeterminist -extern __typeof (xmlRegexpIsDeterminist) xmlRegexpIsDeterminist __attribute((alias("xmlRegexpIsDeterminist__internal_alias"))); -#else -#ifndef xmlRegexpIsDeterminist -extern __typeof (xmlRegexpIsDeterminist) xmlRegexpIsDeterminist__internal_alias __attribute((visibility("hidden"))); -#define xmlRegexpIsDeterminist xmlRegexpIsDeterminist__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_xmlregexp -#undef xmlRegexpPrint -extern __typeof (xmlRegexpPrint) xmlRegexpPrint __attribute((alias("xmlRegexpPrint__internal_alias"))); -#else -#ifndef xmlRegexpPrint -extern __typeof (xmlRegexpPrint) xmlRegexpPrint__internal_alias __attribute((visibility("hidden"))); -#define xmlRegexpPrint xmlRegexpPrint__internal_alias -#endif -#endif -#endif - -#ifdef bottom_encoding -#undef xmlRegisterCharEncodingHandler -extern __typeof (xmlRegisterCharEncodingHandler) xmlRegisterCharEncodingHandler __attribute((alias("xmlRegisterCharEncodingHandler__internal_alias"))); -#else -#ifndef xmlRegisterCharEncodingHandler -extern __typeof (xmlRegisterCharEncodingHandler) xmlRegisterCharEncodingHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlRegisterCharEncodingHandler xmlRegisterCharEncodingHandler__internal_alias -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlRegisterDefaultInputCallbacks -extern __typeof (xmlRegisterDefaultInputCallbacks) xmlRegisterDefaultInputCallbacks __attribute((alias("xmlRegisterDefaultInputCallbacks__internal_alias"))); -#else -#ifndef xmlRegisterDefaultInputCallbacks -extern __typeof (xmlRegisterDefaultInputCallbacks) xmlRegisterDefaultInputCallbacks__internal_alias __attribute((visibility("hidden"))); -#define xmlRegisterDefaultInputCallbacks xmlRegisterDefaultInputCallbacks__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlRegisterDefaultOutputCallbacks -extern __typeof (xmlRegisterDefaultOutputCallbacks) xmlRegisterDefaultOutputCallbacks __attribute((alias("xmlRegisterDefaultOutputCallbacks__internal_alias"))); -#else -#ifndef xmlRegisterDefaultOutputCallbacks -extern __typeof (xmlRegisterDefaultOutputCallbacks) xmlRegisterDefaultOutputCallbacks__internal_alias __attribute((visibility("hidden"))); -#define xmlRegisterDefaultOutputCallbacks xmlRegisterDefaultOutputCallbacks__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) && defined(LIBXML_HTTP_ENABLED) -#ifdef bottom_xmlIO -#undef xmlRegisterHTTPPostCallbacks -extern __typeof (xmlRegisterHTTPPostCallbacks) xmlRegisterHTTPPostCallbacks __attribute((alias("xmlRegisterHTTPPostCallbacks__internal_alias"))); -#else -#ifndef xmlRegisterHTTPPostCallbacks -extern __typeof (xmlRegisterHTTPPostCallbacks) xmlRegisterHTTPPostCallbacks__internal_alias __attribute((visibility("hidden"))); -#define xmlRegisterHTTPPostCallbacks xmlRegisterHTTPPostCallbacks__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlRegisterInputCallbacks -extern __typeof (xmlRegisterInputCallbacks) xmlRegisterInputCallbacks __attribute((alias("xmlRegisterInputCallbacks__internal_alias"))); -#else -#ifndef xmlRegisterInputCallbacks -extern __typeof (xmlRegisterInputCallbacks) xmlRegisterInputCallbacks__internal_alias __attribute((visibility("hidden"))); -#define xmlRegisterInputCallbacks xmlRegisterInputCallbacks__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlRegisterNodeDefault -extern __typeof (xmlRegisterNodeDefault) xmlRegisterNodeDefault __attribute((alias("xmlRegisterNodeDefault__internal_alias"))); -#else -#ifndef xmlRegisterNodeDefault -extern __typeof (xmlRegisterNodeDefault) xmlRegisterNodeDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlRegisterNodeDefault xmlRegisterNodeDefault__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlIO -#undef xmlRegisterOutputCallbacks -extern __typeof (xmlRegisterOutputCallbacks) xmlRegisterOutputCallbacks __attribute((alias("xmlRegisterOutputCallbacks__internal_alias"))); -#else -#ifndef xmlRegisterOutputCallbacks -extern __typeof (xmlRegisterOutputCallbacks) xmlRegisterOutputCallbacks__internal_alias __attribute((visibility("hidden"))); -#define xmlRegisterOutputCallbacks xmlRegisterOutputCallbacks__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGCleanupTypes -extern __typeof (xmlRelaxNGCleanupTypes) xmlRelaxNGCleanupTypes __attribute((alias("xmlRelaxNGCleanupTypes__internal_alias"))); -#else -#ifndef xmlRelaxNGCleanupTypes -extern __typeof (xmlRelaxNGCleanupTypes) xmlRelaxNGCleanupTypes__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGCleanupTypes xmlRelaxNGCleanupTypes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGDump -extern __typeof (xmlRelaxNGDump) xmlRelaxNGDump __attribute((alias("xmlRelaxNGDump__internal_alias"))); -#else -#ifndef xmlRelaxNGDump -extern __typeof (xmlRelaxNGDump) xmlRelaxNGDump__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGDump xmlRelaxNGDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGDumpTree -extern __typeof (xmlRelaxNGDumpTree) xmlRelaxNGDumpTree __attribute((alias("xmlRelaxNGDumpTree__internal_alias"))); -#else -#ifndef xmlRelaxNGDumpTree -extern __typeof (xmlRelaxNGDumpTree) xmlRelaxNGDumpTree__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGDumpTree xmlRelaxNGDumpTree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGFree -extern __typeof (xmlRelaxNGFree) xmlRelaxNGFree __attribute((alias("xmlRelaxNGFree__internal_alias"))); -#else -#ifndef xmlRelaxNGFree -extern __typeof (xmlRelaxNGFree) xmlRelaxNGFree__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGFree xmlRelaxNGFree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGFreeParserCtxt -extern __typeof (xmlRelaxNGFreeParserCtxt) xmlRelaxNGFreeParserCtxt __attribute((alias("xmlRelaxNGFreeParserCtxt__internal_alias"))); -#else -#ifndef xmlRelaxNGFreeParserCtxt -extern __typeof (xmlRelaxNGFreeParserCtxt) xmlRelaxNGFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGFreeParserCtxt xmlRelaxNGFreeParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGFreeValidCtxt -extern __typeof (xmlRelaxNGFreeValidCtxt) xmlRelaxNGFreeValidCtxt __attribute((alias("xmlRelaxNGFreeValidCtxt__internal_alias"))); -#else -#ifndef xmlRelaxNGFreeValidCtxt -extern __typeof (xmlRelaxNGFreeValidCtxt) xmlRelaxNGFreeValidCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGFreeValidCtxt xmlRelaxNGFreeValidCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGGetParserErrors -extern __typeof (xmlRelaxNGGetParserErrors) xmlRelaxNGGetParserErrors __attribute((alias("xmlRelaxNGGetParserErrors__internal_alias"))); -#else -#ifndef xmlRelaxNGGetParserErrors -extern __typeof (xmlRelaxNGGetParserErrors) xmlRelaxNGGetParserErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGGetParserErrors xmlRelaxNGGetParserErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGGetValidErrors -extern __typeof (xmlRelaxNGGetValidErrors) xmlRelaxNGGetValidErrors __attribute((alias("xmlRelaxNGGetValidErrors__internal_alias"))); -#else -#ifndef xmlRelaxNGGetValidErrors -extern __typeof (xmlRelaxNGGetValidErrors) xmlRelaxNGGetValidErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGGetValidErrors xmlRelaxNGGetValidErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGInitTypes -extern __typeof (xmlRelaxNGInitTypes) xmlRelaxNGInitTypes __attribute((alias("xmlRelaxNGInitTypes__internal_alias"))); -#else -#ifndef xmlRelaxNGInitTypes -extern __typeof (xmlRelaxNGInitTypes) xmlRelaxNGInitTypes__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGInitTypes xmlRelaxNGInitTypes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGNewDocParserCtxt -extern __typeof (xmlRelaxNGNewDocParserCtxt) xmlRelaxNGNewDocParserCtxt __attribute((alias("xmlRelaxNGNewDocParserCtxt__internal_alias"))); -#else -#ifndef xmlRelaxNGNewDocParserCtxt -extern __typeof (xmlRelaxNGNewDocParserCtxt) xmlRelaxNGNewDocParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGNewDocParserCtxt xmlRelaxNGNewDocParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGNewMemParserCtxt -extern __typeof (xmlRelaxNGNewMemParserCtxt) xmlRelaxNGNewMemParserCtxt __attribute((alias("xmlRelaxNGNewMemParserCtxt__internal_alias"))); -#else -#ifndef xmlRelaxNGNewMemParserCtxt -extern __typeof (xmlRelaxNGNewMemParserCtxt) xmlRelaxNGNewMemParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGNewMemParserCtxt xmlRelaxNGNewMemParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGNewParserCtxt -extern __typeof (xmlRelaxNGNewParserCtxt) xmlRelaxNGNewParserCtxt __attribute((alias("xmlRelaxNGNewParserCtxt__internal_alias"))); -#else -#ifndef xmlRelaxNGNewParserCtxt -extern __typeof (xmlRelaxNGNewParserCtxt) xmlRelaxNGNewParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGNewParserCtxt xmlRelaxNGNewParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGNewValidCtxt -extern __typeof (xmlRelaxNGNewValidCtxt) xmlRelaxNGNewValidCtxt __attribute((alias("xmlRelaxNGNewValidCtxt__internal_alias"))); -#else -#ifndef xmlRelaxNGNewValidCtxt -extern __typeof (xmlRelaxNGNewValidCtxt) xmlRelaxNGNewValidCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGNewValidCtxt xmlRelaxNGNewValidCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGParse -extern __typeof (xmlRelaxNGParse) xmlRelaxNGParse __attribute((alias("xmlRelaxNGParse__internal_alias"))); -#else -#ifndef xmlRelaxNGParse -extern __typeof (xmlRelaxNGParse) xmlRelaxNGParse__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGParse xmlRelaxNGParse__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGSetParserErrors -extern __typeof (xmlRelaxNGSetParserErrors) xmlRelaxNGSetParserErrors __attribute((alias("xmlRelaxNGSetParserErrors__internal_alias"))); -#else -#ifndef xmlRelaxNGSetParserErrors -extern __typeof (xmlRelaxNGSetParserErrors) xmlRelaxNGSetParserErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGSetParserErrors xmlRelaxNGSetParserErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGSetParserStructuredErrors -extern __typeof (xmlRelaxNGSetParserStructuredErrors) xmlRelaxNGSetParserStructuredErrors __attribute((alias("xmlRelaxNGSetParserStructuredErrors__internal_alias"))); -#else -#ifndef xmlRelaxNGSetParserStructuredErrors -extern __typeof (xmlRelaxNGSetParserStructuredErrors) xmlRelaxNGSetParserStructuredErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGSetParserStructuredErrors xmlRelaxNGSetParserStructuredErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGSetValidErrors -extern __typeof (xmlRelaxNGSetValidErrors) xmlRelaxNGSetValidErrors __attribute((alias("xmlRelaxNGSetValidErrors__internal_alias"))); -#else -#ifndef xmlRelaxNGSetValidErrors -extern __typeof (xmlRelaxNGSetValidErrors) xmlRelaxNGSetValidErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGSetValidErrors xmlRelaxNGSetValidErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGSetValidStructuredErrors -extern __typeof (xmlRelaxNGSetValidStructuredErrors) xmlRelaxNGSetValidStructuredErrors __attribute((alias("xmlRelaxNGSetValidStructuredErrors__internal_alias"))); -#else -#ifndef xmlRelaxNGSetValidStructuredErrors -extern __typeof (xmlRelaxNGSetValidStructuredErrors) xmlRelaxNGSetValidStructuredErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGSetValidStructuredErrors xmlRelaxNGSetValidStructuredErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGValidateDoc -extern __typeof (xmlRelaxNGValidateDoc) xmlRelaxNGValidateDoc __attribute((alias("xmlRelaxNGValidateDoc__internal_alias"))); -#else -#ifndef xmlRelaxNGValidateDoc -extern __typeof (xmlRelaxNGValidateDoc) xmlRelaxNGValidateDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGValidateDoc xmlRelaxNGValidateDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGValidateFullElement -extern __typeof (xmlRelaxNGValidateFullElement) xmlRelaxNGValidateFullElement __attribute((alias("xmlRelaxNGValidateFullElement__internal_alias"))); -#else -#ifndef xmlRelaxNGValidateFullElement -extern __typeof (xmlRelaxNGValidateFullElement) xmlRelaxNGValidateFullElement__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGValidateFullElement xmlRelaxNGValidateFullElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGValidatePopElement -extern __typeof (xmlRelaxNGValidatePopElement) xmlRelaxNGValidatePopElement __attribute((alias("xmlRelaxNGValidatePopElement__internal_alias"))); -#else -#ifndef xmlRelaxNGValidatePopElement -extern __typeof (xmlRelaxNGValidatePopElement) xmlRelaxNGValidatePopElement__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGValidatePopElement xmlRelaxNGValidatePopElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGValidatePushCData -extern __typeof (xmlRelaxNGValidatePushCData) xmlRelaxNGValidatePushCData __attribute((alias("xmlRelaxNGValidatePushCData__internal_alias"))); -#else -#ifndef xmlRelaxNGValidatePushCData -extern __typeof (xmlRelaxNGValidatePushCData) xmlRelaxNGValidatePushCData__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGValidatePushCData xmlRelaxNGValidatePushCData__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxNGValidatePushElement -extern __typeof (xmlRelaxNGValidatePushElement) xmlRelaxNGValidatePushElement __attribute((alias("xmlRelaxNGValidatePushElement__internal_alias"))); -#else -#ifndef xmlRelaxNGValidatePushElement -extern __typeof (xmlRelaxNGValidatePushElement) xmlRelaxNGValidatePushElement__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxNGValidatePushElement xmlRelaxNGValidatePushElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_relaxng -#undef xmlRelaxParserSetFlag -extern __typeof (xmlRelaxParserSetFlag) xmlRelaxParserSetFlag __attribute((alias("xmlRelaxParserSetFlag__internal_alias"))); -#else -#ifndef xmlRelaxParserSetFlag -extern __typeof (xmlRelaxParserSetFlag) xmlRelaxParserSetFlag__internal_alias __attribute((visibility("hidden"))); -#define xmlRelaxParserSetFlag xmlRelaxParserSetFlag__internal_alias -#endif -#endif -#endif - -#ifdef bottom_valid -#undef xmlRemoveID -extern __typeof (xmlRemoveID) xmlRemoveID __attribute((alias("xmlRemoveID__internal_alias"))); -#else -#ifndef xmlRemoveID -extern __typeof (xmlRemoveID) xmlRemoveID__internal_alias __attribute((visibility("hidden"))); -#define xmlRemoveID xmlRemoveID__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) -#ifdef bottom_tree -#undef xmlRemoveProp -extern __typeof (xmlRemoveProp) xmlRemoveProp __attribute((alias("xmlRemoveProp__internal_alias"))); -#else -#ifndef xmlRemoveProp -extern __typeof (xmlRemoveProp) xmlRemoveProp__internal_alias __attribute((visibility("hidden"))); -#define xmlRemoveProp xmlRemoveProp__internal_alias -#endif -#endif -#endif - -#ifdef bottom_valid -#undef xmlRemoveRef -extern __typeof (xmlRemoveRef) xmlRemoveRef __attribute((alias("xmlRemoveRef__internal_alias"))); -#else -#ifndef xmlRemoveRef -extern __typeof (xmlRemoveRef) xmlRemoveRef__internal_alias __attribute((visibility("hidden"))); -#define xmlRemoveRef xmlRemoveRef__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_tree -#undef xmlReplaceNode -extern __typeof (xmlReplaceNode) xmlReplaceNode __attribute((alias("xmlReplaceNode__internal_alias"))); -#else -#ifndef xmlReplaceNode -extern __typeof (xmlReplaceNode) xmlReplaceNode__internal_alias __attribute((visibility("hidden"))); -#define xmlReplaceNode xmlReplaceNode__internal_alias -#endif -#endif -#endif - -#ifdef bottom_error -#undef xmlResetError -extern __typeof (xmlResetError) xmlResetError __attribute((alias("xmlResetError__internal_alias"))); -#else -#ifndef xmlResetError -extern __typeof (xmlResetError) xmlResetError__internal_alias __attribute((visibility("hidden"))); -#define xmlResetError xmlResetError__internal_alias -#endif -#endif - -#ifdef bottom_error -#undef xmlResetLastError -extern __typeof (xmlResetLastError) xmlResetLastError __attribute((alias("xmlResetLastError__internal_alias"))); -#else -#ifndef xmlResetLastError -extern __typeof (xmlResetLastError) xmlResetLastError__internal_alias __attribute((visibility("hidden"))); -#define xmlResetLastError xmlResetLastError__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2AttributeDecl -extern __typeof (xmlSAX2AttributeDecl) xmlSAX2AttributeDecl __attribute((alias("xmlSAX2AttributeDecl__internal_alias"))); -#else -#ifndef xmlSAX2AttributeDecl -extern __typeof (xmlSAX2AttributeDecl) xmlSAX2AttributeDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2AttributeDecl xmlSAX2AttributeDecl__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2CDataBlock -extern __typeof (xmlSAX2CDataBlock) xmlSAX2CDataBlock __attribute((alias("xmlSAX2CDataBlock__internal_alias"))); -#else -#ifndef xmlSAX2CDataBlock -extern __typeof (xmlSAX2CDataBlock) xmlSAX2CDataBlock__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2CDataBlock xmlSAX2CDataBlock__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2Characters -extern __typeof (xmlSAX2Characters) xmlSAX2Characters __attribute((alias("xmlSAX2Characters__internal_alias"))); -#else -#ifndef xmlSAX2Characters -extern __typeof (xmlSAX2Characters) xmlSAX2Characters__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2Characters xmlSAX2Characters__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2Comment -extern __typeof (xmlSAX2Comment) xmlSAX2Comment __attribute((alias("xmlSAX2Comment__internal_alias"))); -#else -#ifndef xmlSAX2Comment -extern __typeof (xmlSAX2Comment) xmlSAX2Comment__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2Comment xmlSAX2Comment__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2ElementDecl -extern __typeof (xmlSAX2ElementDecl) xmlSAX2ElementDecl __attribute((alias("xmlSAX2ElementDecl__internal_alias"))); -#else -#ifndef xmlSAX2ElementDecl -extern __typeof (xmlSAX2ElementDecl) xmlSAX2ElementDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2ElementDecl xmlSAX2ElementDecl__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2EndDocument -extern __typeof (xmlSAX2EndDocument) xmlSAX2EndDocument __attribute((alias("xmlSAX2EndDocument__internal_alias"))); -#else -#ifndef xmlSAX2EndDocument -extern __typeof (xmlSAX2EndDocument) xmlSAX2EndDocument__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2EndDocument xmlSAX2EndDocument__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) -#ifdef bottom_SAX2 -#undef xmlSAX2EndElement -extern __typeof (xmlSAX2EndElement) xmlSAX2EndElement __attribute((alias("xmlSAX2EndElement__internal_alias"))); -#else -#ifndef xmlSAX2EndElement -extern __typeof (xmlSAX2EndElement) xmlSAX2EndElement__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2EndElement xmlSAX2EndElement__internal_alias -#endif -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2EndElementNs -extern __typeof (xmlSAX2EndElementNs) xmlSAX2EndElementNs __attribute((alias("xmlSAX2EndElementNs__internal_alias"))); -#else -#ifndef xmlSAX2EndElementNs -extern __typeof (xmlSAX2EndElementNs) xmlSAX2EndElementNs__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2EndElementNs xmlSAX2EndElementNs__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2EntityDecl -extern __typeof (xmlSAX2EntityDecl) xmlSAX2EntityDecl __attribute((alias("xmlSAX2EntityDecl__internal_alias"))); -#else -#ifndef xmlSAX2EntityDecl -extern __typeof (xmlSAX2EntityDecl) xmlSAX2EntityDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2EntityDecl xmlSAX2EntityDecl__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2ExternalSubset -extern __typeof (xmlSAX2ExternalSubset) xmlSAX2ExternalSubset __attribute((alias("xmlSAX2ExternalSubset__internal_alias"))); -#else -#ifndef xmlSAX2ExternalSubset -extern __typeof (xmlSAX2ExternalSubset) xmlSAX2ExternalSubset__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2ExternalSubset xmlSAX2ExternalSubset__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2GetColumnNumber -extern __typeof (xmlSAX2GetColumnNumber) xmlSAX2GetColumnNumber __attribute((alias("xmlSAX2GetColumnNumber__internal_alias"))); -#else -#ifndef xmlSAX2GetColumnNumber -extern __typeof (xmlSAX2GetColumnNumber) xmlSAX2GetColumnNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2GetColumnNumber xmlSAX2GetColumnNumber__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2GetEntity -extern __typeof (xmlSAX2GetEntity) xmlSAX2GetEntity __attribute((alias("xmlSAX2GetEntity__internal_alias"))); -#else -#ifndef xmlSAX2GetEntity -extern __typeof (xmlSAX2GetEntity) xmlSAX2GetEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2GetEntity xmlSAX2GetEntity__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2GetLineNumber -extern __typeof (xmlSAX2GetLineNumber) xmlSAX2GetLineNumber __attribute((alias("xmlSAX2GetLineNumber__internal_alias"))); -#else -#ifndef xmlSAX2GetLineNumber -extern __typeof (xmlSAX2GetLineNumber) xmlSAX2GetLineNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2GetLineNumber xmlSAX2GetLineNumber__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2GetParameterEntity -extern __typeof (xmlSAX2GetParameterEntity) xmlSAX2GetParameterEntity __attribute((alias("xmlSAX2GetParameterEntity__internal_alias"))); -#else -#ifndef xmlSAX2GetParameterEntity -extern __typeof (xmlSAX2GetParameterEntity) xmlSAX2GetParameterEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2GetParameterEntity xmlSAX2GetParameterEntity__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2GetPublicId -extern __typeof (xmlSAX2GetPublicId) xmlSAX2GetPublicId __attribute((alias("xmlSAX2GetPublicId__internal_alias"))); -#else -#ifndef xmlSAX2GetPublicId -extern __typeof (xmlSAX2GetPublicId) xmlSAX2GetPublicId__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2GetPublicId xmlSAX2GetPublicId__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2GetSystemId -extern __typeof (xmlSAX2GetSystemId) xmlSAX2GetSystemId __attribute((alias("xmlSAX2GetSystemId__internal_alias"))); -#else -#ifndef xmlSAX2GetSystemId -extern __typeof (xmlSAX2GetSystemId) xmlSAX2GetSystemId__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2GetSystemId xmlSAX2GetSystemId__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2HasExternalSubset -extern __typeof (xmlSAX2HasExternalSubset) xmlSAX2HasExternalSubset __attribute((alias("xmlSAX2HasExternalSubset__internal_alias"))); -#else -#ifndef xmlSAX2HasExternalSubset -extern __typeof (xmlSAX2HasExternalSubset) xmlSAX2HasExternalSubset__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2HasExternalSubset xmlSAX2HasExternalSubset__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2HasInternalSubset -extern __typeof (xmlSAX2HasInternalSubset) xmlSAX2HasInternalSubset __attribute((alias("xmlSAX2HasInternalSubset__internal_alias"))); -#else -#ifndef xmlSAX2HasInternalSubset -extern __typeof (xmlSAX2HasInternalSubset) xmlSAX2HasInternalSubset__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2HasInternalSubset xmlSAX2HasInternalSubset__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2IgnorableWhitespace -extern __typeof (xmlSAX2IgnorableWhitespace) xmlSAX2IgnorableWhitespace __attribute((alias("xmlSAX2IgnorableWhitespace__internal_alias"))); -#else -#ifndef xmlSAX2IgnorableWhitespace -extern __typeof (xmlSAX2IgnorableWhitespace) xmlSAX2IgnorableWhitespace__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2IgnorableWhitespace xmlSAX2IgnorableWhitespace__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2InitDefaultSAXHandler -extern __typeof (xmlSAX2InitDefaultSAXHandler) xmlSAX2InitDefaultSAXHandler __attribute((alias("xmlSAX2InitDefaultSAXHandler__internal_alias"))); -#else -#ifndef xmlSAX2InitDefaultSAXHandler -extern __typeof (xmlSAX2InitDefaultSAXHandler) xmlSAX2InitDefaultSAXHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2InitDefaultSAXHandler xmlSAX2InitDefaultSAXHandler__internal_alias -#endif -#endif - -#if defined(LIBXML_DOCB_ENABLED) -#ifdef bottom_SAX2 -#undef xmlSAX2InitDocbDefaultSAXHandler -extern __typeof (xmlSAX2InitDocbDefaultSAXHandler) xmlSAX2InitDocbDefaultSAXHandler __attribute((alias("xmlSAX2InitDocbDefaultSAXHandler__internal_alias"))); -#else -#ifndef xmlSAX2InitDocbDefaultSAXHandler -extern __typeof (xmlSAX2InitDocbDefaultSAXHandler) xmlSAX2InitDocbDefaultSAXHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2InitDocbDefaultSAXHandler xmlSAX2InitDocbDefaultSAXHandler__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_HTML_ENABLED) -#ifdef bottom_SAX2 -#undef xmlSAX2InitHtmlDefaultSAXHandler -extern __typeof (xmlSAX2InitHtmlDefaultSAXHandler) xmlSAX2InitHtmlDefaultSAXHandler __attribute((alias("xmlSAX2InitHtmlDefaultSAXHandler__internal_alias"))); -#else -#ifndef xmlSAX2InitHtmlDefaultSAXHandler -extern __typeof (xmlSAX2InitHtmlDefaultSAXHandler) xmlSAX2InitHtmlDefaultSAXHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2InitHtmlDefaultSAXHandler xmlSAX2InitHtmlDefaultSAXHandler__internal_alias -#endif -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2InternalSubset -extern __typeof (xmlSAX2InternalSubset) xmlSAX2InternalSubset __attribute((alias("xmlSAX2InternalSubset__internal_alias"))); -#else -#ifndef xmlSAX2InternalSubset -extern __typeof (xmlSAX2InternalSubset) xmlSAX2InternalSubset__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2InternalSubset xmlSAX2InternalSubset__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2IsStandalone -extern __typeof (xmlSAX2IsStandalone) xmlSAX2IsStandalone __attribute((alias("xmlSAX2IsStandalone__internal_alias"))); -#else -#ifndef xmlSAX2IsStandalone -extern __typeof (xmlSAX2IsStandalone) xmlSAX2IsStandalone__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2IsStandalone xmlSAX2IsStandalone__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2NotationDecl -extern __typeof (xmlSAX2NotationDecl) xmlSAX2NotationDecl __attribute((alias("xmlSAX2NotationDecl__internal_alias"))); -#else -#ifndef xmlSAX2NotationDecl -extern __typeof (xmlSAX2NotationDecl) xmlSAX2NotationDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2NotationDecl xmlSAX2NotationDecl__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2ProcessingInstruction -extern __typeof (xmlSAX2ProcessingInstruction) xmlSAX2ProcessingInstruction __attribute((alias("xmlSAX2ProcessingInstruction__internal_alias"))); -#else -#ifndef xmlSAX2ProcessingInstruction -extern __typeof (xmlSAX2ProcessingInstruction) xmlSAX2ProcessingInstruction__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2ProcessingInstruction xmlSAX2ProcessingInstruction__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2Reference -extern __typeof (xmlSAX2Reference) xmlSAX2Reference __attribute((alias("xmlSAX2Reference__internal_alias"))); -#else -#ifndef xmlSAX2Reference -extern __typeof (xmlSAX2Reference) xmlSAX2Reference__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2Reference xmlSAX2Reference__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2ResolveEntity -extern __typeof (xmlSAX2ResolveEntity) xmlSAX2ResolveEntity __attribute((alias("xmlSAX2ResolveEntity__internal_alias"))); -#else -#ifndef xmlSAX2ResolveEntity -extern __typeof (xmlSAX2ResolveEntity) xmlSAX2ResolveEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2ResolveEntity xmlSAX2ResolveEntity__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2SetDocumentLocator -extern __typeof (xmlSAX2SetDocumentLocator) xmlSAX2SetDocumentLocator __attribute((alias("xmlSAX2SetDocumentLocator__internal_alias"))); -#else -#ifndef xmlSAX2SetDocumentLocator -extern __typeof (xmlSAX2SetDocumentLocator) xmlSAX2SetDocumentLocator__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2SetDocumentLocator xmlSAX2SetDocumentLocator__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2StartDocument -extern __typeof (xmlSAX2StartDocument) xmlSAX2StartDocument __attribute((alias("xmlSAX2StartDocument__internal_alias"))); -#else -#ifndef xmlSAX2StartDocument -extern __typeof (xmlSAX2StartDocument) xmlSAX2StartDocument__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2StartDocument xmlSAX2StartDocument__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) -#ifdef bottom_SAX2 -#undef xmlSAX2StartElement -extern __typeof (xmlSAX2StartElement) xmlSAX2StartElement __attribute((alias("xmlSAX2StartElement__internal_alias"))); -#else -#ifndef xmlSAX2StartElement -extern __typeof (xmlSAX2StartElement) xmlSAX2StartElement__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2StartElement xmlSAX2StartElement__internal_alias -#endif -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2StartElementNs -extern __typeof (xmlSAX2StartElementNs) xmlSAX2StartElementNs __attribute((alias("xmlSAX2StartElementNs__internal_alias"))); -#else -#ifndef xmlSAX2StartElementNs -extern __typeof (xmlSAX2StartElementNs) xmlSAX2StartElementNs__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2StartElementNs xmlSAX2StartElementNs__internal_alias -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAX2UnparsedEntityDecl -extern __typeof (xmlSAX2UnparsedEntityDecl) xmlSAX2UnparsedEntityDecl __attribute((alias("xmlSAX2UnparsedEntityDecl__internal_alias"))); -#else -#ifndef xmlSAX2UnparsedEntityDecl -extern __typeof (xmlSAX2UnparsedEntityDecl) xmlSAX2UnparsedEntityDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlSAX2UnparsedEntityDecl xmlSAX2UnparsedEntityDecl__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_SAX2 -#undef xmlSAXDefaultVersion -extern __typeof (xmlSAXDefaultVersion) xmlSAXDefaultVersion __attribute((alias("xmlSAXDefaultVersion__internal_alias"))); -#else -#ifndef xmlSAXDefaultVersion -extern __typeof (xmlSAXDefaultVersion) xmlSAXDefaultVersion__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXDefaultVersion xmlSAXDefaultVersion__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_parser -#undef xmlSAXParseDTD -extern __typeof (xmlSAXParseDTD) xmlSAXParseDTD __attribute((alias("xmlSAXParseDTD__internal_alias"))); -#else -#ifndef xmlSAXParseDTD -extern __typeof (xmlSAXParseDTD) xmlSAXParseDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXParseDTD xmlSAXParseDTD__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSAXParseDoc -extern __typeof (xmlSAXParseDoc) xmlSAXParseDoc __attribute((alias("xmlSAXParseDoc__internal_alias"))); -#else -#ifndef xmlSAXParseDoc -extern __typeof (xmlSAXParseDoc) xmlSAXParseDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXParseDoc xmlSAXParseDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSAXParseEntity -extern __typeof (xmlSAXParseEntity) xmlSAXParseEntity __attribute((alias("xmlSAXParseEntity__internal_alias"))); -#else -#ifndef xmlSAXParseEntity -extern __typeof (xmlSAXParseEntity) xmlSAXParseEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXParseEntity xmlSAXParseEntity__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSAXParseFile -extern __typeof (xmlSAXParseFile) xmlSAXParseFile __attribute((alias("xmlSAXParseFile__internal_alias"))); -#else -#ifndef xmlSAXParseFile -extern __typeof (xmlSAXParseFile) xmlSAXParseFile__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXParseFile xmlSAXParseFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSAXParseFileWithData -extern __typeof (xmlSAXParseFileWithData) xmlSAXParseFileWithData __attribute((alias("xmlSAXParseFileWithData__internal_alias"))); -#else -#ifndef xmlSAXParseFileWithData -extern __typeof (xmlSAXParseFileWithData) xmlSAXParseFileWithData__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXParseFileWithData xmlSAXParseFileWithData__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSAXParseMemory -extern __typeof (xmlSAXParseMemory) xmlSAXParseMemory __attribute((alias("xmlSAXParseMemory__internal_alias"))); -#else -#ifndef xmlSAXParseMemory -extern __typeof (xmlSAXParseMemory) xmlSAXParseMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXParseMemory xmlSAXParseMemory__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSAXParseMemoryWithData -extern __typeof (xmlSAXParseMemoryWithData) xmlSAXParseMemoryWithData __attribute((alias("xmlSAXParseMemoryWithData__internal_alias"))); -#else -#ifndef xmlSAXParseMemoryWithData -extern __typeof (xmlSAXParseMemoryWithData) xmlSAXParseMemoryWithData__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXParseMemoryWithData xmlSAXParseMemoryWithData__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSAXUserParseFile -extern __typeof (xmlSAXUserParseFile) xmlSAXUserParseFile __attribute((alias("xmlSAXUserParseFile__internal_alias"))); -#else -#ifndef xmlSAXUserParseFile -extern __typeof (xmlSAXUserParseFile) xmlSAXUserParseFile__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXUserParseFile xmlSAXUserParseFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSAXUserParseMemory -extern __typeof (xmlSAXUserParseMemory) xmlSAXUserParseMemory __attribute((alias("xmlSAXUserParseMemory__internal_alias"))); -#else -#ifndef xmlSAXUserParseMemory -extern __typeof (xmlSAXUserParseMemory) xmlSAXUserParseMemory__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXUserParseMemory xmlSAXUserParseMemory__internal_alias -#endif -#endif -#endif - -#ifdef bottom_SAX2 -#undef xmlSAXVersion -extern __typeof (xmlSAXVersion) xmlSAXVersion __attribute((alias("xmlSAXVersion__internal_alias"))); -#else -#ifndef xmlSAXVersion -extern __typeof (xmlSAXVersion) xmlSAXVersion__internal_alias __attribute((visibility("hidden"))); -#define xmlSAXVersion xmlSAXVersion__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveClose -extern __typeof (xmlSaveClose) xmlSaveClose __attribute((alias("xmlSaveClose__internal_alias"))); -#else -#ifndef xmlSaveClose -extern __typeof (xmlSaveClose) xmlSaveClose__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveClose xmlSaveClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveDoc -extern __typeof (xmlSaveDoc) xmlSaveDoc __attribute((alias("xmlSaveDoc__internal_alias"))); -#else -#ifndef xmlSaveDoc -extern __typeof (xmlSaveDoc) xmlSaveDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveDoc xmlSaveDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveFile -extern __typeof (xmlSaveFile) xmlSaveFile __attribute((alias("xmlSaveFile__internal_alias"))); -#else -#ifndef xmlSaveFile -extern __typeof (xmlSaveFile) xmlSaveFile__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveFile xmlSaveFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveFileEnc -extern __typeof (xmlSaveFileEnc) xmlSaveFileEnc __attribute((alias("xmlSaveFileEnc__internal_alias"))); -#else -#ifndef xmlSaveFileEnc -extern __typeof (xmlSaveFileEnc) xmlSaveFileEnc__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveFileEnc xmlSaveFileEnc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveFileTo -extern __typeof (xmlSaveFileTo) xmlSaveFileTo __attribute((alias("xmlSaveFileTo__internal_alias"))); -#else -#ifndef xmlSaveFileTo -extern __typeof (xmlSaveFileTo) xmlSaveFileTo__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveFileTo xmlSaveFileTo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveFlush -extern __typeof (xmlSaveFlush) xmlSaveFlush __attribute((alias("xmlSaveFlush__internal_alias"))); -#else -#ifndef xmlSaveFlush -extern __typeof (xmlSaveFlush) xmlSaveFlush__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveFlush xmlSaveFlush__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveFormatFile -extern __typeof (xmlSaveFormatFile) xmlSaveFormatFile __attribute((alias("xmlSaveFormatFile__internal_alias"))); -#else -#ifndef xmlSaveFormatFile -extern __typeof (xmlSaveFormatFile) xmlSaveFormatFile__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveFormatFile xmlSaveFormatFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveFormatFileEnc -extern __typeof (xmlSaveFormatFileEnc) xmlSaveFormatFileEnc __attribute((alias("xmlSaveFormatFileEnc__internal_alias"))); -#else -#ifndef xmlSaveFormatFileEnc -extern __typeof (xmlSaveFormatFileEnc) xmlSaveFormatFileEnc__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveFormatFileEnc xmlSaveFormatFileEnc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveFormatFileTo -extern __typeof (xmlSaveFormatFileTo) xmlSaveFormatFileTo __attribute((alias("xmlSaveFormatFileTo__internal_alias"))); -#else -#ifndef xmlSaveFormatFileTo -extern __typeof (xmlSaveFormatFileTo) xmlSaveFormatFileTo__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveFormatFileTo xmlSaveFormatFileTo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveSetAttrEscape -extern __typeof (xmlSaveSetAttrEscape) xmlSaveSetAttrEscape __attribute((alias("xmlSaveSetAttrEscape__internal_alias"))); -#else -#ifndef xmlSaveSetAttrEscape -extern __typeof (xmlSaveSetAttrEscape) xmlSaveSetAttrEscape__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveSetAttrEscape xmlSaveSetAttrEscape__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveSetEscape -extern __typeof (xmlSaveSetEscape) xmlSaveSetEscape __attribute((alias("xmlSaveSetEscape__internal_alias"))); -#else -#ifndef xmlSaveSetEscape -extern __typeof (xmlSaveSetEscape) xmlSaveSetEscape__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveSetEscape xmlSaveSetEscape__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveToBuffer -extern __typeof (xmlSaveToBuffer) xmlSaveToBuffer __attribute((alias("xmlSaveToBuffer__internal_alias"))); -#else -#ifndef xmlSaveToBuffer -extern __typeof (xmlSaveToBuffer) xmlSaveToBuffer__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveToBuffer xmlSaveToBuffer__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveToFd -extern __typeof (xmlSaveToFd) xmlSaveToFd __attribute((alias("xmlSaveToFd__internal_alias"))); -#else -#ifndef xmlSaveToFd -extern __typeof (xmlSaveToFd) xmlSaveToFd__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveToFd xmlSaveToFd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveToFilename -extern __typeof (xmlSaveToFilename) xmlSaveToFilename __attribute((alias("xmlSaveToFilename__internal_alias"))); -#else -#ifndef xmlSaveToFilename -extern __typeof (xmlSaveToFilename) xmlSaveToFilename__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveToFilename xmlSaveToFilename__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveToIO -extern __typeof (xmlSaveToIO) xmlSaveToIO __attribute((alias("xmlSaveToIO__internal_alias"))); -#else -#ifndef xmlSaveToIO -extern __typeof (xmlSaveToIO) xmlSaveToIO__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveToIO xmlSaveToIO__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlsave -#undef xmlSaveTree -extern __typeof (xmlSaveTree) xmlSaveTree __attribute((alias("xmlSaveTree__internal_alias"))); -#else -#ifndef xmlSaveTree -extern __typeof (xmlSaveTree) xmlSaveTree__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveTree xmlSaveTree__internal_alias -#endif -#endif -#endif - -#ifdef bottom_uri -#undef xmlSaveUri -extern __typeof (xmlSaveUri) xmlSaveUri __attribute((alias("xmlSaveUri__internal_alias"))); -#else -#ifndef xmlSaveUri -extern __typeof (xmlSaveUri) xmlSaveUri__internal_alias __attribute((visibility("hidden"))); -#define xmlSaveUri xmlSaveUri__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlScanName -extern __typeof (xmlScanName) xmlScanName __attribute((alias("xmlScanName__internal_alias"))); -#else -#ifndef xmlScanName -extern __typeof (xmlScanName) xmlScanName__internal_alias __attribute((visibility("hidden"))); -#define xmlScanName xmlScanName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaCheckFacet -extern __typeof (xmlSchemaCheckFacet) xmlSchemaCheckFacet __attribute((alias("xmlSchemaCheckFacet__internal_alias"))); -#else -#ifndef xmlSchemaCheckFacet -extern __typeof (xmlSchemaCheckFacet) xmlSchemaCheckFacet__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaCheckFacet xmlSchemaCheckFacet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaCleanupTypes -extern __typeof (xmlSchemaCleanupTypes) xmlSchemaCleanupTypes __attribute((alias("xmlSchemaCleanupTypes__internal_alias"))); -#else -#ifndef xmlSchemaCleanupTypes -extern __typeof (xmlSchemaCleanupTypes) xmlSchemaCleanupTypes__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaCleanupTypes xmlSchemaCleanupTypes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaCollapseString -extern __typeof (xmlSchemaCollapseString) xmlSchemaCollapseString __attribute((alias("xmlSchemaCollapseString__internal_alias"))); -#else -#ifndef xmlSchemaCollapseString -extern __typeof (xmlSchemaCollapseString) xmlSchemaCollapseString__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaCollapseString xmlSchemaCollapseString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaCompareValues -extern __typeof (xmlSchemaCompareValues) xmlSchemaCompareValues __attribute((alias("xmlSchemaCompareValues__internal_alias"))); -#else -#ifndef xmlSchemaCompareValues -extern __typeof (xmlSchemaCompareValues) xmlSchemaCompareValues__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaCompareValues xmlSchemaCompareValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaCompareValuesWhtsp -extern __typeof (xmlSchemaCompareValuesWhtsp) xmlSchemaCompareValuesWhtsp __attribute((alias("xmlSchemaCompareValuesWhtsp__internal_alias"))); -#else -#ifndef xmlSchemaCompareValuesWhtsp -extern __typeof (xmlSchemaCompareValuesWhtsp) xmlSchemaCompareValuesWhtsp__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaCompareValuesWhtsp xmlSchemaCompareValuesWhtsp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaCopyValue -extern __typeof (xmlSchemaCopyValue) xmlSchemaCopyValue __attribute((alias("xmlSchemaCopyValue__internal_alias"))); -#else -#ifndef xmlSchemaCopyValue -extern __typeof (xmlSchemaCopyValue) xmlSchemaCopyValue__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaCopyValue xmlSchemaCopyValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaDump -extern __typeof (xmlSchemaDump) xmlSchemaDump __attribute((alias("xmlSchemaDump__internal_alias"))); -#else -#ifndef xmlSchemaDump -extern __typeof (xmlSchemaDump) xmlSchemaDump__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaDump xmlSchemaDump__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaFree -extern __typeof (xmlSchemaFree) xmlSchemaFree __attribute((alias("xmlSchemaFree__internal_alias"))); -#else -#ifndef xmlSchemaFree -extern __typeof (xmlSchemaFree) xmlSchemaFree__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaFree xmlSchemaFree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaFreeFacet -extern __typeof (xmlSchemaFreeFacet) xmlSchemaFreeFacet __attribute((alias("xmlSchemaFreeFacet__internal_alias"))); -#else -#ifndef xmlSchemaFreeFacet -extern __typeof (xmlSchemaFreeFacet) xmlSchemaFreeFacet__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaFreeFacet xmlSchemaFreeFacet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaFreeParserCtxt -extern __typeof (xmlSchemaFreeParserCtxt) xmlSchemaFreeParserCtxt __attribute((alias("xmlSchemaFreeParserCtxt__internal_alias"))); -#else -#ifndef xmlSchemaFreeParserCtxt -extern __typeof (xmlSchemaFreeParserCtxt) xmlSchemaFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaFreeParserCtxt xmlSchemaFreeParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaFreeType -extern __typeof (xmlSchemaFreeType) xmlSchemaFreeType __attribute((alias("xmlSchemaFreeType__internal_alias"))); -#else -#ifndef xmlSchemaFreeType -extern __typeof (xmlSchemaFreeType) xmlSchemaFreeType__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaFreeType xmlSchemaFreeType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaFreeValidCtxt -extern __typeof (xmlSchemaFreeValidCtxt) xmlSchemaFreeValidCtxt __attribute((alias("xmlSchemaFreeValidCtxt__internal_alias"))); -#else -#ifndef xmlSchemaFreeValidCtxt -extern __typeof (xmlSchemaFreeValidCtxt) xmlSchemaFreeValidCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaFreeValidCtxt xmlSchemaFreeValidCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaFreeValue -extern __typeof (xmlSchemaFreeValue) xmlSchemaFreeValue __attribute((alias("xmlSchemaFreeValue__internal_alias"))); -#else -#ifndef xmlSchemaFreeValue -extern __typeof (xmlSchemaFreeValue) xmlSchemaFreeValue__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaFreeValue xmlSchemaFreeValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaFreeWildcard -extern __typeof (xmlSchemaFreeWildcard) xmlSchemaFreeWildcard __attribute((alias("xmlSchemaFreeWildcard__internal_alias"))); -#else -#ifndef xmlSchemaFreeWildcard -extern __typeof (xmlSchemaFreeWildcard) xmlSchemaFreeWildcard__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaFreeWildcard xmlSchemaFreeWildcard__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaGetBuiltInListSimpleTypeItemType -extern __typeof (xmlSchemaGetBuiltInListSimpleTypeItemType) xmlSchemaGetBuiltInListSimpleTypeItemType __attribute((alias("xmlSchemaGetBuiltInListSimpleTypeItemType__internal_alias"))); -#else -#ifndef xmlSchemaGetBuiltInListSimpleTypeItemType -extern __typeof (xmlSchemaGetBuiltInListSimpleTypeItemType) xmlSchemaGetBuiltInListSimpleTypeItemType__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetBuiltInListSimpleTypeItemType xmlSchemaGetBuiltInListSimpleTypeItemType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaGetBuiltInType -extern __typeof (xmlSchemaGetBuiltInType) xmlSchemaGetBuiltInType __attribute((alias("xmlSchemaGetBuiltInType__internal_alias"))); -#else -#ifndef xmlSchemaGetBuiltInType -extern __typeof (xmlSchemaGetBuiltInType) xmlSchemaGetBuiltInType__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetBuiltInType xmlSchemaGetBuiltInType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaGetCanonValue -extern __typeof (xmlSchemaGetCanonValue) xmlSchemaGetCanonValue __attribute((alias("xmlSchemaGetCanonValue__internal_alias"))); -#else -#ifndef xmlSchemaGetCanonValue -extern __typeof (xmlSchemaGetCanonValue) xmlSchemaGetCanonValue__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetCanonValue xmlSchemaGetCanonValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaGetCanonValueWhtsp -extern __typeof (xmlSchemaGetCanonValueWhtsp) xmlSchemaGetCanonValueWhtsp __attribute((alias("xmlSchemaGetCanonValueWhtsp__internal_alias"))); -#else -#ifndef xmlSchemaGetCanonValueWhtsp -extern __typeof (xmlSchemaGetCanonValueWhtsp) xmlSchemaGetCanonValueWhtsp__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetCanonValueWhtsp xmlSchemaGetCanonValueWhtsp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaGetFacetValueAsULong -extern __typeof (xmlSchemaGetFacetValueAsULong) xmlSchemaGetFacetValueAsULong __attribute((alias("xmlSchemaGetFacetValueAsULong__internal_alias"))); -#else -#ifndef xmlSchemaGetFacetValueAsULong -extern __typeof (xmlSchemaGetFacetValueAsULong) xmlSchemaGetFacetValueAsULong__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetFacetValueAsULong xmlSchemaGetFacetValueAsULong__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaGetParserErrors -extern __typeof (xmlSchemaGetParserErrors) xmlSchemaGetParserErrors __attribute((alias("xmlSchemaGetParserErrors__internal_alias"))); -#else -#ifndef xmlSchemaGetParserErrors -extern __typeof (xmlSchemaGetParserErrors) xmlSchemaGetParserErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetParserErrors xmlSchemaGetParserErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaGetPredefinedType -extern __typeof (xmlSchemaGetPredefinedType) xmlSchemaGetPredefinedType __attribute((alias("xmlSchemaGetPredefinedType__internal_alias"))); -#else -#ifndef xmlSchemaGetPredefinedType -extern __typeof (xmlSchemaGetPredefinedType) xmlSchemaGetPredefinedType__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetPredefinedType xmlSchemaGetPredefinedType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaGetValType -extern __typeof (xmlSchemaGetValType) xmlSchemaGetValType __attribute((alias("xmlSchemaGetValType__internal_alias"))); -#else -#ifndef xmlSchemaGetValType -extern __typeof (xmlSchemaGetValType) xmlSchemaGetValType__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetValType xmlSchemaGetValType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaGetValidErrors -extern __typeof (xmlSchemaGetValidErrors) xmlSchemaGetValidErrors __attribute((alias("xmlSchemaGetValidErrors__internal_alias"))); -#else -#ifndef xmlSchemaGetValidErrors -extern __typeof (xmlSchemaGetValidErrors) xmlSchemaGetValidErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaGetValidErrors xmlSchemaGetValidErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaInitTypes -extern __typeof (xmlSchemaInitTypes) xmlSchemaInitTypes __attribute((alias("xmlSchemaInitTypes__internal_alias"))); -#else -#ifndef xmlSchemaInitTypes -extern __typeof (xmlSchemaInitTypes) xmlSchemaInitTypes__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaInitTypes xmlSchemaInitTypes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaIsBuiltInTypeFacet -extern __typeof (xmlSchemaIsBuiltInTypeFacet) xmlSchemaIsBuiltInTypeFacet __attribute((alias("xmlSchemaIsBuiltInTypeFacet__internal_alias"))); -#else -#ifndef xmlSchemaIsBuiltInTypeFacet -extern __typeof (xmlSchemaIsBuiltInTypeFacet) xmlSchemaIsBuiltInTypeFacet__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaIsBuiltInTypeFacet xmlSchemaIsBuiltInTypeFacet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaIsValid -extern __typeof (xmlSchemaIsValid) xmlSchemaIsValid __attribute((alias("xmlSchemaIsValid__internal_alias"))); -#else -#ifndef xmlSchemaIsValid -extern __typeof (xmlSchemaIsValid) xmlSchemaIsValid__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaIsValid xmlSchemaIsValid__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaNewDocParserCtxt -extern __typeof (xmlSchemaNewDocParserCtxt) xmlSchemaNewDocParserCtxt __attribute((alias("xmlSchemaNewDocParserCtxt__internal_alias"))); -#else -#ifndef xmlSchemaNewDocParserCtxt -extern __typeof (xmlSchemaNewDocParserCtxt) xmlSchemaNewDocParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaNewDocParserCtxt xmlSchemaNewDocParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaNewFacet -extern __typeof (xmlSchemaNewFacet) xmlSchemaNewFacet __attribute((alias("xmlSchemaNewFacet__internal_alias"))); -#else -#ifndef xmlSchemaNewFacet -extern __typeof (xmlSchemaNewFacet) xmlSchemaNewFacet__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaNewFacet xmlSchemaNewFacet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaNewMemParserCtxt -extern __typeof (xmlSchemaNewMemParserCtxt) xmlSchemaNewMemParserCtxt __attribute((alias("xmlSchemaNewMemParserCtxt__internal_alias"))); -#else -#ifndef xmlSchemaNewMemParserCtxt -extern __typeof (xmlSchemaNewMemParserCtxt) xmlSchemaNewMemParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaNewMemParserCtxt xmlSchemaNewMemParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaNewNOTATIONValue -extern __typeof (xmlSchemaNewNOTATIONValue) xmlSchemaNewNOTATIONValue __attribute((alias("xmlSchemaNewNOTATIONValue__internal_alias"))); -#else -#ifndef xmlSchemaNewNOTATIONValue -extern __typeof (xmlSchemaNewNOTATIONValue) xmlSchemaNewNOTATIONValue__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaNewNOTATIONValue xmlSchemaNewNOTATIONValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaNewParserCtxt -extern __typeof (xmlSchemaNewParserCtxt) xmlSchemaNewParserCtxt __attribute((alias("xmlSchemaNewParserCtxt__internal_alias"))); -#else -#ifndef xmlSchemaNewParserCtxt -extern __typeof (xmlSchemaNewParserCtxt) xmlSchemaNewParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaNewParserCtxt xmlSchemaNewParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaNewQNameValue -extern __typeof (xmlSchemaNewQNameValue) xmlSchemaNewQNameValue __attribute((alias("xmlSchemaNewQNameValue__internal_alias"))); -#else -#ifndef xmlSchemaNewQNameValue -extern __typeof (xmlSchemaNewQNameValue) xmlSchemaNewQNameValue__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaNewQNameValue xmlSchemaNewQNameValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaNewStringValue -extern __typeof (xmlSchemaNewStringValue) xmlSchemaNewStringValue __attribute((alias("xmlSchemaNewStringValue__internal_alias"))); -#else -#ifndef xmlSchemaNewStringValue -extern __typeof (xmlSchemaNewStringValue) xmlSchemaNewStringValue__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaNewStringValue xmlSchemaNewStringValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaNewValidCtxt -extern __typeof (xmlSchemaNewValidCtxt) xmlSchemaNewValidCtxt __attribute((alias("xmlSchemaNewValidCtxt__internal_alias"))); -#else -#ifndef xmlSchemaNewValidCtxt -extern __typeof (xmlSchemaNewValidCtxt) xmlSchemaNewValidCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaNewValidCtxt xmlSchemaNewValidCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaParse -extern __typeof (xmlSchemaParse) xmlSchemaParse __attribute((alias("xmlSchemaParse__internal_alias"))); -#else -#ifndef xmlSchemaParse -extern __typeof (xmlSchemaParse) xmlSchemaParse__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaParse xmlSchemaParse__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaSAXPlug -extern __typeof (xmlSchemaSAXPlug) xmlSchemaSAXPlug __attribute((alias("xmlSchemaSAXPlug__internal_alias"))); -#else -#ifndef xmlSchemaSAXPlug -extern __typeof (xmlSchemaSAXPlug) xmlSchemaSAXPlug__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaSAXPlug xmlSchemaSAXPlug__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaSAXUnplug -extern __typeof (xmlSchemaSAXUnplug) xmlSchemaSAXUnplug __attribute((alias("xmlSchemaSAXUnplug__internal_alias"))); -#else -#ifndef xmlSchemaSAXUnplug -extern __typeof (xmlSchemaSAXUnplug) xmlSchemaSAXUnplug__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaSAXUnplug xmlSchemaSAXUnplug__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaSetParserErrors -extern __typeof (xmlSchemaSetParserErrors) xmlSchemaSetParserErrors __attribute((alias("xmlSchemaSetParserErrors__internal_alias"))); -#else -#ifndef xmlSchemaSetParserErrors -extern __typeof (xmlSchemaSetParserErrors) xmlSchemaSetParserErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaSetParserErrors xmlSchemaSetParserErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaSetParserStructuredErrors -extern __typeof (xmlSchemaSetParserStructuredErrors) xmlSchemaSetParserStructuredErrors __attribute((alias("xmlSchemaSetParserStructuredErrors__internal_alias"))); -#else -#ifndef xmlSchemaSetParserStructuredErrors -extern __typeof (xmlSchemaSetParserStructuredErrors) xmlSchemaSetParserStructuredErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaSetParserStructuredErrors xmlSchemaSetParserStructuredErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaSetValidErrors -extern __typeof (xmlSchemaSetValidErrors) xmlSchemaSetValidErrors __attribute((alias("xmlSchemaSetValidErrors__internal_alias"))); -#else -#ifndef xmlSchemaSetValidErrors -extern __typeof (xmlSchemaSetValidErrors) xmlSchemaSetValidErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaSetValidErrors xmlSchemaSetValidErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaSetValidOptions -extern __typeof (xmlSchemaSetValidOptions) xmlSchemaSetValidOptions __attribute((alias("xmlSchemaSetValidOptions__internal_alias"))); -#else -#ifndef xmlSchemaSetValidOptions -extern __typeof (xmlSchemaSetValidOptions) xmlSchemaSetValidOptions__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaSetValidOptions xmlSchemaSetValidOptions__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaSetValidStructuredErrors -extern __typeof (xmlSchemaSetValidStructuredErrors) xmlSchemaSetValidStructuredErrors __attribute((alias("xmlSchemaSetValidStructuredErrors__internal_alias"))); -#else -#ifndef xmlSchemaSetValidStructuredErrors -extern __typeof (xmlSchemaSetValidStructuredErrors) xmlSchemaSetValidStructuredErrors__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaSetValidStructuredErrors xmlSchemaSetValidStructuredErrors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValPredefTypeNode -extern __typeof (xmlSchemaValPredefTypeNode) xmlSchemaValPredefTypeNode __attribute((alias("xmlSchemaValPredefTypeNode__internal_alias"))); -#else -#ifndef xmlSchemaValPredefTypeNode -extern __typeof (xmlSchemaValPredefTypeNode) xmlSchemaValPredefTypeNode__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValPredefTypeNode xmlSchemaValPredefTypeNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValPredefTypeNodeNoNorm -extern __typeof (xmlSchemaValPredefTypeNodeNoNorm) xmlSchemaValPredefTypeNodeNoNorm __attribute((alias("xmlSchemaValPredefTypeNodeNoNorm__internal_alias"))); -#else -#ifndef xmlSchemaValPredefTypeNodeNoNorm -extern __typeof (xmlSchemaValPredefTypeNodeNoNorm) xmlSchemaValPredefTypeNodeNoNorm__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValPredefTypeNodeNoNorm xmlSchemaValPredefTypeNodeNoNorm__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaValidCtxtGetOptions -extern __typeof (xmlSchemaValidCtxtGetOptions) xmlSchemaValidCtxtGetOptions __attribute((alias("xmlSchemaValidCtxtGetOptions__internal_alias"))); -#else -#ifndef xmlSchemaValidCtxtGetOptions -extern __typeof (xmlSchemaValidCtxtGetOptions) xmlSchemaValidCtxtGetOptions__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidCtxtGetOptions xmlSchemaValidCtxtGetOptions__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaValidateDoc -extern __typeof (xmlSchemaValidateDoc) xmlSchemaValidateDoc __attribute((alias("xmlSchemaValidateDoc__internal_alias"))); -#else -#ifndef xmlSchemaValidateDoc -extern __typeof (xmlSchemaValidateDoc) xmlSchemaValidateDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateDoc xmlSchemaValidateDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValidateFacet -extern __typeof (xmlSchemaValidateFacet) xmlSchemaValidateFacet __attribute((alias("xmlSchemaValidateFacet__internal_alias"))); -#else -#ifndef xmlSchemaValidateFacet -extern __typeof (xmlSchemaValidateFacet) xmlSchemaValidateFacet__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateFacet xmlSchemaValidateFacet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValidateFacetWhtsp -extern __typeof (xmlSchemaValidateFacetWhtsp) xmlSchemaValidateFacetWhtsp __attribute((alias("xmlSchemaValidateFacetWhtsp__internal_alias"))); -#else -#ifndef xmlSchemaValidateFacetWhtsp -extern __typeof (xmlSchemaValidateFacetWhtsp) xmlSchemaValidateFacetWhtsp__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateFacetWhtsp xmlSchemaValidateFacetWhtsp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaValidateFile -extern __typeof (xmlSchemaValidateFile) xmlSchemaValidateFile __attribute((alias("xmlSchemaValidateFile__internal_alias"))); -#else -#ifndef xmlSchemaValidateFile -extern __typeof (xmlSchemaValidateFile) xmlSchemaValidateFile__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateFile xmlSchemaValidateFile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValidateLengthFacet -extern __typeof (xmlSchemaValidateLengthFacet) xmlSchemaValidateLengthFacet __attribute((alias("xmlSchemaValidateLengthFacet__internal_alias"))); -#else -#ifndef xmlSchemaValidateLengthFacet -extern __typeof (xmlSchemaValidateLengthFacet) xmlSchemaValidateLengthFacet__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateLengthFacet xmlSchemaValidateLengthFacet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValidateLengthFacetWhtsp -extern __typeof (xmlSchemaValidateLengthFacetWhtsp) xmlSchemaValidateLengthFacetWhtsp __attribute((alias("xmlSchemaValidateLengthFacetWhtsp__internal_alias"))); -#else -#ifndef xmlSchemaValidateLengthFacetWhtsp -extern __typeof (xmlSchemaValidateLengthFacetWhtsp) xmlSchemaValidateLengthFacetWhtsp__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateLengthFacetWhtsp xmlSchemaValidateLengthFacetWhtsp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValidateListSimpleTypeFacet -extern __typeof (xmlSchemaValidateListSimpleTypeFacet) xmlSchemaValidateListSimpleTypeFacet __attribute((alias("xmlSchemaValidateListSimpleTypeFacet__internal_alias"))); -#else -#ifndef xmlSchemaValidateListSimpleTypeFacet -extern __typeof (xmlSchemaValidateListSimpleTypeFacet) xmlSchemaValidateListSimpleTypeFacet__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateListSimpleTypeFacet xmlSchemaValidateListSimpleTypeFacet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaValidateOneElement -extern __typeof (xmlSchemaValidateOneElement) xmlSchemaValidateOneElement __attribute((alias("xmlSchemaValidateOneElement__internal_alias"))); -#else -#ifndef xmlSchemaValidateOneElement -extern __typeof (xmlSchemaValidateOneElement) xmlSchemaValidateOneElement__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateOneElement xmlSchemaValidateOneElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValidatePredefinedType -extern __typeof (xmlSchemaValidatePredefinedType) xmlSchemaValidatePredefinedType __attribute((alias("xmlSchemaValidatePredefinedType__internal_alias"))); -#else -#ifndef xmlSchemaValidatePredefinedType -extern __typeof (xmlSchemaValidatePredefinedType) xmlSchemaValidatePredefinedType__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidatePredefinedType xmlSchemaValidatePredefinedType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemas -#undef xmlSchemaValidateStream -extern __typeof (xmlSchemaValidateStream) xmlSchemaValidateStream __attribute((alias("xmlSchemaValidateStream__internal_alias"))); -#else -#ifndef xmlSchemaValidateStream -extern __typeof (xmlSchemaValidateStream) xmlSchemaValidateStream__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValidateStream xmlSchemaValidateStream__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValueAppend -extern __typeof (xmlSchemaValueAppend) xmlSchemaValueAppend __attribute((alias("xmlSchemaValueAppend__internal_alias"))); -#else -#ifndef xmlSchemaValueAppend -extern __typeof (xmlSchemaValueAppend) xmlSchemaValueAppend__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValueAppend xmlSchemaValueAppend__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValueGetAsBoolean -extern __typeof (xmlSchemaValueGetAsBoolean) xmlSchemaValueGetAsBoolean __attribute((alias("xmlSchemaValueGetAsBoolean__internal_alias"))); -#else -#ifndef xmlSchemaValueGetAsBoolean -extern __typeof (xmlSchemaValueGetAsBoolean) xmlSchemaValueGetAsBoolean__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValueGetAsBoolean xmlSchemaValueGetAsBoolean__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValueGetAsString -extern __typeof (xmlSchemaValueGetAsString) xmlSchemaValueGetAsString __attribute((alias("xmlSchemaValueGetAsString__internal_alias"))); -#else -#ifndef xmlSchemaValueGetAsString -extern __typeof (xmlSchemaValueGetAsString) xmlSchemaValueGetAsString__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValueGetAsString xmlSchemaValueGetAsString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaValueGetNext -extern __typeof (xmlSchemaValueGetNext) xmlSchemaValueGetNext __attribute((alias("xmlSchemaValueGetNext__internal_alias"))); -#else -#ifndef xmlSchemaValueGetNext -extern __typeof (xmlSchemaValueGetNext) xmlSchemaValueGetNext__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaValueGetNext xmlSchemaValueGetNext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlschemastypes -#undef xmlSchemaWhiteSpaceReplace -extern __typeof (xmlSchemaWhiteSpaceReplace) xmlSchemaWhiteSpaceReplace __attribute((alias("xmlSchemaWhiteSpaceReplace__internal_alias"))); -#else -#ifndef xmlSchemaWhiteSpaceReplace -extern __typeof (xmlSchemaWhiteSpaceReplace) xmlSchemaWhiteSpaceReplace__internal_alias __attribute((visibility("hidden"))); -#define xmlSchemaWhiteSpaceReplace xmlSchemaWhiteSpaceReplace__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronFree -extern __typeof (xmlSchematronFree) xmlSchematronFree __attribute((alias("xmlSchematronFree__internal_alias"))); -#else -#ifndef xmlSchematronFree -extern __typeof (xmlSchematronFree) xmlSchematronFree__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronFree xmlSchematronFree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronFreeParserCtxt -extern __typeof (xmlSchematronFreeParserCtxt) xmlSchematronFreeParserCtxt __attribute((alias("xmlSchematronFreeParserCtxt__internal_alias"))); -#else -#ifndef xmlSchematronFreeParserCtxt -extern __typeof (xmlSchematronFreeParserCtxt) xmlSchematronFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronFreeParserCtxt xmlSchematronFreeParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronFreeValidCtxt -extern __typeof (xmlSchematronFreeValidCtxt) xmlSchematronFreeValidCtxt __attribute((alias("xmlSchematronFreeValidCtxt__internal_alias"))); -#else -#ifndef xmlSchematronFreeValidCtxt -extern __typeof (xmlSchematronFreeValidCtxt) xmlSchematronFreeValidCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronFreeValidCtxt xmlSchematronFreeValidCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronNewDocParserCtxt -extern __typeof (xmlSchematronNewDocParserCtxt) xmlSchematronNewDocParserCtxt __attribute((alias("xmlSchematronNewDocParserCtxt__internal_alias"))); -#else -#ifndef xmlSchematronNewDocParserCtxt -extern __typeof (xmlSchematronNewDocParserCtxt) xmlSchematronNewDocParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronNewDocParserCtxt xmlSchematronNewDocParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronNewMemParserCtxt -extern __typeof (xmlSchematronNewMemParserCtxt) xmlSchematronNewMemParserCtxt __attribute((alias("xmlSchematronNewMemParserCtxt__internal_alias"))); -#else -#ifndef xmlSchematronNewMemParserCtxt -extern __typeof (xmlSchematronNewMemParserCtxt) xmlSchematronNewMemParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronNewMemParserCtxt xmlSchematronNewMemParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronNewParserCtxt -extern __typeof (xmlSchematronNewParserCtxt) xmlSchematronNewParserCtxt __attribute((alias("xmlSchematronNewParserCtxt__internal_alias"))); -#else -#ifndef xmlSchematronNewParserCtxt -extern __typeof (xmlSchematronNewParserCtxt) xmlSchematronNewParserCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronNewParserCtxt xmlSchematronNewParserCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronNewValidCtxt -extern __typeof (xmlSchematronNewValidCtxt) xmlSchematronNewValidCtxt __attribute((alias("xmlSchematronNewValidCtxt__internal_alias"))); -#else -#ifndef xmlSchematronNewValidCtxt -extern __typeof (xmlSchematronNewValidCtxt) xmlSchematronNewValidCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronNewValidCtxt xmlSchematronNewValidCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronParse -extern __typeof (xmlSchematronParse) xmlSchematronParse __attribute((alias("xmlSchematronParse__internal_alias"))); -#else -#ifndef xmlSchematronParse -extern __typeof (xmlSchematronParse) xmlSchematronParse__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronParse xmlSchematronParse__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_SCHEMATRON_ENABLED) -#ifdef bottom_schematron -#undef xmlSchematronValidateDoc -extern __typeof (xmlSchematronValidateDoc) xmlSchematronValidateDoc __attribute((alias("xmlSchematronValidateDoc__internal_alias"))); -#else -#ifndef xmlSchematronValidateDoc -extern __typeof (xmlSchematronValidateDoc) xmlSchematronValidateDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlSchematronValidateDoc xmlSchematronValidateDoc__internal_alias -#endif -#endif -#endif - -#ifdef bottom_tree -#undef xmlSearchNs -extern __typeof (xmlSearchNs) xmlSearchNs __attribute((alias("xmlSearchNs__internal_alias"))); -#else -#ifndef xmlSearchNs -extern __typeof (xmlSearchNs) xmlSearchNs__internal_alias __attribute((visibility("hidden"))); -#define xmlSearchNs xmlSearchNs__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSearchNsByHref -extern __typeof (xmlSearchNsByHref) xmlSearchNsByHref __attribute((alias("xmlSearchNsByHref__internal_alias"))); -#else -#ifndef xmlSearchNsByHref -extern __typeof (xmlSearchNsByHref) xmlSearchNsByHref__internal_alias __attribute((visibility("hidden"))); -#define xmlSearchNsByHref xmlSearchNsByHref__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSetBufferAllocationScheme -extern __typeof (xmlSetBufferAllocationScheme) xmlSetBufferAllocationScheme __attribute((alias("xmlSetBufferAllocationScheme__internal_alias"))); -#else -#ifndef xmlSetBufferAllocationScheme -extern __typeof (xmlSetBufferAllocationScheme) xmlSetBufferAllocationScheme__internal_alias __attribute((visibility("hidden"))); -#define xmlSetBufferAllocationScheme xmlSetBufferAllocationScheme__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSetCompressMode -extern __typeof (xmlSetCompressMode) xmlSetCompressMode __attribute((alias("xmlSetCompressMode__internal_alias"))); -#else -#ifndef xmlSetCompressMode -extern __typeof (xmlSetCompressMode) xmlSetCompressMode__internal_alias __attribute((visibility("hidden"))); -#define xmlSetCompressMode xmlSetCompressMode__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSetDocCompressMode -extern __typeof (xmlSetDocCompressMode) xmlSetDocCompressMode __attribute((alias("xmlSetDocCompressMode__internal_alias"))); -#else -#ifndef xmlSetDocCompressMode -extern __typeof (xmlSetDocCompressMode) xmlSetDocCompressMode__internal_alias __attribute((visibility("hidden"))); -#define xmlSetDocCompressMode xmlSetDocCompressMode__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_parser -#undef xmlSetEntityReferenceFunc -extern __typeof (xmlSetEntityReferenceFunc) xmlSetEntityReferenceFunc __attribute((alias("xmlSetEntityReferenceFunc__internal_alias"))); -#else -#ifndef xmlSetEntityReferenceFunc -extern __typeof (xmlSetEntityReferenceFunc) xmlSetEntityReferenceFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlSetEntityReferenceFunc xmlSetEntityReferenceFunc__internal_alias -#endif -#endif -#endif - -#ifdef bottom_xmlIO -#undef xmlSetExternalEntityLoader -extern __typeof (xmlSetExternalEntityLoader) xmlSetExternalEntityLoader __attribute((alias("xmlSetExternalEntityLoader__internal_alias"))); -#else -#ifndef xmlSetExternalEntityLoader -extern __typeof (xmlSetExternalEntityLoader) xmlSetExternalEntityLoader__internal_alias __attribute((visibility("hidden"))); -#define xmlSetExternalEntityLoader xmlSetExternalEntityLoader__internal_alias -#endif -#endif - -#if defined(LIBXML_LEGACY_ENABLED) -#ifdef bottom_legacy -#undef xmlSetFeature -extern __typeof (xmlSetFeature) xmlSetFeature __attribute((alias("xmlSetFeature__internal_alias"))); -#else -#ifndef xmlSetFeature -extern __typeof (xmlSetFeature) xmlSetFeature__internal_alias __attribute((visibility("hidden"))); -#define xmlSetFeature xmlSetFeature__internal_alias -#endif -#endif -#endif - -#ifdef bottom_error -#undef xmlSetGenericErrorFunc -extern __typeof (xmlSetGenericErrorFunc) xmlSetGenericErrorFunc __attribute((alias("xmlSetGenericErrorFunc__internal_alias"))); -#else -#ifndef xmlSetGenericErrorFunc -extern __typeof (xmlSetGenericErrorFunc) xmlSetGenericErrorFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlSetGenericErrorFunc xmlSetGenericErrorFunc__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSetListDoc -extern __typeof (xmlSetListDoc) xmlSetListDoc __attribute((alias("xmlSetListDoc__internal_alias"))); -#else -#ifndef xmlSetListDoc -extern __typeof (xmlSetListDoc) xmlSetListDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlSetListDoc xmlSetListDoc__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSetNs -extern __typeof (xmlSetNs) xmlSetNs __attribute((alias("xmlSetNs__internal_alias"))); -#else -#ifndef xmlSetNs -extern __typeof (xmlSetNs) xmlSetNs__internal_alias __attribute((visibility("hidden"))); -#define xmlSetNs xmlSetNs__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) -#ifdef bottom_tree -#undef xmlSetNsProp -extern __typeof (xmlSetNsProp) xmlSetNsProp __attribute((alias("xmlSetNsProp__internal_alias"))); -#else -#ifndef xmlSetNsProp -extern __typeof (xmlSetNsProp) xmlSetNsProp__internal_alias __attribute((visibility("hidden"))); -#define xmlSetNsProp xmlSetNsProp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) -#ifdef bottom_tree -#undef xmlSetProp -extern __typeof (xmlSetProp) xmlSetProp __attribute((alias("xmlSetProp__internal_alias"))); -#else -#ifndef xmlSetProp -extern __typeof (xmlSetProp) xmlSetProp__internal_alias __attribute((visibility("hidden"))); -#define xmlSetProp xmlSetProp__internal_alias -#endif -#endif -#endif - -#ifdef bottom_error -#undef xmlSetStructuredErrorFunc -extern __typeof (xmlSetStructuredErrorFunc) xmlSetStructuredErrorFunc __attribute((alias("xmlSetStructuredErrorFunc__internal_alias"))); -#else -#ifndef xmlSetStructuredErrorFunc -extern __typeof (xmlSetStructuredErrorFunc) xmlSetStructuredErrorFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlSetStructuredErrorFunc xmlSetStructuredErrorFunc__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSetTreeDoc -extern __typeof (xmlSetTreeDoc) xmlSetTreeDoc __attribute((alias("xmlSetTreeDoc__internal_alias"))); -#else -#ifndef xmlSetTreeDoc -extern __typeof (xmlSetTreeDoc) xmlSetTreeDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlSetTreeDoc xmlSetTreeDoc__internal_alias -#endif -#endif - -#if defined(LIBXML_SAX1_ENABLED) -#ifdef bottom_parser -#undef xmlSetupParserForBuffer -extern __typeof (xmlSetupParserForBuffer) xmlSetupParserForBuffer __attribute((alias("xmlSetupParserForBuffer__internal_alias"))); -#else -#ifndef xmlSetupParserForBuffer -extern __typeof (xmlSetupParserForBuffer) xmlSetupParserForBuffer__internal_alias __attribute((visibility("hidden"))); -#define xmlSetupParserForBuffer xmlSetupParserForBuffer__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShell -extern __typeof (xmlShell) xmlShell __attribute((alias("xmlShell__internal_alias"))); -#else -#ifndef xmlShell -extern __typeof (xmlShell) xmlShell__internal_alias __attribute((visibility("hidden"))); -#define xmlShell xmlShell__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellBase -extern __typeof (xmlShellBase) xmlShellBase __attribute((alias("xmlShellBase__internal_alias"))); -#else -#ifndef xmlShellBase -extern __typeof (xmlShellBase) xmlShellBase__internal_alias __attribute((visibility("hidden"))); -#define xmlShellBase xmlShellBase__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellCat -extern __typeof (xmlShellCat) xmlShellCat __attribute((alias("xmlShellCat__internal_alias"))); -#else -#ifndef xmlShellCat -extern __typeof (xmlShellCat) xmlShellCat__internal_alias __attribute((visibility("hidden"))); -#define xmlShellCat xmlShellCat__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellDir -extern __typeof (xmlShellDir) xmlShellDir __attribute((alias("xmlShellDir__internal_alias"))); -#else -#ifndef xmlShellDir -extern __typeof (xmlShellDir) xmlShellDir__internal_alias __attribute((visibility("hidden"))); -#define xmlShellDir xmlShellDir__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellDu -extern __typeof (xmlShellDu) xmlShellDu __attribute((alias("xmlShellDu__internal_alias"))); -#else -#ifndef xmlShellDu -extern __typeof (xmlShellDu) xmlShellDu__internal_alias __attribute((visibility("hidden"))); -#define xmlShellDu xmlShellDu__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellList -extern __typeof (xmlShellList) xmlShellList __attribute((alias("xmlShellList__internal_alias"))); -#else -#ifndef xmlShellList -extern __typeof (xmlShellList) xmlShellList__internal_alias __attribute((visibility("hidden"))); -#define xmlShellList xmlShellList__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellLoad -extern __typeof (xmlShellLoad) xmlShellLoad __attribute((alias("xmlShellLoad__internal_alias"))); -#else -#ifndef xmlShellLoad -extern __typeof (xmlShellLoad) xmlShellLoad__internal_alias __attribute((visibility("hidden"))); -#define xmlShellLoad xmlShellLoad__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellPrintNode -extern __typeof (xmlShellPrintNode) xmlShellPrintNode __attribute((alias("xmlShellPrintNode__internal_alias"))); -#else -#ifndef xmlShellPrintNode -extern __typeof (xmlShellPrintNode) xmlShellPrintNode__internal_alias __attribute((visibility("hidden"))); -#define xmlShellPrintNode xmlShellPrintNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellPrintXPathError -extern __typeof (xmlShellPrintXPathError) xmlShellPrintXPathError __attribute((alias("xmlShellPrintXPathError__internal_alias"))); -#else -#ifndef xmlShellPrintXPathError -extern __typeof (xmlShellPrintXPathError) xmlShellPrintXPathError__internal_alias __attribute((visibility("hidden"))); -#define xmlShellPrintXPathError xmlShellPrintXPathError__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellPrintXPathResult -extern __typeof (xmlShellPrintXPathResult) xmlShellPrintXPathResult __attribute((alias("xmlShellPrintXPathResult__internal_alias"))); -#else -#ifndef xmlShellPrintXPathResult -extern __typeof (xmlShellPrintXPathResult) xmlShellPrintXPathResult__internal_alias __attribute((visibility("hidden"))); -#define xmlShellPrintXPathResult xmlShellPrintXPathResult__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellPwd -extern __typeof (xmlShellPwd) xmlShellPwd __attribute((alias("xmlShellPwd__internal_alias"))); -#else -#ifndef xmlShellPwd -extern __typeof (xmlShellPwd) xmlShellPwd__internal_alias __attribute((visibility("hidden"))); -#define xmlShellPwd xmlShellPwd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellSave -extern __typeof (xmlShellSave) xmlShellSave __attribute((alias("xmlShellSave__internal_alias"))); -#else -#ifndef xmlShellSave -extern __typeof (xmlShellSave) xmlShellSave__internal_alias __attribute((visibility("hidden"))); -#define xmlShellSave xmlShellSave__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_VALID_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellValidate -extern __typeof (xmlShellValidate) xmlShellValidate __attribute((alias("xmlShellValidate__internal_alias"))); -#else -#ifndef xmlShellValidate -extern __typeof (xmlShellValidate) xmlShellValidate__internal_alias __attribute((visibility("hidden"))); -#define xmlShellValidate xmlShellValidate__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_debugXML -#undef xmlShellWrite -extern __typeof (xmlShellWrite) xmlShellWrite __attribute((alias("xmlShellWrite__internal_alias"))); -#else -#ifndef xmlShellWrite -extern __typeof (xmlShellWrite) xmlShellWrite__internal_alias __attribute((visibility("hidden"))); -#define xmlShellWrite xmlShellWrite__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlSkipBlankChars -extern __typeof (xmlSkipBlankChars) xmlSkipBlankChars __attribute((alias("xmlSkipBlankChars__internal_alias"))); -#else -#ifndef xmlSkipBlankChars -extern __typeof (xmlSkipBlankChars) xmlSkipBlankChars__internal_alias __attribute((visibility("hidden"))); -#define xmlSkipBlankChars xmlSkipBlankChars__internal_alias -#endif -#endif - -#ifdef bottom_valid -#undef xmlSnprintfElementContent -extern __typeof (xmlSnprintfElementContent) xmlSnprintfElementContent __attribute((alias("xmlSnprintfElementContent__internal_alias"))); -#else -#ifndef xmlSnprintfElementContent -extern __typeof (xmlSnprintfElementContent) xmlSnprintfElementContent__internal_alias __attribute((visibility("hidden"))); -#define xmlSnprintfElementContent xmlSnprintfElementContent__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlSplitQName -extern __typeof (xmlSplitQName) xmlSplitQName __attribute((alias("xmlSplitQName__internal_alias"))); -#else -#ifndef xmlSplitQName -extern __typeof (xmlSplitQName) xmlSplitQName__internal_alias __attribute((visibility("hidden"))); -#define xmlSplitQName xmlSplitQName__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSplitQName2 -extern __typeof (xmlSplitQName2) xmlSplitQName2 __attribute((alias("xmlSplitQName2__internal_alias"))); -#else -#ifndef xmlSplitQName2 -extern __typeof (xmlSplitQName2) xmlSplitQName2__internal_alias __attribute((visibility("hidden"))); -#define xmlSplitQName2 xmlSplitQName2__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlSplitQName3 -extern __typeof (xmlSplitQName3) xmlSplitQName3 __attribute((alias("xmlSplitQName3__internal_alias"))); -#else -#ifndef xmlSplitQName3 -extern __typeof (xmlSplitQName3) xmlSplitQName3__internal_alias __attribute((visibility("hidden"))); -#define xmlSplitQName3 xmlSplitQName3__internal_alias -#endif -#endif - -#if defined(LIBXML_OUTPUT_ENABLED) -#ifdef bottom_valid -#undef xmlSprintfElementContent -extern __typeof (xmlSprintfElementContent) xmlSprintfElementContent __attribute((alias("xmlSprintfElementContent__internal_alias"))); -#else -#ifndef xmlSprintfElementContent -extern __typeof (xmlSprintfElementContent) xmlSprintfElementContent__internal_alias __attribute((visibility("hidden"))); -#define xmlSprintfElementContent xmlSprintfElementContent__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parser -#undef xmlStopParser -extern __typeof (xmlStopParser) xmlStopParser __attribute((alias("xmlStopParser__internal_alias"))); -#else -#ifndef xmlStopParser -extern __typeof (xmlStopParser) xmlStopParser__internal_alias __attribute((visibility("hidden"))); -#define xmlStopParser xmlStopParser__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrEqual -extern __typeof (xmlStrEqual) xmlStrEqual __attribute((alias("xmlStrEqual__internal_alias"))); -#else -#ifndef xmlStrEqual -extern __typeof (xmlStrEqual) xmlStrEqual__internal_alias __attribute((visibility("hidden"))); -#define xmlStrEqual xmlStrEqual__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrPrintf -extern __typeof (xmlStrPrintf) xmlStrPrintf __attribute((alias("xmlStrPrintf__internal_alias"))); -#else -#ifndef xmlStrPrintf -extern __typeof (xmlStrPrintf) xmlStrPrintf__internal_alias __attribute((visibility("hidden"))); -#define xmlStrPrintf xmlStrPrintf__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrQEqual -extern __typeof (xmlStrQEqual) xmlStrQEqual __attribute((alias("xmlStrQEqual__internal_alias"))); -#else -#ifndef xmlStrQEqual -extern __typeof (xmlStrQEqual) xmlStrQEqual__internal_alias __attribute((visibility("hidden"))); -#define xmlStrQEqual xmlStrQEqual__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrVPrintf -extern __typeof (xmlStrVPrintf) xmlStrVPrintf __attribute((alias("xmlStrVPrintf__internal_alias"))); -#else -#ifndef xmlStrVPrintf -extern __typeof (xmlStrVPrintf) xmlStrVPrintf__internal_alias __attribute((visibility("hidden"))); -#define xmlStrVPrintf xmlStrVPrintf__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrcasecmp -extern __typeof (xmlStrcasecmp) xmlStrcasecmp __attribute((alias("xmlStrcasecmp__internal_alias"))); -#else -#ifndef xmlStrcasecmp -extern __typeof (xmlStrcasecmp) xmlStrcasecmp__internal_alias __attribute((visibility("hidden"))); -#define xmlStrcasecmp xmlStrcasecmp__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrcasestr -extern __typeof (xmlStrcasestr) xmlStrcasestr __attribute((alias("xmlStrcasestr__internal_alias"))); -#else -#ifndef xmlStrcasestr -extern __typeof (xmlStrcasestr) xmlStrcasestr__internal_alias __attribute((visibility("hidden"))); -#define xmlStrcasestr xmlStrcasestr__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrcat -extern __typeof (xmlStrcat) xmlStrcat __attribute((alias("xmlStrcat__internal_alias"))); -#else -#ifndef xmlStrcat -extern __typeof (xmlStrcat) xmlStrcat__internal_alias __attribute((visibility("hidden"))); -#define xmlStrcat xmlStrcat__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrchr -extern __typeof (xmlStrchr) xmlStrchr __attribute((alias("xmlStrchr__internal_alias"))); -#else -#ifndef xmlStrchr -extern __typeof (xmlStrchr) xmlStrchr__internal_alias __attribute((visibility("hidden"))); -#define xmlStrchr xmlStrchr__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrcmp -extern __typeof (xmlStrcmp) xmlStrcmp __attribute((alias("xmlStrcmp__internal_alias"))); -#else -#ifndef xmlStrcmp -extern __typeof (xmlStrcmp) xmlStrcmp__internal_alias __attribute((visibility("hidden"))); -#define xmlStrcmp xmlStrcmp__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrdup -extern __typeof (xmlStrdup) xmlStrdup __attribute((alias("xmlStrdup__internal_alias"))); -#else -#ifndef xmlStrdup -extern __typeof (xmlStrdup) xmlStrdup__internal_alias __attribute((visibility("hidden"))); -#define xmlStrdup xmlStrdup__internal_alias -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlStreamPop -extern __typeof (xmlStreamPop) xmlStreamPop __attribute((alias("xmlStreamPop__internal_alias"))); -#else -#ifndef xmlStreamPop -extern __typeof (xmlStreamPop) xmlStreamPop__internal_alias __attribute((visibility("hidden"))); -#define xmlStreamPop xmlStreamPop__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlStreamPush -extern __typeof (xmlStreamPush) xmlStreamPush __attribute((alias("xmlStreamPush__internal_alias"))); -#else -#ifndef xmlStreamPush -extern __typeof (xmlStreamPush) xmlStreamPush__internal_alias __attribute((visibility("hidden"))); -#define xmlStreamPush xmlStreamPush__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlStreamPushAttr -extern __typeof (xmlStreamPushAttr) xmlStreamPushAttr __attribute((alias("xmlStreamPushAttr__internal_alias"))); -#else -#ifndef xmlStreamPushAttr -extern __typeof (xmlStreamPushAttr) xmlStreamPushAttr__internal_alias __attribute((visibility("hidden"))); -#define xmlStreamPushAttr xmlStreamPushAttr__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlStreamPushNode -extern __typeof (xmlStreamPushNode) xmlStreamPushNode __attribute((alias("xmlStreamPushNode__internal_alias"))); -#else -#ifndef xmlStreamPushNode -extern __typeof (xmlStreamPushNode) xmlStreamPushNode__internal_alias __attribute((visibility("hidden"))); -#define xmlStreamPushNode xmlStreamPushNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_pattern -#undef xmlStreamWantsAnyNode -extern __typeof (xmlStreamWantsAnyNode) xmlStreamWantsAnyNode __attribute((alias("xmlStreamWantsAnyNode__internal_alias"))); -#else -#ifndef xmlStreamWantsAnyNode -extern __typeof (xmlStreamWantsAnyNode) xmlStreamWantsAnyNode__internal_alias __attribute((visibility("hidden"))); -#define xmlStreamWantsAnyNode xmlStreamWantsAnyNode__internal_alias -#endif -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlStringCurrentChar -extern __typeof (xmlStringCurrentChar) xmlStringCurrentChar __attribute((alias("xmlStringCurrentChar__internal_alias"))); -#else -#ifndef xmlStringCurrentChar -extern __typeof (xmlStringCurrentChar) xmlStringCurrentChar__internal_alias __attribute((visibility("hidden"))); -#define xmlStringCurrentChar xmlStringCurrentChar__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlStringDecodeEntities -extern __typeof (xmlStringDecodeEntities) xmlStringDecodeEntities __attribute((alias("xmlStringDecodeEntities__internal_alias"))); -#else -#ifndef xmlStringDecodeEntities -extern __typeof (xmlStringDecodeEntities) xmlStringDecodeEntities__internal_alias __attribute((visibility("hidden"))); -#define xmlStringDecodeEntities xmlStringDecodeEntities__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlStringGetNodeList -extern __typeof (xmlStringGetNodeList) xmlStringGetNodeList __attribute((alias("xmlStringGetNodeList__internal_alias"))); -#else -#ifndef xmlStringGetNodeList -extern __typeof (xmlStringGetNodeList) xmlStringGetNodeList__internal_alias __attribute((visibility("hidden"))); -#define xmlStringGetNodeList xmlStringGetNodeList__internal_alias -#endif -#endif - -#ifdef bottom_parser -#undef xmlStringLenDecodeEntities -extern __typeof (xmlStringLenDecodeEntities) xmlStringLenDecodeEntities __attribute((alias("xmlStringLenDecodeEntities__internal_alias"))); -#else -#ifndef xmlStringLenDecodeEntities -extern __typeof (xmlStringLenDecodeEntities) xmlStringLenDecodeEntities__internal_alias __attribute((visibility("hidden"))); -#define xmlStringLenDecodeEntities xmlStringLenDecodeEntities__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlStringLenGetNodeList -extern __typeof (xmlStringLenGetNodeList) xmlStringLenGetNodeList __attribute((alias("xmlStringLenGetNodeList__internal_alias"))); -#else -#ifndef xmlStringLenGetNodeList -extern __typeof (xmlStringLenGetNodeList) xmlStringLenGetNodeList__internal_alias __attribute((visibility("hidden"))); -#define xmlStringLenGetNodeList xmlStringLenGetNodeList__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrlen -extern __typeof (xmlStrlen) xmlStrlen __attribute((alias("xmlStrlen__internal_alias"))); -#else -#ifndef xmlStrlen -extern __typeof (xmlStrlen) xmlStrlen__internal_alias __attribute((visibility("hidden"))); -#define xmlStrlen xmlStrlen__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrncasecmp -extern __typeof (xmlStrncasecmp) xmlStrncasecmp __attribute((alias("xmlStrncasecmp__internal_alias"))); -#else -#ifndef xmlStrncasecmp -extern __typeof (xmlStrncasecmp) xmlStrncasecmp__internal_alias __attribute((visibility("hidden"))); -#define xmlStrncasecmp xmlStrncasecmp__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrncat -extern __typeof (xmlStrncat) xmlStrncat __attribute((alias("xmlStrncat__internal_alias"))); -#else -#ifndef xmlStrncat -extern __typeof (xmlStrncat) xmlStrncat__internal_alias __attribute((visibility("hidden"))); -#define xmlStrncat xmlStrncat__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrncatNew -extern __typeof (xmlStrncatNew) xmlStrncatNew __attribute((alias("xmlStrncatNew__internal_alias"))); -#else -#ifndef xmlStrncatNew -extern __typeof (xmlStrncatNew) xmlStrncatNew__internal_alias __attribute((visibility("hidden"))); -#define xmlStrncatNew xmlStrncatNew__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrncmp -extern __typeof (xmlStrncmp) xmlStrncmp __attribute((alias("xmlStrncmp__internal_alias"))); -#else -#ifndef xmlStrncmp -extern __typeof (xmlStrncmp) xmlStrncmp__internal_alias __attribute((visibility("hidden"))); -#define xmlStrncmp xmlStrncmp__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrndup -extern __typeof (xmlStrndup) xmlStrndup __attribute((alias("xmlStrndup__internal_alias"))); -#else -#ifndef xmlStrndup -extern __typeof (xmlStrndup) xmlStrndup__internal_alias __attribute((visibility("hidden"))); -#define xmlStrndup xmlStrndup__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrstr -extern __typeof (xmlStrstr) xmlStrstr __attribute((alias("xmlStrstr__internal_alias"))); -#else -#ifndef xmlStrstr -extern __typeof (xmlStrstr) xmlStrstr__internal_alias __attribute((visibility("hidden"))); -#define xmlStrstr xmlStrstr__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlStrsub -extern __typeof (xmlStrsub) xmlStrsub __attribute((alias("xmlStrsub__internal_alias"))); -#else -#ifndef xmlStrsub -extern __typeof (xmlStrsub) xmlStrsub__internal_alias __attribute((visibility("hidden"))); -#define xmlStrsub xmlStrsub__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlSubstituteEntitiesDefault -extern __typeof (xmlSubstituteEntitiesDefault) xmlSubstituteEntitiesDefault __attribute((alias("xmlSubstituteEntitiesDefault__internal_alias"))); -#else -#ifndef xmlSubstituteEntitiesDefault -extern __typeof (xmlSubstituteEntitiesDefault) xmlSubstituteEntitiesDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlSubstituteEntitiesDefault xmlSubstituteEntitiesDefault__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlSwitchEncoding -extern __typeof (xmlSwitchEncoding) xmlSwitchEncoding __attribute((alias("xmlSwitchEncoding__internal_alias"))); -#else -#ifndef xmlSwitchEncoding -extern __typeof (xmlSwitchEncoding) xmlSwitchEncoding__internal_alias __attribute((visibility("hidden"))); -#define xmlSwitchEncoding xmlSwitchEncoding__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlSwitchInputEncoding -extern __typeof (xmlSwitchInputEncoding) xmlSwitchInputEncoding __attribute((alias("xmlSwitchInputEncoding__internal_alias"))); -#else -#ifndef xmlSwitchInputEncoding -extern __typeof (xmlSwitchInputEncoding) xmlSwitchInputEncoding__internal_alias __attribute((visibility("hidden"))); -#define xmlSwitchInputEncoding xmlSwitchInputEncoding__internal_alias -#endif -#endif - -#ifdef bottom_parserInternals -#undef xmlSwitchToEncoding -extern __typeof (xmlSwitchToEncoding) xmlSwitchToEncoding __attribute((alias("xmlSwitchToEncoding__internal_alias"))); -#else -#ifndef xmlSwitchToEncoding -extern __typeof (xmlSwitchToEncoding) xmlSwitchToEncoding__internal_alias __attribute((visibility("hidden"))); -#define xmlSwitchToEncoding xmlSwitchToEncoding__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlTextConcat -extern __typeof (xmlTextConcat) xmlTextConcat __attribute((alias("xmlTextConcat__internal_alias"))); -#else -#ifndef xmlTextConcat -extern __typeof (xmlTextConcat) xmlTextConcat__internal_alias __attribute((visibility("hidden"))); -#define xmlTextConcat xmlTextConcat__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlTextMerge -extern __typeof (xmlTextMerge) xmlTextMerge __attribute((alias("xmlTextMerge__internal_alias"))); -#else -#ifndef xmlTextMerge -extern __typeof (xmlTextMerge) xmlTextMerge__internal_alias __attribute((visibility("hidden"))); -#define xmlTextMerge xmlTextMerge__internal_alias -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderAttributeCount -extern __typeof (xmlTextReaderAttributeCount) xmlTextReaderAttributeCount __attribute((alias("xmlTextReaderAttributeCount__internal_alias"))); -#else -#ifndef xmlTextReaderAttributeCount -extern __typeof (xmlTextReaderAttributeCount) xmlTextReaderAttributeCount__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderAttributeCount xmlTextReaderAttributeCount__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderBaseUri -extern __typeof (xmlTextReaderBaseUri) xmlTextReaderBaseUri __attribute((alias("xmlTextReaderBaseUri__internal_alias"))); -#else -#ifndef xmlTextReaderBaseUri -extern __typeof (xmlTextReaderBaseUri) xmlTextReaderBaseUri__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderBaseUri xmlTextReaderBaseUri__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderByteConsumed -extern __typeof (xmlTextReaderByteConsumed) xmlTextReaderByteConsumed __attribute((alias("xmlTextReaderByteConsumed__internal_alias"))); -#else -#ifndef xmlTextReaderByteConsumed -extern __typeof (xmlTextReaderByteConsumed) xmlTextReaderByteConsumed__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderByteConsumed xmlTextReaderByteConsumed__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderClose -extern __typeof (xmlTextReaderClose) xmlTextReaderClose __attribute((alias("xmlTextReaderClose__internal_alias"))); -#else -#ifndef xmlTextReaderClose -extern __typeof (xmlTextReaderClose) xmlTextReaderClose__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderClose xmlTextReaderClose__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstBaseUri -extern __typeof (xmlTextReaderConstBaseUri) xmlTextReaderConstBaseUri __attribute((alias("xmlTextReaderConstBaseUri__internal_alias"))); -#else -#ifndef xmlTextReaderConstBaseUri -extern __typeof (xmlTextReaderConstBaseUri) xmlTextReaderConstBaseUri__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstBaseUri xmlTextReaderConstBaseUri__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstEncoding -extern __typeof (xmlTextReaderConstEncoding) xmlTextReaderConstEncoding __attribute((alias("xmlTextReaderConstEncoding__internal_alias"))); -#else -#ifndef xmlTextReaderConstEncoding -extern __typeof (xmlTextReaderConstEncoding) xmlTextReaderConstEncoding__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstEncoding xmlTextReaderConstEncoding__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstLocalName -extern __typeof (xmlTextReaderConstLocalName) xmlTextReaderConstLocalName __attribute((alias("xmlTextReaderConstLocalName__internal_alias"))); -#else -#ifndef xmlTextReaderConstLocalName -extern __typeof (xmlTextReaderConstLocalName) xmlTextReaderConstLocalName__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstLocalName xmlTextReaderConstLocalName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstName -extern __typeof (xmlTextReaderConstName) xmlTextReaderConstName __attribute((alias("xmlTextReaderConstName__internal_alias"))); -#else -#ifndef xmlTextReaderConstName -extern __typeof (xmlTextReaderConstName) xmlTextReaderConstName__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstName xmlTextReaderConstName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstNamespaceUri -extern __typeof (xmlTextReaderConstNamespaceUri) xmlTextReaderConstNamespaceUri __attribute((alias("xmlTextReaderConstNamespaceUri__internal_alias"))); -#else -#ifndef xmlTextReaderConstNamespaceUri -extern __typeof (xmlTextReaderConstNamespaceUri) xmlTextReaderConstNamespaceUri__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstNamespaceUri xmlTextReaderConstNamespaceUri__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstPrefix -extern __typeof (xmlTextReaderConstPrefix) xmlTextReaderConstPrefix __attribute((alias("xmlTextReaderConstPrefix__internal_alias"))); -#else -#ifndef xmlTextReaderConstPrefix -extern __typeof (xmlTextReaderConstPrefix) xmlTextReaderConstPrefix__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstPrefix xmlTextReaderConstPrefix__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstString -extern __typeof (xmlTextReaderConstString) xmlTextReaderConstString __attribute((alias("xmlTextReaderConstString__internal_alias"))); -#else -#ifndef xmlTextReaderConstString -extern __typeof (xmlTextReaderConstString) xmlTextReaderConstString__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstString xmlTextReaderConstString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstValue -extern __typeof (xmlTextReaderConstValue) xmlTextReaderConstValue __attribute((alias("xmlTextReaderConstValue__internal_alias"))); -#else -#ifndef xmlTextReaderConstValue -extern __typeof (xmlTextReaderConstValue) xmlTextReaderConstValue__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstValue xmlTextReaderConstValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstXmlLang -extern __typeof (xmlTextReaderConstXmlLang) xmlTextReaderConstXmlLang __attribute((alias("xmlTextReaderConstXmlLang__internal_alias"))); -#else -#ifndef xmlTextReaderConstXmlLang -extern __typeof (xmlTextReaderConstXmlLang) xmlTextReaderConstXmlLang__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstXmlLang xmlTextReaderConstXmlLang__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderConstXmlVersion -extern __typeof (xmlTextReaderConstXmlVersion) xmlTextReaderConstXmlVersion __attribute((alias("xmlTextReaderConstXmlVersion__internal_alias"))); -#else -#ifndef xmlTextReaderConstXmlVersion -extern __typeof (xmlTextReaderConstXmlVersion) xmlTextReaderConstXmlVersion__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderConstXmlVersion xmlTextReaderConstXmlVersion__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderCurrentDoc -extern __typeof (xmlTextReaderCurrentDoc) xmlTextReaderCurrentDoc __attribute((alias("xmlTextReaderCurrentDoc__internal_alias"))); -#else -#ifndef xmlTextReaderCurrentDoc -extern __typeof (xmlTextReaderCurrentDoc) xmlTextReaderCurrentDoc__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderCurrentDoc xmlTextReaderCurrentDoc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderCurrentNode -extern __typeof (xmlTextReaderCurrentNode) xmlTextReaderCurrentNode __attribute((alias("xmlTextReaderCurrentNode__internal_alias"))); -#else -#ifndef xmlTextReaderCurrentNode -extern __typeof (xmlTextReaderCurrentNode) xmlTextReaderCurrentNode__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderCurrentNode xmlTextReaderCurrentNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderDepth -extern __typeof (xmlTextReaderDepth) xmlTextReaderDepth __attribute((alias("xmlTextReaderDepth__internal_alias"))); -#else -#ifndef xmlTextReaderDepth -extern __typeof (xmlTextReaderDepth) xmlTextReaderDepth__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderDepth xmlTextReaderDepth__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderExpand -extern __typeof (xmlTextReaderExpand) xmlTextReaderExpand __attribute((alias("xmlTextReaderExpand__internal_alias"))); -#else -#ifndef xmlTextReaderExpand -extern __typeof (xmlTextReaderExpand) xmlTextReaderExpand__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderExpand xmlTextReaderExpand__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderGetAttribute -extern __typeof (xmlTextReaderGetAttribute) xmlTextReaderGetAttribute __attribute((alias("xmlTextReaderGetAttribute__internal_alias"))); -#else -#ifndef xmlTextReaderGetAttribute -extern __typeof (xmlTextReaderGetAttribute) xmlTextReaderGetAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderGetAttribute xmlTextReaderGetAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderGetAttributeNo -extern __typeof (xmlTextReaderGetAttributeNo) xmlTextReaderGetAttributeNo __attribute((alias("xmlTextReaderGetAttributeNo__internal_alias"))); -#else -#ifndef xmlTextReaderGetAttributeNo -extern __typeof (xmlTextReaderGetAttributeNo) xmlTextReaderGetAttributeNo__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderGetAttributeNo xmlTextReaderGetAttributeNo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderGetAttributeNs -extern __typeof (xmlTextReaderGetAttributeNs) xmlTextReaderGetAttributeNs __attribute((alias("xmlTextReaderGetAttributeNs__internal_alias"))); -#else -#ifndef xmlTextReaderGetAttributeNs -extern __typeof (xmlTextReaderGetAttributeNs) xmlTextReaderGetAttributeNs__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderGetAttributeNs xmlTextReaderGetAttributeNs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderGetErrorHandler -extern __typeof (xmlTextReaderGetErrorHandler) xmlTextReaderGetErrorHandler __attribute((alias("xmlTextReaderGetErrorHandler__internal_alias"))); -#else -#ifndef xmlTextReaderGetErrorHandler -extern __typeof (xmlTextReaderGetErrorHandler) xmlTextReaderGetErrorHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderGetErrorHandler xmlTextReaderGetErrorHandler__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderGetParserColumnNumber -extern __typeof (xmlTextReaderGetParserColumnNumber) xmlTextReaderGetParserColumnNumber __attribute((alias("xmlTextReaderGetParserColumnNumber__internal_alias"))); -#else -#ifndef xmlTextReaderGetParserColumnNumber -extern __typeof (xmlTextReaderGetParserColumnNumber) xmlTextReaderGetParserColumnNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderGetParserColumnNumber xmlTextReaderGetParserColumnNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderGetParserLineNumber -extern __typeof (xmlTextReaderGetParserLineNumber) xmlTextReaderGetParserLineNumber __attribute((alias("xmlTextReaderGetParserLineNumber__internal_alias"))); -#else -#ifndef xmlTextReaderGetParserLineNumber -extern __typeof (xmlTextReaderGetParserLineNumber) xmlTextReaderGetParserLineNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderGetParserLineNumber xmlTextReaderGetParserLineNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderGetParserProp -extern __typeof (xmlTextReaderGetParserProp) xmlTextReaderGetParserProp __attribute((alias("xmlTextReaderGetParserProp__internal_alias"))); -#else -#ifndef xmlTextReaderGetParserProp -extern __typeof (xmlTextReaderGetParserProp) xmlTextReaderGetParserProp__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderGetParserProp xmlTextReaderGetParserProp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderGetRemainder -extern __typeof (xmlTextReaderGetRemainder) xmlTextReaderGetRemainder __attribute((alias("xmlTextReaderGetRemainder__internal_alias"))); -#else -#ifndef xmlTextReaderGetRemainder -extern __typeof (xmlTextReaderGetRemainder) xmlTextReaderGetRemainder__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderGetRemainder xmlTextReaderGetRemainder__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderHasAttributes -extern __typeof (xmlTextReaderHasAttributes) xmlTextReaderHasAttributes __attribute((alias("xmlTextReaderHasAttributes__internal_alias"))); -#else -#ifndef xmlTextReaderHasAttributes -extern __typeof (xmlTextReaderHasAttributes) xmlTextReaderHasAttributes__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderHasAttributes xmlTextReaderHasAttributes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderHasValue -extern __typeof (xmlTextReaderHasValue) xmlTextReaderHasValue __attribute((alias("xmlTextReaderHasValue__internal_alias"))); -#else -#ifndef xmlTextReaderHasValue -extern __typeof (xmlTextReaderHasValue) xmlTextReaderHasValue__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderHasValue xmlTextReaderHasValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderIsDefault -extern __typeof (xmlTextReaderIsDefault) xmlTextReaderIsDefault __attribute((alias("xmlTextReaderIsDefault__internal_alias"))); -#else -#ifndef xmlTextReaderIsDefault -extern __typeof (xmlTextReaderIsDefault) xmlTextReaderIsDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderIsDefault xmlTextReaderIsDefault__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderIsEmptyElement -extern __typeof (xmlTextReaderIsEmptyElement) xmlTextReaderIsEmptyElement __attribute((alias("xmlTextReaderIsEmptyElement__internal_alias"))); -#else -#ifndef xmlTextReaderIsEmptyElement -extern __typeof (xmlTextReaderIsEmptyElement) xmlTextReaderIsEmptyElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderIsEmptyElement xmlTextReaderIsEmptyElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderIsNamespaceDecl -extern __typeof (xmlTextReaderIsNamespaceDecl) xmlTextReaderIsNamespaceDecl __attribute((alias("xmlTextReaderIsNamespaceDecl__internal_alias"))); -#else -#ifndef xmlTextReaderIsNamespaceDecl -extern __typeof (xmlTextReaderIsNamespaceDecl) xmlTextReaderIsNamespaceDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderIsNamespaceDecl xmlTextReaderIsNamespaceDecl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderIsValid -extern __typeof (xmlTextReaderIsValid) xmlTextReaderIsValid __attribute((alias("xmlTextReaderIsValid__internal_alias"))); -#else -#ifndef xmlTextReaderIsValid -extern __typeof (xmlTextReaderIsValid) xmlTextReaderIsValid__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderIsValid xmlTextReaderIsValid__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderLocalName -extern __typeof (xmlTextReaderLocalName) xmlTextReaderLocalName __attribute((alias("xmlTextReaderLocalName__internal_alias"))); -#else -#ifndef xmlTextReaderLocalName -extern __typeof (xmlTextReaderLocalName) xmlTextReaderLocalName__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderLocalName xmlTextReaderLocalName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderLocatorBaseURI -extern __typeof (xmlTextReaderLocatorBaseURI) xmlTextReaderLocatorBaseURI __attribute((alias("xmlTextReaderLocatorBaseURI__internal_alias"))); -#else -#ifndef xmlTextReaderLocatorBaseURI -extern __typeof (xmlTextReaderLocatorBaseURI) xmlTextReaderLocatorBaseURI__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderLocatorBaseURI xmlTextReaderLocatorBaseURI__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderLocatorLineNumber -extern __typeof (xmlTextReaderLocatorLineNumber) xmlTextReaderLocatorLineNumber __attribute((alias("xmlTextReaderLocatorLineNumber__internal_alias"))); -#else -#ifndef xmlTextReaderLocatorLineNumber -extern __typeof (xmlTextReaderLocatorLineNumber) xmlTextReaderLocatorLineNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderLocatorLineNumber xmlTextReaderLocatorLineNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderLookupNamespace -extern __typeof (xmlTextReaderLookupNamespace) xmlTextReaderLookupNamespace __attribute((alias("xmlTextReaderLookupNamespace__internal_alias"))); -#else -#ifndef xmlTextReaderLookupNamespace -extern __typeof (xmlTextReaderLookupNamespace) xmlTextReaderLookupNamespace__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderLookupNamespace xmlTextReaderLookupNamespace__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderMoveToAttribute -extern __typeof (xmlTextReaderMoveToAttribute) xmlTextReaderMoveToAttribute __attribute((alias("xmlTextReaderMoveToAttribute__internal_alias"))); -#else -#ifndef xmlTextReaderMoveToAttribute -extern __typeof (xmlTextReaderMoveToAttribute) xmlTextReaderMoveToAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderMoveToAttribute xmlTextReaderMoveToAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderMoveToAttributeNo -extern __typeof (xmlTextReaderMoveToAttributeNo) xmlTextReaderMoveToAttributeNo __attribute((alias("xmlTextReaderMoveToAttributeNo__internal_alias"))); -#else -#ifndef xmlTextReaderMoveToAttributeNo -extern __typeof (xmlTextReaderMoveToAttributeNo) xmlTextReaderMoveToAttributeNo__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderMoveToAttributeNo xmlTextReaderMoveToAttributeNo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderMoveToAttributeNs -extern __typeof (xmlTextReaderMoveToAttributeNs) xmlTextReaderMoveToAttributeNs __attribute((alias("xmlTextReaderMoveToAttributeNs__internal_alias"))); -#else -#ifndef xmlTextReaderMoveToAttributeNs -extern __typeof (xmlTextReaderMoveToAttributeNs) xmlTextReaderMoveToAttributeNs__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderMoveToAttributeNs xmlTextReaderMoveToAttributeNs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderMoveToElement -extern __typeof (xmlTextReaderMoveToElement) xmlTextReaderMoveToElement __attribute((alias("xmlTextReaderMoveToElement__internal_alias"))); -#else -#ifndef xmlTextReaderMoveToElement -extern __typeof (xmlTextReaderMoveToElement) xmlTextReaderMoveToElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderMoveToElement xmlTextReaderMoveToElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderMoveToFirstAttribute -extern __typeof (xmlTextReaderMoveToFirstAttribute) xmlTextReaderMoveToFirstAttribute __attribute((alias("xmlTextReaderMoveToFirstAttribute__internal_alias"))); -#else -#ifndef xmlTextReaderMoveToFirstAttribute -extern __typeof (xmlTextReaderMoveToFirstAttribute) xmlTextReaderMoveToFirstAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderMoveToFirstAttribute xmlTextReaderMoveToFirstAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderMoveToNextAttribute -extern __typeof (xmlTextReaderMoveToNextAttribute) xmlTextReaderMoveToNextAttribute __attribute((alias("xmlTextReaderMoveToNextAttribute__internal_alias"))); -#else -#ifndef xmlTextReaderMoveToNextAttribute -extern __typeof (xmlTextReaderMoveToNextAttribute) xmlTextReaderMoveToNextAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderMoveToNextAttribute xmlTextReaderMoveToNextAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderName -extern __typeof (xmlTextReaderName) xmlTextReaderName __attribute((alias("xmlTextReaderName__internal_alias"))); -#else -#ifndef xmlTextReaderName -extern __typeof (xmlTextReaderName) xmlTextReaderName__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderName xmlTextReaderName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderNamespaceUri -extern __typeof (xmlTextReaderNamespaceUri) xmlTextReaderNamespaceUri __attribute((alias("xmlTextReaderNamespaceUri__internal_alias"))); -#else -#ifndef xmlTextReaderNamespaceUri -extern __typeof (xmlTextReaderNamespaceUri) xmlTextReaderNamespaceUri__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderNamespaceUri xmlTextReaderNamespaceUri__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderNext -extern __typeof (xmlTextReaderNext) xmlTextReaderNext __attribute((alias("xmlTextReaderNext__internal_alias"))); -#else -#ifndef xmlTextReaderNext -extern __typeof (xmlTextReaderNext) xmlTextReaderNext__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderNext xmlTextReaderNext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderNextSibling -extern __typeof (xmlTextReaderNextSibling) xmlTextReaderNextSibling __attribute((alias("xmlTextReaderNextSibling__internal_alias"))); -#else -#ifndef xmlTextReaderNextSibling -extern __typeof (xmlTextReaderNextSibling) xmlTextReaderNextSibling__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderNextSibling xmlTextReaderNextSibling__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderNodeType -extern __typeof (xmlTextReaderNodeType) xmlTextReaderNodeType __attribute((alias("xmlTextReaderNodeType__internal_alias"))); -#else -#ifndef xmlTextReaderNodeType -extern __typeof (xmlTextReaderNodeType) xmlTextReaderNodeType__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderNodeType xmlTextReaderNodeType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderNormalization -extern __typeof (xmlTextReaderNormalization) xmlTextReaderNormalization __attribute((alias("xmlTextReaderNormalization__internal_alias"))); -#else -#ifndef xmlTextReaderNormalization -extern __typeof (xmlTextReaderNormalization) xmlTextReaderNormalization__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderNormalization xmlTextReaderNormalization__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderPrefix -extern __typeof (xmlTextReaderPrefix) xmlTextReaderPrefix __attribute((alias("xmlTextReaderPrefix__internal_alias"))); -#else -#ifndef xmlTextReaderPrefix -extern __typeof (xmlTextReaderPrefix) xmlTextReaderPrefix__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderPrefix xmlTextReaderPrefix__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderPreserve -extern __typeof (xmlTextReaderPreserve) xmlTextReaderPreserve __attribute((alias("xmlTextReaderPreserve__internal_alias"))); -#else -#ifndef xmlTextReaderPreserve -extern __typeof (xmlTextReaderPreserve) xmlTextReaderPreserve__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderPreserve xmlTextReaderPreserve__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderPreservePattern -extern __typeof (xmlTextReaderPreservePattern) xmlTextReaderPreservePattern __attribute((alias("xmlTextReaderPreservePattern__internal_alias"))); -#else -#ifndef xmlTextReaderPreservePattern -extern __typeof (xmlTextReaderPreservePattern) xmlTextReaderPreservePattern__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderPreservePattern xmlTextReaderPreservePattern__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderQuoteChar -extern __typeof (xmlTextReaderQuoteChar) xmlTextReaderQuoteChar __attribute((alias("xmlTextReaderQuoteChar__internal_alias"))); -#else -#ifndef xmlTextReaderQuoteChar -extern __typeof (xmlTextReaderQuoteChar) xmlTextReaderQuoteChar__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderQuoteChar xmlTextReaderQuoteChar__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderRead -extern __typeof (xmlTextReaderRead) xmlTextReaderRead __attribute((alias("xmlTextReaderRead__internal_alias"))); -#else -#ifndef xmlTextReaderRead -extern __typeof (xmlTextReaderRead) xmlTextReaderRead__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderRead xmlTextReaderRead__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderReadAttributeValue -extern __typeof (xmlTextReaderReadAttributeValue) xmlTextReaderReadAttributeValue __attribute((alias("xmlTextReaderReadAttributeValue__internal_alias"))); -#else -#ifndef xmlTextReaderReadAttributeValue -extern __typeof (xmlTextReaderReadAttributeValue) xmlTextReaderReadAttributeValue__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderReadAttributeValue xmlTextReaderReadAttributeValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderReadInnerXml -extern __typeof (xmlTextReaderReadInnerXml) xmlTextReaderReadInnerXml __attribute((alias("xmlTextReaderReadInnerXml__internal_alias"))); -#else -#ifndef xmlTextReaderReadInnerXml -extern __typeof (xmlTextReaderReadInnerXml) xmlTextReaderReadInnerXml__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderReadInnerXml xmlTextReaderReadInnerXml__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderReadOuterXml -extern __typeof (xmlTextReaderReadOuterXml) xmlTextReaderReadOuterXml __attribute((alias("xmlTextReaderReadOuterXml__internal_alias"))); -#else -#ifndef xmlTextReaderReadOuterXml -extern __typeof (xmlTextReaderReadOuterXml) xmlTextReaderReadOuterXml__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderReadOuterXml xmlTextReaderReadOuterXml__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderReadState -extern __typeof (xmlTextReaderReadState) xmlTextReaderReadState __attribute((alias("xmlTextReaderReadState__internal_alias"))); -#else -#ifndef xmlTextReaderReadState -extern __typeof (xmlTextReaderReadState) xmlTextReaderReadState__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderReadState xmlTextReaderReadState__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderReadString -extern __typeof (xmlTextReaderReadString) xmlTextReaderReadString __attribute((alias("xmlTextReaderReadString__internal_alias"))); -#else -#ifndef xmlTextReaderReadString -extern __typeof (xmlTextReaderReadString) xmlTextReaderReadString__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderReadString xmlTextReaderReadString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderRelaxNGSetSchema -extern __typeof (xmlTextReaderRelaxNGSetSchema) xmlTextReaderRelaxNGSetSchema __attribute((alias("xmlTextReaderRelaxNGSetSchema__internal_alias"))); -#else -#ifndef xmlTextReaderRelaxNGSetSchema -extern __typeof (xmlTextReaderRelaxNGSetSchema) xmlTextReaderRelaxNGSetSchema__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderRelaxNGSetSchema xmlTextReaderRelaxNGSetSchema__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderRelaxNGValidate -extern __typeof (xmlTextReaderRelaxNGValidate) xmlTextReaderRelaxNGValidate __attribute((alias("xmlTextReaderRelaxNGValidate__internal_alias"))); -#else -#ifndef xmlTextReaderRelaxNGValidate -extern __typeof (xmlTextReaderRelaxNGValidate) xmlTextReaderRelaxNGValidate__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderRelaxNGValidate xmlTextReaderRelaxNGValidate__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderSchemaValidate -extern __typeof (xmlTextReaderSchemaValidate) xmlTextReaderSchemaValidate __attribute((alias("xmlTextReaderSchemaValidate__internal_alias"))); -#else -#ifndef xmlTextReaderSchemaValidate -extern __typeof (xmlTextReaderSchemaValidate) xmlTextReaderSchemaValidate__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderSchemaValidate xmlTextReaderSchemaValidate__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderSchemaValidateCtxt -extern __typeof (xmlTextReaderSchemaValidateCtxt) xmlTextReaderSchemaValidateCtxt __attribute((alias("xmlTextReaderSchemaValidateCtxt__internal_alias"))); -#else -#ifndef xmlTextReaderSchemaValidateCtxt -extern __typeof (xmlTextReaderSchemaValidateCtxt) xmlTextReaderSchemaValidateCtxt__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderSchemaValidateCtxt xmlTextReaderSchemaValidateCtxt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderSetErrorHandler -extern __typeof (xmlTextReaderSetErrorHandler) xmlTextReaderSetErrorHandler __attribute((alias("xmlTextReaderSetErrorHandler__internal_alias"))); -#else -#ifndef xmlTextReaderSetErrorHandler -extern __typeof (xmlTextReaderSetErrorHandler) xmlTextReaderSetErrorHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderSetErrorHandler xmlTextReaderSetErrorHandler__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderSetParserProp -extern __typeof (xmlTextReaderSetParserProp) xmlTextReaderSetParserProp __attribute((alias("xmlTextReaderSetParserProp__internal_alias"))); -#else -#ifndef xmlTextReaderSetParserProp -extern __typeof (xmlTextReaderSetParserProp) xmlTextReaderSetParserProp__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderSetParserProp xmlTextReaderSetParserProp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderSetSchema -extern __typeof (xmlTextReaderSetSchema) xmlTextReaderSetSchema __attribute((alias("xmlTextReaderSetSchema__internal_alias"))); -#else -#ifndef xmlTextReaderSetSchema -extern __typeof (xmlTextReaderSetSchema) xmlTextReaderSetSchema__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderSetSchema xmlTextReaderSetSchema__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderSetStructuredErrorHandler -extern __typeof (xmlTextReaderSetStructuredErrorHandler) xmlTextReaderSetStructuredErrorHandler __attribute((alias("xmlTextReaderSetStructuredErrorHandler__internal_alias"))); -#else -#ifndef xmlTextReaderSetStructuredErrorHandler -extern __typeof (xmlTextReaderSetStructuredErrorHandler) xmlTextReaderSetStructuredErrorHandler__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderSetStructuredErrorHandler xmlTextReaderSetStructuredErrorHandler__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderStandalone -extern __typeof (xmlTextReaderStandalone) xmlTextReaderStandalone __attribute((alias("xmlTextReaderStandalone__internal_alias"))); -#else -#ifndef xmlTextReaderStandalone -extern __typeof (xmlTextReaderStandalone) xmlTextReaderStandalone__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderStandalone xmlTextReaderStandalone__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderValue -extern __typeof (xmlTextReaderValue) xmlTextReaderValue __attribute((alias("xmlTextReaderValue__internal_alias"))); -#else -#ifndef xmlTextReaderValue -extern __typeof (xmlTextReaderValue) xmlTextReaderValue__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderValue xmlTextReaderValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_READER_ENABLED) -#ifdef bottom_xmlreader -#undef xmlTextReaderXmlLang -extern __typeof (xmlTextReaderXmlLang) xmlTextReaderXmlLang __attribute((alias("xmlTextReaderXmlLang__internal_alias"))); -#else -#ifndef xmlTextReaderXmlLang -extern __typeof (xmlTextReaderXmlLang) xmlTextReaderXmlLang__internal_alias __attribute((visibility("hidden"))); -#define xmlTextReaderXmlLang xmlTextReaderXmlLang__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndAttribute -extern __typeof (xmlTextWriterEndAttribute) xmlTextWriterEndAttribute __attribute((alias("xmlTextWriterEndAttribute__internal_alias"))); -#else -#ifndef xmlTextWriterEndAttribute -extern __typeof (xmlTextWriterEndAttribute) xmlTextWriterEndAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndAttribute xmlTextWriterEndAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndCDATA -extern __typeof (xmlTextWriterEndCDATA) xmlTextWriterEndCDATA __attribute((alias("xmlTextWriterEndCDATA__internal_alias"))); -#else -#ifndef xmlTextWriterEndCDATA -extern __typeof (xmlTextWriterEndCDATA) xmlTextWriterEndCDATA__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndCDATA xmlTextWriterEndCDATA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndComment -extern __typeof (xmlTextWriterEndComment) xmlTextWriterEndComment __attribute((alias("xmlTextWriterEndComment__internal_alias"))); -#else -#ifndef xmlTextWriterEndComment -extern __typeof (xmlTextWriterEndComment) xmlTextWriterEndComment__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndComment xmlTextWriterEndComment__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndDTD -extern __typeof (xmlTextWriterEndDTD) xmlTextWriterEndDTD __attribute((alias("xmlTextWriterEndDTD__internal_alias"))); -#else -#ifndef xmlTextWriterEndDTD -extern __typeof (xmlTextWriterEndDTD) xmlTextWriterEndDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndDTD xmlTextWriterEndDTD__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndDTDAttlist -extern __typeof (xmlTextWriterEndDTDAttlist) xmlTextWriterEndDTDAttlist __attribute((alias("xmlTextWriterEndDTDAttlist__internal_alias"))); -#else -#ifndef xmlTextWriterEndDTDAttlist -extern __typeof (xmlTextWriterEndDTDAttlist) xmlTextWriterEndDTDAttlist__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndDTDAttlist xmlTextWriterEndDTDAttlist__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndDTDElement -extern __typeof (xmlTextWriterEndDTDElement) xmlTextWriterEndDTDElement __attribute((alias("xmlTextWriterEndDTDElement__internal_alias"))); -#else -#ifndef xmlTextWriterEndDTDElement -extern __typeof (xmlTextWriterEndDTDElement) xmlTextWriterEndDTDElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndDTDElement xmlTextWriterEndDTDElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndDTDEntity -extern __typeof (xmlTextWriterEndDTDEntity) xmlTextWriterEndDTDEntity __attribute((alias("xmlTextWriterEndDTDEntity__internal_alias"))); -#else -#ifndef xmlTextWriterEndDTDEntity -extern __typeof (xmlTextWriterEndDTDEntity) xmlTextWriterEndDTDEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndDTDEntity xmlTextWriterEndDTDEntity__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndDocument -extern __typeof (xmlTextWriterEndDocument) xmlTextWriterEndDocument __attribute((alias("xmlTextWriterEndDocument__internal_alias"))); -#else -#ifndef xmlTextWriterEndDocument -extern __typeof (xmlTextWriterEndDocument) xmlTextWriterEndDocument__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndDocument xmlTextWriterEndDocument__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndElement -extern __typeof (xmlTextWriterEndElement) xmlTextWriterEndElement __attribute((alias("xmlTextWriterEndElement__internal_alias"))); -#else -#ifndef xmlTextWriterEndElement -extern __typeof (xmlTextWriterEndElement) xmlTextWriterEndElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndElement xmlTextWriterEndElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterEndPI -extern __typeof (xmlTextWriterEndPI) xmlTextWriterEndPI __attribute((alias("xmlTextWriterEndPI__internal_alias"))); -#else -#ifndef xmlTextWriterEndPI -extern __typeof (xmlTextWriterEndPI) xmlTextWriterEndPI__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterEndPI xmlTextWriterEndPI__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterFlush -extern __typeof (xmlTextWriterFlush) xmlTextWriterFlush __attribute((alias("xmlTextWriterFlush__internal_alias"))); -#else -#ifndef xmlTextWriterFlush -extern __typeof (xmlTextWriterFlush) xmlTextWriterFlush__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterFlush xmlTextWriterFlush__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterFullEndElement -extern __typeof (xmlTextWriterFullEndElement) xmlTextWriterFullEndElement __attribute((alias("xmlTextWriterFullEndElement__internal_alias"))); -#else -#ifndef xmlTextWriterFullEndElement -extern __typeof (xmlTextWriterFullEndElement) xmlTextWriterFullEndElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterFullEndElement xmlTextWriterFullEndElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterSetIndent -extern __typeof (xmlTextWriterSetIndent) xmlTextWriterSetIndent __attribute((alias("xmlTextWriterSetIndent__internal_alias"))); -#else -#ifndef xmlTextWriterSetIndent -extern __typeof (xmlTextWriterSetIndent) xmlTextWriterSetIndent__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterSetIndent xmlTextWriterSetIndent__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterSetIndentString -extern __typeof (xmlTextWriterSetIndentString) xmlTextWriterSetIndentString __attribute((alias("xmlTextWriterSetIndentString__internal_alias"))); -#else -#ifndef xmlTextWriterSetIndentString -extern __typeof (xmlTextWriterSetIndentString) xmlTextWriterSetIndentString__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterSetIndentString xmlTextWriterSetIndentString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartAttribute -extern __typeof (xmlTextWriterStartAttribute) xmlTextWriterStartAttribute __attribute((alias("xmlTextWriterStartAttribute__internal_alias"))); -#else -#ifndef xmlTextWriterStartAttribute -extern __typeof (xmlTextWriterStartAttribute) xmlTextWriterStartAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartAttribute xmlTextWriterStartAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartAttributeNS -extern __typeof (xmlTextWriterStartAttributeNS) xmlTextWriterStartAttributeNS __attribute((alias("xmlTextWriterStartAttributeNS__internal_alias"))); -#else -#ifndef xmlTextWriterStartAttributeNS -extern __typeof (xmlTextWriterStartAttributeNS) xmlTextWriterStartAttributeNS__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartAttributeNS xmlTextWriterStartAttributeNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartCDATA -extern __typeof (xmlTextWriterStartCDATA) xmlTextWriterStartCDATA __attribute((alias("xmlTextWriterStartCDATA__internal_alias"))); -#else -#ifndef xmlTextWriterStartCDATA -extern __typeof (xmlTextWriterStartCDATA) xmlTextWriterStartCDATA__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartCDATA xmlTextWriterStartCDATA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartComment -extern __typeof (xmlTextWriterStartComment) xmlTextWriterStartComment __attribute((alias("xmlTextWriterStartComment__internal_alias"))); -#else -#ifndef xmlTextWriterStartComment -extern __typeof (xmlTextWriterStartComment) xmlTextWriterStartComment__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartComment xmlTextWriterStartComment__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartDTD -extern __typeof (xmlTextWriterStartDTD) xmlTextWriterStartDTD __attribute((alias("xmlTextWriterStartDTD__internal_alias"))); -#else -#ifndef xmlTextWriterStartDTD -extern __typeof (xmlTextWriterStartDTD) xmlTextWriterStartDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartDTD xmlTextWriterStartDTD__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartDTDAttlist -extern __typeof (xmlTextWriterStartDTDAttlist) xmlTextWriterStartDTDAttlist __attribute((alias("xmlTextWriterStartDTDAttlist__internal_alias"))); -#else -#ifndef xmlTextWriterStartDTDAttlist -extern __typeof (xmlTextWriterStartDTDAttlist) xmlTextWriterStartDTDAttlist__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartDTDAttlist xmlTextWriterStartDTDAttlist__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartDTDElement -extern __typeof (xmlTextWriterStartDTDElement) xmlTextWriterStartDTDElement __attribute((alias("xmlTextWriterStartDTDElement__internal_alias"))); -#else -#ifndef xmlTextWriterStartDTDElement -extern __typeof (xmlTextWriterStartDTDElement) xmlTextWriterStartDTDElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartDTDElement xmlTextWriterStartDTDElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartDTDEntity -extern __typeof (xmlTextWriterStartDTDEntity) xmlTextWriterStartDTDEntity __attribute((alias("xmlTextWriterStartDTDEntity__internal_alias"))); -#else -#ifndef xmlTextWriterStartDTDEntity -extern __typeof (xmlTextWriterStartDTDEntity) xmlTextWriterStartDTDEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartDTDEntity xmlTextWriterStartDTDEntity__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartDocument -extern __typeof (xmlTextWriterStartDocument) xmlTextWriterStartDocument __attribute((alias("xmlTextWriterStartDocument__internal_alias"))); -#else -#ifndef xmlTextWriterStartDocument -extern __typeof (xmlTextWriterStartDocument) xmlTextWriterStartDocument__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartDocument xmlTextWriterStartDocument__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartElement -extern __typeof (xmlTextWriterStartElement) xmlTextWriterStartElement __attribute((alias("xmlTextWriterStartElement__internal_alias"))); -#else -#ifndef xmlTextWriterStartElement -extern __typeof (xmlTextWriterStartElement) xmlTextWriterStartElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartElement xmlTextWriterStartElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartElementNS -extern __typeof (xmlTextWriterStartElementNS) xmlTextWriterStartElementNS __attribute((alias("xmlTextWriterStartElementNS__internal_alias"))); -#else -#ifndef xmlTextWriterStartElementNS -extern __typeof (xmlTextWriterStartElementNS) xmlTextWriterStartElementNS__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartElementNS xmlTextWriterStartElementNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterStartPI -extern __typeof (xmlTextWriterStartPI) xmlTextWriterStartPI __attribute((alias("xmlTextWriterStartPI__internal_alias"))); -#else -#ifndef xmlTextWriterStartPI -extern __typeof (xmlTextWriterStartPI) xmlTextWriterStartPI__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterStartPI xmlTextWriterStartPI__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteAttribute -extern __typeof (xmlTextWriterWriteAttribute) xmlTextWriterWriteAttribute __attribute((alias("xmlTextWriterWriteAttribute__internal_alias"))); -#else -#ifndef xmlTextWriterWriteAttribute -extern __typeof (xmlTextWriterWriteAttribute) xmlTextWriterWriteAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteAttribute xmlTextWriterWriteAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteAttributeNS -extern __typeof (xmlTextWriterWriteAttributeNS) xmlTextWriterWriteAttributeNS __attribute((alias("xmlTextWriterWriteAttributeNS__internal_alias"))); -#else -#ifndef xmlTextWriterWriteAttributeNS -extern __typeof (xmlTextWriterWriteAttributeNS) xmlTextWriterWriteAttributeNS__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteAttributeNS xmlTextWriterWriteAttributeNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteBase64 -extern __typeof (xmlTextWriterWriteBase64) xmlTextWriterWriteBase64 __attribute((alias("xmlTextWriterWriteBase64__internal_alias"))); -#else -#ifndef xmlTextWriterWriteBase64 -extern __typeof (xmlTextWriterWriteBase64) xmlTextWriterWriteBase64__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteBase64 xmlTextWriterWriteBase64__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteBinHex -extern __typeof (xmlTextWriterWriteBinHex) xmlTextWriterWriteBinHex __attribute((alias("xmlTextWriterWriteBinHex__internal_alias"))); -#else -#ifndef xmlTextWriterWriteBinHex -extern __typeof (xmlTextWriterWriteBinHex) xmlTextWriterWriteBinHex__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteBinHex xmlTextWriterWriteBinHex__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteCDATA -extern __typeof (xmlTextWriterWriteCDATA) xmlTextWriterWriteCDATA __attribute((alias("xmlTextWriterWriteCDATA__internal_alias"))); -#else -#ifndef xmlTextWriterWriteCDATA -extern __typeof (xmlTextWriterWriteCDATA) xmlTextWriterWriteCDATA__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteCDATA xmlTextWriterWriteCDATA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteComment -extern __typeof (xmlTextWriterWriteComment) xmlTextWriterWriteComment __attribute((alias("xmlTextWriterWriteComment__internal_alias"))); -#else -#ifndef xmlTextWriterWriteComment -extern __typeof (xmlTextWriterWriteComment) xmlTextWriterWriteComment__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteComment xmlTextWriterWriteComment__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteDTD -extern __typeof (xmlTextWriterWriteDTD) xmlTextWriterWriteDTD __attribute((alias("xmlTextWriterWriteDTD__internal_alias"))); -#else -#ifndef xmlTextWriterWriteDTD -extern __typeof (xmlTextWriterWriteDTD) xmlTextWriterWriteDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteDTD xmlTextWriterWriteDTD__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteDTDAttlist -extern __typeof (xmlTextWriterWriteDTDAttlist) xmlTextWriterWriteDTDAttlist __attribute((alias("xmlTextWriterWriteDTDAttlist__internal_alias"))); -#else -#ifndef xmlTextWriterWriteDTDAttlist -extern __typeof (xmlTextWriterWriteDTDAttlist) xmlTextWriterWriteDTDAttlist__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteDTDAttlist xmlTextWriterWriteDTDAttlist__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteDTDElement -extern __typeof (xmlTextWriterWriteDTDElement) xmlTextWriterWriteDTDElement __attribute((alias("xmlTextWriterWriteDTDElement__internal_alias"))); -#else -#ifndef xmlTextWriterWriteDTDElement -extern __typeof (xmlTextWriterWriteDTDElement) xmlTextWriterWriteDTDElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteDTDElement xmlTextWriterWriteDTDElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteDTDEntity -extern __typeof (xmlTextWriterWriteDTDEntity) xmlTextWriterWriteDTDEntity __attribute((alias("xmlTextWriterWriteDTDEntity__internal_alias"))); -#else -#ifndef xmlTextWriterWriteDTDEntity -extern __typeof (xmlTextWriterWriteDTDEntity) xmlTextWriterWriteDTDEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteDTDEntity xmlTextWriterWriteDTDEntity__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteDTDExternalEntity -extern __typeof (xmlTextWriterWriteDTDExternalEntity) xmlTextWriterWriteDTDExternalEntity __attribute((alias("xmlTextWriterWriteDTDExternalEntity__internal_alias"))); -#else -#ifndef xmlTextWriterWriteDTDExternalEntity -extern __typeof (xmlTextWriterWriteDTDExternalEntity) xmlTextWriterWriteDTDExternalEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteDTDExternalEntity xmlTextWriterWriteDTDExternalEntity__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteDTDExternalEntityContents -extern __typeof (xmlTextWriterWriteDTDExternalEntityContents) xmlTextWriterWriteDTDExternalEntityContents __attribute((alias("xmlTextWriterWriteDTDExternalEntityContents__internal_alias"))); -#else -#ifndef xmlTextWriterWriteDTDExternalEntityContents -extern __typeof (xmlTextWriterWriteDTDExternalEntityContents) xmlTextWriterWriteDTDExternalEntityContents__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteDTDExternalEntityContents xmlTextWriterWriteDTDExternalEntityContents__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteDTDInternalEntity -extern __typeof (xmlTextWriterWriteDTDInternalEntity) xmlTextWriterWriteDTDInternalEntity __attribute((alias("xmlTextWriterWriteDTDInternalEntity__internal_alias"))); -#else -#ifndef xmlTextWriterWriteDTDInternalEntity -extern __typeof (xmlTextWriterWriteDTDInternalEntity) xmlTextWriterWriteDTDInternalEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteDTDInternalEntity xmlTextWriterWriteDTDInternalEntity__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteDTDNotation -extern __typeof (xmlTextWriterWriteDTDNotation) xmlTextWriterWriteDTDNotation __attribute((alias("xmlTextWriterWriteDTDNotation__internal_alias"))); -#else -#ifndef xmlTextWriterWriteDTDNotation -extern __typeof (xmlTextWriterWriteDTDNotation) xmlTextWriterWriteDTDNotation__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteDTDNotation xmlTextWriterWriteDTDNotation__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteElement -extern __typeof (xmlTextWriterWriteElement) xmlTextWriterWriteElement __attribute((alias("xmlTextWriterWriteElement__internal_alias"))); -#else -#ifndef xmlTextWriterWriteElement -extern __typeof (xmlTextWriterWriteElement) xmlTextWriterWriteElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteElement xmlTextWriterWriteElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteElementNS -extern __typeof (xmlTextWriterWriteElementNS) xmlTextWriterWriteElementNS __attribute((alias("xmlTextWriterWriteElementNS__internal_alias"))); -#else -#ifndef xmlTextWriterWriteElementNS -extern __typeof (xmlTextWriterWriteElementNS) xmlTextWriterWriteElementNS__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteElementNS xmlTextWriterWriteElementNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatAttribute -extern __typeof (xmlTextWriterWriteFormatAttribute) xmlTextWriterWriteFormatAttribute __attribute((alias("xmlTextWriterWriteFormatAttribute__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatAttribute -extern __typeof (xmlTextWriterWriteFormatAttribute) xmlTextWriterWriteFormatAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatAttribute xmlTextWriterWriteFormatAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatAttributeNS -extern __typeof (xmlTextWriterWriteFormatAttributeNS) xmlTextWriterWriteFormatAttributeNS __attribute((alias("xmlTextWriterWriteFormatAttributeNS__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatAttributeNS -extern __typeof (xmlTextWriterWriteFormatAttributeNS) xmlTextWriterWriteFormatAttributeNS__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatAttributeNS xmlTextWriterWriteFormatAttributeNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatCDATA -extern __typeof (xmlTextWriterWriteFormatCDATA) xmlTextWriterWriteFormatCDATA __attribute((alias("xmlTextWriterWriteFormatCDATA__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatCDATA -extern __typeof (xmlTextWriterWriteFormatCDATA) xmlTextWriterWriteFormatCDATA__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatCDATA xmlTextWriterWriteFormatCDATA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatComment -extern __typeof (xmlTextWriterWriteFormatComment) xmlTextWriterWriteFormatComment __attribute((alias("xmlTextWriterWriteFormatComment__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatComment -extern __typeof (xmlTextWriterWriteFormatComment) xmlTextWriterWriteFormatComment__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatComment xmlTextWriterWriteFormatComment__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatDTD -extern __typeof (xmlTextWriterWriteFormatDTD) xmlTextWriterWriteFormatDTD __attribute((alias("xmlTextWriterWriteFormatDTD__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatDTD -extern __typeof (xmlTextWriterWriteFormatDTD) xmlTextWriterWriteFormatDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatDTD xmlTextWriterWriteFormatDTD__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatDTDAttlist -extern __typeof (xmlTextWriterWriteFormatDTDAttlist) xmlTextWriterWriteFormatDTDAttlist __attribute((alias("xmlTextWriterWriteFormatDTDAttlist__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatDTDAttlist -extern __typeof (xmlTextWriterWriteFormatDTDAttlist) xmlTextWriterWriteFormatDTDAttlist__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatDTDAttlist xmlTextWriterWriteFormatDTDAttlist__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatDTDElement -extern __typeof (xmlTextWriterWriteFormatDTDElement) xmlTextWriterWriteFormatDTDElement __attribute((alias("xmlTextWriterWriteFormatDTDElement__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatDTDElement -extern __typeof (xmlTextWriterWriteFormatDTDElement) xmlTextWriterWriteFormatDTDElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatDTDElement xmlTextWriterWriteFormatDTDElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatDTDInternalEntity -extern __typeof (xmlTextWriterWriteFormatDTDInternalEntity) xmlTextWriterWriteFormatDTDInternalEntity __attribute((alias("xmlTextWriterWriteFormatDTDInternalEntity__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatDTDInternalEntity -extern __typeof (xmlTextWriterWriteFormatDTDInternalEntity) xmlTextWriterWriteFormatDTDInternalEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatDTDInternalEntity xmlTextWriterWriteFormatDTDInternalEntity__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatElement -extern __typeof (xmlTextWriterWriteFormatElement) xmlTextWriterWriteFormatElement __attribute((alias("xmlTextWriterWriteFormatElement__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatElement -extern __typeof (xmlTextWriterWriteFormatElement) xmlTextWriterWriteFormatElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatElement xmlTextWriterWriteFormatElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatElementNS -extern __typeof (xmlTextWriterWriteFormatElementNS) xmlTextWriterWriteFormatElementNS __attribute((alias("xmlTextWriterWriteFormatElementNS__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatElementNS -extern __typeof (xmlTextWriterWriteFormatElementNS) xmlTextWriterWriteFormatElementNS__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatElementNS xmlTextWriterWriteFormatElementNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatPI -extern __typeof (xmlTextWriterWriteFormatPI) xmlTextWriterWriteFormatPI __attribute((alias("xmlTextWriterWriteFormatPI__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatPI -extern __typeof (xmlTextWriterWriteFormatPI) xmlTextWriterWriteFormatPI__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatPI xmlTextWriterWriteFormatPI__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatRaw -extern __typeof (xmlTextWriterWriteFormatRaw) xmlTextWriterWriteFormatRaw __attribute((alias("xmlTextWriterWriteFormatRaw__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatRaw -extern __typeof (xmlTextWriterWriteFormatRaw) xmlTextWriterWriteFormatRaw__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatRaw xmlTextWriterWriteFormatRaw__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteFormatString -extern __typeof (xmlTextWriterWriteFormatString) xmlTextWriterWriteFormatString __attribute((alias("xmlTextWriterWriteFormatString__internal_alias"))); -#else -#ifndef xmlTextWriterWriteFormatString -extern __typeof (xmlTextWriterWriteFormatString) xmlTextWriterWriteFormatString__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteFormatString xmlTextWriterWriteFormatString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWritePI -extern __typeof (xmlTextWriterWritePI) xmlTextWriterWritePI __attribute((alias("xmlTextWriterWritePI__internal_alias"))); -#else -#ifndef xmlTextWriterWritePI -extern __typeof (xmlTextWriterWritePI) xmlTextWriterWritePI__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWritePI xmlTextWriterWritePI__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteRaw -extern __typeof (xmlTextWriterWriteRaw) xmlTextWriterWriteRaw __attribute((alias("xmlTextWriterWriteRaw__internal_alias"))); -#else -#ifndef xmlTextWriterWriteRaw -extern __typeof (xmlTextWriterWriteRaw) xmlTextWriterWriteRaw__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteRaw xmlTextWriterWriteRaw__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteRawLen -extern __typeof (xmlTextWriterWriteRawLen) xmlTextWriterWriteRawLen __attribute((alias("xmlTextWriterWriteRawLen__internal_alias"))); -#else -#ifndef xmlTextWriterWriteRawLen -extern __typeof (xmlTextWriterWriteRawLen) xmlTextWriterWriteRawLen__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteRawLen xmlTextWriterWriteRawLen__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteString -extern __typeof (xmlTextWriterWriteString) xmlTextWriterWriteString __attribute((alias("xmlTextWriterWriteString__internal_alias"))); -#else -#ifndef xmlTextWriterWriteString -extern __typeof (xmlTextWriterWriteString) xmlTextWriterWriteString__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteString xmlTextWriterWriteString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatAttribute -extern __typeof (xmlTextWriterWriteVFormatAttribute) xmlTextWriterWriteVFormatAttribute __attribute((alias("xmlTextWriterWriteVFormatAttribute__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatAttribute -extern __typeof (xmlTextWriterWriteVFormatAttribute) xmlTextWriterWriteVFormatAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatAttribute xmlTextWriterWriteVFormatAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatAttributeNS -extern __typeof (xmlTextWriterWriteVFormatAttributeNS) xmlTextWriterWriteVFormatAttributeNS __attribute((alias("xmlTextWriterWriteVFormatAttributeNS__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatAttributeNS -extern __typeof (xmlTextWriterWriteVFormatAttributeNS) xmlTextWriterWriteVFormatAttributeNS__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatAttributeNS xmlTextWriterWriteVFormatAttributeNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatCDATA -extern __typeof (xmlTextWriterWriteVFormatCDATA) xmlTextWriterWriteVFormatCDATA __attribute((alias("xmlTextWriterWriteVFormatCDATA__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatCDATA -extern __typeof (xmlTextWriterWriteVFormatCDATA) xmlTextWriterWriteVFormatCDATA__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatCDATA xmlTextWriterWriteVFormatCDATA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatComment -extern __typeof (xmlTextWriterWriteVFormatComment) xmlTextWriterWriteVFormatComment __attribute((alias("xmlTextWriterWriteVFormatComment__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatComment -extern __typeof (xmlTextWriterWriteVFormatComment) xmlTextWriterWriteVFormatComment__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatComment xmlTextWriterWriteVFormatComment__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatDTD -extern __typeof (xmlTextWriterWriteVFormatDTD) xmlTextWriterWriteVFormatDTD __attribute((alias("xmlTextWriterWriteVFormatDTD__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatDTD -extern __typeof (xmlTextWriterWriteVFormatDTD) xmlTextWriterWriteVFormatDTD__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatDTD xmlTextWriterWriteVFormatDTD__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatDTDAttlist -extern __typeof (xmlTextWriterWriteVFormatDTDAttlist) xmlTextWriterWriteVFormatDTDAttlist __attribute((alias("xmlTextWriterWriteVFormatDTDAttlist__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatDTDAttlist -extern __typeof (xmlTextWriterWriteVFormatDTDAttlist) xmlTextWriterWriteVFormatDTDAttlist__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatDTDAttlist xmlTextWriterWriteVFormatDTDAttlist__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatDTDElement -extern __typeof (xmlTextWriterWriteVFormatDTDElement) xmlTextWriterWriteVFormatDTDElement __attribute((alias("xmlTextWriterWriteVFormatDTDElement__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatDTDElement -extern __typeof (xmlTextWriterWriteVFormatDTDElement) xmlTextWriterWriteVFormatDTDElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatDTDElement xmlTextWriterWriteVFormatDTDElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatDTDInternalEntity -extern __typeof (xmlTextWriterWriteVFormatDTDInternalEntity) xmlTextWriterWriteVFormatDTDInternalEntity __attribute((alias("xmlTextWriterWriteVFormatDTDInternalEntity__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatDTDInternalEntity -extern __typeof (xmlTextWriterWriteVFormatDTDInternalEntity) xmlTextWriterWriteVFormatDTDInternalEntity__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatDTDInternalEntity xmlTextWriterWriteVFormatDTDInternalEntity__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatElement -extern __typeof (xmlTextWriterWriteVFormatElement) xmlTextWriterWriteVFormatElement __attribute((alias("xmlTextWriterWriteVFormatElement__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatElement -extern __typeof (xmlTextWriterWriteVFormatElement) xmlTextWriterWriteVFormatElement__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatElement xmlTextWriterWriteVFormatElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatElementNS -extern __typeof (xmlTextWriterWriteVFormatElementNS) xmlTextWriterWriteVFormatElementNS __attribute((alias("xmlTextWriterWriteVFormatElementNS__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatElementNS -extern __typeof (xmlTextWriterWriteVFormatElementNS) xmlTextWriterWriteVFormatElementNS__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatElementNS xmlTextWriterWriteVFormatElementNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatPI -extern __typeof (xmlTextWriterWriteVFormatPI) xmlTextWriterWriteVFormatPI __attribute((alias("xmlTextWriterWriteVFormatPI__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatPI -extern __typeof (xmlTextWriterWriteVFormatPI) xmlTextWriterWriteVFormatPI__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatPI xmlTextWriterWriteVFormatPI__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatRaw -extern __typeof (xmlTextWriterWriteVFormatRaw) xmlTextWriterWriteVFormatRaw __attribute((alias("xmlTextWriterWriteVFormatRaw__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatRaw -extern __typeof (xmlTextWriterWriteVFormatRaw) xmlTextWriterWriteVFormatRaw__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatRaw xmlTextWriterWriteVFormatRaw__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_WRITER_ENABLED) -#ifdef bottom_xmlwriter -#undef xmlTextWriterWriteVFormatString -extern __typeof (xmlTextWriterWriteVFormatString) xmlTextWriterWriteVFormatString __attribute((alias("xmlTextWriterWriteVFormatString__internal_alias"))); -#else -#ifndef xmlTextWriterWriteVFormatString -extern __typeof (xmlTextWriterWriteVFormatString) xmlTextWriterWriteVFormatString__internal_alias __attribute((visibility("hidden"))); -#define xmlTextWriterWriteVFormatString xmlTextWriterWriteVFormatString__internal_alias -#endif -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefBufferAllocScheme -extern __typeof (xmlThrDefBufferAllocScheme) xmlThrDefBufferAllocScheme __attribute((alias("xmlThrDefBufferAllocScheme__internal_alias"))); -#else -#ifndef xmlThrDefBufferAllocScheme -extern __typeof (xmlThrDefBufferAllocScheme) xmlThrDefBufferAllocScheme__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefBufferAllocScheme xmlThrDefBufferAllocScheme__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefDefaultBufferSize -extern __typeof (xmlThrDefDefaultBufferSize) xmlThrDefDefaultBufferSize __attribute((alias("xmlThrDefDefaultBufferSize__internal_alias"))); -#else -#ifndef xmlThrDefDefaultBufferSize -extern __typeof (xmlThrDefDefaultBufferSize) xmlThrDefDefaultBufferSize__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefDefaultBufferSize xmlThrDefDefaultBufferSize__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefDeregisterNodeDefault -extern __typeof (xmlThrDefDeregisterNodeDefault) xmlThrDefDeregisterNodeDefault __attribute((alias("xmlThrDefDeregisterNodeDefault__internal_alias"))); -#else -#ifndef xmlThrDefDeregisterNodeDefault -extern __typeof (xmlThrDefDeregisterNodeDefault) xmlThrDefDeregisterNodeDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefDeregisterNodeDefault xmlThrDefDeregisterNodeDefault__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefDoValidityCheckingDefaultValue -extern __typeof (xmlThrDefDoValidityCheckingDefaultValue) xmlThrDefDoValidityCheckingDefaultValue __attribute((alias("xmlThrDefDoValidityCheckingDefaultValue__internal_alias"))); -#else -#ifndef xmlThrDefDoValidityCheckingDefaultValue -extern __typeof (xmlThrDefDoValidityCheckingDefaultValue) xmlThrDefDoValidityCheckingDefaultValue__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefDoValidityCheckingDefaultValue xmlThrDefDoValidityCheckingDefaultValue__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefGetWarningsDefaultValue -extern __typeof (xmlThrDefGetWarningsDefaultValue) xmlThrDefGetWarningsDefaultValue __attribute((alias("xmlThrDefGetWarningsDefaultValue__internal_alias"))); -#else -#ifndef xmlThrDefGetWarningsDefaultValue -extern __typeof (xmlThrDefGetWarningsDefaultValue) xmlThrDefGetWarningsDefaultValue__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefGetWarningsDefaultValue xmlThrDefGetWarningsDefaultValue__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefIndentTreeOutput -extern __typeof (xmlThrDefIndentTreeOutput) xmlThrDefIndentTreeOutput __attribute((alias("xmlThrDefIndentTreeOutput__internal_alias"))); -#else -#ifndef xmlThrDefIndentTreeOutput -extern __typeof (xmlThrDefIndentTreeOutput) xmlThrDefIndentTreeOutput__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefIndentTreeOutput xmlThrDefIndentTreeOutput__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefKeepBlanksDefaultValue -extern __typeof (xmlThrDefKeepBlanksDefaultValue) xmlThrDefKeepBlanksDefaultValue __attribute((alias("xmlThrDefKeepBlanksDefaultValue__internal_alias"))); -#else -#ifndef xmlThrDefKeepBlanksDefaultValue -extern __typeof (xmlThrDefKeepBlanksDefaultValue) xmlThrDefKeepBlanksDefaultValue__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefKeepBlanksDefaultValue xmlThrDefKeepBlanksDefaultValue__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefLineNumbersDefaultValue -extern __typeof (xmlThrDefLineNumbersDefaultValue) xmlThrDefLineNumbersDefaultValue __attribute((alias("xmlThrDefLineNumbersDefaultValue__internal_alias"))); -#else -#ifndef xmlThrDefLineNumbersDefaultValue -extern __typeof (xmlThrDefLineNumbersDefaultValue) xmlThrDefLineNumbersDefaultValue__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefLineNumbersDefaultValue xmlThrDefLineNumbersDefaultValue__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefLoadExtDtdDefaultValue -extern __typeof (xmlThrDefLoadExtDtdDefaultValue) xmlThrDefLoadExtDtdDefaultValue __attribute((alias("xmlThrDefLoadExtDtdDefaultValue__internal_alias"))); -#else -#ifndef xmlThrDefLoadExtDtdDefaultValue -extern __typeof (xmlThrDefLoadExtDtdDefaultValue) xmlThrDefLoadExtDtdDefaultValue__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefLoadExtDtdDefaultValue xmlThrDefLoadExtDtdDefaultValue__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefOutputBufferCreateFilenameDefault -extern __typeof (xmlThrDefOutputBufferCreateFilenameDefault) xmlThrDefOutputBufferCreateFilenameDefault __attribute((alias("xmlThrDefOutputBufferCreateFilenameDefault__internal_alias"))); -#else -#ifndef xmlThrDefOutputBufferCreateFilenameDefault -extern __typeof (xmlThrDefOutputBufferCreateFilenameDefault) xmlThrDefOutputBufferCreateFilenameDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefOutputBufferCreateFilenameDefault xmlThrDefOutputBufferCreateFilenameDefault__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefParserDebugEntities -extern __typeof (xmlThrDefParserDebugEntities) xmlThrDefParserDebugEntities __attribute((alias("xmlThrDefParserDebugEntities__internal_alias"))); -#else -#ifndef xmlThrDefParserDebugEntities -extern __typeof (xmlThrDefParserDebugEntities) xmlThrDefParserDebugEntities__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefParserDebugEntities xmlThrDefParserDebugEntities__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefParserInputBufferCreateFilenameDefault -extern __typeof (xmlThrDefParserInputBufferCreateFilenameDefault) xmlThrDefParserInputBufferCreateFilenameDefault __attribute((alias("xmlThrDefParserInputBufferCreateFilenameDefault__internal_alias"))); -#else -#ifndef xmlThrDefParserInputBufferCreateFilenameDefault -extern __typeof (xmlThrDefParserInputBufferCreateFilenameDefault) xmlThrDefParserInputBufferCreateFilenameDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefParserInputBufferCreateFilenameDefault xmlThrDefParserInputBufferCreateFilenameDefault__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefPedanticParserDefaultValue -extern __typeof (xmlThrDefPedanticParserDefaultValue) xmlThrDefPedanticParserDefaultValue __attribute((alias("xmlThrDefPedanticParserDefaultValue__internal_alias"))); -#else -#ifndef xmlThrDefPedanticParserDefaultValue -extern __typeof (xmlThrDefPedanticParserDefaultValue) xmlThrDefPedanticParserDefaultValue__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefPedanticParserDefaultValue xmlThrDefPedanticParserDefaultValue__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefRegisterNodeDefault -extern __typeof (xmlThrDefRegisterNodeDefault) xmlThrDefRegisterNodeDefault __attribute((alias("xmlThrDefRegisterNodeDefault__internal_alias"))); -#else -#ifndef xmlThrDefRegisterNodeDefault -extern __typeof (xmlThrDefRegisterNodeDefault) xmlThrDefRegisterNodeDefault__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefRegisterNodeDefault xmlThrDefRegisterNodeDefault__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefSaveNoEmptyTags -extern __typeof (xmlThrDefSaveNoEmptyTags) xmlThrDefSaveNoEmptyTags __attribute((alias("xmlThrDefSaveNoEmptyTags__internal_alias"))); -#else -#ifndef xmlThrDefSaveNoEmptyTags -extern __typeof (xmlThrDefSaveNoEmptyTags) xmlThrDefSaveNoEmptyTags__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefSaveNoEmptyTags xmlThrDefSaveNoEmptyTags__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefSetGenericErrorFunc -extern __typeof (xmlThrDefSetGenericErrorFunc) xmlThrDefSetGenericErrorFunc __attribute((alias("xmlThrDefSetGenericErrorFunc__internal_alias"))); -#else -#ifndef xmlThrDefSetGenericErrorFunc -extern __typeof (xmlThrDefSetGenericErrorFunc) xmlThrDefSetGenericErrorFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefSetGenericErrorFunc xmlThrDefSetGenericErrorFunc__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefSetStructuredErrorFunc -extern __typeof (xmlThrDefSetStructuredErrorFunc) xmlThrDefSetStructuredErrorFunc __attribute((alias("xmlThrDefSetStructuredErrorFunc__internal_alias"))); -#else -#ifndef xmlThrDefSetStructuredErrorFunc -extern __typeof (xmlThrDefSetStructuredErrorFunc) xmlThrDefSetStructuredErrorFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefSetStructuredErrorFunc xmlThrDefSetStructuredErrorFunc__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefSubstituteEntitiesDefaultValue -extern __typeof (xmlThrDefSubstituteEntitiesDefaultValue) xmlThrDefSubstituteEntitiesDefaultValue __attribute((alias("xmlThrDefSubstituteEntitiesDefaultValue__internal_alias"))); -#else -#ifndef xmlThrDefSubstituteEntitiesDefaultValue -extern __typeof (xmlThrDefSubstituteEntitiesDefaultValue) xmlThrDefSubstituteEntitiesDefaultValue__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefSubstituteEntitiesDefaultValue xmlThrDefSubstituteEntitiesDefaultValue__internal_alias -#endif -#endif - -#ifdef bottom_globals -#undef xmlThrDefTreeIndentString -extern __typeof (xmlThrDefTreeIndentString) xmlThrDefTreeIndentString __attribute((alias("xmlThrDefTreeIndentString__internal_alias"))); -#else -#ifndef xmlThrDefTreeIndentString -extern __typeof (xmlThrDefTreeIndentString) xmlThrDefTreeIndentString__internal_alias __attribute((visibility("hidden"))); -#define xmlThrDefTreeIndentString xmlThrDefTreeIndentString__internal_alias -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsAegeanNumbers -extern __typeof (xmlUCSIsAegeanNumbers) xmlUCSIsAegeanNumbers __attribute((alias("xmlUCSIsAegeanNumbers__internal_alias"))); -#else -#ifndef xmlUCSIsAegeanNumbers -extern __typeof (xmlUCSIsAegeanNumbers) xmlUCSIsAegeanNumbers__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsAegeanNumbers xmlUCSIsAegeanNumbers__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsAlphabeticPresentationForms -extern __typeof (xmlUCSIsAlphabeticPresentationForms) xmlUCSIsAlphabeticPresentationForms __attribute((alias("xmlUCSIsAlphabeticPresentationForms__internal_alias"))); -#else -#ifndef xmlUCSIsAlphabeticPresentationForms -extern __typeof (xmlUCSIsAlphabeticPresentationForms) xmlUCSIsAlphabeticPresentationForms__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsAlphabeticPresentationForms xmlUCSIsAlphabeticPresentationForms__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsArabic -extern __typeof (xmlUCSIsArabic) xmlUCSIsArabic __attribute((alias("xmlUCSIsArabic__internal_alias"))); -#else -#ifndef xmlUCSIsArabic -extern __typeof (xmlUCSIsArabic) xmlUCSIsArabic__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsArabic xmlUCSIsArabic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsArabicPresentationFormsA -extern __typeof (xmlUCSIsArabicPresentationFormsA) xmlUCSIsArabicPresentationFormsA __attribute((alias("xmlUCSIsArabicPresentationFormsA__internal_alias"))); -#else -#ifndef xmlUCSIsArabicPresentationFormsA -extern __typeof (xmlUCSIsArabicPresentationFormsA) xmlUCSIsArabicPresentationFormsA__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsArabicPresentationFormsA xmlUCSIsArabicPresentationFormsA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsArabicPresentationFormsB -extern __typeof (xmlUCSIsArabicPresentationFormsB) xmlUCSIsArabicPresentationFormsB __attribute((alias("xmlUCSIsArabicPresentationFormsB__internal_alias"))); -#else -#ifndef xmlUCSIsArabicPresentationFormsB -extern __typeof (xmlUCSIsArabicPresentationFormsB) xmlUCSIsArabicPresentationFormsB__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsArabicPresentationFormsB xmlUCSIsArabicPresentationFormsB__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsArmenian -extern __typeof (xmlUCSIsArmenian) xmlUCSIsArmenian __attribute((alias("xmlUCSIsArmenian__internal_alias"))); -#else -#ifndef xmlUCSIsArmenian -extern __typeof (xmlUCSIsArmenian) xmlUCSIsArmenian__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsArmenian xmlUCSIsArmenian__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsArrows -extern __typeof (xmlUCSIsArrows) xmlUCSIsArrows __attribute((alias("xmlUCSIsArrows__internal_alias"))); -#else -#ifndef xmlUCSIsArrows -extern __typeof (xmlUCSIsArrows) xmlUCSIsArrows__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsArrows xmlUCSIsArrows__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBasicLatin -extern __typeof (xmlUCSIsBasicLatin) xmlUCSIsBasicLatin __attribute((alias("xmlUCSIsBasicLatin__internal_alias"))); -#else -#ifndef xmlUCSIsBasicLatin -extern __typeof (xmlUCSIsBasicLatin) xmlUCSIsBasicLatin__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBasicLatin xmlUCSIsBasicLatin__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBengali -extern __typeof (xmlUCSIsBengali) xmlUCSIsBengali __attribute((alias("xmlUCSIsBengali__internal_alias"))); -#else -#ifndef xmlUCSIsBengali -extern __typeof (xmlUCSIsBengali) xmlUCSIsBengali__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBengali xmlUCSIsBengali__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBlock -extern __typeof (xmlUCSIsBlock) xmlUCSIsBlock __attribute((alias("xmlUCSIsBlock__internal_alias"))); -#else -#ifndef xmlUCSIsBlock -extern __typeof (xmlUCSIsBlock) xmlUCSIsBlock__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBlock xmlUCSIsBlock__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBlockElements -extern __typeof (xmlUCSIsBlockElements) xmlUCSIsBlockElements __attribute((alias("xmlUCSIsBlockElements__internal_alias"))); -#else -#ifndef xmlUCSIsBlockElements -extern __typeof (xmlUCSIsBlockElements) xmlUCSIsBlockElements__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBlockElements xmlUCSIsBlockElements__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBopomofo -extern __typeof (xmlUCSIsBopomofo) xmlUCSIsBopomofo __attribute((alias("xmlUCSIsBopomofo__internal_alias"))); -#else -#ifndef xmlUCSIsBopomofo -extern __typeof (xmlUCSIsBopomofo) xmlUCSIsBopomofo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBopomofo xmlUCSIsBopomofo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBopomofoExtended -extern __typeof (xmlUCSIsBopomofoExtended) xmlUCSIsBopomofoExtended __attribute((alias("xmlUCSIsBopomofoExtended__internal_alias"))); -#else -#ifndef xmlUCSIsBopomofoExtended -extern __typeof (xmlUCSIsBopomofoExtended) xmlUCSIsBopomofoExtended__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBopomofoExtended xmlUCSIsBopomofoExtended__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBoxDrawing -extern __typeof (xmlUCSIsBoxDrawing) xmlUCSIsBoxDrawing __attribute((alias("xmlUCSIsBoxDrawing__internal_alias"))); -#else -#ifndef xmlUCSIsBoxDrawing -extern __typeof (xmlUCSIsBoxDrawing) xmlUCSIsBoxDrawing__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBoxDrawing xmlUCSIsBoxDrawing__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBraillePatterns -extern __typeof (xmlUCSIsBraillePatterns) xmlUCSIsBraillePatterns __attribute((alias("xmlUCSIsBraillePatterns__internal_alias"))); -#else -#ifndef xmlUCSIsBraillePatterns -extern __typeof (xmlUCSIsBraillePatterns) xmlUCSIsBraillePatterns__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBraillePatterns xmlUCSIsBraillePatterns__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsBuhid -extern __typeof (xmlUCSIsBuhid) xmlUCSIsBuhid __attribute((alias("xmlUCSIsBuhid__internal_alias"))); -#else -#ifndef xmlUCSIsBuhid -extern __typeof (xmlUCSIsBuhid) xmlUCSIsBuhid__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsBuhid xmlUCSIsBuhid__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsByzantineMusicalSymbols -extern __typeof (xmlUCSIsByzantineMusicalSymbols) xmlUCSIsByzantineMusicalSymbols __attribute((alias("xmlUCSIsByzantineMusicalSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsByzantineMusicalSymbols -extern __typeof (xmlUCSIsByzantineMusicalSymbols) xmlUCSIsByzantineMusicalSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsByzantineMusicalSymbols xmlUCSIsByzantineMusicalSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKCompatibility -extern __typeof (xmlUCSIsCJKCompatibility) xmlUCSIsCJKCompatibility __attribute((alias("xmlUCSIsCJKCompatibility__internal_alias"))); -#else -#ifndef xmlUCSIsCJKCompatibility -extern __typeof (xmlUCSIsCJKCompatibility) xmlUCSIsCJKCompatibility__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKCompatibility xmlUCSIsCJKCompatibility__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKCompatibilityForms -extern __typeof (xmlUCSIsCJKCompatibilityForms) xmlUCSIsCJKCompatibilityForms __attribute((alias("xmlUCSIsCJKCompatibilityForms__internal_alias"))); -#else -#ifndef xmlUCSIsCJKCompatibilityForms -extern __typeof (xmlUCSIsCJKCompatibilityForms) xmlUCSIsCJKCompatibilityForms__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKCompatibilityForms xmlUCSIsCJKCompatibilityForms__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKCompatibilityIdeographs -extern __typeof (xmlUCSIsCJKCompatibilityIdeographs) xmlUCSIsCJKCompatibilityIdeographs __attribute((alias("xmlUCSIsCJKCompatibilityIdeographs__internal_alias"))); -#else -#ifndef xmlUCSIsCJKCompatibilityIdeographs -extern __typeof (xmlUCSIsCJKCompatibilityIdeographs) xmlUCSIsCJKCompatibilityIdeographs__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKCompatibilityIdeographs xmlUCSIsCJKCompatibilityIdeographs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKCompatibilityIdeographsSupplement -extern __typeof (xmlUCSIsCJKCompatibilityIdeographsSupplement) xmlUCSIsCJKCompatibilityIdeographsSupplement __attribute((alias("xmlUCSIsCJKCompatibilityIdeographsSupplement__internal_alias"))); -#else -#ifndef xmlUCSIsCJKCompatibilityIdeographsSupplement -extern __typeof (xmlUCSIsCJKCompatibilityIdeographsSupplement) xmlUCSIsCJKCompatibilityIdeographsSupplement__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKCompatibilityIdeographsSupplement xmlUCSIsCJKCompatibilityIdeographsSupplement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKRadicalsSupplement -extern __typeof (xmlUCSIsCJKRadicalsSupplement) xmlUCSIsCJKRadicalsSupplement __attribute((alias("xmlUCSIsCJKRadicalsSupplement__internal_alias"))); -#else -#ifndef xmlUCSIsCJKRadicalsSupplement -extern __typeof (xmlUCSIsCJKRadicalsSupplement) xmlUCSIsCJKRadicalsSupplement__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKRadicalsSupplement xmlUCSIsCJKRadicalsSupplement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKSymbolsandPunctuation -extern __typeof (xmlUCSIsCJKSymbolsandPunctuation) xmlUCSIsCJKSymbolsandPunctuation __attribute((alias("xmlUCSIsCJKSymbolsandPunctuation__internal_alias"))); -#else -#ifndef xmlUCSIsCJKSymbolsandPunctuation -extern __typeof (xmlUCSIsCJKSymbolsandPunctuation) xmlUCSIsCJKSymbolsandPunctuation__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKSymbolsandPunctuation xmlUCSIsCJKSymbolsandPunctuation__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKUnifiedIdeographs -extern __typeof (xmlUCSIsCJKUnifiedIdeographs) xmlUCSIsCJKUnifiedIdeographs __attribute((alias("xmlUCSIsCJKUnifiedIdeographs__internal_alias"))); -#else -#ifndef xmlUCSIsCJKUnifiedIdeographs -extern __typeof (xmlUCSIsCJKUnifiedIdeographs) xmlUCSIsCJKUnifiedIdeographs__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKUnifiedIdeographs xmlUCSIsCJKUnifiedIdeographs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKUnifiedIdeographsExtensionA -extern __typeof (xmlUCSIsCJKUnifiedIdeographsExtensionA) xmlUCSIsCJKUnifiedIdeographsExtensionA __attribute((alias("xmlUCSIsCJKUnifiedIdeographsExtensionA__internal_alias"))); -#else -#ifndef xmlUCSIsCJKUnifiedIdeographsExtensionA -extern __typeof (xmlUCSIsCJKUnifiedIdeographsExtensionA) xmlUCSIsCJKUnifiedIdeographsExtensionA__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKUnifiedIdeographsExtensionA xmlUCSIsCJKUnifiedIdeographsExtensionA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCJKUnifiedIdeographsExtensionB -extern __typeof (xmlUCSIsCJKUnifiedIdeographsExtensionB) xmlUCSIsCJKUnifiedIdeographsExtensionB __attribute((alias("xmlUCSIsCJKUnifiedIdeographsExtensionB__internal_alias"))); -#else -#ifndef xmlUCSIsCJKUnifiedIdeographsExtensionB -extern __typeof (xmlUCSIsCJKUnifiedIdeographsExtensionB) xmlUCSIsCJKUnifiedIdeographsExtensionB__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCJKUnifiedIdeographsExtensionB xmlUCSIsCJKUnifiedIdeographsExtensionB__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCat -extern __typeof (xmlUCSIsCat) xmlUCSIsCat __attribute((alias("xmlUCSIsCat__internal_alias"))); -#else -#ifndef xmlUCSIsCat -extern __typeof (xmlUCSIsCat) xmlUCSIsCat__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCat xmlUCSIsCat__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatC -extern __typeof (xmlUCSIsCatC) xmlUCSIsCatC __attribute((alias("xmlUCSIsCatC__internal_alias"))); -#else -#ifndef xmlUCSIsCatC -extern __typeof (xmlUCSIsCatC) xmlUCSIsCatC__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatC xmlUCSIsCatC__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatCc -extern __typeof (xmlUCSIsCatCc) xmlUCSIsCatCc __attribute((alias("xmlUCSIsCatCc__internal_alias"))); -#else -#ifndef xmlUCSIsCatCc -extern __typeof (xmlUCSIsCatCc) xmlUCSIsCatCc__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatCc xmlUCSIsCatCc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatCf -extern __typeof (xmlUCSIsCatCf) xmlUCSIsCatCf __attribute((alias("xmlUCSIsCatCf__internal_alias"))); -#else -#ifndef xmlUCSIsCatCf -extern __typeof (xmlUCSIsCatCf) xmlUCSIsCatCf__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatCf xmlUCSIsCatCf__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatCo -extern __typeof (xmlUCSIsCatCo) xmlUCSIsCatCo __attribute((alias("xmlUCSIsCatCo__internal_alias"))); -#else -#ifndef xmlUCSIsCatCo -extern __typeof (xmlUCSIsCatCo) xmlUCSIsCatCo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatCo xmlUCSIsCatCo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatCs -extern __typeof (xmlUCSIsCatCs) xmlUCSIsCatCs __attribute((alias("xmlUCSIsCatCs__internal_alias"))); -#else -#ifndef xmlUCSIsCatCs -extern __typeof (xmlUCSIsCatCs) xmlUCSIsCatCs__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatCs xmlUCSIsCatCs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatL -extern __typeof (xmlUCSIsCatL) xmlUCSIsCatL __attribute((alias("xmlUCSIsCatL__internal_alias"))); -#else -#ifndef xmlUCSIsCatL -extern __typeof (xmlUCSIsCatL) xmlUCSIsCatL__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatL xmlUCSIsCatL__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatLl -extern __typeof (xmlUCSIsCatLl) xmlUCSIsCatLl __attribute((alias("xmlUCSIsCatLl__internal_alias"))); -#else -#ifndef xmlUCSIsCatLl -extern __typeof (xmlUCSIsCatLl) xmlUCSIsCatLl__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatLl xmlUCSIsCatLl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatLm -extern __typeof (xmlUCSIsCatLm) xmlUCSIsCatLm __attribute((alias("xmlUCSIsCatLm__internal_alias"))); -#else -#ifndef xmlUCSIsCatLm -extern __typeof (xmlUCSIsCatLm) xmlUCSIsCatLm__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatLm xmlUCSIsCatLm__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatLo -extern __typeof (xmlUCSIsCatLo) xmlUCSIsCatLo __attribute((alias("xmlUCSIsCatLo__internal_alias"))); -#else -#ifndef xmlUCSIsCatLo -extern __typeof (xmlUCSIsCatLo) xmlUCSIsCatLo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatLo xmlUCSIsCatLo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatLt -extern __typeof (xmlUCSIsCatLt) xmlUCSIsCatLt __attribute((alias("xmlUCSIsCatLt__internal_alias"))); -#else -#ifndef xmlUCSIsCatLt -extern __typeof (xmlUCSIsCatLt) xmlUCSIsCatLt__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatLt xmlUCSIsCatLt__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatLu -extern __typeof (xmlUCSIsCatLu) xmlUCSIsCatLu __attribute((alias("xmlUCSIsCatLu__internal_alias"))); -#else -#ifndef xmlUCSIsCatLu -extern __typeof (xmlUCSIsCatLu) xmlUCSIsCatLu__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatLu xmlUCSIsCatLu__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatM -extern __typeof (xmlUCSIsCatM) xmlUCSIsCatM __attribute((alias("xmlUCSIsCatM__internal_alias"))); -#else -#ifndef xmlUCSIsCatM -extern __typeof (xmlUCSIsCatM) xmlUCSIsCatM__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatM xmlUCSIsCatM__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatMc -extern __typeof (xmlUCSIsCatMc) xmlUCSIsCatMc __attribute((alias("xmlUCSIsCatMc__internal_alias"))); -#else -#ifndef xmlUCSIsCatMc -extern __typeof (xmlUCSIsCatMc) xmlUCSIsCatMc__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatMc xmlUCSIsCatMc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatMe -extern __typeof (xmlUCSIsCatMe) xmlUCSIsCatMe __attribute((alias("xmlUCSIsCatMe__internal_alias"))); -#else -#ifndef xmlUCSIsCatMe -extern __typeof (xmlUCSIsCatMe) xmlUCSIsCatMe__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatMe xmlUCSIsCatMe__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatMn -extern __typeof (xmlUCSIsCatMn) xmlUCSIsCatMn __attribute((alias("xmlUCSIsCatMn__internal_alias"))); -#else -#ifndef xmlUCSIsCatMn -extern __typeof (xmlUCSIsCatMn) xmlUCSIsCatMn__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatMn xmlUCSIsCatMn__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatN -extern __typeof (xmlUCSIsCatN) xmlUCSIsCatN __attribute((alias("xmlUCSIsCatN__internal_alias"))); -#else -#ifndef xmlUCSIsCatN -extern __typeof (xmlUCSIsCatN) xmlUCSIsCatN__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatN xmlUCSIsCatN__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatNd -extern __typeof (xmlUCSIsCatNd) xmlUCSIsCatNd __attribute((alias("xmlUCSIsCatNd__internal_alias"))); -#else -#ifndef xmlUCSIsCatNd -extern __typeof (xmlUCSIsCatNd) xmlUCSIsCatNd__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatNd xmlUCSIsCatNd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatNl -extern __typeof (xmlUCSIsCatNl) xmlUCSIsCatNl __attribute((alias("xmlUCSIsCatNl__internal_alias"))); -#else -#ifndef xmlUCSIsCatNl -extern __typeof (xmlUCSIsCatNl) xmlUCSIsCatNl__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatNl xmlUCSIsCatNl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatNo -extern __typeof (xmlUCSIsCatNo) xmlUCSIsCatNo __attribute((alias("xmlUCSIsCatNo__internal_alias"))); -#else -#ifndef xmlUCSIsCatNo -extern __typeof (xmlUCSIsCatNo) xmlUCSIsCatNo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatNo xmlUCSIsCatNo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatP -extern __typeof (xmlUCSIsCatP) xmlUCSIsCatP __attribute((alias("xmlUCSIsCatP__internal_alias"))); -#else -#ifndef xmlUCSIsCatP -extern __typeof (xmlUCSIsCatP) xmlUCSIsCatP__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatP xmlUCSIsCatP__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatPc -extern __typeof (xmlUCSIsCatPc) xmlUCSIsCatPc __attribute((alias("xmlUCSIsCatPc__internal_alias"))); -#else -#ifndef xmlUCSIsCatPc -extern __typeof (xmlUCSIsCatPc) xmlUCSIsCatPc__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatPc xmlUCSIsCatPc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatPd -extern __typeof (xmlUCSIsCatPd) xmlUCSIsCatPd __attribute((alias("xmlUCSIsCatPd__internal_alias"))); -#else -#ifndef xmlUCSIsCatPd -extern __typeof (xmlUCSIsCatPd) xmlUCSIsCatPd__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatPd xmlUCSIsCatPd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatPe -extern __typeof (xmlUCSIsCatPe) xmlUCSIsCatPe __attribute((alias("xmlUCSIsCatPe__internal_alias"))); -#else -#ifndef xmlUCSIsCatPe -extern __typeof (xmlUCSIsCatPe) xmlUCSIsCatPe__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatPe xmlUCSIsCatPe__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatPf -extern __typeof (xmlUCSIsCatPf) xmlUCSIsCatPf __attribute((alias("xmlUCSIsCatPf__internal_alias"))); -#else -#ifndef xmlUCSIsCatPf -extern __typeof (xmlUCSIsCatPf) xmlUCSIsCatPf__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatPf xmlUCSIsCatPf__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatPi -extern __typeof (xmlUCSIsCatPi) xmlUCSIsCatPi __attribute((alias("xmlUCSIsCatPi__internal_alias"))); -#else -#ifndef xmlUCSIsCatPi -extern __typeof (xmlUCSIsCatPi) xmlUCSIsCatPi__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatPi xmlUCSIsCatPi__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatPo -extern __typeof (xmlUCSIsCatPo) xmlUCSIsCatPo __attribute((alias("xmlUCSIsCatPo__internal_alias"))); -#else -#ifndef xmlUCSIsCatPo -extern __typeof (xmlUCSIsCatPo) xmlUCSIsCatPo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatPo xmlUCSIsCatPo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatPs -extern __typeof (xmlUCSIsCatPs) xmlUCSIsCatPs __attribute((alias("xmlUCSIsCatPs__internal_alias"))); -#else -#ifndef xmlUCSIsCatPs -extern __typeof (xmlUCSIsCatPs) xmlUCSIsCatPs__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatPs xmlUCSIsCatPs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatS -extern __typeof (xmlUCSIsCatS) xmlUCSIsCatS __attribute((alias("xmlUCSIsCatS__internal_alias"))); -#else -#ifndef xmlUCSIsCatS -extern __typeof (xmlUCSIsCatS) xmlUCSIsCatS__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatS xmlUCSIsCatS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatSc -extern __typeof (xmlUCSIsCatSc) xmlUCSIsCatSc __attribute((alias("xmlUCSIsCatSc__internal_alias"))); -#else -#ifndef xmlUCSIsCatSc -extern __typeof (xmlUCSIsCatSc) xmlUCSIsCatSc__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatSc xmlUCSIsCatSc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatSk -extern __typeof (xmlUCSIsCatSk) xmlUCSIsCatSk __attribute((alias("xmlUCSIsCatSk__internal_alias"))); -#else -#ifndef xmlUCSIsCatSk -extern __typeof (xmlUCSIsCatSk) xmlUCSIsCatSk__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatSk xmlUCSIsCatSk__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatSm -extern __typeof (xmlUCSIsCatSm) xmlUCSIsCatSm __attribute((alias("xmlUCSIsCatSm__internal_alias"))); -#else -#ifndef xmlUCSIsCatSm -extern __typeof (xmlUCSIsCatSm) xmlUCSIsCatSm__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatSm xmlUCSIsCatSm__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatSo -extern __typeof (xmlUCSIsCatSo) xmlUCSIsCatSo __attribute((alias("xmlUCSIsCatSo__internal_alias"))); -#else -#ifndef xmlUCSIsCatSo -extern __typeof (xmlUCSIsCatSo) xmlUCSIsCatSo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatSo xmlUCSIsCatSo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatZ -extern __typeof (xmlUCSIsCatZ) xmlUCSIsCatZ __attribute((alias("xmlUCSIsCatZ__internal_alias"))); -#else -#ifndef xmlUCSIsCatZ -extern __typeof (xmlUCSIsCatZ) xmlUCSIsCatZ__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatZ xmlUCSIsCatZ__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatZl -extern __typeof (xmlUCSIsCatZl) xmlUCSIsCatZl __attribute((alias("xmlUCSIsCatZl__internal_alias"))); -#else -#ifndef xmlUCSIsCatZl -extern __typeof (xmlUCSIsCatZl) xmlUCSIsCatZl__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatZl xmlUCSIsCatZl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatZp -extern __typeof (xmlUCSIsCatZp) xmlUCSIsCatZp __attribute((alias("xmlUCSIsCatZp__internal_alias"))); -#else -#ifndef xmlUCSIsCatZp -extern __typeof (xmlUCSIsCatZp) xmlUCSIsCatZp__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatZp xmlUCSIsCatZp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCatZs -extern __typeof (xmlUCSIsCatZs) xmlUCSIsCatZs __attribute((alias("xmlUCSIsCatZs__internal_alias"))); -#else -#ifndef xmlUCSIsCatZs -extern __typeof (xmlUCSIsCatZs) xmlUCSIsCatZs__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCatZs xmlUCSIsCatZs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCherokee -extern __typeof (xmlUCSIsCherokee) xmlUCSIsCherokee __attribute((alias("xmlUCSIsCherokee__internal_alias"))); -#else -#ifndef xmlUCSIsCherokee -extern __typeof (xmlUCSIsCherokee) xmlUCSIsCherokee__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCherokee xmlUCSIsCherokee__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCombiningDiacriticalMarks -extern __typeof (xmlUCSIsCombiningDiacriticalMarks) xmlUCSIsCombiningDiacriticalMarks __attribute((alias("xmlUCSIsCombiningDiacriticalMarks__internal_alias"))); -#else -#ifndef xmlUCSIsCombiningDiacriticalMarks -extern __typeof (xmlUCSIsCombiningDiacriticalMarks) xmlUCSIsCombiningDiacriticalMarks__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCombiningDiacriticalMarks xmlUCSIsCombiningDiacriticalMarks__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCombiningDiacriticalMarksforSymbols -extern __typeof (xmlUCSIsCombiningDiacriticalMarksforSymbols) xmlUCSIsCombiningDiacriticalMarksforSymbols __attribute((alias("xmlUCSIsCombiningDiacriticalMarksforSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsCombiningDiacriticalMarksforSymbols -extern __typeof (xmlUCSIsCombiningDiacriticalMarksforSymbols) xmlUCSIsCombiningDiacriticalMarksforSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCombiningDiacriticalMarksforSymbols xmlUCSIsCombiningDiacriticalMarksforSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCombiningHalfMarks -extern __typeof (xmlUCSIsCombiningHalfMarks) xmlUCSIsCombiningHalfMarks __attribute((alias("xmlUCSIsCombiningHalfMarks__internal_alias"))); -#else -#ifndef xmlUCSIsCombiningHalfMarks -extern __typeof (xmlUCSIsCombiningHalfMarks) xmlUCSIsCombiningHalfMarks__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCombiningHalfMarks xmlUCSIsCombiningHalfMarks__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCombiningMarksforSymbols -extern __typeof (xmlUCSIsCombiningMarksforSymbols) xmlUCSIsCombiningMarksforSymbols __attribute((alias("xmlUCSIsCombiningMarksforSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsCombiningMarksforSymbols -extern __typeof (xmlUCSIsCombiningMarksforSymbols) xmlUCSIsCombiningMarksforSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCombiningMarksforSymbols xmlUCSIsCombiningMarksforSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsControlPictures -extern __typeof (xmlUCSIsControlPictures) xmlUCSIsControlPictures __attribute((alias("xmlUCSIsControlPictures__internal_alias"))); -#else -#ifndef xmlUCSIsControlPictures -extern __typeof (xmlUCSIsControlPictures) xmlUCSIsControlPictures__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsControlPictures xmlUCSIsControlPictures__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCurrencySymbols -extern __typeof (xmlUCSIsCurrencySymbols) xmlUCSIsCurrencySymbols __attribute((alias("xmlUCSIsCurrencySymbols__internal_alias"))); -#else -#ifndef xmlUCSIsCurrencySymbols -extern __typeof (xmlUCSIsCurrencySymbols) xmlUCSIsCurrencySymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCurrencySymbols xmlUCSIsCurrencySymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCypriotSyllabary -extern __typeof (xmlUCSIsCypriotSyllabary) xmlUCSIsCypriotSyllabary __attribute((alias("xmlUCSIsCypriotSyllabary__internal_alias"))); -#else -#ifndef xmlUCSIsCypriotSyllabary -extern __typeof (xmlUCSIsCypriotSyllabary) xmlUCSIsCypriotSyllabary__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCypriotSyllabary xmlUCSIsCypriotSyllabary__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCyrillic -extern __typeof (xmlUCSIsCyrillic) xmlUCSIsCyrillic __attribute((alias("xmlUCSIsCyrillic__internal_alias"))); -#else -#ifndef xmlUCSIsCyrillic -extern __typeof (xmlUCSIsCyrillic) xmlUCSIsCyrillic__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCyrillic xmlUCSIsCyrillic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsCyrillicSupplement -extern __typeof (xmlUCSIsCyrillicSupplement) xmlUCSIsCyrillicSupplement __attribute((alias("xmlUCSIsCyrillicSupplement__internal_alias"))); -#else -#ifndef xmlUCSIsCyrillicSupplement -extern __typeof (xmlUCSIsCyrillicSupplement) xmlUCSIsCyrillicSupplement__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsCyrillicSupplement xmlUCSIsCyrillicSupplement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsDeseret -extern __typeof (xmlUCSIsDeseret) xmlUCSIsDeseret __attribute((alias("xmlUCSIsDeseret__internal_alias"))); -#else -#ifndef xmlUCSIsDeseret -extern __typeof (xmlUCSIsDeseret) xmlUCSIsDeseret__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsDeseret xmlUCSIsDeseret__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsDevanagari -extern __typeof (xmlUCSIsDevanagari) xmlUCSIsDevanagari __attribute((alias("xmlUCSIsDevanagari__internal_alias"))); -#else -#ifndef xmlUCSIsDevanagari -extern __typeof (xmlUCSIsDevanagari) xmlUCSIsDevanagari__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsDevanagari xmlUCSIsDevanagari__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsDingbats -extern __typeof (xmlUCSIsDingbats) xmlUCSIsDingbats __attribute((alias("xmlUCSIsDingbats__internal_alias"))); -#else -#ifndef xmlUCSIsDingbats -extern __typeof (xmlUCSIsDingbats) xmlUCSIsDingbats__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsDingbats xmlUCSIsDingbats__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsEnclosedAlphanumerics -extern __typeof (xmlUCSIsEnclosedAlphanumerics) xmlUCSIsEnclosedAlphanumerics __attribute((alias("xmlUCSIsEnclosedAlphanumerics__internal_alias"))); -#else -#ifndef xmlUCSIsEnclosedAlphanumerics -extern __typeof (xmlUCSIsEnclosedAlphanumerics) xmlUCSIsEnclosedAlphanumerics__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsEnclosedAlphanumerics xmlUCSIsEnclosedAlphanumerics__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsEnclosedCJKLettersandMonths -extern __typeof (xmlUCSIsEnclosedCJKLettersandMonths) xmlUCSIsEnclosedCJKLettersandMonths __attribute((alias("xmlUCSIsEnclosedCJKLettersandMonths__internal_alias"))); -#else -#ifndef xmlUCSIsEnclosedCJKLettersandMonths -extern __typeof (xmlUCSIsEnclosedCJKLettersandMonths) xmlUCSIsEnclosedCJKLettersandMonths__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsEnclosedCJKLettersandMonths xmlUCSIsEnclosedCJKLettersandMonths__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsEthiopic -extern __typeof (xmlUCSIsEthiopic) xmlUCSIsEthiopic __attribute((alias("xmlUCSIsEthiopic__internal_alias"))); -#else -#ifndef xmlUCSIsEthiopic -extern __typeof (xmlUCSIsEthiopic) xmlUCSIsEthiopic__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsEthiopic xmlUCSIsEthiopic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGeneralPunctuation -extern __typeof (xmlUCSIsGeneralPunctuation) xmlUCSIsGeneralPunctuation __attribute((alias("xmlUCSIsGeneralPunctuation__internal_alias"))); -#else -#ifndef xmlUCSIsGeneralPunctuation -extern __typeof (xmlUCSIsGeneralPunctuation) xmlUCSIsGeneralPunctuation__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGeneralPunctuation xmlUCSIsGeneralPunctuation__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGeometricShapes -extern __typeof (xmlUCSIsGeometricShapes) xmlUCSIsGeometricShapes __attribute((alias("xmlUCSIsGeometricShapes__internal_alias"))); -#else -#ifndef xmlUCSIsGeometricShapes -extern __typeof (xmlUCSIsGeometricShapes) xmlUCSIsGeometricShapes__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGeometricShapes xmlUCSIsGeometricShapes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGeorgian -extern __typeof (xmlUCSIsGeorgian) xmlUCSIsGeorgian __attribute((alias("xmlUCSIsGeorgian__internal_alias"))); -#else -#ifndef xmlUCSIsGeorgian -extern __typeof (xmlUCSIsGeorgian) xmlUCSIsGeorgian__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGeorgian xmlUCSIsGeorgian__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGothic -extern __typeof (xmlUCSIsGothic) xmlUCSIsGothic __attribute((alias("xmlUCSIsGothic__internal_alias"))); -#else -#ifndef xmlUCSIsGothic -extern __typeof (xmlUCSIsGothic) xmlUCSIsGothic__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGothic xmlUCSIsGothic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGreek -extern __typeof (xmlUCSIsGreek) xmlUCSIsGreek __attribute((alias("xmlUCSIsGreek__internal_alias"))); -#else -#ifndef xmlUCSIsGreek -extern __typeof (xmlUCSIsGreek) xmlUCSIsGreek__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGreek xmlUCSIsGreek__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGreekExtended -extern __typeof (xmlUCSIsGreekExtended) xmlUCSIsGreekExtended __attribute((alias("xmlUCSIsGreekExtended__internal_alias"))); -#else -#ifndef xmlUCSIsGreekExtended -extern __typeof (xmlUCSIsGreekExtended) xmlUCSIsGreekExtended__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGreekExtended xmlUCSIsGreekExtended__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGreekandCoptic -extern __typeof (xmlUCSIsGreekandCoptic) xmlUCSIsGreekandCoptic __attribute((alias("xmlUCSIsGreekandCoptic__internal_alias"))); -#else -#ifndef xmlUCSIsGreekandCoptic -extern __typeof (xmlUCSIsGreekandCoptic) xmlUCSIsGreekandCoptic__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGreekandCoptic xmlUCSIsGreekandCoptic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGujarati -extern __typeof (xmlUCSIsGujarati) xmlUCSIsGujarati __attribute((alias("xmlUCSIsGujarati__internal_alias"))); -#else -#ifndef xmlUCSIsGujarati -extern __typeof (xmlUCSIsGujarati) xmlUCSIsGujarati__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGujarati xmlUCSIsGujarati__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsGurmukhi -extern __typeof (xmlUCSIsGurmukhi) xmlUCSIsGurmukhi __attribute((alias("xmlUCSIsGurmukhi__internal_alias"))); -#else -#ifndef xmlUCSIsGurmukhi -extern __typeof (xmlUCSIsGurmukhi) xmlUCSIsGurmukhi__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsGurmukhi xmlUCSIsGurmukhi__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHalfwidthandFullwidthForms -extern __typeof (xmlUCSIsHalfwidthandFullwidthForms) xmlUCSIsHalfwidthandFullwidthForms __attribute((alias("xmlUCSIsHalfwidthandFullwidthForms__internal_alias"))); -#else -#ifndef xmlUCSIsHalfwidthandFullwidthForms -extern __typeof (xmlUCSIsHalfwidthandFullwidthForms) xmlUCSIsHalfwidthandFullwidthForms__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHalfwidthandFullwidthForms xmlUCSIsHalfwidthandFullwidthForms__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHangulCompatibilityJamo -extern __typeof (xmlUCSIsHangulCompatibilityJamo) xmlUCSIsHangulCompatibilityJamo __attribute((alias("xmlUCSIsHangulCompatibilityJamo__internal_alias"))); -#else -#ifndef xmlUCSIsHangulCompatibilityJamo -extern __typeof (xmlUCSIsHangulCompatibilityJamo) xmlUCSIsHangulCompatibilityJamo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHangulCompatibilityJamo xmlUCSIsHangulCompatibilityJamo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHangulJamo -extern __typeof (xmlUCSIsHangulJamo) xmlUCSIsHangulJamo __attribute((alias("xmlUCSIsHangulJamo__internal_alias"))); -#else -#ifndef xmlUCSIsHangulJamo -extern __typeof (xmlUCSIsHangulJamo) xmlUCSIsHangulJamo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHangulJamo xmlUCSIsHangulJamo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHangulSyllables -extern __typeof (xmlUCSIsHangulSyllables) xmlUCSIsHangulSyllables __attribute((alias("xmlUCSIsHangulSyllables__internal_alias"))); -#else -#ifndef xmlUCSIsHangulSyllables -extern __typeof (xmlUCSIsHangulSyllables) xmlUCSIsHangulSyllables__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHangulSyllables xmlUCSIsHangulSyllables__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHanunoo -extern __typeof (xmlUCSIsHanunoo) xmlUCSIsHanunoo __attribute((alias("xmlUCSIsHanunoo__internal_alias"))); -#else -#ifndef xmlUCSIsHanunoo -extern __typeof (xmlUCSIsHanunoo) xmlUCSIsHanunoo__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHanunoo xmlUCSIsHanunoo__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHebrew -extern __typeof (xmlUCSIsHebrew) xmlUCSIsHebrew __attribute((alias("xmlUCSIsHebrew__internal_alias"))); -#else -#ifndef xmlUCSIsHebrew -extern __typeof (xmlUCSIsHebrew) xmlUCSIsHebrew__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHebrew xmlUCSIsHebrew__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHighPrivateUseSurrogates -extern __typeof (xmlUCSIsHighPrivateUseSurrogates) xmlUCSIsHighPrivateUseSurrogates __attribute((alias("xmlUCSIsHighPrivateUseSurrogates__internal_alias"))); -#else -#ifndef xmlUCSIsHighPrivateUseSurrogates -extern __typeof (xmlUCSIsHighPrivateUseSurrogates) xmlUCSIsHighPrivateUseSurrogates__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHighPrivateUseSurrogates xmlUCSIsHighPrivateUseSurrogates__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHighSurrogates -extern __typeof (xmlUCSIsHighSurrogates) xmlUCSIsHighSurrogates __attribute((alias("xmlUCSIsHighSurrogates__internal_alias"))); -#else -#ifndef xmlUCSIsHighSurrogates -extern __typeof (xmlUCSIsHighSurrogates) xmlUCSIsHighSurrogates__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHighSurrogates xmlUCSIsHighSurrogates__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsHiragana -extern __typeof (xmlUCSIsHiragana) xmlUCSIsHiragana __attribute((alias("xmlUCSIsHiragana__internal_alias"))); -#else -#ifndef xmlUCSIsHiragana -extern __typeof (xmlUCSIsHiragana) xmlUCSIsHiragana__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsHiragana xmlUCSIsHiragana__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsIPAExtensions -extern __typeof (xmlUCSIsIPAExtensions) xmlUCSIsIPAExtensions __attribute((alias("xmlUCSIsIPAExtensions__internal_alias"))); -#else -#ifndef xmlUCSIsIPAExtensions -extern __typeof (xmlUCSIsIPAExtensions) xmlUCSIsIPAExtensions__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsIPAExtensions xmlUCSIsIPAExtensions__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsIdeographicDescriptionCharacters -extern __typeof (xmlUCSIsIdeographicDescriptionCharacters) xmlUCSIsIdeographicDescriptionCharacters __attribute((alias("xmlUCSIsIdeographicDescriptionCharacters__internal_alias"))); -#else -#ifndef xmlUCSIsIdeographicDescriptionCharacters -extern __typeof (xmlUCSIsIdeographicDescriptionCharacters) xmlUCSIsIdeographicDescriptionCharacters__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsIdeographicDescriptionCharacters xmlUCSIsIdeographicDescriptionCharacters__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsKanbun -extern __typeof (xmlUCSIsKanbun) xmlUCSIsKanbun __attribute((alias("xmlUCSIsKanbun__internal_alias"))); -#else -#ifndef xmlUCSIsKanbun -extern __typeof (xmlUCSIsKanbun) xmlUCSIsKanbun__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsKanbun xmlUCSIsKanbun__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsKangxiRadicals -extern __typeof (xmlUCSIsKangxiRadicals) xmlUCSIsKangxiRadicals __attribute((alias("xmlUCSIsKangxiRadicals__internal_alias"))); -#else -#ifndef xmlUCSIsKangxiRadicals -extern __typeof (xmlUCSIsKangxiRadicals) xmlUCSIsKangxiRadicals__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsKangxiRadicals xmlUCSIsKangxiRadicals__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsKannada -extern __typeof (xmlUCSIsKannada) xmlUCSIsKannada __attribute((alias("xmlUCSIsKannada__internal_alias"))); -#else -#ifndef xmlUCSIsKannada -extern __typeof (xmlUCSIsKannada) xmlUCSIsKannada__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsKannada xmlUCSIsKannada__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsKatakana -extern __typeof (xmlUCSIsKatakana) xmlUCSIsKatakana __attribute((alias("xmlUCSIsKatakana__internal_alias"))); -#else -#ifndef xmlUCSIsKatakana -extern __typeof (xmlUCSIsKatakana) xmlUCSIsKatakana__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsKatakana xmlUCSIsKatakana__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsKatakanaPhoneticExtensions -extern __typeof (xmlUCSIsKatakanaPhoneticExtensions) xmlUCSIsKatakanaPhoneticExtensions __attribute((alias("xmlUCSIsKatakanaPhoneticExtensions__internal_alias"))); -#else -#ifndef xmlUCSIsKatakanaPhoneticExtensions -extern __typeof (xmlUCSIsKatakanaPhoneticExtensions) xmlUCSIsKatakanaPhoneticExtensions__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsKatakanaPhoneticExtensions xmlUCSIsKatakanaPhoneticExtensions__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsKhmer -extern __typeof (xmlUCSIsKhmer) xmlUCSIsKhmer __attribute((alias("xmlUCSIsKhmer__internal_alias"))); -#else -#ifndef xmlUCSIsKhmer -extern __typeof (xmlUCSIsKhmer) xmlUCSIsKhmer__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsKhmer xmlUCSIsKhmer__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsKhmerSymbols -extern __typeof (xmlUCSIsKhmerSymbols) xmlUCSIsKhmerSymbols __attribute((alias("xmlUCSIsKhmerSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsKhmerSymbols -extern __typeof (xmlUCSIsKhmerSymbols) xmlUCSIsKhmerSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsKhmerSymbols xmlUCSIsKhmerSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLao -extern __typeof (xmlUCSIsLao) xmlUCSIsLao __attribute((alias("xmlUCSIsLao__internal_alias"))); -#else -#ifndef xmlUCSIsLao -extern __typeof (xmlUCSIsLao) xmlUCSIsLao__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLao xmlUCSIsLao__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLatin1Supplement -extern __typeof (xmlUCSIsLatin1Supplement) xmlUCSIsLatin1Supplement __attribute((alias("xmlUCSIsLatin1Supplement__internal_alias"))); -#else -#ifndef xmlUCSIsLatin1Supplement -extern __typeof (xmlUCSIsLatin1Supplement) xmlUCSIsLatin1Supplement__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLatin1Supplement xmlUCSIsLatin1Supplement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLatinExtendedA -extern __typeof (xmlUCSIsLatinExtendedA) xmlUCSIsLatinExtendedA __attribute((alias("xmlUCSIsLatinExtendedA__internal_alias"))); -#else -#ifndef xmlUCSIsLatinExtendedA -extern __typeof (xmlUCSIsLatinExtendedA) xmlUCSIsLatinExtendedA__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLatinExtendedA xmlUCSIsLatinExtendedA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLatinExtendedAdditional -extern __typeof (xmlUCSIsLatinExtendedAdditional) xmlUCSIsLatinExtendedAdditional __attribute((alias("xmlUCSIsLatinExtendedAdditional__internal_alias"))); -#else -#ifndef xmlUCSIsLatinExtendedAdditional -extern __typeof (xmlUCSIsLatinExtendedAdditional) xmlUCSIsLatinExtendedAdditional__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLatinExtendedAdditional xmlUCSIsLatinExtendedAdditional__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLatinExtendedB -extern __typeof (xmlUCSIsLatinExtendedB) xmlUCSIsLatinExtendedB __attribute((alias("xmlUCSIsLatinExtendedB__internal_alias"))); -#else -#ifndef xmlUCSIsLatinExtendedB -extern __typeof (xmlUCSIsLatinExtendedB) xmlUCSIsLatinExtendedB__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLatinExtendedB xmlUCSIsLatinExtendedB__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLetterlikeSymbols -extern __typeof (xmlUCSIsLetterlikeSymbols) xmlUCSIsLetterlikeSymbols __attribute((alias("xmlUCSIsLetterlikeSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsLetterlikeSymbols -extern __typeof (xmlUCSIsLetterlikeSymbols) xmlUCSIsLetterlikeSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLetterlikeSymbols xmlUCSIsLetterlikeSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLimbu -extern __typeof (xmlUCSIsLimbu) xmlUCSIsLimbu __attribute((alias("xmlUCSIsLimbu__internal_alias"))); -#else -#ifndef xmlUCSIsLimbu -extern __typeof (xmlUCSIsLimbu) xmlUCSIsLimbu__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLimbu xmlUCSIsLimbu__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLinearBIdeograms -extern __typeof (xmlUCSIsLinearBIdeograms) xmlUCSIsLinearBIdeograms __attribute((alias("xmlUCSIsLinearBIdeograms__internal_alias"))); -#else -#ifndef xmlUCSIsLinearBIdeograms -extern __typeof (xmlUCSIsLinearBIdeograms) xmlUCSIsLinearBIdeograms__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLinearBIdeograms xmlUCSIsLinearBIdeograms__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLinearBSyllabary -extern __typeof (xmlUCSIsLinearBSyllabary) xmlUCSIsLinearBSyllabary __attribute((alias("xmlUCSIsLinearBSyllabary__internal_alias"))); -#else -#ifndef xmlUCSIsLinearBSyllabary -extern __typeof (xmlUCSIsLinearBSyllabary) xmlUCSIsLinearBSyllabary__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLinearBSyllabary xmlUCSIsLinearBSyllabary__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsLowSurrogates -extern __typeof (xmlUCSIsLowSurrogates) xmlUCSIsLowSurrogates __attribute((alias("xmlUCSIsLowSurrogates__internal_alias"))); -#else -#ifndef xmlUCSIsLowSurrogates -extern __typeof (xmlUCSIsLowSurrogates) xmlUCSIsLowSurrogates__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsLowSurrogates xmlUCSIsLowSurrogates__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMalayalam -extern __typeof (xmlUCSIsMalayalam) xmlUCSIsMalayalam __attribute((alias("xmlUCSIsMalayalam__internal_alias"))); -#else -#ifndef xmlUCSIsMalayalam -extern __typeof (xmlUCSIsMalayalam) xmlUCSIsMalayalam__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMalayalam xmlUCSIsMalayalam__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMathematicalAlphanumericSymbols -extern __typeof (xmlUCSIsMathematicalAlphanumericSymbols) xmlUCSIsMathematicalAlphanumericSymbols __attribute((alias("xmlUCSIsMathematicalAlphanumericSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsMathematicalAlphanumericSymbols -extern __typeof (xmlUCSIsMathematicalAlphanumericSymbols) xmlUCSIsMathematicalAlphanumericSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMathematicalAlphanumericSymbols xmlUCSIsMathematicalAlphanumericSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMathematicalOperators -extern __typeof (xmlUCSIsMathematicalOperators) xmlUCSIsMathematicalOperators __attribute((alias("xmlUCSIsMathematicalOperators__internal_alias"))); -#else -#ifndef xmlUCSIsMathematicalOperators -extern __typeof (xmlUCSIsMathematicalOperators) xmlUCSIsMathematicalOperators__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMathematicalOperators xmlUCSIsMathematicalOperators__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMiscellaneousMathematicalSymbolsA -extern __typeof (xmlUCSIsMiscellaneousMathematicalSymbolsA) xmlUCSIsMiscellaneousMathematicalSymbolsA __attribute((alias("xmlUCSIsMiscellaneousMathematicalSymbolsA__internal_alias"))); -#else -#ifndef xmlUCSIsMiscellaneousMathematicalSymbolsA -extern __typeof (xmlUCSIsMiscellaneousMathematicalSymbolsA) xmlUCSIsMiscellaneousMathematicalSymbolsA__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMiscellaneousMathematicalSymbolsA xmlUCSIsMiscellaneousMathematicalSymbolsA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMiscellaneousMathematicalSymbolsB -extern __typeof (xmlUCSIsMiscellaneousMathematicalSymbolsB) xmlUCSIsMiscellaneousMathematicalSymbolsB __attribute((alias("xmlUCSIsMiscellaneousMathematicalSymbolsB__internal_alias"))); -#else -#ifndef xmlUCSIsMiscellaneousMathematicalSymbolsB -extern __typeof (xmlUCSIsMiscellaneousMathematicalSymbolsB) xmlUCSIsMiscellaneousMathematicalSymbolsB__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMiscellaneousMathematicalSymbolsB xmlUCSIsMiscellaneousMathematicalSymbolsB__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMiscellaneousSymbols -extern __typeof (xmlUCSIsMiscellaneousSymbols) xmlUCSIsMiscellaneousSymbols __attribute((alias("xmlUCSIsMiscellaneousSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsMiscellaneousSymbols -extern __typeof (xmlUCSIsMiscellaneousSymbols) xmlUCSIsMiscellaneousSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMiscellaneousSymbols xmlUCSIsMiscellaneousSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMiscellaneousSymbolsandArrows -extern __typeof (xmlUCSIsMiscellaneousSymbolsandArrows) xmlUCSIsMiscellaneousSymbolsandArrows __attribute((alias("xmlUCSIsMiscellaneousSymbolsandArrows__internal_alias"))); -#else -#ifndef xmlUCSIsMiscellaneousSymbolsandArrows -extern __typeof (xmlUCSIsMiscellaneousSymbolsandArrows) xmlUCSIsMiscellaneousSymbolsandArrows__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMiscellaneousSymbolsandArrows xmlUCSIsMiscellaneousSymbolsandArrows__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMiscellaneousTechnical -extern __typeof (xmlUCSIsMiscellaneousTechnical) xmlUCSIsMiscellaneousTechnical __attribute((alias("xmlUCSIsMiscellaneousTechnical__internal_alias"))); -#else -#ifndef xmlUCSIsMiscellaneousTechnical -extern __typeof (xmlUCSIsMiscellaneousTechnical) xmlUCSIsMiscellaneousTechnical__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMiscellaneousTechnical xmlUCSIsMiscellaneousTechnical__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMongolian -extern __typeof (xmlUCSIsMongolian) xmlUCSIsMongolian __attribute((alias("xmlUCSIsMongolian__internal_alias"))); -#else -#ifndef xmlUCSIsMongolian -extern __typeof (xmlUCSIsMongolian) xmlUCSIsMongolian__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMongolian xmlUCSIsMongolian__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMusicalSymbols -extern __typeof (xmlUCSIsMusicalSymbols) xmlUCSIsMusicalSymbols __attribute((alias("xmlUCSIsMusicalSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsMusicalSymbols -extern __typeof (xmlUCSIsMusicalSymbols) xmlUCSIsMusicalSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMusicalSymbols xmlUCSIsMusicalSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsMyanmar -extern __typeof (xmlUCSIsMyanmar) xmlUCSIsMyanmar __attribute((alias("xmlUCSIsMyanmar__internal_alias"))); -#else -#ifndef xmlUCSIsMyanmar -extern __typeof (xmlUCSIsMyanmar) xmlUCSIsMyanmar__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsMyanmar xmlUCSIsMyanmar__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsNumberForms -extern __typeof (xmlUCSIsNumberForms) xmlUCSIsNumberForms __attribute((alias("xmlUCSIsNumberForms__internal_alias"))); -#else -#ifndef xmlUCSIsNumberForms -extern __typeof (xmlUCSIsNumberForms) xmlUCSIsNumberForms__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsNumberForms xmlUCSIsNumberForms__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsOgham -extern __typeof (xmlUCSIsOgham) xmlUCSIsOgham __attribute((alias("xmlUCSIsOgham__internal_alias"))); -#else -#ifndef xmlUCSIsOgham -extern __typeof (xmlUCSIsOgham) xmlUCSIsOgham__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsOgham xmlUCSIsOgham__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsOldItalic -extern __typeof (xmlUCSIsOldItalic) xmlUCSIsOldItalic __attribute((alias("xmlUCSIsOldItalic__internal_alias"))); -#else -#ifndef xmlUCSIsOldItalic -extern __typeof (xmlUCSIsOldItalic) xmlUCSIsOldItalic__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsOldItalic xmlUCSIsOldItalic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsOpticalCharacterRecognition -extern __typeof (xmlUCSIsOpticalCharacterRecognition) xmlUCSIsOpticalCharacterRecognition __attribute((alias("xmlUCSIsOpticalCharacterRecognition__internal_alias"))); -#else -#ifndef xmlUCSIsOpticalCharacterRecognition -extern __typeof (xmlUCSIsOpticalCharacterRecognition) xmlUCSIsOpticalCharacterRecognition__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsOpticalCharacterRecognition xmlUCSIsOpticalCharacterRecognition__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsOriya -extern __typeof (xmlUCSIsOriya) xmlUCSIsOriya __attribute((alias("xmlUCSIsOriya__internal_alias"))); -#else -#ifndef xmlUCSIsOriya -extern __typeof (xmlUCSIsOriya) xmlUCSIsOriya__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsOriya xmlUCSIsOriya__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsOsmanya -extern __typeof (xmlUCSIsOsmanya) xmlUCSIsOsmanya __attribute((alias("xmlUCSIsOsmanya__internal_alias"))); -#else -#ifndef xmlUCSIsOsmanya -extern __typeof (xmlUCSIsOsmanya) xmlUCSIsOsmanya__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsOsmanya xmlUCSIsOsmanya__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsPhoneticExtensions -extern __typeof (xmlUCSIsPhoneticExtensions) xmlUCSIsPhoneticExtensions __attribute((alias("xmlUCSIsPhoneticExtensions__internal_alias"))); -#else -#ifndef xmlUCSIsPhoneticExtensions -extern __typeof (xmlUCSIsPhoneticExtensions) xmlUCSIsPhoneticExtensions__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsPhoneticExtensions xmlUCSIsPhoneticExtensions__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsPrivateUse -extern __typeof (xmlUCSIsPrivateUse) xmlUCSIsPrivateUse __attribute((alias("xmlUCSIsPrivateUse__internal_alias"))); -#else -#ifndef xmlUCSIsPrivateUse -extern __typeof (xmlUCSIsPrivateUse) xmlUCSIsPrivateUse__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsPrivateUse xmlUCSIsPrivateUse__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsPrivateUseArea -extern __typeof (xmlUCSIsPrivateUseArea) xmlUCSIsPrivateUseArea __attribute((alias("xmlUCSIsPrivateUseArea__internal_alias"))); -#else -#ifndef xmlUCSIsPrivateUseArea -extern __typeof (xmlUCSIsPrivateUseArea) xmlUCSIsPrivateUseArea__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsPrivateUseArea xmlUCSIsPrivateUseArea__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsRunic -extern __typeof (xmlUCSIsRunic) xmlUCSIsRunic __attribute((alias("xmlUCSIsRunic__internal_alias"))); -#else -#ifndef xmlUCSIsRunic -extern __typeof (xmlUCSIsRunic) xmlUCSIsRunic__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsRunic xmlUCSIsRunic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsShavian -extern __typeof (xmlUCSIsShavian) xmlUCSIsShavian __attribute((alias("xmlUCSIsShavian__internal_alias"))); -#else -#ifndef xmlUCSIsShavian -extern __typeof (xmlUCSIsShavian) xmlUCSIsShavian__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsShavian xmlUCSIsShavian__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSinhala -extern __typeof (xmlUCSIsSinhala) xmlUCSIsSinhala __attribute((alias("xmlUCSIsSinhala__internal_alias"))); -#else -#ifndef xmlUCSIsSinhala -extern __typeof (xmlUCSIsSinhala) xmlUCSIsSinhala__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSinhala xmlUCSIsSinhala__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSmallFormVariants -extern __typeof (xmlUCSIsSmallFormVariants) xmlUCSIsSmallFormVariants __attribute((alias("xmlUCSIsSmallFormVariants__internal_alias"))); -#else -#ifndef xmlUCSIsSmallFormVariants -extern __typeof (xmlUCSIsSmallFormVariants) xmlUCSIsSmallFormVariants__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSmallFormVariants xmlUCSIsSmallFormVariants__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSpacingModifierLetters -extern __typeof (xmlUCSIsSpacingModifierLetters) xmlUCSIsSpacingModifierLetters __attribute((alias("xmlUCSIsSpacingModifierLetters__internal_alias"))); -#else -#ifndef xmlUCSIsSpacingModifierLetters -extern __typeof (xmlUCSIsSpacingModifierLetters) xmlUCSIsSpacingModifierLetters__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSpacingModifierLetters xmlUCSIsSpacingModifierLetters__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSpecials -extern __typeof (xmlUCSIsSpecials) xmlUCSIsSpecials __attribute((alias("xmlUCSIsSpecials__internal_alias"))); -#else -#ifndef xmlUCSIsSpecials -extern __typeof (xmlUCSIsSpecials) xmlUCSIsSpecials__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSpecials xmlUCSIsSpecials__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSuperscriptsandSubscripts -extern __typeof (xmlUCSIsSuperscriptsandSubscripts) xmlUCSIsSuperscriptsandSubscripts __attribute((alias("xmlUCSIsSuperscriptsandSubscripts__internal_alias"))); -#else -#ifndef xmlUCSIsSuperscriptsandSubscripts -extern __typeof (xmlUCSIsSuperscriptsandSubscripts) xmlUCSIsSuperscriptsandSubscripts__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSuperscriptsandSubscripts xmlUCSIsSuperscriptsandSubscripts__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSupplementalArrowsA -extern __typeof (xmlUCSIsSupplementalArrowsA) xmlUCSIsSupplementalArrowsA __attribute((alias("xmlUCSIsSupplementalArrowsA__internal_alias"))); -#else -#ifndef xmlUCSIsSupplementalArrowsA -extern __typeof (xmlUCSIsSupplementalArrowsA) xmlUCSIsSupplementalArrowsA__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSupplementalArrowsA xmlUCSIsSupplementalArrowsA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSupplementalArrowsB -extern __typeof (xmlUCSIsSupplementalArrowsB) xmlUCSIsSupplementalArrowsB __attribute((alias("xmlUCSIsSupplementalArrowsB__internal_alias"))); -#else -#ifndef xmlUCSIsSupplementalArrowsB -extern __typeof (xmlUCSIsSupplementalArrowsB) xmlUCSIsSupplementalArrowsB__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSupplementalArrowsB xmlUCSIsSupplementalArrowsB__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSupplementalMathematicalOperators -extern __typeof (xmlUCSIsSupplementalMathematicalOperators) xmlUCSIsSupplementalMathematicalOperators __attribute((alias("xmlUCSIsSupplementalMathematicalOperators__internal_alias"))); -#else -#ifndef xmlUCSIsSupplementalMathematicalOperators -extern __typeof (xmlUCSIsSupplementalMathematicalOperators) xmlUCSIsSupplementalMathematicalOperators__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSupplementalMathematicalOperators xmlUCSIsSupplementalMathematicalOperators__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSupplementaryPrivateUseAreaA -extern __typeof (xmlUCSIsSupplementaryPrivateUseAreaA) xmlUCSIsSupplementaryPrivateUseAreaA __attribute((alias("xmlUCSIsSupplementaryPrivateUseAreaA__internal_alias"))); -#else -#ifndef xmlUCSIsSupplementaryPrivateUseAreaA -extern __typeof (xmlUCSIsSupplementaryPrivateUseAreaA) xmlUCSIsSupplementaryPrivateUseAreaA__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSupplementaryPrivateUseAreaA xmlUCSIsSupplementaryPrivateUseAreaA__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSupplementaryPrivateUseAreaB -extern __typeof (xmlUCSIsSupplementaryPrivateUseAreaB) xmlUCSIsSupplementaryPrivateUseAreaB __attribute((alias("xmlUCSIsSupplementaryPrivateUseAreaB__internal_alias"))); -#else -#ifndef xmlUCSIsSupplementaryPrivateUseAreaB -extern __typeof (xmlUCSIsSupplementaryPrivateUseAreaB) xmlUCSIsSupplementaryPrivateUseAreaB__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSupplementaryPrivateUseAreaB xmlUCSIsSupplementaryPrivateUseAreaB__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsSyriac -extern __typeof (xmlUCSIsSyriac) xmlUCSIsSyriac __attribute((alias("xmlUCSIsSyriac__internal_alias"))); -#else -#ifndef xmlUCSIsSyriac -extern __typeof (xmlUCSIsSyriac) xmlUCSIsSyriac__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsSyriac xmlUCSIsSyriac__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsTagalog -extern __typeof (xmlUCSIsTagalog) xmlUCSIsTagalog __attribute((alias("xmlUCSIsTagalog__internal_alias"))); -#else -#ifndef xmlUCSIsTagalog -extern __typeof (xmlUCSIsTagalog) xmlUCSIsTagalog__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsTagalog xmlUCSIsTagalog__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsTagbanwa -extern __typeof (xmlUCSIsTagbanwa) xmlUCSIsTagbanwa __attribute((alias("xmlUCSIsTagbanwa__internal_alias"))); -#else -#ifndef xmlUCSIsTagbanwa -extern __typeof (xmlUCSIsTagbanwa) xmlUCSIsTagbanwa__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsTagbanwa xmlUCSIsTagbanwa__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsTags -extern __typeof (xmlUCSIsTags) xmlUCSIsTags __attribute((alias("xmlUCSIsTags__internal_alias"))); -#else -#ifndef xmlUCSIsTags -extern __typeof (xmlUCSIsTags) xmlUCSIsTags__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsTags xmlUCSIsTags__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsTaiLe -extern __typeof (xmlUCSIsTaiLe) xmlUCSIsTaiLe __attribute((alias("xmlUCSIsTaiLe__internal_alias"))); -#else -#ifndef xmlUCSIsTaiLe -extern __typeof (xmlUCSIsTaiLe) xmlUCSIsTaiLe__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsTaiLe xmlUCSIsTaiLe__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsTaiXuanJingSymbols -extern __typeof (xmlUCSIsTaiXuanJingSymbols) xmlUCSIsTaiXuanJingSymbols __attribute((alias("xmlUCSIsTaiXuanJingSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsTaiXuanJingSymbols -extern __typeof (xmlUCSIsTaiXuanJingSymbols) xmlUCSIsTaiXuanJingSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsTaiXuanJingSymbols xmlUCSIsTaiXuanJingSymbols__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsTamil -extern __typeof (xmlUCSIsTamil) xmlUCSIsTamil __attribute((alias("xmlUCSIsTamil__internal_alias"))); -#else -#ifndef xmlUCSIsTamil -extern __typeof (xmlUCSIsTamil) xmlUCSIsTamil__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsTamil xmlUCSIsTamil__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsTelugu -extern __typeof (xmlUCSIsTelugu) xmlUCSIsTelugu __attribute((alias("xmlUCSIsTelugu__internal_alias"))); -#else -#ifndef xmlUCSIsTelugu -extern __typeof (xmlUCSIsTelugu) xmlUCSIsTelugu__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsTelugu xmlUCSIsTelugu__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsThaana -extern __typeof (xmlUCSIsThaana) xmlUCSIsThaana __attribute((alias("xmlUCSIsThaana__internal_alias"))); -#else -#ifndef xmlUCSIsThaana -extern __typeof (xmlUCSIsThaana) xmlUCSIsThaana__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsThaana xmlUCSIsThaana__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsThai -extern __typeof (xmlUCSIsThai) xmlUCSIsThai __attribute((alias("xmlUCSIsThai__internal_alias"))); -#else -#ifndef xmlUCSIsThai -extern __typeof (xmlUCSIsThai) xmlUCSIsThai__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsThai xmlUCSIsThai__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsTibetan -extern __typeof (xmlUCSIsTibetan) xmlUCSIsTibetan __attribute((alias("xmlUCSIsTibetan__internal_alias"))); -#else -#ifndef xmlUCSIsTibetan -extern __typeof (xmlUCSIsTibetan) xmlUCSIsTibetan__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsTibetan xmlUCSIsTibetan__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsUgaritic -extern __typeof (xmlUCSIsUgaritic) xmlUCSIsUgaritic __attribute((alias("xmlUCSIsUgaritic__internal_alias"))); -#else -#ifndef xmlUCSIsUgaritic -extern __typeof (xmlUCSIsUgaritic) xmlUCSIsUgaritic__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsUgaritic xmlUCSIsUgaritic__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsUnifiedCanadianAboriginalSyllabics -extern __typeof (xmlUCSIsUnifiedCanadianAboriginalSyllabics) xmlUCSIsUnifiedCanadianAboriginalSyllabics __attribute((alias("xmlUCSIsUnifiedCanadianAboriginalSyllabics__internal_alias"))); -#else -#ifndef xmlUCSIsUnifiedCanadianAboriginalSyllabics -extern __typeof (xmlUCSIsUnifiedCanadianAboriginalSyllabics) xmlUCSIsUnifiedCanadianAboriginalSyllabics__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsUnifiedCanadianAboriginalSyllabics xmlUCSIsUnifiedCanadianAboriginalSyllabics__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsVariationSelectors -extern __typeof (xmlUCSIsVariationSelectors) xmlUCSIsVariationSelectors __attribute((alias("xmlUCSIsVariationSelectors__internal_alias"))); -#else -#ifndef xmlUCSIsVariationSelectors -extern __typeof (xmlUCSIsVariationSelectors) xmlUCSIsVariationSelectors__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsVariationSelectors xmlUCSIsVariationSelectors__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsVariationSelectorsSupplement -extern __typeof (xmlUCSIsVariationSelectorsSupplement) xmlUCSIsVariationSelectorsSupplement __attribute((alias("xmlUCSIsVariationSelectorsSupplement__internal_alias"))); -#else -#ifndef xmlUCSIsVariationSelectorsSupplement -extern __typeof (xmlUCSIsVariationSelectorsSupplement) xmlUCSIsVariationSelectorsSupplement__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsVariationSelectorsSupplement xmlUCSIsVariationSelectorsSupplement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsYiRadicals -extern __typeof (xmlUCSIsYiRadicals) xmlUCSIsYiRadicals __attribute((alias("xmlUCSIsYiRadicals__internal_alias"))); -#else -#ifndef xmlUCSIsYiRadicals -extern __typeof (xmlUCSIsYiRadicals) xmlUCSIsYiRadicals__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsYiRadicals xmlUCSIsYiRadicals__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsYiSyllables -extern __typeof (xmlUCSIsYiSyllables) xmlUCSIsYiSyllables __attribute((alias("xmlUCSIsYiSyllables__internal_alias"))); -#else -#ifndef xmlUCSIsYiSyllables -extern __typeof (xmlUCSIsYiSyllables) xmlUCSIsYiSyllables__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsYiSyllables xmlUCSIsYiSyllables__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_UNICODE_ENABLED) -#ifdef bottom_xmlunicode -#undef xmlUCSIsYijingHexagramSymbols -extern __typeof (xmlUCSIsYijingHexagramSymbols) xmlUCSIsYijingHexagramSymbols __attribute((alias("xmlUCSIsYijingHexagramSymbols__internal_alias"))); -#else -#ifndef xmlUCSIsYijingHexagramSymbols -extern __typeof (xmlUCSIsYijingHexagramSymbols) xmlUCSIsYijingHexagramSymbols__internal_alias __attribute((visibility("hidden"))); -#define xmlUCSIsYijingHexagramSymbols xmlUCSIsYijingHexagramSymbols__internal_alias -#endif -#endif -#endif - -#ifdef bottom_uri -#undef xmlURIEscape -extern __typeof (xmlURIEscape) xmlURIEscape __attribute((alias("xmlURIEscape__internal_alias"))); -#else -#ifndef xmlURIEscape -extern __typeof (xmlURIEscape) xmlURIEscape__internal_alias __attribute((visibility("hidden"))); -#define xmlURIEscape xmlURIEscape__internal_alias -#endif -#endif - -#ifdef bottom_uri -#undef xmlURIEscapeStr -extern __typeof (xmlURIEscapeStr) xmlURIEscapeStr __attribute((alias("xmlURIEscapeStr__internal_alias"))); -#else -#ifndef xmlURIEscapeStr -extern __typeof (xmlURIEscapeStr) xmlURIEscapeStr__internal_alias __attribute((visibility("hidden"))); -#define xmlURIEscapeStr xmlURIEscapeStr__internal_alias -#endif -#endif - -#ifdef bottom_uri -#undef xmlURIUnescapeString -extern __typeof (xmlURIUnescapeString) xmlURIUnescapeString __attribute((alias("xmlURIUnescapeString__internal_alias"))); -#else -#ifndef xmlURIUnescapeString -extern __typeof (xmlURIUnescapeString) xmlURIUnescapeString__internal_alias __attribute((visibility("hidden"))); -#define xmlURIUnescapeString xmlURIUnescapeString__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlUTF8Charcmp -extern __typeof (xmlUTF8Charcmp) xmlUTF8Charcmp __attribute((alias("xmlUTF8Charcmp__internal_alias"))); -#else -#ifndef xmlUTF8Charcmp -extern __typeof (xmlUTF8Charcmp) xmlUTF8Charcmp__internal_alias __attribute((visibility("hidden"))); -#define xmlUTF8Charcmp xmlUTF8Charcmp__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlUTF8Size -extern __typeof (xmlUTF8Size) xmlUTF8Size __attribute((alias("xmlUTF8Size__internal_alias"))); -#else -#ifndef xmlUTF8Size -extern __typeof (xmlUTF8Size) xmlUTF8Size__internal_alias __attribute((visibility("hidden"))); -#define xmlUTF8Size xmlUTF8Size__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlUTF8Strlen -extern __typeof (xmlUTF8Strlen) xmlUTF8Strlen __attribute((alias("xmlUTF8Strlen__internal_alias"))); -#else -#ifndef xmlUTF8Strlen -extern __typeof (xmlUTF8Strlen) xmlUTF8Strlen__internal_alias __attribute((visibility("hidden"))); -#define xmlUTF8Strlen xmlUTF8Strlen__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlUTF8Strloc -extern __typeof (xmlUTF8Strloc) xmlUTF8Strloc __attribute((alias("xmlUTF8Strloc__internal_alias"))); -#else -#ifndef xmlUTF8Strloc -extern __typeof (xmlUTF8Strloc) xmlUTF8Strloc__internal_alias __attribute((visibility("hidden"))); -#define xmlUTF8Strloc xmlUTF8Strloc__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlUTF8Strndup -extern __typeof (xmlUTF8Strndup) xmlUTF8Strndup __attribute((alias("xmlUTF8Strndup__internal_alias"))); -#else -#ifndef xmlUTF8Strndup -extern __typeof (xmlUTF8Strndup) xmlUTF8Strndup__internal_alias __attribute((visibility("hidden"))); -#define xmlUTF8Strndup xmlUTF8Strndup__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlUTF8Strpos -extern __typeof (xmlUTF8Strpos) xmlUTF8Strpos __attribute((alias("xmlUTF8Strpos__internal_alias"))); -#else -#ifndef xmlUTF8Strpos -extern __typeof (xmlUTF8Strpos) xmlUTF8Strpos__internal_alias __attribute((visibility("hidden"))); -#define xmlUTF8Strpos xmlUTF8Strpos__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlUTF8Strsize -extern __typeof (xmlUTF8Strsize) xmlUTF8Strsize __attribute((alias("xmlUTF8Strsize__internal_alias"))); -#else -#ifndef xmlUTF8Strsize -extern __typeof (xmlUTF8Strsize) xmlUTF8Strsize__internal_alias __attribute((visibility("hidden"))); -#define xmlUTF8Strsize xmlUTF8Strsize__internal_alias -#endif -#endif - -#ifdef bottom_xmlstring -#undef xmlUTF8Strsub -extern __typeof (xmlUTF8Strsub) xmlUTF8Strsub __attribute((alias("xmlUTF8Strsub__internal_alias"))); -#else -#ifndef xmlUTF8Strsub -extern __typeof (xmlUTF8Strsub) xmlUTF8Strsub__internal_alias __attribute((visibility("hidden"))); -#define xmlUTF8Strsub xmlUTF8Strsub__internal_alias -#endif -#endif - -#ifdef bottom_tree -#undef xmlUnlinkNode -extern __typeof (xmlUnlinkNode) xmlUnlinkNode __attribute((alias("xmlUnlinkNode__internal_alias"))); -#else -#ifndef xmlUnlinkNode -extern __typeof (xmlUnlinkNode) xmlUnlinkNode__internal_alias __attribute((visibility("hidden"))); -#define xmlUnlinkNode xmlUnlinkNode__internal_alias -#endif -#endif - -#ifdef bottom_threads -#undef xmlUnlockLibrary -extern __typeof (xmlUnlockLibrary) xmlUnlockLibrary __attribute((alias("xmlUnlockLibrary__internal_alias"))); -#else -#ifndef xmlUnlockLibrary -extern __typeof (xmlUnlockLibrary) xmlUnlockLibrary__internal_alias __attribute((visibility("hidden"))); -#define xmlUnlockLibrary xmlUnlockLibrary__internal_alias -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlUnsetNsProp -extern __typeof (xmlUnsetNsProp) xmlUnsetNsProp __attribute((alias("xmlUnsetNsProp__internal_alias"))); -#else -#ifndef xmlUnsetNsProp -extern __typeof (xmlUnsetNsProp) xmlUnsetNsProp__internal_alias __attribute((visibility("hidden"))); -#define xmlUnsetNsProp xmlUnsetNsProp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlUnsetProp -extern __typeof (xmlUnsetProp) xmlUnsetProp __attribute((alias("xmlUnsetProp__internal_alias"))); -#else -#ifndef xmlUnsetProp -extern __typeof (xmlUnsetProp) xmlUnsetProp__internal_alias __attribute((visibility("hidden"))); -#define xmlUnsetProp xmlUnsetProp__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_valid -#undef xmlValidBuildContentModel -extern __typeof (xmlValidBuildContentModel) xmlValidBuildContentModel __attribute((alias("xmlValidBuildContentModel__internal_alias"))); -#else -#ifndef xmlValidBuildContentModel -extern __typeof (xmlValidBuildContentModel) xmlValidBuildContentModel__internal_alias __attribute((visibility("hidden"))); -#define xmlValidBuildContentModel xmlValidBuildContentModel__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidCtxtNormalizeAttributeValue -extern __typeof (xmlValidCtxtNormalizeAttributeValue) xmlValidCtxtNormalizeAttributeValue __attribute((alias("xmlValidCtxtNormalizeAttributeValue__internal_alias"))); -#else -#ifndef xmlValidCtxtNormalizeAttributeValue -extern __typeof (xmlValidCtxtNormalizeAttributeValue) xmlValidCtxtNormalizeAttributeValue__internal_alias __attribute((visibility("hidden"))); -#define xmlValidCtxtNormalizeAttributeValue xmlValidCtxtNormalizeAttributeValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidGetPotentialChildren -extern __typeof (xmlValidGetPotentialChildren) xmlValidGetPotentialChildren __attribute((alias("xmlValidGetPotentialChildren__internal_alias"))); -#else -#ifndef xmlValidGetPotentialChildren -extern __typeof (xmlValidGetPotentialChildren) xmlValidGetPotentialChildren__internal_alias __attribute((visibility("hidden"))); -#define xmlValidGetPotentialChildren xmlValidGetPotentialChildren__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidGetValidElements -extern __typeof (xmlValidGetValidElements) xmlValidGetValidElements __attribute((alias("xmlValidGetValidElements__internal_alias"))); -#else -#ifndef xmlValidGetValidElements -extern __typeof (xmlValidGetValidElements) xmlValidGetValidElements__internal_alias __attribute((visibility("hidden"))); -#define xmlValidGetValidElements xmlValidGetValidElements__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidNormalizeAttributeValue -extern __typeof (xmlValidNormalizeAttributeValue) xmlValidNormalizeAttributeValue __attribute((alias("xmlValidNormalizeAttributeValue__internal_alias"))); -#else -#ifndef xmlValidNormalizeAttributeValue -extern __typeof (xmlValidNormalizeAttributeValue) xmlValidNormalizeAttributeValue__internal_alias __attribute((visibility("hidden"))); -#define xmlValidNormalizeAttributeValue xmlValidNormalizeAttributeValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateAttributeDecl -extern __typeof (xmlValidateAttributeDecl) xmlValidateAttributeDecl __attribute((alias("xmlValidateAttributeDecl__internal_alias"))); -#else -#ifndef xmlValidateAttributeDecl -extern __typeof (xmlValidateAttributeDecl) xmlValidateAttributeDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateAttributeDecl xmlValidateAttributeDecl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateAttributeValue -extern __typeof (xmlValidateAttributeValue) xmlValidateAttributeValue __attribute((alias("xmlValidateAttributeValue__internal_alias"))); -#else -#ifndef xmlValidateAttributeValue -extern __typeof (xmlValidateAttributeValue) xmlValidateAttributeValue__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateAttributeValue xmlValidateAttributeValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateDocument -extern __typeof (xmlValidateDocument) xmlValidateDocument __attribute((alias("xmlValidateDocument__internal_alias"))); -#else -#ifndef xmlValidateDocument -extern __typeof (xmlValidateDocument) xmlValidateDocument__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateDocument xmlValidateDocument__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateDocumentFinal -extern __typeof (xmlValidateDocumentFinal) xmlValidateDocumentFinal __attribute((alias("xmlValidateDocumentFinal__internal_alias"))); -#else -#ifndef xmlValidateDocumentFinal -extern __typeof (xmlValidateDocumentFinal) xmlValidateDocumentFinal__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateDocumentFinal xmlValidateDocumentFinal__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateDtd -extern __typeof (xmlValidateDtd) xmlValidateDtd __attribute((alias("xmlValidateDtd__internal_alias"))); -#else -#ifndef xmlValidateDtd -extern __typeof (xmlValidateDtd) xmlValidateDtd__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateDtd xmlValidateDtd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateDtdFinal -extern __typeof (xmlValidateDtdFinal) xmlValidateDtdFinal __attribute((alias("xmlValidateDtdFinal__internal_alias"))); -#else -#ifndef xmlValidateDtdFinal -extern __typeof (xmlValidateDtdFinal) xmlValidateDtdFinal__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateDtdFinal xmlValidateDtdFinal__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateElement -extern __typeof (xmlValidateElement) xmlValidateElement __attribute((alias("xmlValidateElement__internal_alias"))); -#else -#ifndef xmlValidateElement -extern __typeof (xmlValidateElement) xmlValidateElement__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateElement xmlValidateElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateElementDecl -extern __typeof (xmlValidateElementDecl) xmlValidateElementDecl __attribute((alias("xmlValidateElementDecl__internal_alias"))); -#else -#ifndef xmlValidateElementDecl -extern __typeof (xmlValidateElementDecl) xmlValidateElementDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateElementDecl xmlValidateElementDecl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) -#ifdef bottom_tree -#undef xmlValidateNCName -extern __typeof (xmlValidateNCName) xmlValidateNCName __attribute((alias("xmlValidateNCName__internal_alias"))); -#else -#ifndef xmlValidateNCName -extern __typeof (xmlValidateNCName) xmlValidateNCName__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateNCName xmlValidateNCName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlValidateNMToken -extern __typeof (xmlValidateNMToken) xmlValidateNMToken __attribute((alias("xmlValidateNMToken__internal_alias"))); -#else -#ifndef xmlValidateNMToken -extern __typeof (xmlValidateNMToken) xmlValidateNMToken__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateNMToken xmlValidateNMToken__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlValidateName -extern __typeof (xmlValidateName) xmlValidateName __attribute((alias("xmlValidateName__internal_alias"))); -#else -#ifndef xmlValidateName -extern __typeof (xmlValidateName) xmlValidateName__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateName xmlValidateName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateNameValue -extern __typeof (xmlValidateNameValue) xmlValidateNameValue __attribute((alias("xmlValidateNameValue__internal_alias"))); -#else -#ifndef xmlValidateNameValue -extern __typeof (xmlValidateNameValue) xmlValidateNameValue__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateNameValue xmlValidateNameValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateNamesValue -extern __typeof (xmlValidateNamesValue) xmlValidateNamesValue __attribute((alias("xmlValidateNamesValue__internal_alias"))); -#else -#ifndef xmlValidateNamesValue -extern __typeof (xmlValidateNamesValue) xmlValidateNamesValue__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateNamesValue xmlValidateNamesValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateNmtokenValue -extern __typeof (xmlValidateNmtokenValue) xmlValidateNmtokenValue __attribute((alias("xmlValidateNmtokenValue__internal_alias"))); -#else -#ifndef xmlValidateNmtokenValue -extern __typeof (xmlValidateNmtokenValue) xmlValidateNmtokenValue__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateNmtokenValue xmlValidateNmtokenValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateNmtokensValue -extern __typeof (xmlValidateNmtokensValue) xmlValidateNmtokensValue __attribute((alias("xmlValidateNmtokensValue__internal_alias"))); -#else -#ifndef xmlValidateNmtokensValue -extern __typeof (xmlValidateNmtokensValue) xmlValidateNmtokensValue__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateNmtokensValue xmlValidateNmtokensValue__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateNotationDecl -extern __typeof (xmlValidateNotationDecl) xmlValidateNotationDecl __attribute((alias("xmlValidateNotationDecl__internal_alias"))); -#else -#ifndef xmlValidateNotationDecl -extern __typeof (xmlValidateNotationDecl) xmlValidateNotationDecl__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateNotationDecl xmlValidateNotationDecl__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_valid -#undef xmlValidateNotationUse -extern __typeof (xmlValidateNotationUse) xmlValidateNotationUse __attribute((alias("xmlValidateNotationUse__internal_alias"))); -#else -#ifndef xmlValidateNotationUse -extern __typeof (xmlValidateNotationUse) xmlValidateNotationUse__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateNotationUse xmlValidateNotationUse__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateOneAttribute -extern __typeof (xmlValidateOneAttribute) xmlValidateOneAttribute __attribute((alias("xmlValidateOneAttribute__internal_alias"))); -#else -#ifndef xmlValidateOneAttribute -extern __typeof (xmlValidateOneAttribute) xmlValidateOneAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateOneAttribute xmlValidateOneAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateOneElement -extern __typeof (xmlValidateOneElement) xmlValidateOneElement __attribute((alias("xmlValidateOneElement__internal_alias"))); -#else -#ifndef xmlValidateOneElement -extern __typeof (xmlValidateOneElement) xmlValidateOneElement__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateOneElement xmlValidateOneElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateOneNamespace -extern __typeof (xmlValidateOneNamespace) xmlValidateOneNamespace __attribute((alias("xmlValidateOneNamespace__internal_alias"))); -#else -#ifndef xmlValidateOneNamespace -extern __typeof (xmlValidateOneNamespace) xmlValidateOneNamespace__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateOneNamespace xmlValidateOneNamespace__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_valid -#undef xmlValidatePopElement -extern __typeof (xmlValidatePopElement) xmlValidatePopElement __attribute((alias("xmlValidatePopElement__internal_alias"))); -#else -#ifndef xmlValidatePopElement -extern __typeof (xmlValidatePopElement) xmlValidatePopElement__internal_alias __attribute((visibility("hidden"))); -#define xmlValidatePopElement xmlValidatePopElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_valid -#undef xmlValidatePushCData -extern __typeof (xmlValidatePushCData) xmlValidatePushCData __attribute((alias("xmlValidatePushCData__internal_alias"))); -#else -#ifndef xmlValidatePushCData -extern __typeof (xmlValidatePushCData) xmlValidatePushCData__internal_alias __attribute((visibility("hidden"))); -#define xmlValidatePushCData xmlValidatePushCData__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) -#ifdef bottom_valid -#undef xmlValidatePushElement -extern __typeof (xmlValidatePushElement) xmlValidatePushElement __attribute((alias("xmlValidatePushElement__internal_alias"))); -#else -#ifndef xmlValidatePushElement -extern __typeof (xmlValidatePushElement) xmlValidatePushElement__internal_alias __attribute((visibility("hidden"))); -#define xmlValidatePushElement xmlValidatePushElement__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_tree -#undef xmlValidateQName -extern __typeof (xmlValidateQName) xmlValidateQName __attribute((alias("xmlValidateQName__internal_alias"))); -#else -#ifndef xmlValidateQName -extern __typeof (xmlValidateQName) xmlValidateQName__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateQName xmlValidateQName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_VALID_ENABLED) -#ifdef bottom_valid -#undef xmlValidateRoot -extern __typeof (xmlValidateRoot) xmlValidateRoot __attribute((alias("xmlValidateRoot__internal_alias"))); -#else -#ifndef xmlValidateRoot -extern __typeof (xmlValidateRoot) xmlValidateRoot__internal_alias __attribute((visibility("hidden"))); -#define xmlValidateRoot xmlValidateRoot__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_xinclude -#undef xmlXIncludeFreeContext -extern __typeof (xmlXIncludeFreeContext) xmlXIncludeFreeContext __attribute((alias("xmlXIncludeFreeContext__internal_alias"))); -#else -#ifndef xmlXIncludeFreeContext -extern __typeof (xmlXIncludeFreeContext) xmlXIncludeFreeContext__internal_alias __attribute((visibility("hidden"))); -#define xmlXIncludeFreeContext xmlXIncludeFreeContext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_xinclude -#undef xmlXIncludeNewContext -extern __typeof (xmlXIncludeNewContext) xmlXIncludeNewContext __attribute((alias("xmlXIncludeNewContext__internal_alias"))); -#else -#ifndef xmlXIncludeNewContext -extern __typeof (xmlXIncludeNewContext) xmlXIncludeNewContext__internal_alias __attribute((visibility("hidden"))); -#define xmlXIncludeNewContext xmlXIncludeNewContext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_xinclude -#undef xmlXIncludeProcess -extern __typeof (xmlXIncludeProcess) xmlXIncludeProcess __attribute((alias("xmlXIncludeProcess__internal_alias"))); -#else -#ifndef xmlXIncludeProcess -extern __typeof (xmlXIncludeProcess) xmlXIncludeProcess__internal_alias __attribute((visibility("hidden"))); -#define xmlXIncludeProcess xmlXIncludeProcess__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_xinclude -#undef xmlXIncludeProcessFlags -extern __typeof (xmlXIncludeProcessFlags) xmlXIncludeProcessFlags __attribute((alias("xmlXIncludeProcessFlags__internal_alias"))); -#else -#ifndef xmlXIncludeProcessFlags -extern __typeof (xmlXIncludeProcessFlags) xmlXIncludeProcessFlags__internal_alias __attribute((visibility("hidden"))); -#define xmlXIncludeProcessFlags xmlXIncludeProcessFlags__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_xinclude -#undef xmlXIncludeProcessNode -extern __typeof (xmlXIncludeProcessNode) xmlXIncludeProcessNode __attribute((alias("xmlXIncludeProcessNode__internal_alias"))); -#else -#ifndef xmlXIncludeProcessNode -extern __typeof (xmlXIncludeProcessNode) xmlXIncludeProcessNode__internal_alias __attribute((visibility("hidden"))); -#define xmlXIncludeProcessNode xmlXIncludeProcessNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_xinclude -#undef xmlXIncludeProcessTree -extern __typeof (xmlXIncludeProcessTree) xmlXIncludeProcessTree __attribute((alias("xmlXIncludeProcessTree__internal_alias"))); -#else -#ifndef xmlXIncludeProcessTree -extern __typeof (xmlXIncludeProcessTree) xmlXIncludeProcessTree__internal_alias __attribute((visibility("hidden"))); -#define xmlXIncludeProcessTree xmlXIncludeProcessTree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_xinclude -#undef xmlXIncludeProcessTreeFlags -extern __typeof (xmlXIncludeProcessTreeFlags) xmlXIncludeProcessTreeFlags __attribute((alias("xmlXIncludeProcessTreeFlags__internal_alias"))); -#else -#ifndef xmlXIncludeProcessTreeFlags -extern __typeof (xmlXIncludeProcessTreeFlags) xmlXIncludeProcessTreeFlags__internal_alias __attribute((visibility("hidden"))); -#define xmlXIncludeProcessTreeFlags xmlXIncludeProcessTreeFlags__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XINCLUDE_ENABLED) -#ifdef bottom_xinclude -#undef xmlXIncludeSetFlags -extern __typeof (xmlXIncludeSetFlags) xmlXIncludeSetFlags __attribute((alias("xmlXIncludeSetFlags__internal_alias"))); -#else -#ifndef xmlXIncludeSetFlags -extern __typeof (xmlXIncludeSetFlags) xmlXIncludeSetFlags__internal_alias __attribute((visibility("hidden"))); -#define xmlXIncludeSetFlags xmlXIncludeSetFlags__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathAddValues -extern __typeof (xmlXPathAddValues) xmlXPathAddValues __attribute((alias("xmlXPathAddValues__internal_alias"))); -#else -#ifndef xmlXPathAddValues -extern __typeof (xmlXPathAddValues) xmlXPathAddValues__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathAddValues xmlXPathAddValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathBooleanFunction -extern __typeof (xmlXPathBooleanFunction) xmlXPathBooleanFunction __attribute((alias("xmlXPathBooleanFunction__internal_alias"))); -#else -#ifndef xmlXPathBooleanFunction -extern __typeof (xmlXPathBooleanFunction) xmlXPathBooleanFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathBooleanFunction xmlXPathBooleanFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastBooleanToNumber -extern __typeof (xmlXPathCastBooleanToNumber) xmlXPathCastBooleanToNumber __attribute((alias("xmlXPathCastBooleanToNumber__internal_alias"))); -#else -#ifndef xmlXPathCastBooleanToNumber -extern __typeof (xmlXPathCastBooleanToNumber) xmlXPathCastBooleanToNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastBooleanToNumber xmlXPathCastBooleanToNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastBooleanToString -extern __typeof (xmlXPathCastBooleanToString) xmlXPathCastBooleanToString __attribute((alias("xmlXPathCastBooleanToString__internal_alias"))); -#else -#ifndef xmlXPathCastBooleanToString -extern __typeof (xmlXPathCastBooleanToString) xmlXPathCastBooleanToString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastBooleanToString xmlXPathCastBooleanToString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastNodeSetToBoolean -extern __typeof (xmlXPathCastNodeSetToBoolean) xmlXPathCastNodeSetToBoolean __attribute((alias("xmlXPathCastNodeSetToBoolean__internal_alias"))); -#else -#ifndef xmlXPathCastNodeSetToBoolean -extern __typeof (xmlXPathCastNodeSetToBoolean) xmlXPathCastNodeSetToBoolean__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastNodeSetToBoolean xmlXPathCastNodeSetToBoolean__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastNodeSetToNumber -extern __typeof (xmlXPathCastNodeSetToNumber) xmlXPathCastNodeSetToNumber __attribute((alias("xmlXPathCastNodeSetToNumber__internal_alias"))); -#else -#ifndef xmlXPathCastNodeSetToNumber -extern __typeof (xmlXPathCastNodeSetToNumber) xmlXPathCastNodeSetToNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastNodeSetToNumber xmlXPathCastNodeSetToNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastNodeSetToString -extern __typeof (xmlXPathCastNodeSetToString) xmlXPathCastNodeSetToString __attribute((alias("xmlXPathCastNodeSetToString__internal_alias"))); -#else -#ifndef xmlXPathCastNodeSetToString -extern __typeof (xmlXPathCastNodeSetToString) xmlXPathCastNodeSetToString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastNodeSetToString xmlXPathCastNodeSetToString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastNodeToNumber -extern __typeof (xmlXPathCastNodeToNumber) xmlXPathCastNodeToNumber __attribute((alias("xmlXPathCastNodeToNumber__internal_alias"))); -#else -#ifndef xmlXPathCastNodeToNumber -extern __typeof (xmlXPathCastNodeToNumber) xmlXPathCastNodeToNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastNodeToNumber xmlXPathCastNodeToNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastNodeToString -extern __typeof (xmlXPathCastNodeToString) xmlXPathCastNodeToString __attribute((alias("xmlXPathCastNodeToString__internal_alias"))); -#else -#ifndef xmlXPathCastNodeToString -extern __typeof (xmlXPathCastNodeToString) xmlXPathCastNodeToString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastNodeToString xmlXPathCastNodeToString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastNumberToBoolean -extern __typeof (xmlXPathCastNumberToBoolean) xmlXPathCastNumberToBoolean __attribute((alias("xmlXPathCastNumberToBoolean__internal_alias"))); -#else -#ifndef xmlXPathCastNumberToBoolean -extern __typeof (xmlXPathCastNumberToBoolean) xmlXPathCastNumberToBoolean__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastNumberToBoolean xmlXPathCastNumberToBoolean__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastNumberToString -extern __typeof (xmlXPathCastNumberToString) xmlXPathCastNumberToString __attribute((alias("xmlXPathCastNumberToString__internal_alias"))); -#else -#ifndef xmlXPathCastNumberToString -extern __typeof (xmlXPathCastNumberToString) xmlXPathCastNumberToString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastNumberToString xmlXPathCastNumberToString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastStringToBoolean -extern __typeof (xmlXPathCastStringToBoolean) xmlXPathCastStringToBoolean __attribute((alias("xmlXPathCastStringToBoolean__internal_alias"))); -#else -#ifndef xmlXPathCastStringToBoolean -extern __typeof (xmlXPathCastStringToBoolean) xmlXPathCastStringToBoolean__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastStringToBoolean xmlXPathCastStringToBoolean__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastStringToNumber -extern __typeof (xmlXPathCastStringToNumber) xmlXPathCastStringToNumber __attribute((alias("xmlXPathCastStringToNumber__internal_alias"))); -#else -#ifndef xmlXPathCastStringToNumber -extern __typeof (xmlXPathCastStringToNumber) xmlXPathCastStringToNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastStringToNumber xmlXPathCastStringToNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastToBoolean -extern __typeof (xmlXPathCastToBoolean) xmlXPathCastToBoolean __attribute((alias("xmlXPathCastToBoolean__internal_alias"))); -#else -#ifndef xmlXPathCastToBoolean -extern __typeof (xmlXPathCastToBoolean) xmlXPathCastToBoolean__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastToBoolean xmlXPathCastToBoolean__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastToNumber -extern __typeof (xmlXPathCastToNumber) xmlXPathCastToNumber __attribute((alias("xmlXPathCastToNumber__internal_alias"))); -#else -#ifndef xmlXPathCastToNumber -extern __typeof (xmlXPathCastToNumber) xmlXPathCastToNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastToNumber xmlXPathCastToNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCastToString -extern __typeof (xmlXPathCastToString) xmlXPathCastToString __attribute((alias("xmlXPathCastToString__internal_alias"))); -#else -#ifndef xmlXPathCastToString -extern __typeof (xmlXPathCastToString) xmlXPathCastToString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCastToString xmlXPathCastToString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCeilingFunction -extern __typeof (xmlXPathCeilingFunction) xmlXPathCeilingFunction __attribute((alias("xmlXPathCeilingFunction__internal_alias"))); -#else -#ifndef xmlXPathCeilingFunction -extern __typeof (xmlXPathCeilingFunction) xmlXPathCeilingFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCeilingFunction xmlXPathCeilingFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCmpNodes -extern __typeof (xmlXPathCmpNodes) xmlXPathCmpNodes __attribute((alias("xmlXPathCmpNodes__internal_alias"))); -#else -#ifndef xmlXPathCmpNodes -extern __typeof (xmlXPathCmpNodes) xmlXPathCmpNodes__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCmpNodes xmlXPathCmpNodes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCompareValues -extern __typeof (xmlXPathCompareValues) xmlXPathCompareValues __attribute((alias("xmlXPathCompareValues__internal_alias"))); -#else -#ifndef xmlXPathCompareValues -extern __typeof (xmlXPathCompareValues) xmlXPathCompareValues__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCompareValues xmlXPathCompareValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCompile -extern __typeof (xmlXPathCompile) xmlXPathCompile __attribute((alias("xmlXPathCompile__internal_alias"))); -#else -#ifndef xmlXPathCompile -extern __typeof (xmlXPathCompile) xmlXPathCompile__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCompile xmlXPathCompile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCompiledEval -extern __typeof (xmlXPathCompiledEval) xmlXPathCompiledEval __attribute((alias("xmlXPathCompiledEval__internal_alias"))); -#else -#ifndef xmlXPathCompiledEval -extern __typeof (xmlXPathCompiledEval) xmlXPathCompiledEval__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCompiledEval xmlXPathCompiledEval__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathConcatFunction -extern __typeof (xmlXPathConcatFunction) xmlXPathConcatFunction __attribute((alias("xmlXPathConcatFunction__internal_alias"))); -#else -#ifndef xmlXPathConcatFunction -extern __typeof (xmlXPathConcatFunction) xmlXPathConcatFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathConcatFunction xmlXPathConcatFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathContainsFunction -extern __typeof (xmlXPathContainsFunction) xmlXPathContainsFunction __attribute((alias("xmlXPathContainsFunction__internal_alias"))); -#else -#ifndef xmlXPathContainsFunction -extern __typeof (xmlXPathContainsFunction) xmlXPathContainsFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathContainsFunction xmlXPathContainsFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathConvertBoolean -extern __typeof (xmlXPathConvertBoolean) xmlXPathConvertBoolean __attribute((alias("xmlXPathConvertBoolean__internal_alias"))); -#else -#ifndef xmlXPathConvertBoolean -extern __typeof (xmlXPathConvertBoolean) xmlXPathConvertBoolean__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathConvertBoolean xmlXPathConvertBoolean__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathConvertNumber -extern __typeof (xmlXPathConvertNumber) xmlXPathConvertNumber __attribute((alias("xmlXPathConvertNumber__internal_alias"))); -#else -#ifndef xmlXPathConvertNumber -extern __typeof (xmlXPathConvertNumber) xmlXPathConvertNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathConvertNumber xmlXPathConvertNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathConvertString -extern __typeof (xmlXPathConvertString) xmlXPathConvertString __attribute((alias("xmlXPathConvertString__internal_alias"))); -#else -#ifndef xmlXPathConvertString -extern __typeof (xmlXPathConvertString) xmlXPathConvertString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathConvertString xmlXPathConvertString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCountFunction -extern __typeof (xmlXPathCountFunction) xmlXPathCountFunction __attribute((alias("xmlXPathCountFunction__internal_alias"))); -#else -#ifndef xmlXPathCountFunction -extern __typeof (xmlXPathCountFunction) xmlXPathCountFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCountFunction xmlXPathCountFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathCtxtCompile -extern __typeof (xmlXPathCtxtCompile) xmlXPathCtxtCompile __attribute((alias("xmlXPathCtxtCompile__internal_alias"))); -#else -#ifndef xmlXPathCtxtCompile -extern __typeof (xmlXPathCtxtCompile) xmlXPathCtxtCompile__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathCtxtCompile xmlXPathCtxtCompile__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathDebugDumpCompExpr -extern __typeof (xmlXPathDebugDumpCompExpr) xmlXPathDebugDumpCompExpr __attribute((alias("xmlXPathDebugDumpCompExpr__internal_alias"))); -#else -#ifndef xmlXPathDebugDumpCompExpr -extern __typeof (xmlXPathDebugDumpCompExpr) xmlXPathDebugDumpCompExpr__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathDebugDumpCompExpr xmlXPathDebugDumpCompExpr__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathDebugDumpObject -extern __typeof (xmlXPathDebugDumpObject) xmlXPathDebugDumpObject __attribute((alias("xmlXPathDebugDumpObject__internal_alias"))); -#else -#ifndef xmlXPathDebugDumpObject -extern __typeof (xmlXPathDebugDumpObject) xmlXPathDebugDumpObject__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathDebugDumpObject xmlXPathDebugDumpObject__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathDifference -extern __typeof (xmlXPathDifference) xmlXPathDifference __attribute((alias("xmlXPathDifference__internal_alias"))); -#else -#ifndef xmlXPathDifference -extern __typeof (xmlXPathDifference) xmlXPathDifference__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathDifference xmlXPathDifference__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathDistinct -extern __typeof (xmlXPathDistinct) xmlXPathDistinct __attribute((alias("xmlXPathDistinct__internal_alias"))); -#else -#ifndef xmlXPathDistinct -extern __typeof (xmlXPathDistinct) xmlXPathDistinct__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathDistinct xmlXPathDistinct__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathDistinctSorted -extern __typeof (xmlXPathDistinctSorted) xmlXPathDistinctSorted __attribute((alias("xmlXPathDistinctSorted__internal_alias"))); -#else -#ifndef xmlXPathDistinctSorted -extern __typeof (xmlXPathDistinctSorted) xmlXPathDistinctSorted__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathDistinctSorted xmlXPathDistinctSorted__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathDivValues -extern __typeof (xmlXPathDivValues) xmlXPathDivValues __attribute((alias("xmlXPathDivValues__internal_alias"))); -#else -#ifndef xmlXPathDivValues -extern __typeof (xmlXPathDivValues) xmlXPathDivValues__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathDivValues xmlXPathDivValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathEqualValues -extern __typeof (xmlXPathEqualValues) xmlXPathEqualValues __attribute((alias("xmlXPathEqualValues__internal_alias"))); -#else -#ifndef xmlXPathEqualValues -extern __typeof (xmlXPathEqualValues) xmlXPathEqualValues__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathEqualValues xmlXPathEqualValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathErr -extern __typeof (xmlXPathErr) xmlXPathErr __attribute((alias("xmlXPathErr__internal_alias"))); -#else -#ifndef xmlXPathErr -extern __typeof (xmlXPathErr) xmlXPathErr__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathErr xmlXPathErr__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathEval -extern __typeof (xmlXPathEval) xmlXPathEval __attribute((alias("xmlXPathEval__internal_alias"))); -#else -#ifndef xmlXPathEval -extern __typeof (xmlXPathEval) xmlXPathEval__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathEval xmlXPathEval__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathEvalExpr -extern __typeof (xmlXPathEvalExpr) xmlXPathEvalExpr __attribute((alias("xmlXPathEvalExpr__internal_alias"))); -#else -#ifndef xmlXPathEvalExpr -extern __typeof (xmlXPathEvalExpr) xmlXPathEvalExpr__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathEvalExpr xmlXPathEvalExpr__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathEvalExpression -extern __typeof (xmlXPathEvalExpression) xmlXPathEvalExpression __attribute((alias("xmlXPathEvalExpression__internal_alias"))); -#else -#ifndef xmlXPathEvalExpression -extern __typeof (xmlXPathEvalExpression) xmlXPathEvalExpression__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathEvalExpression xmlXPathEvalExpression__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathEvalPredicate -extern __typeof (xmlXPathEvalPredicate) xmlXPathEvalPredicate __attribute((alias("xmlXPathEvalPredicate__internal_alias"))); -#else -#ifndef xmlXPathEvalPredicate -extern __typeof (xmlXPathEvalPredicate) xmlXPathEvalPredicate__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathEvalPredicate xmlXPathEvalPredicate__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathEvaluatePredicateResult -extern __typeof (xmlXPathEvaluatePredicateResult) xmlXPathEvaluatePredicateResult __attribute((alias("xmlXPathEvaluatePredicateResult__internal_alias"))); -#else -#ifndef xmlXPathEvaluatePredicateResult -extern __typeof (xmlXPathEvaluatePredicateResult) xmlXPathEvaluatePredicateResult__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathEvaluatePredicateResult xmlXPathEvaluatePredicateResult__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFalseFunction -extern __typeof (xmlXPathFalseFunction) xmlXPathFalseFunction __attribute((alias("xmlXPathFalseFunction__internal_alias"))); -#else -#ifndef xmlXPathFalseFunction -extern __typeof (xmlXPathFalseFunction) xmlXPathFalseFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFalseFunction xmlXPathFalseFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFloorFunction -extern __typeof (xmlXPathFloorFunction) xmlXPathFloorFunction __attribute((alias("xmlXPathFloorFunction__internal_alias"))); -#else -#ifndef xmlXPathFloorFunction -extern __typeof (xmlXPathFloorFunction) xmlXPathFloorFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFloorFunction xmlXPathFloorFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFreeCompExpr -extern __typeof (xmlXPathFreeCompExpr) xmlXPathFreeCompExpr __attribute((alias("xmlXPathFreeCompExpr__internal_alias"))); -#else -#ifndef xmlXPathFreeCompExpr -extern __typeof (xmlXPathFreeCompExpr) xmlXPathFreeCompExpr__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFreeCompExpr xmlXPathFreeCompExpr__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFreeContext -extern __typeof (xmlXPathFreeContext) xmlXPathFreeContext __attribute((alias("xmlXPathFreeContext__internal_alias"))); -#else -#ifndef xmlXPathFreeContext -extern __typeof (xmlXPathFreeContext) xmlXPathFreeContext__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFreeContext xmlXPathFreeContext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFreeNodeSet -extern __typeof (xmlXPathFreeNodeSet) xmlXPathFreeNodeSet __attribute((alias("xmlXPathFreeNodeSet__internal_alias"))); -#else -#ifndef xmlXPathFreeNodeSet -extern __typeof (xmlXPathFreeNodeSet) xmlXPathFreeNodeSet__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFreeNodeSet xmlXPathFreeNodeSet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFreeNodeSetList -extern __typeof (xmlXPathFreeNodeSetList) xmlXPathFreeNodeSetList __attribute((alias("xmlXPathFreeNodeSetList__internal_alias"))); -#else -#ifndef xmlXPathFreeNodeSetList -extern __typeof (xmlXPathFreeNodeSetList) xmlXPathFreeNodeSetList__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFreeNodeSetList xmlXPathFreeNodeSetList__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFreeObject -extern __typeof (xmlXPathFreeObject) xmlXPathFreeObject __attribute((alias("xmlXPathFreeObject__internal_alias"))); -#else -#ifndef xmlXPathFreeObject -extern __typeof (xmlXPathFreeObject) xmlXPathFreeObject__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFreeObject xmlXPathFreeObject__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFreeParserContext -extern __typeof (xmlXPathFreeParserContext) xmlXPathFreeParserContext __attribute((alias("xmlXPathFreeParserContext__internal_alias"))); -#else -#ifndef xmlXPathFreeParserContext -extern __typeof (xmlXPathFreeParserContext) xmlXPathFreeParserContext__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFreeParserContext xmlXPathFreeParserContext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFunctionLookup -extern __typeof (xmlXPathFunctionLookup) xmlXPathFunctionLookup __attribute((alias("xmlXPathFunctionLookup__internal_alias"))); -#else -#ifndef xmlXPathFunctionLookup -extern __typeof (xmlXPathFunctionLookup) xmlXPathFunctionLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFunctionLookup xmlXPathFunctionLookup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathFunctionLookupNS -extern __typeof (xmlXPathFunctionLookupNS) xmlXPathFunctionLookupNS __attribute((alias("xmlXPathFunctionLookupNS__internal_alias"))); -#else -#ifndef xmlXPathFunctionLookupNS -extern __typeof (xmlXPathFunctionLookupNS) xmlXPathFunctionLookupNS__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathFunctionLookupNS xmlXPathFunctionLookupNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathHasSameNodes -extern __typeof (xmlXPathHasSameNodes) xmlXPathHasSameNodes __attribute((alias("xmlXPathHasSameNodes__internal_alias"))); -#else -#ifndef xmlXPathHasSameNodes -extern __typeof (xmlXPathHasSameNodes) xmlXPathHasSameNodes__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathHasSameNodes xmlXPathHasSameNodes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathIdFunction -extern __typeof (xmlXPathIdFunction) xmlXPathIdFunction __attribute((alias("xmlXPathIdFunction__internal_alias"))); -#else -#ifndef xmlXPathIdFunction -extern __typeof (xmlXPathIdFunction) xmlXPathIdFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathIdFunction xmlXPathIdFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathInit -extern __typeof (xmlXPathInit) xmlXPathInit __attribute((alias("xmlXPathInit__internal_alias"))); -#else -#ifndef xmlXPathInit -extern __typeof (xmlXPathInit) xmlXPathInit__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathInit xmlXPathInit__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathIntersection -extern __typeof (xmlXPathIntersection) xmlXPathIntersection __attribute((alias("xmlXPathIntersection__internal_alias"))); -#else -#ifndef xmlXPathIntersection -extern __typeof (xmlXPathIntersection) xmlXPathIntersection__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathIntersection xmlXPathIntersection__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathIsInf -extern __typeof (xmlXPathIsInf) xmlXPathIsInf __attribute((alias("xmlXPathIsInf__internal_alias"))); -#else -#ifndef xmlXPathIsInf -extern __typeof (xmlXPathIsInf) xmlXPathIsInf__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathIsInf xmlXPathIsInf__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathIsNaN -extern __typeof (xmlXPathIsNaN) xmlXPathIsNaN __attribute((alias("xmlXPathIsNaN__internal_alias"))); -#else -#ifndef xmlXPathIsNaN -extern __typeof (xmlXPathIsNaN) xmlXPathIsNaN__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathIsNaN xmlXPathIsNaN__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathIsNodeType -extern __typeof (xmlXPathIsNodeType) xmlXPathIsNodeType __attribute((alias("xmlXPathIsNodeType__internal_alias"))); -#else -#ifndef xmlXPathIsNodeType -extern __typeof (xmlXPathIsNodeType) xmlXPathIsNodeType__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathIsNodeType xmlXPathIsNodeType__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathLangFunction -extern __typeof (xmlXPathLangFunction) xmlXPathLangFunction __attribute((alias("xmlXPathLangFunction__internal_alias"))); -#else -#ifndef xmlXPathLangFunction -extern __typeof (xmlXPathLangFunction) xmlXPathLangFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathLangFunction xmlXPathLangFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathLastFunction -extern __typeof (xmlXPathLastFunction) xmlXPathLastFunction __attribute((alias("xmlXPathLastFunction__internal_alias"))); -#else -#ifndef xmlXPathLastFunction -extern __typeof (xmlXPathLastFunction) xmlXPathLastFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathLastFunction xmlXPathLastFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathLeading -extern __typeof (xmlXPathLeading) xmlXPathLeading __attribute((alias("xmlXPathLeading__internal_alias"))); -#else -#ifndef xmlXPathLeading -extern __typeof (xmlXPathLeading) xmlXPathLeading__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathLeading xmlXPathLeading__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathLeadingSorted -extern __typeof (xmlXPathLeadingSorted) xmlXPathLeadingSorted __attribute((alias("xmlXPathLeadingSorted__internal_alias"))); -#else -#ifndef xmlXPathLeadingSorted -extern __typeof (xmlXPathLeadingSorted) xmlXPathLeadingSorted__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathLeadingSorted xmlXPathLeadingSorted__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathLocalNameFunction -extern __typeof (xmlXPathLocalNameFunction) xmlXPathLocalNameFunction __attribute((alias("xmlXPathLocalNameFunction__internal_alias"))); -#else -#ifndef xmlXPathLocalNameFunction -extern __typeof (xmlXPathLocalNameFunction) xmlXPathLocalNameFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathLocalNameFunction xmlXPathLocalNameFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathModValues -extern __typeof (xmlXPathModValues) xmlXPathModValues __attribute((alias("xmlXPathModValues__internal_alias"))); -#else -#ifndef xmlXPathModValues -extern __typeof (xmlXPathModValues) xmlXPathModValues__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathModValues xmlXPathModValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathMultValues -extern __typeof (xmlXPathMultValues) xmlXPathMultValues __attribute((alias("xmlXPathMultValues__internal_alias"))); -#else -#ifndef xmlXPathMultValues -extern __typeof (xmlXPathMultValues) xmlXPathMultValues__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathMultValues xmlXPathMultValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNamespaceURIFunction -extern __typeof (xmlXPathNamespaceURIFunction) xmlXPathNamespaceURIFunction __attribute((alias("xmlXPathNamespaceURIFunction__internal_alias"))); -#else -#ifndef xmlXPathNamespaceURIFunction -extern __typeof (xmlXPathNamespaceURIFunction) xmlXPathNamespaceURIFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNamespaceURIFunction xmlXPathNamespaceURIFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewBoolean -extern __typeof (xmlXPathNewBoolean) xmlXPathNewBoolean __attribute((alias("xmlXPathNewBoolean__internal_alias"))); -#else -#ifndef xmlXPathNewBoolean -extern __typeof (xmlXPathNewBoolean) xmlXPathNewBoolean__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewBoolean xmlXPathNewBoolean__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewCString -extern __typeof (xmlXPathNewCString) xmlXPathNewCString __attribute((alias("xmlXPathNewCString__internal_alias"))); -#else -#ifndef xmlXPathNewCString -extern __typeof (xmlXPathNewCString) xmlXPathNewCString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewCString xmlXPathNewCString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewContext -extern __typeof (xmlXPathNewContext) xmlXPathNewContext __attribute((alias("xmlXPathNewContext__internal_alias"))); -#else -#ifndef xmlXPathNewContext -extern __typeof (xmlXPathNewContext) xmlXPathNewContext__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewContext xmlXPathNewContext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewFloat -extern __typeof (xmlXPathNewFloat) xmlXPathNewFloat __attribute((alias("xmlXPathNewFloat__internal_alias"))); -#else -#ifndef xmlXPathNewFloat -extern __typeof (xmlXPathNewFloat) xmlXPathNewFloat__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewFloat xmlXPathNewFloat__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewNodeSet -extern __typeof (xmlXPathNewNodeSet) xmlXPathNewNodeSet __attribute((alias("xmlXPathNewNodeSet__internal_alias"))); -#else -#ifndef xmlXPathNewNodeSet -extern __typeof (xmlXPathNewNodeSet) xmlXPathNewNodeSet__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewNodeSet xmlXPathNewNodeSet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewNodeSetList -extern __typeof (xmlXPathNewNodeSetList) xmlXPathNewNodeSetList __attribute((alias("xmlXPathNewNodeSetList__internal_alias"))); -#else -#ifndef xmlXPathNewNodeSetList -extern __typeof (xmlXPathNewNodeSetList) xmlXPathNewNodeSetList__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewNodeSetList xmlXPathNewNodeSetList__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewParserContext -extern __typeof (xmlXPathNewParserContext) xmlXPathNewParserContext __attribute((alias("xmlXPathNewParserContext__internal_alias"))); -#else -#ifndef xmlXPathNewParserContext -extern __typeof (xmlXPathNewParserContext) xmlXPathNewParserContext__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewParserContext xmlXPathNewParserContext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewString -extern __typeof (xmlXPathNewString) xmlXPathNewString __attribute((alias("xmlXPathNewString__internal_alias"))); -#else -#ifndef xmlXPathNewString -extern __typeof (xmlXPathNewString) xmlXPathNewString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewString xmlXPathNewString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNewValueTree -extern __typeof (xmlXPathNewValueTree) xmlXPathNewValueTree __attribute((alias("xmlXPathNewValueTree__internal_alias"))); -#else -#ifndef xmlXPathNewValueTree -extern __typeof (xmlXPathNewValueTree) xmlXPathNewValueTree__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNewValueTree xmlXPathNewValueTree__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextAncestor -extern __typeof (xmlXPathNextAncestor) xmlXPathNextAncestor __attribute((alias("xmlXPathNextAncestor__internal_alias"))); -#else -#ifndef xmlXPathNextAncestor -extern __typeof (xmlXPathNextAncestor) xmlXPathNextAncestor__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextAncestor xmlXPathNextAncestor__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextAncestorOrSelf -extern __typeof (xmlXPathNextAncestorOrSelf) xmlXPathNextAncestorOrSelf __attribute((alias("xmlXPathNextAncestorOrSelf__internal_alias"))); -#else -#ifndef xmlXPathNextAncestorOrSelf -extern __typeof (xmlXPathNextAncestorOrSelf) xmlXPathNextAncestorOrSelf__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextAncestorOrSelf xmlXPathNextAncestorOrSelf__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextAttribute -extern __typeof (xmlXPathNextAttribute) xmlXPathNextAttribute __attribute((alias("xmlXPathNextAttribute__internal_alias"))); -#else -#ifndef xmlXPathNextAttribute -extern __typeof (xmlXPathNextAttribute) xmlXPathNextAttribute__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextAttribute xmlXPathNextAttribute__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextChild -extern __typeof (xmlXPathNextChild) xmlXPathNextChild __attribute((alias("xmlXPathNextChild__internal_alias"))); -#else -#ifndef xmlXPathNextChild -extern __typeof (xmlXPathNextChild) xmlXPathNextChild__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextChild xmlXPathNextChild__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextDescendant -extern __typeof (xmlXPathNextDescendant) xmlXPathNextDescendant __attribute((alias("xmlXPathNextDescendant__internal_alias"))); -#else -#ifndef xmlXPathNextDescendant -extern __typeof (xmlXPathNextDescendant) xmlXPathNextDescendant__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextDescendant xmlXPathNextDescendant__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextDescendantOrSelf -extern __typeof (xmlXPathNextDescendantOrSelf) xmlXPathNextDescendantOrSelf __attribute((alias("xmlXPathNextDescendantOrSelf__internal_alias"))); -#else -#ifndef xmlXPathNextDescendantOrSelf -extern __typeof (xmlXPathNextDescendantOrSelf) xmlXPathNextDescendantOrSelf__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextDescendantOrSelf xmlXPathNextDescendantOrSelf__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextFollowing -extern __typeof (xmlXPathNextFollowing) xmlXPathNextFollowing __attribute((alias("xmlXPathNextFollowing__internal_alias"))); -#else -#ifndef xmlXPathNextFollowing -extern __typeof (xmlXPathNextFollowing) xmlXPathNextFollowing__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextFollowing xmlXPathNextFollowing__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextFollowingSibling -extern __typeof (xmlXPathNextFollowingSibling) xmlXPathNextFollowingSibling __attribute((alias("xmlXPathNextFollowingSibling__internal_alias"))); -#else -#ifndef xmlXPathNextFollowingSibling -extern __typeof (xmlXPathNextFollowingSibling) xmlXPathNextFollowingSibling__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextFollowingSibling xmlXPathNextFollowingSibling__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextNamespace -extern __typeof (xmlXPathNextNamespace) xmlXPathNextNamespace __attribute((alias("xmlXPathNextNamespace__internal_alias"))); -#else -#ifndef xmlXPathNextNamespace -extern __typeof (xmlXPathNextNamespace) xmlXPathNextNamespace__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextNamespace xmlXPathNextNamespace__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextParent -extern __typeof (xmlXPathNextParent) xmlXPathNextParent __attribute((alias("xmlXPathNextParent__internal_alias"))); -#else -#ifndef xmlXPathNextParent -extern __typeof (xmlXPathNextParent) xmlXPathNextParent__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextParent xmlXPathNextParent__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextPreceding -extern __typeof (xmlXPathNextPreceding) xmlXPathNextPreceding __attribute((alias("xmlXPathNextPreceding__internal_alias"))); -#else -#ifndef xmlXPathNextPreceding -extern __typeof (xmlXPathNextPreceding) xmlXPathNextPreceding__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextPreceding xmlXPathNextPreceding__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextPrecedingSibling -extern __typeof (xmlXPathNextPrecedingSibling) xmlXPathNextPrecedingSibling __attribute((alias("xmlXPathNextPrecedingSibling__internal_alias"))); -#else -#ifndef xmlXPathNextPrecedingSibling -extern __typeof (xmlXPathNextPrecedingSibling) xmlXPathNextPrecedingSibling__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextPrecedingSibling xmlXPathNextPrecedingSibling__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNextSelf -extern __typeof (xmlXPathNextSelf) xmlXPathNextSelf __attribute((alias("xmlXPathNextSelf__internal_alias"))); -#else -#ifndef xmlXPathNextSelf -extern __typeof (xmlXPathNextSelf) xmlXPathNextSelf__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNextSelf xmlXPathNextSelf__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeLeading -extern __typeof (xmlXPathNodeLeading) xmlXPathNodeLeading __attribute((alias("xmlXPathNodeLeading__internal_alias"))); -#else -#ifndef xmlXPathNodeLeading -extern __typeof (xmlXPathNodeLeading) xmlXPathNodeLeading__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeLeading xmlXPathNodeLeading__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeLeadingSorted -extern __typeof (xmlXPathNodeLeadingSorted) xmlXPathNodeLeadingSorted __attribute((alias("xmlXPathNodeLeadingSorted__internal_alias"))); -#else -#ifndef xmlXPathNodeLeadingSorted -extern __typeof (xmlXPathNodeLeadingSorted) xmlXPathNodeLeadingSorted__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeLeadingSorted xmlXPathNodeLeadingSorted__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetAdd -extern __typeof (xmlXPathNodeSetAdd) xmlXPathNodeSetAdd __attribute((alias("xmlXPathNodeSetAdd__internal_alias"))); -#else -#ifndef xmlXPathNodeSetAdd -extern __typeof (xmlXPathNodeSetAdd) xmlXPathNodeSetAdd__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetAdd xmlXPathNodeSetAdd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetAddNs -extern __typeof (xmlXPathNodeSetAddNs) xmlXPathNodeSetAddNs __attribute((alias("xmlXPathNodeSetAddNs__internal_alias"))); -#else -#ifndef xmlXPathNodeSetAddNs -extern __typeof (xmlXPathNodeSetAddNs) xmlXPathNodeSetAddNs__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetAddNs xmlXPathNodeSetAddNs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetAddUnique -extern __typeof (xmlXPathNodeSetAddUnique) xmlXPathNodeSetAddUnique __attribute((alias("xmlXPathNodeSetAddUnique__internal_alias"))); -#else -#ifndef xmlXPathNodeSetAddUnique -extern __typeof (xmlXPathNodeSetAddUnique) xmlXPathNodeSetAddUnique__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetAddUnique xmlXPathNodeSetAddUnique__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetContains -extern __typeof (xmlXPathNodeSetContains) xmlXPathNodeSetContains __attribute((alias("xmlXPathNodeSetContains__internal_alias"))); -#else -#ifndef xmlXPathNodeSetContains -extern __typeof (xmlXPathNodeSetContains) xmlXPathNodeSetContains__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetContains xmlXPathNodeSetContains__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetCreate -extern __typeof (xmlXPathNodeSetCreate) xmlXPathNodeSetCreate __attribute((alias("xmlXPathNodeSetCreate__internal_alias"))); -#else -#ifndef xmlXPathNodeSetCreate -extern __typeof (xmlXPathNodeSetCreate) xmlXPathNodeSetCreate__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetCreate xmlXPathNodeSetCreate__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetDel -extern __typeof (xmlXPathNodeSetDel) xmlXPathNodeSetDel __attribute((alias("xmlXPathNodeSetDel__internal_alias"))); -#else -#ifndef xmlXPathNodeSetDel -extern __typeof (xmlXPathNodeSetDel) xmlXPathNodeSetDel__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetDel xmlXPathNodeSetDel__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetFreeNs -extern __typeof (xmlXPathNodeSetFreeNs) xmlXPathNodeSetFreeNs __attribute((alias("xmlXPathNodeSetFreeNs__internal_alias"))); -#else -#ifndef xmlXPathNodeSetFreeNs -extern __typeof (xmlXPathNodeSetFreeNs) xmlXPathNodeSetFreeNs__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetFreeNs xmlXPathNodeSetFreeNs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetMerge -extern __typeof (xmlXPathNodeSetMerge) xmlXPathNodeSetMerge __attribute((alias("xmlXPathNodeSetMerge__internal_alias"))); -#else -#ifndef xmlXPathNodeSetMerge -extern __typeof (xmlXPathNodeSetMerge) xmlXPathNodeSetMerge__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetMerge xmlXPathNodeSetMerge__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetRemove -extern __typeof (xmlXPathNodeSetRemove) xmlXPathNodeSetRemove __attribute((alias("xmlXPathNodeSetRemove__internal_alias"))); -#else -#ifndef xmlXPathNodeSetRemove -extern __typeof (xmlXPathNodeSetRemove) xmlXPathNodeSetRemove__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetRemove xmlXPathNodeSetRemove__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeSetSort -extern __typeof (xmlXPathNodeSetSort) xmlXPathNodeSetSort __attribute((alias("xmlXPathNodeSetSort__internal_alias"))); -#else -#ifndef xmlXPathNodeSetSort -extern __typeof (xmlXPathNodeSetSort) xmlXPathNodeSetSort__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeSetSort xmlXPathNodeSetSort__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeTrailing -extern __typeof (xmlXPathNodeTrailing) xmlXPathNodeTrailing __attribute((alias("xmlXPathNodeTrailing__internal_alias"))); -#else -#ifndef xmlXPathNodeTrailing -extern __typeof (xmlXPathNodeTrailing) xmlXPathNodeTrailing__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeTrailing xmlXPathNodeTrailing__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNodeTrailingSorted -extern __typeof (xmlXPathNodeTrailingSorted) xmlXPathNodeTrailingSorted __attribute((alias("xmlXPathNodeTrailingSorted__internal_alias"))); -#else -#ifndef xmlXPathNodeTrailingSorted -extern __typeof (xmlXPathNodeTrailingSorted) xmlXPathNodeTrailingSorted__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNodeTrailingSorted xmlXPathNodeTrailingSorted__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNormalizeFunction -extern __typeof (xmlXPathNormalizeFunction) xmlXPathNormalizeFunction __attribute((alias("xmlXPathNormalizeFunction__internal_alias"))); -#else -#ifndef xmlXPathNormalizeFunction -extern __typeof (xmlXPathNormalizeFunction) xmlXPathNormalizeFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNormalizeFunction xmlXPathNormalizeFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNotEqualValues -extern __typeof (xmlXPathNotEqualValues) xmlXPathNotEqualValues __attribute((alias("xmlXPathNotEqualValues__internal_alias"))); -#else -#ifndef xmlXPathNotEqualValues -extern __typeof (xmlXPathNotEqualValues) xmlXPathNotEqualValues__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNotEqualValues xmlXPathNotEqualValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNotFunction -extern __typeof (xmlXPathNotFunction) xmlXPathNotFunction __attribute((alias("xmlXPathNotFunction__internal_alias"))); -#else -#ifndef xmlXPathNotFunction -extern __typeof (xmlXPathNotFunction) xmlXPathNotFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNotFunction xmlXPathNotFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNsLookup -extern __typeof (xmlXPathNsLookup) xmlXPathNsLookup __attribute((alias("xmlXPathNsLookup__internal_alias"))); -#else -#ifndef xmlXPathNsLookup -extern __typeof (xmlXPathNsLookup) xmlXPathNsLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNsLookup xmlXPathNsLookup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathNumberFunction -extern __typeof (xmlXPathNumberFunction) xmlXPathNumberFunction __attribute((alias("xmlXPathNumberFunction__internal_alias"))); -#else -#ifndef xmlXPathNumberFunction -extern __typeof (xmlXPathNumberFunction) xmlXPathNumberFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathNumberFunction xmlXPathNumberFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathObjectCopy -extern __typeof (xmlXPathObjectCopy) xmlXPathObjectCopy __attribute((alias("xmlXPathObjectCopy__internal_alias"))); -#else -#ifndef xmlXPathObjectCopy -extern __typeof (xmlXPathObjectCopy) xmlXPathObjectCopy__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathObjectCopy xmlXPathObjectCopy__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathOrderDocElems -extern __typeof (xmlXPathOrderDocElems) xmlXPathOrderDocElems __attribute((alias("xmlXPathOrderDocElems__internal_alias"))); -#else -#ifndef xmlXPathOrderDocElems -extern __typeof (xmlXPathOrderDocElems) xmlXPathOrderDocElems__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathOrderDocElems xmlXPathOrderDocElems__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathParseNCName -extern __typeof (xmlXPathParseNCName) xmlXPathParseNCName __attribute((alias("xmlXPathParseNCName__internal_alias"))); -#else -#ifndef xmlXPathParseNCName -extern __typeof (xmlXPathParseNCName) xmlXPathParseNCName__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathParseNCName xmlXPathParseNCName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathParseName -extern __typeof (xmlXPathParseName) xmlXPathParseName __attribute((alias("xmlXPathParseName__internal_alias"))); -#else -#ifndef xmlXPathParseName -extern __typeof (xmlXPathParseName) xmlXPathParseName__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathParseName xmlXPathParseName__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathPopBoolean -extern __typeof (xmlXPathPopBoolean) xmlXPathPopBoolean __attribute((alias("xmlXPathPopBoolean__internal_alias"))); -#else -#ifndef xmlXPathPopBoolean -extern __typeof (xmlXPathPopBoolean) xmlXPathPopBoolean__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathPopBoolean xmlXPathPopBoolean__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathPopExternal -extern __typeof (xmlXPathPopExternal) xmlXPathPopExternal __attribute((alias("xmlXPathPopExternal__internal_alias"))); -#else -#ifndef xmlXPathPopExternal -extern __typeof (xmlXPathPopExternal) xmlXPathPopExternal__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathPopExternal xmlXPathPopExternal__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathPopNodeSet -extern __typeof (xmlXPathPopNodeSet) xmlXPathPopNodeSet __attribute((alias("xmlXPathPopNodeSet__internal_alias"))); -#else -#ifndef xmlXPathPopNodeSet -extern __typeof (xmlXPathPopNodeSet) xmlXPathPopNodeSet__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathPopNodeSet xmlXPathPopNodeSet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathPopNumber -extern __typeof (xmlXPathPopNumber) xmlXPathPopNumber __attribute((alias("xmlXPathPopNumber__internal_alias"))); -#else -#ifndef xmlXPathPopNumber -extern __typeof (xmlXPathPopNumber) xmlXPathPopNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathPopNumber xmlXPathPopNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathPopString -extern __typeof (xmlXPathPopString) xmlXPathPopString __attribute((alias("xmlXPathPopString__internal_alias"))); -#else -#ifndef xmlXPathPopString -extern __typeof (xmlXPathPopString) xmlXPathPopString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathPopString xmlXPathPopString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathPositionFunction -extern __typeof (xmlXPathPositionFunction) xmlXPathPositionFunction __attribute((alias("xmlXPathPositionFunction__internal_alias"))); -#else -#ifndef xmlXPathPositionFunction -extern __typeof (xmlXPathPositionFunction) xmlXPathPositionFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathPositionFunction xmlXPathPositionFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisterAllFunctions -extern __typeof (xmlXPathRegisterAllFunctions) xmlXPathRegisterAllFunctions __attribute((alias("xmlXPathRegisterAllFunctions__internal_alias"))); -#else -#ifndef xmlXPathRegisterAllFunctions -extern __typeof (xmlXPathRegisterAllFunctions) xmlXPathRegisterAllFunctions__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisterAllFunctions xmlXPathRegisterAllFunctions__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisterFunc -extern __typeof (xmlXPathRegisterFunc) xmlXPathRegisterFunc __attribute((alias("xmlXPathRegisterFunc__internal_alias"))); -#else -#ifndef xmlXPathRegisterFunc -extern __typeof (xmlXPathRegisterFunc) xmlXPathRegisterFunc__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisterFunc xmlXPathRegisterFunc__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisterFuncLookup -extern __typeof (xmlXPathRegisterFuncLookup) xmlXPathRegisterFuncLookup __attribute((alias("xmlXPathRegisterFuncLookup__internal_alias"))); -#else -#ifndef xmlXPathRegisterFuncLookup -extern __typeof (xmlXPathRegisterFuncLookup) xmlXPathRegisterFuncLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisterFuncLookup xmlXPathRegisterFuncLookup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisterFuncNS -extern __typeof (xmlXPathRegisterFuncNS) xmlXPathRegisterFuncNS __attribute((alias("xmlXPathRegisterFuncNS__internal_alias"))); -#else -#ifndef xmlXPathRegisterFuncNS -extern __typeof (xmlXPathRegisterFuncNS) xmlXPathRegisterFuncNS__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisterFuncNS xmlXPathRegisterFuncNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisterNs -extern __typeof (xmlXPathRegisterNs) xmlXPathRegisterNs __attribute((alias("xmlXPathRegisterNs__internal_alias"))); -#else -#ifndef xmlXPathRegisterNs -extern __typeof (xmlXPathRegisterNs) xmlXPathRegisterNs__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisterNs xmlXPathRegisterNs__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisterVariable -extern __typeof (xmlXPathRegisterVariable) xmlXPathRegisterVariable __attribute((alias("xmlXPathRegisterVariable__internal_alias"))); -#else -#ifndef xmlXPathRegisterVariable -extern __typeof (xmlXPathRegisterVariable) xmlXPathRegisterVariable__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisterVariable xmlXPathRegisterVariable__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisterVariableLookup -extern __typeof (xmlXPathRegisterVariableLookup) xmlXPathRegisterVariableLookup __attribute((alias("xmlXPathRegisterVariableLookup__internal_alias"))); -#else -#ifndef xmlXPathRegisterVariableLookup -extern __typeof (xmlXPathRegisterVariableLookup) xmlXPathRegisterVariableLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisterVariableLookup xmlXPathRegisterVariableLookup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisterVariableNS -extern __typeof (xmlXPathRegisterVariableNS) xmlXPathRegisterVariableNS __attribute((alias("xmlXPathRegisterVariableNS__internal_alias"))); -#else -#ifndef xmlXPathRegisterVariableNS -extern __typeof (xmlXPathRegisterVariableNS) xmlXPathRegisterVariableNS__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisterVariableNS xmlXPathRegisterVariableNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisteredFuncsCleanup -extern __typeof (xmlXPathRegisteredFuncsCleanup) xmlXPathRegisteredFuncsCleanup __attribute((alias("xmlXPathRegisteredFuncsCleanup__internal_alias"))); -#else -#ifndef xmlXPathRegisteredFuncsCleanup -extern __typeof (xmlXPathRegisteredFuncsCleanup) xmlXPathRegisteredFuncsCleanup__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisteredFuncsCleanup xmlXPathRegisteredFuncsCleanup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisteredNsCleanup -extern __typeof (xmlXPathRegisteredNsCleanup) xmlXPathRegisteredNsCleanup __attribute((alias("xmlXPathRegisteredNsCleanup__internal_alias"))); -#else -#ifndef xmlXPathRegisteredNsCleanup -extern __typeof (xmlXPathRegisteredNsCleanup) xmlXPathRegisteredNsCleanup__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisteredNsCleanup xmlXPathRegisteredNsCleanup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRegisteredVariablesCleanup -extern __typeof (xmlXPathRegisteredVariablesCleanup) xmlXPathRegisteredVariablesCleanup __attribute((alias("xmlXPathRegisteredVariablesCleanup__internal_alias"))); -#else -#ifndef xmlXPathRegisteredVariablesCleanup -extern __typeof (xmlXPathRegisteredVariablesCleanup) xmlXPathRegisteredVariablesCleanup__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRegisteredVariablesCleanup xmlXPathRegisteredVariablesCleanup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRoot -extern __typeof (xmlXPathRoot) xmlXPathRoot __attribute((alias("xmlXPathRoot__internal_alias"))); -#else -#ifndef xmlXPathRoot -extern __typeof (xmlXPathRoot) xmlXPathRoot__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRoot xmlXPathRoot__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathRoundFunction -extern __typeof (xmlXPathRoundFunction) xmlXPathRoundFunction __attribute((alias("xmlXPathRoundFunction__internal_alias"))); -#else -#ifndef xmlXPathRoundFunction -extern __typeof (xmlXPathRoundFunction) xmlXPathRoundFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathRoundFunction xmlXPathRoundFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathStartsWithFunction -extern __typeof (xmlXPathStartsWithFunction) xmlXPathStartsWithFunction __attribute((alias("xmlXPathStartsWithFunction__internal_alias"))); -#else -#ifndef xmlXPathStartsWithFunction -extern __typeof (xmlXPathStartsWithFunction) xmlXPathStartsWithFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathStartsWithFunction xmlXPathStartsWithFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathStringEvalNumber -extern __typeof (xmlXPathStringEvalNumber) xmlXPathStringEvalNumber __attribute((alias("xmlXPathStringEvalNumber__internal_alias"))); -#else -#ifndef xmlXPathStringEvalNumber -extern __typeof (xmlXPathStringEvalNumber) xmlXPathStringEvalNumber__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathStringEvalNumber xmlXPathStringEvalNumber__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathStringFunction -extern __typeof (xmlXPathStringFunction) xmlXPathStringFunction __attribute((alias("xmlXPathStringFunction__internal_alias"))); -#else -#ifndef xmlXPathStringFunction -extern __typeof (xmlXPathStringFunction) xmlXPathStringFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathStringFunction xmlXPathStringFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathStringLengthFunction -extern __typeof (xmlXPathStringLengthFunction) xmlXPathStringLengthFunction __attribute((alias("xmlXPathStringLengthFunction__internal_alias"))); -#else -#ifndef xmlXPathStringLengthFunction -extern __typeof (xmlXPathStringLengthFunction) xmlXPathStringLengthFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathStringLengthFunction xmlXPathStringLengthFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathSubValues -extern __typeof (xmlXPathSubValues) xmlXPathSubValues __attribute((alias("xmlXPathSubValues__internal_alias"))); -#else -#ifndef xmlXPathSubValues -extern __typeof (xmlXPathSubValues) xmlXPathSubValues__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathSubValues xmlXPathSubValues__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathSubstringAfterFunction -extern __typeof (xmlXPathSubstringAfterFunction) xmlXPathSubstringAfterFunction __attribute((alias("xmlXPathSubstringAfterFunction__internal_alias"))); -#else -#ifndef xmlXPathSubstringAfterFunction -extern __typeof (xmlXPathSubstringAfterFunction) xmlXPathSubstringAfterFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathSubstringAfterFunction xmlXPathSubstringAfterFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathSubstringBeforeFunction -extern __typeof (xmlXPathSubstringBeforeFunction) xmlXPathSubstringBeforeFunction __attribute((alias("xmlXPathSubstringBeforeFunction__internal_alias"))); -#else -#ifndef xmlXPathSubstringBeforeFunction -extern __typeof (xmlXPathSubstringBeforeFunction) xmlXPathSubstringBeforeFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathSubstringBeforeFunction xmlXPathSubstringBeforeFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathSubstringFunction -extern __typeof (xmlXPathSubstringFunction) xmlXPathSubstringFunction __attribute((alias("xmlXPathSubstringFunction__internal_alias"))); -#else -#ifndef xmlXPathSubstringFunction -extern __typeof (xmlXPathSubstringFunction) xmlXPathSubstringFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathSubstringFunction xmlXPathSubstringFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathSumFunction -extern __typeof (xmlXPathSumFunction) xmlXPathSumFunction __attribute((alias("xmlXPathSumFunction__internal_alias"))); -#else -#ifndef xmlXPathSumFunction -extern __typeof (xmlXPathSumFunction) xmlXPathSumFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathSumFunction xmlXPathSumFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathTrailing -extern __typeof (xmlXPathTrailing) xmlXPathTrailing __attribute((alias("xmlXPathTrailing__internal_alias"))); -#else -#ifndef xmlXPathTrailing -extern __typeof (xmlXPathTrailing) xmlXPathTrailing__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathTrailing xmlXPathTrailing__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathTrailingSorted -extern __typeof (xmlXPathTrailingSorted) xmlXPathTrailingSorted __attribute((alias("xmlXPathTrailingSorted__internal_alias"))); -#else -#ifndef xmlXPathTrailingSorted -extern __typeof (xmlXPathTrailingSorted) xmlXPathTrailingSorted__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathTrailingSorted xmlXPathTrailingSorted__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathTranslateFunction -extern __typeof (xmlXPathTranslateFunction) xmlXPathTranslateFunction __attribute((alias("xmlXPathTranslateFunction__internal_alias"))); -#else -#ifndef xmlXPathTranslateFunction -extern __typeof (xmlXPathTranslateFunction) xmlXPathTranslateFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathTranslateFunction xmlXPathTranslateFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathTrueFunction -extern __typeof (xmlXPathTrueFunction) xmlXPathTrueFunction __attribute((alias("xmlXPathTrueFunction__internal_alias"))); -#else -#ifndef xmlXPathTrueFunction -extern __typeof (xmlXPathTrueFunction) xmlXPathTrueFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathTrueFunction xmlXPathTrueFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathValueFlipSign -extern __typeof (xmlXPathValueFlipSign) xmlXPathValueFlipSign __attribute((alias("xmlXPathValueFlipSign__internal_alias"))); -#else -#ifndef xmlXPathValueFlipSign -extern __typeof (xmlXPathValueFlipSign) xmlXPathValueFlipSign__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathValueFlipSign xmlXPathValueFlipSign__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathVariableLookup -extern __typeof (xmlXPathVariableLookup) xmlXPathVariableLookup __attribute((alias("xmlXPathVariableLookup__internal_alias"))); -#else -#ifndef xmlXPathVariableLookup -extern __typeof (xmlXPathVariableLookup) xmlXPathVariableLookup__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathVariableLookup xmlXPathVariableLookup__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathVariableLookupNS -extern __typeof (xmlXPathVariableLookupNS) xmlXPathVariableLookupNS __attribute((alias("xmlXPathVariableLookupNS__internal_alias"))); -#else -#ifndef xmlXPathVariableLookupNS -extern __typeof (xmlXPathVariableLookupNS) xmlXPathVariableLookupNS__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathVariableLookupNS xmlXPathVariableLookupNS__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathWrapCString -extern __typeof (xmlXPathWrapCString) xmlXPathWrapCString __attribute((alias("xmlXPathWrapCString__internal_alias"))); -#else -#ifndef xmlXPathWrapCString -extern __typeof (xmlXPathWrapCString) xmlXPathWrapCString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathWrapCString xmlXPathWrapCString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathWrapExternal -extern __typeof (xmlXPathWrapExternal) xmlXPathWrapExternal __attribute((alias("xmlXPathWrapExternal__internal_alias"))); -#else -#ifndef xmlXPathWrapExternal -extern __typeof (xmlXPathWrapExternal) xmlXPathWrapExternal__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathWrapExternal xmlXPathWrapExternal__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathWrapNodeSet -extern __typeof (xmlXPathWrapNodeSet) xmlXPathWrapNodeSet __attribute((alias("xmlXPathWrapNodeSet__internal_alias"))); -#else -#ifndef xmlXPathWrapNodeSet -extern __typeof (xmlXPathWrapNodeSet) xmlXPathWrapNodeSet__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathWrapNodeSet xmlXPathWrapNodeSet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPathWrapString -extern __typeof (xmlXPathWrapString) xmlXPathWrapString __attribute((alias("xmlXPathWrapString__internal_alias"))); -#else -#ifndef xmlXPathWrapString -extern __typeof (xmlXPathWrapString) xmlXPathWrapString__internal_alias __attribute((visibility("hidden"))); -#define xmlXPathWrapString xmlXPathWrapString__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPATH_ENABLED) -#ifdef bottom_xpath -#undef xmlXPatherror -extern __typeof (xmlXPatherror) xmlXPatherror __attribute((alias("xmlXPatherror__internal_alias"))); -#else -#ifndef xmlXPatherror -extern __typeof (xmlXPatherror) xmlXPatherror__internal_alias __attribute((visibility("hidden"))); -#define xmlXPatherror xmlXPatherror__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrBuildNodeList -extern __typeof (xmlXPtrBuildNodeList) xmlXPtrBuildNodeList __attribute((alias("xmlXPtrBuildNodeList__internal_alias"))); -#else -#ifndef xmlXPtrBuildNodeList -extern __typeof (xmlXPtrBuildNodeList) xmlXPtrBuildNodeList__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrBuildNodeList xmlXPtrBuildNodeList__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrEval -extern __typeof (xmlXPtrEval) xmlXPtrEval __attribute((alias("xmlXPtrEval__internal_alias"))); -#else -#ifndef xmlXPtrEval -extern __typeof (xmlXPtrEval) xmlXPtrEval__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrEval xmlXPtrEval__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrEvalRangePredicate -extern __typeof (xmlXPtrEvalRangePredicate) xmlXPtrEvalRangePredicate __attribute((alias("xmlXPtrEvalRangePredicate__internal_alias"))); -#else -#ifndef xmlXPtrEvalRangePredicate -extern __typeof (xmlXPtrEvalRangePredicate) xmlXPtrEvalRangePredicate__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrEvalRangePredicate xmlXPtrEvalRangePredicate__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrFreeLocationSet -extern __typeof (xmlXPtrFreeLocationSet) xmlXPtrFreeLocationSet __attribute((alias("xmlXPtrFreeLocationSet__internal_alias"))); -#else -#ifndef xmlXPtrFreeLocationSet -extern __typeof (xmlXPtrFreeLocationSet) xmlXPtrFreeLocationSet__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrFreeLocationSet xmlXPtrFreeLocationSet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrLocationSetAdd -extern __typeof (xmlXPtrLocationSetAdd) xmlXPtrLocationSetAdd __attribute((alias("xmlXPtrLocationSetAdd__internal_alias"))); -#else -#ifndef xmlXPtrLocationSetAdd -extern __typeof (xmlXPtrLocationSetAdd) xmlXPtrLocationSetAdd__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrLocationSetAdd xmlXPtrLocationSetAdd__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrLocationSetCreate -extern __typeof (xmlXPtrLocationSetCreate) xmlXPtrLocationSetCreate __attribute((alias("xmlXPtrLocationSetCreate__internal_alias"))); -#else -#ifndef xmlXPtrLocationSetCreate -extern __typeof (xmlXPtrLocationSetCreate) xmlXPtrLocationSetCreate__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrLocationSetCreate xmlXPtrLocationSetCreate__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrLocationSetDel -extern __typeof (xmlXPtrLocationSetDel) xmlXPtrLocationSetDel __attribute((alias("xmlXPtrLocationSetDel__internal_alias"))); -#else -#ifndef xmlXPtrLocationSetDel -extern __typeof (xmlXPtrLocationSetDel) xmlXPtrLocationSetDel__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrLocationSetDel xmlXPtrLocationSetDel__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrLocationSetMerge -extern __typeof (xmlXPtrLocationSetMerge) xmlXPtrLocationSetMerge __attribute((alias("xmlXPtrLocationSetMerge__internal_alias"))); -#else -#ifndef xmlXPtrLocationSetMerge -extern __typeof (xmlXPtrLocationSetMerge) xmlXPtrLocationSetMerge__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrLocationSetMerge xmlXPtrLocationSetMerge__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrLocationSetRemove -extern __typeof (xmlXPtrLocationSetRemove) xmlXPtrLocationSetRemove __attribute((alias("xmlXPtrLocationSetRemove__internal_alias"))); -#else -#ifndef xmlXPtrLocationSetRemove -extern __typeof (xmlXPtrLocationSetRemove) xmlXPtrLocationSetRemove__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrLocationSetRemove xmlXPtrLocationSetRemove__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewCollapsedRange -extern __typeof (xmlXPtrNewCollapsedRange) xmlXPtrNewCollapsedRange __attribute((alias("xmlXPtrNewCollapsedRange__internal_alias"))); -#else -#ifndef xmlXPtrNewCollapsedRange -extern __typeof (xmlXPtrNewCollapsedRange) xmlXPtrNewCollapsedRange__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewCollapsedRange xmlXPtrNewCollapsedRange__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewContext -extern __typeof (xmlXPtrNewContext) xmlXPtrNewContext __attribute((alias("xmlXPtrNewContext__internal_alias"))); -#else -#ifndef xmlXPtrNewContext -extern __typeof (xmlXPtrNewContext) xmlXPtrNewContext__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewContext xmlXPtrNewContext__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewLocationSetNodeSet -extern __typeof (xmlXPtrNewLocationSetNodeSet) xmlXPtrNewLocationSetNodeSet __attribute((alias("xmlXPtrNewLocationSetNodeSet__internal_alias"))); -#else -#ifndef xmlXPtrNewLocationSetNodeSet -extern __typeof (xmlXPtrNewLocationSetNodeSet) xmlXPtrNewLocationSetNodeSet__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewLocationSetNodeSet xmlXPtrNewLocationSetNodeSet__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewLocationSetNodes -extern __typeof (xmlXPtrNewLocationSetNodes) xmlXPtrNewLocationSetNodes __attribute((alias("xmlXPtrNewLocationSetNodes__internal_alias"))); -#else -#ifndef xmlXPtrNewLocationSetNodes -extern __typeof (xmlXPtrNewLocationSetNodes) xmlXPtrNewLocationSetNodes__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewLocationSetNodes xmlXPtrNewLocationSetNodes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewRange -extern __typeof (xmlXPtrNewRange) xmlXPtrNewRange __attribute((alias("xmlXPtrNewRange__internal_alias"))); -#else -#ifndef xmlXPtrNewRange -extern __typeof (xmlXPtrNewRange) xmlXPtrNewRange__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewRange xmlXPtrNewRange__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewRangeNodeObject -extern __typeof (xmlXPtrNewRangeNodeObject) xmlXPtrNewRangeNodeObject __attribute((alias("xmlXPtrNewRangeNodeObject__internal_alias"))); -#else -#ifndef xmlXPtrNewRangeNodeObject -extern __typeof (xmlXPtrNewRangeNodeObject) xmlXPtrNewRangeNodeObject__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewRangeNodeObject xmlXPtrNewRangeNodeObject__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewRangeNodePoint -extern __typeof (xmlXPtrNewRangeNodePoint) xmlXPtrNewRangeNodePoint __attribute((alias("xmlXPtrNewRangeNodePoint__internal_alias"))); -#else -#ifndef xmlXPtrNewRangeNodePoint -extern __typeof (xmlXPtrNewRangeNodePoint) xmlXPtrNewRangeNodePoint__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewRangeNodePoint xmlXPtrNewRangeNodePoint__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewRangeNodes -extern __typeof (xmlXPtrNewRangeNodes) xmlXPtrNewRangeNodes __attribute((alias("xmlXPtrNewRangeNodes__internal_alias"))); -#else -#ifndef xmlXPtrNewRangeNodes -extern __typeof (xmlXPtrNewRangeNodes) xmlXPtrNewRangeNodes__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewRangeNodes xmlXPtrNewRangeNodes__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewRangePointNode -extern __typeof (xmlXPtrNewRangePointNode) xmlXPtrNewRangePointNode __attribute((alias("xmlXPtrNewRangePointNode__internal_alias"))); -#else -#ifndef xmlXPtrNewRangePointNode -extern __typeof (xmlXPtrNewRangePointNode) xmlXPtrNewRangePointNode__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewRangePointNode xmlXPtrNewRangePointNode__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrNewRangePoints -extern __typeof (xmlXPtrNewRangePoints) xmlXPtrNewRangePoints __attribute((alias("xmlXPtrNewRangePoints__internal_alias"))); -#else -#ifndef xmlXPtrNewRangePoints -extern __typeof (xmlXPtrNewRangePoints) xmlXPtrNewRangePoints__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrNewRangePoints xmlXPtrNewRangePoints__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrRangeToFunction -extern __typeof (xmlXPtrRangeToFunction) xmlXPtrRangeToFunction __attribute((alias("xmlXPtrRangeToFunction__internal_alias"))); -#else -#ifndef xmlXPtrRangeToFunction -extern __typeof (xmlXPtrRangeToFunction) xmlXPtrRangeToFunction__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrRangeToFunction xmlXPtrRangeToFunction__internal_alias -#endif -#endif -#endif - -#if defined(LIBXML_XPTR_ENABLED) -#ifdef bottom_xpointer -#undef xmlXPtrWrapLocationSet -extern __typeof (xmlXPtrWrapLocationSet) xmlXPtrWrapLocationSet __attribute((alias("xmlXPtrWrapLocationSet__internal_alias"))); -#else -#ifndef xmlXPtrWrapLocationSet -extern __typeof (xmlXPtrWrapLocationSet) xmlXPtrWrapLocationSet__internal_alias __attribute((visibility("hidden"))); -#define xmlXPtrWrapLocationSet xmlXPtrWrapLocationSet__internal_alias -#endif -#endif -#endif - - -#endif -#endif -#endif -#endif -#endif - -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/encoding.c b/ThirdParty/libxml2/vtklibxml2/encoding.c deleted file mode 100644 index 4962796c623..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/encoding.c +++ /dev/null @@ -1,3295 +0,0 @@ -/* - * encoding.c : implements the encoding conversion functions needed for XML - * - * Related specs: - * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies - * rfc2781 UTF-16, an encoding of ISO 10646, P. Hoffman, F. Yergeau - * [ISO-10646] UTF-8 and UTF-16 in Annexes - * [ISO-8859-1] ISO Latin-1 characters codes. - * [UNICODE] The Unicode Consortium, "The Unicode Standard -- - * Worldwide Character Encoding -- Version 1.0", Addison- - * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is - * described in Unicode Technical Report #4. - * [US-ASCII] Coded Character Set--7-bit American Standard Code for - * Information Interchange, ANSI X3.4-1986. - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - * - * Original code for IsoLatin1 and UTF-16 by "Martin J. Duerst" <duerst@w3.org> - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> - -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef LIBXML_ICONV_ENABLED -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif -#endif -#include <libxml/encoding.h> -#include <libxml/xmlmemory.h> -#ifdef LIBXML_HTML_ENABLED -#include <libxml/HTMLparser.h> -#endif -#include <libxml/globals.h> -#include <libxml/xmlerror.h> - -static xmlCharEncodingHandlerPtr xmlUTF16LEHandler = NULL; -static xmlCharEncodingHandlerPtr xmlUTF16BEHandler = NULL; - -typedef struct _xmlCharEncodingAlias xmlCharEncodingAlias; -typedef xmlCharEncodingAlias *xmlCharEncodingAliasPtr; -struct _xmlCharEncodingAlias { - const char *name; - const char *alias; -}; - -static xmlCharEncodingAliasPtr xmlCharEncodingAliases = NULL; -static int xmlCharEncodingAliasesNb = 0; -static int xmlCharEncodingAliasesMax = 0; - -#ifdef LIBXML_ICONV_ENABLED -#if 0 -#define DEBUG_ENCODING /* Define this to get encoding traces */ -#endif -#else -#ifdef LIBXML_ISO8859X_ENABLED -static void xmlRegisterCharEncodingHandlersISO8859x (void); -#endif -#endif - -static int xmlLittleEndian = 1; - -/** - * xmlEncodingErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlEncodingErrMemory(const char *extra) -{ - __xmlSimpleError(XML_FROM_I18N, XML_ERR_NO_MEMORY, NULL, NULL, extra); -} - -/** - * xmlErrEncoding: - * @error: the error number - * @msg: the error message - * - * n encoding error - */ -static void -xmlEncodingErr(xmlParserErrors error, const char *msg, const char *val) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, - XML_FROM_I18N, error, XML_ERR_FATAL, - NULL, 0, val, NULL, NULL, 0, 0, msg, val); -} - -/************************************************************************ - * * - * Conversions To/From UTF8 encoding * - * * - ************************************************************************/ - -/** - * asciiToUTF8: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of ASCII chars - * @inlen: the length of @in - * - * Take a block of ASCII chars in and try to convert it to an UTF-8 - * block of chars out. - * Returns 0 if success, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -static int -asciiToUTF8(unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - unsigned char* outstart = out; - const unsigned char* base = in; - const unsigned char* processed = in; - unsigned char* outend = out + *outlen; - const unsigned char* inend; - unsigned int c; - - inend = in + (*inlen); - while ((in < inend) && (out - outstart + 5 < *outlen)) { - c= *in++; - - if (out >= outend) - break; - if (c < 0x80) { - *out++ = c; - } else { - *outlen = out - outstart; - *inlen = processed - base; - return(-1); - } - - processed = (const unsigned char*) in; - } - *outlen = out - outstart; - *inlen = processed - base; - return(*outlen); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * UTF8Toascii: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and try to convert it to an ASCII - * block of chars out. - * - * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -static int -UTF8Toascii(unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - const unsigned char* processed = in; - const unsigned char* outend; - const unsigned char* outstart = out; - const unsigned char* instart = in; - const unsigned char* inend; - unsigned int c, d; - int trailing; - - if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); - if (in == NULL) { - /* - * initialization nothing to do - */ - *outlen = 0; - *inlen = 0; - return(0); - } - inend = in + (*inlen); - outend = out + (*outlen); - while (in < inend) { - d = *in++; - if (d < 0x80) { c= d; trailing= 0; } - else if (d < 0xC0) { - /* trailing byte in leading position */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } - else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } - else if (d < 0xF8) { c= d & 0x07; trailing= 3; } - else { - /* no chance for this in Ascii */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - - if (inend - in < trailing) { - break; - } - - for ( ; trailing; trailing--) { - if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) - break; - c <<= 6; - c |= d & 0x3F; - } - - /* assertion: c is a single UTF-4 value */ - if (c < 0x80) { - if (out >= outend) - break; - *out++ = c; - } else { - /* no chance for this in Ascii */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - processed = in; - } - *outlen = out - outstart; - *inlen = processed - instart; - return(*outlen); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * isolat1ToUTF8: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of ISO Latin 1 chars - * @inlen: the length of @in - * - * Take a block of ISO Latin 1 chars in and try to convert it to an UTF-8 - * block of chars out. - * Returns the number of bytes written if success, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -int -isolat1ToUTF8(unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - unsigned char* outstart = out; - const unsigned char* base = in; - unsigned char* outend; - const unsigned char* inend; - const unsigned char* instop; - - if ((out == NULL) || (in == NULL) || (outlen == NULL) || (inlen == NULL)) - return(-1); - - outend = out + *outlen; - inend = in + (*inlen); - instop = inend; - - while (in < inend && out < outend - 1) { - if (*in >= 0x80) { - *out++ = (((*in) >> 6) & 0x1F) | 0xC0; - *out++ = ((*in) & 0x3F) | 0x80; - ++in; - } - if (instop - in > outend - out) instop = in + (outend - out); - while (in < instop && *in < 0x80) { - *out++ = *in++; - } - } - if (in < inend && out < outend && *in < 0x80) { - *out++ = *in++; - } - *outlen = out - outstart; - *inlen = in - base; - return(*outlen); -} - -/** - * UTF8ToUTF8: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @inb: a pointer to an array of UTF-8 chars - * @inlenb: the length of @in in UTF-8 chars - * - * No op copy operation for UTF8 handling. - * - * Returns the number of bytes written, or -1 if lack of space. - * The value of *inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - */ -static int -UTF8ToUTF8(unsigned char* out, int *outlen, - const unsigned char* inb, int *inlenb) -{ - int len; - - if ((out == NULL) || (inb == NULL) || (outlen == NULL) || (inlenb == NULL)) - return(-1); - if (*outlen > *inlenb) { - len = *inlenb; - } else { - len = *outlen; - } - if (len < 0) - return(-1); - - memcpy(out, inb, len); - - *outlen = len; - *inlenb = len; - return(*outlen); -} - - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * UTF8Toisolat1: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and try to convert it to an ISO Latin 1 - * block of chars out. - * - * Returns the number of bytes written if success, -2 if the transcoding fails, - or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -int -UTF8Toisolat1(unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - const unsigned char* processed = in; - const unsigned char* outend; - const unsigned char* outstart = out; - const unsigned char* instart = in; - const unsigned char* inend; - unsigned int c, d; - int trailing; - - if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); - if (in == NULL) { - /* - * initialization nothing to do - */ - *outlen = 0; - *inlen = 0; - return(0); - } - inend = in + (*inlen); - outend = out + (*outlen); - while (in < inend) { - d = *in++; - if (d < 0x80) { c= d; trailing= 0; } - else if (d < 0xC0) { - /* trailing byte in leading position */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } - else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } - else if (d < 0xF8) { c= d & 0x07; trailing= 3; } - else { - /* no chance for this in IsoLat1 */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - - if (inend - in < trailing) { - break; - } - - for ( ; trailing; trailing--) { - if (in >= inend) - break; - if (((d= *in++) & 0xC0) != 0x80) { - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - c <<= 6; - c |= d & 0x3F; - } - - /* assertion: c is a single UTF-4 value */ - if (c <= 0xFF) { - if (out >= outend) - break; - *out++ = c; - } else { - /* no chance for this in IsoLat1 */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - processed = in; - } - *outlen = out - outstart; - *inlen = processed - instart; - return(*outlen); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * UTF16LEToUTF8: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @inb: a pointer to an array of UTF-16LE passwd as a byte array - * @inlenb: the length of @in in UTF-16LE chars - * - * Take a block of UTF-16LE ushorts in and try to convert it to an UTF-8 - * block of chars out. This function assumes the endian property - * is the same between the native type of this machine and the - * inputed one. - * - * Returns the number of bytes written, or -1 if lack of space, or -2 - * if the transcoding fails (if *in is not a valid utf16 string) - * The value of *inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - */ -static int -UTF16LEToUTF8(unsigned char* out, int *outlen, - const unsigned char* inb, int *inlenb) -{ - unsigned char* outstart = out; - const unsigned char* processed = inb; - unsigned char* outend = out + *outlen; - unsigned short* in = (unsigned short*) inb; - unsigned short* inend; - unsigned int c, d, inlen; - unsigned char *tmp; - int bits; - - if ((*inlenb % 2) == 1) - (*inlenb)--; - inlen = *inlenb / 2; - inend = in + inlen; - while ((in < inend) && (out - outstart + 5 < *outlen)) { - if (xmlLittleEndian) { - c= *in++; - } else { - tmp = (unsigned char *) in; - c = *tmp++; - c = c | (((unsigned int)*tmp) << 8); - in++; - } - if ((c & 0xFC00) == 0xD800) { /* surrogates */ - if (in >= inend) { /* (in > inend) shouldn't happens */ - break; - } - if (xmlLittleEndian) { - d = *in++; - } else { - tmp = (unsigned char *) in; - d = *tmp++; - d = d | (((unsigned int)*tmp) << 8); - in++; - } - if ((d & 0xFC00) == 0xDC00) { - c &= 0x03FF; - c <<= 10; - c |= d & 0x03FF; - c += 0x10000; - } - else { - *outlen = out - outstart; - *inlenb = processed - inb; - return(-2); - } - } - - /* assertion: c is a single UTF-4 value */ - if (out >= outend) - break; - if (c < 0x80) { *out++= c; bits= -6; } - else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; } - else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; } - else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; } - - for ( ; bits >= 0; bits-= 6) { - if (out >= outend) - break; - *out++= ((c >> bits) & 0x3F) | 0x80; - } - processed = (const unsigned char*) in; - } - *outlen = out - outstart; - *inlenb = processed - inb; - return(*outlen); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * UTF8ToUTF16LE: - * @outb: a pointer to an array of bytes to store the result - * @outlen: the length of @outb - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and try to convert it to an UTF-16LE - * block of chars out. - * - * Returns the number of bytes written, or -1 if lack of space, or -2 - * if the transcoding failed. - */ -static int -UTF8ToUTF16LE(unsigned char* outb, int *outlen, - const unsigned char* in, int *inlen) -{ - unsigned short* out = (unsigned short*) outb; - const unsigned char* processed = in; - const unsigned char *const instart = in; - unsigned short* outstart= out; - unsigned short* outend; - const unsigned char* inend; - unsigned int c, d; - int trailing; - unsigned char *tmp; - unsigned short tmp1, tmp2; - - /* UTF16LE encoding has no BOM */ - if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); - if (in == NULL) { - *outlen = 0; - *inlen = 0; - return(0); - } - inend= in + *inlen; - outend = out + (*outlen / 2); - while (in < inend) { - d= *in++; - if (d < 0x80) { c= d; trailing= 0; } - else if (d < 0xC0) { - /* trailing byte in leading position */ - *outlen = (out - outstart) * 2; - *inlen = processed - instart; - return(-2); - } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } - else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } - else if (d < 0xF8) { c= d & 0x07; trailing= 3; } - else { - /* no chance for this in UTF-16 */ - *outlen = (out - outstart) * 2; - *inlen = processed - instart; - return(-2); - } - - if (inend - in < trailing) { - break; - } - - for ( ; trailing; trailing--) { - if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) - break; - c <<= 6; - c |= d & 0x3F; - } - - /* assertion: c is a single UTF-4 value */ - if (c < 0x10000) { - if (out >= outend) - break; - if (xmlLittleEndian) { - *out++ = c; - } else { - tmp = (unsigned char *) out; - *tmp = c ; - *(tmp + 1) = c >> 8 ; - out++; - } - } - else if (c < 0x110000) { - if (out+1 >= outend) - break; - c -= 0x10000; - if (xmlLittleEndian) { - *out++ = 0xD800 | (c >> 10); - *out++ = 0xDC00 | (c & 0x03FF); - } else { - tmp1 = 0xD800 | (c >> 10); - tmp = (unsigned char *) out; - *tmp = (unsigned char) tmp1; - *(tmp + 1) = tmp1 >> 8; - out++; - - tmp2 = 0xDC00 | (c & 0x03FF); - tmp = (unsigned char *) out; - *tmp = (unsigned char) tmp2; - *(tmp + 1) = tmp2 >> 8; - out++; - } - } - else - break; - processed = in; - } - *outlen = (out - outstart) * 2; - *inlen = processed - instart; - return(*outlen); -} - -/** - * UTF8ToUTF16: - * @outb: a pointer to an array of bytes to store the result - * @outlen: the length of @outb - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and try to convert it to an UTF-16 - * block of chars out. - * - * Returns the number of bytes written, or -1 if lack of space, or -2 - * if the transcoding failed. - */ -static int -UTF8ToUTF16(unsigned char* outb, int *outlen, - const unsigned char* in, int *inlen) -{ - if (in == NULL) { - /* - * initialization, add the Byte Order Mark for UTF-16LE - */ - if (*outlen >= 2) { - outb[0] = 0xFF; - outb[1] = 0xFE; - *outlen = 2; - *inlen = 0; -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "Added FFFE Byte Order Mark\n"); -#endif - return(2); - } - *outlen = 0; - *inlen = 0; - return(0); - } - return (UTF8ToUTF16LE(outb, outlen, in, inlen)); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * UTF16BEToUTF8: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @inb: a pointer to an array of UTF-16 passed as a byte array - * @inlenb: the length of @in in UTF-16 chars - * - * Take a block of UTF-16 ushorts in and try to convert it to an UTF-8 - * block of chars out. This function assumes the endian property - * is the same between the native type of this machine and the - * inputed one. - * - * Returns the number of bytes written, or -1 if lack of space, or -2 - * if the transcoding fails (if *in is not a valid utf16 string) - * The value of *inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - */ -static int -UTF16BEToUTF8(unsigned char* out, int *outlen, - const unsigned char* inb, int *inlenb) -{ - unsigned char* outstart = out; - const unsigned char* processed = inb; - unsigned char* outend = out + *outlen; - unsigned short* in = (unsigned short*) inb; - unsigned short* inend; - unsigned int c, d, inlen; - unsigned char *tmp; - int bits; - - if ((*inlenb % 2) == 1) - (*inlenb)--; - inlen = *inlenb / 2; - inend= in + inlen; - while (in < inend) { - if (xmlLittleEndian) { - tmp = (unsigned char *) in; - c = *tmp++; - c = c << 8; - c = c | (unsigned int) *tmp; - in++; - } else { - c= *in++; - } - if ((c & 0xFC00) == 0xD800) { /* surrogates */ - if (in >= inend) { /* (in > inend) shouldn't happens */ - *outlen = out - outstart; - *inlenb = processed - inb; - return(-2); - } - if (xmlLittleEndian) { - tmp = (unsigned char *) in; - d = *tmp++; - d = d << 8; - d = d | (unsigned int) *tmp; - in++; - } else { - d= *in++; - } - if ((d & 0xFC00) == 0xDC00) { - c &= 0x03FF; - c <<= 10; - c |= d & 0x03FF; - c += 0x10000; - } - else { - *outlen = out - outstart; - *inlenb = processed - inb; - return(-2); - } - } - - /* assertion: c is a single UTF-4 value */ - if (out >= outend) - break; - if (c < 0x80) { *out++= c; bits= -6; } - else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; } - else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; } - else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; } - - for ( ; bits >= 0; bits-= 6) { - if (out >= outend) - break; - *out++= ((c >> bits) & 0x3F) | 0x80; - } - processed = (const unsigned char*) in; - } - *outlen = out - outstart; - *inlenb = processed - inb; - return(*outlen); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * UTF8ToUTF16BE: - * @outb: a pointer to an array of bytes to store the result - * @outlen: the length of @outb - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and try to convert it to an UTF-16BE - * block of chars out. - * - * Returns the number of byte written, or -1 by lack of space, or -2 - * if the transcoding failed. - */ -static int -UTF8ToUTF16BE(unsigned char* outb, int *outlen, - const unsigned char* in, int *inlen) -{ - unsigned short* out = (unsigned short*) outb; - const unsigned char* processed = in; - const unsigned char *const instart = in; - unsigned short* outstart= out; - unsigned short* outend; - const unsigned char* inend; - unsigned int c, d; - int trailing; - unsigned char *tmp; - unsigned short tmp1, tmp2; - - /* UTF-16BE has no BOM */ - if ((outb == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); - if (in == NULL) { - *outlen = 0; - *inlen = 0; - return(0); - } - inend= in + *inlen; - outend = out + (*outlen / 2); - while (in < inend) { - d= *in++; - if (d < 0x80) { c= d; trailing= 0; } - else if (d < 0xC0) { - /* trailing byte in leading position */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } - else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } - else if (d < 0xF8) { c= d & 0x07; trailing= 3; } - else { - /* no chance for this in UTF-16 */ - *outlen = out - outstart; - *inlen = processed - instart; - return(-2); - } - - if (inend - in < trailing) { - break; - } - - for ( ; trailing; trailing--) { - if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) break; - c <<= 6; - c |= d & 0x3F; - } - - /* assertion: c is a single UTF-4 value */ - if (c < 0x10000) { - if (out >= outend) break; - if (xmlLittleEndian) { - tmp = (unsigned char *) out; - *tmp = c >> 8; - *(tmp + 1) = c; - out++; - } else { - *out++ = c; - } - } - else if (c < 0x110000) { - if (out+1 >= outend) break; - c -= 0x10000; - if (xmlLittleEndian) { - tmp1 = 0xD800 | (c >> 10); - tmp = (unsigned char *) out; - *tmp = tmp1 >> 8; - *(tmp + 1) = (unsigned char) tmp1; - out++; - - tmp2 = 0xDC00 | (c & 0x03FF); - tmp = (unsigned char *) out; - *tmp = tmp2 >> 8; - *(tmp + 1) = (unsigned char) tmp2; - out++; - } else { - *out++ = 0xD800 | (c >> 10); - *out++ = 0xDC00 | (c & 0x03FF); - } - } - else - break; - processed = in; - } - *outlen = (out - outstart) * 2; - *inlen = processed - instart; - return(*outlen); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/************************************************************************ - * * - * Generic encoding handling routines * - * * - ************************************************************************/ - -/** - * xmlDetectCharEncoding: - * @in: a pointer to the first bytes of the XML entity, must be at least - * 2 bytes long (at least 4 if encoding is UTF4 variant). - * @len: pointer to the length of the buffer - * - * Guess the encoding of the entity using the first bytes of the entity content - * according to the non-normative appendix F of the XML-1.0 recommendation. - * - * Returns one of the XML_CHAR_ENCODING_... values. - */ -xmlCharEncoding -xmlDetectCharEncoding(const unsigned char* in, int len) -{ - if (in == NULL) - return(XML_CHAR_ENCODING_NONE); - if (len >= 4) { - if ((in[0] == 0x00) && (in[1] == 0x00) && - (in[2] == 0x00) && (in[3] == 0x3C)) - return(XML_CHAR_ENCODING_UCS4BE); - if ((in[0] == 0x3C) && (in[1] == 0x00) && - (in[2] == 0x00) && (in[3] == 0x00)) - return(XML_CHAR_ENCODING_UCS4LE); - if ((in[0] == 0x00) && (in[1] == 0x00) && - (in[2] == 0x3C) && (in[3] == 0x00)) - return(XML_CHAR_ENCODING_UCS4_2143); - if ((in[0] == 0x00) && (in[1] == 0x3C) && - (in[2] == 0x00) && (in[3] == 0x00)) - return(XML_CHAR_ENCODING_UCS4_3412); - if ((in[0] == 0x4C) && (in[1] == 0x6F) && - (in[2] == 0xA7) && (in[3] == 0x94)) - return(XML_CHAR_ENCODING_EBCDIC); - if ((in[0] == 0x3C) && (in[1] == 0x3F) && - (in[2] == 0x78) && (in[3] == 0x6D)) - return(XML_CHAR_ENCODING_UTF8); - /* - * Although not part of the recommendation, we also - * attempt an "auto-recognition" of UTF-16LE and - * UTF-16BE encodings. - */ - if ((in[0] == 0x3C) && (in[1] == 0x00) && - (in[2] == 0x3F) && (in[3] == 0x00)) - return(XML_CHAR_ENCODING_UTF16LE); - if ((in[0] == 0x00) && (in[1] == 0x3C) && - (in[2] == 0x00) && (in[3] == 0x3F)) - return(XML_CHAR_ENCODING_UTF16BE); - } - if (len >= 3) { - /* - * Errata on XML-1.0 June 20 2001 - * We now allow an UTF8 encoded BOM - */ - if ((in[0] == 0xEF) && (in[1] == 0xBB) && - (in[2] == 0xBF)) - return(XML_CHAR_ENCODING_UTF8); - } - /* For UTF-16 we can recognize by the BOM */ - if (len >= 2) { - if ((in[0] == 0xFE) && (in[1] == 0xFF)) - return(XML_CHAR_ENCODING_UTF16BE); - if ((in[0] == 0xFF) && (in[1] == 0xFE)) - return(XML_CHAR_ENCODING_UTF16LE); - } - return(XML_CHAR_ENCODING_NONE); -} - -/** - * xmlCleanupEncodingAliases: - * - * Unregisters all aliases - */ -void -xmlCleanupEncodingAliases(void) { - int i; - - if (xmlCharEncodingAliases == NULL) - return; - - for (i = 0;i < xmlCharEncodingAliasesNb;i++) { - if (xmlCharEncodingAliases[i].name != NULL) - xmlFree((char *) xmlCharEncodingAliases[i].name); - if (xmlCharEncodingAliases[i].alias != NULL) - xmlFree((char *) xmlCharEncodingAliases[i].alias); - } - xmlCharEncodingAliasesNb = 0; - xmlCharEncodingAliasesMax = 0; - xmlFree(xmlCharEncodingAliases); - xmlCharEncodingAliases = NULL; -} - -/** - * xmlGetEncodingAlias: - * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) - * - * Lookup an encoding name for the given alias. - * - * Returns NULL if not found, otherwise the original name - */ -const char * -xmlGetEncodingAlias(const char *alias) { - int i; - char upper[100]; - - if (alias == NULL) - return(NULL); - - if (xmlCharEncodingAliases == NULL) - return(NULL); - - for (i = 0;i < 99;i++) { - upper[i] = toupper(alias[i]); - if (upper[i] == 0) break; - } - upper[i] = 0; - - /* - * Walk down the list looking for a definition of the alias - */ - for (i = 0;i < xmlCharEncodingAliasesNb;i++) { - if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) { - return(xmlCharEncodingAliases[i].name); - } - } - return(NULL); -} - -/** - * xmlAddEncodingAlias: - * @name: the encoding name as parsed, in UTF-8 format (ASCII actually) - * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) - * - * Registers an alias @alias for an encoding named @name. Existing alias - * will be overwritten. - * - * Returns 0 in case of success, -1 in case of error - */ -int -xmlAddEncodingAlias(const char *name, const char *alias) { - int i; - char upper[100]; - - if ((name == NULL) || (alias == NULL)) - return(-1); - - for (i = 0;i < 99;i++) { - upper[i] = toupper(alias[i]); - if (upper[i] == 0) break; - } - upper[i] = 0; - - if (xmlCharEncodingAliases == NULL) { - xmlCharEncodingAliasesNb = 0; - xmlCharEncodingAliasesMax = 20; - xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) - xmlMalloc(xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); - if (xmlCharEncodingAliases == NULL) - return(-1); - } else if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) { - xmlCharEncodingAliasesMax *= 2; - xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) - xmlRealloc(xmlCharEncodingAliases, - xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); - } - /* - * Walk down the list looking for a definition of the alias - */ - for (i = 0;i < xmlCharEncodingAliasesNb;i++) { - if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) { - /* - * Replace the definition. - */ - xmlFree((char *) xmlCharEncodingAliases[i].name); - xmlCharEncodingAliases[i].name = xmlMemStrdup(name); - return(0); - } - } - /* - * Add the definition - */ - xmlCharEncodingAliases[xmlCharEncodingAliasesNb].name = xmlMemStrdup(name); - xmlCharEncodingAliases[xmlCharEncodingAliasesNb].alias = xmlMemStrdup(upper); - xmlCharEncodingAliasesNb++; - return(0); -} - -/** - * xmlDelEncodingAlias: - * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) - * - * Unregisters an encoding alias @alias - * - * Returns 0 in case of success, -1 in case of error - */ -int -xmlDelEncodingAlias(const char *alias) { - int i; - - if (alias == NULL) - return(-1); - - if (xmlCharEncodingAliases == NULL) - return(-1); - /* - * Walk down the list looking for a definition of the alias - */ - for (i = 0;i < xmlCharEncodingAliasesNb;i++) { - if (!strcmp(xmlCharEncodingAliases[i].alias, alias)) { - xmlFree((char *) xmlCharEncodingAliases[i].name); - xmlFree((char *) xmlCharEncodingAliases[i].alias); - xmlCharEncodingAliasesNb--; - memmove(&xmlCharEncodingAliases[i], &xmlCharEncodingAliases[i + 1], - sizeof(xmlCharEncodingAlias) * (xmlCharEncodingAliasesNb - i)); - return(0); - } - } - return(-1); -} - -/** - * xmlParseCharEncoding: - * @name: the encoding name as parsed, in UTF-8 format (ASCII actually) - * - * Compare the string to the encoding schemes already known. Note - * that the comparison is case insensitive accordingly to the section - * [XML] 4.3.3 Character Encoding in Entities. - * - * Returns one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE - * if not recognized. - */ -xmlCharEncoding -xmlParseCharEncoding(const char* name) -{ - const char *alias; - char upper[500]; - int i; - - if (name == NULL) - return(XML_CHAR_ENCODING_NONE); - - /* - * Do the alias resolution - */ - alias = xmlGetEncodingAlias(name); - if (alias != NULL) - name = alias; - - for (i = 0;i < 499;i++) { - upper[i] = toupper(name[i]); - if (upper[i] == 0) break; - } - upper[i] = 0; - - if (!strcmp(upper, "")) return(XML_CHAR_ENCODING_NONE); - if (!strcmp(upper, "UTF-8")) return(XML_CHAR_ENCODING_UTF8); - if (!strcmp(upper, "UTF8")) return(XML_CHAR_ENCODING_UTF8); - - /* - * NOTE: if we were able to parse this, the endianness of UTF16 is - * already found and in use - */ - if (!strcmp(upper, "UTF-16")) return(XML_CHAR_ENCODING_UTF16LE); - if (!strcmp(upper, "UTF16")) return(XML_CHAR_ENCODING_UTF16LE); - - if (!strcmp(upper, "ISO-10646-UCS-2")) return(XML_CHAR_ENCODING_UCS2); - if (!strcmp(upper, "UCS-2")) return(XML_CHAR_ENCODING_UCS2); - if (!strcmp(upper, "UCS2")) return(XML_CHAR_ENCODING_UCS2); - - /* - * NOTE: if we were able to parse this, the endianness of UCS4 is - * already found and in use - */ - if (!strcmp(upper, "ISO-10646-UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); - if (!strcmp(upper, "UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); - if (!strcmp(upper, "UCS4")) return(XML_CHAR_ENCODING_UCS4LE); - - - if (!strcmp(upper, "ISO-8859-1")) return(XML_CHAR_ENCODING_8859_1); - if (!strcmp(upper, "ISO-LATIN-1")) return(XML_CHAR_ENCODING_8859_1); - if (!strcmp(upper, "ISO LATIN 1")) return(XML_CHAR_ENCODING_8859_1); - - if (!strcmp(upper, "ISO-8859-2")) return(XML_CHAR_ENCODING_8859_2); - if (!strcmp(upper, "ISO-LATIN-2")) return(XML_CHAR_ENCODING_8859_2); - if (!strcmp(upper, "ISO LATIN 2")) return(XML_CHAR_ENCODING_8859_2); - - if (!strcmp(upper, "ISO-8859-3")) return(XML_CHAR_ENCODING_8859_3); - if (!strcmp(upper, "ISO-8859-4")) return(XML_CHAR_ENCODING_8859_4); - if (!strcmp(upper, "ISO-8859-5")) return(XML_CHAR_ENCODING_8859_5); - if (!strcmp(upper, "ISO-8859-6")) return(XML_CHAR_ENCODING_8859_6); - if (!strcmp(upper, "ISO-8859-7")) return(XML_CHAR_ENCODING_8859_7); - if (!strcmp(upper, "ISO-8859-8")) return(XML_CHAR_ENCODING_8859_8); - if (!strcmp(upper, "ISO-8859-9")) return(XML_CHAR_ENCODING_8859_9); - - if (!strcmp(upper, "ISO-2022-JP")) return(XML_CHAR_ENCODING_2022_JP); - if (!strcmp(upper, "SHIFT_JIS")) return(XML_CHAR_ENCODING_SHIFT_JIS); - if (!strcmp(upper, "EUC-JP")) return(XML_CHAR_ENCODING_EUC_JP); - -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, "Unknown encoding %s\n", name); -#endif - return(XML_CHAR_ENCODING_ERROR); -} - -/** - * xmlGetCharEncodingName: - * @enc: the encoding - * - * The "canonical" name for XML encoding. - * C.f. http://www.w3.org/TR/REC-xml#charencoding - * Section 4.3.3 Character Encoding in Entities - * - * Returns the canonical name for the given encoding - */ - -const char* -xmlGetCharEncodingName(xmlCharEncoding enc) { - switch (enc) { - case XML_CHAR_ENCODING_ERROR: - return(NULL); - case XML_CHAR_ENCODING_NONE: - return(NULL); - case XML_CHAR_ENCODING_UTF8: - return("UTF-8"); - case XML_CHAR_ENCODING_UTF16LE: - return("UTF-16"); - case XML_CHAR_ENCODING_UTF16BE: - return("UTF-16"); - case XML_CHAR_ENCODING_EBCDIC: - return("EBCDIC"); - case XML_CHAR_ENCODING_UCS4LE: - return("ISO-10646-UCS-4"); - case XML_CHAR_ENCODING_UCS4BE: - return("ISO-10646-UCS-4"); - case XML_CHAR_ENCODING_UCS4_2143: - return("ISO-10646-UCS-4"); - case XML_CHAR_ENCODING_UCS4_3412: - return("ISO-10646-UCS-4"); - case XML_CHAR_ENCODING_UCS2: - return("ISO-10646-UCS-2"); - case XML_CHAR_ENCODING_8859_1: - return("ISO-8859-1"); - case XML_CHAR_ENCODING_8859_2: - return("ISO-8859-2"); - case XML_CHAR_ENCODING_8859_3: - return("ISO-8859-3"); - case XML_CHAR_ENCODING_8859_4: - return("ISO-8859-4"); - case XML_CHAR_ENCODING_8859_5: - return("ISO-8859-5"); - case XML_CHAR_ENCODING_8859_6: - return("ISO-8859-6"); - case XML_CHAR_ENCODING_8859_7: - return("ISO-8859-7"); - case XML_CHAR_ENCODING_8859_8: - return("ISO-8859-8"); - case XML_CHAR_ENCODING_8859_9: - return("ISO-8859-9"); - case XML_CHAR_ENCODING_2022_JP: - return("ISO-2022-JP"); - case XML_CHAR_ENCODING_SHIFT_JIS: - return("Shift-JIS"); - case XML_CHAR_ENCODING_EUC_JP: - return("EUC-JP"); - case XML_CHAR_ENCODING_ASCII: - return(NULL); - } - return(NULL); -} - -/************************************************************************ - * * - * Char encoding handlers * - * * - ************************************************************************/ - - -/* the size should be growable, but it's not a big deal ... */ -#define MAX_ENCODING_HANDLERS 50 -static xmlCharEncodingHandlerPtr *handlers = NULL; -static int nbCharEncodingHandler = 0; - -/* - * The default is UTF-8 for XML, that's also the default used for the - * parser internals, so the default encoding handler is NULL - */ - -static xmlCharEncodingHandlerPtr xmlDefaultCharEncodingHandler = NULL; - -/** - * xmlNewCharEncodingHandler: - * @name: the encoding name, in UTF-8 format (ASCII actually) - * @input: the xmlCharEncodingInputFunc to read that encoding - * @output: the xmlCharEncodingOutputFunc to write that encoding - * - * Create and registers an xmlCharEncodingHandler. - * - * Returns the xmlCharEncodingHandlerPtr created (or NULL in case of error). - */ -xmlCharEncodingHandlerPtr -xmlNewCharEncodingHandler(const char *name, - xmlCharEncodingInputFunc input, - xmlCharEncodingOutputFunc output) { - xmlCharEncodingHandlerPtr handler; - const char *alias; - char upper[500]; - int i; - char *up = NULL; - - /* - * Do the alias resolution - */ - alias = xmlGetEncodingAlias(name); - if (alias != NULL) - name = alias; - - /* - * Keep only the uppercase version of the encoding. - */ - if (name == NULL) { - xmlEncodingErr(XML_I18N_NO_NAME, - "xmlNewCharEncodingHandler : no name !\n", NULL); - return(NULL); - } - for (i = 0;i < 499;i++) { - upper[i] = toupper(name[i]); - if (upper[i] == 0) break; - } - upper[i] = 0; - up = xmlMemStrdup(upper); - if (up == NULL) { - xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n"); - return(NULL); - } - - /* - * allocate and fill-up an handler block. - */ - handler = (xmlCharEncodingHandlerPtr) - xmlMalloc(sizeof(xmlCharEncodingHandler)); - if (handler == NULL) { - xmlFree(up); - xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n"); - return(NULL); - } - handler->input = input; - handler->output = output; - handler->name = up; - -#ifdef LIBXML_ICONV_ENABLED - handler->iconv_in = NULL; - handler->iconv_out = NULL; -#endif /* LIBXML_ICONV_ENABLED */ - - /* - * registers and returns the handler. - */ - xmlRegisterCharEncodingHandler(handler); -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "Registered encoding handler for %s\n", name); -#endif - return(handler); -} - -/** - * xmlInitCharEncodingHandlers: - * - * Initialize the char encoding support, it registers the default - * encoding supported. - * NOTE: while public, this function usually doesn't need to be called - * in normal processing. - */ -void -xmlInitCharEncodingHandlers(void) { - unsigned short int tst = 0x1234; - unsigned char *ptr = (unsigned char *) &tst; - - if (handlers != NULL) return; - - handlers = (xmlCharEncodingHandlerPtr *) - xmlMalloc(MAX_ENCODING_HANDLERS * sizeof(xmlCharEncodingHandlerPtr)); - - if (*ptr == 0x12) xmlLittleEndian = 0; - else if (*ptr == 0x34) xmlLittleEndian = 1; - else { - xmlEncodingErr(XML_ERR_INTERNAL_ERROR, - "Odd problem at endianness detection\n", NULL); - } - - if (handlers == NULL) { - xmlEncodingErrMemory("xmlInitCharEncodingHandlers : out of memory !\n"); - return; - } - xmlNewCharEncodingHandler("UTF-8", UTF8ToUTF8, UTF8ToUTF8); -#ifdef LIBXML_OUTPUT_ENABLED - xmlUTF16LEHandler = - xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, UTF8ToUTF16LE); - xmlUTF16BEHandler = - xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, UTF8ToUTF16BE); - xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, UTF8ToUTF16); - xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, UTF8Toisolat1); - xmlNewCharEncodingHandler("ASCII", asciiToUTF8, UTF8Toascii); - xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, UTF8Toascii); -#ifdef LIBXML_HTML_ENABLED - xmlNewCharEncodingHandler("HTML", NULL, UTF8ToHtml); -#endif -#else - xmlUTF16LEHandler = - xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, NULL); - xmlUTF16BEHandler = - xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, NULL); - xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, NULL); - xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, NULL); - xmlNewCharEncodingHandler("ASCII", asciiToUTF8, NULL); - xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, NULL); -#endif /* LIBXML_OUTPUT_ENABLED */ -#ifndef LIBXML_ICONV_ENABLED -#ifdef LIBXML_ISO8859X_ENABLED - xmlRegisterCharEncodingHandlersISO8859x (); -#endif -#endif - -} - -/** - * xmlCleanupCharEncodingHandlers: - * - * Cleanup the memory allocated for the char encoding support, it - * unregisters all the encoding handlers and the aliases. - */ -void -xmlCleanupCharEncodingHandlers(void) { - xmlCleanupEncodingAliases(); - - if (handlers == NULL) return; - - for (;nbCharEncodingHandler > 0;) { - nbCharEncodingHandler--; - if (handlers[nbCharEncodingHandler] != NULL) { - if (handlers[nbCharEncodingHandler]->name != NULL) - xmlFree(handlers[nbCharEncodingHandler]->name); - xmlFree(handlers[nbCharEncodingHandler]); - } - } - xmlFree(handlers); - handlers = NULL; - nbCharEncodingHandler = 0; - xmlDefaultCharEncodingHandler = NULL; -} - -/** - * xmlRegisterCharEncodingHandler: - * @handler: the xmlCharEncodingHandlerPtr handler block - * - * Register the char encoding handler, surprising, isn't it ? - */ -void -xmlRegisterCharEncodingHandler(xmlCharEncodingHandlerPtr handler) { - if (handlers == NULL) xmlInitCharEncodingHandlers(); - if (handler == NULL) { - xmlEncodingErr(XML_I18N_NO_HANDLER, - "xmlRegisterCharEncodingHandler: NULL handler !\n", NULL); - return; - } - - if (nbCharEncodingHandler >= MAX_ENCODING_HANDLERS) { - xmlEncodingErr(XML_I18N_EXCESS_HANDLER, - "xmlRegisterCharEncodingHandler: Too many handler registered, see %s\n", - "MAX_ENCODING_HANDLERS"); - return; - } - handlers[nbCharEncodingHandler++] = handler; -} - -/** - * xmlGetCharEncodingHandler: - * @enc: an xmlCharEncoding value. - * - * Search in the registered set the handler able to read/write that encoding. - * - * Returns the handler or NULL if not found - */ -xmlCharEncodingHandlerPtr -xmlGetCharEncodingHandler(xmlCharEncoding enc) { - xmlCharEncodingHandlerPtr handler; - - if (handlers == NULL) xmlInitCharEncodingHandlers(); - switch (enc) { - case XML_CHAR_ENCODING_ERROR: - return(NULL); - case XML_CHAR_ENCODING_NONE: - return(NULL); - case XML_CHAR_ENCODING_UTF8: - return(NULL); - case XML_CHAR_ENCODING_UTF16LE: - return(xmlUTF16LEHandler); - case XML_CHAR_ENCODING_UTF16BE: - return(xmlUTF16BEHandler); - case XML_CHAR_ENCODING_EBCDIC: - handler = xmlFindCharEncodingHandler("EBCDIC"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("ebcdic"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_UCS4BE: - handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("UCS-4"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("UCS4"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_UCS4LE: - handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("UCS-4"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("UCS4"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_UCS4_2143: - break; - case XML_CHAR_ENCODING_UCS4_3412: - break; - case XML_CHAR_ENCODING_UCS2: - handler = xmlFindCharEncodingHandler("ISO-10646-UCS-2"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("UCS-2"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("UCS2"); - if (handler != NULL) return(handler); - break; - - /* - * We used to keep ISO Latin encodings native in the - * generated data. This led to so many problems that - * this has been removed. One can still change this - * back by registering no-ops encoders for those - */ - case XML_CHAR_ENCODING_8859_1: - handler = xmlFindCharEncodingHandler("ISO-8859-1"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_8859_2: - handler = xmlFindCharEncodingHandler("ISO-8859-2"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_8859_3: - handler = xmlFindCharEncodingHandler("ISO-8859-3"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_8859_4: - handler = xmlFindCharEncodingHandler("ISO-8859-4"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_8859_5: - handler = xmlFindCharEncodingHandler("ISO-8859-5"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_8859_6: - handler = xmlFindCharEncodingHandler("ISO-8859-6"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_8859_7: - handler = xmlFindCharEncodingHandler("ISO-8859-7"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_8859_8: - handler = xmlFindCharEncodingHandler("ISO-8859-8"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_8859_9: - handler = xmlFindCharEncodingHandler("ISO-8859-9"); - if (handler != NULL) return(handler); - break; - - - case XML_CHAR_ENCODING_2022_JP: - handler = xmlFindCharEncodingHandler("ISO-2022-JP"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_SHIFT_JIS: - handler = xmlFindCharEncodingHandler("SHIFT-JIS"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("SHIFT_JIS"); - if (handler != NULL) return(handler); - handler = xmlFindCharEncodingHandler("Shift_JIS"); - if (handler != NULL) return(handler); - break; - case XML_CHAR_ENCODING_EUC_JP: - handler = xmlFindCharEncodingHandler("EUC-JP"); - if (handler != NULL) return(handler); - break; - default: - break; - } - -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "No handler found for encoding %d\n", enc); -#endif - return(NULL); -} - -/** - * xmlFindCharEncodingHandler: - * @name: a string describing the char encoding. - * - * Search in the registered set the handler able to read/write that encoding. - * - * Returns the handler or NULL if not found - */ -xmlCharEncodingHandlerPtr -xmlFindCharEncodingHandler(const char *name) { - const char *nalias; - const char *norig; - xmlCharEncoding alias; -#ifdef LIBXML_ICONV_ENABLED - xmlCharEncodingHandlerPtr enc; - iconv_t icv_in, icv_out; -#endif /* LIBXML_ICONV_ENABLED */ - char upper[100]; - int i; - - if (handlers == NULL) xmlInitCharEncodingHandlers(); - if (name == NULL) return(xmlDefaultCharEncodingHandler); - if (name[0] == 0) return(xmlDefaultCharEncodingHandler); - - /* - * Do the alias resolution - */ - norig = name; - nalias = xmlGetEncodingAlias(name); - if (nalias != NULL) - name = nalias; - - /* - * Check first for directly registered encoding names - */ - for (i = 0;i < 99;i++) { - upper[i] = toupper(name[i]); - if (upper[i] == 0) break; - } - upper[i] = 0; - - for (i = 0;i < nbCharEncodingHandler; i++) - if (!strcmp(upper, handlers[i]->name)) { -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "Found registered handler for encoding %s\n", name); -#endif - return(handlers[i]); - } - -#ifdef LIBXML_ICONV_ENABLED - /* check whether iconv can handle this */ - icv_in = iconv_open("UTF-8", name); - icv_out = iconv_open(name, "UTF-8"); - if (icv_in == (iconv_t) -1) { - icv_in = iconv_open("UTF-8", upper); - } - if (icv_out == (iconv_t) -1) { - icv_out = iconv_open(upper, "UTF-8"); - } - if ((icv_in != (iconv_t) -1) && (icv_out != (iconv_t) -1)) { - enc = (xmlCharEncodingHandlerPtr) - xmlMalloc(sizeof(xmlCharEncodingHandler)); - if (enc == NULL) { - iconv_close(icv_in); - iconv_close(icv_out); - return(NULL); - } - enc->name = xmlMemStrdup(name); - enc->input = NULL; - enc->output = NULL; - enc->iconv_in = icv_in; - enc->iconv_out = icv_out; -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "Found iconv handler for encoding %s\n", name); -#endif - return enc; - } else if ((icv_in != (iconv_t) -1) || icv_out != (iconv_t) -1) { - xmlEncodingErr(XML_ERR_INTERNAL_ERROR, - "iconv : problems with filters for '%s'\n", name); - } -#endif /* LIBXML_ICONV_ENABLED */ - -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "No handler found for encoding %s\n", name); -#endif - - /* - * Fallback using the canonical names - */ - alias = xmlParseCharEncoding(norig); - if (alias != XML_CHAR_ENCODING_ERROR) { - const char* canon; - canon = xmlGetCharEncodingName(alias); - if ((canon != NULL) && (strcmp(name, canon))) { - return(xmlFindCharEncodingHandler(canon)); - } - } - - /* If "none of the above", give up */ - return(NULL); -} - -/************************************************************************ - * * - * ICONV based generic conversion functions * - * * - ************************************************************************/ - -#ifdef LIBXML_ICONV_ENABLED -/** - * xmlIconvWrapper: - * @cd: iconv converter data structure - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of ISO Latin 1 chars - * @inlen: the length of @in - * - * Returns 0 if success, or - * -1 by lack of space, or - * -2 if the transcoding fails (for *in is not valid utf8 string or - * the result of transformation can't fit into the encoding we want), or - * -3 if there the last byte can't form a single output char. - * - * The value of @inlen after return is the number of octets consumed - * as the return value is positive, else unpredictable. - * The value of @outlen after return is the number of ocetes consumed. - */ -static int -xmlIconvWrapper(iconv_t cd, unsigned char *out, int *outlen, - const unsigned char *in, int *inlen) { - size_t icv_inlen, icv_outlen; - const char *icv_in = (const char *) in; - char *icv_out = (char *) out; - int ret; - - if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) { - if (outlen != NULL) *outlen = 0; - return(-1); - } - icv_inlen = *inlen; - icv_outlen = *outlen; - ret = iconv(cd, (char **) &icv_in, &icv_inlen, &icv_out, &icv_outlen); - *inlen -= icv_inlen; - *outlen -= icv_outlen; - if ((icv_inlen != 0) || (ret == -1)) { -#ifdef EILSEQ - if (errno == EILSEQ) { - return -2; - } else -#endif -#ifdef E2BIG - if (errno == E2BIG) { - return -1; - } else -#endif -#ifdef EINVAL - if (errno == EINVAL) { - return -3; - } else -#endif - { - return -3; - } - } - return 0; -} -#endif /* LIBXML_ICONV_ENABLED */ - -/************************************************************************ - * * - * The real API used by libxml for on-the-fly conversion * - * * - ************************************************************************/ - -/** - * xmlCharEncFirstLine: - * @handler: char enconding transformation data structure - * @out: an xmlBuffer for the output. - * @in: an xmlBuffer for the input - * - * Front-end for the encoding handler input function, but handle only - * the very first line, i.e. limit itself to 45 chars. - * - * Returns the number of byte written if success, or - * -1 general error - * -2 if the transcoding fails (for *in is not valid utf8 string or - * the result of transformation can't fit into the encoding we want), or - */ -int -xmlCharEncFirstLine(xmlCharEncodingHandler *handler, xmlBufferPtr out, - xmlBufferPtr in) { - int ret = -2; - int written; - int toconv; - - if (handler == NULL) return(-1); - if (out == NULL) return(-1); - if (in == NULL) return(-1); - - written = out->size - out->use; - toconv = in->use; - if (toconv * 2 >= written) { - xmlBufferGrow(out, toconv); - written = out->size - out->use - 1; - } - - /* - * echo '<?xml version="1.0" encoding="UCS4"?>' | wc -c => 38 - * 45 chars should be sufficient to reach the end of the encoding - * declaration without going too far inside the document content. - */ - written = 45; - - if (handler->input != NULL) { - ret = handler->input(&out->content[out->use], &written, - in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - } -#ifdef LIBXML_ICONV_ENABLED - else if (handler->iconv_in != NULL) { - ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - if (ret == -1) ret = -3; - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef DEBUG_ENCODING - switch (ret) { - case 0: - xmlGenericError(xmlGenericErrorContext, - "converted %d bytes to %d bytes of input\n", - toconv, written); - break; - case -1: - xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n", - toconv, written, in->use); - break; - case -2: - xmlGenericError(xmlGenericErrorContext, - "input conversion failed due to input error\n"); - break; - case -3: - xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n", - toconv, written, in->use); - break; - default: - xmlGenericError(xmlGenericErrorContext,"Unknown input conversion failed %d\n", ret); - } -#endif /* DEBUG_ENCODING */ - /* - * Ignore when input buffer is not on a boundary - */ - if (ret == -3) ret = 0; - if (ret == -1) ret = 0; - return(ret); -} - -/** - * xmlCharEncInFunc: - * @handler: char encoding transformation data structure - * @out: an xmlBuffer for the output. - * @in: an xmlBuffer for the input - * - * Generic front-end for the encoding handler input function - * - * Returns the number of byte written if success, or - * -1 general error - * -2 if the transcoding fails (for *in is not valid utf8 string or - * the result of transformation can't fit into the encoding we want), or - */ -int -xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out, - xmlBufferPtr in) -{ - int ret = -2; - int written; - int toconv; - - if (handler == NULL) - return (-1); - if (out == NULL) - return (-1); - if (in == NULL) - return (-1); - - toconv = in->use; - if (toconv == 0) - return (0); - written = out->size - out->use; - if (toconv * 2 >= written) { - xmlBufferGrow(out, out->size + toconv * 2); - written = out->size - out->use - 1; - } - if (handler->input != NULL) { - ret = handler->input(&out->content[out->use], &written, - in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - } -#ifdef LIBXML_ICONV_ENABLED - else if (handler->iconv_in != NULL) { - ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - out->content[out->use] = 0; - if (ret == -1) - ret = -3; - } -#endif /* LIBXML_ICONV_ENABLED */ - switch (ret) { - case 0: -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "converted %d bytes to %d bytes of input\n", - toconv, written); -#endif - break; - case -1: -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "converted %d bytes to %d bytes of input, %d left\n", - toconv, written, in->use); -#endif - break; - case -3: -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "converted %d bytes to %d bytes of input, %d left\n", - toconv, written, in->use); -#endif - break; - case -2: { - char buf[50]; - - snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", - in->content[0], in->content[1], - in->content[2], in->content[3]); - buf[49] = 0; - xmlEncodingErr(XML_I18N_CONV_FAILED, - "input conversion failed due to input error, bytes %s\n", - buf); - } - } - /* - * Ignore when input buffer is not on a boundary - */ - if (ret == -3) - ret = 0; - return (written? written : ret); -} - -/** - * xmlCharEncOutFunc: - * @handler: char enconding transformation data structure - * @out: an xmlBuffer for the output. - * @in: an xmlBuffer for the input - * - * Generic front-end for the encoding handler output function - * a first call with @in == NULL has to be made firs to initiate the - * output in case of non-stateless encoding needing to initiate their - * state or the output (like the BOM in UTF16). - * In case of UTF8 sequence conversion errors for the given encoder, - * the content will be automatically remapped to a CharRef sequence. - * - * Returns the number of byte written if success, or - * -1 general error - * -2 if the transcoding fails (for *in is not valid utf8 string or - * the result of transformation can't fit into the encoding we want), or - */ -int -xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out, - xmlBufferPtr in) { - int ret = -2; - int written; - int writtentot = 0; - int toconv; - int output = 0; - - if (handler == NULL) return(-1); - if (out == NULL) return(-1); - -retry: - - written = out->size - out->use; - - if (written > 0) - written--; /* Gennady: count '/0' */ - - /* - * First specific handling of in = NULL, i.e. the initialization call - */ - if (in == NULL) { - toconv = 0; - if (handler->output != NULL) { - ret = handler->output(&out->content[out->use], &written, - NULL, &toconv); - if (ret >= 0) { /* Gennady: check return value */ - out->use += written; - out->content[out->use] = 0; - } - } -#ifdef LIBXML_ICONV_ENABLED - else if (handler->iconv_out != NULL) { - ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use], - &written, NULL, &toconv); - out->use += written; - out->content[out->use] = 0; - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "initialized encoder\n"); -#endif - return(0); - } - - /* - * Conversion itself. - */ - toconv = in->use; - if (toconv == 0) - return(0); - if (toconv * 2 >= written) { - xmlBufferGrow(out, toconv * 2); - written = out->size - out->use - 1; - } - if (handler->output != NULL) { - ret = handler->output(&out->content[out->use], &written, - in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - writtentot += written; - out->content[out->use] = 0; - } -#ifdef LIBXML_ICONV_ENABLED - else if (handler->iconv_out != NULL) { - ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use], - &written, in->content, &toconv); - xmlBufferShrink(in, toconv); - out->use += written; - writtentot += written; - out->content[out->use] = 0; - if (ret == -1) { - if (written > 0) { - /* - * Can be a limitation of iconv - */ - goto retry; - } - ret = -3; - } - } -#endif /* LIBXML_ICONV_ENABLED */ - else { - xmlEncodingErr(XML_I18N_NO_OUTPUT, - "xmlCharEncOutFunc: no output function !\n", NULL); - return(-1); - } - - if (ret >= 0) output += ret; - - /* - * Attempt to handle error cases - */ - switch (ret) { - case 0: -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "converted %d bytes to %d bytes of output\n", - toconv, written); -#endif - break; - case -1: -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "output conversion failed by lack of space\n"); -#endif - break; - case -3: -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of output %d left\n", - toconv, written, in->use); -#endif - break; - case -2: { - int len = in->use; - const xmlChar *utf = (const xmlChar *) in->content; - int cur; - - cur = xmlGetUTF8Char(utf, &len); - if (cur > 0) { - xmlChar charref[20]; - -#ifdef DEBUG_ENCODING - xmlGenericError(xmlGenericErrorContext, - "handling output conversion error\n"); - xmlGenericError(xmlGenericErrorContext, - "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - in->content[0], in->content[1], - in->content[2], in->content[3]); -#endif - /* - * Removes the UTF8 sequence, and replace it by a charref - * and continue the transcoding phase, hoping the error - * did not mangle the encoder state. - */ - snprintf((char *) &charref[0], sizeof(charref), "&#%d;", cur); - xmlBufferShrink(in, len); - xmlBufferAddHead(in, charref, -1); - - goto retry; - } else { - char buf[50]; - - snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", - in->content[0], in->content[1], - in->content[2], in->content[3]); - buf[49] = 0; - xmlEncodingErr(XML_I18N_CONV_FAILED, - "output conversion failed due to conv error, bytes %s\n", - buf); - if (in->alloc != XML_BUFFER_ALLOC_IMMUTABLE) - in->content[0] = ' '; - } - break; - } - } - return(ret); -} - -/** - * xmlCharEncCloseFunc: - * @handler: char enconding transformation data structure - * - * Generic front-end for encoding handler close function - * - * Returns 0 if success, or -1 in case of error - */ -int -xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { - int ret = 0; - if (handler == NULL) return(-1); - if (handler->name == NULL) return(-1); -#ifdef LIBXML_ICONV_ENABLED - /* - * Iconv handlers can be used only once, free the whole block. - * and the associated icon resources. - */ - if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { - if (handler->name != NULL) - xmlFree(handler->name); - handler->name = NULL; - if (handler->iconv_out != NULL) { - if (iconv_close(handler->iconv_out)) - ret = -1; - handler->iconv_out = NULL; - } - if (handler->iconv_in != NULL) { - if (iconv_close(handler->iconv_in)) - ret = -1; - handler->iconv_in = NULL; - } - xmlFree(handler); - } -#endif /* LIBXML_ICONV_ENABLED */ -#ifdef DEBUG_ENCODING - if (ret) - xmlGenericError(xmlGenericErrorContext, - "failed to close the encoding handler\n"); - else - xmlGenericError(xmlGenericErrorContext, - "closed the encoding handler\n"); -#endif - - return(ret); -} - -/** - * xmlByteConsumed: - * @ctxt: an XML parser context - * - * This function provides the current index of the parser relative - * to the start of the current entity. This function is computed in - * bytes from the beginning starting at zero and finishing at the - * size in byte of the file if parsing a file. The function is - * of constant cost if the input is UTF-8 but can be costly if run - * on non-UTF-8 input. - * - * Returns the index in bytes from the beginning of the entity or -1 - * in case the index could not be computed. - */ -long -xmlByteConsumed(xmlParserCtxtPtr ctxt) { - xmlParserInputPtr in; - - if (ctxt == NULL) return(-1); - in = ctxt->input; - if (in == NULL) return(-1); - if ((in->buf != NULL) && (in->buf->encoder != NULL)) { - unsigned int unused = 0; - xmlCharEncodingHandler * handler = in->buf->encoder; - /* - * Encoding conversion, compute the number of unused original - * bytes from the input not consumed and substract that from - * the raw consumed value, this is not a cheap operation - */ - if (in->end - in->cur > 0) { - unsigned char convbuf[32000]; - const unsigned char *cur = (const unsigned char *)in->cur; - int toconv = in->end - in->cur, written = 32000; - - int ret; - - if (handler->output != NULL) { - do { - toconv = in->end - cur; - written = 32000; - ret = handler->output(&convbuf[0], &written, - cur, &toconv); - if (ret == -1) return(-1); - unused += written; - cur += toconv; - } while (ret == -2); -#ifdef LIBXML_ICONV_ENABLED - } else if (handler->iconv_out != NULL) { - do { - toconv = in->end - cur; - written = 32000; - ret = xmlIconvWrapper(handler->iconv_out, &convbuf[0], - &written, cur, &toconv); - if (ret < 0) { - if (written > 0) - ret = -2; - else - return(-1); - } - unused += written; - cur += toconv; - } while (ret == -2); -#endif - } else { - /* could not find a converter */ - return(-1); - } - } - if (in->buf->rawconsumed < unused) - return(-1); - return(in->buf->rawconsumed - unused); - } - return(in->consumed + (in->cur - in->base)); -} - -#ifndef LIBXML_ICONV_ENABLED -#ifdef LIBXML_ISO8859X_ENABLED - -/** - * UTF8ToISO8859x: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * @xlattable: the 2-level transcoding table - * - * Take a block of UTF-8 chars in and try to convert it to an ISO 8859-* - * block of chars out. - * - * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * as the return value is positive, else unpredictable. - * The value of @outlen after return is the number of ocetes consumed. - */ -static int -UTF8ToISO8859x(unsigned char* out, int *outlen, - const unsigned char* in, int *inlen, - unsigned char const *xlattable) { - const unsigned char* outstart = out; - const unsigned char* inend; - const unsigned char* instart = in; - - if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || - (xlattable == NULL)) - return(-1); - if (in == NULL) { - /* - * initialization nothing to do - */ - *outlen = 0; - *inlen = 0; - return(0); - } - inend = in + (*inlen); - while (in < inend) { - unsigned char d = *in++; - if (d < 0x80) { - *out++ = d; - } else if (d < 0xC0) { - /* trailing byte in leading position */ - *outlen = out - outstart; - *inlen = in - instart - 1; - return(-2); - } else if (d < 0xE0) { - unsigned char c; - if (!(in < inend)) { - /* trailing byte not in input buffer */ - *outlen = out - outstart; - *inlen = in - instart - 1; - return(-2); - } - c = *in++; - if ((c & 0xC0) != 0x80) { - /* not a trailing byte */ - *outlen = out - outstart; - *inlen = in - instart - 2; - return(-2); - } - c = c & 0x3F; - d = d & 0x1F; - d = xlattable [48 + c + xlattable [d] * 64]; - if (d == 0) { - /* not in character set */ - *outlen = out - outstart; - *inlen = in - instart - 2; - return(-2); - } - *out++ = d; - } else if (d < 0xF0) { - unsigned char c1; - unsigned char c2; - if (!(in < inend - 1)) { - /* trailing bytes not in input buffer */ - *outlen = out - outstart; - *inlen = in - instart - 1; - return(-2); - } - c1 = *in++; - if ((c1 & 0xC0) != 0x80) { - /* not a trailing byte (c1) */ - *outlen = out - outstart; - *inlen = in - instart - 2; - return(-2); - } - c2 = *in++; - if ((c2 & 0xC0) != 0x80) { - /* not a trailing byte (c2) */ - *outlen = out - outstart; - *inlen = in - instart - 2; - return(-2); - } - c1 = c1 & 0x3F; - c2 = c2 & 0x3F; - d = d & 0x0F; - d = xlattable [48 + c2 + xlattable [48 + c1 + - xlattable [32 + d] * 64] * 64]; - if (d == 0) { - /* not in character set */ - *outlen = out - outstart; - *inlen = in - instart - 3; - return(-2); - } - *out++ = d; - } else { - /* cannot transcode >= U+010000 */ - *outlen = out - outstart; - *inlen = in - instart - 1; - return(-2); - } - } - *outlen = out - outstart; - *inlen = in - instart; - return(*outlen); -} - -/** - * ISO8859xToUTF8 - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of ISO Latin 1 chars - * @inlen: the length of @in - * - * Take a block of ISO 8859-* chars in and try to convert it to an UTF-8 - * block of chars out. - * Returns 0 if success, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * The value of @outlen after return is the number of ocetes produced. - */ -static int -ISO8859xToUTF8(unsigned char* out, int *outlen, - const unsigned char* in, int *inlen, - unsigned short const *unicodetable) { - unsigned char* outstart = out; - unsigned char* outend; - const unsigned char* instart = in; - const unsigned char* inend; - const unsigned char* instop; - unsigned int c; - - if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || - (in == NULL) || (unicodetable == NULL)) - return(-1); - outend = out + *outlen; - inend = in + *inlen; - instop = inend; - c = *in; - while (in < inend && out < outend - 1) { - if (c >= 0x80) { - c = unicodetable [c - 0x80]; - if (c == 0) { - /* undefined code point */ - *outlen = out - outstart; - *inlen = in - instart; - return (-1); - } - if (c < 0x800) { - *out++ = ((c >> 6) & 0x1F) | 0xC0; - *out++ = (c & 0x3F) | 0x80; - } else { - *out++ = ((c >> 12) & 0x0F) | 0xE0; - *out++ = ((c >> 6) & 0x3F) | 0x80; - *out++ = (c & 0x3F) | 0x80; - } - ++in; - c = *in; - } - if (instop - in > outend - out) instop = in + (outend - out); - while (c < 0x80 && in < instop) { - *out++ = c; - ++in; - c = *in; - } - } - if (in < inend && out < outend && c < 0x80) { - *out++ = c; - ++in; - } - *outlen = out - outstart; - *inlen = in - instart; - return (*outlen); -} - - -/************************************************************************ - * Lookup tables for ISO-8859-2..ISO-8859-16 transcoding * - ************************************************************************/ - -static unsigned short const xmlunicodetable_ISO8859_2 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, - 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, - 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, - 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, - 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, - 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, - 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, - 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, - 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, - 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, -}; - -static unsigned char const xmltranscodetable_ISO8859_2 [48 + 6 * 64] = { - "\x00\x00\x01\x05\x02\x04\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00" - "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc3\xe3\xa1\xb1\xc6\xe6\x00\x00\x00\x00\xc8\xe8\xcf\xef" - "\xd0\xf0\x00\x00\x00\x00\x00\x00\xca\xea\xcc\xec\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xe5\x00\x00\xa5\xb5\x00" - "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\xb2\x00\xbd\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xa3\xb3\xd1\xf1\x00\x00\xd2\xf2\x00\x00\x00\x00\x00\x00\x00" - "\xd5\xf5\x00\x00\xc0\xe0\x00\x00\xd8\xf8\xa6\xb6\x00\x00\xaa\xba" - "\xa9\xb9\xde\xfe\xab\xbb\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xf9" - "\xdb\xfb\x00\x00\x00\x00\x00\x00\x00\xac\xbc\xaf\xbf\xae\xbe\x00" - "\x00\xc1\xc2\x00\xc4\x00\x00\xc7\x00\xc9\x00\xcb\x00\xcd\xce\x00" - "\x00\x00\x00\xd3\xd4\x00\xd6\xd7\x00\x00\xda\x00\xdc\xdd\x00\xdf" - "\x00\xe1\xe2\x00\xe4\x00\x00\xe7\x00\xe9\x00\xeb\x00\xed\xee\x00" - "\x00\x00\x00\xf3\xf4\x00\xf6\xf7\x00\x00\xfa\x00\xfc\xfd\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_3 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, - 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, - 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, - 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, - 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, - 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, - 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, -}; - -static unsigned char const xmltranscodetable_ISO8859_3 [48 + 7 * 64] = { - "\x04\x00\x01\x06\x02\x05\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\xa3\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00" - "\xb0\x00\xb2\xb3\xb4\xb5\x00\xb7\xb8\x00\x00\x00\x00\xbd\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xe6\xc5\xe5\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xf8\xab\xbb" - "\xd5\xf5\x00\x00\xa6\xb6\xa1\xb1\x00\x00\x00\x00\x00\x00\x00\x00" - "\xa9\xb9\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe\xaa\xba" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xbf\x00\x00\x00" - "\xc0\xc1\xc2\x00\xc4\x00\x00\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\x00\xd1\xd2\xd3\xd4\x00\xd6\xd7\x00\xd9\xda\xdb\xdc\x00\x00\xdf" - "\xe0\xe1\xe2\x00\xe4\x00\x00\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\x00\xf1\xf2\xf3\xf4\x00\xf6\xf7\x00\xf9\xfa\xfb\xfc\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_4 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, - 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, - 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, - 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, - 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, - 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, - 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, - 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, -}; - -static unsigned char const xmltranscodetable_ISO8859_4 [48 + 6 * 64] = { - "\x00\x00\x01\x05\x02\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\xaf" - "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00" - "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00" - "\xd0\xf0\xaa\xba\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00" - "\x00\x00\xab\xbb\x00\x00\x00\x00\xa5\xb5\xcf\xef\x00\x00\xc7\xe7" - "\x00\x00\x00\x00\x00\x00\xd3\xf3\xa2\x00\x00\xa6\xb6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xbd\xbf\xd2\xf2\x00\x00" - "\x00\x00\x00\x00\x00\x00\xa3\xb3\x00\x00\x00\x00\x00\x00\x00\x00" - "\xa9\xb9\x00\x00\x00\x00\xac\xbc\xdd\xfd\xde\xfe\x00\x00\x00\x00" - "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xbe\x00" - "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xb2\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\x00" - "\x00\x00\x00\x00\xd4\xd5\xd6\xd7\xd8\x00\xda\xdb\xdc\x00\x00\xdf" - "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\x00" - "\x00\x00\x00\x00\xf4\xf5\xf6\xf7\xf8\x00\xfa\xfb\xfc\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_5 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, - 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, -}; - -static unsigned char const xmltranscodetable_ISO8859_5 [48 + 6 * 64] = { - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xad\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\x00\xae\xaf" - "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" - "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" - "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\xfe\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_6 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, - 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, - 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, - 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, - 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, - 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -}; - -static unsigned char const xmltranscodetable_ISO8859_6 [48 + 5 * 64] = { - "\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\xbf" - "\x00\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\x00" - "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\xf0\xf1\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_7 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, - 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, - 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, - 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, - 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, - 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000, -}; - -static unsigned char const xmltranscodetable_ISO8859_7 [48 + 7 * 64] = { - "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x06" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\xa3\x00\x00\xa6\xa7\xa8\xa9\x00\xab\xac\xad\x00\x00" - "\xb0\xb1\xb2\xb3\x00\x00\x00\xb7\x00\x00\x00\xbb\x00\xbd\x00\x00" - "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xaf\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xb4\xb5\xb6\x00\xb8\xb9\xba\x00\xbc\x00\xbe\xbf" - "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\xd0\xd1\x00\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" - "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_8 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, - 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, - 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, - 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, - 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000, -}; - -static unsigned char const xmltranscodetable_ISO8859_8 [48 + 7 * 64] = { - "\x02\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\x00\xab\xac\xad\xae\xaf" - "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\x00\xbb\xbc\xbd\xbe\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00" - "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xfe" - "\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_9 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, -}; - -static unsigned char const xmltranscodetable_ISO8859_9 [48 + 5 * 64] = { - "\x00\x00\x01\x02\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" - "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" - "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\x00\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\x00\x00\xdf" - "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\x00\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xdd\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_10 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, - 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, - 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, - 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, - 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, - 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, - 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, -}; - -static unsigned char const xmltranscodetable_ISO8859_10 [48 + 7 * 64] = { - "\x00\x00\x01\x06\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\xad\x00\x00" - "\xb0\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" - "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00" - "\xa9\xb9\xa2\xb2\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00" - "\x00\x00\xa3\xb3\x00\x00\x00\x00\xa5\xb5\xa4\xb4\x00\x00\xc7\xe7" - "\x00\x00\x00\x00\x00\x00\xa6\xb6\xff\x00\x00\xa8\xb8\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xaf\xbf\xd2\xf2\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xaa\xba\x00\x00\x00\x00\xab\xbb\xd7\xf7\xae\xbe\x00\x00\x00\x00" - "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\xbc\x00" - "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\xcf" - "\xd0\x00\x00\xd3\xd4\xd5\xd6\x00\xd8\x00\xda\xdb\xdc\xdd\xde\xdf" - "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\xef" - "\xf0\x00\x00\xf3\xf4\xf5\xf6\x00\xf8\x00\xfa\xfb\xfc\xfd\xfe\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_11 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, - 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, - 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, - 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, - 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, - 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, - 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, - 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, - 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, - 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, - 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, - 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000, -}; - -static unsigned char const xmltranscodetable_ISO8859_11 [48 + 6 * 64] = { - "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00" - "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" - "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" - "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\xdf" - "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_13 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, - 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, - 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, - 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, - 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, - 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, - 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, - 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, - 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, - 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, - 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, -}; - -static unsigned char const xmltranscodetable_ISO8859_13 [48 + 7 * 64] = { - "\x00\x00\x01\x04\x06\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\xa2\xa3\xa4\x00\xa6\xa7\x00\xa9\x00\xab\xac\xad\xae\x00" - "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\x00\xbb\xbc\xbd\xbe\x00" - "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\xb4\xa1\xa5\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc4\xc5\xaf\x00\x00\xc9\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xd3\x00\xd5\xd6\xd7\xa8\x00\x00\x00\xdc\x00\x00\xdf" - "\x00\x00\x00\x00\xe4\xe5\xbf\x00\x00\xe9\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xf3\x00\xf5\xf6\xf7\xb8\x00\x00\x00\xfc\x00\x00\x00" - "\x00\xd9\xf9\xd1\xf1\xd2\xf2\x00\x00\x00\x00\x00\xd4\xf4\x00\x00" - "\x00\x00\x00\x00\x00\x00\xaa\xba\x00\x00\xda\xfa\x00\x00\x00\x00" - "\xd0\xf0\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xfb\x00\x00\x00\x00" - "\x00\x00\xd8\xf8\x00\x00\x00\x00\x00\xca\xea\xdd\xfd\xde\xfe\x00" - "\xc2\xe2\x00\x00\xc0\xe0\xc3\xe3\x00\x00\x00\x00\xc8\xe8\x00\x00" - "\x00\x00\xc7\xe7\x00\x00\xcb\xeb\xc6\xe6\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\xec\x00\x00\x00\x00\x00\x00\xce\xee\x00\x00\xc1\xe1" - "\x00\x00\x00\x00\x00\x00\xcd\xed\x00\x00\x00\xcf\xef\x00\x00\x00" -}; - -static unsigned short const xmlunicodetable_ISO8859_14 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, - 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, - 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, - 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, -}; - -static unsigned char const xmltranscodetable_ISO8859_14 [48 + 10 * 64] = { - "\x00\x00\x01\x09\x04\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\xa3\x00\x00\x00\xa7\x00\xa9\x00\x00\x00\xad\xae\x00" - "\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x08\x05\x06\x00\x00\x00\x00" - "\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00\xa6\xab\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xb1" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\xa5\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xb2\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xa8\xb8\xaa\xba\xbd\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xd0\xf0\xde\xfe\xaf\x00\x00\x00\x00\x00\x00\x00" - "\xb4\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xb7\xb9\x00\x00\x00\x00\x00\x00\x00\x00" - "\xbb\xbf\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\x00\xd1\xd2\xd3\xd4\xd5\xd6\x00\xd8\xd9\xda\xdb\xdc\xdd\x00\xdf" - "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\x00\xf1\xf2\xf3\xf4\xf5\xf6\x00\xf8\xf9\xfa\xfb\xfc\xfd\x00\xff" -}; - -static unsigned short const xmlunicodetable_ISO8859_15 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, - 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, - 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, -}; - -static unsigned char const xmltranscodetable_ISO8859_15 [48 + 6 * 64] = { - "\x00\x00\x01\x05\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\xa1\xa2\xa3\x00\xa5\x00\xa7\x00\xa9\xaa\xab\xac\xad\xae\xaf" - "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\xba\xbb\x00\x00\x00\xbf" - "\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xbc\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\xb4\xb8\x00" - "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" - "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" -}; - -static unsigned short const xmlunicodetable_ISO8859_16 [128] = { - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, - 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, - 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, - 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, - 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, - 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, - 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, -}; - -static unsigned char const xmltranscodetable_ISO8859_16 [48 + 9 * 64] = { - "\x00\x00\x01\x08\x02\x03\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\xa9\x00\xab\x00\xad\x00\x00" - "\xb0\xb1\x00\x00\x00\x00\xb6\xb7\x00\x00\x00\xbb\x00\x00\x00\x00" - "\x00\x00\xc3\xe3\xa1\xa2\xc5\xe5\x00\x00\x00\x00\xb2\xb9\x00\x00" - "\xd0\xf0\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xa3\xb3\xd1\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xd5\xf5\xbc\xbd\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00" - "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xd8\xf8\x00\x00\x00\x00\x00\x00\xbe\xac\xae\xaf\xbf\xb4\xb8\x00" - "\x06\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xa5\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xba\xde\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xc0\xc1\xc2\x00\xc4\x00\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" - "\x00\x00\xd2\xd3\xd4\x00\xd6\x00\x00\xd9\xda\xdb\xdc\x00\x00\xdf" - "\xe0\xe1\xe2\x00\xe4\x00\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" - "\x00\x00\xf2\xf3\xf4\x00\xf6\x00\x00\xf9\xfa\xfb\xfc\x00\x00\xff" -}; - - -/* - * auto-generated functions for ISO-8859-2 .. ISO-8859-16 - */ - -static int ISO8859_2ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_2); -} -static int UTF8ToISO8859_2 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_2); -} - -static int ISO8859_3ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_3); -} -static int UTF8ToISO8859_3 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_3); -} - -static int ISO8859_4ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_4); -} -static int UTF8ToISO8859_4 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_4); -} - -static int ISO8859_5ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_5); -} -static int UTF8ToISO8859_5 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_5); -} - -static int ISO8859_6ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_6); -} -static int UTF8ToISO8859_6 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_6); -} - -static int ISO8859_7ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_7); -} -static int UTF8ToISO8859_7 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_7); -} - -static int ISO8859_8ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_8); -} -static int UTF8ToISO8859_8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_8); -} - -static int ISO8859_9ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_9); -} -static int UTF8ToISO8859_9 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_9); -} - -static int ISO8859_10ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_10); -} -static int UTF8ToISO8859_10 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_10); -} - -static int ISO8859_11ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_11); -} -static int UTF8ToISO8859_11 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_11); -} - -static int ISO8859_13ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_13); -} -static int UTF8ToISO8859_13 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_13); -} - -static int ISO8859_14ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_14); -} -static int UTF8ToISO8859_14 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_14); -} - -static int ISO8859_15ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_15); -} -static int UTF8ToISO8859_15 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_15); -} - -static int ISO8859_16ToUTF8 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_16); -} -static int UTF8ToISO8859_16 (unsigned char* out, int *outlen, - const unsigned char* in, int *inlen) { - return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_16); -} - -static void -xmlRegisterCharEncodingHandlersISO8859x (void) { - xmlNewCharEncodingHandler ("ISO-8859-2", ISO8859_2ToUTF8, UTF8ToISO8859_2); - xmlNewCharEncodingHandler ("ISO-8859-3", ISO8859_3ToUTF8, UTF8ToISO8859_3); - xmlNewCharEncodingHandler ("ISO-8859-4", ISO8859_4ToUTF8, UTF8ToISO8859_4); - xmlNewCharEncodingHandler ("ISO-8859-5", ISO8859_5ToUTF8, UTF8ToISO8859_5); - xmlNewCharEncodingHandler ("ISO-8859-6", ISO8859_6ToUTF8, UTF8ToISO8859_6); - xmlNewCharEncodingHandler ("ISO-8859-7", ISO8859_7ToUTF8, UTF8ToISO8859_7); - xmlNewCharEncodingHandler ("ISO-8859-8", ISO8859_8ToUTF8, UTF8ToISO8859_8); - xmlNewCharEncodingHandler ("ISO-8859-9", ISO8859_9ToUTF8, UTF8ToISO8859_9); - xmlNewCharEncodingHandler ("ISO-8859-10", ISO8859_10ToUTF8, UTF8ToISO8859_10); - xmlNewCharEncodingHandler ("ISO-8859-11", ISO8859_11ToUTF8, UTF8ToISO8859_11); - xmlNewCharEncodingHandler ("ISO-8859-13", ISO8859_13ToUTF8, UTF8ToISO8859_13); - xmlNewCharEncodingHandler ("ISO-8859-14", ISO8859_14ToUTF8, UTF8ToISO8859_14); - xmlNewCharEncodingHandler ("ISO-8859-15", ISO8859_15ToUTF8, UTF8ToISO8859_15); - xmlNewCharEncodingHandler ("ISO-8859-16", ISO8859_16ToUTF8, UTF8ToISO8859_16); -} - -#endif -#endif - -#define bottom_encoding -#include "elfgcchack.h" - diff --git a/ThirdParty/libxml2/vtklibxml2/entities.c b/ThirdParty/libxml2/vtklibxml2/entities.c deleted file mode 100644 index 4c6609087a0..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/entities.c +++ /dev/null @@ -1,966 +0,0 @@ -/* - * entities.c : implementation for the XML entities handling - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#include <libxml/xmlmemory.h> -#include <libxml/hash.h> -#include <libxml/entities.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/xmlerror.h> -#include <libxml/globals.h> -#include <libxml/dict.h> - -/* - * The XML predefined entities. - */ - -static xmlEntity xmlEntityLt = { - NULL, XML_ENTITY_DECL, BAD_CAST "lt", - NULL, NULL, NULL, NULL, NULL, NULL, - BAD_CAST "<", BAD_CAST "<", 1, - XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 -}; -static xmlEntity xmlEntityGt = { - NULL, XML_ENTITY_DECL, BAD_CAST "gt", - NULL, NULL, NULL, NULL, NULL, NULL, - BAD_CAST ">", BAD_CAST ">", 1, - XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 -}; -static xmlEntity xmlEntityAmp = { - NULL, XML_ENTITY_DECL, BAD_CAST "amp", - NULL, NULL, NULL, NULL, NULL, NULL, - BAD_CAST "&", BAD_CAST "&", 1, - XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 -}; -static xmlEntity xmlEntityQuot = { - NULL, XML_ENTITY_DECL, BAD_CAST "quot", - NULL, NULL, NULL, NULL, NULL, NULL, - BAD_CAST "\"", BAD_CAST "\"", 1, - XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 -}; -static xmlEntity xmlEntityApos = { - NULL, XML_ENTITY_DECL, BAD_CAST "apos", - NULL, NULL, NULL, NULL, NULL, NULL, - BAD_CAST "'", BAD_CAST "'", 1, - XML_INTERNAL_PREDEFINED_ENTITY, - NULL, NULL, NULL, NULL, 0, 1 -}; - -/** - * xmlEntitiesErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlEntitiesErrMemory(const char *extra) -{ - __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra); -} - -/** - * xmlEntitiesErr: - * @code: the error code - * @msg: the message - * - * Handle an out of memory condition - */ -static void -xmlEntitiesErr(xmlParserErrors code, const char *msg) -{ - __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL); -} - -/* - * xmlFreeEntity : clean-up an entity record. - */ -static void -xmlFreeEntity(xmlEntityPtr entity) -{ - xmlDictPtr dict = NULL; - - if (entity == NULL) - return; - - if (entity->doc != NULL) - dict = entity->doc->dict; - - - if ((entity->children) && (entity->owner == 1) && - (entity == (xmlEntityPtr) entity->children->parent)) - xmlFreeNodeList(entity->children); - if (dict != NULL) { - if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name))) - xmlFree((char *) entity->name); - if ((entity->ExternalID != NULL) && - (!xmlDictOwns(dict, entity->ExternalID))) - xmlFree((char *) entity->ExternalID); - if ((entity->SystemID != NULL) && - (!xmlDictOwns(dict, entity->SystemID))) - xmlFree((char *) entity->SystemID); - if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI))) - xmlFree((char *) entity->URI); - if ((entity->content != NULL) - && (!xmlDictOwns(dict, entity->content))) - xmlFree((char *) entity->content); - if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig))) - xmlFree((char *) entity->orig); - } else { - if (entity->name != NULL) - xmlFree((char *) entity->name); - if (entity->ExternalID != NULL) - xmlFree((char *) entity->ExternalID); - if (entity->SystemID != NULL) - xmlFree((char *) entity->SystemID); - if (entity->URI != NULL) - xmlFree((char *) entity->URI); - if (entity->content != NULL) - xmlFree((char *) entity->content); - if (entity->orig != NULL) - xmlFree((char *) entity->orig); - } - xmlFree(entity); -} - -/* - * xmlAddEntity : register a new entity for an entities table. - */ -static xmlEntityPtr -xmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type, - const xmlChar *ExternalID, const xmlChar *SystemID, - const xmlChar *content) { - xmlDictPtr dict = NULL; - xmlEntitiesTablePtr table = NULL; - xmlEntityPtr ret; - - if (name == NULL) - return(NULL); - if (dtd == NULL) - return(NULL); - if (dtd->doc != NULL) - dict = dtd->doc->dict; - - switch (type) { - case XML_INTERNAL_GENERAL_ENTITY: - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - if (dtd->entities == NULL) - dtd->entities = xmlHashCreateDict(0, dict); - table = dtd->entities; - break; - case XML_INTERNAL_PARAMETER_ENTITY: - case XML_EXTERNAL_PARAMETER_ENTITY: - if (dtd->pentities == NULL) - dtd->pentities = xmlHashCreateDict(0, dict); - table = dtd->pentities; - break; - case XML_INTERNAL_PREDEFINED_ENTITY: - return(NULL); - } - if (table == NULL) - return(NULL); - ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); - if (ret == NULL) { - xmlEntitiesErrMemory("xmlAddEntity:: malloc failed"); - return(NULL); - } - memset(ret, 0, sizeof(xmlEntity)); - ret->type = XML_ENTITY_DECL; - ret->checked = 0; - - /* - * fill the structure. - */ - ret->etype = (xmlEntityType) type; - if (dict == NULL) { - ret->name = xmlStrdup(name); - if (ExternalID != NULL) - ret->ExternalID = xmlStrdup(ExternalID); - if (SystemID != NULL) - ret->SystemID = xmlStrdup(SystemID); - } else { - ret->name = xmlDictLookup(dict, name, -1); - if (ExternalID != NULL) - ret->ExternalID = xmlDictLookup(dict, ExternalID, -1); - if (SystemID != NULL) - ret->SystemID = xmlDictLookup(dict, SystemID, -1); - } - if (content != NULL) { - ret->length = xmlStrlen(content); - if ((dict != NULL) && (ret->length < 5)) - ret->content = (xmlChar *) - xmlDictLookup(dict, content, ret->length); - else - ret->content = xmlStrndup(content, ret->length); - } else { - ret->length = 0; - ret->content = NULL; - } - ret->URI = NULL; /* to be computed by the layer knowing - the defining entity */ - ret->orig = NULL; - ret->owner = 0; - ret->doc = dtd->doc; - - if (xmlHashAddEntry(table, name, ret)) { - /* - * entity was already defined at another level. - */ - xmlFreeEntity(ret); - return(NULL); - } - return(ret); -} - -/** - * xmlGetPredefinedEntity: - * @name: the entity name - * - * Check whether this name is an predefined entity. - * - * Returns NULL if not, otherwise the entity - */ -xmlEntityPtr -xmlGetPredefinedEntity(const xmlChar *name) { - if (name == NULL) return(NULL); - switch (name[0]) { - case 'l': - if (xmlStrEqual(name, BAD_CAST "lt")) - return(&xmlEntityLt); - break; - case 'g': - if (xmlStrEqual(name, BAD_CAST "gt")) - return(&xmlEntityGt); - break; - case 'a': - if (xmlStrEqual(name, BAD_CAST "amp")) - return(&xmlEntityAmp); - if (xmlStrEqual(name, BAD_CAST "apos")) - return(&xmlEntityApos); - break; - case 'q': - if (xmlStrEqual(name, BAD_CAST "quot")) - return(&xmlEntityQuot); - break; - default: - break; - } - return(NULL); -} - -/** - * xmlAddDtdEntity: - * @doc: the document - * @name: the entity name - * @type: the entity type XML_xxx_yyy_ENTITY - * @ExternalID: the entity external ID if available - * @SystemID: the entity system ID if available - * @content: the entity content - * - * Register a new entity for this document DTD external subset. - * - * Returns a pointer to the entity or NULL in case of error - */ -xmlEntityPtr -xmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type, - const xmlChar *ExternalID, const xmlChar *SystemID, - const xmlChar *content) { - xmlEntityPtr ret; - xmlDtdPtr dtd; - - if (doc == NULL) { - xmlEntitiesErr(XML_DTD_NO_DOC, - "xmlAddDtdEntity: document is NULL"); - return(NULL); - } - if (doc->extSubset == NULL) { - xmlEntitiesErr(XML_DTD_NO_DTD, - "xmlAddDtdEntity: document without external subset"); - return(NULL); - } - dtd = doc->extSubset; - ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); - if (ret == NULL) return(NULL); - - /* - * Link it to the DTD - */ - ret->parent = dtd; - ret->doc = dtd->doc; - if (dtd->last == NULL) { - dtd->children = dtd->last = (xmlNodePtr) ret; - } else { - dtd->last->next = (xmlNodePtr) ret; - ret->prev = dtd->last; - dtd->last = (xmlNodePtr) ret; - } - return(ret); -} - -/** - * xmlAddDocEntity: - * @doc: the document - * @name: the entity name - * @type: the entity type XML_xxx_yyy_ENTITY - * @ExternalID: the entity external ID if available - * @SystemID: the entity system ID if available - * @content: the entity content - * - * Register a new entity for this document. - * - * Returns a pointer to the entity or NULL in case of error - */ -xmlEntityPtr -xmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type, - const xmlChar *ExternalID, const xmlChar *SystemID, - const xmlChar *content) { - xmlEntityPtr ret; - xmlDtdPtr dtd; - - if (doc == NULL) { - xmlEntitiesErr(XML_DTD_NO_DOC, - "xmlAddDocEntity: document is NULL"); - return(NULL); - } - if (doc->intSubset == NULL) { - xmlEntitiesErr(XML_DTD_NO_DTD, - "xmlAddDocEntity: document without internal subset"); - return(NULL); - } - dtd = doc->intSubset; - ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); - if (ret == NULL) return(NULL); - - /* - * Link it to the DTD - */ - ret->parent = dtd; - ret->doc = dtd->doc; - if (dtd->last == NULL) { - dtd->children = dtd->last = (xmlNodePtr) ret; - } else { - dtd->last->next = (xmlNodePtr) ret; - ret->prev = dtd->last; - dtd->last = (xmlNodePtr) ret; - } - return(ret); -} - -/** - * xmlGetEntityFromTable: - * @table: an entity table - * @name: the entity name - * @parameter: look for parameter entities - * - * Do an entity lookup in the table. - * returns the corresponding parameter entity, if found. - * - * Returns A pointer to the entity structure or NULL if not found. - */ -static xmlEntityPtr -xmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) { - return((xmlEntityPtr) xmlHashLookup(table, name)); -} - -/** - * xmlGetParameterEntity: - * @doc: the document referencing the entity - * @name: the entity name - * - * Do an entity lookup in the internal and external subsets and - * returns the corresponding parameter entity, if found. - * - * Returns A pointer to the entity structure or NULL if not found. - */ -xmlEntityPtr -xmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) { - xmlEntitiesTablePtr table; - xmlEntityPtr ret; - - if (doc == NULL) - return(NULL); - if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) { - table = (xmlEntitiesTablePtr) doc->intSubset->pentities; - ret = xmlGetEntityFromTable(table, name); - if (ret != NULL) - return(ret); - } - if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) { - table = (xmlEntitiesTablePtr) doc->extSubset->pentities; - return(xmlGetEntityFromTable(table, name)); - } - return(NULL); -} - -/** - * xmlGetDtdEntity: - * @doc: the document referencing the entity - * @name: the entity name - * - * Do an entity lookup in the DTD entity hash table and - * returns the corresponding entity, if found. - * Note: the first argument is the document node, not the DTD node. - * - * Returns A pointer to the entity structure or NULL if not found. - */ -xmlEntityPtr -xmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) { - xmlEntitiesTablePtr table; - - if (doc == NULL) - return(NULL); - if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { - table = (xmlEntitiesTablePtr) doc->extSubset->entities; - return(xmlGetEntityFromTable(table, name)); - } - return(NULL); -} - -/** - * xmlGetDocEntity: - * @doc: the document referencing the entity - * @name: the entity name - * - * Do an entity lookup in the document entity hash table and - * returns the corresponding entity, otherwise a lookup is done - * in the predefined entities too. - * - * Returns A pointer to the entity structure or NULL if not found. - */ -xmlEntityPtr -xmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) { - xmlEntityPtr cur; - xmlEntitiesTablePtr table; - - if (doc != NULL) { - if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { - table = (xmlEntitiesTablePtr) doc->intSubset->entities; - cur = xmlGetEntityFromTable(table, name); - if (cur != NULL) - return(cur); - } - if (doc->standalone != 1) { - if ((doc->extSubset != NULL) && - (doc->extSubset->entities != NULL)) { - table = (xmlEntitiesTablePtr) doc->extSubset->entities; - cur = xmlGetEntityFromTable(table, name); - if (cur != NULL) - return(cur); - } - } - } - return(xmlGetPredefinedEntity(name)); -} - -/* - * Macro used to grow the current buffer. - */ -#define growBufferReentrant() { \ - buffer_size *= 2; \ - buffer = (xmlChar *) \ - xmlRealloc(buffer, buffer_size * sizeof(xmlChar)); \ - if (buffer == NULL) { \ - xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: realloc failed");\ - return(NULL); \ - } \ -} - - -/** - * xmlEncodeEntitiesReentrant: - * @doc: the document containing the string - * @input: A string to convert to XML. - * - * Do a global encoding of a string, replacing the predefined entities - * and non ASCII values with their entities and CharRef counterparts. - * Contrary to xmlEncodeEntities, this routine is reentrant, and result - * must be deallocated. - * - * Returns A newly allocated string with the substitution done. - */ -xmlChar * -xmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) { - const xmlChar *cur = input; - xmlChar *buffer = NULL; - xmlChar *out = NULL; - int buffer_size = 0; - int html = 0; - - if (input == NULL) return(NULL); - if (doc != NULL) - html = (doc->type == XML_HTML_DOCUMENT_NODE); - - /* - * allocate an translation buffer. - */ - buffer_size = 1000; - buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); - if (buffer == NULL) { - xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: malloc failed"); - return(NULL); - } - out = buffer; - - while (*cur != '\0') { - if (out - buffer > buffer_size - 100) { - int indx = out - buffer; - - growBufferReentrant(); - out = &buffer[indx]; - } - - /* - * By default one have to encode at least '<', '>', '"' and '&' ! - */ - if (*cur == '<') { - *out++ = '&'; - *out++ = 'l'; - *out++ = 't'; - *out++ = ';'; - } else if (*cur == '>') { - *out++ = '&'; - *out++ = 'g'; - *out++ = 't'; - *out++ = ';'; - } else if (*cur == '&') { - *out++ = '&'; - *out++ = 'a'; - *out++ = 'm'; - *out++ = 'p'; - *out++ = ';'; - } else if (((*cur >= 0x20) && (*cur < 0x80)) || - (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) { - /* - * default case, just copy ! - */ - *out++ = *cur; - } else if (*cur >= 0x80) { - if (((doc != NULL) && (doc->encoding != NULL)) || (html)) { - /* - * Bjørn Reese <br@sseusa.com> provided the patch - xmlChar xc; - xc = (*cur & 0x3F) << 6; - if (cur[1] != 0) { - xc += *(++cur) & 0x3F; - *out++ = xc; - } else - */ - *out++ = *cur; - } else { - /* - * We assume we have UTF-8 input. - */ - char buf[11], *ptr; - int val = 0, l = 1; - - if (*cur < 0xC0) { - xmlEntitiesErr(XML_CHECK_NOT_UTF8, - "xmlEncodeEntitiesReentrant : input not UTF-8"); - if (doc != NULL) - doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); - snprintf(buf, sizeof(buf), "&#%d;", *cur); - buf[sizeof(buf) - 1] = 0; - ptr = buf; - while (*ptr != 0) *out++ = *ptr++; - cur++; - continue; - } else if (*cur < 0xE0) { - val = (cur[0]) & 0x1F; - val <<= 6; - val |= (cur[1]) & 0x3F; - l = 2; - } else if (*cur < 0xF0) { - val = (cur[0]) & 0x0F; - val <<= 6; - val |= (cur[1]) & 0x3F; - val <<= 6; - val |= (cur[2]) & 0x3F; - l = 3; - } else if (*cur < 0xF8) { - val = (cur[0]) & 0x07; - val <<= 6; - val |= (cur[1]) & 0x3F; - val <<= 6; - val |= (cur[2]) & 0x3F; - val <<= 6; - val |= (cur[3]) & 0x3F; - l = 4; - } - if ((l == 1) || (!IS_CHAR(val))) { - xmlEntitiesErr(XML_ERR_INVALID_CHAR, - "xmlEncodeEntitiesReentrant : char out of range\n"); - if (doc != NULL) - doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); - snprintf(buf, sizeof(buf), "&#%d;", *cur); - buf[sizeof(buf) - 1] = 0; - ptr = buf; - while (*ptr != 0) *out++ = *ptr++; - cur++; - continue; - } - /* - * We could do multiple things here. Just save as a char ref - */ - snprintf(buf, sizeof(buf), "&#x%X;", val); - buf[sizeof(buf) - 1] = 0; - ptr = buf; - while (*ptr != 0) *out++ = *ptr++; - cur += l; - continue; - } - } else if (IS_BYTE_CHAR(*cur)) { - char buf[11], *ptr; - - snprintf(buf, sizeof(buf), "&#%d;", *cur); - buf[sizeof(buf) - 1] = 0; - ptr = buf; - while (*ptr != 0) *out++ = *ptr++; - } - cur++; - } - *out++ = 0; - return(buffer); -} - -/** - * xmlEncodeSpecialChars: - * @doc: the document containing the string - * @input: A string to convert to XML. - * - * Do a global encoding of a string, replacing the predefined entities - * this routine is reentrant, and result must be deallocated. - * - * Returns A newly allocated string with the substitution done. - */ -xmlChar * -xmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) { - const xmlChar *cur = input; - xmlChar *buffer = NULL; - xmlChar *out = NULL; - int buffer_size = 0; - if (input == NULL) return(NULL); - - /* - * allocate an translation buffer. - */ - buffer_size = 1000; - buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); - if (buffer == NULL) { - xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed"); - return(NULL); - } - out = buffer; - - while (*cur != '\0') { - if (out - buffer > buffer_size - 10) { - int indx = out - buffer; - - growBufferReentrant(); - out = &buffer[indx]; - } - - /* - * By default one have to encode at least '<', '>', '"' and '&' ! - */ - if (*cur == '<') { - *out++ = '&'; - *out++ = 'l'; - *out++ = 't'; - *out++ = ';'; - } else if (*cur == '>') { - *out++ = '&'; - *out++ = 'g'; - *out++ = 't'; - *out++ = ';'; - } else if (*cur == '&') { - *out++ = '&'; - *out++ = 'a'; - *out++ = 'm'; - *out++ = 'p'; - *out++ = ';'; - } else if (*cur == '"') { - *out++ = '&'; - *out++ = 'q'; - *out++ = 'u'; - *out++ = 'o'; - *out++ = 't'; - *out++ = ';'; - } else if (*cur == '\r') { - *out++ = '&'; - *out++ = '#'; - *out++ = '1'; - *out++ = '3'; - *out++ = ';'; - } else { - /* - * Works because on UTF-8, all extended sequences cannot - * result in bytes in the ASCII range. - */ - *out++ = *cur; - } - cur++; - } - *out++ = 0; - return(buffer); -} - -/** - * xmlCreateEntitiesTable: - * - * create and initialize an empty entities hash table. - * This really doesn't make sense and should be deprecated - * - * Returns the xmlEntitiesTablePtr just created or NULL in case of error. - */ -xmlEntitiesTablePtr -xmlCreateEntitiesTable(void) { - return((xmlEntitiesTablePtr) xmlHashCreate(0)); -} - -/** - * xmlFreeEntityWrapper: - * @entity: An entity - * @name: its name - * - * Deallocate the memory used by an entities in the hash table. - */ -static void -xmlFreeEntityWrapper(xmlEntityPtr entity, - const xmlChar *name ATTRIBUTE_UNUSED) { - if (entity != NULL) - xmlFreeEntity(entity); -} - -/** - * xmlFreeEntitiesTable: - * @table: An entity table - * - * Deallocate the memory used by an entities hash table. - */ -void -xmlFreeEntitiesTable(xmlEntitiesTablePtr table) { - xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlCopyEntity: - * @ent: An entity - * - * Build a copy of an entity - * - * Returns the new xmlEntitiesPtr or NULL in case of error. - */ -static xmlEntityPtr -xmlCopyEntity(xmlEntityPtr ent) { - xmlEntityPtr cur; - - cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); - if (cur == NULL) { - xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed"); - return(NULL); - } - memset(cur, 0, sizeof(xmlEntity)); - cur->type = XML_ENTITY_DECL; - - cur->etype = ent->etype; - if (ent->name != NULL) - cur->name = xmlStrdup(ent->name); - if (ent->ExternalID != NULL) - cur->ExternalID = xmlStrdup(ent->ExternalID); - if (ent->SystemID != NULL) - cur->SystemID = xmlStrdup(ent->SystemID); - if (ent->content != NULL) - cur->content = xmlStrdup(ent->content); - if (ent->orig != NULL) - cur->orig = xmlStrdup(ent->orig); - if (ent->URI != NULL) - cur->URI = xmlStrdup(ent->URI); - return(cur); -} - -/** - * xmlCopyEntitiesTable: - * @table: An entity table - * - * Build a copy of an entity table. - * - * Returns the new xmlEntitiesTablePtr or NULL in case of error. - */ -xmlEntitiesTablePtr -xmlCopyEntitiesTable(xmlEntitiesTablePtr table) { - return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity)); -} -#endif /* LIBXML_TREE_ENABLED */ - -#ifdef LIBXML_OUTPUT_ENABLED - -/** - * xmlDumpEntityContent: - * @buf: An XML buffer. - * @content: The entity content. - * - * This will dump the quoted string value, taking care of the special - * treatment required by % - */ -static void -xmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) { - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; - if (xmlStrchr(content, '%')) { - const xmlChar * base, *cur; - - xmlBufferCCat(buf, "\""); - base = cur = content; - while (*cur != 0) { - if (*cur == '"') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST """, 6); - cur++; - base = cur; - } else if (*cur == '%') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST "%", 6); - cur++; - base = cur; - } else { - cur++; - } - } - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferCCat(buf, "\""); - } else { - xmlBufferWriteQuotedString(buf, content); - } -} - -/** - * xmlDumpEntityDecl: - * @buf: An XML buffer. - * @ent: An entity table - * - * This will dump the content of the entity table as an XML DTD definition - */ -void -xmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) { - if ((buf == NULL) || (ent == NULL)) return; - switch (ent->etype) { - case XML_INTERNAL_GENERAL_ENTITY: - xmlBufferWriteChar(buf, "<!ENTITY "); - xmlBufferWriteCHAR(buf, ent->name); - xmlBufferWriteChar(buf, " "); - if (ent->orig != NULL) - xmlBufferWriteQuotedString(buf, ent->orig); - else - xmlDumpEntityContent(buf, ent->content); - xmlBufferWriteChar(buf, ">\n"); - break; - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - xmlBufferWriteChar(buf, "<!ENTITY "); - xmlBufferWriteCHAR(buf, ent->name); - if (ent->ExternalID != NULL) { - xmlBufferWriteChar(buf, " PUBLIC "); - xmlBufferWriteQuotedString(buf, ent->ExternalID); - xmlBufferWriteChar(buf, " "); - xmlBufferWriteQuotedString(buf, ent->SystemID); - } else { - xmlBufferWriteChar(buf, " SYSTEM "); - xmlBufferWriteQuotedString(buf, ent->SystemID); - } - xmlBufferWriteChar(buf, ">\n"); - break; - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - xmlBufferWriteChar(buf, "<!ENTITY "); - xmlBufferWriteCHAR(buf, ent->name); - if (ent->ExternalID != NULL) { - xmlBufferWriteChar(buf, " PUBLIC "); - xmlBufferWriteQuotedString(buf, ent->ExternalID); - xmlBufferWriteChar(buf, " "); - xmlBufferWriteQuotedString(buf, ent->SystemID); - } else { - xmlBufferWriteChar(buf, " SYSTEM "); - xmlBufferWriteQuotedString(buf, ent->SystemID); - } - if (ent->content != NULL) { /* Should be true ! */ - xmlBufferWriteChar(buf, " NDATA "); - if (ent->orig != NULL) - xmlBufferWriteCHAR(buf, ent->orig); - else - xmlBufferWriteCHAR(buf, ent->content); - } - xmlBufferWriteChar(buf, ">\n"); - break; - case XML_INTERNAL_PARAMETER_ENTITY: - xmlBufferWriteChar(buf, "<!ENTITY % "); - xmlBufferWriteCHAR(buf, ent->name); - xmlBufferWriteChar(buf, " "); - if (ent->orig == NULL) - xmlDumpEntityContent(buf, ent->content); - else - xmlBufferWriteQuotedString(buf, ent->orig); - xmlBufferWriteChar(buf, ">\n"); - break; - case XML_EXTERNAL_PARAMETER_ENTITY: - xmlBufferWriteChar(buf, "<!ENTITY % "); - xmlBufferWriteCHAR(buf, ent->name); - if (ent->ExternalID != NULL) { - xmlBufferWriteChar(buf, " PUBLIC "); - xmlBufferWriteQuotedString(buf, ent->ExternalID); - xmlBufferWriteChar(buf, " "); - xmlBufferWriteQuotedString(buf, ent->SystemID); - } else { - xmlBufferWriteChar(buf, " SYSTEM "); - xmlBufferWriteQuotedString(buf, ent->SystemID); - } - xmlBufferWriteChar(buf, ">\n"); - break; - default: - xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY, - "xmlDumpEntitiesDecl: internal: unknown type entity type"); - } -} - -/** - * xmlDumpEntityDeclScan: - * @ent: An entity table - * @buf: An XML buffer. - * - * When using the hash table scan function, arguments need to be reversed - */ -static void -xmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) { - xmlDumpEntityDecl(buf, ent); -} - -/** - * xmlDumpEntitiesTable: - * @buf: An XML buffer. - * @table: An entity table - * - * This will dump the content of the entity table as an XML DTD definition - */ -void -xmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) { - xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf); -} -#endif /* LIBXML_OUTPUT_ENABLED */ -#define bottom_entities -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/error.c b/ThirdParty/libxml2/vtklibxml2/error.c deleted file mode 100644 index bed6c0447b7..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/error.c +++ /dev/null @@ -1,986 +0,0 @@ -/* - * error.c: module displaying/handling XML parser errors - * - * See Copyright for the status of this software. - * - * Daniel Veillard <daniel@veillard.com> - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#include <stdarg.h> -#include <libxml/parser.h> -#include <libxml/xmlerror.h> -#include <libxml/xmlmemory.h> -#include <libxml/globals.h> - -void XMLCDECL xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED, - const char *msg, - ...); - -#define XML_GET_VAR_STR(msg, str) { \ - int size, prev_size = -1; \ - int chars; \ - char *larger; \ - va_list ap; \ - \ - str = (char *) xmlMalloc(150); \ - if (str != NULL) { \ - \ - size = 150; \ - \ - while (1) { \ - va_start(ap, msg); \ - chars = vsnprintf(str, size, msg, ap); \ - va_end(ap); \ - if ((chars > -1) && (chars < size)) { \ - if (prev_size == chars) { \ - break; \ - } else { \ - prev_size = chars; \ - } \ - } \ - if (chars > -1) \ - size += chars + 1; \ - else \ - size += 100; \ - if ((larger = (char *) xmlRealloc(str, size)) == NULL) {\ - break; \ - } \ - str = larger; \ - }} \ -} - -/************************************************************************ - * * - * Handling of out of context errors * - * * - ************************************************************************/ - -/** - * xmlGenericErrorDefaultFunc: - * @ctx: an error context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Default handler for out of context error messages. - */ -void XMLCDECL -xmlGenericErrorDefaultFunc(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) { - va_list args; - - if (xmlGenericErrorContext == NULL) - xmlGenericErrorContext = (void *) stderr; - - va_start(args, msg); - vfprintf((FILE *)xmlGenericErrorContext, msg, args); - va_end(args); -} - -/** - * initGenericErrorDefaultFunc: - * @handler: the handler - * - * Set or reset (if NULL) the default handler for generic errors - * to the builtin error function. - */ -void -initGenericErrorDefaultFunc(xmlGenericErrorFunc * handler) -{ - if (handler == NULL) - xmlGenericError = xmlGenericErrorDefaultFunc; - else - xmlGenericError = (*handler); -} - -/** - * xmlSetGenericErrorFunc: - * @ctx: the new error handling context - * @handler: the new handler function - * - * Function to reset the handler and the error context for out of - * context error messages. - * This simply means that @handler will be called for subsequent - * error messages while not parsing nor validating. And @ctx will - * be passed as first argument to @handler - * One can simply force messages to be emitted to another FILE * than - * stderr by setting @ctx to this file handle and @handler to NULL. - * For multi-threaded applications, this must be set separately for each thread. - */ -void -xmlSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { - xmlGenericErrorContext = ctx; - if (handler != NULL) - xmlGenericError = handler; - else - xmlGenericError = xmlGenericErrorDefaultFunc; -} - -/** - * xmlSetStructuredErrorFunc: - * @ctx: the new error handling context - * @handler: the new handler function - * - * Function to reset the handler and the error context for out of - * context structured error messages. - * This simply means that @handler will be called for subsequent - * error messages while not parsing nor validating. And @ctx will - * be passed as first argument to @handler - * For multi-threaded applications, this must be set separately for each thread. - */ -void -xmlSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { - xmlGenericErrorContext = ctx; - xmlStructuredError = handler; -} - -/************************************************************************ - * * - * Handling of parsing errors * - * * - ************************************************************************/ - -/** - * xmlParserPrintFileInfo: - * @input: an xmlParserInputPtr input - * - * Displays the associated file and line informations for the current input - */ - -void -xmlParserPrintFileInfo(xmlParserInputPtr input) { - if (input != NULL) { - if (input->filename) - xmlGenericError(xmlGenericErrorContext, - "%s:%d: ", input->filename, - input->line); - else - xmlGenericError(xmlGenericErrorContext, - "Entity: line %d: ", input->line); - } -} - -/** - * xmlParserPrintFileContext: - * @input: an xmlParserInputPtr input - * - * Displays current context within the input content for error tracking - */ - -static void -xmlParserPrintFileContextInternal(xmlParserInputPtr input , - xmlGenericErrorFunc channel, void *data ) { - const xmlChar *cur, *base; - unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */ - xmlChar content[81]; /* space for 80 chars + line terminator */ - xmlChar *ctnt; - - if (input == NULL) return; - cur = input->cur; - base = input->base; - /* skip backwards over any end-of-lines */ - while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) { - cur--; - } - n = 0; - /* search backwards for beginning-of-line (to max buff size) */ - while ((n++ < (sizeof(content)-1)) && (cur > base) && - (*(cur) != '\n') && (*(cur) != '\r')) - cur--; - if ((*(cur) == '\n') || (*(cur) == '\r')) cur++; - /* calculate the error position in terms of the current position */ - col = input->cur - cur; - /* search forward for end-of-line (to max buff size) */ - n = 0; - ctnt = content; - /* copy selected text to our buffer */ - while ((*cur != 0) && (*(cur) != '\n') && - (*(cur) != '\r') && (n < sizeof(content)-1)) { - *ctnt++ = *cur++; - n++; - } - *ctnt = 0; - /* print out the selected text */ - channel(data ,"%s\n", content); - /* create blank line with problem pointer */ - n = 0; - ctnt = content; - /* (leave buffer space for pointer + line terminator) */ - while ((n<col) && (n++ < sizeof(content)-2) && (*ctnt != 0)) { - if (*(ctnt) != '\t') - *(ctnt) = ' '; - ctnt++; - } - *ctnt++ = '^'; - *ctnt = 0; - channel(data ,"%s\n", content); -} - -/** - * xmlParserPrintFileContext: - * @input: an xmlParserInputPtr input - * - * Displays current context within the input content for error tracking - */ -void -xmlParserPrintFileContext(xmlParserInputPtr input) { - xmlParserPrintFileContextInternal(input, xmlGenericError, - xmlGenericErrorContext); -} - -/** - * xmlReportError: - * @err: the error - * @ctx: the parser context or NULL - * @str: the formatted error message - * - * Report an erro with its context, replace the 4 old error/warning - * routines. - */ -static void -xmlReportError(xmlErrorPtr err, xmlParserCtxtPtr ctxt, const char *str, - xmlGenericErrorFunc channel, void *data) -{ - char *file = NULL; - int line = 0; - int code = -1; - int domain; - const xmlChar *name = NULL; - xmlNodePtr node; - xmlErrorLevel level; - xmlParserInputPtr input = NULL; - xmlParserInputPtr cur = NULL; - - if (err == NULL) - return; - - if (channel == NULL) { - channel = xmlGenericError; - data = xmlGenericErrorContext; - } - file = err->file; - line = err->line; - code = err->code; - domain = err->domain; - level = err->level; - node = err->node; - - if (code == XML_ERR_OK) - return; - - if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) - name = node->name; - - /* - * Maintain the compatibility with the legacy error handling - */ - if (ctxt != NULL) { - input = ctxt->input; - if ((input != NULL) && (input->filename == NULL) && - (ctxt->inputNr > 1)) { - cur = input; - input = ctxt->inputTab[ctxt->inputNr - 2]; - } - if (input != NULL) { - if (input->filename) - channel(data, "%s:%d: ", input->filename, input->line); - else if ((line != 0) && (domain == XML_FROM_PARSER)) - channel(data, "Entity: line %d: ", input->line); - } - } else { - if (file != NULL) - channel(data, "%s:%d: ", file, line); - else if ((line != 0) && (domain == XML_FROM_PARSER)) - channel(data, "Entity: line %d: ", line); - } - if (name != NULL) { - channel(data, "element %s: ", name); - } - switch (domain) { - case XML_FROM_PARSER: - channel(data, "parser "); - break; - case XML_FROM_NAMESPACE: - channel(data, "namespace "); - break; - case XML_FROM_DTD: - case XML_FROM_VALID: - channel(data, "validity "); - break; - case XML_FROM_HTML: - channel(data, "HTML parser "); - break; - case XML_FROM_MEMORY: - channel(data, "memory "); - break; - case XML_FROM_OUTPUT: - channel(data, "output "); - break; - case XML_FROM_IO: - channel(data, "I/O "); - break; - case XML_FROM_XINCLUDE: - channel(data, "XInclude "); - break; - case XML_FROM_XPATH: - channel(data, "XPath "); - break; - case XML_FROM_XPOINTER: - channel(data, "parser "); - break; - case XML_FROM_REGEXP: - channel(data, "regexp "); - break; - case XML_FROM_MODULE: - channel(data, "module "); - break; - case XML_FROM_SCHEMASV: - channel(data, "Schemas validity "); - break; - case XML_FROM_SCHEMASP: - channel(data, "Schemas parser "); - break; - case XML_FROM_RELAXNGP: - channel(data, "Relax-NG parser "); - break; - case XML_FROM_RELAXNGV: - channel(data, "Relax-NG validity "); - break; - case XML_FROM_CATALOG: - channel(data, "Catalog "); - break; - case XML_FROM_C14N: - channel(data, "C14N "); - break; - case XML_FROM_XSLT: - channel(data, "XSLT "); - break; - case XML_FROM_I18N: - channel(data, "encoding "); - break; - default: - break; - } - switch (level) { - case XML_ERR_NONE: - channel(data, ": "); - break; - case XML_ERR_WARNING: - channel(data, "warning : "); - break; - case XML_ERR_ERROR: - channel(data, "error : "); - break; - case XML_ERR_FATAL: - channel(data, "error : "); - break; - } - if (str != NULL) { - int len; - len = xmlStrlen((const xmlChar *)str); - if ((len > 0) && (str[len - 1] != '\n')) - channel(data, "%s\n", str); - else - channel(data, "%s", str); - } else { - channel(data, "%s\n", "out of memory error"); - } - - if (ctxt != NULL) { - xmlParserPrintFileContextInternal(input, channel, data); - if (cur != NULL) { - if (cur->filename) - channel(data, "%s:%d: \n", cur->filename, cur->line); - else if ((line != 0) && (domain == XML_FROM_PARSER)) - channel(data, "Entity: line %d: \n", cur->line); - xmlParserPrintFileContextInternal(cur, channel, data); - } - } - if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) && - (err->int1 < 100) && - (err->int1 < xmlStrlen((const xmlChar *)err->str1))) { - xmlChar buf[150]; - int i; - - channel(data, "%s\n", err->str1); - for (i=0;i < err->int1;i++) - buf[i] = ' '; - buf[i++] = '^'; - buf[i] = 0; - channel(data, "%s\n", buf); - } -} - -/** - * __xmlRaiseError: - * @schannel: the structured callback channel - * @channel: the old callback channel - * @data: the callback data - * @ctx: the parser context or NULL - * @ctx: the parser context or NULL - * @domain: the domain for the error - * @code: the code for the error - * @level: the xmlErrorLevel for the error - * @file: the file source of the error (or NULL) - * @line: the line of the error or 0 if N/A - * @str1: extra string info - * @str2: extra string info - * @str3: extra string info - * @int1: extra int info - * @col: column number of the error or 0 if N/A - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Update the appropriate global or contextual error structure, - * then forward the error message down the parser or generic - * error callback handler - */ -void XMLCDECL -__xmlRaiseError(xmlStructuredErrorFunc schannel, - xmlGenericErrorFunc channel, void *data, void *ctx, - void *nod, int domain, int code, xmlErrorLevel level, - const char *file, int line, const char *str1, - const char *str2, const char *str3, int int1, int col, - const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = NULL; - xmlNodePtr node = (xmlNodePtr) nod; - char *str = NULL; - xmlParserInputPtr input = NULL; - xmlErrorPtr to = &xmlLastError; - xmlNodePtr baseptr = NULL; - - if ((xmlGetWarningsDefaultValue == 0) && (level == XML_ERR_WARNING)) - return; - if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) || - (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) || - (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) { - ctxt = (xmlParserCtxtPtr) ctx; - if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) && - (ctxt->sax->initialized == XML_SAX2_MAGIC)) - schannel = ctxt->sax->serror; - } - /* - * Check if structured error handler set - */ - if (schannel == NULL) { - schannel = xmlStructuredError; - /* - * if user has defined handler, change data ptr to user's choice - */ - if (schannel != NULL) - data = xmlGenericErrorContext; - } - if ((domain == XML_FROM_VALID) && - ((channel == xmlParserValidityError) || - (channel == xmlParserValidityWarning))) { - ctxt = (xmlParserCtxtPtr) ctx; - if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) && - (ctxt->sax->initialized == XML_SAX2_MAGIC)) - schannel = ctxt->sax->serror; - } - if (code == XML_ERR_OK) - return; - /* - * Formatting the message - */ - if (msg == NULL) { - str = (char *) xmlStrdup(BAD_CAST "No error message provided"); - } else { - XML_GET_VAR_STR(msg, str); - } - - /* - * specific processing if a parser context is provided - */ - if (ctxt != NULL) { - if (file == NULL) { - input = ctxt->input; - if ((input != NULL) && (input->filename == NULL) && - (ctxt->inputNr > 1)) { - input = ctxt->inputTab[ctxt->inputNr - 2]; - } - if (input != NULL) { - file = input->filename; - line = input->line; - col = input->col; - } - } - to = &ctxt->lastError; - } else if ((node != NULL) && (file == NULL)) { - int i; - - if ((node->doc != NULL) && (node->doc->URL != NULL)) { - baseptr = node; -/* file = (const char *) node->doc->URL; */ - } - for (i = 0; - ((i < 10) && (node != NULL) && (node->type != XML_ELEMENT_NODE)); - i++) - node = node->parent; - if ((baseptr == NULL) && (node != NULL) && - (node->doc != NULL) && (node->doc->URL != NULL)) - baseptr = node; - - if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) - line = node->line; - } - - /* - * Save the information about the error - */ - xmlResetError(to); - to->domain = domain; - to->code = code; - to->message = str; - to->level = level; - if (file != NULL) - to->file = (char *) xmlStrdup((const xmlChar *) file); - else if (baseptr != NULL) { -#ifdef LIBXML_XINCLUDE_ENABLED - /* - * We check if the error is within an XInclude section and, - * if so, attempt to print out the href of the XInclude instead - * of the usual "base" (doc->URL) for the node (bug 152623). - */ - xmlNodePtr prev = baseptr; - int inclcount = 0; - while (prev != NULL) { - if (prev->prev == NULL) - prev = prev->parent; - else { - prev = prev->prev; - if (prev->type == XML_XINCLUDE_START) { - if (--inclcount < 0) - break; - } else if (prev->type == XML_XINCLUDE_END) - inclcount++; - } - } - if (prev != NULL) { - if (prev->type == XML_XINCLUDE_START) { - prev->type = XML_ELEMENT_NODE; - to->file = (char *) xmlGetProp(prev, BAD_CAST "href"); - prev->type = XML_XINCLUDE_START; - } else { - to->file = (char *) xmlGetProp(prev, BAD_CAST "href"); - } - } else -#endif - to->file = (char *) xmlStrdup(baseptr->doc->URL); - if ((to->file == NULL) && (node != NULL) && (node->doc != NULL)) { - to->file = (char *) xmlStrdup(node->doc->URL); - } - file = to->file; - } - to->line = line; - if (str1 != NULL) - to->str1 = (char *) xmlStrdup((const xmlChar *) str1); - if (str2 != NULL) - to->str2 = (char *) xmlStrdup((const xmlChar *) str2); - if (str3 != NULL) - to->str3 = (char *) xmlStrdup((const xmlChar *) str3); - to->int1 = int1; - to->int2 = col; - to->node = node; - to->ctxt = ctx; - - if (to != &xmlLastError) - xmlCopyError(to,&xmlLastError); - - /* - * Find the callback channel if channel param is NULL - */ - if ((ctxt != NULL) && (channel == NULL) && (xmlStructuredError == NULL) && (ctxt->sax != NULL)) { - if (level == XML_ERR_WARNING) - channel = ctxt->sax->warning; - else - channel = ctxt->sax->error; - data = ctxt->userData; - } else if (channel == NULL) { - if (xmlStructuredError != NULL) - schannel = xmlStructuredError; - else - channel = xmlGenericError; - if (!data) { - data = xmlGenericErrorContext; - } - } - if (schannel != NULL) { - schannel(data, to); - return; - } - if (channel == NULL) - return; - - if ((channel == xmlParserError) || - (channel == xmlParserWarning) || - (channel == xmlParserValidityError) || - (channel == xmlParserValidityWarning)) - xmlReportError(to, ctxt, str, NULL, NULL); - else if ((channel == (xmlGenericErrorFunc) fprintf) || - (channel == xmlGenericErrorDefaultFunc)) - xmlReportError(to, ctxt, str, channel, data); - else - channel(data, "%s", str); -} - -/** - * __xmlSimpleError: - * @domain: where the error comes from - * @code: the error code - * @node: the context node - * @extra: extra informations - * - * Handle an out of memory condition - */ -void -__xmlSimpleError(int domain, int code, xmlNodePtr node, - const char *msg, const char *extra) -{ - - if (code == XML_ERR_NO_MEMORY) { - if (extra) - __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, - NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); - else - __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, - NULL, NULL, 0, 0, "Memory allocation failed\n"); - } else { - __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, - code, XML_ERR_ERROR, NULL, 0, extra, - NULL, NULL, 0, 0, msg, extra); - } -} -/** - * xmlParserError: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format an error messages, gives file, line, position and - * extra parameters. - */ -void XMLCDECL -xmlParserError(void *ctx, const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr input = NULL; - xmlParserInputPtr cur = NULL; - char * str; - - if (ctxt != NULL) { - input = ctxt->input; - if ((input != NULL) && (input->filename == NULL) && - (ctxt->inputNr > 1)) { - cur = input; - input = ctxt->inputTab[ctxt->inputNr - 2]; - } - xmlParserPrintFileInfo(input); - } - - xmlGenericError(xmlGenericErrorContext, "error: "); - XML_GET_VAR_STR(msg, str); - xmlGenericError(xmlGenericErrorContext, "%s", str); - if (str != NULL) - xmlFree(str); - - if (ctxt != NULL) { - xmlParserPrintFileContext(input); - if (cur != NULL) { - xmlParserPrintFileInfo(cur); - xmlGenericError(xmlGenericErrorContext, "\n"); - xmlParserPrintFileContext(cur); - } - } -} - -/** - * xmlParserWarning: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a warning messages, gives file, line, position and - * extra parameters. - */ -void XMLCDECL -xmlParserWarning(void *ctx, const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr input = NULL; - xmlParserInputPtr cur = NULL; - char * str; - - if (ctxt != NULL) { - input = ctxt->input; - if ((input != NULL) && (input->filename == NULL) && - (ctxt->inputNr > 1)) { - cur = input; - input = ctxt->inputTab[ctxt->inputNr - 2]; - } - xmlParserPrintFileInfo(input); - } - - xmlGenericError(xmlGenericErrorContext, "warning: "); - XML_GET_VAR_STR(msg, str); - xmlGenericError(xmlGenericErrorContext, "%s", str); - if (str != NULL) - xmlFree(str); - - if (ctxt != NULL) { - xmlParserPrintFileContext(input); - if (cur != NULL) { - xmlParserPrintFileInfo(cur); - xmlGenericError(xmlGenericErrorContext, "\n"); - xmlParserPrintFileContext(cur); - } - } -} - -/************************************************************************ - * * - * Handling of validation errors * - * * - ************************************************************************/ - -/** - * xmlParserValidityError: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format an validity error messages, gives file, - * line, position and extra parameters. - */ -void XMLCDECL -xmlParserValidityError(void *ctx, const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr input = NULL; - char * str; - int len = xmlStrlen((const xmlChar *) msg); - static int had_info = 0; - - if ((len > 1) && (msg[len - 2] != ':')) { - if (ctxt != NULL) { - input = ctxt->input; - if ((input->filename == NULL) && (ctxt->inputNr > 1)) - input = ctxt->inputTab[ctxt->inputNr - 2]; - - if (had_info == 0) { - xmlParserPrintFileInfo(input); - } - } - xmlGenericError(xmlGenericErrorContext, "validity error: "); - had_info = 0; - } else { - had_info = 1; - } - - XML_GET_VAR_STR(msg, str); - xmlGenericError(xmlGenericErrorContext, "%s", str); - if (str != NULL) - xmlFree(str); - - if ((ctxt != NULL) && (input != NULL)) { - xmlParserPrintFileContext(input); - } -} - -/** - * xmlParserValidityWarning: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a validity warning messages, gives file, line, - * position and extra parameters. - */ -void XMLCDECL -xmlParserValidityWarning(void *ctx, const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr input = NULL; - char * str; - int len = xmlStrlen((const xmlChar *) msg); - - if ((ctxt != NULL) && (len != 0) && (msg[len - 1] != ':')) { - input = ctxt->input; - if ((input->filename == NULL) && (ctxt->inputNr > 1)) - input = ctxt->inputTab[ctxt->inputNr - 2]; - - xmlParserPrintFileInfo(input); - } - - xmlGenericError(xmlGenericErrorContext, "validity warning: "); - XML_GET_VAR_STR(msg, str); - xmlGenericError(xmlGenericErrorContext, "%s", str); - if (str != NULL) - xmlFree(str); - - if (ctxt != NULL) { - xmlParserPrintFileContext(input); - } -} - - -/************************************************************************ - * * - * Extended Error Handling * - * * - ************************************************************************/ - -/** - * xmlGetLastError: - * - * Get the last global error registered. This is per thread if compiled - * with thread support. - * - * Returns NULL if no error occured or a pointer to the error - */ -xmlErrorPtr -xmlGetLastError(void) -{ - if (xmlLastError.code == XML_ERR_OK) - return (NULL); - return (&xmlLastError); -} - -/** - * xmlResetError: - * @err: pointer to the error. - * - * Cleanup the error. - */ -void -xmlResetError(xmlErrorPtr err) -{ - if (err == NULL) - return; - if (err->code == XML_ERR_OK) - return; - if (err->message != NULL) - xmlFree(err->message); - if (err->file != NULL) - xmlFree(err->file); - if (err->str1 != NULL) - xmlFree(err->str1); - if (err->str2 != NULL) - xmlFree(err->str2); - if (err->str3 != NULL) - xmlFree(err->str3); - memset(err, 0, sizeof(xmlError)); - err->code = XML_ERR_OK; -} - -/** - * xmlResetLastError: - * - * Cleanup the last global error registered. For parsing error - * this does not change the well-formedness result. - */ -void -xmlResetLastError(void) -{ - if (xmlLastError.code == XML_ERR_OK) - return; - xmlResetError(&xmlLastError); -} - -/** - * xmlCtxtGetLastError: - * @ctx: an XML parser context - * - * Get the last parsing error registered. - * - * Returns NULL if no error occured or a pointer to the error - */ -xmlErrorPtr -xmlCtxtGetLastError(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - - if (ctxt == NULL) - return (NULL); - if (ctxt->lastError.code == XML_ERR_OK) - return (NULL); - return (&ctxt->lastError); -} - -/** - * xmlCtxtResetLastError: - * @ctx: an XML parser context - * - * Cleanup the last global error registered. For parsing error - * this does not change the well-formedness result. - */ -void -xmlCtxtResetLastError(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - - if (ctxt == NULL) - return; - if (ctxt->lastError.code == XML_ERR_OK) - return; - xmlResetError(&ctxt->lastError); -} - -/** - * xmlCopyError: - * @from: a source error - * @to: a target error - * - * Save the original error to the new place. - * - * Returns 0 in case of success and -1 in case of error. - */ -int -xmlCopyError(xmlErrorPtr from, xmlErrorPtr to) { - char *message, *file, *str1, *str2, *str3; - - if ((from == NULL) || (to == NULL)) - return(-1); - - message = (char *) xmlStrdup((xmlChar *) from->message); - file = (char *) xmlStrdup ((xmlChar *) from->file); - str1 = (char *) xmlStrdup ((xmlChar *) from->str1); - str2 = (char *) xmlStrdup ((xmlChar *) from->str2); - str3 = (char *) xmlStrdup ((xmlChar *) from->str3); - - if (to->message != NULL) - xmlFree(to->message); - if (to->file != NULL) - xmlFree(to->file); - if (to->str1 != NULL) - xmlFree(to->str1); - if (to->str2 != NULL) - xmlFree(to->str2); - if (to->str3 != NULL) - xmlFree(to->str3); - to->domain = from->domain; - to->code = from->code; - to->level = from->level; - to->line = from->line; - to->node = from->node; - to->int1 = from->int1; - to->int2 = from->int2; - to->node = from->node; - to->ctxt = from->ctxt; - to->message = message; - to->file = file; - to->str1 = str1; - to->str2 = str2; - to->str3 = str3; - - return 0; -} - -#define bottom_error -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/globals.c b/ThirdParty/libxml2/vtklibxml2/globals.c deleted file mode 100644 index c1405c3b13a..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/globals.c +++ /dev/null @@ -1,1129 +0,0 @@ -/* - * globals.c: definition and handling of the set of global variables - * of the library - * - * The bottom of this file is automatically generated by build_glob.py - * based on the description file global.data - * - * See Copyright for the status of this software. - * - * Gary Pennington <Gary.Pennington@uk.sun.com> - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#include <string.h> - -#include <libxml/globals.h> -#include <libxml/xmlmemory.h> -#include <libxml/threads.h> - -/* #define DEBUG_GLOBALS */ - -/* - * Helpful Macro - */ -#ifdef LIBXML_THREAD_ENABLED -#define IS_MAIN_THREAD (xmlIsMainThread()) -#else -#define IS_MAIN_THREAD 1 -#endif - -/* - * Mutex to protect "ForNewThreads" variables - */ -static xmlMutexPtr xmlThrDefMutex = NULL; - -/** - * xmlInitGlobals: - * - * Additional initialisation for multi-threading - */ -void xmlInitGlobals(void) -{ - xmlThrDefMutex = xmlNewMutex(); -} - -/** - * xmlCleanupGlobals: - * - * Additional cleanup for multi-threading - */ -void xmlCleanupGlobals(void) -{ - if (xmlThrDefMutex != NULL) { - xmlFreeMutex(xmlThrDefMutex); - xmlThrDefMutex = NULL; - } -} - -/************************************************************************ - * * - * All the user accessible global variables of the library * - * * - ************************************************************************/ - -/* - * Memory allocation routines - */ -#undef xmlFree -#undef xmlMalloc -#undef xmlMallocAtomic -#undef xmlMemStrdup -#undef xmlRealloc - -#if defined(DEBUG_MEMORY_LOCATION) || defined(DEBUG_MEMORY) -xmlFreeFunc vtk_libxml2_xmlFree = (xmlFreeFunc) xmlMemFree; -xmlMallocFunc vtk_libxml2_xmlMalloc = (xmlMallocFunc) xmlMemMalloc; -xmlMallocFunc vtk_libxml2_xmlMallocAtomic = (xmlMallocFunc) xmlMemMalloc; -xmlReallocFunc vtk_libxml2_xmlRealloc = (xmlReallocFunc) xmlMemRealloc; -xmlStrdupFunc vtk_libxml2_xmlMemStrdup = (xmlStrdupFunc) xmlMemoryStrdup; -#else -/** - * xmlFree: - * @mem: an already allocated block of memory - * - * The variable holding the libxml free() implementation - */ -xmlFreeFunc vtk_libxml2_xmlFree = (xmlFreeFunc) free; -/** - * xmlMalloc: - * @size: the size requested in bytes - * - * The variable holding the libxml malloc() implementation - * - * Returns a pointer to the newly allocated block or NULL in case of error - */ -xmlMallocFunc vtk_libxml2_xmlMalloc = (xmlMallocFunc) malloc; -/** - * xmlMallocAtomic: - * @size: the size requested in bytes - * - * The variable holding the libxml malloc() implementation for atomic - * data (i.e. blocks not containings pointers), useful when using a - * garbage collecting allocator. - * - * Returns a pointer to the newly allocated block or NULL in case of error - */ -xmlMallocFunc vtk_libxml2_xmlMallocAtomic = (xmlMallocFunc) malloc; -/** - * xmlRealloc: - * @mem: an already allocated block of memory - * @size: the new size requested in bytes - * - * The variable holding the libxml realloc() implementation - * - * Returns a pointer to the newly reallocated block or NULL in case of error - */ -xmlReallocFunc vtk_libxml2_xmlRealloc = (xmlReallocFunc) realloc; -/** - * xmlMemStrdup: - * @str: a zero terminated string - * - * The variable holding the libxml strdup() implementation - * - * Returns the copy of the string or NULL in case of error - */ -xmlStrdupFunc vtk_libxml2_xmlMemStrdup = (xmlStrdupFunc) xmlStrdup; -#endif /* DEBUG_MEMORY_LOCATION || DEBUG_MEMORY */ - -#include <libxml/threads.h> -#include <libxml/globals.h> -#include <libxml/SAX.h> - -#undef docbDefaultSAXHandler -#undef htmlDefaultSAXHandler -#undef oldXMLWDcompatibility -#undef xmlBufferAllocScheme -#undef xmlDefaultBufferSize -#undef xmlDefaultSAXHandler -#undef xmlDefaultSAXLocator -#undef xmlDoValidityCheckingDefaultValue -#undef xmlGenericError -#undef xmlStructuredError -#undef xmlGenericErrorContext -#undef xmlGetWarningsDefaultValue -#undef xmlIndentTreeOutput -#undef xmlTreeIndentString -#undef xmlKeepBlanksDefaultValue -#undef xmlLineNumbersDefaultValue -#undef xmlLoadExtDtdDefaultValue -#undef xmlParserDebugEntities -#undef xmlParserVersion -#undef xmlPedanticParserDefaultValue -#undef xmlSaveNoEmptyTags -#undef xmlSubstituteEntitiesDefaultValue -#undef xmlRegisterNodeDefaultValue -#undef xmlDeregisterNodeDefaultValue -#undef xmlLastError - -#undef xmlParserInputBufferCreateFilenameValue -#undef xmlOutputBufferCreateFilenameValue - -/** - * xmlParserVersion: - * - * Constant string describing the internal version of the library - */ -const char *vtk_libxml2_xmlParserVersion = LIBXML_VERSION_STRING LIBXML_VERSION_EXTRA; - -/** - * xmlBufferAllocScheme: - * - * Global setting, default allocation policy for buffers, default is - * XML_BUFFER_ALLOC_EXACT - */ -xmlBufferAllocationScheme vtk_libxml2_xmlBufferAllocScheme = XML_BUFFER_ALLOC_EXACT; -static xmlBufferAllocationScheme xmlBufferAllocSchemeThrDef = XML_BUFFER_ALLOC_EXACT; -/** - * xmlDefaultBufferSize: - * - * Global setting, default buffer size. Default value is BASE_BUFFER_SIZE - */ -int vtk_libxml2_xmlDefaultBufferSize = BASE_BUFFER_SIZE; -static int xmlDefaultBufferSizeThrDef = BASE_BUFFER_SIZE; - -/* - * Parser defaults - */ - -/** - * oldXMLWDcompatibility: - * - * Global setting, DEPRECATED. - */ -int vtk_libxml2_oldXMLWDcompatibility = 0; /* DEPRECATED */ -/** - * xmlParserDebugEntities: - * - * Global setting, asking the parser to print out debugging informations. - * while handling entities. - * Disabled by default - */ -int vtk_libxml2_xmlParserDebugEntities = 0; -static int xmlParserDebugEntitiesThrDef = 0; -/** - * xmlDoValidityCheckingDefaultValue: - * - * Global setting, indicate that the parser should work in validating mode. - * Disabled by default. - */ -int vtk_libxml2_xmlDoValidityCheckingDefaultValue = 0; -static int xmlDoValidityCheckingDefaultValueThrDef = 0; -/** - * xmlGetWarningsDefaultValue: - * - * Global setting, indicate that the parser should provide warnings. - * Activated by default. - */ -int vtk_libxml2_xmlGetWarningsDefaultValue = 1; -static int xmlGetWarningsDefaultValueThrDef = 1; -/** - * xmlLoadExtDtdDefaultValue: - * - * Global setting, indicate that the parser should load DTD while not - * validating. - * Disabled by default. - */ -int vtk_libxml2_xmlLoadExtDtdDefaultValue = 0; -static int xmlLoadExtDtdDefaultValueThrDef = 0; -/** - * xmlPedanticParserDefaultValue: - * - * Global setting, indicate that the parser be pedantic - * Disabled by default. - */ -int vtk_libxml2_xmlPedanticParserDefaultValue = 0; -static int xmlPedanticParserDefaultValueThrDef = 0; -/** - * xmlLineNumbersDefaultValue: - * - * Global setting, indicate that the parser should store the line number - * in the content field of elements in the DOM tree. - * Disabled by default since this may not be safe for old classes of - * applicaton. - */ -int vtk_libxml2_xmlLineNumbersDefaultValue = 0; -static int xmlLineNumbersDefaultValueThrDef = 0; -/** - * xmlKeepBlanksDefaultValue: - * - * Global setting, indicate that the parser should keep all blanks - * nodes found in the content - * Activated by default, this is actually needed to have the parser - * conformant to the XML Recommendation, however the option is kept - * for some applications since this was libxml1 default behaviour. - */ -int vtk_libxml2_xmlKeepBlanksDefaultValue = 1; -static int xmlKeepBlanksDefaultValueThrDef = 1; -/** - * xmlSubstituteEntitiesDefaultValue: - * - * Global setting, indicate that the parser should not generate entity - * references but replace them with the actual content of the entity - * Disabled by default, this should be activated when using XPath since - * the XPath data model requires entities replacement and the XPath - * engine does not handle entities references transparently. - */ -int vtk_libxml2_xmlSubstituteEntitiesDefaultValue = 0; -static int xmlSubstituteEntitiesDefaultValueThrDef = 0; - -xmlRegisterNodeFunc vtk_libxml2_xmlRegisterNodeDefaultValue = NULL; -static xmlRegisterNodeFunc xmlRegisterNodeDefaultValueThrDef = NULL; -xmlDeregisterNodeFunc vtk_libxml2_xmlDeregisterNodeDefaultValue = NULL; -static xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValueThrDef = NULL; - -xmlParserInputBufferCreateFilenameFunc vtk_libxml2_xmlParserInputBufferCreateFilenameValue = NULL; -static xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValueThrDef = NULL; - -xmlOutputBufferCreateFilenameFunc vtk_libxml2_xmlOutputBufferCreateFilenameValue = NULL; -static xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValueThrDef = NULL; - -/* - * Error handling - */ - -/* xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc; */ -/* Must initialize xmlGenericError in xmlInitParser */ -void XMLCDECL xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED, - const char *msg, - ...); -/** - * xmlGenericError: - * - * Global setting: function used for generic error callbacks - */ -xmlGenericErrorFunc vtk_libxml2_xmlGenericError = xmlGenericErrorDefaultFunc; -static xmlGenericErrorFunc xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; -/** - * xmlStructuredError: - * - * Global setting: function used for structured error callbacks - */ -xmlStructuredErrorFunc vtk_libxml2_xmlStructuredError = NULL; -static xmlStructuredErrorFunc xmlStructuredErrorThrDef = NULL; -/** - * xmlGenericErrorContext: - * - * Global setting passed to generic error callbacks - */ -void *vtk_libxml2_xmlGenericErrorContext = NULL; -static void *xmlGenericErrorContextThrDef = NULL; -xmlError vtk_libxml2_xmlLastError = {0}; /* Init avoids common block on Mac */ - -/* - * output defaults - */ -/** - * xmlIndentTreeOutput: - * - * Global setting, asking the serializer to indent the output tree by default - * Enabled by default - */ -int vtk_libxml2_xmlIndentTreeOutput = 1; -static int xmlIndentTreeOutputThrDef = 1; - -/** - * xmlTreeIndentString: - * - * The string used to do one-level indent. By default is equal to " " (two spaces) - */ -const char *vtk_libxml2_xmlTreeIndentString = " "; -static const char *xmlTreeIndentStringThrDef = " "; - -/** - * xmlSaveNoEmptyTags: - * - * Global setting, asking the serializer to not output empty tags - * as <empty/> but <empty></empty>. those two forms are undistinguishable - * once parsed. - * Disabled by default - */ -int vtk_libxml2_xmlSaveNoEmptyTags = 0; -static int xmlSaveNoEmptyTagsThrDef = 0; - -#ifdef LIBXML_SAX1_ENABLED -/** - * xmlDefaultSAXHandler: - * - * Default SAX version1 handler for XML, builds the DOM tree - */ -xmlSAXHandlerV1 vtk_libxml2_xmlDefaultSAXHandler = { - xmlSAX2InternalSubset, - xmlSAX2IsStandalone, - xmlSAX2HasInternalSubset, - xmlSAX2HasExternalSubset, - xmlSAX2ResolveEntity, - xmlSAX2GetEntity, - xmlSAX2EntityDecl, - xmlSAX2NotationDecl, - xmlSAX2AttributeDecl, - xmlSAX2ElementDecl, - xmlSAX2UnparsedEntityDecl, - xmlSAX2SetDocumentLocator, - xmlSAX2StartDocument, - xmlSAX2EndDocument, - xmlSAX2StartElement, - xmlSAX2EndElement, - xmlSAX2Reference, - xmlSAX2Characters, - xmlSAX2Characters, - xmlSAX2ProcessingInstruction, - xmlSAX2Comment, - xmlParserWarning, - xmlParserError, - xmlParserError, - xmlSAX2GetParameterEntity, - xmlSAX2CDataBlock, - xmlSAX2ExternalSubset, - 0, -}; -#endif /* LIBXML_SAX1_ENABLED */ - -/** - * xmlDefaultSAXLocator: - * - * The default SAX Locator - * { getPublicId, getSystemId, getLineNumber, getColumnNumber} - */ -xmlSAXLocator vtk_libxml2_xmlDefaultSAXLocator = { - xmlSAX2GetPublicId, - xmlSAX2GetSystemId, - xmlSAX2GetLineNumber, - xmlSAX2GetColumnNumber -}; - -#ifdef LIBXML_HTML_ENABLED -/** - * htmlDefaultSAXHandler: - * - * Default old SAX v1 handler for HTML, builds the DOM tree - */ -xmlSAXHandlerV1 vtk_libxml2_htmlDefaultSAXHandler = { - xmlSAX2InternalSubset, - NULL, - NULL, - NULL, - NULL, - xmlSAX2GetEntity, - NULL, - NULL, - NULL, - NULL, - NULL, - xmlSAX2SetDocumentLocator, - xmlSAX2StartDocument, - xmlSAX2EndDocument, - xmlSAX2StartElement, - xmlSAX2EndElement, - NULL, - xmlSAX2Characters, - xmlSAX2IgnorableWhitespace, - xmlSAX2ProcessingInstruction, - xmlSAX2Comment, - xmlParserWarning, - xmlParserError, - xmlParserError, - xmlSAX2GetParameterEntity, - xmlSAX2CDataBlock, - NULL, - 0, -}; -#endif /* LIBXML_HTML_ENABLED */ - -#ifdef LIBXML_DOCB_ENABLED -/** - * docbDefaultSAXHandler: - * - * Default old SAX v1 handler for SGML DocBook, builds the DOM tree - */ -xmlSAXHandlerV1 vtk_libxml2_docbDefaultSAXHandler = { - xmlSAX2InternalSubset, - xmlSAX2IsStandalone, - xmlSAX2HasInternalSubset, - xmlSAX2HasExternalSubset, - xmlSAX2ResolveEntity, - xmlSAX2GetEntity, - xmlSAX2EntityDecl, - NULL, - NULL, - NULL, - NULL, - xmlSAX2SetDocumentLocator, - xmlSAX2StartDocument, - xmlSAX2EndDocument, - xmlSAX2StartElement, - xmlSAX2EndElement, - xmlSAX2Reference, - xmlSAX2Characters, - xmlSAX2IgnorableWhitespace, - NULL, - xmlSAX2Comment, - xmlParserWarning, - xmlParserError, - xmlParserError, - xmlSAX2GetParameterEntity, - NULL, - NULL, - 0, -}; -#endif /* LIBXML_DOCB_ENABLED */ - -/** - * xmlInitializeGlobalState: - * @gs: a pointer to a newly allocated global state - * - * xmlInitializeGlobalState() initialize a global state with all the - * default values of the library. - */ -void -xmlInitializeGlobalState(xmlGlobalStatePtr gs) -{ -#ifdef DEBUG_GLOBALS - fprintf(stderr, "Initializing globals at %lu for thread %d\n", - (unsigned long) gs, xmlGetThreadId()); -#endif - - /* - * Perform initialization as required by libxml - */ - if (xmlThrDefMutex == NULL) - xmlInitGlobals(); - - xmlMutexLock(xmlThrDefMutex); - -#if defined(LIBXML_DOCB_ENABLED) && defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) - initdocbDefaultSAXHandler(&gs->docbDefaultSAXHandler); -#endif -#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_LEGACY_ENABLED) - inithtmlDefaultSAXHandler(&gs->htmlDefaultSAXHandler); -#endif - - gs->oldXMLWDcompatibility = 0; - gs->xmlBufferAllocScheme = xmlBufferAllocSchemeThrDef; - gs->xmlDefaultBufferSize = xmlDefaultBufferSizeThrDef; -#if defined(LIBXML_SAX1_ENABLED) && defined(LIBXML_LEGACY_ENABLED) - initxmlDefaultSAXHandler(&gs->xmlDefaultSAXHandler, 1); -#endif /* LIBXML_SAX1_ENABLED */ - gs->xmlDefaultSAXLocator.getPublicId = xmlSAX2GetPublicId; - gs->xmlDefaultSAXLocator.getSystemId = xmlSAX2GetSystemId; - gs->xmlDefaultSAXLocator.getLineNumber = xmlSAX2GetLineNumber; - gs->xmlDefaultSAXLocator.getColumnNumber = xmlSAX2GetColumnNumber; - gs->xmlDoValidityCheckingDefaultValue = - xmlDoValidityCheckingDefaultValueThrDef; -#if defined(DEBUG_MEMORY_LOCATION) | defined(DEBUG_MEMORY) - gs->xmlFree = (xmlFreeFunc) vtk_libxml2_xmlMemFree; - gs->xmlMalloc = (xmlMallocFunc) vtk_libxml2_xmlMemMalloc; - gs->xmlMallocAtomic = (xmlMallocFunc) vtk_libxml2_xmlMemMalloc; - gs->xmlRealloc = (xmlReallocFunc) vtk_libxml2_xmlMemRealloc; - gs->xmlMemStrdup = (xmlStrdupFunc) vtk_libxml2_xmlMemoryStrdup; -#else - gs->xmlFree = (xmlFreeFunc) free; - gs->xmlMalloc = (xmlMallocFunc) malloc; - gs->xmlMallocAtomic = (xmlMallocFunc) malloc; - gs->xmlRealloc = (xmlReallocFunc) realloc; - gs->xmlMemStrdup = (xmlStrdupFunc) xmlStrdup; -#endif - gs->xmlGetWarningsDefaultValue = xmlGetWarningsDefaultValueThrDef; - gs->xmlIndentTreeOutput = xmlIndentTreeOutputThrDef; - gs->xmlTreeIndentString = xmlTreeIndentStringThrDef; - gs->xmlKeepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef; - gs->xmlLineNumbersDefaultValue = xmlLineNumbersDefaultValueThrDef; - gs->xmlLoadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef; - gs->xmlParserDebugEntities = xmlParserDebugEntitiesThrDef; - gs->xmlParserVersion = LIBXML_VERSION_STRING; - gs->xmlPedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef; - gs->xmlSaveNoEmptyTags = xmlSaveNoEmptyTagsThrDef; - gs->xmlSubstituteEntitiesDefaultValue = - xmlSubstituteEntitiesDefaultValueThrDef; - - gs->xmlGenericError = xmlGenericErrorThrDef; - gs->xmlStructuredError = xmlStructuredErrorThrDef; - gs->xmlGenericErrorContext = xmlGenericErrorContextThrDef; - gs->xmlRegisterNodeDefaultValue = xmlRegisterNodeDefaultValueThrDef; - gs->xmlDeregisterNodeDefaultValue = xmlDeregisterNodeDefaultValueThrDef; - - gs->xmlParserInputBufferCreateFilenameValue = xmlParserInputBufferCreateFilenameValueThrDef; - gs->xmlOutputBufferCreateFilenameValue = xmlOutputBufferCreateFilenameValueThrDef; - memset(&gs->xmlLastError, 0, sizeof(xmlError)); - - xmlMutexUnlock(xmlThrDefMutex); -} - -#define docbDefaultSAXHandler vtk_libxml2_docbDefaultSAXHandler -#define htmlDefaultSAXHandler vtk_libxml2_htmlDefaultSAXHandler -#define xmlLastError vtk_libxml2_xmlLastError -#define oldXMLWDcompatibility vtk_libxml2_oldXMLWDcompatibility -#define xmlBufferAllocScheme vtk_libxml2_xmlBufferAllocScheme -#define xmlDefaultBufferSize vtk_libxml2_xmlDefaultBufferSize -#define xmlDefaultSAXHandler vtk_libxml2_xmlDefaultSAXHandler -#define xmlDefaultSAXLocator vtk_libxml2_xmlDefaultSAXLocator -#define xmlDoValidityCheckingDefaultValue vtk_libxml2_xmlDoValidityCheckingDefaultValue -#define xmlGenericError vtk_libxml2_xmlGenericError -#define xmlStructuredError vtk_libxml2_xmlStructuredError -#define xmlGenericErrorContext vtk_libxml2_xmlGenericErrorContext -#define xmlGetWarningsDefaultValue vtk_libxml2_xmlGetWarningsDefaultValue -#define xmlIndentTreeOutput vtk_libxml2_xmlIndentTreeOutput -#define xmlTreeIndentString vtk_libxml2_xmlTreeIndentString -#define xmlKeepBlanksDefaultValue vtk_libxml2_xmlKeepBlanksDefaultValue -#define xmlLineNumbersDefaultValue vtk_libxml2_xmlLineNumbersDefaultValue -#define xmlLoadExtDtdDefaultValue vtk_libxml2_xmlLoadExtDtdDefaultValue -#define xmlParserDebugEntities vtk_libxml2_xmlParserDebugEntities -#define xmlParserVersion vtk_libxml2_xmlParserVersion -#define xmlPedanticParserDefaultValue vtk_libxml2_xmlPedanticParserDefaultValue -#define xmlSaveNoEmptyTags vtk_libxml2_xmlSaveNoEmptyTags -#define xmlSubstituteEntitiesDefaultValue vtk_libxml2_xmlSubstituteEntitiesDefaultValue -#define xmlRegisterNodeDefaultValue vtk_libxml2_xmlRegisterNodeDefaultValue -#define xmlDeregisterNodeDefaultValue vtk_libxml2_xmlDeregisterNodeDefaultValue -#define xmlParserInputBufferCreateFilenameValue vtk_libxml2_xmlParserInputBufferCreateFilenameValue -#define xmlOutputBufferCreateFilenameValue vtk_libxml2_xmlOutputBufferCreateFilenameValue - -#define xmlMalloc vtk_libxml2_xmlMalloc -#define xmlMallocAtomic vtk_libxml2_xmlMallocAtomic -#define xmlRealloc vtk_libxml2_xmlRealloc -#define xmlFree vtk_libxml2_xmlFree -#define xmlMemStrdup vtk_libxml2_xmlMemStrdup - -/** - * DOC_DISABLE : we ignore missing doc for the xmlThrDef functions, - * those are really internal work - */ -void -xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { - xmlMutexLock(xmlThrDefMutex); - xmlGenericErrorContextThrDef = ctx; - if (handler != NULL) - xmlGenericErrorThrDef = handler; - else - xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; - xmlMutexUnlock(xmlThrDefMutex); -} - -void -xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { - xmlMutexLock(xmlThrDefMutex); - xmlGenericErrorContextThrDef = ctx; - xmlStructuredErrorThrDef = handler; - xmlMutexUnlock(xmlThrDefMutex); -} - -/** - * xmlRegisterNodeDefault: - * @func: function pointer to the new RegisterNodeFunc - * - * Registers a callback for node creation - * - * Returns the old value of the registration function - */ -xmlRegisterNodeFunc -xmlRegisterNodeDefault(xmlRegisterNodeFunc func) -{ - xmlRegisterNodeFunc old = xmlRegisterNodeDefaultValue; - - __xmlRegisterCallbacks = 1; - xmlRegisterNodeDefaultValue = func; - return(old); -} - -xmlRegisterNodeFunc -xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func) -{ - xmlRegisterNodeFunc old; - - xmlMutexLock(xmlThrDefMutex); - old = xmlRegisterNodeDefaultValueThrDef; - - __xmlRegisterCallbacks = 1; - xmlRegisterNodeDefaultValueThrDef = func; - xmlMutexUnlock(xmlThrDefMutex); - - return(old); -} - -/** - * xmlDeregisterNodeDefault: - * @func: function pointer to the new DeregisterNodeFunc - * - * Registers a callback for node destruction - * - * Returns the previous value of the deregistration function - */ -xmlDeregisterNodeFunc -xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func) -{ - xmlDeregisterNodeFunc old = xmlDeregisterNodeDefaultValue; - - __xmlRegisterCallbacks = 1; - xmlDeregisterNodeDefaultValue = func; - return(old); -} - -xmlDeregisterNodeFunc -xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func) -{ - xmlDeregisterNodeFunc old; - - xmlMutexLock(xmlThrDefMutex); - old = xmlDeregisterNodeDefaultValueThrDef; - - __xmlRegisterCallbacks = 1; - xmlDeregisterNodeDefaultValueThrDef = func; - xmlMutexUnlock(xmlThrDefMutex); - - return(old); -} - -xmlParserInputBufferCreateFilenameFunc -xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func) -{ - xmlParserInputBufferCreateFilenameFunc old; - - xmlMutexLock(xmlThrDefMutex); - old = xmlParserInputBufferCreateFilenameValueThrDef; - if (old == NULL) { - old = __xmlParserInputBufferCreateFilename; - } - - xmlParserInputBufferCreateFilenameValueThrDef = func; - xmlMutexUnlock(xmlThrDefMutex); - - return(old); -} - -xmlOutputBufferCreateFilenameFunc -xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func) -{ - xmlOutputBufferCreateFilenameFunc old; - - xmlMutexLock(xmlThrDefMutex); - old = xmlOutputBufferCreateFilenameValueThrDef; -#ifdef LIBXML_OUTPUT_ENABLED - if (old == NULL) { - old = __xmlOutputBufferCreateFilename; - } -#endif - xmlOutputBufferCreateFilenameValueThrDef = func; - xmlMutexUnlock(xmlThrDefMutex); - - return(old); -} - -#ifdef LIBXML_DOCB_ENABLED -#undef docbDefaultSAXHandler -xmlSAXHandlerV1 * -__docbDefaultSAXHandler(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_docbDefaultSAXHandler); - else - return (&xmlGetGlobalState()->docbDefaultSAXHandler); -} -#endif - -#ifdef LIBXML_HTML_ENABLED -#undef htmlDefaultSAXHandler -xmlSAXHandlerV1 * -__htmlDefaultSAXHandler(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_htmlDefaultSAXHandler); - else - return (&xmlGetGlobalState()->htmlDefaultSAXHandler); -} -#endif - -#undef xmlLastError -xmlError * -__xmlLastError(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlLastError); - else - return (&xmlGetGlobalState()->xmlLastError); -} - -/* - * The following memory routines were apparently lost at some point, - * and were re-inserted at this point on June 10, 2004. Hope it's - * the right place for them :-) - */ -#if defined(LIBXML_THREAD_ALLOC_ENABLED) && defined(LIBXML_THREAD_ENABLED) -#undef xmlMalloc -xmlMallocFunc * -__xmlMalloc(void){ - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlMalloc); - else - return (&xmlGetGlobalState()->xmlMalloc); -} - -#undef xmlMallocAtomic -xmlMallocFunc * -__xmlMallocAtomic(void){ - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlMallocAtomic); - else - return (&xmlGetGlobalState()->xmlMallocAtomic); -} - -#undef xmlRealloc -xmlReallocFunc * -__xmlRealloc(void){ - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlRealloc); - else - return (&xmlGetGlobalState()->xmlRealloc); -} - -#undef xmlFree -xmlFreeFunc * -__xmlFree(void){ - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlFree); - else - return (&xmlGetGlobalState()->xmlFree); -} - -xmlStrdupFunc * -__xmlMemStrdup(void){ - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlMemStrdup); - else - return (&xmlGetGlobalState()->xmlMemStrdup); -} - -#endif - -/* - * Everything starting from the line below is - * Automatically generated by build_glob.py. - * Do not modify the previous line. - */ - - -#undef oldXMLWDcompatibility -int * -__oldXMLWDcompatibility(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_oldXMLWDcompatibility); - else - return (&xmlGetGlobalState()->oldXMLWDcompatibility); -} - -#undef xmlBufferAllocScheme -xmlBufferAllocationScheme * -__xmlBufferAllocScheme(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlBufferAllocScheme); - else - return (&xmlGetGlobalState()->xmlBufferAllocScheme); -} -xmlBufferAllocationScheme xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v) { - xmlBufferAllocationScheme ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlBufferAllocSchemeThrDef; - xmlBufferAllocSchemeThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlDefaultBufferSize -int * -__xmlDefaultBufferSize(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlDefaultBufferSize); - else - return (&xmlGetGlobalState()->xmlDefaultBufferSize); -} -int xmlThrDefDefaultBufferSize(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlDefaultBufferSizeThrDef; - xmlDefaultBufferSizeThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#ifdef LIBXML_SAX1_ENABLED -#undef xmlDefaultSAXHandler -xmlSAXHandlerV1 * -__xmlDefaultSAXHandler(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlDefaultSAXHandler); - else - return (&xmlGetGlobalState()->xmlDefaultSAXHandler); -} -#endif /* LIBXML_SAX1_ENABLED */ - -#undef xmlDefaultSAXLocator -xmlSAXLocator * -__xmlDefaultSAXLocator(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlDefaultSAXLocator); - else - return (&xmlGetGlobalState()->xmlDefaultSAXLocator); -} - -#undef xmlDoValidityCheckingDefaultValue -int * -__xmlDoValidityCheckingDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlDoValidityCheckingDefaultValue); - else - return (&xmlGetGlobalState()->xmlDoValidityCheckingDefaultValue); -} -int xmlThrDefDoValidityCheckingDefaultValue(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlDoValidityCheckingDefaultValueThrDef; - xmlDoValidityCheckingDefaultValueThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlGenericError -xmlGenericErrorFunc * -__xmlGenericError(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlGenericError); - else - return (&xmlGetGlobalState()->xmlGenericError); -} - -#undef xmlStructuredError -xmlStructuredErrorFunc * -__xmlStructuredError(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlStructuredError); - else - return (&xmlGetGlobalState()->xmlStructuredError); -} - -#undef xmlGenericErrorContext -void * * -__xmlGenericErrorContext(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlGenericErrorContext); - else - return (&xmlGetGlobalState()->xmlGenericErrorContext); -} - -#undef xmlGetWarningsDefaultValue -int * -__xmlGetWarningsDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlGetWarningsDefaultValue); - else - return (&xmlGetGlobalState()->xmlGetWarningsDefaultValue); -} -int xmlThrDefGetWarningsDefaultValue(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlGetWarningsDefaultValueThrDef; - xmlGetWarningsDefaultValueThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlIndentTreeOutput -int * -__xmlIndentTreeOutput(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlIndentTreeOutput); - else - return (&xmlGetGlobalState()->xmlIndentTreeOutput); -} -int xmlThrDefIndentTreeOutput(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlIndentTreeOutputThrDef; - xmlIndentTreeOutputThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlTreeIndentString -const char * * -__xmlTreeIndentString(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlTreeIndentString); - else - return (&xmlGetGlobalState()->xmlTreeIndentString); -} -const char * xmlThrDefTreeIndentString(const char * v) { - const char * ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlTreeIndentStringThrDef; - xmlTreeIndentStringThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlKeepBlanksDefaultValue -int * -__xmlKeepBlanksDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlKeepBlanksDefaultValue); - else - return (&xmlGetGlobalState()->xmlKeepBlanksDefaultValue); -} -int xmlThrDefKeepBlanksDefaultValue(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlKeepBlanksDefaultValueThrDef; - xmlKeepBlanksDefaultValueThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlLineNumbersDefaultValue -int * -__xmlLineNumbersDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlLineNumbersDefaultValue); - else - return (&xmlGetGlobalState()->xmlLineNumbersDefaultValue); -} -int xmlThrDefLineNumbersDefaultValue(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlLineNumbersDefaultValueThrDef; - xmlLineNumbersDefaultValueThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlLoadExtDtdDefaultValue -int * -__xmlLoadExtDtdDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlLoadExtDtdDefaultValue); - else - return (&xmlGetGlobalState()->xmlLoadExtDtdDefaultValue); -} -int xmlThrDefLoadExtDtdDefaultValue(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlLoadExtDtdDefaultValueThrDef; - xmlLoadExtDtdDefaultValueThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlParserDebugEntities -int * -__xmlParserDebugEntities(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlParserDebugEntities); - else - return (&xmlGetGlobalState()->xmlParserDebugEntities); -} -int xmlThrDefParserDebugEntities(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlParserDebugEntitiesThrDef; - xmlParserDebugEntitiesThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlParserVersion -const char * * -__xmlParserVersion(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlParserVersion); - else - return (&xmlGetGlobalState()->xmlParserVersion); -} - -#undef xmlPedanticParserDefaultValue -int * -__xmlPedanticParserDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlPedanticParserDefaultValue); - else - return (&xmlGetGlobalState()->xmlPedanticParserDefaultValue); -} -int xmlThrDefPedanticParserDefaultValue(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlPedanticParserDefaultValueThrDef; - xmlPedanticParserDefaultValueThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlSaveNoEmptyTags -int * -__xmlSaveNoEmptyTags(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlSaveNoEmptyTags); - else - return (&xmlGetGlobalState()->xmlSaveNoEmptyTags); -} -int xmlThrDefSaveNoEmptyTags(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlSaveNoEmptyTagsThrDef; - xmlSaveNoEmptyTagsThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlSubstituteEntitiesDefaultValue -int * -__xmlSubstituteEntitiesDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlSubstituteEntitiesDefaultValue); - else - return (&xmlGetGlobalState()->xmlSubstituteEntitiesDefaultValue); -} -int xmlThrDefSubstituteEntitiesDefaultValue(int v) { - int ret; - xmlMutexLock(xmlThrDefMutex); - ret = xmlSubstituteEntitiesDefaultValueThrDef; - xmlSubstituteEntitiesDefaultValueThrDef = v; - xmlMutexUnlock(xmlThrDefMutex); - return ret; -} - -#undef xmlRegisterNodeDefaultValue -xmlRegisterNodeFunc * -__xmlRegisterNodeDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlRegisterNodeDefaultValue); - else - return (&xmlGetGlobalState()->xmlRegisterNodeDefaultValue); -} - -#undef xmlDeregisterNodeDefaultValue -xmlDeregisterNodeFunc * -__xmlDeregisterNodeDefaultValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlDeregisterNodeDefaultValue); - else - return (&xmlGetGlobalState()->xmlDeregisterNodeDefaultValue); -} - -#undef xmlParserInputBufferCreateFilenameValue -xmlParserInputBufferCreateFilenameFunc * -__xmlParserInputBufferCreateFilenameValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlParserInputBufferCreateFilenameValue); - else - return (&xmlGetGlobalState()->xmlParserInputBufferCreateFilenameValue); -} - -#undef xmlOutputBufferCreateFilenameValue -xmlOutputBufferCreateFilenameFunc * -__xmlOutputBufferCreateFilenameValue(void) { - if (IS_MAIN_THREAD) - return (&vtk_libxml2_xmlOutputBufferCreateFilenameValue); - else - return (&xmlGetGlobalState()->xmlOutputBufferCreateFilenameValue); -} - -#define bottom_globals -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/hash.c b/ThirdParty/libxml2/vtklibxml2/hash.c deleted file mode 100644 index 21371daf3c1..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/hash.c +++ /dev/null @@ -1,1079 +0,0 @@ -/* - * hash.c: chained hash tables - * - * Reference: Your favorite introductory book on algorithms - * - * Copyright (C) 2000 Bjorn Reese and Daniel Veillard. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - * Author: breese@users.sourceforge.net - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#include <libxml/parser.h> -#include <libxml/hash.h> -#include <libxml/xmlmemory.h> -#include <libxml/xmlerror.h> -#include <libxml/globals.h> - -#define MAX_HASH_LEN 8 - -/* #define DEBUG_GROW */ - -/* - * A single entry in the hash table - */ -typedef struct _xmlHashEntry xmlHashEntry; -typedef xmlHashEntry *xmlHashEntryPtr; -struct _xmlHashEntry { - struct _xmlHashEntry *next; - xmlChar *name; - xmlChar *name2; - xmlChar *name3; - void *payload; - int valid; -}; - -/* - * The entire hash table - */ -struct _xmlHashTable { - struct _xmlHashEntry *table; - int size; - int nbElems; - xmlDictPtr dict; -}; - -/* - * xmlHashComputeKey: - * Calculate the hash key - */ -static unsigned long -xmlHashComputeKey(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, const xmlChar *name3) { - unsigned long value = 0L; - char ch; - - if (name != NULL) { - value += 30 * (*name); - while ((ch = *name++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - } - if (name2 != NULL) { - while ((ch = *name2++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - } - if (name3 != NULL) { - while ((ch = *name3++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - } - return (value % table->size); -} - -static unsigned long -xmlHashComputeQKey(xmlHashTablePtr table, - const xmlChar *prefix, const xmlChar *name, - const xmlChar *prefix2, const xmlChar *name2, - const xmlChar *prefix3, const xmlChar *name3) { - unsigned long value = 0L; - char ch; - - if (prefix != NULL) - value += 30 * (*prefix); - else - value += 30 * (*name); - - if (prefix != NULL) { - while ((ch = *prefix++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); - } - if (name != NULL) { - while ((ch = *name++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - } - if (prefix2 != NULL) { - while ((ch = *prefix2++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); - } - if (name2 != NULL) { - while ((ch = *name2++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - } - if (prefix3 != NULL) { - while ((ch = *prefix3++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); - } - if (name3 != NULL) { - while ((ch = *name3++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - } - return (value % table->size); -} - -/** - * xmlHashCreate: - * @size: the size of the hash table - * - * Create a new xmlHashTablePtr. - * - * Returns the newly created object, or NULL if an error occured. - */ -xmlHashTablePtr -xmlHashCreate(int size) { - xmlHashTablePtr table; - - if (size <= 0) - size = 256; - - table = xmlMalloc(sizeof(xmlHashTable)); - if (table) { - table->dict = NULL; - table->size = size; - table->nbElems = 0; - table->table = xmlMalloc(size * sizeof(xmlHashEntry)); - if (table->table) { - memset(table->table, 0, size * sizeof(xmlHashEntry)); - return(table); - } - xmlFree(table); - } - return(NULL); -} - -/** - * xmlHashCreateDict: - * @size: the size of the hash table - * @dict: a dictionary to use for the hash - * - * Create a new xmlHashTablePtr which will use @dict as the internal dictionary - * - * Returns the newly created object, or NULL if an error occured. - */ -xmlHashTablePtr -xmlHashCreateDict(int size, xmlDictPtr dict) { - xmlHashTablePtr table; - - table = xmlHashCreate(size); - if (table != NULL) { - table->dict = dict; - xmlDictReference(dict); - } - return(table); -} - -/** - * xmlHashGrow: - * @table: the hash table - * @size: the new size of the hash table - * - * resize the hash table - * - * Returns 0 in case of success, -1 in case of failure - */ -static int -xmlHashGrow(xmlHashTablePtr table, int size) { - unsigned long key; - int oldsize, i; - xmlHashEntryPtr iter, next; - struct _xmlHashEntry *oldtable; -#ifdef DEBUG_GROW - unsigned long nbElem = 0; -#endif - - if (table == NULL) - return(-1); - if (size < 8) - return(-1); - if (size > 8 * 2048) - return(-1); - - oldsize = table->size; - oldtable = table->table; - if (oldtable == NULL) - return(-1); - - table->table = xmlMalloc(size * sizeof(xmlHashEntry)); - if (table->table == NULL) { - table->table = oldtable; - return(-1); - } - memset(table->table, 0, size * sizeof(xmlHashEntry)); - table->size = size; - - /* If the two loops are merged, there would be situations where - a new entry needs to allocated and data copied into it from - the main table. So instead, we run through the array twice, first - copying all the elements in the main array (where we can't get - conflicts) and then the rest, so we only free (and don't allocate) - */ - for (i = 0; i < oldsize; i++) { - if (oldtable[i].valid == 0) - continue; - key = xmlHashComputeKey(table, oldtable[i].name, oldtable[i].name2, - oldtable[i].name3); - memcpy(&(table->table[key]), &(oldtable[i]), sizeof(xmlHashEntry)); - table->table[key].next = NULL; - } - - for (i = 0; i < oldsize; i++) { - iter = oldtable[i].next; - while (iter) { - next = iter->next; - - /* - * put back the entry in the new table - */ - - key = xmlHashComputeKey(table, iter->name, iter->name2, - iter->name3); - if (table->table[key].valid == 0) { - memcpy(&(table->table[key]), iter, sizeof(xmlHashEntry)); - table->table[key].next = NULL; - xmlFree(iter); - } else { - iter->next = table->table[key].next; - table->table[key].next = iter; - } - -#ifdef DEBUG_GROW - nbElem++; -#endif - - iter = next; - } - } - - xmlFree(oldtable); - -#ifdef DEBUG_GROW - xmlGenericError(xmlGenericErrorContext, - "xmlHashGrow : from %d to %d, %d elems\n", oldsize, size, nbElem); -#endif - - return(0); -} - -/** - * xmlHashFree: - * @table: the hash table - * @f: the deallocator function for items in the hash - * - * Free the hash @table and its contents. The userdata is - * deallocated with @f if provided. - */ -void -xmlHashFree(xmlHashTablePtr table, xmlHashDeallocator f) { - int i; - xmlHashEntryPtr iter; - xmlHashEntryPtr next; - int inside_table = 0; - int nbElems; - - if (table == NULL) - return; - if (table->table) { - nbElems = table->nbElems; - for(i = 0; (i < table->size) && (nbElems > 0); i++) { - iter = &(table->table[i]); - if (iter->valid == 0) - continue; - inside_table = 1; - while (iter) { - next = iter->next; - if ((f != NULL) && (iter->payload != NULL)) - f(iter->payload, iter->name); - if (table->dict == NULL) { - if (iter->name) - xmlFree(iter->name); - if (iter->name2) - xmlFree(iter->name2); - if (iter->name3) - xmlFree(iter->name3); - } - iter->payload = NULL; - if (!inside_table) - xmlFree(iter); - nbElems--; - inside_table = 0; - iter = next; - } - inside_table = 0; - } - xmlFree(table->table); - } - if (table->dict) - xmlDictFree(table->dict); - xmlFree(table); -} - -/** - * xmlHashAddEntry: - * @table: the hash table - * @name: the name of the userdata - * @userdata: a pointer to the userdata - * - * Add the @userdata to the hash @table. This can later be retrieved - * by using the @name. Duplicate names generate errors. - * - * Returns 0 the addition succeeded and -1 in case of error. - */ -int -xmlHashAddEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata) { - return(xmlHashAddEntry3(table, name, NULL, NULL, userdata)); -} - -/** - * xmlHashAddEntry2: - * @table: the hash table - * @name: the name of the userdata - * @name2: a second name of the userdata - * @userdata: a pointer to the userdata - * - * Add the @userdata to the hash @table. This can later be retrieved - * by using the (@name, @name2) tuple. Duplicate tuples generate errors. - * - * Returns 0 the addition succeeded and -1 in case of error. - */ -int -xmlHashAddEntry2(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, void *userdata) { - return(xmlHashAddEntry3(table, name, name2, NULL, userdata)); -} - -/** - * xmlHashUpdateEntry: - * @table: the hash table - * @name: the name of the userdata - * @userdata: a pointer to the userdata - * @f: the deallocator function for replaced item (if any) - * - * Add the @userdata to the hash @table. This can later be retrieved - * by using the @name. Existing entry for this @name will be removed - * and freed with @f if found. - * - * Returns 0 the addition succeeded and -1 in case of error. - */ -int -xmlHashUpdateEntry(xmlHashTablePtr table, const xmlChar *name, - void *userdata, xmlHashDeallocator f) { - return(xmlHashUpdateEntry3(table, name, NULL, NULL, userdata, f)); -} - -/** - * xmlHashUpdateEntry2: - * @table: the hash table - * @name: the name of the userdata - * @name2: a second name of the userdata - * @userdata: a pointer to the userdata - * @f: the deallocator function for replaced item (if any) - * - * Add the @userdata to the hash @table. This can later be retrieved - * by using the (@name, @name2) tuple. Existing entry for this tuple will - * be removed and freed with @f if found. - * - * Returns 0 the addition succeeded and -1 in case of error. - */ -int -xmlHashUpdateEntry2(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, void *userdata, - xmlHashDeallocator f) { - return(xmlHashUpdateEntry3(table, name, name2, NULL, userdata, f)); -} - -/** - * xmlHashLookup: - * @table: the hash table - * @name: the name of the userdata - * - * Find the userdata specified by the @name. - * - * Returns the pointer to the userdata - */ -void * -xmlHashLookup(xmlHashTablePtr table, const xmlChar *name) { - return(xmlHashLookup3(table, name, NULL, NULL)); -} - -/** - * xmlHashLookup2: - * @table: the hash table - * @name: the name of the userdata - * @name2: a second name of the userdata - * - * Find the userdata specified by the (@name, @name2) tuple. - * - * Returns the pointer to the userdata - */ -void * -xmlHashLookup2(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2) { - return(xmlHashLookup3(table, name, name2, NULL)); -} - -/** - * xmlHashQLookup: - * @table: the hash table - * @prefix: the prefix of the userdata - * @name: the name of the userdata - * - * Find the userdata specified by the QName @prefix:@name/@name. - * - * Returns the pointer to the userdata - */ -void * -xmlHashQLookup(xmlHashTablePtr table, const xmlChar *prefix, - const xmlChar *name) { - return(xmlHashQLookup3(table, prefix, name, NULL, NULL, NULL, NULL)); -} - -/** - * xmlHashQLookup2: - * @table: the hash table - * @prefix: the prefix of the userdata - * @name: the name of the userdata - * @prefix2: the second prefix of the userdata - * @name2: a second name of the userdata - * - * Find the userdata specified by the QNames tuple - * - * Returns the pointer to the userdata - */ -void * -xmlHashQLookup2(xmlHashTablePtr table, const xmlChar *prefix, - const xmlChar *name, const xmlChar *prefix2, - const xmlChar *name2) { - return(xmlHashQLookup3(table, prefix, name, prefix2, name2, NULL, NULL)); -} - -/** - * xmlHashAddEntry3: - * @table: the hash table - * @name: the name of the userdata - * @name2: a second name of the userdata - * @name3: a third name of the userdata - * @userdata: a pointer to the userdata - * - * Add the @userdata to the hash @table. This can later be retrieved - * by using the tuple (@name, @name2, @name3). Duplicate entries generate - * errors. - * - * Returns 0 the addition succeeded and -1 in case of error. - */ -int -xmlHashAddEntry3(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, const xmlChar *name3, - void *userdata) { - unsigned long key, len = 0; - xmlHashEntryPtr entry; - xmlHashEntryPtr insert; - - if ((table == NULL) || (name == NULL)) - return(-1); - - /* - * If using a dict internalize if needed - */ - if (table->dict) { - if (!xmlDictOwns(table->dict, name)) { - name = xmlDictLookup(table->dict, name, -1); - if (name == NULL) - return(-1); - } - if ((name2 != NULL) && (!xmlDictOwns(table->dict, name2))) { - name2 = xmlDictLookup(table->dict, name2, -1); - if (name2 == NULL) - return(-1); - } - if ((name3 != NULL) && (!xmlDictOwns(table->dict, name3))) { - name3 = xmlDictLookup(table->dict, name3, -1); - if (name3 == NULL) - return(-1); - } - } - - /* - * Check for duplicate and insertion location. - */ - key = xmlHashComputeKey(table, name, name2, name3); - if (table->table[key].valid == 0) { - insert = NULL; - } else { - if (table->dict) { - for (insert = &(table->table[key]); insert->next != NULL; - insert = insert->next) { - if ((insert->name == name) && - (insert->name2 == name2) && - (insert->name3 == name3)) - return(-1); - len++; - } - if ((insert->name == name) && - (insert->name2 == name2) && - (insert->name3 == name3)) - return(-1); - } else { - for (insert = &(table->table[key]); insert->next != NULL; - insert = insert->next) { - if ((xmlStrEqual(insert->name, name)) && - (xmlStrEqual(insert->name2, name2)) && - (xmlStrEqual(insert->name3, name3))) - return(-1); - len++; - } - if ((xmlStrEqual(insert->name, name)) && - (xmlStrEqual(insert->name2, name2)) && - (xmlStrEqual(insert->name3, name3))) - return(-1); - } - } - - if (insert == NULL) { - entry = &(table->table[key]); - } else { - entry = xmlMalloc(sizeof(xmlHashEntry)); - if (entry == NULL) - return(-1); - } - - if (table->dict != NULL) { - entry->name = (xmlChar *) name; - entry->name2 = (xmlChar *) name2; - entry->name3 = (xmlChar *) name3; - } else { - entry->name = xmlStrdup(name); - entry->name2 = xmlStrdup(name2); - entry->name3 = xmlStrdup(name3); - } - entry->payload = userdata; - entry->next = NULL; - entry->valid = 1; - - - if (insert != NULL) - insert->next = entry; - - table->nbElems++; - - if (len > MAX_HASH_LEN) - xmlHashGrow(table, MAX_HASH_LEN * table->size); - - return(0); -} - -/** - * xmlHashUpdateEntry3: - * @table: the hash table - * @name: the name of the userdata - * @name2: a second name of the userdata - * @name3: a third name of the userdata - * @userdata: a pointer to the userdata - * @f: the deallocator function for replaced item (if any) - * - * Add the @userdata to the hash @table. This can later be retrieved - * by using the tuple (@name, @name2, @name3). Existing entry for this tuple - * will be removed and freed with @f if found. - * - * Returns 0 the addition succeeded and -1 in case of error. - */ -int -xmlHashUpdateEntry3(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, const xmlChar *name3, - void *userdata, xmlHashDeallocator f) { - unsigned long key; - xmlHashEntryPtr entry; - xmlHashEntryPtr insert; - - if ((table == NULL) || name == NULL) - return(-1); - - /* - * If using a dict internalize if needed - */ - if (table->dict) { - if (!xmlDictOwns(table->dict, name)) { - name = xmlDictLookup(table->dict, name, -1); - if (name == NULL) - return(-1); - } - if ((name2 != NULL) && (!xmlDictOwns(table->dict, name2))) { - name2 = xmlDictLookup(table->dict, name2, -1); - if (name2 == NULL) - return(-1); - } - if ((name3 != NULL) && (!xmlDictOwns(table->dict, name3))) { - name3 = xmlDictLookup(table->dict, name3, -1); - if (name3 == NULL) - return(-1); - } - } - - /* - * Check for duplicate and insertion location. - */ - key = xmlHashComputeKey(table, name, name2, name3); - if (table->table[key].valid == 0) { - insert = NULL; - } else { - if (table ->dict) { - for (insert = &(table->table[key]); insert->next != NULL; - insert = insert->next) { - if ((insert->name == name) && - (insert->name2 == name2) && - (insert->name3 == name3)) { - if (f) - f(insert->payload, insert->name); - insert->payload = userdata; - return(0); - } - } - if ((insert->name == name) && - (insert->name2 == name2) && - (insert->name3 == name3)) { - if (f) - f(insert->payload, insert->name); - insert->payload = userdata; - return(0); - } - } else { - for (insert = &(table->table[key]); insert->next != NULL; - insert = insert->next) { - if ((xmlStrEqual(insert->name, name)) && - (xmlStrEqual(insert->name2, name2)) && - (xmlStrEqual(insert->name3, name3))) { - if (f) - f(insert->payload, insert->name); - insert->payload = userdata; - return(0); - } - } - if ((xmlStrEqual(insert->name, name)) && - (xmlStrEqual(insert->name2, name2)) && - (xmlStrEqual(insert->name3, name3))) { - if (f) - f(insert->payload, insert->name); - insert->payload = userdata; - return(0); - } - } - } - - if (insert == NULL) { - entry = &(table->table[key]); - } else { - entry = xmlMalloc(sizeof(xmlHashEntry)); - if (entry == NULL) - return(-1); - } - - if (table->dict != NULL) { - entry->name = (xmlChar *) name; - entry->name2 = (xmlChar *) name2; - entry->name3 = (xmlChar *) name3; - } else { - entry->name = xmlStrdup(name); - entry->name2 = xmlStrdup(name2); - entry->name3 = xmlStrdup(name3); - } - entry->payload = userdata; - entry->next = NULL; - entry->valid = 1; - table->nbElems++; - - - if (insert != NULL) { - insert->next = entry; - } - return(0); -} - -/** - * xmlHashLookup3: - * @table: the hash table - * @name: the name of the userdata - * @name2: a second name of the userdata - * @name3: a third name of the userdata - * - * Find the userdata specified by the (@name, @name2, @name3) tuple. - * - * Returns the a pointer to the userdata - */ -void * -xmlHashLookup3(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, const xmlChar *name3) { - unsigned long key; - xmlHashEntryPtr entry; - - if (table == NULL) - return(NULL); - if (name == NULL) - return(NULL); - key = xmlHashComputeKey(table, name, name2, name3); - if (table->table[key].valid == 0) - return(NULL); - if (table->dict) { - for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { - if ((entry->name == name) && - (entry->name2 == name2) && - (entry->name3 == name3)) - return(entry->payload); - } - } - for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { - if ((xmlStrEqual(entry->name, name)) && - (xmlStrEqual(entry->name2, name2)) && - (xmlStrEqual(entry->name3, name3))) - return(entry->payload); - } - return(NULL); -} - -/** - * xmlHashQLookup3: - * @table: the hash table - * @prefix: the prefix of the userdata - * @name: the name of the userdata - * @prefix2: the second prefix of the userdata - * @name2: a second name of the userdata - * @prefix3: the third prefix of the userdata - * @name3: a third name of the userdata - * - * Find the userdata specified by the (@name, @name2, @name3) tuple. - * - * Returns the a pointer to the userdata - */ -void * -xmlHashQLookup3(xmlHashTablePtr table, - const xmlChar *prefix, const xmlChar *name, - const xmlChar *prefix2, const xmlChar *name2, - const xmlChar *prefix3, const xmlChar *name3) { - unsigned long key; - xmlHashEntryPtr entry; - - if (table == NULL) - return(NULL); - if (name == NULL) - return(NULL); - key = xmlHashComputeQKey(table, prefix, name, prefix2, - name2, prefix3, name3); - if (table->table[key].valid == 0) - return(NULL); - for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { - if ((xmlStrQEqual(prefix, name, entry->name)) && - (xmlStrQEqual(prefix2, name2, entry->name2)) && - (xmlStrQEqual(prefix3, name3, entry->name3))) - return(entry->payload); - } - return(NULL); -} - -typedef struct { - xmlHashScanner hashscanner; - void *data; -} stubData; - -static void -stubHashScannerFull (void *payload, void *data, const xmlChar *name, - const xmlChar *name2 ATTRIBUTE_UNUSED, - const xmlChar *name3 ATTRIBUTE_UNUSED) { - stubData *stubdata = (stubData *) data; - stubdata->hashscanner (payload, stubdata->data, (xmlChar *) name); -} - -/** - * xmlHashScan: - * @table: the hash table - * @f: the scanner function for items in the hash - * @data: extra data passed to f - * - * Scan the hash @table and applied @f to each value. - */ -void -xmlHashScan(xmlHashTablePtr table, xmlHashScanner f, void *data) { - stubData stubdata; - stubdata.data = data; - stubdata.hashscanner = f; - xmlHashScanFull (table, stubHashScannerFull, &stubdata); -} - -/** - * xmlHashScanFull: - * @table: the hash table - * @f: the scanner function for items in the hash - * @data: extra data passed to f - * - * Scan the hash @table and applied @f to each value. - */ -void -xmlHashScanFull(xmlHashTablePtr table, xmlHashScannerFull f, void *data) { - int i; - xmlHashEntryPtr iter; - xmlHashEntryPtr next; - - if (table == NULL) - return; - if (f == NULL) - return; - - if (table->table) { - for(i = 0; i < table->size; i++) { - if (table->table[i].valid == 0) - continue; - iter = &(table->table[i]); - while (iter) { - next = iter->next; - if ((f != NULL) && (iter->payload != NULL)) - f(iter->payload, data, iter->name, - iter->name2, iter->name3); - iter = next; - } - } - } -} - -/** - * xmlHashScan3: - * @table: the hash table - * @name: the name of the userdata or NULL - * @name2: a second name of the userdata or NULL - * @name3: a third name of the userdata or NULL - * @f: the scanner function for items in the hash - * @data: extra data passed to f - * - * Scan the hash @table and applied @f to each value matching - * (@name, @name2, @name3) tuple. If one of the names is null, - * the comparison is considered to match. - */ -void -xmlHashScan3(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, const xmlChar *name3, - xmlHashScanner f, void *data) { - xmlHashScanFull3 (table, name, name2, name3, - (xmlHashScannerFull) f, data); -} - -/** - * xmlHashScanFull3: - * @table: the hash table - * @name: the name of the userdata or NULL - * @name2: a second name of the userdata or NULL - * @name3: a third name of the userdata or NULL - * @f: the scanner function for items in the hash - * @data: extra data passed to f - * - * Scan the hash @table and applied @f to each value matching - * (@name, @name2, @name3) tuple. If one of the names is null, - * the comparison is considered to match. - */ -void -xmlHashScanFull3(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, const xmlChar *name3, - xmlHashScannerFull f, void *data) { - int i; - xmlHashEntryPtr iter; - xmlHashEntryPtr next; - - if (table == NULL) - return; - if (f == NULL) - return; - - if (table->table) { - for(i = 0; i < table->size; i++) { - if (table->table[i].valid == 0) - continue; - iter = &(table->table[i]); - while (iter) { - next = iter->next; - if (((name == NULL) || (xmlStrEqual(name, iter->name))) && - ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) && - ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) && - (iter->payload != NULL)) { - f(iter->payload, data, iter->name, - iter->name2, iter->name3); - } - iter = next; - } - } - } -} - -/** - * xmlHashCopy: - * @table: the hash table - * @f: the copier function for items in the hash - * - * Scan the hash @table and applied @f to each value. - * - * Returns the new table or NULL in case of error. - */ -xmlHashTablePtr -xmlHashCopy(xmlHashTablePtr table, xmlHashCopier f) { - int i; - xmlHashEntryPtr iter; - xmlHashEntryPtr next; - xmlHashTablePtr ret; - - if (table == NULL) - return(NULL); - if (f == NULL) - return(NULL); - - ret = xmlHashCreate(table->size); - if (table->table) { - for(i = 0; i < table->size; i++) { - if (table->table[i].valid == 0) - continue; - iter = &(table->table[i]); - while (iter) { - next = iter->next; - xmlHashAddEntry3(ret, iter->name, iter->name2, - iter->name3, f(iter->payload, iter->name)); - iter = next; - } - } - } - ret->nbElems = table->nbElems; - return(ret); -} - -/** - * xmlHashSize: - * @table: the hash table - * - * Query the number of elements installed in the hash @table. - * - * Returns the number of elements in the hash table or - * -1 in case of error - */ -int -xmlHashSize(xmlHashTablePtr table) { - if (table == NULL) - return(-1); - return(table->nbElems); -} - -/** - * xmlHashRemoveEntry: - * @table: the hash table - * @name: the name of the userdata - * @f: the deallocator function for removed item (if any) - * - * Find the userdata specified by the @name and remove - * it from the hash @table. Existing userdata for this tuple will be removed - * and freed with @f. - * - * Returns 0 if the removal succeeded and -1 in case of error or not found. - */ -int xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, - xmlHashDeallocator f) { - return(xmlHashRemoveEntry3(table, name, NULL, NULL, f)); -} - -/** - * xmlHashRemoveEntry2: - * @table: the hash table - * @name: the name of the userdata - * @name2: a second name of the userdata - * @f: the deallocator function for removed item (if any) - * - * Find the userdata specified by the (@name, @name2) tuple and remove - * it from the hash @table. Existing userdata for this tuple will be removed - * and freed with @f. - * - * Returns 0 if the removal succeeded and -1 in case of error or not found. - */ -int -xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, xmlHashDeallocator f) { - return(xmlHashRemoveEntry3(table, name, name2, NULL, f)); -} - -/** - * xmlHashRemoveEntry3: - * @table: the hash table - * @name: the name of the userdata - * @name2: a second name of the userdata - * @name3: a third name of the userdata - * @f: the deallocator function for removed item (if any) - * - * Find the userdata specified by the (@name, @name2, @name3) tuple and remove - * it from the hash @table. Existing userdata for this tuple will be removed - * and freed with @f. - * - * Returns 0 if the removal succeeded and -1 in case of error or not found. - */ -int -xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, const xmlChar *name3, xmlHashDeallocator f) { - unsigned long key; - xmlHashEntryPtr entry; - xmlHashEntryPtr prev = NULL; - - if (table == NULL || name == NULL) - return(-1); - - key = xmlHashComputeKey(table, name, name2, name3); - if (table->table[key].valid == 0) { - return(-1); - } else { - for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { - if (xmlStrEqual(entry->name, name) && - xmlStrEqual(entry->name2, name2) && - xmlStrEqual(entry->name3, name3)) { - if ((f != NULL) && (entry->payload != NULL)) - f(entry->payload, entry->name); - entry->payload = NULL; - if (table->dict == NULL) { - if(entry->name) - xmlFree(entry->name); - if(entry->name2) - xmlFree(entry->name2); - if(entry->name3) - xmlFree(entry->name3); - } - if(prev) { - prev->next = entry->next; - xmlFree(entry); - } else { - if (entry->next == NULL) { - entry->valid = 0; - } else { - entry = entry->next; - memcpy(&(table->table[key]), entry, sizeof(xmlHashEntry)); - xmlFree(entry); - } - } - table->nbElems--; - return(0); - } - prev = entry; - } - return(-1); - } -} - -#define bottom_hash -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/DOCBparser.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/DOCBparser.h deleted file mode 100644 index 9f93ec15a38..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/DOCBparser.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Summary: old DocBook SGML parser - * Description: interface for a DocBook SGML non-verifying parser - * This code is DEPRECATED, and should not be used anymore. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __DOCB_PARSER_H__ -#define __DOCB_PARSER_H__ -#include "xmlversion.h" - -#ifdef LIBXML_DOCB_ENABLED - -#include "parser.h" -#include "parserInternals.h" - -#ifndef IN_LIBXML -#ifdef __GNUC__ -/*#warning "The DOCBparser module has been deprecated in libxml2-2.6.0"*/ -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Most of the back-end structures from XML and SGML are shared. - */ -typedef xmlParserCtxt docbParserCtxt; -typedef xmlParserCtxtPtr docbParserCtxtPtr; -typedef xmlSAXHandler docbSAXHandler; -typedef xmlSAXHandlerPtr docbSAXHandlerPtr; -typedef xmlParserInput docbParserInput; -typedef xmlParserInputPtr docbParserInputPtr; -typedef xmlDocPtr docbDocPtr; - -/* - * There is only few public functions. - */ -XMLPUBFUN int XMLCALL - docbEncodeEntities(unsigned char *out, - int *outlen, - const unsigned char *in, - int *inlen, int quoteChar); - -XMLPUBFUN docbDocPtr XMLCALL - docbSAXParseDoc (xmlChar *cur, - const char *encoding, - docbSAXHandlerPtr sax, - void *userData); -XMLPUBFUN docbDocPtr XMLCALL - docbParseDoc (xmlChar *cur, - const char *encoding); -XMLPUBFUN docbDocPtr XMLCALL - docbSAXParseFile (const char *filename, - const char *encoding, - docbSAXHandlerPtr sax, - void *userData); -XMLPUBFUN docbDocPtr XMLCALL - docbParseFile (const char *filename, - const char *encoding); - -/** - * Interfaces for the Push mode. - */ -XMLPUBFUN void XMLCALL - docbFreeParserCtxt (docbParserCtxtPtr ctxt); -XMLPUBFUN docbParserCtxtPtr XMLCALL - docbCreatePushParserCtxt(docbSAXHandlerPtr sax, - void *user_data, - const char *chunk, - int size, - const char *filename, - xmlCharEncoding enc); -XMLPUBFUN int XMLCALL - docbParseChunk (docbParserCtxtPtr ctxt, - const char *chunk, - int size, - int terminate); -XMLPUBFUN docbParserCtxtPtr XMLCALL - docbCreateFileParserCtxt(const char *filename, - const char *encoding); -XMLPUBFUN int XMLCALL - docbParseDocument (docbParserCtxtPtr ctxt); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_DOCB_ENABLED */ - -#endif /* __DOCB_PARSER_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/HTMLparser.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/HTMLparser.h deleted file mode 100644 index 0fef2929fdf..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/HTMLparser.h +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Summary: interface for an HTML 4.0 non-verifying parser - * Description: this module implements an HTML 4.0 non-verifying parser - * with API compatible with the XML parser ones. It should - * be able to parse "real world" HTML, even if severely - * broken from a specification point of view. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __HTML_PARSER_H__ -#define __HTML_PARSER_H__ -#include "xmlversion.h" -#include "parser.h" - -#ifdef LIBXML_HTML_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Most of the back-end structures from XML and HTML are shared. - */ -typedef xmlParserCtxt htmlParserCtxt; -typedef xmlParserCtxtPtr htmlParserCtxtPtr; -typedef xmlParserNodeInfo htmlParserNodeInfo; -typedef xmlSAXHandler htmlSAXHandler; -typedef xmlSAXHandlerPtr htmlSAXHandlerPtr; -typedef xmlParserInput htmlParserInput; -typedef xmlParserInputPtr htmlParserInputPtr; -typedef xmlDocPtr htmlDocPtr; -typedef xmlNodePtr htmlNodePtr; - -/* - * Internal description of an HTML element, representing HTML 4.01 - * and XHTML 1.0 (which share the same structure). - */ -typedef struct _htmlElemDesc htmlElemDesc; -typedef htmlElemDesc *htmlElemDescPtr; -struct _htmlElemDesc { - const char *name; /* The tag name */ - char startTag; /* Whether the start tag can be implied */ - char endTag; /* Whether the end tag can be implied */ - char saveEndTag; /* Whether the end tag should be saved */ - char empty; /* Is this an empty element ? */ - char depr; /* Is this a deprecated element ? */ - char dtd; /* 1: only in Loose DTD, 2: only Frameset one */ - char isinline; /* is this a block 0 or inline 1 element */ - const char *desc; /* the description */ - -/* NRK Jan.2003 - * New fields encapsulating HTML structure - * - * Bugs: - * This is a very limited representation. It fails to tell us when - * an element *requires* subelements (we only have whether they're - * allowed or not), and it doesn't tell us where CDATA and PCDATA - * are allowed. Some element relationships are not fully represented: - * these are flagged with the word MODIFIER - */ - const char** subelts; /* allowed sub-elements of this element */ - const char* defaultsubelt; /* subelement for suggested auto-repair - if necessary or NULL */ - const char** attrs_opt; /* Optional Attributes */ - const char** attrs_depr; /* Additional deprecated attributes */ - const char** attrs_req; /* Required attributes */ -}; - -/* - * Internal description of an HTML entity. - */ -typedef struct _htmlEntityDesc htmlEntityDesc; -typedef htmlEntityDesc *htmlEntityDescPtr; -struct _htmlEntityDesc { - unsigned int value; /* the UNICODE value for the character */ - const char *name; /* The entity name */ - const char *desc; /* the description */ -}; - -/* - * There is only few public functions. - */ -XMLPUBFUN const htmlElemDesc * XMLCALL - htmlTagLookup (const xmlChar *tag); -XMLPUBFUN const htmlEntityDesc * XMLCALL - htmlEntityLookup(const xmlChar *name); -XMLPUBFUN const htmlEntityDesc * XMLCALL - htmlEntityValueLookup(unsigned int value); - -XMLPUBFUN int XMLCALL - htmlIsAutoClosed(htmlDocPtr doc, - htmlNodePtr elem); -XMLPUBFUN int XMLCALL - htmlAutoCloseTag(htmlDocPtr doc, - const xmlChar *name, - htmlNodePtr elem); -XMLPUBFUN const htmlEntityDesc * XMLCALL - htmlParseEntityRef(htmlParserCtxtPtr ctxt, - const xmlChar **str); -XMLPUBFUN int XMLCALL - htmlParseCharRef(htmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - htmlParseElement(htmlParserCtxtPtr ctxt); - -XMLPUBFUN htmlParserCtxtPtr XMLCALL - htmlNewParserCtxt(void); - -XMLPUBFUN htmlParserCtxtPtr XMLCALL - htmlCreateMemoryParserCtxt(const char *buffer, - int size); - -XMLPUBFUN int XMLCALL - htmlParseDocument(htmlParserCtxtPtr ctxt); -XMLPUBFUN htmlDocPtr XMLCALL - htmlSAXParseDoc (xmlChar *cur, - const char *encoding, - htmlSAXHandlerPtr sax, - void *userData); -XMLPUBFUN htmlDocPtr XMLCALL - htmlParseDoc (xmlChar *cur, - const char *encoding); -XMLPUBFUN htmlDocPtr XMLCALL - htmlSAXParseFile(const char *filename, - const char *encoding, - htmlSAXHandlerPtr sax, - void *userData); -XMLPUBFUN htmlDocPtr XMLCALL - htmlParseFile (const char *filename, - const char *encoding); -XMLPUBFUN int XMLCALL - UTF8ToHtml (unsigned char *out, - int *outlen, - const unsigned char *in, - int *inlen); -XMLPUBFUN int XMLCALL - htmlEncodeEntities(unsigned char *out, - int *outlen, - const unsigned char *in, - int *inlen, int quoteChar); -XMLPUBFUN int XMLCALL - htmlIsScriptAttribute(const xmlChar *name); -XMLPUBFUN int XMLCALL - htmlHandleOmittedElem(int val); - -#ifdef LIBXML_PUSH_ENABLED -/** - * Interfaces for the Push mode. - */ -XMLPUBFUN htmlParserCtxtPtr XMLCALL - htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, - void *user_data, - const char *chunk, - int size, - const char *filename, - xmlCharEncoding enc); -XMLPUBFUN int XMLCALL - htmlParseChunk (htmlParserCtxtPtr ctxt, - const char *chunk, - int size, - int terminate); -#endif /* LIBXML_PUSH_ENABLED */ - -XMLPUBFUN void XMLCALL - htmlFreeParserCtxt (htmlParserCtxtPtr ctxt); - -/* - * New set of simpler/more flexible APIs - */ -/** - * xmlParserOption: - * - * This is the set of XML parser options that can be passed down - * to the xmlReadDoc() and similar calls. - */ -typedef enum { - HTML_PARSE_RECOVER = 1<<0, /* Relaxed parsing */ - HTML_PARSE_NOERROR = 1<<5, /* suppress error reports */ - HTML_PARSE_NOWARNING= 1<<6, /* suppress warning reports */ - HTML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */ - HTML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */ - HTML_PARSE_NONET = 1<<11,/* Forbid network access */ - HTML_PARSE_COMPACT = 1<<16 /* compact small text nodes */ -} htmlParserOption; - -XMLPUBFUN void XMLCALL - htmlCtxtReset (htmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - htmlCtxtUseOptions (htmlParserCtxtPtr ctxt, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlReadDoc (const xmlChar *cur, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlReadFile (const char *URL, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlReadMemory (const char *buffer, - int size, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlReadFd (int fd, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlReadIO (xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, - void *ioctx, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlCtxtReadDoc (xmlParserCtxtPtr ctxt, - const xmlChar *cur, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlCtxtReadFile (xmlParserCtxtPtr ctxt, - const char *filename, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlCtxtReadMemory (xmlParserCtxtPtr ctxt, - const char *buffer, - int size, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlCtxtReadFd (xmlParserCtxtPtr ctxt, - int fd, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN htmlDocPtr XMLCALL - htmlCtxtReadIO (xmlParserCtxtPtr ctxt, - xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, - void *ioctx, - const char *URL, - const char *encoding, - int options); - -/* NRK/Jan2003: further knowledge of HTML structure - */ -typedef enum { - HTML_NA = 0 , /* something we don't check at all */ - HTML_INVALID = 0x1 , - HTML_DEPRECATED = 0x2 , - HTML_VALID = 0x4 , - HTML_REQUIRED = 0xc /* VALID bit set so ( & HTML_VALID ) is TRUE */ -} htmlStatus ; - -/* Using htmlElemDesc rather than name here, to emphasise the fact - that otherwise there's a lookup overhead -*/ -XMLPUBFUN htmlStatus XMLCALL htmlAttrAllowed(const htmlElemDesc*, const xmlChar*, int) ; -XMLPUBFUN int XMLCALL htmlElementAllowedHere(const htmlElemDesc*, const xmlChar*) ; -XMLPUBFUN htmlStatus XMLCALL htmlElementStatusHere(const htmlElemDesc*, const htmlElemDesc*) ; -XMLPUBFUN htmlStatus XMLCALL htmlNodeStatus(const htmlNodePtr, int) ; -/** - * htmlDefaultSubelement: - * @elt: HTML element - * - * Returns the default subelement for this element - */ -#define htmlDefaultSubelement(elt) elt->defaultsubelt -/** - * htmlElementAllowedHereDesc: - * @parent: HTML parent element - * @elt: HTML element - * - * Checks whether an HTML element description may be a - * direct child of the specified element. - * - * Returns 1 if allowed; 0 otherwise. - */ -#define htmlElementAllowedHereDesc(parent,elt) \ - htmlElementAllowedHere((parent), (elt)->name) -/** - * htmlRequiredAttrs: - * @elt: HTML element - * - * Returns the attributes required for the specified element. - */ -#define htmlRequiredAttrs(elt) (elt)->attrs_req - - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_HTML_ENABLED */ -#endif /* __HTML_PARSER_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/HTMLtree.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/HTMLtree.h deleted file mode 100644 index afe1bdd6f31..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/HTMLtree.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Summary: specific APIs to process HTML tree, especially serialization - * Description: this module implements a few function needed to process - * tree in an HTML specific way. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __HTML_TREE_H__ -#define __HTML_TREE_H__ - -#include <stdio.h> -#include "xmlversion.h" -#include "tree.h" -#include "HTMLparser.h" - -#ifdef LIBXML_HTML_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * HTML_TEXT_NODE: - * - * Macro. A text node in a HTML document is really implemented - * the same way as a text node in an XML document. - */ -#define HTML_TEXT_NODE XML_TEXT_NODE -/** - * HTML_ENTITY_REF_NODE: - * - * Macro. An entity reference in a HTML document is really implemented - * the same way as an entity reference in an XML document. - */ -#define HTML_ENTITY_REF_NODE XML_ENTITY_REF_NODE -/** - * HTML_COMMENT_NODE: - * - * Macro. A comment in a HTML document is really implemented - * the same way as a comment in an XML document. - */ -#define HTML_COMMENT_NODE XML_COMMENT_NODE -/** - * HTML_PRESERVE_NODE: - * - * Macro. A preserved node in a HTML document is really implemented - * the same way as a CDATA section in an XML document. - */ -#define HTML_PRESERVE_NODE XML_CDATA_SECTION_NODE -/** - * HTML_PI_NODE: - * - * Macro. A processing instruction in a HTML document is really implemented - * the same way as a processing instruction in an XML document. - */ -#define HTML_PI_NODE XML_PI_NODE - -XMLPUBFUN htmlDocPtr XMLCALL - htmlNewDoc (const xmlChar *URI, - const xmlChar *ExternalID); -XMLPUBFUN htmlDocPtr XMLCALL - htmlNewDocNoDtD (const xmlChar *URI, - const xmlChar *ExternalID); -XMLPUBFUN const xmlChar * XMLCALL - htmlGetMetaEncoding (htmlDocPtr doc); -XMLPUBFUN int XMLCALL - htmlSetMetaEncoding (htmlDocPtr doc, - const xmlChar *encoding); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - htmlDocDumpMemory (xmlDocPtr cur, - xmlChar **mem, - int *size); -XMLPUBFUN void XMLCALL - htmlDocDumpMemoryFormat (xmlDocPtr cur, - xmlChar **mem, - int *size, - int format); -XMLPUBFUN int XMLCALL - htmlDocDump (FILE *f, - xmlDocPtr cur); -XMLPUBFUN int XMLCALL - htmlSaveFile (const char *filename, - xmlDocPtr cur); -XMLPUBFUN int XMLCALL - htmlNodeDump (xmlBufferPtr buf, - xmlDocPtr doc, - xmlNodePtr cur); -XMLPUBFUN void XMLCALL - htmlNodeDumpFile (FILE *out, - xmlDocPtr doc, - xmlNodePtr cur); -XMLPUBFUN int XMLCALL - htmlNodeDumpFileFormat (FILE *out, - xmlDocPtr doc, - xmlNodePtr cur, - const char *encoding, - int format); -XMLPUBFUN int XMLCALL - htmlSaveFileEnc (const char *filename, - xmlDocPtr cur, - const char *encoding); -XMLPUBFUN int XMLCALL - htmlSaveFileFormat (const char *filename, - xmlDocPtr cur, - const char *encoding, - int format); - -XMLPUBFUN void XMLCALL - htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, - xmlDocPtr doc, - xmlNodePtr cur, - const char *encoding, - int format); -XMLPUBFUN void XMLCALL - htmlDocContentDumpOutput(xmlOutputBufferPtr buf, - xmlDocPtr cur, - const char *encoding); -XMLPUBFUN void XMLCALL - htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, - xmlDocPtr cur, - const char *encoding, - int format); -XMLPUBFUN void XMLCALL - htmlNodeDumpOutput (xmlOutputBufferPtr buf, - xmlDocPtr doc, - xmlNodePtr cur, - const char *encoding); - -#endif /* LIBXML_OUTPUT_ENABLED */ - -XMLPUBFUN int XMLCALL - htmlIsBooleanAttr (const xmlChar *name); - - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_HTML_ENABLED */ - -#endif /* __HTML_TREE_H__ */ - diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/SAX.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/SAX.h deleted file mode 100644 index e95c12390e7..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/SAX.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Summary: Old SAX version 1 handler, deprecated - * Description: DEPRECATED set of SAX version 1 interfaces used to - * build the DOM tree. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - - -#ifndef __XML_SAX_H__ -#define __XML_SAX_H__ - -#include <stdio.h> -#include <stdlib.h> -#include "xmlversion.h" -#include "parser.h" -#include "xlink.h" - -#ifdef LIBXML_LEGACY_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif -XMLPUBFUN const xmlChar * XMLCALL - getPublicId (void *ctx); -XMLPUBFUN const xmlChar * XMLCALL - getSystemId (void *ctx); -XMLPUBFUN void XMLCALL - setDocumentLocator (void *ctx, - xmlSAXLocatorPtr loc); - -XMLPUBFUN int XMLCALL - getLineNumber (void *ctx); -XMLPUBFUN int XMLCALL - getColumnNumber (void *ctx); - -XMLPUBFUN int XMLCALL - isStandalone (void *ctx); -XMLPUBFUN int XMLCALL - hasInternalSubset (void *ctx); -XMLPUBFUN int XMLCALL - hasExternalSubset (void *ctx); - -XMLPUBFUN void XMLCALL - internalSubset (void *ctx, - const xmlChar *name, - const xmlChar *ExternalID, - const xmlChar *SystemID); -XMLPUBFUN void XMLCALL - externalSubset (void *ctx, - const xmlChar *name, - const xmlChar *ExternalID, - const xmlChar *SystemID); -XMLPUBFUN xmlEntityPtr XMLCALL - getEntity (void *ctx, - const xmlChar *name); -XMLPUBFUN xmlEntityPtr XMLCALL - getParameterEntity (void *ctx, - const xmlChar *name); -XMLPUBFUN xmlParserInputPtr XMLCALL - resolveEntity (void *ctx, - const xmlChar *publicId, - const xmlChar *systemId); - -XMLPUBFUN void XMLCALL - entityDecl (void *ctx, - const xmlChar *name, - int type, - const xmlChar *publicId, - const xmlChar *systemId, - xmlChar *content); -XMLPUBFUN void XMLCALL - attributeDecl (void *ctx, - const xmlChar *elem, - const xmlChar *fullname, - int type, - int def, - const xmlChar *defaultValue, - xmlEnumerationPtr tree); -XMLPUBFUN void XMLCALL - elementDecl (void *ctx, - const xmlChar *name, - int type, - xmlElementContentPtr content); -XMLPUBFUN void XMLCALL - notationDecl (void *ctx, - const xmlChar *name, - const xmlChar *publicId, - const xmlChar *systemId); -XMLPUBFUN void XMLCALL - unparsedEntityDecl (void *ctx, - const xmlChar *name, - const xmlChar *publicId, - const xmlChar *systemId, - const xmlChar *notationName); - -XMLPUBFUN void XMLCALL - startDocument (void *ctx); -XMLPUBFUN void XMLCALL - endDocument (void *ctx); -XMLPUBFUN void XMLCALL - attribute (void *ctx, - const xmlChar *fullname, - const xmlChar *value); -XMLPUBFUN void XMLCALL - startElement (void *ctx, - const xmlChar *fullname, - const xmlChar **atts); -XMLPUBFUN void XMLCALL - endElement (void *ctx, - const xmlChar *name); -XMLPUBFUN void XMLCALL - characters (void *ctx, - const xmlChar *ch, - int len); -XMLPUBFUN void XMLCALL - ignorableWhitespace (void *ctx, - const xmlChar *ch, - int len); -XMLPUBFUN void XMLCALL - processingInstruction (void *ctx, - const xmlChar *target, - const xmlChar *data); -XMLPUBFUN void XMLCALL - globalNamespace (void *ctx, - const xmlChar *href, - const xmlChar *prefix); -XMLPUBFUN void XMLCALL - setNamespace (void *ctx, - const xmlChar *name); -XMLPUBFUN xmlNsPtr XMLCALL - getNamespace (void *ctx); -XMLPUBFUN int XMLCALL - checkNamespace (void *ctx, - xmlChar *nameSpace); -XMLPUBFUN void XMLCALL - namespaceDecl (void *ctx, - const xmlChar *href, - const xmlChar *prefix); -XMLPUBFUN void XMLCALL - comment (void *ctx, - const xmlChar *value); -XMLPUBFUN void XMLCALL - cdataBlock (void *ctx, - const xmlChar *value, - int len); - -#ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN void XMLCALL - initxmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr, - int warning); -#ifdef LIBXML_HTML_ENABLED -XMLPUBFUN void XMLCALL - inithtmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr); -#endif -#ifdef LIBXML_DOCB_ENABLED -XMLPUBFUN void XMLCALL - initdocbDefaultSAXHandler (xmlSAXHandlerV1 *hdlr); -#endif -#endif /* LIBXML_SAX1_ENABLED */ - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_LEGACY_ENABLED */ - -#endif /* __XML_SAX_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/SAX2.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/SAX2.h deleted file mode 100644 index 3eb0b173ed7..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/SAX2.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Summary: SAX2 parser interface used to build the DOM tree - * Description: those are the default SAX2 interfaces used by - * the library when building DOM tree. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - - -#ifndef __XML_SAX2_H__ -#define __XML_SAX2_H__ - -#include <stdio.h> -#include <stdlib.h> -#include "xmlversion.h" -#include "parser.h" -#include "xlink.h" - -#ifdef __cplusplus -extern "C" { -#endif -XMLPUBFUN const xmlChar * XMLCALL - xmlSAX2GetPublicId (void *ctx); -XMLPUBFUN const xmlChar * XMLCALL - xmlSAX2GetSystemId (void *ctx); -XMLPUBFUN void XMLCALL - xmlSAX2SetDocumentLocator (void *ctx, - xmlSAXLocatorPtr loc); - -XMLPUBFUN int XMLCALL - xmlSAX2GetLineNumber (void *ctx); -XMLPUBFUN int XMLCALL - xmlSAX2GetColumnNumber (void *ctx); - -XMLPUBFUN int XMLCALL - xmlSAX2IsStandalone (void *ctx); -XMLPUBFUN int XMLCALL - xmlSAX2HasInternalSubset (void *ctx); -XMLPUBFUN int XMLCALL - xmlSAX2HasExternalSubset (void *ctx); - -XMLPUBFUN void XMLCALL - xmlSAX2InternalSubset (void *ctx, - const xmlChar *name, - const xmlChar *ExternalID, - const xmlChar *SystemID); -XMLPUBFUN void XMLCALL - xmlSAX2ExternalSubset (void *ctx, - const xmlChar *name, - const xmlChar *ExternalID, - const xmlChar *SystemID); -XMLPUBFUN xmlEntityPtr XMLCALL - xmlSAX2GetEntity (void *ctx, - const xmlChar *name); -XMLPUBFUN xmlEntityPtr XMLCALL - xmlSAX2GetParameterEntity (void *ctx, - const xmlChar *name); -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlSAX2ResolveEntity (void *ctx, - const xmlChar *publicId, - const xmlChar *systemId); - -XMLPUBFUN void XMLCALL - xmlSAX2EntityDecl (void *ctx, - const xmlChar *name, - int type, - const xmlChar *publicId, - const xmlChar *systemId, - xmlChar *content); -XMLPUBFUN void XMLCALL - xmlSAX2AttributeDecl (void *ctx, - const xmlChar *elem, - const xmlChar *fullname, - int type, - int def, - const xmlChar *defaultValue, - xmlEnumerationPtr tree); -XMLPUBFUN void XMLCALL - xmlSAX2ElementDecl (void *ctx, - const xmlChar *name, - int type, - xmlElementContentPtr content); -XMLPUBFUN void XMLCALL - xmlSAX2NotationDecl (void *ctx, - const xmlChar *name, - const xmlChar *publicId, - const xmlChar *systemId); -XMLPUBFUN void XMLCALL - xmlSAX2UnparsedEntityDecl (void *ctx, - const xmlChar *name, - const xmlChar *publicId, - const xmlChar *systemId, - const xmlChar *notationName); - -XMLPUBFUN void XMLCALL - xmlSAX2StartDocument (void *ctx); -XMLPUBFUN void XMLCALL - xmlSAX2EndDocument (void *ctx); -#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) -XMLPUBFUN void XMLCALL - xmlSAX2StartElement (void *ctx, - const xmlChar *fullname, - const xmlChar **atts); -XMLPUBFUN void XMLCALL - xmlSAX2EndElement (void *ctx, - const xmlChar *name); -#endif /* LIBXML_SAX1_ENABLED or LIBXML_HTML_ENABLED */ -XMLPUBFUN void XMLCALL - xmlSAX2StartElementNs (void *ctx, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI, - int nb_namespaces, - const xmlChar **namespaces, - int nb_attributes, - int nb_defaulted, - const xmlChar **attributes); -XMLPUBFUN void XMLCALL - xmlSAX2EndElementNs (void *ctx, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI); -XMLPUBFUN void XMLCALL - xmlSAX2Reference (void *ctx, - const xmlChar *name); -XMLPUBFUN void XMLCALL - xmlSAX2Characters (void *ctx, - const xmlChar *ch, - int len); -XMLPUBFUN void XMLCALL - xmlSAX2IgnorableWhitespace (void *ctx, - const xmlChar *ch, - int len); -XMLPUBFUN void XMLCALL - xmlSAX2ProcessingInstruction (void *ctx, - const xmlChar *target, - const xmlChar *data); -XMLPUBFUN void XMLCALL - xmlSAX2Comment (void *ctx, - const xmlChar *value); -XMLPUBFUN void XMLCALL - xmlSAX2CDataBlock (void *ctx, - const xmlChar *value, - int len); - -#ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN int XMLCALL - xmlSAXDefaultVersion (int version); -#endif /* LIBXML_SAX1_ENABLED */ - -XMLPUBFUN int XMLCALL - xmlSAXVersion (xmlSAXHandler *hdlr, - int version); -XMLPUBFUN void XMLCALL - xmlSAX2InitDefaultSAXHandler (xmlSAXHandler *hdlr, - int warning); -#ifdef LIBXML_HTML_ENABLED -XMLPUBFUN void XMLCALL - xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr); -XMLPUBFUN void XMLCALL - htmlDefaultSAXHandlerInit (void); -#endif -#ifdef LIBXML_DOCB_ENABLED -XMLPUBFUN void XMLCALL - xmlSAX2InitDocbDefaultSAXHandler(xmlSAXHandler *hdlr); -XMLPUBFUN void XMLCALL - docbDefaultSAXHandlerInit (void); -#endif -XMLPUBFUN void XMLCALL - xmlDefaultSAXHandlerInit (void); -#ifdef __cplusplus -} -#endif -#endif /* __XML_SAX2_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/c14n.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/c14n.h deleted file mode 100644 index 1c22f798a9b..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/c14n.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Summary: Provide Canonical XML and Exclusive XML Canonicalization - * Description: the c14n modules provides a - * - * "Canonical XML" implementation - * http://www.w3.org/TR/xml-c14n - * - * and an - * - * "Exclusive XML Canonicalization" implementation - * http://www.w3.org/TR/xml-exc-c14n - - * Copy: See Copyright for the status of this software. - * - * Author: Aleksey Sanin <aleksey@aleksey.com> - */ -#ifndef __XML_C14N_H__ -#define __XML_C14N_H__ -#ifdef LIBXML_C14N_ENABLED -#ifdef LIBXML_OUTPUT_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "xmlversion.h" -#include "tree.h" -#include "xpath.h" - -/* - * XML Canonicazation - * http://www.w3.org/TR/xml-c14n - * - * Exclusive XML Canonicazation - * http://www.w3.org/TR/xml-exc-c14n - * - * Canonical form of an XML document could be created if and only if - * a) default attributes (if any) are added to all nodes - * b) all character and parsed entity references are resolved - * In order to achive this in libxml2 the document MUST be loaded with - * following global setings: - * - * xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; - * xmlSubstituteEntitiesDefault(1); - * - * or corresponding parser context setting: - * xmlParserCtxtPtr ctxt; - * - * ... - * ctxt->loadsubset = XML_DETECT_IDS | XML_COMPLETE_ATTRS; - * ctxt->replaceEntities = 1; - * ... - */ - - -XMLPUBFUN int XMLCALL - xmlC14NDocSaveTo (xmlDocPtr doc, - xmlNodeSetPtr nodes, - int exclusive, - xmlChar **inclusive_ns_prefixes, - int with_comments, - xmlOutputBufferPtr buf); - -XMLPUBFUN int XMLCALL - xmlC14NDocDumpMemory (xmlDocPtr doc, - xmlNodeSetPtr nodes, - int exclusive, - xmlChar **inclusive_ns_prefixes, - int with_comments, - xmlChar **doc_txt_ptr); - -XMLPUBFUN int XMLCALL - xmlC14NDocSave (xmlDocPtr doc, - xmlNodeSetPtr nodes, - int exclusive, - xmlChar **inclusive_ns_prefixes, - int with_comments, - const char* filename, - int compression); - - -/** - * This is the core C14N function - */ -typedef int (*xmlC14NIsVisibleCallback) (void* user_data, - xmlNodePtr node, - xmlNodePtr parent); - -XMLPUBFUN int XMLCALL - xmlC14NExecute (xmlDocPtr doc, - xmlC14NIsVisibleCallback is_visible_callback, - void* user_data, - int exclusive, - xmlChar **inclusive_ns_prefixes, - int with_comments, - xmlOutputBufferPtr buf); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* LIBXML_OUTPUT_ENABLED */ -#endif /* LIBXML_C14N_ENABLED */ -#endif /* __XML_C14N_H__ */ - diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/catalog.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/catalog.h deleted file mode 100644 index b08fd2b5420..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/catalog.h +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Summary: interfaces to the Catalog handling system - * Description: the catalog module implements the support for - * XML Catalogs and SGML catalogs - * - * SGML Open Technical Resolution TR9401:1997. - * http://www.jclark.com/sp/catalog.htm - * - * XML Catalogs Working Draft 06 August 2001 - * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_CATALOG_H__ -#define __XML_CATALOG_H__ - -#include <stdio.h> - -#include "xmlversion.h" -#include "xmlstring.h" -#include "tree.h" - -#ifdef LIBXML_CATALOG_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * XML_CATALOGS_NAMESPACE: - * - * The namespace for the XML Catalogs elements. - */ -#define XML_CATALOGS_NAMESPACE \ - (const xmlChar *) "urn:oasis:names:tc:entity:xmlns:xml:catalog" -/** - * XML_CATALOG_PI: - * - * The specific XML Catalog Processing Instuction name. - */ -#define XML_CATALOG_PI \ - (const xmlChar *) "oasis-xml-catalog" - -/* - * The API is voluntarily limited to general cataloging. - */ -typedef enum { - XML_CATA_PREFER_NONE = 0, - XML_CATA_PREFER_PUBLIC = 1, - XML_CATA_PREFER_SYSTEM -} xmlCatalogPrefer; - -typedef enum { - XML_CATA_ALLOW_NONE = 0, - XML_CATA_ALLOW_GLOBAL = 1, - XML_CATA_ALLOW_DOCUMENT = 2, - XML_CATA_ALLOW_ALL = 3 -} xmlCatalogAllow; - -typedef struct _xmlCatalog xmlCatalog; -typedef xmlCatalog *xmlCatalogPtr; - -/* - * Operations on a given catalog. - */ -XMLPUBFUN xmlCatalogPtr XMLCALL - xmlNewCatalog (int sgml); -XMLPUBFUN xmlCatalogPtr XMLCALL - xmlLoadACatalog (const char *filename); -XMLPUBFUN xmlCatalogPtr XMLCALL - xmlLoadSGMLSuperCatalog (const char *filename); -XMLPUBFUN int XMLCALL - xmlConvertSGMLCatalog (xmlCatalogPtr catal); -XMLPUBFUN int XMLCALL - xmlACatalogAdd (xmlCatalogPtr catal, - const xmlChar *type, - const xmlChar *orig, - const xmlChar *replace); -XMLPUBFUN int XMLCALL - xmlACatalogRemove (xmlCatalogPtr catal, - const xmlChar *value); -XMLPUBFUN xmlChar * XMLCALL - xmlACatalogResolve (xmlCatalogPtr catal, - const xmlChar *pubID, - const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL - xmlACatalogResolveSystem(xmlCatalogPtr catal, - const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL - xmlACatalogResolvePublic(xmlCatalogPtr catal, - const xmlChar *pubID); -XMLPUBFUN xmlChar * XMLCALL - xmlACatalogResolveURI (xmlCatalogPtr catal, - const xmlChar *URI); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlACatalogDump (xmlCatalogPtr catal, - FILE *out); -#endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN void XMLCALL - xmlFreeCatalog (xmlCatalogPtr catal); -XMLPUBFUN int XMLCALL - xmlCatalogIsEmpty (xmlCatalogPtr catal); - -/* - * Global operations. - */ -XMLPUBFUN void XMLCALL - xmlInitializeCatalog (void); -XMLPUBFUN int XMLCALL - xmlLoadCatalog (const char *filename); -XMLPUBFUN void XMLCALL - xmlLoadCatalogs (const char *paths); -XMLPUBFUN void XMLCALL - xmlCatalogCleanup (void); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlCatalogDump (FILE *out); -#endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN xmlChar * XMLCALL - xmlCatalogResolve (const xmlChar *pubID, - const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL - xmlCatalogResolveSystem (const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL - xmlCatalogResolvePublic (const xmlChar *pubID); -XMLPUBFUN xmlChar * XMLCALL - xmlCatalogResolveURI (const xmlChar *URI); -XMLPUBFUN int XMLCALL - xmlCatalogAdd (const xmlChar *type, - const xmlChar *orig, - const xmlChar *replace); -XMLPUBFUN int XMLCALL - xmlCatalogRemove (const xmlChar *value); -XMLPUBFUN xmlDocPtr XMLCALL - xmlParseCatalogFile (const char *filename); -XMLPUBFUN int XMLCALL - xmlCatalogConvert (void); - -/* - * Strictly minimal interfaces for per-document catalogs used - * by the parser. - */ -XMLPUBFUN void XMLCALL - xmlCatalogFreeLocal (void *catalogs); -XMLPUBFUN void * XMLCALL - xmlCatalogAddLocal (void *catalogs, - const xmlChar *URL); -XMLPUBFUN xmlChar * XMLCALL - xmlCatalogLocalResolve (void *catalogs, - const xmlChar *pubID, - const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL - xmlCatalogLocalResolveURI(void *catalogs, - const xmlChar *URI); -/* - * Preference settings. - */ -XMLPUBFUN int XMLCALL - xmlCatalogSetDebug (int level); -XMLPUBFUN xmlCatalogPrefer XMLCALL - xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer); -XMLPUBFUN void XMLCALL - xmlCatalogSetDefaults (xmlCatalogAllow allow); -XMLPUBFUN xmlCatalogAllow XMLCALL - xmlCatalogGetDefaults (void); - - -/* DEPRECATED interfaces */ -XMLPUBFUN const xmlChar * XMLCALL - xmlCatalogGetSystem (const xmlChar *sysID); -XMLPUBFUN const xmlChar * XMLCALL - xmlCatalogGetPublic (const xmlChar *pubID); - -#ifdef __cplusplus -} -#endif -#endif /* LIBXML_CATALOG_ENABLED */ -#endif /* __XML_CATALOG_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/chvalid.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/chvalid.h deleted file mode 100644 index 855c7493e23..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/chvalid.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Summary: Unicode character range checking - * Description: this module exports interfaces for the character - * range validation APIs - * - * This file is automatically generated from the cvs source - * definition files using the genChRanges.py Python script - * - * Generation date: Mon Mar 27 11:09:48 2006 - * Sources: chvalid.def - * Author: William Brack <wbrack@mmm.com.hk> - */ - -#ifndef __XML_CHVALID_H__ -#define __XML_CHVALID_H__ - -#include "xmlversion.h" -#include "xmlstring.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Define our typedefs and structures - * - */ -typedef struct _xmlChSRange xmlChSRange; -typedef xmlChSRange *xmlChSRangePtr; -struct _xmlChSRange { - unsigned short low; - unsigned short high; -}; - -typedef struct _xmlChLRange xmlChLRange; -typedef xmlChLRange *xmlChLRangePtr; -struct _xmlChLRange { - unsigned int low; - unsigned int high; -}; - -typedef struct _xmlChRangeGroup xmlChRangeGroup; -typedef xmlChRangeGroup *xmlChRangeGroupPtr; -struct _xmlChRangeGroup { - int nbShortRange; - int nbLongRange; - const xmlChSRange *shortRange; /* points to an array of ranges */ - const xmlChLRange *longRange; -}; - -/** - * Range checking routine - */ -XMLPUBFUN int XMLCALL - xmlCharInRange(unsigned int val, const xmlChRangeGroup *group); - - -/** - * xmlIsBaseChar_ch: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsBaseChar_ch(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \ - ((0x61 <= (c)) && ((c) <= 0x7a)) || \ - ((0xc0 <= (c)) && ((c) <= 0xd6)) || \ - ((0xd8 <= (c)) && ((c) <= 0xf6)) || \ - (0xf8 <= (c))) - -/** - * xmlIsBaseCharQ: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsBaseCharQ(c) (((c) < 0x100) ? \ - xmlIsBaseChar_ch((c)) : \ - xmlCharInRange((c), &xmlIsBaseCharGroup)) - -XMLPUBVAR const xmlChRangeGroup xmlIsBaseCharGroup; - -/** - * xmlIsBlank_ch: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsBlank_ch(c) (((c) == 0x20) || \ - ((0x9 <= (c)) && ((c) <= 0xa)) || \ - ((c) == 0xd)) - -/** - * xmlIsBlankQ: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsBlankQ(c) (((c) < 0x100) ? \ - xmlIsBlank_ch((c)) : 0) - - -/** - * xmlIsChar_ch: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsChar_ch(c) (((0x9 <= (c)) && ((c) <= 0xa)) || \ - ((c) == 0xd) || \ - (0x20 <= (c))) - -/** - * xmlIsCharQ: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsCharQ(c) (((c) < 0x100) ? \ - xmlIsChar_ch((c)) :\ - (((0x100 <= (c)) && ((c) <= 0xd7ff)) || \ - ((0xe000 <= (c)) && ((c) <= 0xfffd)) || \ - ((0x10000 <= (c)) && ((c) <= 0x10ffff)))) - -XMLPUBVAR const xmlChRangeGroup xmlIsCharGroup; - -/** - * xmlIsCombiningQ: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsCombiningQ(c) (((c) < 0x100) ? \ - 0 : \ - xmlCharInRange((c), &xmlIsCombiningGroup)) - -XMLPUBVAR const xmlChRangeGroup xmlIsCombiningGroup; - -/** - * xmlIsDigit_ch: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsDigit_ch(c) (((0x30 <= (c)) && ((c) <= 0x39))) - -/** - * xmlIsDigitQ: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsDigitQ(c) (((c) < 0x100) ? \ - xmlIsDigit_ch((c)) : \ - xmlCharInRange((c), &xmlIsDigitGroup)) - -XMLPUBVAR const xmlChRangeGroup xmlIsDigitGroup; - -/** - * xmlIsExtender_ch: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsExtender_ch(c) (((c) == 0xb7)) - -/** - * xmlIsExtenderQ: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsExtenderQ(c) (((c) < 0x100) ? \ - xmlIsExtender_ch((c)) : \ - xmlCharInRange((c), &xmlIsExtenderGroup)) - -XMLPUBVAR const xmlChRangeGroup xmlIsExtenderGroup; - -/** - * xmlIsIdeographicQ: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsIdeographicQ(c) (((c) < 0x100) ? \ - 0 :\ - (((0x4e00 <= (c)) && ((c) <= 0x9fa5)) || \ - ((c) == 0x3007) || \ - ((0x3021 <= (c)) && ((c) <= 0x3029)))) - -XMLPUBVAR const xmlChRangeGroup xmlIsIdeographicGroup; -XMLPUBVAR const unsigned char xmlIsPubidChar_tab[256]; - -/** - * xmlIsPubidChar_ch: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsPubidChar_ch(c) (xmlIsPubidChar_tab[(c)]) - -/** - * xmlIsPubidCharQ: - * @c: char to validate - * - * Automatically generated by genChRanges.py - */ -#define xmlIsPubidCharQ(c) (((c) < 0x100) ? \ - xmlIsPubidChar_ch((c)) : 0) - -XMLPUBFUN int XMLCALL - xmlIsBaseChar(unsigned int ch); -XMLPUBFUN int XMLCALL - xmlIsBlank(unsigned int ch); -XMLPUBFUN int XMLCALL - xmlIsChar(unsigned int ch); -XMLPUBFUN int XMLCALL - xmlIsCombining(unsigned int ch); -XMLPUBFUN int XMLCALL - xmlIsDigit(unsigned int ch); -XMLPUBFUN int XMLCALL - xmlIsExtender(unsigned int ch); -XMLPUBFUN int XMLCALL - xmlIsIdeographic(unsigned int ch); -XMLPUBFUN int XMLCALL - xmlIsPubidChar(unsigned int ch); - -#ifdef __cplusplus -} -#endif -#endif /* __XML_CHVALID_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/debugXML.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/debugXML.h deleted file mode 100644 index 01acdaf1a3c..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/debugXML.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Summary: Tree debugging APIs - * Description: Interfaces to a set of routines used for debugging the tree - * produced by the XML parser. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __DEBUG_XML__ -#define __DEBUG_XML__ -#include <stdio.h> -#include "xmlversion.h" -#include "tree.h" - -#ifdef LIBXML_DEBUG_ENABLED - -#include "xpath.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * The standard Dump routines. - */ -XMLPUBFUN void XMLCALL - xmlDebugDumpString (FILE *output, - const xmlChar *str); -XMLPUBFUN void XMLCALL - xmlDebugDumpAttr (FILE *output, - xmlAttrPtr attr, - int depth); -XMLPUBFUN void XMLCALL - xmlDebugDumpAttrList (FILE *output, - xmlAttrPtr attr, - int depth); -XMLPUBFUN void XMLCALL - xmlDebugDumpOneNode (FILE *output, - xmlNodePtr node, - int depth); -XMLPUBFUN void XMLCALL - xmlDebugDumpNode (FILE *output, - xmlNodePtr node, - int depth); -XMLPUBFUN void XMLCALL - xmlDebugDumpNodeList (FILE *output, - xmlNodePtr node, - int depth); -XMLPUBFUN void XMLCALL - xmlDebugDumpDocumentHead(FILE *output, - xmlDocPtr doc); -XMLPUBFUN void XMLCALL - xmlDebugDumpDocument (FILE *output, - xmlDocPtr doc); -XMLPUBFUN void XMLCALL - xmlDebugDumpDTD (FILE *output, - xmlDtdPtr dtd); -XMLPUBFUN void XMLCALL - xmlDebugDumpEntities (FILE *output, - xmlDocPtr doc); - -/**************************************************************** - * * - * Checking routines * - * * - ****************************************************************/ - -XMLPUBFUN int XMLCALL - xmlDebugCheckDocument (FILE * output, - xmlDocPtr doc); - -/**************************************************************** - * * - * XML shell helpers * - * * - ****************************************************************/ - -XMLPUBFUN void XMLCALL - xmlLsOneNode (FILE *output, xmlNodePtr node); -XMLPUBFUN int XMLCALL - xmlLsCountNode (xmlNodePtr node); - -XMLPUBFUN const char * XMLCALL - xmlBoolToText (int boolval); - -/**************************************************************** - * * - * The XML shell related structures and functions * - * * - ****************************************************************/ - -#ifdef LIBXML_XPATH_ENABLED -/** - * xmlShellReadlineFunc: - * @prompt: a string prompt - * - * This is a generic signature for the XML shell input function. - * - * Returns a string which will be freed by the Shell. - */ -typedef char * (* xmlShellReadlineFunc)(char *prompt); - -/** - * xmlShellCtxt: - * - * A debugging shell context. - * TODO: add the defined function tables. - */ -typedef struct _xmlShellCtxt xmlShellCtxt; -typedef xmlShellCtxt *xmlShellCtxtPtr; -struct _xmlShellCtxt { - char *filename; - xmlDocPtr doc; - xmlNodePtr node; - xmlXPathContextPtr pctxt; - int loaded; - FILE *output; - xmlShellReadlineFunc input; -}; - -/** - * xmlShellCmd: - * @ctxt: a shell context - * @arg: a string argument - * @node: a first node - * @node2: a second node - * - * This is a generic signature for the XML shell functions. - * - * Returns an int, negative returns indicating errors. - */ -typedef int (* xmlShellCmd) (xmlShellCtxtPtr ctxt, - char *arg, - xmlNodePtr node, - xmlNodePtr node2); - -XMLPUBFUN void XMLCALL - xmlShellPrintXPathError (int errorType, - const char *arg); -XMLPUBFUN void XMLCALL - xmlShellPrintXPathResult(xmlXPathObjectPtr list); -XMLPUBFUN int XMLCALL - xmlShellList (xmlShellCtxtPtr ctxt, - char *arg, - xmlNodePtr node, - xmlNodePtr node2); -XMLPUBFUN int XMLCALL - xmlShellBase (xmlShellCtxtPtr ctxt, - char *arg, - xmlNodePtr node, - xmlNodePtr node2); -XMLPUBFUN int XMLCALL - xmlShellDir (xmlShellCtxtPtr ctxt, - char *arg, - xmlNodePtr node, - xmlNodePtr node2); -XMLPUBFUN int XMLCALL - xmlShellLoad (xmlShellCtxtPtr ctxt, - char *filename, - xmlNodePtr node, - xmlNodePtr node2); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlShellPrintNode (xmlNodePtr node); -XMLPUBFUN int XMLCALL - xmlShellCat (xmlShellCtxtPtr ctxt, - char *arg, - xmlNodePtr node, - xmlNodePtr node2); -XMLPUBFUN int XMLCALL - xmlShellWrite (xmlShellCtxtPtr ctxt, - char *filename, - xmlNodePtr node, - xmlNodePtr node2); -XMLPUBFUN int XMLCALL - xmlShellSave (xmlShellCtxtPtr ctxt, - char *filename, - xmlNodePtr node, - xmlNodePtr node2); -#endif /* LIBXML_OUTPUT_ENABLED */ -#ifdef LIBXML_VALID_ENABLED -XMLPUBFUN int XMLCALL - xmlShellValidate (xmlShellCtxtPtr ctxt, - char *dtd, - xmlNodePtr node, - xmlNodePtr node2); -#endif /* LIBXML_VALID_ENABLED */ -XMLPUBFUN int XMLCALL - xmlShellDu (xmlShellCtxtPtr ctxt, - char *arg, - xmlNodePtr tree, - xmlNodePtr node2); -XMLPUBFUN int XMLCALL - xmlShellPwd (xmlShellCtxtPtr ctxt, - char *buffer, - xmlNodePtr node, - xmlNodePtr node2); - -/* - * The Shell interface. - */ -XMLPUBFUN void XMLCALL - xmlShell (xmlDocPtr doc, - char *filename, - xmlShellReadlineFunc input, - FILE *output); - -#endif /* LIBXML_XPATH_ENABLED */ - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_DEBUG_ENABLED */ -#endif /* __DEBUG_XML__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/dict.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/dict.h deleted file mode 100644 index 44e248833ca..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/dict.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Summary: string dictionnary - * Description: dictionary of reusable strings, just used to avoid allocation - * and freeing operations. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_DICT_H__ -#define __XML_DICT_H__ - -#include "xmlversion.h" -#include "tree.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * The dictionnary. - */ -typedef struct _xmlDict xmlDict; -typedef xmlDict *xmlDictPtr; - -/* - * Constructor and destructor. - */ -XMLPUBFUN xmlDictPtr XMLCALL - xmlDictCreate (void); -XMLPUBFUN xmlDictPtr XMLCALL - xmlDictCreateSub(xmlDictPtr sub); -XMLPUBFUN int XMLCALL - xmlDictReference(xmlDictPtr dict); -XMLPUBFUN void XMLCALL - xmlDictFree (xmlDictPtr dict); - -/* - * Lookup of entry in the dictionnary. - */ -XMLPUBFUN const xmlChar * XMLCALL - xmlDictLookup (xmlDictPtr dict, - const xmlChar *name, - int len); -XMLPUBFUN const xmlChar * XMLCALL - xmlDictExists (xmlDictPtr dict, - const xmlChar *name, - int len); -XMLPUBFUN const xmlChar * XMLCALL - xmlDictQLookup (xmlDictPtr dict, - const xmlChar *prefix, - const xmlChar *name); -XMLPUBFUN int XMLCALL - xmlDictOwns (xmlDictPtr dict, - const xmlChar *str); -XMLPUBFUN int XMLCALL - xmlDictSize (xmlDictPtr dict); - -/* - * Cleanup function - */ -XMLPUBFUN void XMLCALL - xmlDictCleanup (void); - -#ifdef __cplusplus -} -#endif -#endif /* ! __XML_DICT_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/encoding.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/encoding.h deleted file mode 100644 index 31fc2776176..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/encoding.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Summary: interface for the encoding conversion functions - * Description: interface for the encoding conversion functions needed for - * XML basic encoding and iconv() support. - * - * Related specs are - * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies - * [ISO-10646] UTF-8 and UTF-16 in Annexes - * [ISO-8859-1] ISO Latin-1 characters codes. - * [UNICODE] The Unicode Consortium, "The Unicode Standard -- - * Worldwide Character Encoding -- Version 1.0", Addison- - * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is - * described in Unicode Technical Report #4. - * [US-ASCII] Coded Character Set--7-bit American Standard Code for - * Information Interchange, ANSI X3.4-1986. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_CHAR_ENCODING_H__ -#define __XML_CHAR_ENCODING_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_ICONV_ENABLED -#include <iconv.h> -#endif -#ifdef __cplusplus -extern "C" { -#endif - -/* - * xmlCharEncoding: - * - * Predefined values for some standard encodings. - * Libxml does not do beforehand translation on UTF8 and ISOLatinX. - * It also supports ASCII, ISO-8859-1, and UTF16 (LE and BE) by default. - * - * Anything else would have to be translated to UTF8 before being - * given to the parser itself. The BOM for UTF16 and the encoding - * declaration are looked at and a converter is looked for at that - * point. If not found the parser stops here as asked by the XML REC. A - * converter can be registered by the user using xmlRegisterCharEncodingHandler - * but the current form doesn't allow stateful transcoding (a serious - * problem agreed !). If iconv has been found it will be used - * automatically and allow stateful transcoding, the simplest is then - * to be sure to enable iconv and to provide iconv libs for the encoding - * support needed. - * - * Note that the generic "UTF-16" is not a predefined value. Instead, only - * the specific UTF-16LE and UTF-16BE are present. - */ -typedef enum { - XML_CHAR_ENCODING_ERROR= -1, /* No char encoding detected */ - XML_CHAR_ENCODING_NONE= 0, /* No char encoding detected */ - XML_CHAR_ENCODING_UTF8= 1, /* UTF-8 */ - XML_CHAR_ENCODING_UTF16LE= 2, /* UTF-16 little endian */ - XML_CHAR_ENCODING_UTF16BE= 3, /* UTF-16 big endian */ - XML_CHAR_ENCODING_UCS4LE= 4, /* UCS-4 little endian */ - XML_CHAR_ENCODING_UCS4BE= 5, /* UCS-4 big endian */ - XML_CHAR_ENCODING_EBCDIC= 6, /* EBCDIC uh! */ - XML_CHAR_ENCODING_UCS4_2143=7, /* UCS-4 unusual ordering */ - XML_CHAR_ENCODING_UCS4_3412=8, /* UCS-4 unusual ordering */ - XML_CHAR_ENCODING_UCS2= 9, /* UCS-2 */ - XML_CHAR_ENCODING_8859_1= 10,/* ISO-8859-1 ISO Latin 1 */ - XML_CHAR_ENCODING_8859_2= 11,/* ISO-8859-2 ISO Latin 2 */ - XML_CHAR_ENCODING_8859_3= 12,/* ISO-8859-3 */ - XML_CHAR_ENCODING_8859_4= 13,/* ISO-8859-4 */ - XML_CHAR_ENCODING_8859_5= 14,/* ISO-8859-5 */ - XML_CHAR_ENCODING_8859_6= 15,/* ISO-8859-6 */ - XML_CHAR_ENCODING_8859_7= 16,/* ISO-8859-7 */ - XML_CHAR_ENCODING_8859_8= 17,/* ISO-8859-8 */ - XML_CHAR_ENCODING_8859_9= 18,/* ISO-8859-9 */ - XML_CHAR_ENCODING_2022_JP= 19,/* ISO-2022-JP */ - XML_CHAR_ENCODING_SHIFT_JIS=20,/* Shift_JIS */ - XML_CHAR_ENCODING_EUC_JP= 21,/* EUC-JP */ - XML_CHAR_ENCODING_ASCII= 22 /* pure ASCII */ -} xmlCharEncoding; - -/** - * xmlCharEncodingInputFunc: - * @out: a pointer to an array of bytes to store the UTF-8 result - * @outlen: the length of @out - * @in: a pointer to an array of chars in the original encoding - * @inlen: the length of @in - * - * Take a block of chars in the original encoding and try to convert - * it to an UTF-8 block of chars out. - * - * Returns the number of bytes written, -1 if lack of space, or -2 - * if the transcoding failed. - * The value of @inlen after return is the number of octets consumed - * if the return value is positive, else unpredictiable. - * The value of @outlen after return is the number of octets consumed. - */ -typedef int (* xmlCharEncodingInputFunc)(unsigned char *out, int *outlen, - const unsigned char *in, int *inlen); - - -/** - * xmlCharEncodingOutputFunc: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of UTF-8 chars - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and try to convert it to another - * encoding. - * Note: a first call designed to produce heading info is called with - * in = NULL. If stateful this should also initialize the encoder state. - * - * Returns the number of bytes written, -1 if lack of space, or -2 - * if the transcoding failed. - * The value of @inlen after return is the number of octets consumed - * if the return value is positive, else unpredictiable. - * The value of @outlen after return is the number of octets produced. - */ -typedef int (* xmlCharEncodingOutputFunc)(unsigned char *out, int *outlen, - const unsigned char *in, int *inlen); - - -/* - * Block defining the handlers for non UTF-8 encodings. - * If iconv is supported, there are two extra fields. - */ - -typedef struct _xmlCharEncodingHandler xmlCharEncodingHandler; -typedef xmlCharEncodingHandler *xmlCharEncodingHandlerPtr; -struct _xmlCharEncodingHandler { - char *name; - xmlCharEncodingInputFunc input; - xmlCharEncodingOutputFunc output; -#ifdef LIBXML_ICONV_ENABLED - iconv_t iconv_in; - iconv_t iconv_out; -#endif /* LIBXML_ICONV_ENABLED */ -}; - -#ifdef __cplusplus -} -#endif -#include "tree.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Interfaces for encoding handlers. - */ -XMLPUBFUN void XMLCALL - xmlInitCharEncodingHandlers (void); -XMLPUBFUN void XMLCALL - xmlCleanupCharEncodingHandlers (void); -XMLPUBFUN void XMLCALL - xmlRegisterCharEncodingHandler (xmlCharEncodingHandlerPtr handler); -XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL - xmlGetCharEncodingHandler (xmlCharEncoding enc); -XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL - xmlFindCharEncodingHandler (const char *name); -XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL - xmlNewCharEncodingHandler (const char *name, - xmlCharEncodingInputFunc input, - xmlCharEncodingOutputFunc output); - -/* - * Interfaces for encoding names and aliases. - */ -XMLPUBFUN int XMLCALL - xmlAddEncodingAlias (const char *name, - const char *alias); -XMLPUBFUN int XMLCALL - xmlDelEncodingAlias (const char *alias); -XMLPUBFUN const char * XMLCALL - xmlGetEncodingAlias (const char *alias); -XMLPUBFUN void XMLCALL - xmlCleanupEncodingAliases (void); -XMLPUBFUN xmlCharEncoding XMLCALL - xmlParseCharEncoding (const char *name); -XMLPUBFUN const char * XMLCALL - xmlGetCharEncodingName (xmlCharEncoding enc); - -/* - * Interfaces directly used by the parsers. - */ -XMLPUBFUN xmlCharEncoding XMLCALL - xmlDetectCharEncoding (const unsigned char *in, - int len); - -XMLPUBFUN int XMLCALL - xmlCharEncOutFunc (xmlCharEncodingHandler *handler, - xmlBufferPtr out, - xmlBufferPtr in); - -XMLPUBFUN int XMLCALL - xmlCharEncInFunc (xmlCharEncodingHandler *handler, - xmlBufferPtr out, - xmlBufferPtr in); -XMLPUBFUN int XMLCALL - xmlCharEncFirstLine (xmlCharEncodingHandler *handler, - xmlBufferPtr out, - xmlBufferPtr in); -XMLPUBFUN int XMLCALL - xmlCharEncCloseFunc (xmlCharEncodingHandler *handler); - -/* - * Export a few useful functions - */ -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN int XMLCALL - UTF8Toisolat1 (unsigned char *out, - int *outlen, - const unsigned char *in, - int *inlen); -#endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN int XMLCALL - isolat1ToUTF8 (unsigned char *out, - int *outlen, - const unsigned char *in, - int *inlen); -#ifdef __cplusplus -} -#endif - -#endif /* __XML_CHAR_ENCODING_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/entities.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/entities.h deleted file mode 100644 index 38559909505..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/entities.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Summary: interface for the XML entities handling - * Description: this module provides some of the entity API needed - * for the parser and applications. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_ENTITIES_H__ -#define __XML_ENTITIES_H__ - -#include "xmlversion.h" -#include "tree.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * The different valid entity types. - */ -typedef enum { - XML_INTERNAL_GENERAL_ENTITY = 1, - XML_EXTERNAL_GENERAL_PARSED_ENTITY = 2, - XML_EXTERNAL_GENERAL_UNPARSED_ENTITY = 3, - XML_INTERNAL_PARAMETER_ENTITY = 4, - XML_EXTERNAL_PARAMETER_ENTITY = 5, - XML_INTERNAL_PREDEFINED_ENTITY = 6 -} xmlEntityType; - -/* - * An unit of storage for an entity, contains the string, the value - * and the linkind data needed for the linking in the hash table. - */ - -struct _xmlEntity { - void *_private; /* application data */ - xmlElementType type; /* XML_ENTITY_DECL, must be second ! */ - const xmlChar *name; /* Entity name */ - struct _xmlNode *children; /* First child link */ - struct _xmlNode *last; /* Last child link */ - struct _xmlDtd *parent; /* -> DTD */ - struct _xmlNode *next; /* next sibling link */ - struct _xmlNode *prev; /* previous sibling link */ - struct _xmlDoc *doc; /* the containing document */ - - xmlChar *orig; /* content without ref substitution */ - xmlChar *content; /* content or ndata if unparsed */ - int length; /* the content length */ - xmlEntityType etype; /* The entity type */ - const xmlChar *ExternalID; /* External identifier for PUBLIC */ - const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC Entity */ - - struct _xmlEntity *nexte; /* unused */ - const xmlChar *URI; /* the full URI as computed */ - int owner; /* does the entity own the childrens */ - int checked; /* was the entity content checked */ -}; - -/* - * All entities are stored in an hash table. - * There is 2 separate hash tables for global and parameter entities. - */ - -typedef struct _xmlHashTable xmlEntitiesTable; -typedef xmlEntitiesTable *xmlEntitiesTablePtr; - -/* - * External functions: - */ - -#ifdef LIBXML_LEGACY_ENABLED -XMLPUBFUN void XMLCALL - xmlInitializePredefinedEntities (void); -#endif /* LIBXML_LEGACY_ENABLED */ -XMLPUBFUN xmlEntityPtr XMLCALL - xmlAddDocEntity (xmlDocPtr doc, - const xmlChar *name, - int type, - const xmlChar *ExternalID, - const xmlChar *SystemID, - const xmlChar *content); -XMLPUBFUN xmlEntityPtr XMLCALL - xmlAddDtdEntity (xmlDocPtr doc, - const xmlChar *name, - int type, - const xmlChar *ExternalID, - const xmlChar *SystemID, - const xmlChar *content); -XMLPUBFUN xmlEntityPtr XMLCALL - xmlGetPredefinedEntity (const xmlChar *name); -XMLPUBFUN xmlEntityPtr XMLCALL - xmlGetDocEntity (xmlDocPtr doc, - const xmlChar *name); -XMLPUBFUN xmlEntityPtr XMLCALL - xmlGetDtdEntity (xmlDocPtr doc, - const xmlChar *name); -XMLPUBFUN xmlEntityPtr XMLCALL - xmlGetParameterEntity (xmlDocPtr doc, - const xmlChar *name); -#ifdef LIBXML_LEGACY_ENABLED -XMLPUBFUN const xmlChar * XMLCALL - xmlEncodeEntities (xmlDocPtr doc, - const xmlChar *input); -#endif /* LIBXML_LEGACY_ENABLED */ -XMLPUBFUN xmlChar * XMLCALL - xmlEncodeEntitiesReentrant(xmlDocPtr doc, - const xmlChar *input); -XMLPUBFUN xmlChar * XMLCALL - xmlEncodeSpecialChars (xmlDocPtr doc, - const xmlChar *input); -XMLPUBFUN xmlEntitiesTablePtr XMLCALL - xmlCreateEntitiesTable (void); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlEntitiesTablePtr XMLCALL - xmlCopyEntitiesTable (xmlEntitiesTablePtr table); -#endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL - xmlFreeEntitiesTable (xmlEntitiesTablePtr table); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlDumpEntitiesTable (xmlBufferPtr buf, - xmlEntitiesTablePtr table); -XMLPUBFUN void XMLCALL - xmlDumpEntityDecl (xmlBufferPtr buf, - xmlEntityPtr ent); -#endif /* LIBXML_OUTPUT_ENABLED */ -#ifdef LIBXML_LEGACY_ENABLED -XMLPUBFUN void XMLCALL - xmlCleanupPredefinedEntities(void); -#endif /* LIBXML_LEGACY_ENABLED */ - - -#ifdef __cplusplus -} -#endif - -# endif /* __XML_ENTITIES_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/globals.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/globals.h deleted file mode 100644 index 68f04df0ac0..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/globals.h +++ /dev/null @@ -1,492 +0,0 @@ -/* - * Summary: interface for all global variables of the library - * Description: all the global variables and thread handling for - * those variables is handled by this module. - * - * The bottom of this file is automatically generated by build_glob.py - * based on the description file global.data - * - * Copy: See Copyright for the status of this software. - * - * Author: Gary Pennington <Gary.Pennington@uk.sun.com>, Daniel Veillard - */ - -#ifndef __XML_GLOBALS_H -#define __XML_GLOBALS_H - -#include "xmlversion.h" -#include "parser.h" -#include "xmlerror.h" -#include "SAX.h" -#include "SAX2.h" -#include "xmlmemory.h" - -#ifdef __cplusplus -extern "C" { -#endif - -XMLPUBFUN void XMLCALL xmlInitGlobals(void); -XMLPUBFUN void XMLCALL xmlCleanupGlobals(void); - -typedef xmlParserInputBufferPtr (*xmlParserInputBufferCreateFilenameFunc) (const char *URI, xmlCharEncoding enc); -typedef xmlOutputBufferPtr (*xmlOutputBufferCreateFilenameFunc) (const char *URI, xmlCharEncodingHandlerPtr encoder, int compression); -XMLPUBFUN xmlParserInputBufferCreateFilenameFunc -XMLCALL xmlParserInputBufferCreateFilenameDefault (xmlParserInputBufferCreateFilenameFunc func); -XMLPUBFUN xmlOutputBufferCreateFilenameFunc -XMLCALL xmlOutputBufferCreateFilenameDefault (xmlOutputBufferCreateFilenameFunc func); - -/* - * Externally global symbols which need to be protected for backwards - * compatibility support. - */ - -#undef docbDefaultSAXHandler -#undef htmlDefaultSAXHandler -#undef oldXMLWDcompatibility -#undef xmlBufferAllocScheme -#undef xmlDefaultBufferSize -#undef xmlDefaultSAXHandler -#undef xmlDefaultSAXLocator -#undef xmlDoValidityCheckingDefaultValue -#undef xmlFree -#undef xmlGenericError -#undef xmlStructuredError -#undef xmlGenericErrorContext -#undef xmlGetWarningsDefaultValue -#undef xmlIndentTreeOutput -#undef xmlTreeIndentString -#undef xmlKeepBlanksDefaultValue -#undef xmlLineNumbersDefaultValue -#undef xmlLoadExtDtdDefaultValue -#undef xmlMalloc -#undef xmlMallocAtomic -#undef xmlMemStrdup -#undef xmlParserDebugEntities -#undef xmlParserVersion -#undef xmlPedanticParserDefaultValue -#undef xmlRealloc -#undef xmlSaveNoEmptyTags -#undef xmlSubstituteEntitiesDefaultValue -#undef xmlRegisterNodeDefaultValue -#undef xmlDeregisterNodeDefaultValue -#undef xmlLastError -#undef xmlParserInputBufferCreateFilenameValue -#undef xmlOutputBufferCreateFilenameValue - -typedef void (*xmlRegisterNodeFunc) (xmlNodePtr node); -typedef void (*xmlDeregisterNodeFunc) (xmlNodePtr node); - -typedef struct _xmlGlobalState xmlGlobalState; -typedef xmlGlobalState *xmlGlobalStatePtr; -struct _xmlGlobalState -{ - const char *xmlParserVersion; - - xmlSAXLocator xmlDefaultSAXLocator; - xmlSAXHandlerV1 xmlDefaultSAXHandler; - xmlSAXHandlerV1 docbDefaultSAXHandler; - xmlSAXHandlerV1 htmlDefaultSAXHandler; - - xmlFreeFunc xmlFree; - xmlMallocFunc xmlMalloc; - xmlStrdupFunc xmlMemStrdup; - xmlReallocFunc xmlRealloc; - - xmlGenericErrorFunc xmlGenericError; - xmlStructuredErrorFunc xmlStructuredError; - void *xmlGenericErrorContext; - - int oldXMLWDcompatibility; - - xmlBufferAllocationScheme xmlBufferAllocScheme; - int xmlDefaultBufferSize; - - int xmlSubstituteEntitiesDefaultValue; - int xmlDoValidityCheckingDefaultValue; - int xmlGetWarningsDefaultValue; - int xmlKeepBlanksDefaultValue; - int xmlLineNumbersDefaultValue; - int xmlLoadExtDtdDefaultValue; - int xmlParserDebugEntities; - int xmlPedanticParserDefaultValue; - - int xmlSaveNoEmptyTags; - int xmlIndentTreeOutput; - const char *xmlTreeIndentString; - - xmlRegisterNodeFunc xmlRegisterNodeDefaultValue; - xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue; - - xmlMallocFunc xmlMallocAtomic; - xmlError xmlLastError; - - xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue; - xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue; -}; - -#ifdef __cplusplus -} -#endif -#include "threads.h" -#ifdef __cplusplus -extern "C" { -#endif - -XMLPUBFUN void XMLCALL xmlInitializeGlobalState(xmlGlobalStatePtr gs); - -XMLPUBFUN void XMLCALL xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler); - -XMLPUBFUN void XMLCALL xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler); - -XMLPUBFUN xmlRegisterNodeFunc XMLCALL xmlRegisterNodeDefault(xmlRegisterNodeFunc func); -XMLPUBFUN xmlRegisterNodeFunc XMLCALL xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func); -XMLPUBFUN xmlDeregisterNodeFunc XMLCALL xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func); -XMLPUBFUN xmlDeregisterNodeFunc XMLCALL xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func); - -XMLPUBFUN xmlOutputBufferCreateFilenameFunc XMLCALL - xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func); -XMLPUBFUN xmlParserInputBufferCreateFilenameFunc XMLCALL - xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func); - -/** DOC_DISABLE */ -/* - * In general the memory allocation entry points are not kept - * thread specific but this can be overridden by LIBXML_THREAD_ALLOC_ENABLED - * - xmlMalloc - * - xmlMallocAtomic - * - xmlRealloc - * - xmlMemStrdup - * - xmlFree - */ - -#ifdef LIBXML_THREAD_ALLOC_ENABLED -#ifdef LIBXML_THREAD_ENABLED -XMLPUBFUN xmlMallocFunc * XMLCALL __xmlMalloc(void); -#define xmlMalloc \ -(*(__xmlMalloc())) -#else -#define xmlMalloc vtk_libxml2_xmlMalloc -XMLPUBVAR xmlMallocFunc xmlMalloc; -#endif - -#ifdef LIBXML_THREAD_ENABLED -XMLPUBFUN xmlMallocFunc * XMLCALL __xmlMallocAtomic(void); -#define xmlMallocAtomic \ -(*(__xmlMallocAtomic())) -#else -#define xmlMallocAtomic vtk_libxml2_xmlMallocAtomic -XMLPUBVAR xmlMallocFunc xmlMallocAtomic; -#endif - -#ifdef LIBXML_THREAD_ENABLED -XMLPUBFUN xmlReallocFunc * XMLCALL __xmlRealloc(void); -#define xmlRealloc \ -(*(__xmlRealloc())) -#else -#define xmlRealloc vtk_libxml2_xmlRealloc -XMLPUBVAR xmlReallocFunc xmlRealloc; -#endif - -#ifdef LIBXML_THREAD_ENABLED -XMLPUBFUN xmlFreeFunc * XMLCALL __xmlFree(void); -#define xmlFree \ -(*(__xmlFree())) -#else -#define xmlFree vtk_libxml2_xmlFree -XMLPUBVAR xmlFreeFunc xmlFree; -#endif - -#ifdef LIBXML_THREAD_ENABLED -XMLPUBFUN xmlStrdupFunc * XMLCALL __xmlMemStrdup(void); -#define xmlMemStrdup \ -(*(__xmlMemStrdup())) -#else -#define xmlMemStrdup vtk_libxml2_xmlMemStrdup -XMLPUBVAR xmlStrdupFunc xmlMemStrdup; -#endif - -#else /* !LIBXML_THREAD_ALLOC_ENABLED */ -#define xmlMalloc vtk_libxml2_xmlMalloc -XMLPUBVAR xmlMallocFunc xmlMalloc; -#define xmlMallocAtomic vtk_libxml2_xmlMallocAtomic -XMLPUBVAR xmlMallocFunc xmlMallocAtomic; -#define xmlRealloc vtk_libxml2_xmlRealloc -XMLPUBVAR xmlReallocFunc xmlRealloc; -#define xmlFree vtk_libxml2_xmlFree -XMLPUBVAR xmlFreeFunc xmlFree; -#define xmlMemStrdup vtk_libxml2_xmlMemStrdup -XMLPUBVAR xmlStrdupFunc xmlMemStrdup; -#endif /* LIBXML_THREAD_ALLOC_ENABLED */ - -#ifdef LIBXML_DOCB_ENABLED -XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __docbDefaultSAXHandler(void); -#ifdef LIBXML_THREAD_ENABLED -#define docbDefaultSAXHandler \ -(*(__docbDefaultSAXHandler())) -#else -#define docbDefaultSAXHandler vtk_libxml2_docbDefaultSAXHandler -XMLPUBVAR xmlSAXHandlerV1 docbDefaultSAXHandler; -#endif -#endif - -#ifdef LIBXML_HTML_ENABLED -XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __htmlDefaultSAXHandler(void); -#ifdef LIBXML_THREAD_ENABLED -#define htmlDefaultSAXHandler \ -(*(__htmlDefaultSAXHandler())) -#else -#define htmlDefaultSAXHandler vtk_libxml2_htmlDefaultSAXHandler -XMLPUBVAR xmlSAXHandlerV1 htmlDefaultSAXHandler; -#endif -#endif - -XMLPUBFUN xmlError * XMLCALL __xmlLastError(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlLastError \ -(*(__xmlLastError())) -#else -#define xmlLastError vtk_libxml2_xmlLastError -XMLPUBVAR xmlError xmlLastError; -#endif - -/* - * Everything starting from the line below is - * Automatically generated by build_glob.py. - * Do not modify the previous line. - */ - - -XMLPUBFUN int * XMLCALL __oldXMLWDcompatibility(void); -#ifdef LIBXML_THREAD_ENABLED -#define oldXMLWDcompatibility \ -(*(__oldXMLWDcompatibility())) -#else -#define oldXMLWDcompatibility vtk_libxml2_oldXMLWDcompatibility -XMLPUBVAR int oldXMLWDcompatibility; -#endif - -XMLPUBFUN xmlBufferAllocationScheme * XMLCALL __xmlBufferAllocScheme(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlBufferAllocScheme \ -(*(__xmlBufferAllocScheme())) -#else -#define xmlBufferAllocScheme vtk_libxml2_xmlBufferAllocScheme -XMLPUBVAR xmlBufferAllocationScheme xmlBufferAllocScheme; -#endif -XMLPUBFUN xmlBufferAllocationScheme XMLCALL xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v); - -XMLPUBFUN int * XMLCALL __xmlDefaultBufferSize(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlDefaultBufferSize \ -(*(__xmlDefaultBufferSize())) -#else -#define xmlDefaultBufferSize vtk_libxml2_xmlDefaultBufferSize -XMLPUBVAR int xmlDefaultBufferSize; -#endif -XMLPUBFUN int XMLCALL xmlThrDefDefaultBufferSize(int v); - -XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __xmlDefaultSAXHandler(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlDefaultSAXHandler \ -(*(__xmlDefaultSAXHandler())) -#else -#define xmlDefaultSAXHandler vtk_libxml2_xmlDefaultSAXHandler -XMLPUBVAR xmlSAXHandlerV1 xmlDefaultSAXHandler; -#endif - -XMLPUBFUN xmlSAXLocator * XMLCALL __xmlDefaultSAXLocator(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlDefaultSAXLocator \ -(*(__xmlDefaultSAXLocator())) -#else -#define xmlDefaultSAXLocator vtk_libxml2_xmlDefaultSAXLocator -XMLPUBVAR xmlSAXLocator xmlDefaultSAXLocator; -#endif - -XMLPUBFUN int * XMLCALL __xmlDoValidityCheckingDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlDoValidityCheckingDefaultValue \ -(*(__xmlDoValidityCheckingDefaultValue())) -#else -#define xmlDoValidityCheckingDefaultValue vtk_libxml2_xmlDoValidityCheckingDefaultValue -XMLPUBVAR int xmlDoValidityCheckingDefaultValue; -#endif -XMLPUBFUN int XMLCALL xmlThrDefDoValidityCheckingDefaultValue(int v); - -XMLPUBFUN xmlGenericErrorFunc * XMLCALL __xmlGenericError(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlGenericError \ -(*(__xmlGenericError())) -#else -#define xmlGenericError vtk_libxml2_xmlGenericError -XMLPUBVAR xmlGenericErrorFunc xmlGenericError; -#endif - -XMLPUBFUN xmlStructuredErrorFunc * XMLCALL __xmlStructuredError(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlStructuredError \ -(*(__xmlStructuredError())) -#else -#define xmlStructuredError vtk_libxml2_xmlStructuredError -XMLPUBVAR xmlStructuredErrorFunc xmlStructuredError; -#endif - -XMLPUBFUN void * * XMLCALL __xmlGenericErrorContext(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlGenericErrorContext \ -(*(__xmlGenericErrorContext())) -#else -#define xmlGenericErrorContext vtk_libxml2_xmlGenericErrorContext -XMLPUBVAR void * xmlGenericErrorContext; -#endif - -XMLPUBFUN int * XMLCALL __xmlGetWarningsDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlGetWarningsDefaultValue \ -(*(__xmlGetWarningsDefaultValue())) -#else -#define xmlGetWarningsDefaultValue vtk_libxml2_xmlGetWarningsDefaultValue -XMLPUBVAR int xmlGetWarningsDefaultValue; -#endif -XMLPUBFUN int XMLCALL xmlThrDefGetWarningsDefaultValue(int v); - -XMLPUBFUN int * XMLCALL __xmlIndentTreeOutput(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlIndentTreeOutput \ -(*(__xmlIndentTreeOutput())) -#else -#define xmlIndentTreeOutput vtk_libxml2_xmlIndentTreeOutput -XMLPUBVAR int xmlIndentTreeOutput; -#endif -XMLPUBFUN int XMLCALL xmlThrDefIndentTreeOutput(int v); - -XMLPUBFUN const char * * XMLCALL __xmlTreeIndentString(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlTreeIndentString \ -(*(__xmlTreeIndentString())) -#else -#define xmlTreeIndentString vtk_libxml2_xmlTreeIndentString -XMLPUBVAR const char * xmlTreeIndentString; -#endif -XMLPUBFUN const char * XMLCALL xmlThrDefTreeIndentString(const char * v); - -XMLPUBFUN int * XMLCALL __xmlKeepBlanksDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlKeepBlanksDefaultValue \ -(*(__xmlKeepBlanksDefaultValue())) -#else -#define xmlKeepBlanksDefaultValue vtk_libxml2_xmlKeepBlanksDefaultValue -XMLPUBVAR int xmlKeepBlanksDefaultValue; -#endif -XMLPUBFUN int XMLCALL xmlThrDefKeepBlanksDefaultValue(int v); - -XMLPUBFUN int * XMLCALL __xmlLineNumbersDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlLineNumbersDefaultValue \ -(*(__xmlLineNumbersDefaultValue())) -#else -#define xmlLineNumbersDefaultValue vtk_libxml2_xmlLineNumbersDefaultValue -XMLPUBVAR int xmlLineNumbersDefaultValue; -#endif -XMLPUBFUN int XMLCALL xmlThrDefLineNumbersDefaultValue(int v); - -XMLPUBFUN int * XMLCALL __xmlLoadExtDtdDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlLoadExtDtdDefaultValue \ -(*(__xmlLoadExtDtdDefaultValue())) -#else -#define xmlLoadExtDtdDefaultValue vtk_libxml2_xmlLoadExtDtdDefaultValue -XMLPUBVAR int xmlLoadExtDtdDefaultValue; -#endif -XMLPUBFUN int XMLCALL xmlThrDefLoadExtDtdDefaultValue(int v); - -XMLPUBFUN int * XMLCALL __xmlParserDebugEntities(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlParserDebugEntities \ -(*(__xmlParserDebugEntities())) -#else -#define xmlParserDebugEntities vtk_libxml2_xmlParserDebugEntities -XMLPUBVAR int xmlParserDebugEntities; -#endif -XMLPUBFUN int XMLCALL xmlThrDefParserDebugEntities(int v); - -XMLPUBFUN const char * * XMLCALL __xmlParserVersion(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlParserVersion \ -(*(__xmlParserVersion())) -#else -#define xmlParserVersion vtk_libxml2_xmlParserVersion -XMLPUBVAR const char * xmlParserVersion; -#endif - -XMLPUBFUN int * XMLCALL __xmlPedanticParserDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlPedanticParserDefaultValue \ -(*(__xmlPedanticParserDefaultValue())) -#else -#define xmlPedanticParserDefaultValue vtk_libxml2_xmlPedanticParserDefaultValue -XMLPUBVAR int xmlPedanticParserDefaultValue; -#endif -XMLPUBFUN int XMLCALL xmlThrDefPedanticParserDefaultValue(int v); - -XMLPUBFUN int * XMLCALL __xmlSaveNoEmptyTags(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlSaveNoEmptyTags \ -(*(__xmlSaveNoEmptyTags())) -#else -#define xmlSaveNoEmptyTags vtk_libxml2_xmlSaveNoEmptyTags -XMLPUBVAR int xmlSaveNoEmptyTags; -#endif -XMLPUBFUN int XMLCALL xmlThrDefSaveNoEmptyTags(int v); - -XMLPUBFUN int * XMLCALL __xmlSubstituteEntitiesDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlSubstituteEntitiesDefaultValue \ -(*(__xmlSubstituteEntitiesDefaultValue())) -#else -#define xmlSubstituteEntitiesDefaultValue vtk_libxml2_xmlSubstituteEntitiesDefaultValue -XMLPUBVAR int xmlSubstituteEntitiesDefaultValue; -#endif -XMLPUBFUN int XMLCALL xmlThrDefSubstituteEntitiesDefaultValue(int v); - -XMLPUBFUN xmlRegisterNodeFunc * XMLCALL __xmlRegisterNodeDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlRegisterNodeDefaultValue \ -(*(__xmlRegisterNodeDefaultValue())) -#else -#define xmlRegisterNodeDefaultValue vtk_libxml2_xmlRegisterNodeDefaultValue -XMLPUBVAR xmlRegisterNodeFunc xmlRegisterNodeDefaultValue; -#endif - -XMLPUBFUN xmlDeregisterNodeFunc * XMLCALL __xmlDeregisterNodeDefaultValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlDeregisterNodeDefaultValue \ -(*(__xmlDeregisterNodeDefaultValue())) -#else -#define xmlDeregisterNodeDefaultValue vtk_libxml2_xmlDeregisterNodeDefaultValue -XMLPUBVAR xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue; -#endif - -XMLPUBFUN xmlParserInputBufferCreateFilenameFunc * XMLCALL __xmlParserInputBufferCreateFilenameValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlParserInputBufferCreateFilenameValue \ -(*(__xmlParserInputBufferCreateFilenameValue())) -#else -#define xmlParserInputBufferCreateFilenameValue vtk_libxml2_xmlParserInputBufferCreateFilenameValue -XMLPUBVAR xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue; -#endif - -XMLPUBFUN xmlOutputBufferCreateFilenameFunc * XMLCALL __xmlOutputBufferCreateFilenameValue(void); -#ifdef LIBXML_THREAD_ENABLED -#define xmlOutputBufferCreateFilenameValue \ -(*(__xmlOutputBufferCreateFilenameValue())) -#else -#define xmlOutputBufferCreateFilenameValue vtk_libxml2_xmlOutputBufferCreateFilenameValue -XMLPUBVAR xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __XML_GLOBALS_H */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/hash.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/hash.h deleted file mode 100644 index 2b4d9a1162c..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/hash.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Summary: Chained hash tables - * Description: This module implements the hash table support used in - * various places in the library. - * - * Copy: See Copyright for the status of this software. - * - * Author: Bjorn Reese <bjorn.reese@systematic.dk> - */ - -#ifndef __XML_HASH_H__ -#define __XML_HASH_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * The hash table. - */ -typedef struct _xmlHashTable xmlHashTable; -typedef xmlHashTable *xmlHashTablePtr; - -#ifdef __cplusplus -} -#endif - -#include "xmlversion.h" -#include "parser.h" -#include "dict.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Recent version of gcc produce a warning when a function pointer is assigned - * to an object pointer, or vice versa. The following macro is a dirty hack - * to allow suppression of the warning. If your architecture has function - * pointers which are a different size than a void pointer, there may be some - * serious trouble within the library. - */ -/** - * XML_CAST_FPTR: - * @fptr: pointer to a function - * - * Macro to do a casting from an object pointer to a - * function pointer without encountering a warning from - * gcc - * - * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) - * This macro violated ISO C aliasing rules (gcc4 on s390 broke) - * so it is disabled now - */ - -#define XML_CAST_FPTR(fptr) fptr - - -/* - * function types: - */ -/** - * xmlHashDeallocator: - * @payload: the data in the hash - * @name: the name associated - * - * Callback to free data from a hash. - */ -typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name); -/** - * xmlHashCopier: - * @payload: the data in the hash - * @name: the name associated - * - * Callback to copy data from a hash. - * - * Returns a copy of the data or NULL in case of error. - */ -typedef void *(*xmlHashCopier)(void *payload, xmlChar *name); -/** - * xmlHashScanner: - * @payload: the data in the hash - * @data: extra scannner data - * @name: the name associated - * - * Callback when scanning data in a hash with the simple scanner. - */ -typedef void (*xmlHashScanner)(void *payload, void *data, xmlChar *name); -/** - * xmlHashScannerFull: - * @payload: the data in the hash - * @data: extra scannner data - * @name: the name associated - * @name2: the second name associated - * @name3: the third name associated - * - * Callback when scanning data in a hash with the full scanner. - */ -typedef void (*xmlHashScannerFull)(void *payload, void *data, - const xmlChar *name, const xmlChar *name2, - const xmlChar *name3); - -/* - * Constructor and destructor. - */ -XMLPUBFUN xmlHashTablePtr XMLCALL - xmlHashCreate (int size); -XMLPUBFUN xmlHashTablePtr XMLCALL - xmlHashCreateDict(int size, - xmlDictPtr dict); -XMLPUBFUN void XMLCALL - xmlHashFree (xmlHashTablePtr table, - xmlHashDeallocator f); - -/* - * Add a new entry to the hash table. - */ -XMLPUBFUN int XMLCALL - xmlHashAddEntry (xmlHashTablePtr table, - const xmlChar *name, - void *userdata); -XMLPUBFUN int XMLCALL - xmlHashUpdateEntry(xmlHashTablePtr table, - const xmlChar *name, - void *userdata, - xmlHashDeallocator f); -XMLPUBFUN int XMLCALL - xmlHashAddEntry2(xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *name2, - void *userdata); -XMLPUBFUN int XMLCALL - xmlHashUpdateEntry2(xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *name2, - void *userdata, - xmlHashDeallocator f); -XMLPUBFUN int XMLCALL - xmlHashAddEntry3(xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *name2, - const xmlChar *name3, - void *userdata); -XMLPUBFUN int XMLCALL - xmlHashUpdateEntry3(xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *name2, - const xmlChar *name3, - void *userdata, - xmlHashDeallocator f); - -/* - * Remove an entry from the hash table. - */ -XMLPUBFUN int XMLCALL - xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, - xmlHashDeallocator f); -XMLPUBFUN int XMLCALL - xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, xmlHashDeallocator f); -XMLPUBFUN int XMLCALL - xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name, - const xmlChar *name2, const xmlChar *name3, - xmlHashDeallocator f); - -/* - * Retrieve the userdata. - */ -XMLPUBFUN void * XMLCALL - xmlHashLookup (xmlHashTablePtr table, - const xmlChar *name); -XMLPUBFUN void * XMLCALL - xmlHashLookup2 (xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *name2); -XMLPUBFUN void * XMLCALL - xmlHashLookup3 (xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *name2, - const xmlChar *name3); -XMLPUBFUN void * XMLCALL - xmlHashQLookup (xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *prefix); -XMLPUBFUN void * XMLCALL - xmlHashQLookup2 (xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *prefix, - const xmlChar *name2, - const xmlChar *prefix2); -XMLPUBFUN void * XMLCALL - xmlHashQLookup3 (xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *prefix, - const xmlChar *name2, - const xmlChar *prefix2, - const xmlChar *name3, - const xmlChar *prefix3); - -/* - * Helpers. - */ -XMLPUBFUN xmlHashTablePtr XMLCALL - xmlHashCopy (xmlHashTablePtr table, - xmlHashCopier f); -XMLPUBFUN int XMLCALL - xmlHashSize (xmlHashTablePtr table); -XMLPUBFUN void XMLCALL - xmlHashScan (xmlHashTablePtr table, - xmlHashScanner f, - void *data); -XMLPUBFUN void XMLCALL - xmlHashScan3 (xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *name2, - const xmlChar *name3, - xmlHashScanner f, - void *data); -XMLPUBFUN void XMLCALL - xmlHashScanFull (xmlHashTablePtr table, - xmlHashScannerFull f, - void *data); -XMLPUBFUN void XMLCALL - xmlHashScanFull3(xmlHashTablePtr table, - const xmlChar *name, - const xmlChar *name2, - const xmlChar *name3, - xmlHashScannerFull f, - void *data); -#ifdef __cplusplus -} -#endif -#endif /* ! __XML_HASH_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/list.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/list.h deleted file mode 100644 index 3071c93d1c6..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/list.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Summary: lists interfaces - * Description: this module implement the list support used in - * various place in the library. - * - * Copy: See Copyright for the status of this software. - * - * Author: Gary Pennington <Gary.Pennington@uk.sun.com> - */ - -#ifndef __XML_LINK_INCLUDE__ -#define __XML_LINK_INCLUDE__ - -#include "xmlversion.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _xmlLink xmlLink; -typedef xmlLink *xmlLinkPtr; - -typedef struct _xmlList xmlList; -typedef xmlList *xmlListPtr; - -/** - * xmlListDeallocator: - * @lk: the data to deallocate - * - * Callback function used to free data from a list. - */ -typedef void (*xmlListDeallocator) (xmlLinkPtr lk); -/** - * xmlListDataCompare: - * @data0: the first data - * @data1: the second data - * - * Callback function used to compare 2 data. - * - * Returns 0 is equality, -1 or 1 otherwise depending on the ordering. - */ -typedef int (*xmlListDataCompare) (const void *data0, const void *data1); -/** - * xmlListWalker: - * @data: the data found in the list - * @user: extra user provided data to the walker - * - * Callback function used when walking a list with xmlListWalk(). - * - * Returns 0 to stop walking the list, 1 otherwise. - */ -typedef int (*xmlListWalker) (const void *data, const void *user); - -/* Creation/Deletion */ -XMLPUBFUN xmlListPtr XMLCALL - xmlListCreate (xmlListDeallocator deallocator, - xmlListDataCompare compare); -XMLPUBFUN void XMLCALL - xmlListDelete (xmlListPtr l); - -/* Basic Operators */ -XMLPUBFUN void * XMLCALL - xmlListSearch (xmlListPtr l, - void *data); -XMLPUBFUN void * XMLCALL - xmlListReverseSearch (xmlListPtr l, - void *data); -XMLPUBFUN int XMLCALL - xmlListInsert (xmlListPtr l, - void *data) ; -XMLPUBFUN int XMLCALL - xmlListAppend (xmlListPtr l, - void *data) ; -XMLPUBFUN int XMLCALL - xmlListRemoveFirst (xmlListPtr l, - void *data); -XMLPUBFUN int XMLCALL - xmlListRemoveLast (xmlListPtr l, - void *data); -XMLPUBFUN int XMLCALL - xmlListRemoveAll (xmlListPtr l, - void *data); -XMLPUBFUN void XMLCALL - xmlListClear (xmlListPtr l); -XMLPUBFUN int XMLCALL - xmlListEmpty (xmlListPtr l); -XMLPUBFUN xmlLinkPtr XMLCALL - xmlListFront (xmlListPtr l); -XMLPUBFUN xmlLinkPtr XMLCALL - xmlListEnd (xmlListPtr l); -XMLPUBFUN int XMLCALL - xmlListSize (xmlListPtr l); - -XMLPUBFUN void XMLCALL - xmlListPopFront (xmlListPtr l); -XMLPUBFUN void XMLCALL - xmlListPopBack (xmlListPtr l); -XMLPUBFUN int XMLCALL - xmlListPushFront (xmlListPtr l, - void *data); -XMLPUBFUN int XMLCALL - xmlListPushBack (xmlListPtr l, - void *data); - -/* Advanced Operators */ -XMLPUBFUN void XMLCALL - xmlListReverse (xmlListPtr l); -XMLPUBFUN void XMLCALL - xmlListSort (xmlListPtr l); -XMLPUBFUN void XMLCALL - xmlListWalk (xmlListPtr l, - xmlListWalker walker, - const void *user); -XMLPUBFUN void XMLCALL - xmlListReverseWalk (xmlListPtr l, - xmlListWalker walker, - const void *user); -XMLPUBFUN void XMLCALL - xmlListMerge (xmlListPtr l1, - xmlListPtr l2); -XMLPUBFUN xmlListPtr XMLCALL - xmlListDup (const xmlListPtr old); -XMLPUBFUN int XMLCALL - xmlListCopy (xmlListPtr cur, - const xmlListPtr old); -/* Link operators */ -XMLPUBFUN void * XMLCALL - xmlLinkGetData (xmlLinkPtr lk); - -/* xmlListUnique() */ -/* xmlListSwap */ - -#ifdef __cplusplus -} -#endif - -#endif /* __XML_LINK_INCLUDE__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/nanoftp.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/nanoftp.h deleted file mode 100644 index 7b7f241b2e6..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/nanoftp.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Summary: minimal FTP implementation - * Description: minimal FTP implementation allowing to fetch resources - * like external subset. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __NANO_FTP_H__ -#define __NANO_FTP_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_FTP_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * ftpListCallback: - * @userData: user provided data for the callback - * @filename: the file name (including "->" when links are shown) - * @attrib: the attribute string - * @owner: the owner string - * @group: the group string - * @size: the file size - * @links: the link count - * @year: the year - * @month: the month - * @day: the day - * @hour: the hour - * @minute: the minute - * - * A callback for the xmlNanoFTPList command. - * Note that only one of year and day:minute are specified. - */ -typedef void (*ftpListCallback) (void *userData, - const char *filename, const char *attrib, - const char *owner, const char *group, - unsigned long size, int links, int year, - const char *month, int day, int hour, - int minute); -/** - * ftpDataCallback: - * @userData: the user provided context - * @data: the data received - * @len: its size in bytes - * - * A callback for the xmlNanoFTPGet command. - */ -typedef void (*ftpDataCallback) (void *userData, - const char *data, - int len); - -/* - * Init - */ -XMLPUBFUN void XMLCALL - xmlNanoFTPInit (void); -XMLPUBFUN void XMLCALL - xmlNanoFTPCleanup (void); - -/* - * Creating/freeing contexts. - */ -XMLPUBFUN void * XMLCALL - xmlNanoFTPNewCtxt (const char *URL); -XMLPUBFUN void XMLCALL - xmlNanoFTPFreeCtxt (void * ctx); -XMLPUBFUN void * XMLCALL - xmlNanoFTPConnectTo (const char *server, - int port); -/* - * Opening/closing session connections. - */ -XMLPUBFUN void * XMLCALL - xmlNanoFTPOpen (const char *URL); -XMLPUBFUN int XMLCALL - xmlNanoFTPConnect (void *ctx); -XMLPUBFUN int XMLCALL - xmlNanoFTPClose (void *ctx); -XMLPUBFUN int XMLCALL - xmlNanoFTPQuit (void *ctx); -XMLPUBFUN void XMLCALL - xmlNanoFTPScanProxy (const char *URL); -XMLPUBFUN void XMLCALL - xmlNanoFTPProxy (const char *host, - int port, - const char *user, - const char *passwd, - int type); -XMLPUBFUN int XMLCALL - xmlNanoFTPUpdateURL (void *ctx, - const char *URL); - -/* - * Rather internal commands. - */ -XMLPUBFUN int XMLCALL - xmlNanoFTPGetResponse (void *ctx); -XMLPUBFUN int XMLCALL - xmlNanoFTPCheckResponse (void *ctx); - -/* - * CD/DIR/GET handlers. - */ -XMLPUBFUN int XMLCALL - xmlNanoFTPCwd (void *ctx, - const char *directory); -XMLPUBFUN int XMLCALL - xmlNanoFTPDele (void *ctx, - const char *file); - -XMLPUBFUN int XMLCALL - xmlNanoFTPGetConnection (void *ctx); -XMLPUBFUN int XMLCALL - xmlNanoFTPCloseConnection(void *ctx); -XMLPUBFUN int XMLCALL - xmlNanoFTPList (void *ctx, - ftpListCallback callback, - void *userData, - const char *filename); -XMLPUBFUN int XMLCALL - xmlNanoFTPGetSocket (void *ctx, - const char *filename); -XMLPUBFUN int XMLCALL - xmlNanoFTPGet (void *ctx, - ftpDataCallback callback, - void *userData, - const char *filename); -XMLPUBFUN int XMLCALL - xmlNanoFTPRead (void *ctx, - void *dest, - int len); - -#ifdef __cplusplus -} -#endif -#endif /* LIBXML_FTP_ENABLED */ -#endif /* __NANO_FTP_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/nanohttp.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/nanohttp.h deleted file mode 100644 index 11128225209..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/nanohttp.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Summary: minimal HTTP implementation - * Description: minimal HTTP implementation allowing to fetch resources - * like external subset. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __NANO_HTTP_H__ -#define __NANO_HTTP_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_HTTP_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif -XMLPUBFUN void XMLCALL - xmlNanoHTTPInit (void); -XMLPUBFUN void XMLCALL - xmlNanoHTTPCleanup (void); -XMLPUBFUN void XMLCALL - xmlNanoHTTPScanProxy (const char *URL); -XMLPUBFUN int XMLCALL - xmlNanoHTTPFetch (const char *URL, - const char *filename, - char **contentType); -XMLPUBFUN void * XMLCALL - xmlNanoHTTPMethod (const char *URL, - const char *method, - const char *input, - char **contentType, - const char *headers, - int ilen); -XMLPUBFUN void * XMLCALL - xmlNanoHTTPMethodRedir (const char *URL, - const char *method, - const char *input, - char **contentType, - char **redir, - const char *headers, - int ilen); -XMLPUBFUN void * XMLCALL - xmlNanoHTTPOpen (const char *URL, - char **contentType); -XMLPUBFUN void * XMLCALL - xmlNanoHTTPOpenRedir (const char *URL, - char **contentType, - char **redir); -XMLPUBFUN int XMLCALL - xmlNanoHTTPReturnCode (void *ctx); -XMLPUBFUN const char * XMLCALL - xmlNanoHTTPAuthHeader (void *ctx); -XMLPUBFUN const char * XMLCALL - xmlNanoHTTPRedir (void *ctx); -XMLPUBFUN int XMLCALL - xmlNanoHTTPContentLength( void * ctx ); -XMLPUBFUN const char * XMLCALL - xmlNanoHTTPEncoding (void *ctx); -XMLPUBFUN const char * XMLCALL - xmlNanoHTTPMimeType (void *ctx); -XMLPUBFUN int XMLCALL - xmlNanoHTTPRead (void *ctx, - void *dest, - int len); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN int XMLCALL - xmlNanoHTTPSave (void *ctxt, - const char *filename); -#endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN void XMLCALL - xmlNanoHTTPClose (void *ctx); -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_HTTP_ENABLED */ -#endif /* __NANO_HTTP_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/parser.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/parser.h deleted file mode 100644 index 18436353187..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/parser.h +++ /dev/null @@ -1,1220 +0,0 @@ -/* - * Summary: the core parser module - * Description: Interfaces, constants and types related to the XML parser - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_PARSER_H__ -#define __XML_PARSER_H__ - -#include <stdarg.h> - -#include "xmlversion.h" -#include "tree.h" -#include "dict.h" -#include "hash.h" -#include "valid.h" -#include "entities.h" -#include "xmlerror.h" -#include "xmlstring.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * XML_DEFAULT_VERSION: - * - * The default version of XML used: 1.0 - */ -#define XML_DEFAULT_VERSION "1.0" - -/** - * xmlParserInput: - * - * An xmlParserInput is an input flow for the XML processor. - * Each entity parsed is associated an xmlParserInput (except the - * few predefined ones). This is the case both for internal entities - * - in which case the flow is already completely in memory - or - * external entities - in which case we use the buf structure for - * progressive reading and I18N conversions to the internal UTF-8 format. - */ - -/** - * xmlParserInputDeallocate: - * @str: the string to deallocate - * - * Callback for freeing some parser input allocations. - */ -typedef void (* xmlParserInputDeallocate)(xmlChar *str); - -struct _xmlParserInput { - /* Input buffer */ - xmlParserInputBufferPtr buf; /* UTF-8 encoded buffer */ - - const char *filename; /* The file analyzed, if any */ - const char *directory; /* the directory/base of the file */ - const xmlChar *base; /* Base of the array to parse */ - const xmlChar *cur; /* Current char being parsed */ - const xmlChar *end; /* end of the array to parse */ - int length; /* length if known */ - int line; /* Current line */ - int col; /* Current column */ - /* - * NOTE: consumed is only tested for equality in the parser code, - * so even if there is an overflow this should not give troubles - * for parsing very large instances. - */ - unsigned long consumed; /* How many xmlChars already consumed */ - xmlParserInputDeallocate free; /* function to deallocate the base */ - const xmlChar *encoding; /* the encoding string for entity */ - const xmlChar *version; /* the version string for entity */ - int standalone; /* Was that entity marked standalone */ - int id; /* an unique identifier for the entity */ -}; - -/** - * xmlParserNodeInfo: - * - * The parser can be asked to collect Node informations, i.e. at what - * place in the file they were detected. - * NOTE: This is off by default and not very well tested. - */ -typedef struct _xmlParserNodeInfo xmlParserNodeInfo; -typedef xmlParserNodeInfo *xmlParserNodeInfoPtr; - -struct _xmlParserNodeInfo { - const struct _xmlNode* node; - /* Position & line # that text that created the node begins & ends on */ - unsigned long begin_pos; - unsigned long begin_line; - unsigned long end_pos; - unsigned long end_line; -}; - -typedef struct _xmlParserNodeInfoSeq xmlParserNodeInfoSeq; -typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr; -struct _xmlParserNodeInfoSeq { - unsigned long maximum; - unsigned long length; - xmlParserNodeInfo* buffer; -}; - -/** - * xmlParserInputState: - * - * The parser is now working also as a state based parser. - * The recursive one use the state info for entities processing. - */ -typedef enum { - XML_PARSER_EOF = -1, /* nothing is to be parsed */ - XML_PARSER_START = 0, /* nothing has been parsed */ - XML_PARSER_MISC, /* Misc* before int subset */ - XML_PARSER_PI, /* Within a processing instruction */ - XML_PARSER_DTD, /* within some DTD content */ - XML_PARSER_PROLOG, /* Misc* after internal subset */ - XML_PARSER_COMMENT, /* within a comment */ - XML_PARSER_START_TAG, /* within a start tag */ - XML_PARSER_CONTENT, /* within the content */ - XML_PARSER_CDATA_SECTION, /* within a CDATA section */ - XML_PARSER_END_TAG, /* within a closing tag */ - XML_PARSER_ENTITY_DECL, /* within an entity declaration */ - XML_PARSER_ENTITY_VALUE, /* within an entity value in a decl */ - XML_PARSER_ATTRIBUTE_VALUE, /* within an attribute value */ - XML_PARSER_SYSTEM_LITERAL, /* within a SYSTEM value */ - XML_PARSER_EPILOG, /* the Misc* after the last end tag */ - XML_PARSER_IGNORE, /* within an IGNORED section */ - XML_PARSER_PUBLIC_LITERAL /* within a PUBLIC value */ -} xmlParserInputState; - -/** - * XML_DETECT_IDS: - * - * Bit in the loadsubset context field to tell to do ID/REFs lookups. - * Use it to initialize xmlLoadExtDtdDefaultValue. - */ -#define XML_DETECT_IDS 2 - -/** - * XML_COMPLETE_ATTRS: - * - * Bit in the loadsubset context field to tell to do complete the - * elements attributes lists with the ones defaulted from the DTDs. - * Use it to initialize xmlLoadExtDtdDefaultValue. - */ -#define XML_COMPLETE_ATTRS 4 - -/** - * XML_SKIP_IDS: - * - * Bit in the loadsubset context field to tell to not do ID/REFs registration. - * Used to initialize xmlLoadExtDtdDefaultValue in some special cases. - */ -#define XML_SKIP_IDS 8 - -/** - * xmlParserMode: - * - * A parser can operate in various modes - */ -typedef enum { - XML_PARSE_UNKNOWN = 0, - XML_PARSE_DOM = 1, - XML_PARSE_SAX = 2, - XML_PARSE_PUSH_DOM = 3, - XML_PARSE_PUSH_SAX = 4, - XML_PARSE_READER = 5 -} xmlParserMode; - -/** - * xmlParserCtxt: - * - * The parser context. - * NOTE This doesn't completely define the parser state, the (current ?) - * design of the parser uses recursive function calls since this allow - * and easy mapping from the production rules of the specification - * to the actual code. The drawback is that the actual function call - * also reflect the parser state. However most of the parsing routines - * takes as the only argument the parser context pointer, so migrating - * to a state based parser for progressive parsing shouldn't be too hard. - */ -struct _xmlParserCtxt { - struct _xmlSAXHandler *sax; /* The SAX handler */ - void *userData; /* For SAX interface only, used by DOM build */ - xmlDocPtr myDoc; /* the document being built */ - int wellFormed; /* is the document well formed */ - int replaceEntities; /* shall we replace entities ? */ - const xmlChar *version; /* the XML version string */ - const xmlChar *encoding; /* the declared encoding, if any */ - int standalone; /* standalone document */ - int html; /* an HTML(1)/Docbook(2) document */ - - /* Input stream stack */ - xmlParserInputPtr input; /* Current input stream */ - int inputNr; /* Number of current input streams */ - int inputMax; /* Max number of input streams */ - xmlParserInputPtr *inputTab; /* stack of inputs */ - - /* Node analysis stack only used for DOM building */ - xmlNodePtr node; /* Current parsed Node */ - int nodeNr; /* Depth of the parsing stack */ - int nodeMax; /* Max depth of the parsing stack */ - xmlNodePtr *nodeTab; /* array of nodes */ - - int record_info; /* Whether node info should be kept */ - xmlParserNodeInfoSeq node_seq; /* info about each node parsed */ - - int errNo; /* error code */ - - int hasExternalSubset; /* reference and external subset */ - int hasPErefs; /* the internal subset has PE refs */ - int external; /* are we parsing an external entity */ - - int valid; /* is the document valid */ - int validate; /* shall we try to validate ? */ - xmlValidCtxt vctxt; /* The validity context */ - - xmlParserInputState instate; /* current type of input */ - int token; /* next char look-ahead */ - - char *directory; /* the data directory */ - - /* Node name stack */ - const xmlChar *name; /* Current parsed Node */ - int nameNr; /* Depth of the parsing stack */ - int nameMax; /* Max depth of the parsing stack */ - const xmlChar * *nameTab; /* array of nodes */ - - long nbChars; /* number of xmlChar processed */ - long checkIndex; /* used by progressive parsing lookup */ - int keepBlanks; /* ugly but ... */ - int disableSAX; /* SAX callbacks are disabled */ - int inSubset; /* Parsing is in int 1/ext 2 subset */ - const xmlChar * intSubName; /* name of subset */ - xmlChar * extSubURI; /* URI of external subset */ - xmlChar * extSubSystem; /* SYSTEM ID of external subset */ - - /* xml:space values */ - int * space; /* Should the parser preserve spaces */ - int spaceNr; /* Depth of the parsing stack */ - int spaceMax; /* Max depth of the parsing stack */ - int * spaceTab; /* array of space infos */ - - int depth; /* to prevent entity substitution loops */ - xmlParserInputPtr entity; /* used to check entities boundaries */ - int charset; /* encoding of the in-memory content - actually an xmlCharEncoding */ - int nodelen; /* Those two fields are there to */ - int nodemem; /* Speed up large node parsing */ - int pedantic; /* signal pedantic warnings */ - void *_private; /* For user data, libxml won't touch it */ - - int loadsubset; /* should the external subset be loaded */ - int linenumbers; /* set line number in element content */ - void *catalogs; /* document's own catalog */ - int recovery; /* run in recovery mode */ - int progressive; /* is this a progressive parsing */ - xmlDictPtr dict; /* dictionnary for the parser */ - const xmlChar * *atts; /* array for the attributes callbacks */ - int maxatts; /* the size of the array */ - int docdict; /* use strings from dict to build tree */ - - /* - * pre-interned strings - */ - const xmlChar *str_xml; - const xmlChar *str_xmlns; - const xmlChar *str_xml_ns; - - /* - * Everything below is used only by the new SAX mode - */ - int sax2; /* operating in the new SAX mode */ - int nsNr; /* the number of inherited namespaces */ - int nsMax; /* the size of the arrays */ - const xmlChar * *nsTab; /* the array of prefix/namespace name */ - int *attallocs; /* which attribute were allocated */ - void * *pushTab; /* array of data for push */ - xmlHashTablePtr attsDefault; /* defaulted attributes if any */ - xmlHashTablePtr attsSpecial; /* non-CDATA attributes if any */ - int nsWellFormed; /* is the document XML Nanespace okay */ - int options; /* Extra options */ - - /* - * Those fields are needed only for treaming parsing so far - */ - int dictNames; /* Use dictionary names for the tree */ - int freeElemsNr; /* number of freed element nodes */ - xmlNodePtr freeElems; /* List of freed element nodes */ - int freeAttrsNr; /* number of freed attributes nodes */ - xmlAttrPtr freeAttrs; /* List of freed attributes nodes */ - - /* - * the complete error informations for the last error. - */ - xmlError lastError; - xmlParserMode parseMode; /* the parser mode */ -}; - -/** - * xmlSAXLocator: - * - * A SAX Locator. - */ -struct _xmlSAXLocator { - const xmlChar *(*getPublicId)(void *ctx); - const xmlChar *(*getSystemId)(void *ctx); - int (*getLineNumber)(void *ctx); - int (*getColumnNumber)(void *ctx); -}; - -/** - * xmlSAXHandler: - * - * A SAX handler is bunch of callbacks called by the parser when processing - * of the input generate data or structure informations. - */ - -/** - * resolveEntitySAXFunc: - * @ctx: the user data (XML parser context) - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * Callback: - * The entity loader, to control the loading of external entities, - * the application can either: - * - override this resolveEntity() callback in the SAX block - * - or better use the xmlSetExternalEntityLoader() function to - * set up it's own entity resolution routine - * - * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. - */ -typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx, - const xmlChar *publicId, - const xmlChar *systemId); -/** - * internalSubsetSAXFunc: - * @ctx: the user data (XML parser context) - * @name: the root element name - * @ExternalID: the external ID - * @SystemID: the SYSTEM ID (e.g. filename or URL) - * - * Callback on internal subset declaration. - */ -typedef void (*internalSubsetSAXFunc) (void *ctx, - const xmlChar *name, - const xmlChar *ExternalID, - const xmlChar *SystemID); -/** - * externalSubsetSAXFunc: - * @ctx: the user data (XML parser context) - * @name: the root element name - * @ExternalID: the external ID - * @SystemID: the SYSTEM ID (e.g. filename or URL) - * - * Callback on external subset declaration. - */ -typedef void (*externalSubsetSAXFunc) (void *ctx, - const xmlChar *name, - const xmlChar *ExternalID, - const xmlChar *SystemID); -/** - * getEntitySAXFunc: - * @ctx: the user data (XML parser context) - * @name: The entity name - * - * Get an entity by name. - * - * Returns the xmlEntityPtr if found. - */ -typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx, - const xmlChar *name); -/** - * getParameterEntitySAXFunc: - * @ctx: the user data (XML parser context) - * @name: The entity name - * - * Get a parameter entity by name. - * - * Returns the xmlEntityPtr if found. - */ -typedef xmlEntityPtr (*getParameterEntitySAXFunc) (void *ctx, - const xmlChar *name); -/** - * entityDeclSAXFunc: - * @ctx: the user data (XML parser context) - * @name: the entity name - * @type: the entity type - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @content: the entity value (without processing). - * - * An entity definition has been parsed. - */ -typedef void (*entityDeclSAXFunc) (void *ctx, - const xmlChar *name, - int type, - const xmlChar *publicId, - const xmlChar *systemId, - xmlChar *content); -/** - * notationDeclSAXFunc: - * @ctx: the user data (XML parser context) - * @name: The name of the notation - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * What to do when a notation declaration has been parsed. - */ -typedef void (*notationDeclSAXFunc)(void *ctx, - const xmlChar *name, - const xmlChar *publicId, - const xmlChar *systemId); -/** - * attributeDeclSAXFunc: - * @ctx: the user data (XML parser context) - * @elem: the name of the element - * @fullname: the attribute name - * @type: the attribute type - * @def: the type of default value - * @defaultValue: the attribute default value - * @tree: the tree of enumerated value set - * - * An attribute definition has been parsed. - */ -typedef void (*attributeDeclSAXFunc)(void *ctx, - const xmlChar *elem, - const xmlChar *fullname, - int type, - int def, - const xmlChar *defaultValue, - xmlEnumerationPtr tree); -/** - * elementDeclSAXFunc: - * @ctx: the user data (XML parser context) - * @name: the element name - * @type: the element type - * @content: the element value tree - * - * An element definition has been parsed. - */ -typedef void (*elementDeclSAXFunc)(void *ctx, - const xmlChar *name, - int type, - xmlElementContentPtr content); -/** - * unparsedEntityDeclSAXFunc: - * @ctx: the user data (XML parser context) - * @name: The name of the entity - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @notationName: the name of the notation - * - * What to do when an unparsed entity declaration is parsed. - */ -typedef void (*unparsedEntityDeclSAXFunc)(void *ctx, - const xmlChar *name, - const xmlChar *publicId, - const xmlChar *systemId, - const xmlChar *notationName); -/** - * setDocumentLocatorSAXFunc: - * @ctx: the user data (XML parser context) - * @loc: A SAX Locator - * - * Receive the document locator at startup, actually xmlDefaultSAXLocator. - * Everything is available on the context, so this is useless in our case. - */ -typedef void (*setDocumentLocatorSAXFunc) (void *ctx, - xmlSAXLocatorPtr loc); -/** - * startDocumentSAXFunc: - * @ctx: the user data (XML parser context) - * - * Called when the document start being processed. - */ -typedef void (*startDocumentSAXFunc) (void *ctx); -/** - * endDocumentSAXFunc: - * @ctx: the user data (XML parser context) - * - * Called when the document end has been detected. - */ -typedef void (*endDocumentSAXFunc) (void *ctx); -/** - * startElementSAXFunc: - * @ctx: the user data (XML parser context) - * @name: The element name, including namespace prefix - * @atts: An array of name/value attributes pairs, NULL terminated - * - * Called when an opening tag has been processed. - */ -typedef void (*startElementSAXFunc) (void *ctx, - const xmlChar *name, - const xmlChar **atts); -/** - * endElementSAXFunc: - * @ctx: the user data (XML parser context) - * @name: The element name - * - * Called when the end of an element has been detected. - */ -typedef void (*endElementSAXFunc) (void *ctx, - const xmlChar *name); -/** - * attributeSAXFunc: - * @ctx: the user data (XML parser context) - * @name: The attribute name, including namespace prefix - * @value: The attribute value - * - * Handle an attribute that has been read by the parser. - * The default handling is to convert the attribute into an - * DOM subtree and past it in a new xmlAttr element added to - * the element. - */ -typedef void (*attributeSAXFunc) (void *ctx, - const xmlChar *name, - const xmlChar *value); -/** - * referenceSAXFunc: - * @ctx: the user data (XML parser context) - * @name: The entity name - * - * Called when an entity reference is detected. - */ -typedef void (*referenceSAXFunc) (void *ctx, - const xmlChar *name); -/** - * charactersSAXFunc: - * @ctx: the user data (XML parser context) - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * Receiving some chars from the parser. - */ -typedef void (*charactersSAXFunc) (void *ctx, - const xmlChar *ch, - int len); -/** - * ignorableWhitespaceSAXFunc: - * @ctx: the user data (XML parser context) - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * Receiving some ignorable whitespaces from the parser. - * UNUSED: by default the DOM building will use characters. - */ -typedef void (*ignorableWhitespaceSAXFunc) (void *ctx, - const xmlChar *ch, - int len); -/** - * processingInstructionSAXFunc: - * @ctx: the user data (XML parser context) - * @target: the target name - * @data: the PI data's - * - * A processing instruction has been parsed. - */ -typedef void (*processingInstructionSAXFunc) (void *ctx, - const xmlChar *target, - const xmlChar *data); -/** - * commentSAXFunc: - * @ctx: the user data (XML parser context) - * @value: the comment content - * - * A comment has been parsed. - */ -typedef void (*commentSAXFunc) (void *ctx, - const xmlChar *value); -/** - * cdataBlockSAXFunc: - * @ctx: the user data (XML parser context) - * @value: The pcdata content - * @len: the block length - * - * Called when a pcdata block has been parsed. - */ -typedef void (*cdataBlockSAXFunc) ( - void *ctx, - const xmlChar *value, - int len); -/** - * warningSAXFunc: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a warning messages, callback. - */ -typedef void (XMLCDECL *warningSAXFunc) (void *ctx, - const char *msg, ...); -/** - * errorSAXFunc: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format an error messages, callback. - */ -typedef void (XMLCDECL *errorSAXFunc) (void *ctx, - const char *msg, ...); -/** - * fatalErrorSAXFunc: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format fatal error messages, callback. - * Note: so far fatalError() SAX callbacks are not used, error() - * get all the callbacks for errors. - */ -typedef void (XMLCDECL *fatalErrorSAXFunc) (void *ctx, - const char *msg, ...); -/** - * isStandaloneSAXFunc: - * @ctx: the user data (XML parser context) - * - * Is this document tagged standalone? - * - * Returns 1 if true - */ -typedef int (*isStandaloneSAXFunc) (void *ctx); -/** - * hasInternalSubsetSAXFunc: - * @ctx: the user data (XML parser context) - * - * Does this document has an internal subset. - * - * Returns 1 if true - */ -typedef int (*hasInternalSubsetSAXFunc) (void *ctx); - -/** - * hasExternalSubsetSAXFunc: - * @ctx: the user data (XML parser context) - * - * Does this document has an external subset? - * - * Returns 1 if true - */ -typedef int (*hasExternalSubsetSAXFunc) (void *ctx); - -/************************************************************************ - * * - * The SAX version 2 API extensions * - * * - ************************************************************************/ -/** - * XML_SAX2_MAGIC: - * - * Special constant found in SAX2 blocks initialized fields - */ -#define XML_SAX2_MAGIC 0xDEEDBEAF - -/** - * startElementNsSAX2Func: - * @ctx: the user data (XML parser context) - * @localname: the local name of the element - * @prefix: the element namespace prefix if available - * @URI: the element namespace name if available - * @nb_namespaces: number of namespace definitions on that node - * @namespaces: pointer to the array of prefix/URI pairs namespace definitions - * @nb_attributes: the number of attributes on that node - * @nb_defaulted: the number of defaulted attributes. The defaulted - * ones are at the end of the array - * @attributes: pointer to the array of (localname/prefix/URI/value/end) - * attribute values. - * - * SAX2 callback when an element start has been detected by the parser. - * It provides the namespace informations for the element, as well as - * the new namespace declarations on the element. - */ - -typedef void (*startElementNsSAX2Func) (void *ctx, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI, - int nb_namespaces, - const xmlChar **namespaces, - int nb_attributes, - int nb_defaulted, - const xmlChar **attributes); - -/** - * endElementNsSAX2Func: - * @ctx: the user data (XML parser context) - * @localname: the local name of the element - * @prefix: the element namespace prefix if available - * @URI: the element namespace name if available - * - * SAX2 callback when an element end has been detected by the parser. - * It provides the namespace informations for the element. - */ - -typedef void (*endElementNsSAX2Func) (void *ctx, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI); - - -struct _xmlSAXHandler { - internalSubsetSAXFunc internalSubset; - isStandaloneSAXFunc isStandalone; - hasInternalSubsetSAXFunc hasInternalSubset; - hasExternalSubsetSAXFunc hasExternalSubset; - resolveEntitySAXFunc resolveEntity; - getEntitySAXFunc getEntity; - entityDeclSAXFunc entityDecl; - notationDeclSAXFunc notationDecl; - attributeDeclSAXFunc attributeDecl; - elementDeclSAXFunc elementDecl; - unparsedEntityDeclSAXFunc unparsedEntityDecl; - setDocumentLocatorSAXFunc setDocumentLocator; - startDocumentSAXFunc startDocument; - endDocumentSAXFunc endDocument; - startElementSAXFunc startElement; - endElementSAXFunc endElement; - referenceSAXFunc reference; - charactersSAXFunc characters; - ignorableWhitespaceSAXFunc ignorableWhitespace; - processingInstructionSAXFunc processingInstruction; - commentSAXFunc comment; - warningSAXFunc warning; - errorSAXFunc error; - fatalErrorSAXFunc fatalError; /* unused error() get all the errors */ - getParameterEntitySAXFunc getParameterEntity; - cdataBlockSAXFunc cdataBlock; - externalSubsetSAXFunc externalSubset; - unsigned int initialized; - /* The following fields are extensions available only on version 2 */ - void *_private; - startElementNsSAX2Func startElementNs; - endElementNsSAX2Func endElementNs; - xmlStructuredErrorFunc serror; -}; - -/* - * SAX Version 1 - */ -typedef struct _xmlSAXHandlerV1 xmlSAXHandlerV1; -typedef xmlSAXHandlerV1 *xmlSAXHandlerV1Ptr; -struct _xmlSAXHandlerV1 { - internalSubsetSAXFunc internalSubset; - isStandaloneSAXFunc isStandalone; - hasInternalSubsetSAXFunc hasInternalSubset; - hasExternalSubsetSAXFunc hasExternalSubset; - resolveEntitySAXFunc resolveEntity; - getEntitySAXFunc getEntity; - entityDeclSAXFunc entityDecl; - notationDeclSAXFunc notationDecl; - attributeDeclSAXFunc attributeDecl; - elementDeclSAXFunc elementDecl; - unparsedEntityDeclSAXFunc unparsedEntityDecl; - setDocumentLocatorSAXFunc setDocumentLocator; - startDocumentSAXFunc startDocument; - endDocumentSAXFunc endDocument; - startElementSAXFunc startElement; - endElementSAXFunc endElement; - referenceSAXFunc reference; - charactersSAXFunc characters; - ignorableWhitespaceSAXFunc ignorableWhitespace; - processingInstructionSAXFunc processingInstruction; - commentSAXFunc comment; - warningSAXFunc warning; - errorSAXFunc error; - fatalErrorSAXFunc fatalError; /* unused error() get all the errors */ - getParameterEntitySAXFunc getParameterEntity; - cdataBlockSAXFunc cdataBlock; - externalSubsetSAXFunc externalSubset; - unsigned int initialized; -}; - - -/** - * xmlExternalEntityLoader: - * @URL: The System ID of the resource requested - * @ID: The Public ID of the resource requested - * @context: the XML parser context - * - * External entity loaders types. - * - * Returns the entity input parser. - */ -typedef xmlParserInputPtr (*xmlExternalEntityLoader) (const char *URL, - const char *ID, - xmlParserCtxtPtr context); - -#ifdef __cplusplus -} -#endif - -#include "encoding.h" -#include "xmlIO.h" -#include "globals.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/* - * Init/Cleanup - */ -XMLPUBFUN void XMLCALL - xmlInitParser (void); -XMLPUBFUN void XMLCALL - xmlCleanupParser (void); - -/* - * Input functions - */ -XMLPUBFUN int XMLCALL - xmlParserInputRead (xmlParserInputPtr in, - int len); -XMLPUBFUN int XMLCALL - xmlParserInputGrow (xmlParserInputPtr in, - int len); - -/* - * Basic parsing Interfaces - */ -#ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN xmlDocPtr XMLCALL - xmlParseDoc (const xmlChar *cur); -XMLPUBFUN xmlDocPtr XMLCALL - xmlParseFile (const char *filename); -XMLPUBFUN xmlDocPtr XMLCALL - xmlParseMemory (const char *buffer, - int size); -#endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN int XMLCALL - xmlSubstituteEntitiesDefault(int val); -XMLPUBFUN int XMLCALL - xmlKeepBlanksDefault (int val); -XMLPUBFUN void XMLCALL - xmlStopParser (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlPedanticParserDefault(int val); -XMLPUBFUN int XMLCALL - xmlLineNumbersDefault (int val); - -#ifdef LIBXML_SAX1_ENABLED -/* - * Recovery mode - */ -XMLPUBFUN xmlDocPtr XMLCALL - xmlRecoverDoc (xmlChar *cur); -XMLPUBFUN xmlDocPtr XMLCALL - xmlRecoverMemory (const char *buffer, - int size); -XMLPUBFUN xmlDocPtr XMLCALL - xmlRecoverFile (const char *filename); -#endif /* LIBXML_SAX1_ENABLED */ - -/* - * Less common routines and SAX interfaces - */ -XMLPUBFUN int XMLCALL - xmlParseDocument (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlParseExtParsedEnt (xmlParserCtxtPtr ctxt); -#ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN int XMLCALL - xmlSAXUserParseFile (xmlSAXHandlerPtr sax, - void *user_data, - const char *filename); -XMLPUBFUN int XMLCALL - xmlSAXUserParseMemory (xmlSAXHandlerPtr sax, - void *user_data, - const char *buffer, - int size); -XMLPUBFUN xmlDocPtr XMLCALL - xmlSAXParseDoc (xmlSAXHandlerPtr sax, - const xmlChar *cur, - int recovery); -XMLPUBFUN xmlDocPtr XMLCALL - xmlSAXParseMemory (xmlSAXHandlerPtr sax, - const char *buffer, - int size, - int recovery); -XMLPUBFUN xmlDocPtr XMLCALL - xmlSAXParseMemoryWithData (xmlSAXHandlerPtr sax, - const char *buffer, - int size, - int recovery, - void *data); -XMLPUBFUN xmlDocPtr XMLCALL - xmlSAXParseFile (xmlSAXHandlerPtr sax, - const char *filename, - int recovery); -XMLPUBFUN xmlDocPtr XMLCALL - xmlSAXParseFileWithData (xmlSAXHandlerPtr sax, - const char *filename, - int recovery, - void *data); -XMLPUBFUN xmlDocPtr XMLCALL - xmlSAXParseEntity (xmlSAXHandlerPtr sax, - const char *filename); -XMLPUBFUN xmlDocPtr XMLCALL - xmlParseEntity (const char *filename); -#endif /* LIBXML_SAX1_ENABLED */ - -#ifdef LIBXML_VALID_ENABLED -XMLPUBFUN xmlDtdPtr XMLCALL - xmlSAXParseDTD (xmlSAXHandlerPtr sax, - const xmlChar *ExternalID, - const xmlChar *SystemID); -XMLPUBFUN xmlDtdPtr XMLCALL - xmlParseDTD (const xmlChar *ExternalID, - const xmlChar *SystemID); -XMLPUBFUN xmlDtdPtr XMLCALL - xmlIOParseDTD (xmlSAXHandlerPtr sax, - xmlParserInputBufferPtr input, - xmlCharEncoding enc); -#endif /* LIBXML_VALID_ENABLE */ -#ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN int XMLCALL - xmlParseBalancedChunkMemory(xmlDocPtr doc, - xmlSAXHandlerPtr sax, - void *user_data, - int depth, - const xmlChar *string, - xmlNodePtr *lst); -#endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN xmlParserErrors XMLCALL - xmlParseInNodeContext (xmlNodePtr node, - const char *data, - int datalen, - int options, - xmlNodePtr *lst); -#ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN int XMLCALL - xmlParseBalancedChunkMemoryRecover(xmlDocPtr doc, - xmlSAXHandlerPtr sax, - void *user_data, - int depth, - const xmlChar *string, - xmlNodePtr *lst, - int recover); -XMLPUBFUN int XMLCALL - xmlParseExternalEntity (xmlDocPtr doc, - xmlSAXHandlerPtr sax, - void *user_data, - int depth, - const xmlChar *URL, - const xmlChar *ID, - xmlNodePtr *lst); -#endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN int XMLCALL - xmlParseCtxtExternalEntity(xmlParserCtxtPtr ctx, - const xmlChar *URL, - const xmlChar *ID, - xmlNodePtr *lst); - -/* - * Parser contexts handling. - */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL - xmlNewParserCtxt (void); -XMLPUBFUN int XMLCALL - xmlInitParserCtxt (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlClearParserCtxt (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlFreeParserCtxt (xmlParserCtxtPtr ctxt); -#ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN void XMLCALL - xmlSetupParserForBuffer (xmlParserCtxtPtr ctxt, - const xmlChar* buffer, - const char *filename); -#endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL - xmlCreateDocParserCtxt (const xmlChar *cur); - -#ifdef LIBXML_LEGACY_ENABLED -/* - * Reading/setting optional parsing features. - */ -XMLPUBFUN int XMLCALL - xmlGetFeaturesList (int *len, - const char **result); -XMLPUBFUN int XMLCALL - xmlGetFeature (xmlParserCtxtPtr ctxt, - const char *name, - void *result); -XMLPUBFUN int XMLCALL - xmlSetFeature (xmlParserCtxtPtr ctxt, - const char *name, - void *value); -#endif /* LIBXML_LEGACY_ENABLED */ - -#ifdef LIBXML_PUSH_ENABLED -/* - * Interfaces for the Push mode. - */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL - xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, - void *user_data, - const char *chunk, - int size, - const char *filename); -XMLPUBFUN int XMLCALL - xmlParseChunk (xmlParserCtxtPtr ctxt, - const char *chunk, - int size, - int terminate); -#endif /* LIBXML_PUSH_ENABLED */ - -/* - * Special I/O mode. - */ - -XMLPUBFUN xmlParserCtxtPtr XMLCALL - xmlCreateIOParserCtxt (xmlSAXHandlerPtr sax, - void *user_data, - xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, - void *ioctx, - xmlCharEncoding enc); - -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlNewIOInputStream (xmlParserCtxtPtr ctxt, - xmlParserInputBufferPtr input, - xmlCharEncoding enc); - -/* - * Node infos. - */ -XMLPUBFUN const xmlParserNodeInfo* XMLCALL - xmlParserFindNodeInfo (const xmlParserCtxtPtr ctxt, - const xmlNodePtr node); -XMLPUBFUN void XMLCALL - xmlInitNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); -XMLPUBFUN void XMLCALL - xmlClearNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); -XMLPUBFUN unsigned long XMLCALL - xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq, - const xmlNodePtr node); -XMLPUBFUN void XMLCALL - xmlParserAddNodeInfo (xmlParserCtxtPtr ctxt, - const xmlParserNodeInfoPtr info); - -/* - * External entities handling actually implemented in xmlIO. - */ - -XMLPUBFUN void XMLCALL - xmlSetExternalEntityLoader(xmlExternalEntityLoader f); -XMLPUBFUN xmlExternalEntityLoader XMLCALL - xmlGetExternalEntityLoader(void); -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlLoadExternalEntity (const char *URL, - const char *ID, - xmlParserCtxtPtr ctxt); - -/* - * Index lookup, actually implemented in the encoding module - */ -XMLPUBFUN long XMLCALL - xmlByteConsumed (xmlParserCtxtPtr ctxt); - -/* - * New set of simpler/more flexible APIs - */ -/** - * xmlParserOption: - * - * This is the set of XML parser options that can be passed down - * to the xmlReadDoc() and similar calls. - */ -typedef enum { - XML_PARSE_RECOVER = 1<<0, /* recover on errors */ - XML_PARSE_NOENT = 1<<1, /* substitute entities */ - XML_PARSE_DTDLOAD = 1<<2, /* load the external subset */ - XML_PARSE_DTDATTR = 1<<3, /* default DTD attributes */ - XML_PARSE_DTDVALID = 1<<4, /* validate with the DTD */ - XML_PARSE_NOERROR = 1<<5, /* suppress error reports */ - XML_PARSE_NOWARNING = 1<<6, /* suppress warning reports */ - XML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */ - XML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */ - XML_PARSE_SAX1 = 1<<9, /* use the SAX1 interface internally */ - XML_PARSE_XINCLUDE = 1<<10,/* Implement XInclude substitition */ - XML_PARSE_NONET = 1<<11,/* Forbid network access */ - XML_PARSE_NODICT = 1<<12,/* Do not reuse the context dictionnary */ - XML_PARSE_NSCLEAN = 1<<13,/* remove redundant namespaces declarations */ - XML_PARSE_NOCDATA = 1<<14,/* merge CDATA as text nodes */ - XML_PARSE_NOXINCNODE= 1<<15,/* do not generate XINCLUDE START/END nodes */ - XML_PARSE_COMPACT = 1<<16 /* compact small text nodes; no modification of - the tree allowed afterwards (will possibly - crash if you try to modify the tree) */ -} xmlParserOption; - -XMLPUBFUN void XMLCALL - xmlCtxtReset (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlCtxtResetPush (xmlParserCtxtPtr ctxt, - const char *chunk, - int size, - const char *filename, - const char *encoding); -XMLPUBFUN int XMLCALL - xmlCtxtUseOptions (xmlParserCtxtPtr ctxt, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlReadDoc (const xmlChar *cur, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlReadFile (const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlReadMemory (const char *buffer, - int size, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlReadFd (int fd, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlReadIO (xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, - void *ioctx, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlCtxtReadDoc (xmlParserCtxtPtr ctxt, - const xmlChar *cur, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlCtxtReadFile (xmlParserCtxtPtr ctxt, - const char *filename, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlCtxtReadMemory (xmlParserCtxtPtr ctxt, - const char *buffer, - int size, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlCtxtReadFd (xmlParserCtxtPtr ctxt, - int fd, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlDocPtr XMLCALL - xmlCtxtReadIO (xmlParserCtxtPtr ctxt, - xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, - void *ioctx, - const char *URL, - const char *encoding, - int options); - -/* - * Library wide options - */ -/** - * xmlFeature: - * - * Used to examine the existance of features that can be enabled - * or disabled at compile-time. - * They used to be called XML_FEATURE_xxx but this clashed with Expat - */ -typedef enum { - XML_WITH_THREAD = 1, - XML_WITH_TREE = 2, - XML_WITH_OUTPUT = 3, - XML_WITH_PUSH = 4, - XML_WITH_READER = 5, - XML_WITH_PATTERN = 6, - XML_WITH_WRITER = 7, - XML_WITH_SAX1 = 8, - XML_WITH_FTP = 9, - XML_WITH_HTTP = 10, - XML_WITH_VALID = 11, - XML_WITH_HTML = 12, - XML_WITH_LEGACY = 13, - XML_WITH_C14N = 14, - XML_WITH_CATALOG = 15, - XML_WITH_XPATH = 16, - XML_WITH_XPTR = 17, - XML_WITH_XINCLUDE = 18, - XML_WITH_ICONV = 19, - XML_WITH_ISO8859X = 20, - XML_WITH_UNICODE = 21, - XML_WITH_REGEXP = 22, - XML_WITH_AUTOMATA = 23, - XML_WITH_EXPR = 24, - XML_WITH_SCHEMAS = 25, - XML_WITH_SCHEMATRON = 26, - XML_WITH_MODULES = 27, - XML_WITH_DEBUG = 28, - XML_WITH_DEBUG_MEM = 29, - XML_WITH_DEBUG_RUN = 30, - XML_WITH_ZLIB = 31, - XML_WITH_NONE = 99999 /* just to be sure of allocation size */ -} xmlFeature; - -XMLPUBFUN int XMLCALL - xmlHasFeature (xmlFeature feature); - -#ifdef __cplusplus -} -#endif -#endif /* __XML_PARSER_H__ */ - diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/parserInternals.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/parserInternals.h deleted file mode 100644 index 044848d36bc..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/parserInternals.h +++ /dev/null @@ -1,602 +0,0 @@ -/* - * Summary: internals routines exported by the parser. - * Description: this module exports a number of internal parsing routines - * they are not really all intended for applications but - * can prove useful doing low level processing. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_PARSER_INTERNALS_H__ -#define __XML_PARSER_INTERNALS_H__ - -#include "xmlversion.h" -#include "parser.h" -#include "HTMLparser.h" -#include "chvalid.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlParserMaxDepth: - * - * arbitrary depth limit for the XML documents that we allow to - * process. This is not a limitation of the parser but a safety - * boundary feature. - */ -XMLPUBVAR unsigned int xmlParserMaxDepth; - - /** - * XML_MAX_NAMELEN: - * - * Identifiers can be longer, but this will be more costly - * at runtime. - */ -#define XML_MAX_NAMELEN 100 - -/** - * INPUT_CHUNK: - * - * The parser tries to always have that amount of input ready. - * One of the point is providing context when reporting errors. - */ -#define INPUT_CHUNK 250 - -/************************************************************************ - * * - * UNICODE version of the macros. * - * * - ************************************************************************/ -/** - * IS_BYTE_CHAR: - * @c: an byte value (int) - * - * Macro to check the following production in the XML spec: - * - * [2] Char ::= #x9 | #xA | #xD | [#x20...] - * any byte character in the accepted range - */ -#define IS_BYTE_CHAR(c) xmlIsChar_ch(c) - -/** - * IS_CHAR: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] - * | [#x10000-#x10FFFF] - * any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. - */ -#define IS_CHAR(c) xmlIsCharQ(c) - -/** - * IS_CHAR_CH: - * @c: an xmlChar (usually an unsigned char) - * - * Behaves like IS_CHAR on single-byte value - */ -#define IS_CHAR_CH(c) xmlIsChar_ch(c) - -/** - * IS_BLANK: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * [3] S ::= (#x20 | #x9 | #xD | #xA)+ - */ -#define IS_BLANK(c) xmlIsBlankQ(c) - -/** - * IS_BLANK_CH: - * @c: an xmlChar value (normally unsigned char) - * - * Behaviour same as IS_BLANK - */ -#define IS_BLANK_CH(c) xmlIsBlank_ch(c) - -/** - * IS_BASECHAR: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * [85] BaseChar ::= ... long list see REC ... - */ -#define IS_BASECHAR(c) xmlIsBaseCharQ(c) - -/** - * IS_DIGIT: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * [88] Digit ::= ... long list see REC ... - */ -#define IS_DIGIT(c) xmlIsDigitQ(c) - -/** - * IS_DIGIT_CH: - * @c: an xmlChar value (usually an unsigned char) - * - * Behaves like IS_DIGIT but with a single byte argument - */ -#define IS_DIGIT_CH(c) xmlIsDigit_ch(c) - -/** - * IS_COMBINING: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * [87] CombiningChar ::= ... long list see REC ... - */ -#define IS_COMBINING(c) xmlIsCombiningQ(c) - -/** - * IS_COMBINING_CH: - * @c: an xmlChar (usually an unsigned char) - * - * Always false (all combining chars > 0xff) - */ -#define IS_COMBINING_CH(c) 0 - -/** - * IS_EXTENDER: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * - * [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | - * #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | - * [#x309D-#x309E] | [#x30FC-#x30FE] - */ -#define IS_EXTENDER(c) xmlIsExtenderQ(c) - -/** - * IS_EXTENDER_CH: - * @c: an xmlChar value (usually an unsigned char) - * - * Behaves like IS_EXTENDER but with a single-byte argument - */ -#define IS_EXTENDER_CH(c) xmlIsExtender_ch(c) - -/** - * IS_IDEOGRAPHIC: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * - * [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029] - */ -#define IS_IDEOGRAPHIC(c) xmlIsIdeographicQ(c) - -/** - * IS_LETTER: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * - * [84] Letter ::= BaseChar | Ideographic - */ -#define IS_LETTER(c) (IS_BASECHAR(c) || IS_IDEOGRAPHIC(c)) - -/** - * IS_LETTER_CH: - * @c: an xmlChar value (normally unsigned char) - * - * Macro behaves like IS_LETTER, but only check base chars - * - */ -#define IS_LETTER_CH(c) xmlIsBaseChar_ch(c) - -/** - * IS_ASCII_LETTER: - * @c: an xmlChar value - * - * Macro to check [a-zA-Z] - * - */ -#define IS_ASCII_LETTER(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \ - ((0x61 <= (c)) && ((c) <= 0x7a))) - -/** - * IS_ASCII_DIGIT: - * @c: an xmlChar value - * - * Macro to check [0-9] - * - */ -#define IS_ASCII_DIGIT(c) ((0x30 <= (c)) && ((c) <= 0x39)) - -/** - * IS_PUBIDCHAR: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * - * [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] - */ -#define IS_PUBIDCHAR(c) xmlIsPubidCharQ(c) - -/** - * IS_PUBIDCHAR_CH: - * @c: an xmlChar value (normally unsigned char) - * - * Same as IS_PUBIDCHAR but for single-byte value - */ -#define IS_PUBIDCHAR_CH(c) xmlIsPubidChar_ch(c) - -/** - * SKIP_EOL: - * @p: and UTF8 string pointer - * - * Skips the end of line chars. - */ -#define SKIP_EOL(p) \ - if (*(p) == 0x13) { p++ ; if (*(p) == 0x10) p++; } \ - if (*(p) == 0x10) { p++ ; if (*(p) == 0x13) p++; } - -/** - * MOVETO_ENDTAG: - * @p: and UTF8 string pointer - * - * Skips to the next '>' char. - */ -#define MOVETO_ENDTAG(p) \ - while ((*p) && (*(p) != '>')) (p)++ - -/** - * MOVETO_STARTTAG: - * @p: and UTF8 string pointer - * - * Skips to the next '<' char. - */ -#define MOVETO_STARTTAG(p) \ - while ((*p) && (*(p) != '<')) (p)++ - -/** - * Global variables used for predefined strings. - */ -XMLPUBVAR const xmlChar xmlStringText[]; -XMLPUBVAR const xmlChar xmlStringTextNoenc[]; -XMLPUBVAR const xmlChar xmlStringComment[]; - -/* - * Function to finish the work of the macros where needed. - */ -XMLPUBFUN int XMLCALL xmlIsLetter (int c); - -/** - * Parser context. - */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL - xmlCreateFileParserCtxt (const char *filename); -XMLPUBFUN xmlParserCtxtPtr XMLCALL - xmlCreateURLParserCtxt (const char *filename, - int options); -XMLPUBFUN xmlParserCtxtPtr XMLCALL - xmlCreateMemoryParserCtxt(const char *buffer, - int size); -XMLPUBFUN xmlParserCtxtPtr XMLCALL - xmlCreateEntityParserCtxt(const xmlChar *URL, - const xmlChar *ID, - const xmlChar *base); -XMLPUBFUN int XMLCALL - xmlSwitchEncoding (xmlParserCtxtPtr ctxt, - xmlCharEncoding enc); -XMLPUBFUN int XMLCALL - xmlSwitchToEncoding (xmlParserCtxtPtr ctxt, - xmlCharEncodingHandlerPtr handler); -XMLPUBFUN int XMLCALL - xmlSwitchInputEncoding (xmlParserCtxtPtr ctxt, - xmlParserInputPtr input, - xmlCharEncodingHandlerPtr handler); - -#ifdef IN_LIBXML -/* internal error reporting */ -XMLPUBFUN void XMLCALL - __xmlErrEncoding (xmlParserCtxtPtr ctxt, - xmlParserErrors xmlerr, - const char *msg, - const xmlChar * str1, - const xmlChar * str2); -#endif - -/** - * Input Streams. - */ -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlNewStringInputStream (xmlParserCtxtPtr ctxt, - const xmlChar *buffer); -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlNewEntityInputStream (xmlParserCtxtPtr ctxt, - xmlEntityPtr entity); -XMLPUBFUN void XMLCALL - xmlPushInput (xmlParserCtxtPtr ctxt, - xmlParserInputPtr input); -XMLPUBFUN xmlChar XMLCALL - xmlPopInput (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlFreeInputStream (xmlParserInputPtr input); -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlNewInputFromFile (xmlParserCtxtPtr ctxt, - const char *filename); -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlNewInputStream (xmlParserCtxtPtr ctxt); - -/** - * Namespaces. - */ -XMLPUBFUN xmlChar * XMLCALL - xmlSplitQName (xmlParserCtxtPtr ctxt, - const xmlChar *name, - xmlChar **prefix); - -/** - * Generic production rules. - */ -XMLPUBFUN const xmlChar * XMLCALL - xmlParseName (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlParseNmtoken (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlParseEntityValue (xmlParserCtxtPtr ctxt, - xmlChar **orig); -XMLPUBFUN xmlChar * XMLCALL - xmlParseAttValue (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlParseSystemLiteral (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlParsePubidLiteral (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseCharData (xmlParserCtxtPtr ctxt, - int cdata); -XMLPUBFUN xmlChar * XMLCALL - xmlParseExternalID (xmlParserCtxtPtr ctxt, - xmlChar **publicID, - int strict); -XMLPUBFUN void XMLCALL - xmlParseComment (xmlParserCtxtPtr ctxt); -XMLPUBFUN const xmlChar * XMLCALL - xmlParsePITarget (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParsePI (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseNotationDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseEntityDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlParseDefaultDecl (xmlParserCtxtPtr ctxt, - xmlChar **value); -XMLPUBFUN xmlEnumerationPtr XMLCALL - xmlParseNotationType (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlEnumerationPtr XMLCALL - xmlParseEnumerationType (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlParseEnumeratedType (xmlParserCtxtPtr ctxt, - xmlEnumerationPtr *tree); -XMLPUBFUN int XMLCALL - xmlParseAttributeType (xmlParserCtxtPtr ctxt, - xmlEnumerationPtr *tree); -XMLPUBFUN void XMLCALL - xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlElementContentPtr XMLCALL - xmlParseElementMixedContentDecl - (xmlParserCtxtPtr ctxt, - int inputchk); -XMLPUBFUN xmlElementContentPtr XMLCALL - xmlParseElementChildrenContentDecl - (xmlParserCtxtPtr ctxt, - int inputchk); -XMLPUBFUN int XMLCALL - xmlParseElementContentDecl(xmlParserCtxtPtr ctxt, - const xmlChar *name, - xmlElementContentPtr *result); -XMLPUBFUN int XMLCALL - xmlParseElementDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseMarkupDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlParseCharRef (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlEntityPtr XMLCALL - xmlParseEntityRef (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseReference (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParsePEReference (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseDocTypeDecl (xmlParserCtxtPtr ctxt); -#ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN const xmlChar * XMLCALL - xmlParseAttribute (xmlParserCtxtPtr ctxt, - xmlChar **value); -XMLPUBFUN const xmlChar * XMLCALL - xmlParseStartTag (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseEndTag (xmlParserCtxtPtr ctxt); -#endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN void XMLCALL - xmlParseCDSect (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseContent (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseElement (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlParseVersionNum (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlParseVersionInfo (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlParseEncName (xmlParserCtxtPtr ctxt); -XMLPUBFUN const xmlChar * XMLCALL - xmlParseEncodingDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlParseSDDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseXMLDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseTextDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseMisc (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseExternalSubset (xmlParserCtxtPtr ctxt, - const xmlChar *ExternalID, - const xmlChar *SystemID); -/** - * XML_SUBSTITUTE_NONE: - * - * If no entities need to be substituted. - */ -#define XML_SUBSTITUTE_NONE 0 -/** - * XML_SUBSTITUTE_REF: - * - * Whether general entities need to be substituted. - */ -#define XML_SUBSTITUTE_REF 1 -/** - * XML_SUBSTITUTE_PEREF: - * - * Whether parameter entities need to be substituted. - */ -#define XML_SUBSTITUTE_PEREF 2 -/** - * XML_SUBSTITUTE_BOTH: - * - * Both general and parameter entities need to be substituted. - */ -#define XML_SUBSTITUTE_BOTH 3 - -XMLPUBFUN xmlChar * XMLCALL - xmlStringDecodeEntities (xmlParserCtxtPtr ctxt, - const xmlChar *str, - int what, - xmlChar end, - xmlChar end2, - xmlChar end3); -XMLPUBFUN xmlChar * XMLCALL - xmlStringLenDecodeEntities (xmlParserCtxtPtr ctxt, - const xmlChar *str, - int len, - int what, - xmlChar end, - xmlChar end2, - xmlChar end3); - -/* - * Generated by MACROS on top of parser.c c.f. PUSH_AND_POP. - */ -XMLPUBFUN int XMLCALL nodePush (xmlParserCtxtPtr ctxt, - xmlNodePtr value); -XMLPUBFUN xmlNodePtr XMLCALL nodePop (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL inputPush (xmlParserCtxtPtr ctxt, - xmlParserInputPtr value); -XMLPUBFUN xmlParserInputPtr XMLCALL inputPop (xmlParserCtxtPtr ctxt); -XMLPUBFUN const xmlChar * XMLCALL namePop (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL namePush (xmlParserCtxtPtr ctxt, - const xmlChar *value); - -/* - * other commodities shared between parser.c and parserInternals. - */ -XMLPUBFUN int XMLCALL xmlSkipBlankChars (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL xmlStringCurrentChar (xmlParserCtxtPtr ctxt, - const xmlChar *cur, - int *len); -XMLPUBFUN void XMLCALL xmlParserHandlePEReference(xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL xmlCheckLanguageID (const xmlChar *lang); - -/* - * Really core function shared with HTML parser. - */ -XMLPUBFUN int XMLCALL xmlCurrentChar (xmlParserCtxtPtr ctxt, - int *len); -XMLPUBFUN int XMLCALL xmlCopyCharMultiByte (xmlChar *out, - int val); -XMLPUBFUN int XMLCALL xmlCopyChar (int len, - xmlChar *out, - int val); -XMLPUBFUN void XMLCALL xmlNextChar (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL xmlParserInputShrink (xmlParserInputPtr in); - -#ifdef LIBXML_HTML_ENABLED -/* - * Actually comes from the HTML parser but launched from the init stuff. - */ -XMLPUBFUN void XMLCALL htmlInitAutoClose (void); -XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreateFileParserCtxt(const char *filename, - const char *encoding); -#endif - -/* - * Specific function to keep track of entities references - * and used by the XSLT debugger. - */ -#ifdef LIBXML_LEGACY_ENABLED -/** - * xmlEntityReferenceFunc: - * @ent: the entity - * @firstNode: the fist node in the chunk - * @lastNode: the last nod in the chunk - * - * Callback function used when one needs to be able to track back the - * provenance of a chunk of nodes inherited from an entity replacement. - */ -typedef void (*xmlEntityReferenceFunc) (xmlEntityPtr ent, - xmlNodePtr firstNode, - xmlNodePtr lastNode); - -XMLPUBFUN void XMLCALL xmlSetEntityReferenceFunc (xmlEntityReferenceFunc func); - -XMLPUBFUN xmlChar * XMLCALL - xmlParseQuotedString (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlParseNamespace (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlNamespaceParseNSDef (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlScanName (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlNamespaceParseNCName (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL xmlParserHandleReference(xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlNamespaceParseQName (xmlParserCtxtPtr ctxt, - xmlChar **prefix); -/** - * Entities - */ -XMLPUBFUN xmlChar * XMLCALL - xmlDecodeEntities (xmlParserCtxtPtr ctxt, - int len, - int what, - xmlChar end, - xmlChar end2, - xmlChar end3); -XMLPUBFUN void XMLCALL - xmlHandleEntity (xmlParserCtxtPtr ctxt, - xmlEntityPtr entity); - -#endif /* LIBXML_LEGACY_ENABLED */ - -#ifdef IN_LIBXML -/* - * internal only - */ -XMLPUBFUN void XMLCALL - xmlErrMemory (xmlParserCtxtPtr ctxt, - const char *extra); -#endif - -#ifdef __cplusplus -} -#endif -#endif /* __XML_PARSER_INTERNALS_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/pattern.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/pattern.h deleted file mode 100644 index 266804c5dc0..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/pattern.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Summary: pattern expression handling - * Description: allows to compile and test pattern expressions for nodes - * either in a tree or based on a parser state. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_PATTERN_H__ -#define __XML_PATTERN_H__ - -#include "xmlversion.h" -#include "tree.h" -#include "dict.h" - -#ifdef LIBXML_PATTERN_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlPattern: - * - * A compiled (XPath based) pattern to select nodes - */ -typedef struct _xmlPattern xmlPattern; -typedef xmlPattern *xmlPatternPtr; - -/** - * xmlPatternFlags: - * - * This is the set of options affecting the behaviour of pattern - * matching with this module - * - */ -typedef enum { - XML_PATTERN_DEFAULT = 0, /* simple pattern match */ - XML_PATTERN_XPATH = 1<<0, /* standard XPath pattern */ - XML_PATTERN_XSSEL = 1<<1, /* XPath subset for schema selector */ - XML_PATTERN_XSFIELD = 1<<2 /* XPath subset for schema field */ -} xmlPatternFlags; - -XMLPUBFUN void XMLCALL - xmlFreePattern (xmlPatternPtr comp); - -XMLPUBFUN void XMLCALL - xmlFreePatternList (xmlPatternPtr comp); - -XMLPUBFUN xmlPatternPtr XMLCALL - xmlPatterncompile (const xmlChar *pattern, - xmlDict *dict, - int flags, - const xmlChar **namespaces); -XMLPUBFUN int XMLCALL - xmlPatternMatch (xmlPatternPtr comp, - xmlNodePtr node); - -/* streaming interfaces */ -typedef struct _xmlStreamCtxt xmlStreamCtxt; -typedef xmlStreamCtxt *xmlStreamCtxtPtr; - -XMLPUBFUN int XMLCALL - xmlPatternStreamable (xmlPatternPtr comp); -XMLPUBFUN int XMLCALL - xmlPatternMaxDepth (xmlPatternPtr comp); -XMLPUBFUN int XMLCALL - xmlPatternMinDepth (xmlPatternPtr comp); -XMLPUBFUN int XMLCALL - xmlPatternFromRoot (xmlPatternPtr comp); -XMLPUBFUN xmlStreamCtxtPtr XMLCALL - xmlPatternGetStreamCtxt (xmlPatternPtr comp); -XMLPUBFUN void XMLCALL - xmlFreeStreamCtxt (xmlStreamCtxtPtr stream); -XMLPUBFUN int XMLCALL - xmlStreamPushNode (xmlStreamCtxtPtr stream, - const xmlChar *name, - const xmlChar *ns, - int nodeType); -XMLPUBFUN int XMLCALL - xmlStreamPush (xmlStreamCtxtPtr stream, - const xmlChar *name, - const xmlChar *ns); -XMLPUBFUN int XMLCALL - xmlStreamPushAttr (xmlStreamCtxtPtr stream, - const xmlChar *name, - const xmlChar *ns); -XMLPUBFUN int XMLCALL - xmlStreamPop (xmlStreamCtxtPtr stream); -XMLPUBFUN int XMLCALL - xmlStreamWantsAnyNode (xmlStreamCtxtPtr stream); -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_PATTERN_ENABLED */ - -#endif /* __XML_PATTERN_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/relaxng.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/relaxng.h deleted file mode 100644 index bb521f0157b..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/relaxng.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Summary: implementation of the Relax-NG validation - * Description: implementation of the Relax-NG validation - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_RELAX_NG__ -#define __XML_RELAX_NG__ - -#include "xmlversion.h" -#include "hash.h" -#include "xmlstring.h" - -#ifdef LIBXML_SCHEMAS_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _xmlRelaxNG xmlRelaxNG; -typedef xmlRelaxNG *xmlRelaxNGPtr; - - -/** - * A schemas validation context - */ -typedef void (XMLCDECL *xmlRelaxNGValidityErrorFunc) (void *ctx, const char *msg, ...); -typedef void (XMLCDECL *xmlRelaxNGValidityWarningFunc) (void *ctx, const char *msg, ...); - -typedef struct _xmlRelaxNGParserCtxt xmlRelaxNGParserCtxt; -typedef xmlRelaxNGParserCtxt *xmlRelaxNGParserCtxtPtr; - -typedef struct _xmlRelaxNGValidCtxt xmlRelaxNGValidCtxt; -typedef xmlRelaxNGValidCtxt *xmlRelaxNGValidCtxtPtr; - -/* - * xmlRelaxNGValidErr: - * - * List of possible Relax NG validation errors - */ -typedef enum { - XML_RELAXNG_OK = 0, - XML_RELAXNG_ERR_MEMORY, - XML_RELAXNG_ERR_TYPE, - XML_RELAXNG_ERR_TYPEVAL, - XML_RELAXNG_ERR_DUPID, - XML_RELAXNG_ERR_TYPECMP, - XML_RELAXNG_ERR_NOSTATE, - XML_RELAXNG_ERR_NODEFINE, - XML_RELAXNG_ERR_LISTEXTRA, - XML_RELAXNG_ERR_LISTEMPTY, - XML_RELAXNG_ERR_INTERNODATA, - XML_RELAXNG_ERR_INTERSEQ, - XML_RELAXNG_ERR_INTEREXTRA, - XML_RELAXNG_ERR_ELEMNAME, - XML_RELAXNG_ERR_ATTRNAME, - XML_RELAXNG_ERR_ELEMNONS, - XML_RELAXNG_ERR_ATTRNONS, - XML_RELAXNG_ERR_ELEMWRONGNS, - XML_RELAXNG_ERR_ATTRWRONGNS, - XML_RELAXNG_ERR_ELEMEXTRANS, - XML_RELAXNG_ERR_ATTREXTRANS, - XML_RELAXNG_ERR_ELEMNOTEMPTY, - XML_RELAXNG_ERR_NOELEM, - XML_RELAXNG_ERR_NOTELEM, - XML_RELAXNG_ERR_ATTRVALID, - XML_RELAXNG_ERR_CONTENTVALID, - XML_RELAXNG_ERR_EXTRACONTENT, - XML_RELAXNG_ERR_INVALIDATTR, - XML_RELAXNG_ERR_DATAELEM, - XML_RELAXNG_ERR_VALELEM, - XML_RELAXNG_ERR_LISTELEM, - XML_RELAXNG_ERR_DATATYPE, - XML_RELAXNG_ERR_VALUE, - XML_RELAXNG_ERR_LIST, - XML_RELAXNG_ERR_NOGRAMMAR, - XML_RELAXNG_ERR_EXTRADATA, - XML_RELAXNG_ERR_LACKDATA, - XML_RELAXNG_ERR_INTERNAL, - XML_RELAXNG_ERR_ELEMWRONG, - XML_RELAXNG_ERR_TEXTWRONG -} xmlRelaxNGValidErr; - -/* - * xmlRelaxNGParserFlags: - * - * List of possible Relax NG Parser flags - */ -typedef enum { - XML_RELAXNGP_NONE = 0, - XML_RELAXNGP_FREE_DOC = 1, - XML_RELAXNGP_CRNG = 2 -} xmlRelaxNGParserFlag; - -XMLPUBFUN int XMLCALL - xmlRelaxNGInitTypes (void); -XMLPUBFUN void XMLCALL - xmlRelaxNGCleanupTypes (void); - -/* - * Interfaces for parsing. - */ -XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL - xmlRelaxNGNewParserCtxt (const char *URL); -XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL - xmlRelaxNGNewMemParserCtxt (const char *buffer, - int size); -XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL - xmlRelaxNGNewDocParserCtxt (xmlDocPtr doc); - -XMLPUBFUN int XMLCALL - xmlRelaxParserSetFlag (xmlRelaxNGParserCtxtPtr ctxt, - int flag); - -XMLPUBFUN void XMLCALL - xmlRelaxNGFreeParserCtxt (xmlRelaxNGParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGValidityErrorFunc err, - xmlRelaxNGValidityWarningFunc warn, - void *ctx); -XMLPUBFUN int XMLCALL - xmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGValidityErrorFunc *err, - xmlRelaxNGValidityWarningFunc *warn, - void **ctx); -XMLPUBFUN void XMLCALL - xmlRelaxNGSetParserStructuredErrors( - xmlRelaxNGParserCtxtPtr ctxt, - xmlStructuredErrorFunc serror, - void *ctx); -XMLPUBFUN xmlRelaxNGPtr XMLCALL - xmlRelaxNGParse (xmlRelaxNGParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlRelaxNGFree (xmlRelaxNGPtr schema); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlRelaxNGDump (FILE *output, - xmlRelaxNGPtr schema); -XMLPUBFUN void XMLCALL - xmlRelaxNGDumpTree (FILE * output, - xmlRelaxNGPtr schema); -#endif /* LIBXML_OUTPUT_ENABLED */ -/* - * Interfaces for validating - */ -XMLPUBFUN void XMLCALL - xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidityErrorFunc err, - xmlRelaxNGValidityWarningFunc warn, - void *ctx); -XMLPUBFUN int XMLCALL - xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidityErrorFunc *err, - xmlRelaxNGValidityWarningFunc *warn, - void **ctx); -XMLPUBFUN void XMLCALL - xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, - xmlStructuredErrorFunc serror, void *ctx); -XMLPUBFUN xmlRelaxNGValidCtxtPtr XMLCALL - xmlRelaxNGNewValidCtxt (xmlRelaxNGPtr schema); -XMLPUBFUN void XMLCALL - xmlRelaxNGFreeValidCtxt (xmlRelaxNGValidCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlRelaxNGValidateDoc (xmlRelaxNGValidCtxtPtr ctxt, - xmlDocPtr doc); -/* - * Interfaces for progressive validation when possible - */ -XMLPUBFUN int XMLCALL - xmlRelaxNGValidatePushElement (xmlRelaxNGValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem); -XMLPUBFUN int XMLCALL - xmlRelaxNGValidatePushCData (xmlRelaxNGValidCtxtPtr ctxt, - const xmlChar *data, - int len); -XMLPUBFUN int XMLCALL - xmlRelaxNGValidatePopElement (xmlRelaxNGValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem); -XMLPUBFUN int XMLCALL - xmlRelaxNGValidateFullElement (xmlRelaxNGValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_SCHEMAS_ENABLED */ - -#endif /* __XML_RELAX_NG__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/schemasInternals.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/schemasInternals.h deleted file mode 100644 index 37bb733ebd0..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/schemasInternals.h +++ /dev/null @@ -1,958 +0,0 @@ -/* - * Summary: internal interfaces for XML Schemas - * Description: internal interfaces for the XML Schemas handling - * and schema validity checking - * The Schemas development is a Work In Progress. - * Some of those interfaces are not garanteed to be API or ABI stable ! - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - - -#ifndef __XML_SCHEMA_INTERNALS_H__ -#define __XML_SCHEMA_INTERNALS_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_SCHEMAS_ENABLED - -#include "xmlregexp.h" -#include "hash.h" -#include "dict.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - XML_SCHEMAS_UNKNOWN = 0, - XML_SCHEMAS_STRING, - XML_SCHEMAS_NORMSTRING, - XML_SCHEMAS_DECIMAL, - XML_SCHEMAS_TIME, - XML_SCHEMAS_GDAY, - XML_SCHEMAS_GMONTH, - XML_SCHEMAS_GMONTHDAY, - XML_SCHEMAS_GYEAR, - XML_SCHEMAS_GYEARMONTH, - XML_SCHEMAS_DATE, - XML_SCHEMAS_DATETIME, - XML_SCHEMAS_DURATION, - XML_SCHEMAS_FLOAT, - XML_SCHEMAS_DOUBLE, - XML_SCHEMAS_BOOLEAN, - XML_SCHEMAS_TOKEN, - XML_SCHEMAS_LANGUAGE, - XML_SCHEMAS_NMTOKEN, - XML_SCHEMAS_NMTOKENS, - XML_SCHEMAS_NAME, - XML_SCHEMAS_QNAME, - XML_SCHEMAS_NCNAME, - XML_SCHEMAS_ID, - XML_SCHEMAS_IDREF, - XML_SCHEMAS_IDREFS, - XML_SCHEMAS_ENTITY, - XML_SCHEMAS_ENTITIES, - XML_SCHEMAS_NOTATION, - XML_SCHEMAS_ANYURI, - XML_SCHEMAS_INTEGER, - XML_SCHEMAS_NPINTEGER, - XML_SCHEMAS_NINTEGER, - XML_SCHEMAS_NNINTEGER, - XML_SCHEMAS_PINTEGER, - XML_SCHEMAS_INT, - XML_SCHEMAS_UINT, - XML_SCHEMAS_LONG, - XML_SCHEMAS_ULONG, - XML_SCHEMAS_SHORT, - XML_SCHEMAS_USHORT, - XML_SCHEMAS_BYTE, - XML_SCHEMAS_UBYTE, - XML_SCHEMAS_HEXBINARY, - XML_SCHEMAS_BASE64BINARY, - XML_SCHEMAS_ANYTYPE, - XML_SCHEMAS_ANYSIMPLETYPE -} xmlSchemaValType; - -/* - * XML Schemas defines multiple type of types. - */ -typedef enum { - XML_SCHEMA_TYPE_BASIC = 1, /* A built-in datatype */ - XML_SCHEMA_TYPE_ANY, - XML_SCHEMA_TYPE_FACET, - XML_SCHEMA_TYPE_SIMPLE, - XML_SCHEMA_TYPE_COMPLEX, - XML_SCHEMA_TYPE_SEQUENCE = 6, - XML_SCHEMA_TYPE_CHOICE, - XML_SCHEMA_TYPE_ALL, - XML_SCHEMA_TYPE_SIMPLE_CONTENT, - XML_SCHEMA_TYPE_COMPLEX_CONTENT, - XML_SCHEMA_TYPE_UR, - XML_SCHEMA_TYPE_RESTRICTION, - XML_SCHEMA_TYPE_EXTENSION, - XML_SCHEMA_TYPE_ELEMENT, - XML_SCHEMA_TYPE_ATTRIBUTE, - XML_SCHEMA_TYPE_ATTRIBUTEGROUP, - XML_SCHEMA_TYPE_GROUP, - XML_SCHEMA_TYPE_NOTATION, - XML_SCHEMA_TYPE_LIST, - XML_SCHEMA_TYPE_UNION, - XML_SCHEMA_TYPE_ANY_ATTRIBUTE, - XML_SCHEMA_TYPE_IDC_UNIQUE, - XML_SCHEMA_TYPE_IDC_KEY, - XML_SCHEMA_TYPE_IDC_KEYREF, - XML_SCHEMA_TYPE_PARTICLE = 25, - XML_SCHEMA_TYPE_ATTRIBUTE_USE, - XML_SCHEMA_FACET_MININCLUSIVE = 1000, - XML_SCHEMA_FACET_MINEXCLUSIVE, - XML_SCHEMA_FACET_MAXINCLUSIVE, - XML_SCHEMA_FACET_MAXEXCLUSIVE, - XML_SCHEMA_FACET_TOTALDIGITS, - XML_SCHEMA_FACET_FRACTIONDIGITS, - XML_SCHEMA_FACET_PATTERN, - XML_SCHEMA_FACET_ENUMERATION, - XML_SCHEMA_FACET_WHITESPACE, - XML_SCHEMA_FACET_LENGTH, - XML_SCHEMA_FACET_MAXLENGTH, - XML_SCHEMA_FACET_MINLENGTH, - XML_SCHEMA_EXTRA_QNAMEREF = 2000, - XML_SCHEMA_EXTRA_ATTR_USE_PROHIB -} xmlSchemaTypeType; - -typedef enum { - XML_SCHEMA_CONTENT_UNKNOWN = 0, - XML_SCHEMA_CONTENT_EMPTY = 1, - XML_SCHEMA_CONTENT_ELEMENTS, - XML_SCHEMA_CONTENT_MIXED, - XML_SCHEMA_CONTENT_SIMPLE, - XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS, /* Obsolete */ - XML_SCHEMA_CONTENT_BASIC, - XML_SCHEMA_CONTENT_ANY -} xmlSchemaContentType; - -typedef struct _xmlSchemaVal xmlSchemaVal; -typedef xmlSchemaVal *xmlSchemaValPtr; - -typedef struct _xmlSchemaType xmlSchemaType; -typedef xmlSchemaType *xmlSchemaTypePtr; - -typedef struct _xmlSchemaFacet xmlSchemaFacet; -typedef xmlSchemaFacet *xmlSchemaFacetPtr; - -/** - * Annotation - */ -typedef struct _xmlSchemaAnnot xmlSchemaAnnot; -typedef xmlSchemaAnnot *xmlSchemaAnnotPtr; -struct _xmlSchemaAnnot { - struct _xmlSchemaAnnot *next; - xmlNodePtr content; /* the annotation */ -}; - -/** - * XML_SCHEMAS_ANYATTR_SKIP: - * - * Skip unknown attribute from validation - * Obsolete, not used anymore. - */ -#define XML_SCHEMAS_ANYATTR_SKIP 1 -/** - * XML_SCHEMAS_ANYATTR_LAX: - * - * Ignore validation non definition on attributes - * Obsolete, not used anymore. - */ -#define XML_SCHEMAS_ANYATTR_LAX 2 -/** - * XML_SCHEMAS_ANYATTR_STRICT: - * - * Apply strict validation rules on attributes - * Obsolete, not used anymore. - */ -#define XML_SCHEMAS_ANYATTR_STRICT 3 -/** - * XML_SCHEMAS_ANY_SKIP: - * - * Skip unknown attribute from validation - */ -#define XML_SCHEMAS_ANY_SKIP 1 -/** - * XML_SCHEMAS_ANY_LAX: - * - * Used by wildcards. - * Validate if type found, don't worry if not found - */ -#define XML_SCHEMAS_ANY_LAX 2 -/** - * XML_SCHEMAS_ANY_STRICT: - * - * Used by wildcards. - * Apply strict validation rules - */ -#define XML_SCHEMAS_ANY_STRICT 3 -/** - * XML_SCHEMAS_ATTR_USE_PROHIBITED: - * - * Used by wildcards. - * The attribute is prohibited. - */ -#define XML_SCHEMAS_ATTR_USE_PROHIBITED 0 -/** - * XML_SCHEMAS_ATTR_USE_REQUIRED: - * - * The attribute is required. - */ -#define XML_SCHEMAS_ATTR_USE_REQUIRED 1 -/** - * XML_SCHEMAS_ATTR_USE_OPTIONAL: - * - * The attribute is optional. - */ -#define XML_SCHEMAS_ATTR_USE_OPTIONAL 2 -/** - * XML_SCHEMAS_ATTR_GLOBAL: - * - * allow elements in no namespace - */ -#define XML_SCHEMAS_ATTR_GLOBAL 1 << 0 -/** - * XML_SCHEMAS_ATTR_NSDEFAULT: - * - * allow elements in no namespace - */ -#define XML_SCHEMAS_ATTR_NSDEFAULT 1 << 7 -/** - * XML_SCHEMAS_ATTR_INTERNAL_RESOLVED: - * - * this is set when the "type" and "ref" references - * have been resolved. - */ -#define XML_SCHEMAS_ATTR_INTERNAL_RESOLVED 1 << 8 -/** - * XML_SCHEMAS_ATTR_FIXED: - * - * the attribute has a fixed value - */ -#define XML_SCHEMAS_ATTR_FIXED 1 << 9 - -/** - * xmlSchemaAttribute: - * An attribute definition. - */ - -typedef struct _xmlSchemaAttribute xmlSchemaAttribute; -typedef xmlSchemaAttribute *xmlSchemaAttributePtr; -struct _xmlSchemaAttribute { - xmlSchemaTypeType type; - struct _xmlSchemaAttribute *next; /* the next attribute (not used?) */ - const xmlChar *name; /* the name of the declaration */ - const xmlChar *id; /* Deprecated; not used */ - const xmlChar *ref; /* Deprecated; not used */ - const xmlChar *refNs; /* Deprecated; not used */ - const xmlChar *typeName; /* the local name of the type definition */ - const xmlChar *typeNs; /* the ns URI of the type definition */ - xmlSchemaAnnotPtr annot; - - xmlSchemaTypePtr base; /* Deprecated; not used */ - int occurs; /* Deprecated; not used */ - const xmlChar *defValue; /* The initial value of the value constraint */ - xmlSchemaTypePtr subtypes; /* the type definition */ - xmlNodePtr node; - const xmlChar *targetNamespace; - int flags; - const xmlChar *refPrefix; /* Deprecated; not used */ - xmlSchemaValPtr defVal; /* The compiled value constraint */ - xmlSchemaAttributePtr refDecl; /* Deprecated; not used */ -}; - -/** - * xmlSchemaAttributeLink: - * Used to build a list of attribute uses on complexType definitions. - * WARNING: Deprecated; not used. - */ -typedef struct _xmlSchemaAttributeLink xmlSchemaAttributeLink; -typedef xmlSchemaAttributeLink *xmlSchemaAttributeLinkPtr; -struct _xmlSchemaAttributeLink { - struct _xmlSchemaAttributeLink *next;/* the next attribute link ... */ - struct _xmlSchemaAttribute *attr;/* the linked attribute */ -}; - -/** - * XML_SCHEMAS_WILDCARD_COMPLETE: - * - * If the wildcard is complete. - */ -#define XML_SCHEMAS_WILDCARD_COMPLETE 1 << 0 - -/** - * xmlSchemaCharValueLink: - * Used to build a list of namespaces on wildcards. - */ -typedef struct _xmlSchemaWildcardNs xmlSchemaWildcardNs; -typedef xmlSchemaWildcardNs *xmlSchemaWildcardNsPtr; -struct _xmlSchemaWildcardNs { - struct _xmlSchemaWildcardNs *next;/* the next constraint link ... */ - const xmlChar *value;/* the value */ -}; - -/** - * xmlSchemaWildcard. - * A wildcard. - */ -typedef struct _xmlSchemaWildcard xmlSchemaWildcard; -typedef xmlSchemaWildcard *xmlSchemaWildcardPtr; -struct _xmlSchemaWildcard { - xmlSchemaTypeType type; /* The kind of type */ - const xmlChar *id; /* Deprecated; not used */ - xmlSchemaAnnotPtr annot; - xmlNodePtr node; - int minOccurs; /* Deprecated; not used */ - int maxOccurs; /* Deprecated; not used */ - int processContents; - int any; /* Indicates if the ns constraint is of ##any */ - xmlSchemaWildcardNsPtr nsSet; /* The list of allowed namespaces */ - xmlSchemaWildcardNsPtr negNsSet; /* The negated namespace */ - int flags; -}; - -/** - * XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED: - * - * The attribute wildcard has been already builded. - */ -#define XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED 1 << 0 -/** - * XML_SCHEMAS_ATTRGROUP_GLOBAL: - * - * The attribute wildcard has been already builded. - */ -#define XML_SCHEMAS_ATTRGROUP_GLOBAL 1 << 1 -/** - * XML_SCHEMAS_ATTRGROUP_MARKED: - * - * Marks the attr group as marked; used for circular checks. - */ -#define XML_SCHEMAS_ATTRGROUP_MARKED 1 << 2 - -/** - * XML_SCHEMAS_ATTRGROUP_REDEFINED: - * - * The attr group was redefined. - */ -#define XML_SCHEMAS_ATTRGROUP_REDEFINED 1 << 3 -/** - * XML_SCHEMAS_ATTRGROUP_HAS_REFS: - * - * Whether this attr. group contains attr. group references. - */ -#define XML_SCHEMAS_ATTRGROUP_HAS_REFS 1 << 4 - -/** - * An attribute group definition. - * - * xmlSchemaAttribute and xmlSchemaAttributeGroup start of structures - * must be kept similar - */ -typedef struct _xmlSchemaAttributeGroup xmlSchemaAttributeGroup; -typedef xmlSchemaAttributeGroup *xmlSchemaAttributeGroupPtr; -struct _xmlSchemaAttributeGroup { - xmlSchemaTypeType type; /* The kind of type */ - struct _xmlSchemaAttribute *next;/* the next attribute if in a group ... */ - const xmlChar *name; - const xmlChar *id; - const xmlChar *ref; /* Deprecated; not used */ - const xmlChar *refNs; /* Deprecated; not used */ - xmlSchemaAnnotPtr annot; - - xmlSchemaAttributePtr attributes; /* Deprecated; not used */ - xmlNodePtr node; - int flags; - xmlSchemaWildcardPtr attributeWildcard; - const xmlChar *refPrefix; /* Deprecated; not used */ - xmlSchemaAttributeGroupPtr refItem; /* Deprecated; not used */ - const xmlChar *targetNamespace; - void *attrUses; -}; - -/** - * xmlSchemaTypeLink: - * Used to build a list of types (e.g. member types of - * simpleType with variety "union"). - */ -typedef struct _xmlSchemaTypeLink xmlSchemaTypeLink; -typedef xmlSchemaTypeLink *xmlSchemaTypeLinkPtr; -struct _xmlSchemaTypeLink { - struct _xmlSchemaTypeLink *next;/* the next type link ... */ - xmlSchemaTypePtr type;/* the linked type */ -}; - -/** - * xmlSchemaFacetLink: - * Used to build a list of facets. - */ -typedef struct _xmlSchemaFacetLink xmlSchemaFacetLink; -typedef xmlSchemaFacetLink *xmlSchemaFacetLinkPtr; -struct _xmlSchemaFacetLink { - struct _xmlSchemaFacetLink *next;/* the next facet link ... */ - xmlSchemaFacetPtr facet;/* the linked facet */ -}; - -/** - * XML_SCHEMAS_TYPE_MIXED: - * - * the element content type is mixed - */ -#define XML_SCHEMAS_TYPE_MIXED 1 << 0 -/** - * XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION: - * - * the simple or complex type has a derivation method of "extension". - */ -#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION 1 << 1 -/** - * XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION: - * - * the simple or complex type has a derivation method of "restriction". - */ -#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION 1 << 2 -/** - * XML_SCHEMAS_TYPE_GLOBAL: - * - * the type is global - */ -#define XML_SCHEMAS_TYPE_GLOBAL 1 << 3 -/** - * XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD: - * - * the complexType owns an attribute wildcard, i.e. - * it can be freed by the complexType - */ -#define XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD 1 << 4 /* Obsolete. */ -/** - * XML_SCHEMAS_TYPE_VARIETY_ABSENT: - * - * the simpleType has a variety of "absent". - * TODO: Actually not necessary :-/, since if - * none of the variety flags occur then it's - * automatically absent. - */ -#define XML_SCHEMAS_TYPE_VARIETY_ABSENT 1 << 5 -/** - * XML_SCHEMAS_TYPE_VARIETY_LIST: - * - * the simpleType has a variety of "list". - */ -#define XML_SCHEMAS_TYPE_VARIETY_LIST 1 << 6 -/** - * XML_SCHEMAS_TYPE_VARIETY_UNION: - * - * the simpleType has a variety of "union". - */ -#define XML_SCHEMAS_TYPE_VARIETY_UNION 1 << 7 -/** - * XML_SCHEMAS_TYPE_VARIETY_ATOMIC: - * - * the simpleType has a variety of "union". - */ -#define XML_SCHEMAS_TYPE_VARIETY_ATOMIC 1 << 8 -/** - * XML_SCHEMAS_TYPE_FINAL_EXTENSION: - * - * the complexType has a final of "extension". - */ -#define XML_SCHEMAS_TYPE_FINAL_EXTENSION 1 << 9 -/** - * XML_SCHEMAS_TYPE_FINAL_RESTRICTION: - * - * the simpleType/complexType has a final of "restriction". - */ -#define XML_SCHEMAS_TYPE_FINAL_RESTRICTION 1 << 10 -/** - * XML_SCHEMAS_TYPE_FINAL_LIST: - * - * the simpleType has a final of "list". - */ -#define XML_SCHEMAS_TYPE_FINAL_LIST 1 << 11 -/** - * XML_SCHEMAS_TYPE_FINAL_UNION: - * - * the simpleType has a final of "union". - */ -#define XML_SCHEMAS_TYPE_FINAL_UNION 1 << 12 -/** - * XML_SCHEMAS_TYPE_FINAL_DEFAULT: - * - * the simpleType has a final of "default". - */ -#define XML_SCHEMAS_TYPE_FINAL_DEFAULT 1 << 13 -/** - * XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE: - * - * Marks the item as a builtin primitive. - */ -#define XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE 1 << 14 -/** - * XML_SCHEMAS_TYPE_MARKED: - * - * Marks the item as marked; used for circular checks. - */ -#define XML_SCHEMAS_TYPE_MARKED 1 << 16 -/** - * XML_SCHEMAS_TYPE_BLOCK_DEFAULT: - * - * the complexType did not specify 'block' so use the default of the - * <schema> item. - */ -#define XML_SCHEMAS_TYPE_BLOCK_DEFAULT 1 << 17 -/** - * XML_SCHEMAS_TYPE_BLOCK_EXTENSION: - * - * the complexType has a 'block' of "extension". - */ -#define XML_SCHEMAS_TYPE_BLOCK_EXTENSION 1 << 18 -/** - * XML_SCHEMAS_TYPE_BLOCK_RESTRICTION: - * - * the complexType has a 'block' of "restriction". - */ -#define XML_SCHEMAS_TYPE_BLOCK_RESTRICTION 1 << 19 -/** - * XML_SCHEMAS_TYPE_ABSTRACT: - * - * the simple/complexType is abstract. - */ -#define XML_SCHEMAS_TYPE_ABSTRACT 1 << 20 -/** - * XML_SCHEMAS_TYPE_FACETSNEEDVALUE: - * - * indicates if the facets need a computed value - */ -#define XML_SCHEMAS_TYPE_FACETSNEEDVALUE 1 << 21 -/** - * XML_SCHEMAS_TYPE_INTERNAL_RESOLVED: - * - * indicates that the type was typefixed - */ -#define XML_SCHEMAS_TYPE_INTERNAL_RESOLVED 1 << 22 -/** - * XML_SCHEMAS_TYPE_INTERNAL_INVALID: - * - * indicates that the type is invalid - */ -#define XML_SCHEMAS_TYPE_INTERNAL_INVALID 1 << 23 -/** - * XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE: - * - * a whitespace-facet value of "preserve" - */ -#define XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE 1 << 24 -/** - * XML_SCHEMAS_TYPE_WHITESPACE_REPLACE: - * - * a whitespace-facet value of "replace" - */ -#define XML_SCHEMAS_TYPE_WHITESPACE_REPLACE 1 << 25 -/** - * XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE: - * - * a whitespace-facet value of "collapse" - */ -#define XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE 1 << 26 -/** - * XML_SCHEMAS_TYPE_HAS_FACETS: - * - * has facets - */ -#define XML_SCHEMAS_TYPE_HAS_FACETS 1 << 27 -/** - * XML_SCHEMAS_TYPE_NORMVALUENEEDED: - * - * indicates if the facets (pattern) need a normalized value - */ -#define XML_SCHEMAS_TYPE_NORMVALUENEEDED 1 << 28 - -/** - * XML_SCHEMAS_TYPE_FIXUP_1: - * - * First stage of fixup was done. - */ -#define XML_SCHEMAS_TYPE_FIXUP_1 1 << 29 - -/** - * XML_SCHEMAS_TYPE_REDEFINED: - * - * The type was redefined. - */ -#define XML_SCHEMAS_TYPE_REDEFINED 1 << 30 -/** - * XML_SCHEMAS_TYPE_REDEFINING: - * - * The type redefines an other type. - */ -/* #define XML_SCHEMAS_TYPE_REDEFINING 1 << 31 */ - -/** - * _xmlSchemaType: - * - * Schemas type definition. - */ -struct _xmlSchemaType { - xmlSchemaTypeType type; /* The kind of type */ - struct _xmlSchemaType *next; /* the next type if in a sequence ... */ - const xmlChar *name; - const xmlChar *id ; /* Deprecated; not used */ - const xmlChar *ref; /* Deprecated; not used */ - const xmlChar *refNs; /* Deprecated; not used */ - xmlSchemaAnnotPtr annot; - xmlSchemaTypePtr subtypes; - xmlSchemaAttributePtr attributes; /* Deprecated; not used */ - xmlNodePtr node; - int minOccurs; /* Deprecated; not used */ - int maxOccurs; /* Deprecated; not used */ - - int flags; - xmlSchemaContentType contentType; - const xmlChar *base; /* Base type's local name */ - const xmlChar *baseNs; /* Base type's target namespace */ - xmlSchemaTypePtr baseType; /* The base type component */ - xmlSchemaFacetPtr facets; /* Local facets */ - struct _xmlSchemaType *redef; /* Deprecated; not used */ - int recurse; /* Obsolete */ - xmlSchemaAttributeLinkPtr *attributeUses; /* Deprecated; not used */ - xmlSchemaWildcardPtr attributeWildcard; - int builtInType; /* Type of built-in types. */ - xmlSchemaTypeLinkPtr memberTypes; /* member-types if a union type. */ - xmlSchemaFacetLinkPtr facetSet; /* All facets (incl. inherited) */ - const xmlChar *refPrefix; /* Deprecated; not used */ - xmlSchemaTypePtr contentTypeDef; /* Used for the simple content of complex types. - Could we use @subtypes for this? */ - xmlRegexpPtr contModel; /* Holds the automaton of the content model */ - const xmlChar *targetNamespace; - void *attrUses; -}; - -/* - * xmlSchemaElement: - * An element definition. - * - * xmlSchemaType, xmlSchemaFacet and xmlSchemaElement start of - * structures must be kept similar - */ -/** - * XML_SCHEMAS_ELEM_NILLABLE: - * - * the element is nillable - */ -#define XML_SCHEMAS_ELEM_NILLABLE 1 << 0 -/** - * XML_SCHEMAS_ELEM_GLOBAL: - * - * the element is global - */ -#define XML_SCHEMAS_ELEM_GLOBAL 1 << 1 -/** - * XML_SCHEMAS_ELEM_DEFAULT: - * - * the element has a default value - */ -#define XML_SCHEMAS_ELEM_DEFAULT 1 << 2 -/** - * XML_SCHEMAS_ELEM_FIXED: - * - * the element has a fixed value - */ -#define XML_SCHEMAS_ELEM_FIXED 1 << 3 -/** - * XML_SCHEMAS_ELEM_ABSTRACT: - * - * the element is abstract - */ -#define XML_SCHEMAS_ELEM_ABSTRACT 1 << 4 -/** - * XML_SCHEMAS_ELEM_TOPLEVEL: - * - * the element is top level - * obsolete: use XML_SCHEMAS_ELEM_GLOBAL instead - */ -#define XML_SCHEMAS_ELEM_TOPLEVEL 1 << 5 -/** - * XML_SCHEMAS_ELEM_REF: - * - * the element is a reference to a type - */ -#define XML_SCHEMAS_ELEM_REF 1 << 6 -/** - * XML_SCHEMAS_ELEM_NSDEFAULT: - * - * allow elements in no namespace - * Obsolete, not used anymore. - */ -#define XML_SCHEMAS_ELEM_NSDEFAULT 1 << 7 -/** - * XML_SCHEMAS_ELEM_INTERNAL_RESOLVED: - * - * this is set when "type", "ref", "substitutionGroup" - * references have been resolved. - */ -#define XML_SCHEMAS_ELEM_INTERNAL_RESOLVED 1 << 8 - /** - * XML_SCHEMAS_ELEM_CIRCULAR: - * - * a helper flag for the search of circular references. - */ -#define XML_SCHEMAS_ELEM_CIRCULAR 1 << 9 -/** - * XML_SCHEMAS_ELEM_BLOCK_ABSENT: - * - * the "block" attribute is absent - */ -#define XML_SCHEMAS_ELEM_BLOCK_ABSENT 1 << 10 -/** - * XML_SCHEMAS_ELEM_BLOCK_EXTENSION: - * - * disallowed substitutions are absent - */ -#define XML_SCHEMAS_ELEM_BLOCK_EXTENSION 1 << 11 -/** - * XML_SCHEMAS_ELEM_BLOCK_RESTRICTION: - * - * disallowed substitutions: "restriction" - */ -#define XML_SCHEMAS_ELEM_BLOCK_RESTRICTION 1 << 12 -/** - * XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION: - * - * disallowed substitutions: "substituion" - */ -#define XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION 1 << 13 -/** - * XML_SCHEMAS_ELEM_FINAL_ABSENT: - * - * substitution group exclusions are absent - */ -#define XML_SCHEMAS_ELEM_FINAL_ABSENT 1 << 14 -/** - * XML_SCHEMAS_ELEM_FINAL_EXTENSION: - * - * substitution group exclusions: "extension" - */ -#define XML_SCHEMAS_ELEM_FINAL_EXTENSION 1 << 15 -/** - * XML_SCHEMAS_ELEM_FINAL_RESTRICTION: - * - * substitution group exclusions: "restriction" - */ -#define XML_SCHEMAS_ELEM_FINAL_RESTRICTION 1 << 16 -/** - * XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD: - * - * the declaration is a substitution group head - */ -#define XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD 1 << 17 -/** - * XML_SCHEMAS_ELEM_INTERNAL_CHECKED: - * - * this is set when the elem decl has been checked against - * all constraints - */ -#define XML_SCHEMAS_ELEM_INTERNAL_CHECKED 1 << 18 - -typedef struct _xmlSchemaElement xmlSchemaElement; -typedef xmlSchemaElement *xmlSchemaElementPtr; -struct _xmlSchemaElement { - xmlSchemaTypeType type; /* The kind of type */ - struct _xmlSchemaType *next; /* Not used? */ - const xmlChar *name; - const xmlChar *id; /* Deprecated; not used */ - const xmlChar *ref; /* Deprecated; not used */ - const xmlChar *refNs; /* Deprecated; not used */ - xmlSchemaAnnotPtr annot; - xmlSchemaTypePtr subtypes; /* the type definition */ - xmlSchemaAttributePtr attributes; - xmlNodePtr node; - int minOccurs; /* Deprecated; not used */ - int maxOccurs; /* Deprecated; not used */ - - int flags; - const xmlChar *targetNamespace; - const xmlChar *namedType; - const xmlChar *namedTypeNs; - const xmlChar *substGroup; - const xmlChar *substGroupNs; - const xmlChar *scope; - const xmlChar *value; /* The original value of the value constraint. */ - struct _xmlSchemaElement *refDecl; /* This will now be used for the - substitution group affiliation */ - xmlRegexpPtr contModel; /* Obsolete for WXS, maybe used for RelaxNG */ - xmlSchemaContentType contentType; - const xmlChar *refPrefix; /* Deprecated; not used */ - xmlSchemaValPtr defVal; /* The compiled value contraint. */ - void *idcs; /* The identity-constraint defs */ -}; - -/* - * XML_SCHEMAS_FACET_UNKNOWN: - * - * unknown facet handling - */ -#define XML_SCHEMAS_FACET_UNKNOWN 0 -/* - * XML_SCHEMAS_FACET_PRESERVE: - * - * preserve the type of the facet - */ -#define XML_SCHEMAS_FACET_PRESERVE 1 -/* - * XML_SCHEMAS_FACET_REPLACE: - * - * replace the type of the facet - */ -#define XML_SCHEMAS_FACET_REPLACE 2 -/* - * XML_SCHEMAS_FACET_COLLAPSE: - * - * collapse the types of the facet - */ -#define XML_SCHEMAS_FACET_COLLAPSE 3 -/** - * A facet definition. - */ -struct _xmlSchemaFacet { - xmlSchemaTypeType type; /* The kind of type */ - struct _xmlSchemaFacet *next;/* the next type if in a sequence ... */ - const xmlChar *value; /* The original value */ - const xmlChar *id; /* Obsolete */ - xmlSchemaAnnotPtr annot; - xmlNodePtr node; - int fixed; /* XML_SCHEMAS_FACET_PRESERVE, etc. */ - int whitespace; - xmlSchemaValPtr val; /* The compiled value */ - xmlRegexpPtr regexp; /* The regex for patterns */ -}; - -/** - * A notation definition. - */ -typedef struct _xmlSchemaNotation xmlSchemaNotation; -typedef xmlSchemaNotation *xmlSchemaNotationPtr; -struct _xmlSchemaNotation { - xmlSchemaTypeType type; /* The kind of type */ - const xmlChar *name; - xmlSchemaAnnotPtr annot; - const xmlChar *identifier; - const xmlChar *targetNamespace; -}; - -/* -* TODO: Actually all those flags used for the schema should sit -* on the schema parser context, since they are used only -* during parsing an XML schema document, and not available -* on the component level as per spec. -*/ -/** - * XML_SCHEMAS_QUALIF_ELEM: - * - * Reflects elementFormDefault == qualified in - * an XML schema document. - */ -#define XML_SCHEMAS_QUALIF_ELEM 1 << 0 -/** - * XML_SCHEMAS_QUALIF_ATTR: - * - * Reflects attributeFormDefault == qualified in - * an XML schema document. - */ -#define XML_SCHEMAS_QUALIF_ATTR 1 << 1 -/** - * XML_SCHEMAS_FINAL_DEFAULT_EXTENSION: - * - * the schema has "extension" in the set of finalDefault. - */ -#define XML_SCHEMAS_FINAL_DEFAULT_EXTENSION 1 << 2 -/** - * XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION: - * - * the schema has "restriction" in the set of finalDefault. - */ -#define XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION 1 << 3 -/** - * XML_SCHEMAS_FINAL_DEFAULT_LIST: - * - * the cshema has "list" in the set of finalDefault. - */ -#define XML_SCHEMAS_FINAL_DEFAULT_LIST 1 << 4 -/** - * XML_SCHEMAS_FINAL_DEFAULT_UNION: - * - * the schema has "union" in the set of finalDefault. - */ -#define XML_SCHEMAS_FINAL_DEFAULT_UNION 1 << 5 -/** - * XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION: - * - * the schema has "extension" in the set of blockDefault. - */ -#define XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION 1 << 6 -/** - * XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION: - * - * the schema has "restriction" in the set of blockDefault. - */ -#define XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION 1 << 7 -/** - * XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION: - * - * the schema has "substitution" in the set of blockDefault. - */ -#define XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION 1 << 8 -/** - * XML_SCHEMAS_INCLUDING_CONVERT_NS: - * - * the schema is currently including an other schema with - * no target namespace. - */ -#define XML_SCHEMAS_INCLUDING_CONVERT_NS 1 << 9 -/** - * _xmlSchema: - * - * A Schemas definition - */ -struct _xmlSchema { - const xmlChar *name; /* schema name */ - const xmlChar *targetNamespace; /* the target namespace */ - const xmlChar *version; - const xmlChar *id; /* Obsolete */ - xmlDocPtr doc; - xmlSchemaAnnotPtr annot; - int flags; - - xmlHashTablePtr typeDecl; - xmlHashTablePtr attrDecl; - xmlHashTablePtr attrgrpDecl; - xmlHashTablePtr elemDecl; - xmlHashTablePtr notaDecl; - - xmlHashTablePtr schemasImports; - - void *_private; /* unused by the library for users or bindings */ - xmlHashTablePtr groupDecl; - xmlDictPtr dict; - void *includes; /* the includes, this is opaque for now */ - int preserve; /* whether to free the document */ - int counter; /* used to give ononymous components unique names */ - xmlHashTablePtr idcDef; /* All identity-constraint defs. */ - void *volatiles; /* Obsolete */ -}; - -XMLPUBFUN void XMLCALL xmlSchemaFreeType (xmlSchemaTypePtr type); -XMLPUBFUN void XMLCALL xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_SCHEMAS_ENABLED */ -#endif /* __XML_SCHEMA_INTERNALS_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/schematron.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/schematron.h deleted file mode 100644 index 21c56a9d464..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/schematron.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Summary: XML Schemastron implementation - * Description: interface to the XML Schematron validity checking. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - - -#ifndef __XML_SCHEMATRON_H__ -#define __XML_SCHEMATRON_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_SCHEMATRON_ENABLED - -#include "tree.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - XML_SCHEMATRON_OUT_QUIET = 1 << 0, /* quiet no report */ - XML_SCHEMATRON_OUT_TEXT = 1 << 1, /* build a textual report */ - XML_SCHEMATRON_OUT_XML = 1 << 2, /* output SVRL */ - XML_SCHEMATRON_OUT_FILE = 1 << 8, /* output to a file descriptor */ - XML_SCHEMATRON_OUT_BUFFER = 1 << 9, /* output to a buffer */ - XML_SCHEMATRON_OUT_IO = 1 << 10 /* output to I/O mechanism */ -} xmlSchematronValidOptions; - -/** - * The schemas related types are kept internal - */ -typedef struct _xmlSchematron xmlSchematron; -typedef xmlSchematron *xmlSchematronPtr; - -/** - * A schemas validation context - */ -typedef void (*xmlSchematronValidityErrorFunc) (void *ctx, const char *msg, ...); -typedef void (*xmlSchematronValidityWarningFunc) (void *ctx, const char *msg, ...); - -typedef struct _xmlSchematronParserCtxt xmlSchematronParserCtxt; -typedef xmlSchematronParserCtxt *xmlSchematronParserCtxtPtr; - -typedef struct _xmlSchematronValidCtxt xmlSchematronValidCtxt; -typedef xmlSchematronValidCtxt *xmlSchematronValidCtxtPtr; - -/* - * Interfaces for parsing. - */ -XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL - xmlSchematronNewParserCtxt (const char *URL); -XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL - xmlSchematronNewMemParserCtxt(const char *buffer, - int size); -XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL - xmlSchematronNewDocParserCtxt(xmlDocPtr doc); -XMLPUBFUN void XMLCALL - xmlSchematronFreeParserCtxt (xmlSchematronParserCtxtPtr ctxt); -/***** -XMLPUBFUN void XMLCALL - xmlSchematronSetParserErrors(xmlSchematronParserCtxtPtr ctxt, - xmlSchematronValidityErrorFunc err, - xmlSchematronValidityWarningFunc warn, - void *ctx); -XMLPUBFUN int XMLCALL - xmlSchematronGetParserErrors(xmlSchematronParserCtxtPtr ctxt, - xmlSchematronValidityErrorFunc * err, - xmlSchematronValidityWarningFunc * warn, - void **ctx); -XMLPUBFUN int XMLCALL - xmlSchematronIsValid (xmlSchematronValidCtxtPtr ctxt); - *****/ -XMLPUBFUN xmlSchematronPtr XMLCALL - xmlSchematronParse (xmlSchematronParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlSchematronFree (xmlSchematronPtr schema); -/* - * Interfaces for validating - */ -/****** -XMLPUBFUN void XMLCALL - xmlSchematronSetValidStructuredErrors( - xmlSchematronValidCtxtPtr ctxt, - xmlStructuredErrorFunc serror, - void *ctx); -XMLPUBFUN void XMLCALL - xmlSchematronSetValidErrors (xmlSchematronValidCtxtPtr ctxt, - xmlSchematronValidityErrorFunc err, - xmlSchematronValidityWarningFunc warn, - void *ctx); -XMLPUBFUN int XMLCALL - xmlSchematronGetValidErrors (xmlSchematronValidCtxtPtr ctxt, - xmlSchematronValidityErrorFunc *err, - xmlSchematronValidityWarningFunc *warn, - void **ctx); -XMLPUBFUN int XMLCALL - xmlSchematronSetValidOptions(xmlSchematronValidCtxtPtr ctxt, - int options); -XMLPUBFUN int XMLCALL - xmlSchematronValidCtxtGetOptions(xmlSchematronValidCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlSchematronValidateOneElement (xmlSchematronValidCtxtPtr ctxt, - xmlNodePtr elem); - *******/ - -XMLPUBFUN xmlSchematronValidCtxtPtr XMLCALL - xmlSchematronNewValidCtxt (xmlSchematronPtr schema, - int options); -XMLPUBFUN void XMLCALL - xmlSchematronFreeValidCtxt (xmlSchematronValidCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlSchematronValidateDoc (xmlSchematronValidCtxtPtr ctxt, - xmlDocPtr instance); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_SCHEMATRON_ENABLED */ -#endif /* __XML_SCHEMATRON_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/threads.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/threads.h deleted file mode 100644 index facb49ad632..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/threads.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Summary: interfaces for thread handling - * Description: set of generic threading related routines - * should work with pthreads, Windows native or TLS threads - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_THREADS_H__ -#define __XML_THREADS_H__ - -#include "xmlversion.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * xmlMutex are a simple mutual exception locks. - */ -typedef struct _xmlMutex xmlMutex; -typedef xmlMutex *xmlMutexPtr; - -/* - * xmlRMutex are reentrant mutual exception locks. - */ -typedef struct _xmlRMutex xmlRMutex; -typedef xmlRMutex *xmlRMutexPtr; - -#ifdef __cplusplus -} -#endif -#include "globals.h" -#ifdef __cplusplus -extern "C" { -#endif -XMLPUBFUN xmlMutexPtr XMLCALL - xmlNewMutex (void); -XMLPUBFUN void XMLCALL - xmlMutexLock (xmlMutexPtr tok); -XMLPUBFUN void XMLCALL - xmlMutexUnlock (xmlMutexPtr tok); -XMLPUBFUN void XMLCALL - xmlFreeMutex (xmlMutexPtr tok); - -XMLPUBFUN xmlRMutexPtr XMLCALL - xmlNewRMutex (void); -XMLPUBFUN void XMLCALL - xmlRMutexLock (xmlRMutexPtr tok); -XMLPUBFUN void XMLCALL - xmlRMutexUnlock (xmlRMutexPtr tok); -XMLPUBFUN void XMLCALL - xmlFreeRMutex (xmlRMutexPtr tok); - -/* - * Library wide APIs. - */ -XMLPUBFUN void XMLCALL - xmlInitThreads (void); -XMLPUBFUN void XMLCALL - xmlLockLibrary (void); -XMLPUBFUN void XMLCALL - xmlUnlockLibrary(void); -XMLPUBFUN int XMLCALL - xmlGetThreadId (void); -XMLPUBFUN int XMLCALL - xmlIsMainThread (void); -XMLPUBFUN void XMLCALL - xmlCleanupThreads(void); -XMLPUBFUN xmlGlobalStatePtr XMLCALL - xmlGetGlobalState(void); - -#ifdef __cplusplus -} -#endif - - -#endif /* __XML_THREADS_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/tree.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/tree.h deleted file mode 100644 index 084bc9b9b88..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/tree.h +++ /dev/null @@ -1,1208 +0,0 @@ -/* - * Summary: interfaces for tree manipulation - * Description: this module describes the structures found in an tree resulting - * from an XML or HTML parsing, as well as the API provided for - * various processing on that tree - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_TREE_H__ -#define __XML_TREE_H__ - -#include <stdio.h> -#include "xmlversion.h" -#include "xmlstring.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Some of the basic types pointer to structures: - */ -/* xmlIO.h */ -typedef struct _xmlParserInputBuffer xmlParserInputBuffer; -typedef xmlParserInputBuffer *xmlParserInputBufferPtr; - -typedef struct _xmlOutputBuffer xmlOutputBuffer; -typedef xmlOutputBuffer *xmlOutputBufferPtr; - -/* parser.h */ -typedef struct _xmlParserInput xmlParserInput; -typedef xmlParserInput *xmlParserInputPtr; - -typedef struct _xmlParserCtxt xmlParserCtxt; -typedef xmlParserCtxt *xmlParserCtxtPtr; - -typedef struct _xmlSAXLocator xmlSAXLocator; -typedef xmlSAXLocator *xmlSAXLocatorPtr; - -typedef struct _xmlSAXHandler xmlSAXHandler; -typedef xmlSAXHandler *xmlSAXHandlerPtr; - -/* entities.h */ -typedef struct _xmlEntity xmlEntity; -typedef xmlEntity *xmlEntityPtr; - -/** - * BASE_BUFFER_SIZE: - * - * default buffer size 4000. - */ -#define BASE_BUFFER_SIZE 4096 - -/** - * LIBXML_NAMESPACE_DICT: - * - * Defines experimental behaviour: - * 1) xmlNs gets an additional field @context (a xmlDoc) - * 2) when creating a tree, xmlNs->href is stored in the dict of xmlDoc. - */ -/* #define LIBXML_NAMESPACE_DICT */ - -/** - * xmlBufferAllocationScheme: - * - * A buffer allocation scheme can be defined to either match exactly the - * need or double it's allocated size each time it is found too small. - */ - -typedef enum { - XML_BUFFER_ALLOC_DOUBLEIT, - XML_BUFFER_ALLOC_EXACT, - XML_BUFFER_ALLOC_IMMUTABLE -} xmlBufferAllocationScheme; - -/** - * xmlBuffer: - * - * A buffer structure. - */ -typedef struct _xmlBuffer xmlBuffer; -typedef xmlBuffer *xmlBufferPtr; -struct _xmlBuffer { - xmlChar *content; /* The buffer content UTF8 */ - unsigned int use; /* The buffer size used */ - unsigned int size; /* The buffer size */ - xmlBufferAllocationScheme alloc; /* The realloc method */ -}; - -/** - * XML_XML_NAMESPACE: - * - * This is the namespace for the special xml: prefix predefined in the - * XML Namespace specification. - */ -#define XML_XML_NAMESPACE \ - (const xmlChar *) "http://www.w3.org/XML/1998/namespace" - -/** - * XML_XML_ID: - * - * This is the name for the special xml:id attribute - */ -#define XML_XML_ID (const xmlChar *) "xml:id" - -/* - * The different element types carried by an XML tree. - * - * NOTE: This is synchronized with DOM Level1 values - * See http://www.w3.org/TR/REC-DOM-Level-1/ - * - * Actually this had diverged a bit, and now XML_DOCUMENT_TYPE_NODE should - * be deprecated to use an XML_DTD_NODE. - */ -typedef enum { - XML_ELEMENT_NODE= 1, - XML_ATTRIBUTE_NODE= 2, - XML_TEXT_NODE= 3, - XML_CDATA_SECTION_NODE= 4, - XML_ENTITY_REF_NODE= 5, - XML_ENTITY_NODE= 6, - XML_PI_NODE= 7, - XML_COMMENT_NODE= 8, - XML_DOCUMENT_NODE= 9, - XML_DOCUMENT_TYPE_NODE= 10, - XML_DOCUMENT_FRAG_NODE= 11, - XML_NOTATION_NODE= 12, - XML_HTML_DOCUMENT_NODE= 13, - XML_DTD_NODE= 14, - XML_ELEMENT_DECL= 15, - XML_ATTRIBUTE_DECL= 16, - XML_ENTITY_DECL= 17, - XML_NAMESPACE_DECL= 18, - XML_XINCLUDE_START= 19, - XML_XINCLUDE_END= 20 -#ifdef LIBXML_DOCB_ENABLED - ,XML_DOCB_DOCUMENT_NODE= 21 -#endif -} xmlElementType; - - -/** - * xmlNotation: - * - * A DTD Notation definition. - */ - -typedef struct _xmlNotation xmlNotation; -typedef xmlNotation *xmlNotationPtr; -struct _xmlNotation { - const xmlChar *name; /* Notation name */ - const xmlChar *PublicID; /* Public identifier, if any */ - const xmlChar *SystemID; /* System identifier, if any */ -}; - -/** - * xmlAttributeType: - * - * A DTD Attribute type definition. - */ - -typedef enum { - XML_ATTRIBUTE_CDATA = 1, - XML_ATTRIBUTE_ID, - XML_ATTRIBUTE_IDREF , - XML_ATTRIBUTE_IDREFS, - XML_ATTRIBUTE_ENTITY, - XML_ATTRIBUTE_ENTITIES, - XML_ATTRIBUTE_NMTOKEN, - XML_ATTRIBUTE_NMTOKENS, - XML_ATTRIBUTE_ENUMERATION, - XML_ATTRIBUTE_NOTATION -} xmlAttributeType; - -/** - * xmlAttributeDefault: - * - * A DTD Attribute default definition. - */ - -typedef enum { - XML_ATTRIBUTE_NONE = 1, - XML_ATTRIBUTE_REQUIRED, - XML_ATTRIBUTE_IMPLIED, - XML_ATTRIBUTE_FIXED -} xmlAttributeDefault; - -/** - * xmlEnumeration: - * - * List structure used when there is an enumeration in DTDs. - */ - -typedef struct _xmlEnumeration xmlEnumeration; -typedef xmlEnumeration *xmlEnumerationPtr; -struct _xmlEnumeration { - struct _xmlEnumeration *next; /* next one */ - const xmlChar *name; /* Enumeration name */ -}; - -/** - * xmlAttribute: - * - * An Attribute declaration in a DTD. - */ - -typedef struct _xmlAttribute xmlAttribute; -typedef xmlAttribute *xmlAttributePtr; -struct _xmlAttribute { - void *_private; /* application data */ - xmlElementType type; /* XML_ATTRIBUTE_DECL, must be second ! */ - const xmlChar *name; /* Attribute name */ - struct _xmlNode *children; /* NULL */ - struct _xmlNode *last; /* NULL */ - struct _xmlDtd *parent; /* -> DTD */ - struct _xmlNode *next; /* next sibling link */ - struct _xmlNode *prev; /* previous sibling link */ - struct _xmlDoc *doc; /* the containing document */ - - struct _xmlAttribute *nexth; /* next in hash table */ - xmlAttributeType atype; /* The attribute type */ - xmlAttributeDefault def; /* the default */ - const xmlChar *defaultValue; /* or the default value */ - xmlEnumerationPtr tree; /* or the enumeration tree if any */ - const xmlChar *prefix; /* the namespace prefix if any */ - const xmlChar *elem; /* Element holding the attribute */ -}; - -/** - * xmlElementContentType: - * - * Possible definitions of element content types. - */ -typedef enum { - XML_ELEMENT_CONTENT_PCDATA = 1, - XML_ELEMENT_CONTENT_ELEMENT, - XML_ELEMENT_CONTENT_SEQ, - XML_ELEMENT_CONTENT_OR -} xmlElementContentType; - -/** - * xmlElementContentOccur: - * - * Possible definitions of element content occurrences. - */ -typedef enum { - XML_ELEMENT_CONTENT_ONCE = 1, - XML_ELEMENT_CONTENT_OPT, - XML_ELEMENT_CONTENT_MULT, - XML_ELEMENT_CONTENT_PLUS -} xmlElementContentOccur; - -/** - * xmlElementContent: - * - * An XML Element content as stored after parsing an element definition - * in a DTD. - */ - -typedef struct _xmlElementContent xmlElementContent; -typedef xmlElementContent *xmlElementContentPtr; -struct _xmlElementContent { - xmlElementContentType type; /* PCDATA, ELEMENT, SEQ or OR */ - xmlElementContentOccur ocur; /* ONCE, OPT, MULT or PLUS */ - const xmlChar *name; /* Element name */ - struct _xmlElementContent *c1; /* first child */ - struct _xmlElementContent *c2; /* second child */ - struct _xmlElementContent *parent; /* parent */ - const xmlChar *prefix; /* Namespace prefix */ -}; - -/** - * xmlElementTypeVal: - * - * The different possibilities for an element content type. - */ - -typedef enum { - XML_ELEMENT_TYPE_UNDEFINED = 0, - XML_ELEMENT_TYPE_EMPTY = 1, - XML_ELEMENT_TYPE_ANY, - XML_ELEMENT_TYPE_MIXED, - XML_ELEMENT_TYPE_ELEMENT -} xmlElementTypeVal; - -#ifdef __cplusplus -} -#endif -#include "xmlregexp.h" -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlElement: - * - * An XML Element declaration from a DTD. - */ - -typedef struct _xmlElement xmlElement; -typedef xmlElement *xmlElementPtr; -struct _xmlElement { - void *_private; /* application data */ - xmlElementType type; /* XML_ELEMENT_DECL, must be second ! */ - const xmlChar *name; /* Element name */ - struct _xmlNode *children; /* NULL */ - struct _xmlNode *last; /* NULL */ - struct _xmlDtd *parent; /* -> DTD */ - struct _xmlNode *next; /* next sibling link */ - struct _xmlNode *prev; /* previous sibling link */ - struct _xmlDoc *doc; /* the containing document */ - - xmlElementTypeVal etype; /* The type */ - xmlElementContentPtr content; /* the allowed element content */ - xmlAttributePtr attributes; /* List of the declared attributes */ - const xmlChar *prefix; /* the namespace prefix if any */ -#ifdef LIBXML_REGEXP_ENABLED - xmlRegexpPtr contModel; /* the validating regexp */ -#else - void *contModel; -#endif -}; - - -/** - * XML_LOCAL_NAMESPACE: - * - * A namespace declaration node. - */ -#define XML_LOCAL_NAMESPACE XML_NAMESPACE_DECL -typedef xmlElementType xmlNsType; - -/** - * xmlNs: - * - * An XML namespace. - * Note that prefix == NULL is valid, it defines the default namespace - * within the subtree (until overridden). - * - * xmlNsType is unified with xmlElementType. - */ - -typedef struct _xmlNs xmlNs; -typedef xmlNs *xmlNsPtr; -struct _xmlNs { - struct _xmlNs *next; /* next Ns link for this node */ - xmlNsType type; /* global or local */ - const xmlChar *href; /* URL for the namespace */ - const xmlChar *prefix; /* prefix for the namespace */ - void *_private; /* application data */ - struct _xmlDoc *context; /* normally an xmlDoc */ -}; - -/** - * xmlDtd: - * - * An XML DTD, as defined by <!DOCTYPE ... There is actually one for - * the internal subset and for the external subset. - */ -typedef struct _xmlDtd xmlDtd; -typedef xmlDtd *xmlDtdPtr; -struct _xmlDtd { - void *_private; /* application data */ - xmlElementType type; /* XML_DTD_NODE, must be second ! */ - const xmlChar *name; /* Name of the DTD */ - struct _xmlNode *children; /* the value of the property link */ - struct _xmlNode *last; /* last child link */ - struct _xmlDoc *parent; /* child->parent link */ - struct _xmlNode *next; /* next sibling link */ - struct _xmlNode *prev; /* previous sibling link */ - struct _xmlDoc *doc; /* the containing document */ - - /* End of common part */ - void *notations; /* Hash table for notations if any */ - void *elements; /* Hash table for elements if any */ - void *attributes; /* Hash table for attributes if any */ - void *entities; /* Hash table for entities if any */ - const xmlChar *ExternalID; /* External identifier for PUBLIC DTD */ - const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC DTD */ - void *pentities; /* Hash table for param entities if any */ -}; - -/** - * xmlAttr: - * - * An attribute on an XML node. - */ -typedef struct _xmlAttr xmlAttr; -typedef xmlAttr *xmlAttrPtr; -struct _xmlAttr { - void *_private; /* application data */ - xmlElementType type; /* XML_ATTRIBUTE_NODE, must be second ! */ - const xmlChar *name; /* the name of the property */ - struct _xmlNode *children; /* the value of the property */ - struct _xmlNode *last; /* NULL */ - struct _xmlNode *parent; /* child->parent link */ - struct _xmlAttr *next; /* next sibling link */ - struct _xmlAttr *prev; /* previous sibling link */ - struct _xmlDoc *doc; /* the containing document */ - xmlNs *ns; /* pointer to the associated namespace */ - xmlAttributeType atype; /* the attribute type if validating */ - void *psvi; /* for type/PSVI informations */ -}; - -/** - * xmlID: - * - * An XML ID instance. - */ - -typedef struct _xmlID xmlID; -typedef xmlID *xmlIDPtr; -struct _xmlID { - struct _xmlID *next; /* next ID */ - const xmlChar *value; /* The ID name */ - xmlAttrPtr attr; /* The attribute holding it */ - const xmlChar *name; /* The attribute if attr is not available */ - int lineno; /* The line number if attr is not available */ - struct _xmlDoc *doc; /* The document holding the ID */ -}; - -/** - * xmlRef: - * - * An XML IDREF instance. - */ - -typedef struct _xmlRef xmlRef; -typedef xmlRef *xmlRefPtr; -struct _xmlRef { - struct _xmlRef *next; /* next Ref */ - const xmlChar *value; /* The Ref name */ - xmlAttrPtr attr; /* The attribute holding it */ - const xmlChar *name; /* The attribute if attr is not available */ - int lineno; /* The line number if attr is not available */ -}; - -/** - * xmlNode: - * - * A node in an XML tree. - */ -typedef struct _xmlNode xmlNode; -typedef xmlNode *xmlNodePtr; -struct _xmlNode { - void *_private; /* application data */ - xmlElementType type; /* type number, must be second ! */ - const xmlChar *name; /* the name of the node, or the entity */ - struct _xmlNode *children; /* parent->childs link */ - struct _xmlNode *last; /* last child link */ - struct _xmlNode *parent; /* child->parent link */ - struct _xmlNode *next; /* next sibling link */ - struct _xmlNode *prev; /* previous sibling link */ - struct _xmlDoc *doc; /* the containing document */ - - /* End of common part */ - xmlNs *ns; /* pointer to the associated namespace */ - xmlChar *content; /* the content */ - struct _xmlAttr *properties;/* properties list */ - xmlNs *nsDef; /* namespace definitions on this node */ - void *psvi; /* for type/PSVI informations */ - unsigned short line; /* line number */ - unsigned short extra; /* extra data for XPath/XSLT */ -}; - -/** - * XML_GET_CONTENT: - * - * Macro to extract the content pointer of a node. - */ -#define XML_GET_CONTENT(n) \ - ((n)->type == XML_ELEMENT_NODE ? NULL : (n)->content) - -/** - * XML_GET_LINE: - * - * Macro to extract the line number of an element node. - */ -#define XML_GET_LINE(n) \ - (xmlGetLineNo(n)) - - -/** - * xmlDoc: - * - * An XML document. - */ -typedef struct _xmlDoc xmlDoc; -typedef xmlDoc *xmlDocPtr; -struct _xmlDoc { - void *_private; /* application data */ - xmlElementType type; /* XML_DOCUMENT_NODE, must be second ! */ - char *name; /* name/filename/URI of the document */ - struct _xmlNode *children; /* the document tree */ - struct _xmlNode *last; /* last child link */ - struct _xmlNode *parent; /* child->parent link */ - struct _xmlNode *next; /* next sibling link */ - struct _xmlNode *prev; /* previous sibling link */ - struct _xmlDoc *doc; /* autoreference to itself */ - - /* End of common part */ - int compression;/* level of zlib compression */ - int standalone; /* standalone document (no external refs) */ - struct _xmlDtd *intSubset; /* the document internal subset */ - struct _xmlDtd *extSubset; /* the document external subset */ - struct _xmlNs *oldNs; /* Global namespace, the old way */ - const xmlChar *version; /* the XML version string */ - const xmlChar *encoding; /* external initial encoding, if any */ - void *ids; /* Hash table for ID attributes if any */ - void *refs; /* Hash table for IDREFs attributes if any */ - const xmlChar *URL; /* The URI for that document */ - int charset; /* encoding of the in-memory content - actually an xmlCharEncoding */ - struct _xmlDict *dict; /* dict used to allocate names or NULL */ - void *psvi; /* for type/PSVI informations */ -}; - - -typedef struct _xmlDOMWrapCtxt xmlDOMWrapCtxt; -typedef xmlDOMWrapCtxt *xmlDOMWrapCtxtPtr; - -/** - * xmlDOMWrapAcquireNsFunction: - * @ctxt: a DOM wrapper context - * @node: the context node (element or attribute) - * @nsName: the requested namespace name - * @nsPrefix: the requested namespace prefix - * - * A function called to acquire namespaces (xmlNs) from the wrapper. - * - * Returns an xmlNsPtr or NULL in case of an error. - */ -typedef xmlNsPtr (*xmlDOMWrapAcquireNsFunction) (xmlDOMWrapCtxtPtr ctxt, - xmlNodePtr node, - const xmlChar *nsName, - const xmlChar *nsPrefix); - -/** - * xmlDOMWrapCtxt: - * - * Context for DOM wrapper-operations. - */ -struct _xmlDOMWrapCtxt { - void * _private; - /* - * The type of this context, just in case we need specialized - * contexts in the future. - */ - int type; - /* - * Internal namespace map used for various operations. - */ - void * namespaceMap; - /* - * Use this one to acquire an xmlNsPtr intended for node->ns. - * (Note that this is not intended for elem->nsDef). - */ - xmlDOMWrapAcquireNsFunction getNsForNodeFunc; -}; - -/** - * xmlChildrenNode: - * - * Macro for compatibility naming layer with libxml1. Maps - * to "children." - */ -#ifndef xmlChildrenNode -#define xmlChildrenNode children -#endif - -/** - * xmlRootNode: - * - * Macro for compatibility naming layer with libxml1. Maps - * to "children". - */ -#ifndef xmlRootNode -#define xmlRootNode children -#endif - -/* - * Variables. - */ - -/* - * Some helper functions - */ -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) -XMLPUBFUN int XMLCALL - xmlValidateNCName (const xmlChar *value, - int space); -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN int XMLCALL - xmlValidateQName (const xmlChar *value, - int space); -XMLPUBFUN int XMLCALL - xmlValidateName (const xmlChar *value, - int space); -XMLPUBFUN int XMLCALL - xmlValidateNMToken (const xmlChar *value, - int space); -#endif - -XMLPUBFUN xmlChar * XMLCALL - xmlBuildQName (const xmlChar *ncname, - const xmlChar *prefix, - xmlChar *memory, - int len); -XMLPUBFUN xmlChar * XMLCALL - xmlSplitQName2 (const xmlChar *name, - xmlChar **prefix); -XMLPUBFUN const xmlChar * XMLCALL - xmlSplitQName3 (const xmlChar *name, - int *len); - -/* - * Handling Buffers. - */ - -XMLPUBFUN void XMLCALL - xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme); -XMLPUBFUN xmlBufferAllocationScheme XMLCALL - xmlGetBufferAllocationScheme(void); - -XMLPUBFUN xmlBufferPtr XMLCALL - xmlBufferCreate (void); -XMLPUBFUN xmlBufferPtr XMLCALL - xmlBufferCreateSize (size_t size); -XMLPUBFUN xmlBufferPtr XMLCALL - xmlBufferCreateStatic (void *mem, - size_t size); -XMLPUBFUN int XMLCALL - xmlBufferResize (xmlBufferPtr buf, - unsigned int size); -XMLPUBFUN void XMLCALL - xmlBufferFree (xmlBufferPtr buf); -XMLPUBFUN int XMLCALL - xmlBufferDump (FILE *file, - xmlBufferPtr buf); -XMLPUBFUN int XMLCALL - xmlBufferAdd (xmlBufferPtr buf, - const xmlChar *str, - int len); -XMLPUBFUN int XMLCALL - xmlBufferAddHead (xmlBufferPtr buf, - const xmlChar *str, - int len); -XMLPUBFUN int XMLCALL - xmlBufferCat (xmlBufferPtr buf, - const xmlChar *str); -XMLPUBFUN int XMLCALL - xmlBufferCCat (xmlBufferPtr buf, - const char *str); -XMLPUBFUN int XMLCALL - xmlBufferShrink (xmlBufferPtr buf, - unsigned int len); -XMLPUBFUN int XMLCALL - xmlBufferGrow (xmlBufferPtr buf, - unsigned int len); -XMLPUBFUN void XMLCALL - xmlBufferEmpty (xmlBufferPtr buf); -XMLPUBFUN const xmlChar* XMLCALL - xmlBufferContent (const xmlBufferPtr buf); -XMLPUBFUN void XMLCALL - xmlBufferSetAllocationScheme(xmlBufferPtr buf, - xmlBufferAllocationScheme scheme); -XMLPUBFUN int XMLCALL - xmlBufferLength (const xmlBufferPtr buf); - -/* - * Creating/freeing new structures. - */ -XMLPUBFUN xmlDtdPtr XMLCALL - xmlCreateIntSubset (xmlDocPtr doc, - const xmlChar *name, - const xmlChar *ExternalID, - const xmlChar *SystemID); -XMLPUBFUN xmlDtdPtr XMLCALL - xmlNewDtd (xmlDocPtr doc, - const xmlChar *name, - const xmlChar *ExternalID, - const xmlChar *SystemID); -XMLPUBFUN xmlDtdPtr XMLCALL - xmlGetIntSubset (xmlDocPtr doc); -XMLPUBFUN void XMLCALL - xmlFreeDtd (xmlDtdPtr cur); -#ifdef LIBXML_LEGACY_ENABLED -XMLPUBFUN xmlNsPtr XMLCALL - xmlNewGlobalNs (xmlDocPtr doc, - const xmlChar *href, - const xmlChar *prefix); -#endif /* LIBXML_LEGACY_ENABLED */ -XMLPUBFUN xmlNsPtr XMLCALL - xmlNewNs (xmlNodePtr node, - const xmlChar *href, - const xmlChar *prefix); -XMLPUBFUN void XMLCALL - xmlFreeNs (xmlNsPtr cur); -XMLPUBFUN void XMLCALL - xmlFreeNsList (xmlNsPtr cur); -XMLPUBFUN xmlDocPtr XMLCALL - xmlNewDoc (const xmlChar *version); -XMLPUBFUN void XMLCALL - xmlFreeDoc (xmlDocPtr cur); -XMLPUBFUN xmlAttrPtr XMLCALL - xmlNewDocProp (xmlDocPtr doc, - const xmlChar *name, - const xmlChar *value); -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ - defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlAttrPtr XMLCALL - xmlNewProp (xmlNodePtr node, - const xmlChar *name, - const xmlChar *value); -#endif -XMLPUBFUN xmlAttrPtr XMLCALL - xmlNewNsProp (xmlNodePtr node, - xmlNsPtr ns, - const xmlChar *name, - const xmlChar *value); -XMLPUBFUN xmlAttrPtr XMLCALL - xmlNewNsPropEatName (xmlNodePtr node, - xmlNsPtr ns, - xmlChar *name, - const xmlChar *value); -XMLPUBFUN void XMLCALL - xmlFreePropList (xmlAttrPtr cur); -XMLPUBFUN void XMLCALL - xmlFreeProp (xmlAttrPtr cur); -XMLPUBFUN xmlAttrPtr XMLCALL - xmlCopyProp (xmlNodePtr target, - xmlAttrPtr cur); -XMLPUBFUN xmlAttrPtr XMLCALL - xmlCopyPropList (xmlNodePtr target, - xmlAttrPtr cur); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlDtdPtr XMLCALL - xmlCopyDtd (xmlDtdPtr dtd); -#endif /* LIBXML_TREE_ENABLED */ -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlDocPtr XMLCALL - xmlCopyDoc (xmlDocPtr doc, - int recursive); -#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */ -/* - * Creating new nodes. - */ -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewDocNode (xmlDocPtr doc, - xmlNsPtr ns, - const xmlChar *name, - const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewDocNodeEatName (xmlDocPtr doc, - xmlNsPtr ns, - xmlChar *name, - const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewNode (xmlNsPtr ns, - const xmlChar *name); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewNodeEatName (xmlNsPtr ns, - xmlChar *name); -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewChild (xmlNodePtr parent, - xmlNsPtr ns, - const xmlChar *name, - const xmlChar *content); -#endif -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewDocText (xmlDocPtr doc, - const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewText (const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewDocPI (xmlDocPtr doc, - const xmlChar *name, - const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewPI (const xmlChar *name, - const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewDocTextLen (xmlDocPtr doc, - const xmlChar *content, - int len); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewTextLen (const xmlChar *content, - int len); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewDocComment (xmlDocPtr doc, - const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewComment (const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewCDataBlock (xmlDocPtr doc, - const xmlChar *content, - int len); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewCharRef (xmlDocPtr doc, - const xmlChar *name); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewReference (xmlDocPtr doc, - const xmlChar *name); -XMLPUBFUN xmlNodePtr XMLCALL - xmlCopyNode (const xmlNodePtr node, - int recursive); -XMLPUBFUN xmlNodePtr XMLCALL - xmlDocCopyNode (const xmlNodePtr node, - xmlDocPtr doc, - int recursive); -XMLPUBFUN xmlNodePtr XMLCALL - xmlDocCopyNodeList (xmlDocPtr doc, - const xmlNodePtr node); -XMLPUBFUN xmlNodePtr XMLCALL - xmlCopyNodeList (const xmlNodePtr node); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewTextChild (xmlNodePtr parent, - xmlNsPtr ns, - const xmlChar *name, - const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewDocRawNode (xmlDocPtr doc, - xmlNsPtr ns, - const xmlChar *name, - const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL - xmlNewDocFragment (xmlDocPtr doc); -#endif /* LIBXML_TREE_ENABLED */ - -/* - * Navigating. - */ -XMLPUBFUN long XMLCALL - xmlGetLineNo (xmlNodePtr node); -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) -XMLPUBFUN xmlChar * XMLCALL - xmlGetNodePath (xmlNodePtr node); -#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) */ -XMLPUBFUN xmlNodePtr XMLCALL - xmlDocGetRootElement (xmlDocPtr doc); -XMLPUBFUN xmlNodePtr XMLCALL - xmlGetLastChild (xmlNodePtr parent); -XMLPUBFUN int XMLCALL - xmlNodeIsText (xmlNodePtr node); -XMLPUBFUN int XMLCALL - xmlIsBlankNode (xmlNodePtr node); - -/* - * Changing the structure. - */ -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) -XMLPUBFUN xmlNodePtr XMLCALL - xmlDocSetRootElement (xmlDocPtr doc, - xmlNodePtr root); -#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */ -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN void XMLCALL - xmlNodeSetName (xmlNodePtr cur, - const xmlChar *name); -#endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN xmlNodePtr XMLCALL - xmlAddChild (xmlNodePtr parent, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL - xmlAddChildList (xmlNodePtr parent, - xmlNodePtr cur); -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) -XMLPUBFUN xmlNodePtr XMLCALL - xmlReplaceNode (xmlNodePtr old, - xmlNodePtr cur); -#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */ -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ - defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlNodePtr XMLCALL - xmlAddPrevSibling (xmlNodePtr cur, - xmlNodePtr elem); -#endif /* LIBXML_TREE_ENABLED || LIBXML_HTML_ENABLED || LIBXML_SCHEMAS_ENABLED */ -XMLPUBFUN xmlNodePtr XMLCALL - xmlAddSibling (xmlNodePtr cur, - xmlNodePtr elem); -XMLPUBFUN xmlNodePtr XMLCALL - xmlAddNextSibling (xmlNodePtr cur, - xmlNodePtr elem); -XMLPUBFUN void XMLCALL - xmlUnlinkNode (xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL - xmlTextMerge (xmlNodePtr first, - xmlNodePtr second); -XMLPUBFUN int XMLCALL - xmlTextConcat (xmlNodePtr node, - const xmlChar *content, - int len); -XMLPUBFUN void XMLCALL - xmlFreeNodeList (xmlNodePtr cur); -XMLPUBFUN void XMLCALL - xmlFreeNode (xmlNodePtr cur); -XMLPUBFUN void XMLCALL - xmlSetTreeDoc (xmlNodePtr tree, - xmlDocPtr doc); -XMLPUBFUN void XMLCALL - xmlSetListDoc (xmlNodePtr list, - xmlDocPtr doc); -/* - * Namespaces. - */ -XMLPUBFUN xmlNsPtr XMLCALL - xmlSearchNs (xmlDocPtr doc, - xmlNodePtr node, - const xmlChar *nameSpace); -XMLPUBFUN xmlNsPtr XMLCALL - xmlSearchNsByHref (xmlDocPtr doc, - xmlNodePtr node, - const xmlChar *href); -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlNsPtr * XMLCALL - xmlGetNsList (xmlDocPtr doc, - xmlNodePtr node); -#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) */ - -XMLPUBFUN void XMLCALL - xmlSetNs (xmlNodePtr node, - xmlNsPtr ns); -XMLPUBFUN xmlNsPtr XMLCALL - xmlCopyNamespace (xmlNsPtr cur); -XMLPUBFUN xmlNsPtr XMLCALL - xmlCopyNamespaceList (xmlNsPtr cur); - -/* - * Changing the content. - */ -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) -XMLPUBFUN xmlAttrPtr XMLCALL - xmlSetProp (xmlNodePtr node, - const xmlChar *name, - const xmlChar *value); -XMLPUBFUN xmlAttrPtr XMLCALL - xmlSetNsProp (xmlNodePtr node, - xmlNsPtr ns, - const xmlChar *name, - const xmlChar *value); -#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) */ -XMLPUBFUN xmlChar * XMLCALL - xmlGetNoNsProp (xmlNodePtr node, - const xmlChar *name); -XMLPUBFUN xmlChar * XMLCALL - xmlGetProp (xmlNodePtr node, - const xmlChar *name); -XMLPUBFUN xmlAttrPtr XMLCALL - xmlHasProp (xmlNodePtr node, - const xmlChar *name); -XMLPUBFUN xmlAttrPtr XMLCALL - xmlHasNsProp (xmlNodePtr node, - const xmlChar *name, - const xmlChar *nameSpace); -XMLPUBFUN xmlChar * XMLCALL - xmlGetNsProp (xmlNodePtr node, - const xmlChar *name, - const xmlChar *nameSpace); -XMLPUBFUN xmlNodePtr XMLCALL - xmlStringGetNodeList (xmlDocPtr doc, - const xmlChar *value); -XMLPUBFUN xmlNodePtr XMLCALL - xmlStringLenGetNodeList (xmlDocPtr doc, - const xmlChar *value, - int len); -XMLPUBFUN xmlChar * XMLCALL - xmlNodeListGetString (xmlDocPtr doc, - xmlNodePtr list, - int inLine); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlChar * XMLCALL - xmlNodeListGetRawString (xmlDocPtr doc, - xmlNodePtr list, - int inLine); -#endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL - xmlNodeSetContent (xmlNodePtr cur, - const xmlChar *content); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN void XMLCALL - xmlNodeSetContentLen (xmlNodePtr cur, - const xmlChar *content, - int len); -#endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL - xmlNodeAddContent (xmlNodePtr cur, - const xmlChar *content); -XMLPUBFUN void XMLCALL - xmlNodeAddContentLen (xmlNodePtr cur, - const xmlChar *content, - int len); -XMLPUBFUN xmlChar * XMLCALL - xmlNodeGetContent (xmlNodePtr cur); -XMLPUBFUN int XMLCALL - xmlNodeBufGetContent (xmlBufferPtr buffer, - xmlNodePtr cur); -XMLPUBFUN xmlChar * XMLCALL - xmlNodeGetLang (xmlNodePtr cur); -XMLPUBFUN int XMLCALL - xmlNodeGetSpacePreserve (xmlNodePtr cur); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN void XMLCALL - xmlNodeSetLang (xmlNodePtr cur, - const xmlChar *lang); -XMLPUBFUN void XMLCALL - xmlNodeSetSpacePreserve (xmlNodePtr cur, - int val); -#endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN xmlChar * XMLCALL - xmlNodeGetBase (xmlDocPtr doc, - xmlNodePtr cur); -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) -XMLPUBFUN void XMLCALL - xmlNodeSetBase (xmlNodePtr cur, - const xmlChar *uri); -#endif - -/* - * Removing content. - */ -XMLPUBFUN int XMLCALL - xmlRemoveProp (xmlAttrPtr cur); -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN int XMLCALL - xmlUnsetNsProp (xmlNodePtr node, - xmlNsPtr ns, - const xmlChar *name); -XMLPUBFUN int XMLCALL - xmlUnsetProp (xmlNodePtr node, - const xmlChar *name); -#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */ - -/* - * Internal, don't use. - */ -XMLPUBFUN void XMLCALL - xmlBufferWriteCHAR (xmlBufferPtr buf, - const xmlChar *string); -XMLPUBFUN void XMLCALL - xmlBufferWriteChar (xmlBufferPtr buf, - const char *string); -XMLPUBFUN void XMLCALL - xmlBufferWriteQuotedString(xmlBufferPtr buf, - const xmlChar *string); - -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void xmlAttrSerializeTxtContent(xmlBufferPtr buf, - xmlDocPtr doc, - xmlAttrPtr attr, - const xmlChar *string); -#endif /* LIBXML_OUTPUT_ENABLED */ - -#ifdef LIBXML_TREE_ENABLED -/* - * Namespace handling. - */ -XMLPUBFUN int XMLCALL - xmlReconciliateNs (xmlDocPtr doc, - xmlNodePtr tree); -#endif - -#ifdef LIBXML_OUTPUT_ENABLED -/* - * Saving. - */ -XMLPUBFUN void XMLCALL - xmlDocDumpFormatMemory (xmlDocPtr cur, - xmlChar **mem, - int *size, - int format); -XMLPUBFUN void XMLCALL - xmlDocDumpMemory (xmlDocPtr cur, - xmlChar **mem, - int *size); -XMLPUBFUN void XMLCALL - xmlDocDumpMemoryEnc (xmlDocPtr out_doc, - xmlChar **doc_txt_ptr, - int * doc_txt_len, - const char *txt_encoding); -XMLPUBFUN void XMLCALL - xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, - xmlChar **doc_txt_ptr, - int * doc_txt_len, - const char *txt_encoding, - int format); -XMLPUBFUN int XMLCALL - xmlDocFormatDump (FILE *f, - xmlDocPtr cur, - int format); -XMLPUBFUN int XMLCALL - xmlDocDump (FILE *f, - xmlDocPtr cur); -XMLPUBFUN void XMLCALL - xmlElemDump (FILE *f, - xmlDocPtr doc, - xmlNodePtr cur); -XMLPUBFUN int XMLCALL - xmlSaveFile (const char *filename, - xmlDocPtr cur); -XMLPUBFUN int XMLCALL - xmlSaveFormatFile (const char *filename, - xmlDocPtr cur, - int format); -XMLPUBFUN int XMLCALL - xmlNodeDump (xmlBufferPtr buf, - xmlDocPtr doc, - xmlNodePtr cur, - int level, - int format); - -XMLPUBFUN int XMLCALL - xmlSaveFileTo (xmlOutputBufferPtr buf, - xmlDocPtr cur, - const char *encoding); -XMLPUBFUN int XMLCALL - xmlSaveFormatFileTo (xmlOutputBufferPtr buf, - xmlDocPtr cur, - const char *encoding, - int format); -XMLPUBFUN void XMLCALL - xmlNodeDumpOutput (xmlOutputBufferPtr buf, - xmlDocPtr doc, - xmlNodePtr cur, - int level, - int format, - const char *encoding); - -XMLPUBFUN int XMLCALL - xmlSaveFormatFileEnc (const char *filename, - xmlDocPtr cur, - const char *encoding, - int format); - -XMLPUBFUN int XMLCALL - xmlSaveFileEnc (const char *filename, - xmlDocPtr cur, - const char *encoding); - -#endif /* LIBXML_OUTPUT_ENABLED */ -/* - * XHTML - */ -XMLPUBFUN int XMLCALL - xmlIsXHTML (const xmlChar *systemID, - const xmlChar *publicID); - -/* - * Compression. - */ -XMLPUBFUN int XMLCALL - xmlGetDocCompressMode (xmlDocPtr doc); -XMLPUBFUN void XMLCALL - xmlSetDocCompressMode (xmlDocPtr doc, - int mode); -XMLPUBFUN int XMLCALL - xmlGetCompressMode (void); -XMLPUBFUN void XMLCALL - xmlSetCompressMode (int mode); - -/* -* DOM-wrapper helper functions. -*/ -XMLPUBFUN xmlDOMWrapCtxtPtr XMLCALL - xmlDOMWrapNewCtxt (void); -XMLPUBFUN void XMLCALL - xmlDOMWrapFreeCtxt (xmlDOMWrapCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt, - xmlNodePtr elem, - int options); -XMLPUBFUN int XMLCALL - xmlDOMWrapAdoptNode (xmlDOMWrapCtxtPtr ctxt, - xmlDocPtr sourceDoc, - xmlNodePtr node, - xmlDocPtr destDoc, - xmlNodePtr destParent, - int options); -XMLPUBFUN int XMLCALL - xmlDOMWrapRemoveNode (xmlDOMWrapCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr node, - int options); -XMLPUBFUN int XMLCALL - xmlDOMWrapCloneNode (xmlDOMWrapCtxtPtr ctxt, - xmlDocPtr sourceDoc, - xmlNodePtr node, - xmlNodePtr *clonedNode, - xmlDocPtr destDoc, - xmlNodePtr destParent, - int deep, - int options); - -#ifdef __cplusplus -} -#endif -#ifndef __XML_PARSER_H__ -#include "xmlmemory.h" -#endif - -#endif /* __XML_TREE_H__ */ - diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/uri.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/uri.h deleted file mode 100644 index df323a489df..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/uri.h +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Summary: library of generic URI related routines - * Description: library of generic URI related routines - * Implements RFC 2396 - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_URI_H__ -#define __XML_URI_H__ - -#include "xmlversion.h" -#include "tree.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlURI: - * - * A parsed URI reference. This is a struct containing the various fields - * as described in RFC 2396 but separated for further processing. - */ -typedef struct _xmlURI xmlURI; -typedef xmlURI *xmlURIPtr; -struct _xmlURI { - char *scheme; /* the URI scheme */ - char *opaque; /* opaque part */ - char *authority; /* the authority part */ - char *server; /* the server part */ - char *user; /* the user part */ - int port; /* the port number */ - char *path; /* the path string */ - char *query; /* the query string */ - char *fragment; /* the fragment identifier */ - int cleanup; /* parsing potentially unclean URI */ -}; - -/* - * This function is in tree.h: - * xmlChar * xmlNodeGetBase (xmlDocPtr doc, - * xmlNodePtr cur); - */ -XMLPUBFUN xmlURIPtr XMLCALL - xmlCreateURI (void); -XMLPUBFUN xmlChar * XMLCALL - xmlBuildURI (const xmlChar *URI, - const xmlChar *base); -XMLPUBFUN xmlChar * XMLCALL - xmlBuildRelativeURI (const xmlChar *URI, - const xmlChar *base); -XMLPUBFUN xmlURIPtr XMLCALL - xmlParseURI (const char *str); -XMLPUBFUN xmlURIPtr XMLCALL - xmlParseURIRaw (const char *str, - int raw); -XMLPUBFUN int XMLCALL - xmlParseURIReference (xmlURIPtr uri, - const char *str); -XMLPUBFUN xmlChar * XMLCALL - xmlSaveUri (xmlURIPtr uri); -XMLPUBFUN void XMLCALL - xmlPrintURI (FILE *stream, - xmlURIPtr uri); -XMLPUBFUN xmlChar * XMLCALL - xmlURIEscapeStr (const xmlChar *str, - const xmlChar *list); -XMLPUBFUN char * XMLCALL - xmlURIUnescapeString (const char *str, - int len, - char *target); -XMLPUBFUN int XMLCALL - xmlNormalizeURIPath (char *path); -XMLPUBFUN xmlChar * XMLCALL - xmlURIEscape (const xmlChar *str); -XMLPUBFUN void XMLCALL - xmlFreeURI (xmlURIPtr uri); -XMLPUBFUN xmlChar* XMLCALL - xmlCanonicPath (const xmlChar *path); -XMLPUBFUN xmlChar* XMLCALL - xmlPathToURI (const xmlChar *path); - -#ifdef __cplusplus -} -#endif -#endif /* __XML_URI_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/valid.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/valid.h deleted file mode 100644 index 3e5f6300f3d..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/valid.h +++ /dev/null @@ -1,458 +0,0 @@ -/* - * Summary: The DTD validation - * Description: API for the DTD handling and the validity checking - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - - -#ifndef __XML_VALID_H__ -#define __XML_VALID_H__ - -#include "xmlversion.h" -#include "xmlerror.h" -#include "tree.h" -#include "list.h" -#include "xmlautomata.h" -#include "xmlregexp.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Validation state added for non-determinist content model. - */ -typedef struct _xmlValidState xmlValidState; -typedef xmlValidState *xmlValidStatePtr; - -/** - * xmlValidityErrorFunc: - * @ctx: usually an xmlValidCtxtPtr to a validity error context, - * but comes from ctxt->userData (which normally contains such - * a pointer); ctxt->userData can be changed by the user. - * @msg: the string to format *printf like vararg - * @...: remaining arguments to the format - * - * Callback called when a validity error is found. This is a message - * oriented function similar to an *printf function. - */ -typedef void (XMLCDECL *xmlValidityErrorFunc) (void *ctx, - const char *msg, - ...); - -/** - * xmlValidityWarningFunc: - * @ctx: usually an xmlValidCtxtPtr to a validity error context, - * but comes from ctxt->userData (which normally contains such - * a pointer); ctxt->userData can be changed by the user. - * @msg: the string to format *printf like vararg - * @...: remaining arguments to the format - * - * Callback called when a validity warning is found. This is a message - * oriented function similar to an *printf function. - */ -typedef void (XMLCDECL *xmlValidityWarningFunc) (void *ctx, - const char *msg, - ...); - -#ifdef IN_LIBXML -/** - * XML_CTXT_FINISH_DTD_0: - * - * Special value for finishDtd field when embedded in an xmlParserCtxt - */ -#define XML_CTXT_FINISH_DTD_0 0xabcd1234 -/** - * XML_CTXT_FINISH_DTD_1: - * - * Special value for finishDtd field when embedded in an xmlParserCtxt - */ -#define XML_CTXT_FINISH_DTD_1 0xabcd1235 -#endif - -/* - * xmlValidCtxt: - * An xmlValidCtxt is used for error reporting when validating. - */ -typedef struct _xmlValidCtxt xmlValidCtxt; -typedef xmlValidCtxt *xmlValidCtxtPtr; -struct _xmlValidCtxt { - void *userData; /* user specific data block */ - xmlValidityErrorFunc error; /* the callback in case of errors */ - xmlValidityWarningFunc warning; /* the callback in case of warning */ - - /* Node analysis stack used when validating within entities */ - xmlNodePtr node; /* Current parsed Node */ - int nodeNr; /* Depth of the parsing stack */ - int nodeMax; /* Max depth of the parsing stack */ - xmlNodePtr *nodeTab; /* array of nodes */ - - unsigned int finishDtd; /* finished validating the Dtd ? */ - xmlDocPtr doc; /* the document */ - int valid; /* temporary validity check result */ - - /* state state used for non-determinist content validation */ - xmlValidState *vstate; /* current state */ - int vstateNr; /* Depth of the validation stack */ - int vstateMax; /* Max depth of the validation stack */ - xmlValidState *vstateTab; /* array of validation states */ - -#ifdef LIBXML_REGEXP_ENABLED - xmlAutomataPtr am; /* the automata */ - xmlAutomataStatePtr state; /* used to build the automata */ -#else - void *am; - void *state; -#endif -}; - -/* - * ALL notation declarations are stored in a table. - * There is one table per DTD. - */ - -typedef struct _xmlHashTable xmlNotationTable; -typedef xmlNotationTable *xmlNotationTablePtr; - -/* - * ALL element declarations are stored in a table. - * There is one table per DTD. - */ - -typedef struct _xmlHashTable xmlElementTable; -typedef xmlElementTable *xmlElementTablePtr; - -/* - * ALL attribute declarations are stored in a table. - * There is one table per DTD. - */ - -typedef struct _xmlHashTable xmlAttributeTable; -typedef xmlAttributeTable *xmlAttributeTablePtr; - -/* - * ALL IDs attributes are stored in a table. - * There is one table per document. - */ - -typedef struct _xmlHashTable xmlIDTable; -typedef xmlIDTable *xmlIDTablePtr; - -/* - * ALL Refs attributes are stored in a table. - * There is one table per document. - */ - -typedef struct _xmlHashTable xmlRefTable; -typedef xmlRefTable *xmlRefTablePtr; - -/* Notation */ -XMLPUBFUN xmlNotationPtr XMLCALL - xmlAddNotationDecl (xmlValidCtxtPtr ctxt, - xmlDtdPtr dtd, - const xmlChar *name, - const xmlChar *PublicID, - const xmlChar *SystemID); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlNotationTablePtr XMLCALL - xmlCopyNotationTable (xmlNotationTablePtr table); -#endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL - xmlFreeNotationTable (xmlNotationTablePtr table); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlDumpNotationDecl (xmlBufferPtr buf, - xmlNotationPtr nota); -XMLPUBFUN void XMLCALL - xmlDumpNotationTable (xmlBufferPtr buf, - xmlNotationTablePtr table); -#endif /* LIBXML_OUTPUT_ENABLED */ - -/* Element Content */ -/* the non Doc version are being deprecated */ -XMLPUBFUN xmlElementContentPtr XMLCALL - xmlNewElementContent (const xmlChar *name, - xmlElementContentType type); -XMLPUBFUN xmlElementContentPtr XMLCALL - xmlCopyElementContent (xmlElementContentPtr content); -XMLPUBFUN void XMLCALL - xmlFreeElementContent (xmlElementContentPtr cur); -/* the new versions with doc argument */ -XMLPUBFUN xmlElementContentPtr XMLCALL - xmlNewDocElementContent (xmlDocPtr doc, - const xmlChar *name, - xmlElementContentType type); -XMLPUBFUN xmlElementContentPtr XMLCALL - xmlCopyDocElementContent(xmlDocPtr doc, - xmlElementContentPtr content); -XMLPUBFUN void XMLCALL - xmlFreeDocElementContent(xmlDocPtr doc, - xmlElementContentPtr cur); -XMLPUBFUN void XMLCALL - xmlSnprintfElementContent(char *buf, - int size, - xmlElementContentPtr content, - int englob); -#ifdef LIBXML_OUTPUT_ENABLED -/* DEPRECATED */ -XMLPUBFUN void XMLCALL - xmlSprintfElementContent(char *buf, - xmlElementContentPtr content, - int englob); -#endif /* LIBXML_OUTPUT_ENABLED */ -/* DEPRECATED */ - -/* Element */ -XMLPUBFUN xmlElementPtr XMLCALL - xmlAddElementDecl (xmlValidCtxtPtr ctxt, - xmlDtdPtr dtd, - const xmlChar *name, - xmlElementTypeVal type, - xmlElementContentPtr content); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlElementTablePtr XMLCALL - xmlCopyElementTable (xmlElementTablePtr table); -#endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL - xmlFreeElementTable (xmlElementTablePtr table); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlDumpElementTable (xmlBufferPtr buf, - xmlElementTablePtr table); -XMLPUBFUN void XMLCALL - xmlDumpElementDecl (xmlBufferPtr buf, - xmlElementPtr elem); -#endif /* LIBXML_OUTPUT_ENABLED */ - -/* Enumeration */ -XMLPUBFUN xmlEnumerationPtr XMLCALL - xmlCreateEnumeration (const xmlChar *name); -XMLPUBFUN void XMLCALL - xmlFreeEnumeration (xmlEnumerationPtr cur); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlEnumerationPtr XMLCALL - xmlCopyEnumeration (xmlEnumerationPtr cur); -#endif /* LIBXML_TREE_ENABLED */ - -/* Attribute */ -XMLPUBFUN xmlAttributePtr XMLCALL - xmlAddAttributeDecl (xmlValidCtxtPtr ctxt, - xmlDtdPtr dtd, - const xmlChar *elem, - const xmlChar *name, - const xmlChar *ns, - xmlAttributeType type, - xmlAttributeDefault def, - const xmlChar *defaultValue, - xmlEnumerationPtr tree); -#ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlAttributeTablePtr XMLCALL - xmlCopyAttributeTable (xmlAttributeTablePtr table); -#endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL - xmlFreeAttributeTable (xmlAttributeTablePtr table); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlDumpAttributeTable (xmlBufferPtr buf, - xmlAttributeTablePtr table); -XMLPUBFUN void XMLCALL - xmlDumpAttributeDecl (xmlBufferPtr buf, - xmlAttributePtr attr); -#endif /* LIBXML_OUTPUT_ENABLED */ - -/* IDs */ -XMLPUBFUN xmlIDPtr XMLCALL - xmlAddID (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - const xmlChar *value, - xmlAttrPtr attr); -XMLPUBFUN void XMLCALL - xmlFreeIDTable (xmlIDTablePtr table); -XMLPUBFUN xmlAttrPtr XMLCALL - xmlGetID (xmlDocPtr doc, - const xmlChar *ID); -XMLPUBFUN int XMLCALL - xmlIsID (xmlDocPtr doc, - xmlNodePtr elem, - xmlAttrPtr attr); -XMLPUBFUN int XMLCALL - xmlRemoveID (xmlDocPtr doc, - xmlAttrPtr attr); - -/* IDREFs */ -XMLPUBFUN xmlRefPtr XMLCALL - xmlAddRef (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - const xmlChar *value, - xmlAttrPtr attr); -XMLPUBFUN void XMLCALL - xmlFreeRefTable (xmlRefTablePtr table); -XMLPUBFUN int XMLCALL - xmlIsRef (xmlDocPtr doc, - xmlNodePtr elem, - xmlAttrPtr attr); -XMLPUBFUN int XMLCALL - xmlRemoveRef (xmlDocPtr doc, - xmlAttrPtr attr); -XMLPUBFUN xmlListPtr XMLCALL - xmlGetRefs (xmlDocPtr doc, - const xmlChar *ID); - -/** - * The public function calls related to validity checking. - */ -#ifdef LIBXML_VALID_ENABLED -/* Allocate/Release Validation Contexts */ -XMLPUBFUN xmlValidCtxtPtr XMLCALL - xmlNewValidCtxt(void); -XMLPUBFUN void XMLCALL - xmlFreeValidCtxt(xmlValidCtxtPtr); - -XMLPUBFUN int XMLCALL - xmlValidateRoot (xmlValidCtxtPtr ctxt, - xmlDocPtr doc); -XMLPUBFUN int XMLCALL - xmlValidateElementDecl (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlElementPtr elem); -XMLPUBFUN xmlChar * XMLCALL - xmlValidNormalizeAttributeValue(xmlDocPtr doc, - xmlNodePtr elem, - const xmlChar *name, - const xmlChar *value); -XMLPUBFUN xmlChar * XMLCALL - xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem, - const xmlChar *name, - const xmlChar *value); -XMLPUBFUN int XMLCALL - xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlAttributePtr attr); -XMLPUBFUN int XMLCALL - xmlValidateAttributeValue(xmlAttributeType type, - const xmlChar *value); -XMLPUBFUN int XMLCALL - xmlValidateNotationDecl (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNotationPtr nota); -XMLPUBFUN int XMLCALL - xmlValidateDtd (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlDtdPtr dtd); -XMLPUBFUN int XMLCALL - xmlValidateDtdFinal (xmlValidCtxtPtr ctxt, - xmlDocPtr doc); -XMLPUBFUN int XMLCALL - xmlValidateDocument (xmlValidCtxtPtr ctxt, - xmlDocPtr doc); -XMLPUBFUN int XMLCALL - xmlValidateElement (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem); -XMLPUBFUN int XMLCALL - xmlValidateOneElement (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem); -XMLPUBFUN int XMLCALL - xmlValidateOneAttribute (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem, - xmlAttrPtr attr, - const xmlChar *value); -XMLPUBFUN int XMLCALL - xmlValidateOneNamespace (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem, - const xmlChar *prefix, - xmlNsPtr ns, - const xmlChar *value); -XMLPUBFUN int XMLCALL - xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt, - xmlDocPtr doc); -#endif /* LIBXML_VALID_ENABLED */ - -#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN int XMLCALL - xmlValidateNotationUse (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - const xmlChar *notationName); -#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ - -XMLPUBFUN int XMLCALL - xmlIsMixedElement (xmlDocPtr doc, - const xmlChar *name); -XMLPUBFUN xmlAttributePtr XMLCALL - xmlGetDtdAttrDesc (xmlDtdPtr dtd, - const xmlChar *elem, - const xmlChar *name); -XMLPUBFUN xmlAttributePtr XMLCALL - xmlGetDtdQAttrDesc (xmlDtdPtr dtd, - const xmlChar *elem, - const xmlChar *name, - const xmlChar *prefix); -XMLPUBFUN xmlNotationPtr XMLCALL - xmlGetDtdNotationDesc (xmlDtdPtr dtd, - const xmlChar *name); -XMLPUBFUN xmlElementPtr XMLCALL - xmlGetDtdQElementDesc (xmlDtdPtr dtd, - const xmlChar *name, - const xmlChar *prefix); -XMLPUBFUN xmlElementPtr XMLCALL - xmlGetDtdElementDesc (xmlDtdPtr dtd, - const xmlChar *name); - -#ifdef LIBXML_VALID_ENABLED - -XMLPUBFUN int XMLCALL - xmlValidGetPotentialChildren(xmlElementContent *ctree, - const xmlChar **names, - int *len, - int max); - -XMLPUBFUN int XMLCALL - xmlValidGetValidElements(xmlNode *prev, - xmlNode *next, - const xmlChar **names, - int max); -XMLPUBFUN int XMLCALL - xmlValidateNameValue (const xmlChar *value); -XMLPUBFUN int XMLCALL - xmlValidateNamesValue (const xmlChar *value); -XMLPUBFUN int XMLCALL - xmlValidateNmtokenValue (const xmlChar *value); -XMLPUBFUN int XMLCALL - xmlValidateNmtokensValue(const xmlChar *value); - -#ifdef LIBXML_REGEXP_ENABLED -/* - * Validation based on the regexp support - */ -XMLPUBFUN int XMLCALL - xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, - xmlElementPtr elem); - -XMLPUBFUN int XMLCALL - xmlValidatePushElement (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem, - const xmlChar *qname); -XMLPUBFUN int XMLCALL - xmlValidatePushCData (xmlValidCtxtPtr ctxt, - const xmlChar *data, - int len); -XMLPUBFUN int XMLCALL - xmlValidatePopElement (xmlValidCtxtPtr ctxt, - xmlDocPtr doc, - xmlNodePtr elem, - const xmlChar *qname); -#endif /* LIBXML_REGEXP_ENABLED */ -#endif /* LIBXML_VALID_ENABLED */ -#ifdef __cplusplus -} -#endif -#endif /* __XML_VALID_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/vtk_libxml2_mangle.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/vtk_libxml2_mangle.h deleted file mode 100644 index 0bd0ac1b2e8..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/vtk_libxml2_mangle.h +++ /dev/null @@ -1,1637 +0,0 @@ -#ifndef vtk_libxml2_mangle_h -#define vtk_libxml2_mangle_h - -/* - -This header file mangles all symbols exported from the libxml2 library. -It is included in all files while building the libxml2 library. Due to -namespace pollution, no libxml2 headers should be included in .h files in -VTK. - -The following command was used to obtain the symbol list: - -nm libxml2.a |grep " [TRD] " - -*/ - -#define UTF8ToHtml vtk_libxml2_UTF8ToHtml -#define UTF8Toisolat1 vtk_libxml2_UTF8Toisolat1 -#define __docbDefaultSAXHandler vtk_libxml2___docbDefaultSAXHandler -#define __htmlDefaultSAXHandler vtk_libxml2___htmlDefaultSAXHandler -#define __htmlParseContent vtk_libxml2___htmlParseContent -#define __oldXMLWDcompatibility vtk_libxml2___oldXMLWDcompatibility -#define __xmlBufferAllocScheme vtk_libxml2___xmlBufferAllocScheme -#define __xmlDefaultBufferSize vtk_libxml2___xmlDefaultBufferSize -#define __xmlDefaultSAXHandler vtk_libxml2___xmlDefaultSAXHandler -#define __xmlDefaultSAXLocator vtk_libxml2___xmlDefaultSAXLocator -#define __xmlDeregisterNodeDefaultValue vtk_libxml2___xmlDeregisterNodeDefaultValue -#define __xmlDoValidityCheckingDefaultValue vtk_libxml2___xmlDoValidityCheckingDefaultValue -#define __xmlErrEncoding vtk_libxml2___xmlErrEncoding -#define __xmlGenericError vtk_libxml2___xmlGenericError -#define __xmlGenericErrorContext vtk_libxml2___xmlGenericErrorContext -#define __xmlGetWarningsDefaultValue vtk_libxml2___xmlGetWarningsDefaultValue -#define __xmlIOErr vtk_libxml2___xmlIOErr -#define __xmlIndentTreeOutput vtk_libxml2___xmlIndentTreeOutput -#define __xmlKeepBlanksDefaultValue vtk_libxml2___xmlKeepBlanksDefaultValue -#define __xmlLastError vtk_libxml2___xmlLastError -#define __xmlLineNumbersDefaultValue vtk_libxml2___xmlLineNumbersDefaultValue -#define __xmlLoadExtDtdDefaultValue vtk_libxml2___xmlLoadExtDtdDefaultValue -#define __xmlLoaderErr vtk_libxml2___xmlLoaderErr -#define __xmlOutputBufferCreateFilename vtk_libxml2___xmlOutputBufferCreateFilename -#define __xmlOutputBufferCreateFilenameValue vtk_libxml2___xmlOutputBufferCreateFilenameValue -#define __xmlParserDebugEntities vtk_libxml2___xmlParserDebugEntities -#define __xmlParserInputBufferCreateFilename vtk_libxml2___xmlParserInputBufferCreateFilename -#define __xmlParserInputBufferCreateFilenameValue vtk_libxml2___xmlParserInputBufferCreateFilenameValue -#define __xmlParserVersion vtk_libxml2___xmlParserVersion -#define __xmlPedanticParserDefaultValue vtk_libxml2___xmlPedanticParserDefaultValue -#define __xmlRaiseError vtk_libxml2___xmlRaiseError -#define __xmlRegisterCallbacks vtk_libxml2___xmlRegisterCallbacks -#define __xmlRegisterNodeDefaultValue vtk_libxml2___xmlRegisterNodeDefaultValue -#define __xmlSaveNoEmptyTags vtk_libxml2___xmlSaveNoEmptyTags -#define __xmlSimpleError vtk_libxml2___xmlSimpleError -#define __xmlStructuredError vtk_libxml2___xmlStructuredError -#define __xmlSubstituteEntitiesDefaultValue vtk_libxml2___xmlSubstituteEntitiesDefaultValue -#define __xmlTreeIndentString vtk_libxml2___xmlTreeIndentString -#if !defined(_fini) && !defined(_init) - #define _fini vtk_libxml2__fini - #define _init vtk_libxml2__init -#endif -#define attribute vtk_libxml2_attribute -#define attributeDecl vtk_libxml2_attributeDecl -#define cdataBlock vtk_libxml2_cdataBlock -#define characters vtk_libxml2_characters -#define checkNamespace vtk_libxml2_checkNamespace -#define comment vtk_libxml2_comment -#define docbCreateFileParserCtxt vtk_libxml2_docbCreateFileParserCtxt -#define docbCreatePushParserCtxt vtk_libxml2_docbCreatePushParserCtxt -#define docbDefaultSAXHandler vtk_libxml2_docbDefaultSAXHandler -#define docbDefaultSAXHandlerInit vtk_libxml2_docbDefaultSAXHandlerInit -#define docbEncodeEntities vtk_libxml2_docbEncodeEntities -#define docbFreeParserCtxt vtk_libxml2_docbFreeParserCtxt -#define docbParseChunk vtk_libxml2_docbParseChunk -#define docbParseDoc vtk_libxml2_docbParseDoc -#define docbParseDocument vtk_libxml2_docbParseDocument -#define docbParseFile vtk_libxml2_docbParseFile -#define docbSAXParseDoc vtk_libxml2_docbSAXParseDoc -#define docbSAXParseFile vtk_libxml2_docbSAXParseFile -#define elementDecl vtk_libxml2_elementDecl -#define emptyExp vtk_libxml2_emptyExp -#define endDocument vtk_libxml2_endDocument -#define endElement vtk_libxml2_endElement -#define entityDecl vtk_libxml2_entityDecl -#define externalSubset vtk_libxml2_externalSubset -#define forbiddenExp vtk_libxml2_forbiddenExp -#define getColumnNumber vtk_libxml2_getColumnNumber -#define getEntity vtk_libxml2_getEntity -#define getLineNumber vtk_libxml2_getLineNumber -#define getNamespace vtk_libxml2_getNamespace -#define getParameterEntity vtk_libxml2_getParameterEntity -#define getPublicId vtk_libxml2_getPublicId -#define getSystemId vtk_libxml2_getSystemId -#define globalNamespace vtk_libxml2_globalNamespace -#define hasExternalSubset vtk_libxml2_hasExternalSubset -#define hasInternalSubset vtk_libxml2_hasInternalSubset -#define htmlAttrAllowed vtk_libxml2_htmlAttrAllowed -#define htmlAutoCloseTag vtk_libxml2_htmlAutoCloseTag -#define htmlCreateFileParserCtxt vtk_libxml2_htmlCreateFileParserCtxt -#define htmlCreateMemoryParserCtxt vtk_libxml2_htmlCreateMemoryParserCtxt -#define htmlCreatePushParserCtxt vtk_libxml2_htmlCreatePushParserCtxt -#define htmlCtxtReadDoc vtk_libxml2_htmlCtxtReadDoc -#define htmlCtxtReadFd vtk_libxml2_htmlCtxtReadFd -#define htmlCtxtReadFile vtk_libxml2_htmlCtxtReadFile -#define htmlCtxtReadIO vtk_libxml2_htmlCtxtReadIO -#define htmlCtxtReadMemory vtk_libxml2_htmlCtxtReadMemory -#define htmlCtxtReset vtk_libxml2_htmlCtxtReset -#define htmlCtxtUseOptions vtk_libxml2_htmlCtxtUseOptions -#define htmlDecodeEntities vtk_libxml2_htmlDecodeEntities -#define htmlDefaultSAXHandler vtk_libxml2_htmlDefaultSAXHandler -#define htmlDefaultSAXHandlerInit vtk_libxml2_htmlDefaultSAXHandlerInit -#define htmlDocContentDumpFormatOutput vtk_libxml2_htmlDocContentDumpFormatOutput -#define htmlDocContentDumpOutput vtk_libxml2_htmlDocContentDumpOutput -#define htmlDocDump vtk_libxml2_htmlDocDump -#define htmlDocDumpMemory vtk_libxml2_htmlDocDumpMemory -#define htmlDocDumpMemoryFormat vtk_libxml2_htmlDocDumpMemoryFormat -#define htmlElementAllowedHere vtk_libxml2_htmlElementAllowedHere -#define htmlElementStatusHere vtk_libxml2_htmlElementStatusHere -#define htmlEncodeEntities vtk_libxml2_htmlEncodeEntities -#define htmlEntityLookup vtk_libxml2_htmlEntityLookup -#define htmlEntityValueLookup vtk_libxml2_htmlEntityValueLookup -#define htmlFreeParserCtxt vtk_libxml2_htmlFreeParserCtxt -#define htmlGetMetaEncoding vtk_libxml2_htmlGetMetaEncoding -#define htmlHandleOmittedElem vtk_libxml2_htmlHandleOmittedElem -#define htmlInitAutoClose vtk_libxml2_htmlInitAutoClose -#define htmlIsAutoClosed vtk_libxml2_htmlIsAutoClosed -#define htmlIsBooleanAttr vtk_libxml2_htmlIsBooleanAttr -#define htmlIsScriptAttribute vtk_libxml2_htmlIsScriptAttribute -#define htmlNewDoc vtk_libxml2_htmlNewDoc -#define htmlNewDocNoDtD vtk_libxml2_htmlNewDocNoDtD -#define htmlNewParserCtxt vtk_libxml2_htmlNewParserCtxt -#define htmlNodeDump vtk_libxml2_htmlNodeDump -#define htmlNodeDumpFile vtk_libxml2_htmlNodeDumpFile -#define htmlNodeDumpFileFormat vtk_libxml2_htmlNodeDumpFileFormat -#define htmlNodeDumpFormatOutput vtk_libxml2_htmlNodeDumpFormatOutput -#define htmlNodeDumpOutput vtk_libxml2_htmlNodeDumpOutput -#define htmlNodeStatus vtk_libxml2_htmlNodeStatus -#define htmlParseCharRef vtk_libxml2_htmlParseCharRef -#define htmlParseChunk vtk_libxml2_htmlParseChunk -#define htmlParseDoc vtk_libxml2_htmlParseDoc -#define htmlParseDocument vtk_libxml2_htmlParseDocument -#define htmlParseElement vtk_libxml2_htmlParseElement -#define htmlParseEntityRef vtk_libxml2_htmlParseEntityRef -#define htmlParseFile vtk_libxml2_htmlParseFile -#define htmlReadDoc vtk_libxml2_htmlReadDoc -#define htmlReadFd vtk_libxml2_htmlReadFd -#define htmlReadFile vtk_libxml2_htmlReadFile -#define htmlReadIO vtk_libxml2_htmlReadIO -#define htmlReadMemory vtk_libxml2_htmlReadMemory -#define htmlSAXParseDoc vtk_libxml2_htmlSAXParseDoc -#define htmlSAXParseFile vtk_libxml2_htmlSAXParseFile -#define htmlSaveFile vtk_libxml2_htmlSaveFile -#define htmlSaveFileEnc vtk_libxml2_htmlSaveFileEnc -#define htmlSaveFileFormat vtk_libxml2_htmlSaveFileFormat -#define htmlSetMetaEncoding vtk_libxml2_htmlSetMetaEncoding -#define htmlTagLookup vtk_libxml2_htmlTagLookup -#define ignorableWhitespace vtk_libxml2_ignorableWhitespace -#define initGenericErrorDefaultFunc vtk_libxml2_initGenericErrorDefaultFunc -#define initdocbDefaultSAXHandler vtk_libxml2_initdocbDefaultSAXHandler -#define inithtmlDefaultSAXHandler vtk_libxml2_inithtmlDefaultSAXHandler -#define initxmlDefaultSAXHandler vtk_libxml2_initxmlDefaultSAXHandler -#define inputPop vtk_libxml2_inputPop -#define inputPush vtk_libxml2_inputPush -#define internalSubset vtk_libxml2_internalSubset -#define isStandalone vtk_libxml2_isStandalone -#define isolat1ToUTF8 vtk_libxml2_isolat1ToUTF8 -#define namePop vtk_libxml2_namePop -#define namePush vtk_libxml2_namePush -#define namespaceDecl vtk_libxml2_namespaceDecl -#define nodePop vtk_libxml2_nodePop -#define nodePush vtk_libxml2_nodePush -#define notationDecl vtk_libxml2_notationDecl -#define oldXMLWDcompatibility vtk_libxml2_oldXMLWDcompatibility -#define processingInstruction vtk_libxml2_processingInstruction -#define resolveEntity vtk_libxml2_resolveEntity -#define setDocumentLocator vtk_libxml2_setDocumentLocator -#define setNamespace vtk_libxml2_setNamespace -#define startDocument vtk_libxml2_startDocument -#define startElement vtk_libxml2_startElement -#define unparsedEntityDecl vtk_libxml2_unparsedEntityDecl -#define valuePop vtk_libxml2_valuePop -#define valuePush vtk_libxml2_valuePush -#define xlinkGetDefaultDetect vtk_libxml2_xlinkGetDefaultDetect -#define xlinkGetDefaultHandler vtk_libxml2_xlinkGetDefaultHandler -#define xlinkIsLink vtk_libxml2_xlinkIsLink -#define xlinkSetDefaultDetect vtk_libxml2_xlinkSetDefaultDetect -#define xlinkSetDefaultHandler vtk_libxml2_xlinkSetDefaultHandler -#define xmlACatalogAdd vtk_libxml2_xmlACatalogAdd -#define xmlACatalogDump vtk_libxml2_xmlACatalogDump -#define xmlACatalogRemove vtk_libxml2_xmlACatalogRemove -#define xmlACatalogResolve vtk_libxml2_xmlACatalogResolve -#define xmlACatalogResolvePublic vtk_libxml2_xmlACatalogResolvePublic -#define xmlACatalogResolveSystem vtk_libxml2_xmlACatalogResolveSystem -#define xmlACatalogResolveURI vtk_libxml2_xmlACatalogResolveURI -#define xmlAddAttributeDecl vtk_libxml2_xmlAddAttributeDecl -#define xmlAddChild vtk_libxml2_xmlAddChild -#define xmlAddChildList vtk_libxml2_xmlAddChildList -#define xmlAddDocEntity vtk_libxml2_xmlAddDocEntity -#define xmlAddDtdEntity vtk_libxml2_xmlAddDtdEntity -#define xmlAddElementDecl vtk_libxml2_xmlAddElementDecl -#define xmlAddEncodingAlias vtk_libxml2_xmlAddEncodingAlias -#define xmlAddID vtk_libxml2_xmlAddID -#define xmlAddNextSibling vtk_libxml2_xmlAddNextSibling -#define xmlAddNotationDecl vtk_libxml2_xmlAddNotationDecl -#define xmlAddPrevSibling vtk_libxml2_xmlAddPrevSibling -#define xmlAddRef vtk_libxml2_xmlAddRef -#define xmlAddSibling vtk_libxml2_xmlAddSibling -#define xmlAllocOutputBuffer vtk_libxml2_xmlAllocOutputBuffer -#define xmlAllocParserInputBuffer vtk_libxml2_xmlAllocParserInputBuffer -#define xmlAttrSerializeTxtContent vtk_libxml2_xmlAttrSerializeTxtContent -#define xmlAutomataCompile vtk_libxml2_xmlAutomataCompile -#define xmlAutomataGetInitState vtk_libxml2_xmlAutomataGetInitState -#define xmlAutomataIsDeterminist vtk_libxml2_xmlAutomataIsDeterminist -#define xmlAutomataNewAllTrans vtk_libxml2_xmlAutomataNewAllTrans -#define xmlAutomataNewCountTrans vtk_libxml2_xmlAutomataNewCountTrans -#define xmlAutomataNewCountTrans2 vtk_libxml2_xmlAutomataNewCountTrans2 -#define xmlAutomataNewCountedTrans vtk_libxml2_xmlAutomataNewCountedTrans -#define xmlAutomataNewCounter vtk_libxml2_xmlAutomataNewCounter -#define xmlAutomataNewCounterTrans vtk_libxml2_xmlAutomataNewCounterTrans -#define xmlAutomataNewEpsilon vtk_libxml2_xmlAutomataNewEpsilon -#define xmlAutomataNewNegTrans vtk_libxml2_xmlAutomataNewNegTrans -#define xmlAutomataNewOnceTrans vtk_libxml2_xmlAutomataNewOnceTrans -#define xmlAutomataNewOnceTrans2 vtk_libxml2_xmlAutomataNewOnceTrans2 -#define xmlAutomataNewState vtk_libxml2_xmlAutomataNewState -#define xmlAutomataNewTransition vtk_libxml2_xmlAutomataNewTransition -#define xmlAutomataNewTransition2 vtk_libxml2_xmlAutomataNewTransition2 -#define xmlAutomataSetFinalState vtk_libxml2_xmlAutomataSetFinalState -#define xmlBufferAdd vtk_libxml2_xmlBufferAdd -#define xmlBufferAddHead vtk_libxml2_xmlBufferAddHead -#define xmlBufferAllocScheme vtk_libxml2_xmlBufferAllocScheme -#define xmlBufferCCat vtk_libxml2_xmlBufferCCat -#define xmlBufferCat vtk_libxml2_xmlBufferCat -#define xmlBufferContent vtk_libxml2_xmlBufferContent -#define xmlBufferCreate vtk_libxml2_xmlBufferCreate -#define xmlBufferCreateSize vtk_libxml2_xmlBufferCreateSize -#define xmlBufferCreateStatic vtk_libxml2_xmlBufferCreateStatic -#define xmlBufferDump vtk_libxml2_xmlBufferDump -#define xmlBufferEmpty vtk_libxml2_xmlBufferEmpty -#define xmlBufferFree vtk_libxml2_xmlBufferFree -#define xmlBufferGrow vtk_libxml2_xmlBufferGrow -#define xmlBufferLength vtk_libxml2_xmlBufferLength -#define xmlBufferResize vtk_libxml2_xmlBufferResize -#define xmlBufferSetAllocationScheme vtk_libxml2_xmlBufferSetAllocationScheme -#define xmlBufferShrink vtk_libxml2_xmlBufferShrink -#define xmlBufferWriteCHAR vtk_libxml2_xmlBufferWriteCHARx /* hack for borland */ -#define xmlBufferWriteChar vtk_libxml2_xmlBufferWriteChar -#define xmlBufferWriteQuotedString vtk_libxml2_xmlBufferWriteQuotedString -#define xmlBuildQName vtk_libxml2_xmlBuildQName -#define xmlBuildRelativeURI vtk_libxml2_xmlBuildRelativeURI -#define xmlBuildURI vtk_libxml2_xmlBuildURI -#define xmlByteConsumed vtk_libxml2_xmlByteConsumed -#define xmlC14NDocDumpMemory vtk_libxml2_xmlC14NDocDumpMemory -#define xmlC14NDocSave vtk_libxml2_xmlC14NDocSave -#define xmlC14NDocSaveTo vtk_libxml2_xmlC14NDocSaveTo -#define xmlC14NExecute vtk_libxml2_xmlC14NExecute -#define xmlCanonicPath vtk_libxml2_xmlCanonicPath -#define xmlCatalogAdd vtk_libxml2_xmlCatalogAdd -#define xmlCatalogAddLocal vtk_libxml2_xmlCatalogAddLocal -#define xmlCatalogCleanup vtk_libxml2_xmlCatalogCleanup -#define xmlCatalogConvert vtk_libxml2_xmlCatalogConvert -#define xmlCatalogDump vtk_libxml2_xmlCatalogDump -#define xmlCatalogFreeLocal vtk_libxml2_xmlCatalogFreeLocal -#define xmlCatalogGetDefaults vtk_libxml2_xmlCatalogGetDefaults -#define xmlCatalogGetPublic vtk_libxml2_xmlCatalogGetPublic -#define xmlCatalogGetSystem vtk_libxml2_xmlCatalogGetSystem -#define xmlCatalogIsEmpty vtk_libxml2_xmlCatalogIsEmpty -#define xmlCatalogLocalResolve vtk_libxml2_xmlCatalogLocalResolve -#define xmlCatalogLocalResolveURI vtk_libxml2_xmlCatalogLocalResolveURI -#define xmlCatalogRemove vtk_libxml2_xmlCatalogRemove -#define xmlCatalogResolve vtk_libxml2_xmlCatalogResolve -#define xmlCatalogResolvePublic vtk_libxml2_xmlCatalogResolvePublic -#define xmlCatalogResolveSystem vtk_libxml2_xmlCatalogResolveSystem -#define xmlCatalogResolveURI vtk_libxml2_xmlCatalogResolveURI -#define xmlCatalogSetDebug vtk_libxml2_xmlCatalogSetDebug -#define xmlCatalogSetDefaultPrefer vtk_libxml2_xmlCatalogSetDefaultPrefer -#define xmlCatalogSetDefaults vtk_libxml2_xmlCatalogSetDefaults -#define xmlCharEncCloseFunc vtk_libxml2_xmlCharEncCloseFunc -#define xmlCharEncFirstLine vtk_libxml2_xmlCharEncFirstLine -#define xmlCharEncInFunc vtk_libxml2_xmlCharEncInFunc -#define xmlCharEncOutFunc vtk_libxml2_xmlCharEncOutFunc -#define xmlCharInRange vtk_libxml2_xmlCharInRange -#define xmlCharStrdup vtk_libxml2_xmlCharStrdup -#define xmlCharStrndup vtk_libxml2_xmlCharStrndup -#define xmlCheckFilename vtk_libxml2_xmlCheckFilename -#define xmlCheckHTTPInput vtk_libxml2_xmlCheckHTTPInput -#define xmlCheckLanguageID vtk_libxml2_xmlCheckLanguageID -#define xmlCheckUTF8 vtk_libxml2_xmlCheckUTF8 -#define xmlCheckVersion vtk_libxml2_xmlCheckVersion -#define xmlCleanupCharEncodingHandlers vtk_libxml2_xmlCleanupCharEncodingHandlers -#define xmlCleanupEncodingAliases vtk_libxml2_xmlCleanupEncodingAliases -#define xmlCleanupGlobals vtk_libxml2_xmlCleanupGlobals -#define xmlCleanupInputCallbacks vtk_libxml2_xmlCleanupInputCallbacks -#define xmlCleanupMemory vtk_libxml2_xmlCleanupMemory -#define xmlCleanupOutputCallbacks vtk_libxml2_xmlCleanupOutputCallbacks -#define xmlCleanupParser vtk_libxml2_xmlCleanupParser -#define xmlCleanupPredefinedEntities vtk_libxml2_xmlCleanupPredefinedEntities -#define xmlCleanupThreads vtk_libxml2_xmlCleanupThreads -#define xmlClearNodeInfoSeq vtk_libxml2_xmlClearNodeInfoSeq -#define xmlClearParserCtxt vtk_libxml2_xmlClearParserCtxt -#define xmlConvertSGMLCatalog vtk_libxml2_xmlConvertSGMLCatalog -#define xmlCopyAttributeTable vtk_libxml2_xmlCopyAttributeTable -#define xmlCopyChar vtk_libxml2_xmlCopyChar -#define xmlCopyCharMultiByte vtk_libxml2_xmlCopyCharMultiByte -#define xmlCopyDoc vtk_libxml2_xmlCopyDoc -#define xmlCopyDocElementContent vtk_libxml2_xmlCopyDocElementContent -#define xmlCopyDtd vtk_libxml2_xmlCopyDtd -#define xmlCopyElementContent vtk_libxml2_xmlCopyElementContent -#define xmlCopyElementTable vtk_libxml2_xmlCopyElementTable -#define xmlCopyEntitiesTable vtk_libxml2_xmlCopyEntitiesTable -#define xmlCopyEnumeration vtk_libxml2_xmlCopyEnumeration -#define xmlCopyError vtk_libxml2_xmlCopyError -#define xmlCopyNamespace vtk_libxml2_xmlCopyNamespace -#define xmlCopyNamespaceList vtk_libxml2_xmlCopyNamespaceList -#define xmlCopyNode vtk_libxml2_xmlCopyNode -#define xmlCopyNodeList vtk_libxml2_xmlCopyNodeList -#define xmlCopyNotationTable vtk_libxml2_xmlCopyNotationTable -#define xmlCopyProp vtk_libxml2_xmlCopyProp -#define xmlCopyPropList vtk_libxml2_xmlCopyPropList -#define xmlCreateDocParserCtxt vtk_libxml2_xmlCreateDocParserCtxt -#define xmlCreateEntitiesTable vtk_libxml2_xmlCreateEntitiesTable -#define xmlCreateEntityParserCtxt vtk_libxml2_xmlCreateEntityParserCtxt -#define xmlCreateEnumeration vtk_libxml2_xmlCreateEnumeration -#define xmlCreateFileParserCtxt vtk_libxml2_xmlCreateFileParserCtxt -#define xmlCreateIOParserCtxt vtk_libxml2_xmlCreateIOParserCtxt -#define xmlCreateIntSubset vtk_libxml2_xmlCreateIntSubset -#define xmlCreateMemoryParserCtxt vtk_libxml2_xmlCreateMemoryParserCtxt -#define xmlCreatePushParserCtxt vtk_libxml2_xmlCreatePushParserCtxt -#define xmlCreateURI vtk_libxml2_xmlCreateURI -#define xmlCreateURLParserCtxt vtk_libxml2_xmlCreateURLParserCtxt -#define xmlCtxtGetLastError vtk_libxml2_xmlCtxtGetLastError -#define xmlCtxtReadDoc vtk_libxml2_xmlCtxtReadDoc -#define xmlCtxtReadFd vtk_libxml2_xmlCtxtReadFd -#define xmlCtxtReadFile vtk_libxml2_xmlCtxtReadFile -#define xmlCtxtReadIO vtk_libxml2_xmlCtxtReadIO -#define xmlCtxtReadMemory vtk_libxml2_xmlCtxtReadMemory -#define xmlCtxtReset vtk_libxml2_xmlCtxtReset -#define xmlCtxtResetLastError vtk_libxml2_xmlCtxtResetLastError -#define xmlCtxtResetPush vtk_libxml2_xmlCtxtResetPush -#define xmlCtxtUseOptions vtk_libxml2_xmlCtxtUseOptions -#define xmlCurrentChar vtk_libxml2_xmlCurrentChar -#define xmlDOMWrapAdoptNode vtk_libxml2_xmlDOMWrapAdoptNode -#define xmlDOMWrapCloneNode vtk_libxml2_xmlDOMWrapCloneNode -#define xmlDOMWrapFreeCtxt vtk_libxml2_xmlDOMWrapFreeCtxt -#define xmlDOMWrapNewCtxt vtk_libxml2_xmlDOMWrapNewCtxt -#define xmlDOMWrapReconcileNamespaces vtk_libxml2_xmlDOMWrapReconcileNamespaces -#define xmlDOMWrapRemoveNode vtk_libxml2_xmlDOMWrapRemoveNode -#define xmlDecodeEntities vtk_libxml2_xmlDecodeEntities -#define xmlDefaultBufferSize vtk_libxml2_xmlDefaultBufferSize -#define xmlDefaultSAXHandler vtk_libxml2_xmlDefaultSAXHandler -#define xmlDefaultSAXHandlerInit vtk_libxml2_xmlDefaultSAXHandlerInit -#define xmlDefaultSAXLocator vtk_libxml2_xmlDefaultSAXLocator -#define xmlDelEncodingAlias vtk_libxml2_xmlDelEncodingAlias -#define xmlDeregisterNodeDefault vtk_libxml2_xmlDeregisterNodeDefault -#define xmlDeregisterNodeDefaultValue vtk_libxml2_xmlDeregisterNodeDefaultValue -#define xmlDetectCharEncoding vtk_libxml2_xmlDetectCharEncoding -#define xmlDictCleanup vtk_libxml2_xmlDictCleanup -#define xmlDictCreate vtk_libxml2_xmlDictCreate -#define xmlDictCreateSub vtk_libxml2_xmlDictCreateSub -#define xmlDictExists vtk_libxml2_xmlDictExists -#define xmlDictFree vtk_libxml2_xmlDictFree -#define xmlDictLookup vtk_libxml2_xmlDictLookup -#define xmlDictOwns vtk_libxml2_xmlDictOwns -#define xmlDictQLookup vtk_libxml2_xmlDictQLookup -#define xmlDictReference vtk_libxml2_xmlDictReference -#define xmlDictSize vtk_libxml2_xmlDictSize -#define xmlDoValidityCheckingDefaultValue vtk_libxml2_xmlDoValidityCheckingDefaultValue -#define xmlDocCopyNode vtk_libxml2_xmlDocCopyNode -#define xmlDocCopyNodeList vtk_libxml2_xmlDocCopyNodeList -#define xmlDocDump vtk_libxml2_xmlDocDump -#define xmlDocDumpFormatMemory vtk_libxml2_xmlDocDumpFormatMemory -#define xmlDocDumpFormatMemoryEnc vtk_libxml2_xmlDocDumpFormatMemoryEnc -#define xmlDocDumpMemory vtk_libxml2_xmlDocDumpMemory -#define xmlDocDumpMemoryEnc vtk_libxml2_xmlDocDumpMemoryEnc -#define xmlDocFormatDump vtk_libxml2_xmlDocFormatDump -#define xmlDocGetRootElement vtk_libxml2_xmlDocGetRootElement -#define xmlDocSetRootElement vtk_libxml2_xmlDocSetRootElement -#define xmlDumpAttributeDecl vtk_libxml2_xmlDumpAttributeDecl -#define xmlDumpAttributeTable vtk_libxml2_xmlDumpAttributeTable -#define xmlDumpElementDecl vtk_libxml2_xmlDumpElementDecl -#define xmlDumpElementTable vtk_libxml2_xmlDumpElementTable -#define xmlDumpEntitiesTable vtk_libxml2_xmlDumpEntitiesTable -#define xmlDumpEntityDecl vtk_libxml2_xmlDumpEntityDecl -#define xmlDumpNotationDecl vtk_libxml2_xmlDumpNotationDecl -#define xmlDumpNotationTable vtk_libxml2_xmlDumpNotationTable -#define xmlElemDump vtk_libxml2_xmlElemDump -#define xmlEncodeEntities vtk_libxml2_xmlEncodeEntities -#define xmlEncodeEntitiesReentrant vtk_libxml2_xmlEncodeEntitiesReentrant -#define xmlEncodeSpecialChars vtk_libxml2_xmlEncodeSpecialChars -#define xmlErrMemory vtk_libxml2_xmlErrMemory -#define xmlExpCtxtNbCons vtk_libxml2_xmlExpCtxtNbCons -#define xmlExpCtxtNbNodes vtk_libxml2_xmlExpCtxtNbNodes -#define xmlExpDump vtk_libxml2_xmlExpDump -#define xmlExpExpDerive vtk_libxml2_xmlExpExpDerive -#define xmlExpFree vtk_libxml2_xmlExpFree -#define xmlExpFreeCtxt vtk_libxml2_xmlExpFreeCtxt -#define xmlExpGetLanguage vtk_libxml2_xmlExpGetLanguage -#define xmlExpGetStart vtk_libxml2_xmlExpGetStart -#define xmlExpIsNillable vtk_libxml2_xmlExpIsNillable -#define xmlExpMaxToken vtk_libxml2_xmlExpMaxToken -#define xmlExpNewAtom vtk_libxml2_xmlExpNewAtom -#define xmlExpNewCtxt vtk_libxml2_xmlExpNewCtxt -#define xmlExpNewOr vtk_libxml2_xmlExpNewOr -#define xmlExpNewRange vtk_libxml2_xmlExpNewRange -#define xmlExpNewSeq vtk_libxml2_xmlExpNewSeq -#define xmlExpParse vtk_libxml2_xmlExpParse -#define xmlExpRef vtk_libxml2_xmlExpRef -#define xmlExpStringDerive vtk_libxml2_xmlExpStringDerive -#define xmlExpSubsume vtk_libxml2_xmlExpSubsume -#define xmlFileClose vtk_libxml2_xmlFileClose -#define xmlFileMatch vtk_libxml2_xmlFileMatch -#define xmlFileOpen vtk_libxml2_xmlFileOpen -#define xmlFileRead vtk_libxml2_xmlFileRead -#define xmlFindCharEncodingHandler vtk_libxml2_xmlFindCharEncodingHandler -#define xmlFree vtk_libxml2_xmlFree -#define xmlFreeAttributeTable vtk_libxml2_xmlFreeAttributeTable -#define xmlFreeAutomata vtk_libxml2_xmlFreeAutomata -#define xmlFreeCatalog vtk_libxml2_xmlFreeCatalog -#define xmlFreeDoc vtk_libxml2_xmlFreeDoc -#define xmlFreeDocElementContent vtk_libxml2_xmlFreeDocElementContent -#define xmlFreeDtd vtk_libxml2_xmlFreeDtd -#define xmlFreeElementContent vtk_libxml2_xmlFreeElementContent -#define xmlFreeElementTable vtk_libxml2_xmlFreeElementTable -#define xmlFreeEntitiesTable vtk_libxml2_xmlFreeEntitiesTable -#define xmlFreeEnumeration vtk_libxml2_xmlFreeEnumeration -#define xmlFreeIDTable vtk_libxml2_xmlFreeIDTable -#define xmlFreeInputStream vtk_libxml2_xmlFreeInputStream -#define xmlFreeMutex vtk_libxml2_xmlFreeMutex -#define xmlFreeNode vtk_libxml2_xmlFreeNode -#define xmlFreeNodeList vtk_libxml2_xmlFreeNodeList -#define xmlFreeNotationTable vtk_libxml2_xmlFreeNotationTable -#define xmlFreeNs vtk_libxml2_xmlFreeNs -#define xmlFreeNsList vtk_libxml2_xmlFreeNsList -#define xmlFreeParserCtxt vtk_libxml2_xmlFreeParserCtxt -#define xmlFreeParserInputBuffer vtk_libxml2_xmlFreeParserInputBuffer -#define xmlFreePattern vtk_libxml2_xmlFreePattern -#define xmlFreePatternList vtk_libxml2_xmlFreePatternList -#define xmlFreeProp vtk_libxml2_xmlFreeProp -#define xmlFreePropList vtk_libxml2_xmlFreePropList -#define xmlFreeRMutex vtk_libxml2_xmlFreeRMutex -#define xmlFreeRefTable vtk_libxml2_xmlFreeRefTable -#define xmlFreeStreamCtxt vtk_libxml2_xmlFreeStreamCtxt -#define xmlFreeTextReader vtk_libxml2_xmlFreeTextReader -#define xmlFreeTextWriter vtk_libxml2_xmlFreeTextWriter -#define xmlFreeURI vtk_libxml2_xmlFreeURI -#define xmlFreeValidCtxt vtk_libxml2_xmlFreeValidCtxt -#define xmlGcMemGet vtk_libxml2_xmlGcMemGet -#define xmlGcMemSetup vtk_libxml2_xmlGcMemSetup -#define xmlGenericError vtk_libxml2_xmlGenericError -#define xmlGenericErrorContext vtk_libxml2_xmlGenericErrorContext -#define xmlGenericErrorDefaultFunc vtk_libxml2_xmlGenericErrorDefaultFunc -#define xmlGetBufferAllocationScheme vtk_libxml2_xmlGetBufferAllocationScheme -#define xmlGetCharEncodingHandler vtk_libxml2_xmlGetCharEncodingHandler -#define xmlGetCharEncodingName vtk_libxml2_xmlGetCharEncodingName -#define xmlGetCompressMode vtk_libxml2_xmlGetCompressMode -#define xmlGetDocCompressMode vtk_libxml2_xmlGetDocCompressMode -#define xmlGetDocEntity vtk_libxml2_xmlGetDocEntity -#define xmlGetDtdAttrDesc vtk_libxml2_xmlGetDtdAttrDesc -#define xmlGetDtdElementDesc vtk_libxml2_xmlGetDtdElementDesc -#define xmlGetDtdEntity vtk_libxml2_xmlGetDtdEntity -#define xmlGetDtdNotationDesc vtk_libxml2_xmlGetDtdNotationDesc -#define xmlGetDtdQAttrDesc vtk_libxml2_xmlGetDtdQAttrDesc -#define xmlGetDtdQElementDesc vtk_libxml2_xmlGetDtdQElementDesc -#define xmlGetEncodingAlias vtk_libxml2_xmlGetEncodingAlias -#define xmlGetExternalEntityLoader vtk_libxml2_xmlGetExternalEntityLoader -#define xmlGetFeature vtk_libxml2_xmlGetFeature -#define xmlGetFeaturesList vtk_libxml2_xmlGetFeaturesList -#define xmlGetGlobalState vtk_libxml2_xmlGetGlobalState -#define xmlGetID vtk_libxml2_xmlGetID -#define xmlGetIntSubset vtk_libxml2_xmlGetIntSubset -#define xmlGetLastChild vtk_libxml2_xmlGetLastChild -#define xmlGetLastError vtk_libxml2_xmlGetLastError -#define xmlGetLineNo vtk_libxml2_xmlGetLineNo -#define xmlGetNoNsProp vtk_libxml2_xmlGetNoNsProp -#define xmlGetNodePath vtk_libxml2_xmlGetNodePath -#define xmlGetNsList vtk_libxml2_xmlGetNsList -#define xmlGetNsProp vtk_libxml2_xmlGetNsProp -#define xmlGetParameterEntity vtk_libxml2_xmlGetParameterEntity -#define xmlGetPredefinedEntity vtk_libxml2_xmlGetPredefinedEntity -#define xmlGetProp vtk_libxml2_xmlGetProp -#define xmlGetRefs vtk_libxml2_xmlGetRefs -#define xmlGetThreadId vtk_libxml2_xmlGetThreadId -#define xmlGetUTF8Char vtk_libxml2_xmlGetUTF8Char -#define xmlGetWarningsDefaultValue vtk_libxml2_xmlGetWarningsDefaultValue -#define xmlHandleEntity vtk_libxml2_xmlHandleEntity -#define xmlHasFeature vtk_libxml2_xmlHasFeature -#define xmlHasNsProp vtk_libxml2_xmlHasNsProp -#define xmlHasProp vtk_libxml2_xmlHasProp -#define xmlHashAddEntry vtk_libxml2_xmlHashAddEntry -#define xmlHashAddEntry2 vtk_libxml2_xmlHashAddEntry2 -#define xmlHashAddEntry3 vtk_libxml2_xmlHashAddEntry3 -#define xmlHashCopy vtk_libxml2_xmlHashCopy -#define xmlHashCreate vtk_libxml2_xmlHashCreate -#define xmlHashCreateDict vtk_libxml2_xmlHashCreateDict -#define xmlHashFree vtk_libxml2_xmlHashFree -#define xmlHashLookup vtk_libxml2_xmlHashLookup -#define xmlHashLookup2 vtk_libxml2_xmlHashLookup2 -#define xmlHashLookup3 vtk_libxml2_xmlHashLookup3 -#define xmlHashQLookup vtk_libxml2_xmlHashQLookup -#define xmlHashQLookup2 vtk_libxml2_xmlHashQLookup2 -#define xmlHashQLookup3 vtk_libxml2_xmlHashQLookup3 -#define xmlHashRemoveEntry vtk_libxml2_xmlHashRemoveEntry -#define xmlHashRemoveEntry2 vtk_libxml2_xmlHashRemoveEntry2 -#define xmlHashRemoveEntry3 vtk_libxml2_xmlHashRemoveEntry3 -#define xmlHashScan vtk_libxml2_xmlHashScan -#define xmlHashScan3 vtk_libxml2_xmlHashScan3 -#define xmlHashScanFull vtk_libxml2_xmlHashScanFull -#define xmlHashScanFull3 vtk_libxml2_xmlHashScanFull3 -#define xmlHashSize vtk_libxml2_xmlHashSize -#define xmlHashUpdateEntry vtk_libxml2_xmlHashUpdateEntry -#define xmlHashUpdateEntry2 vtk_libxml2_xmlHashUpdateEntry2 -#define xmlHashUpdateEntry3 vtk_libxml2_xmlHashUpdateEntry3 -#define xmlIOParseDTD vtk_libxml2_xmlIOParseDTD -#define xmlIndentTreeOutput vtk_libxml2_xmlIndentTreeOutput -#define xmlInitCharEncodingHandlers vtk_libxml2_xmlInitCharEncodingHandlers -#define xmlInitGlobals vtk_libxml2_xmlInitGlobals -#define xmlInitMemory vtk_libxml2_xmlInitMemory -#define xmlInitNodeInfoSeq vtk_libxml2_xmlInitNodeInfoSeq -#define xmlInitParser vtk_libxml2_xmlInitParser -#define xmlInitParserCtxt vtk_libxml2_xmlInitParserCtxt -#define xmlInitThreads vtk_libxml2_xmlInitThreads -#define xmlInitializeCatalog vtk_libxml2_xmlInitializeCatalog -#define xmlInitializeGlobalState vtk_libxml2_xmlInitializeGlobalState -#define xmlInitializePredefinedEntities vtk_libxml2_xmlInitializePredefinedEntities -#define xmlIsBaseChar vtk_libxml2_xmlIsBaseChar -#define xmlIsBaseCharGroup vtk_libxml2_xmlIsBaseCharGroup -#define xmlIsBlank vtk_libxml2_xmlIsBlank -#define xmlIsBlankNode vtk_libxml2_xmlIsBlankNode -#define xmlIsChar vtk_libxml2_xmlIsChar -#define xmlIsCharGroup vtk_libxml2_xmlIsCharGroup -#define xmlIsCombining vtk_libxml2_xmlIsCombining -#define xmlIsCombiningGroup vtk_libxml2_xmlIsCombiningGroup -#define xmlIsDigit vtk_libxml2_xmlIsDigit -#define xmlIsDigitGroup vtk_libxml2_xmlIsDigitGroup -#define xmlIsExtender vtk_libxml2_xmlIsExtender -#define xmlIsExtenderGroup vtk_libxml2_xmlIsExtenderGroup -#define xmlIsID vtk_libxml2_xmlIsID -#define xmlIsIdeographic vtk_libxml2_xmlIsIdeographic -#define xmlIsIdeographicGroup vtk_libxml2_xmlIsIdeographicGroup -#define xmlIsLetter vtk_libxml2_xmlIsLetter -#define xmlIsMainThread vtk_libxml2_xmlIsMainThread -#define xmlIsMixedElement vtk_libxml2_xmlIsMixedElement -#define xmlIsPubidChar vtk_libxml2_xmlIsPubidChar -#define xmlIsPubidChar_tab vtk_libxml2_xmlIsPubidChar_tab -#define xmlIsRef vtk_libxml2_xmlIsRef -#define xmlIsXHTML vtk_libxml2_xmlIsXHTML -#define xmlKeepBlanksDefault vtk_libxml2_xmlKeepBlanksDefault -#define xmlKeepBlanksDefaultValue vtk_libxml2_xmlKeepBlanksDefaultValue -#define xmlLineNumbersDefault vtk_libxml2_xmlLineNumbersDefault -#define xmlLineNumbersDefaultValue vtk_libxml2_xmlLineNumbersDefaultValue -#define xmlLinkGetData vtk_libxml2_xmlLinkGetData -#define xmlListAppend vtk_libxml2_xmlListAppend -#define xmlListClear vtk_libxml2_xmlListClear -#define xmlListCopy vtk_libxml2_xmlListCopy -#define xmlListCreate vtk_libxml2_xmlListCreate -#define xmlListDelete vtk_libxml2_xmlListDelete -#define xmlListDup vtk_libxml2_xmlListDup -#define xmlListEmpty vtk_libxml2_xmlListEmpty -#define xmlListEnd vtk_libxml2_xmlListEnd -#define xmlListFront vtk_libxml2_xmlListFront -#define xmlListInsert vtk_libxml2_xmlListInsert -#define xmlListMerge vtk_libxml2_xmlListMerge -#define xmlListPopBack vtk_libxml2_xmlListPopBack -#define xmlListPopFront vtk_libxml2_xmlListPopFront -#define xmlListPushBack vtk_libxml2_xmlListPushBack -#define xmlListPushFront vtk_libxml2_xmlListPushFront -#define xmlListRemoveAll vtk_libxml2_xmlListRemoveAll -#define xmlListRemoveFirst vtk_libxml2_xmlListRemoveFirst -#define xmlListRemoveLast vtk_libxml2_xmlListRemoveLast -#define xmlListReverse vtk_libxml2_xmlListReverse -#define xmlListReverseSearch vtk_libxml2_xmlListReverseSearch -#define xmlListReverseWalk vtk_libxml2_xmlListReverseWalk -#define xmlListSearch vtk_libxml2_xmlListSearch -#define xmlListSize vtk_libxml2_xmlListSize -#define xmlListSort vtk_libxml2_xmlListSort -#define xmlListWalk vtk_libxml2_xmlListWalk -#define xmlLoadACatalog vtk_libxml2_xmlLoadACatalog -#define xmlLoadCatalog vtk_libxml2_xmlLoadCatalog -#define xmlLoadCatalogs vtk_libxml2_xmlLoadCatalogs -#define xmlLoadExtDtdDefaultValue vtk_libxml2_xmlLoadExtDtdDefaultValue -#define xmlLoadExternalEntity vtk_libxml2_xmlLoadExternalEntity -#define xmlLoadSGMLSuperCatalog vtk_libxml2_xmlLoadSGMLSuperCatalog -#define xmlLockLibrary vtk_libxml2_xmlLockLibrary -#define xmlMalloc vtk_libxml2_xmlMalloc -#define xmlMallocAtomic vtk_libxml2_xmlMallocAtomic -#define xmlMallocAtomicLoc vtk_libxml2_xmlMallocAtomicLoc -#define xmlMallocBreakpoint vtk_libxml2_xmlMallocBreakpoint -#define xmlMallocLoc vtk_libxml2_xmlMallocLoc -#define xmlMemBlocks vtk_libxml2_xmlMemBlocks -#define xmlMemDisplay vtk_libxml2_xmlMemDisplay -#define xmlMemFree vtk_libxml2_xmlMemFree -#define xmlMemGet vtk_libxml2_xmlMemGet -#define xmlMemMalloc vtk_libxml2_xmlMemMalloc -#define xmlMemRealloc vtk_libxml2_xmlMemRealloc -#define xmlMemSetup vtk_libxml2_xmlMemSetup -#define xmlMemShow vtk_libxml2_xmlMemShow -#define xmlMemStrdup vtk_libxml2_xmlMemStrdup -#define xmlMemStrdupLoc vtk_libxml2_xmlMemStrdupLoc -#define xmlMemUsed vtk_libxml2_xmlMemUsed -#define xmlMemoryDump vtk_libxml2_xmlMemoryDump -#define xmlMemoryStrdup vtk_libxml2_xmlMemoryStrdup -#define xmlModuleClose vtk_libxml2_xmlModuleClose -#define xmlModuleFree vtk_libxml2_xmlModuleFree -#define xmlModuleOpen vtk_libxml2_xmlModuleOpen -#define xmlModuleSymbol vtk_libxml2_xmlModuleSymbol -#define xmlMutexLock vtk_libxml2_xmlMutexLock -#define xmlMutexUnlock vtk_libxml2_xmlMutexUnlock -#define xmlNamespaceParseNCName vtk_libxml2_xmlNamespaceParseNCName -#define xmlNamespaceParseNSDef vtk_libxml2_xmlNamespaceParseNSDef -#define xmlNamespaceParseQName vtk_libxml2_xmlNamespaceParseQName -#define xmlNewAutomata vtk_libxml2_xmlNewAutomata -#define xmlNewCDataBlock vtk_libxml2_xmlNewCDataBlock -#define xmlNewCatalog vtk_libxml2_xmlNewCatalog -#define xmlNewCharEncodingHandler vtk_libxml2_xmlNewCharEncodingHandler -#define xmlNewCharRef vtk_libxml2_xmlNewCharRef -#define xmlNewChild vtk_libxml2_xmlNewChild -#define xmlNewComment vtk_libxml2_xmlNewComment -#define xmlNewDoc vtk_libxml2_xmlNewDoc -#define xmlNewDocComment vtk_libxml2_xmlNewDocComment -#define xmlNewDocElementContent vtk_libxml2_xmlNewDocElementContent -#define xmlNewDocFragment vtk_libxml2_xmlNewDocFragment -#define xmlNewDocNode vtk_libxml2_xmlNewDocNode -#define xmlNewDocNodeEatName vtk_libxml2_xmlNewDocNodeEatName -#define xmlNewDocPI vtk_libxml2_xmlNewDocPI -#define xmlNewDocProp vtk_libxml2_xmlNewDocProp -#define xmlNewDocRawNode vtk_libxml2_xmlNewDocRawNode -#define xmlNewDocText vtk_libxml2_xmlNewDocText -#define xmlNewDocTextLen vtk_libxml2_xmlNewDocTextLen -#define xmlNewDtd vtk_libxml2_xmlNewDtd -#define xmlNewElementContent vtk_libxml2_xmlNewElementContent -#define xmlNewEntityInputStream vtk_libxml2_xmlNewEntityInputStream -#define xmlNewGlobalNs vtk_libxml2_xmlNewGlobalNs -#define xmlNewIOInputStream vtk_libxml2_xmlNewIOInputStream -#define xmlNewInputFromFile vtk_libxml2_xmlNewInputFromFile -#define xmlNewInputStream vtk_libxml2_xmlNewInputStream -#define xmlNewMutex vtk_libxml2_xmlNewMutex -#define xmlNewNode vtk_libxml2_xmlNewNode -#define xmlNewNodeEatName vtk_libxml2_xmlNewNodeEatName -#define xmlNewNs vtk_libxml2_xmlNewNs -#define xmlNewNsProp vtk_libxml2_xmlNewNsProp -#define xmlNewNsPropEatName vtk_libxml2_xmlNewNsPropEatName -#define xmlNewPI vtk_libxml2_xmlNewPI -#define xmlNewParserCtxt vtk_libxml2_xmlNewParserCtxt -#define xmlNewProp vtk_libxml2_xmlNewProp -#define xmlNewRMutex vtk_libxml2_xmlNewRMutex -#define xmlNewReconciliedNs vtk_libxml2_xmlNewReconciliedNs -#define xmlNewReference vtk_libxml2_xmlNewReference -#define xmlNewStringInputStream vtk_libxml2_xmlNewStringInputStream -#define xmlNewText vtk_libxml2_xmlNewText -#define xmlNewTextChild vtk_libxml2_xmlNewTextChild -#define xmlNewTextLen vtk_libxml2_xmlNewTextLen -#define xmlNewTextReader vtk_libxml2_xmlNewTextReader -#define xmlNewTextReaderFilename vtk_libxml2_xmlNewTextReaderFilename -#define xmlNewTextWriter vtk_libxml2_xmlNewTextWriter -#define xmlNewTextWriterDoc vtk_libxml2_xmlNewTextWriterDoc -#define xmlNewTextWriterFilename vtk_libxml2_xmlNewTextWriterFilename -#define xmlNewTextWriterMemory vtk_libxml2_xmlNewTextWriterMemory -#define xmlNewTextWriterPushParser vtk_libxml2_xmlNewTextWriterPushParser -#define xmlNewTextWriterTree vtk_libxml2_xmlNewTextWriterTree -#define xmlNewValidCtxt vtk_libxml2_xmlNewValidCtxt -#define xmlNextChar vtk_libxml2_xmlNextChar -#define xmlNoNetExternalEntityLoader vtk_libxml2_xmlNoNetExternalEntityLoader -#define xmlNodeAddContent vtk_libxml2_xmlNodeAddContent -#define xmlNodeAddContentLen vtk_libxml2_xmlNodeAddContentLen -#define xmlNodeBufGetContent vtk_libxml2_xmlNodeBufGetContent -#define xmlNodeDump vtk_libxml2_xmlNodeDump -#define xmlNodeDumpOutput vtk_libxml2_xmlNodeDumpOutput -#define xmlNodeGetBase vtk_libxml2_xmlNodeGetBase -#define xmlNodeGetContent vtk_libxml2_xmlNodeGetContent -#define xmlNodeGetLang vtk_libxml2_xmlNodeGetLang -#define xmlNodeGetSpacePreserve vtk_libxml2_xmlNodeGetSpacePreserve -#define xmlNodeIsText vtk_libxml2_xmlNodeIsText -#define xmlNodeListGetRawString vtk_libxml2_xmlNodeListGetRawString -#define xmlNodeListGetString vtk_libxml2_xmlNodeListGetString -#define xmlNodeSetBase vtk_libxml2_xmlNodeSetBase -#define xmlNodeSetContent vtk_libxml2_xmlNodeSetContent -#define xmlNodeSetContentLen vtk_libxml2_xmlNodeSetContentLen -#define xmlNodeSetLang vtk_libxml2_xmlNodeSetLang -#define xmlNodeSetName vtk_libxml2_xmlNodeSetName -#define xmlNodeSetSpacePreserve vtk_libxml2_xmlNodeSetSpacePreserve -#define xmlNormalizeURIPath vtk_libxml2_xmlNormalizeURIPath -#define xmlNormalizeWindowsPath vtk_libxml2_xmlNormalizeWindowsPath -#define xmlNsListDumpOutput vtk_libxml2_xmlNsListDumpOutput -#define xmlOutputBufferClose vtk_libxml2_xmlOutputBufferClose -#define xmlOutputBufferCreateBuffer vtk_libxml2_xmlOutputBufferCreateBuffer -#define xmlOutputBufferCreateFd vtk_libxml2_xmlOutputBufferCreateFd -#define xmlOutputBufferCreateFile vtk_libxml2_xmlOutputBufferCreateFile -#define xmlOutputBufferCreateFilename vtk_libxml2_xmlOutputBufferCreateFilename -#define xmlOutputBufferCreateFilenameDefault vtk_libxml2_xmlOutputBufferCreateFilenameDefault -#define xmlOutputBufferCreateFilenameValue vtk_libxml2_xmlOutputBufferCreateFilenameValue -#define xmlOutputBufferCreateIO vtk_libxml2_xmlOutputBufferCreateIO -#define xmlOutputBufferFlush vtk_libxml2_xmlOutputBufferFlush -#define xmlOutputBufferWrite vtk_libxml2_xmlOutputBufferWrite -#define xmlOutputBufferWriteEscape vtk_libxml2_xmlOutputBufferWriteEscape -#define xmlOutputBufferWriteString vtk_libxml2_xmlOutputBufferWriteString -#define xmlParseAttValue vtk_libxml2_xmlParseAttValue -#define xmlParseAttribute vtk_libxml2_xmlParseAttribute -#define xmlParseAttributeListDecl vtk_libxml2_xmlParseAttributeListDecl -#define xmlParseAttributeType vtk_libxml2_xmlParseAttributeType -#define xmlParseBalancedChunkMemory vtk_libxml2_xmlParseBalancedChunkMemory -#define xmlParseBalancedChunkMemoryRecover vtk_libxml2_xmlParseBalancedChunkMemoryRecover -#define xmlParseCDSect vtk_libxml2_xmlParseCDSect -#define xmlParseCatalogFile vtk_libxml2_xmlParseCatalogFile -#define xmlParseCharData vtk_libxml2_xmlParseCharData -#define xmlParseCharDataComplex vtk_libxml2_xmlParseCharDataComplex -#define xmlParseCharEncoding vtk_libxml2_xmlParseCharEncoding -#define xmlParseCharRef vtk_libxml2_xmlParseCharRef -#define xmlParseChunk vtk_libxml2_xmlParseChunk -#define xmlParseComment vtk_libxml2_xmlParseComment -#define xmlParseContent vtk_libxml2_xmlParseContent -#define xmlParseCtxtExternalEntity vtk_libxml2_xmlParseCtxtExternalEntity -#define xmlParseDTD vtk_libxml2_xmlParseDTD -#define xmlParseDefaultDecl vtk_libxml2_xmlParseDefaultDecl -#define xmlParseDoc vtk_libxml2_xmlParseDoc -#define xmlParseDocTypeDecl vtk_libxml2_xmlParseDocTypeDecl -#define xmlParseDocument vtk_libxml2_xmlParseDocument -#define xmlParseElement vtk_libxml2_xmlParseElement -#define xmlParseElementChildrenContentDecl vtk_libxml2_xmlParseElementChildrenContentDecl -#define xmlParseElementContentDecl vtk_libxml2_xmlParseElementContentDecl -#define xmlParseElementDecl vtk_libxml2_xmlParseElementDecl -#define xmlParseElementMixedContentDecl vtk_libxml2_xmlParseElementMixedContentDecl -#define xmlParseEncName vtk_libxml2_xmlParseEncName -#define xmlParseEncodingDecl vtk_libxml2_xmlParseEncodingDecl -#define xmlParseEndTag vtk_libxml2_xmlParseEndTag -#define xmlParseEntity vtk_libxml2_xmlParseEntity -#define xmlParseEntityDecl vtk_libxml2_xmlParseEntityDecl -#define xmlParseEntityRef vtk_libxml2_xmlParseEntityRef -#define xmlParseEntityValue vtk_libxml2_xmlParseEntityValue -#define xmlParseEnumeratedType vtk_libxml2_xmlParseEnumeratedType -#define xmlParseEnumerationType vtk_libxml2_xmlParseEnumerationType -#define xmlParseExtParsedEnt vtk_libxml2_xmlParseExtParsedEnt -#define xmlParseExternalEntity vtk_libxml2_xmlParseExternalEntity -#define xmlParseExternalID vtk_libxml2_xmlParseExternalID -#define xmlParseExternalSubset vtk_libxml2_xmlParseExternalSubset -#define xmlParseFile vtk_libxml2_xmlParseFile -#define xmlParseInNodeContext vtk_libxml2_xmlParseInNodeContext -#define xmlParseMarkupDecl vtk_libxml2_xmlParseMarkupDecl -#define xmlParseMemory vtk_libxml2_xmlParseMemory -#define xmlParseMisc vtk_libxml2_xmlParseMisc -#define xmlParseName vtk_libxml2_xmlParseName -#define xmlParseNamespace vtk_libxml2_xmlParseNamespace -#define xmlParseNmtoken vtk_libxml2_xmlParseNmtoken -#define xmlParseNotationDecl vtk_libxml2_xmlParseNotationDecl -#define xmlParseNotationType vtk_libxml2_xmlParseNotationType -#define xmlParsePEReference vtk_libxml2_xmlParsePEReference -#define xmlParsePI vtk_libxml2_xmlParsePI -#define xmlParsePITarget vtk_libxml2_xmlParsePITarget -#define xmlParsePubidLiteral vtk_libxml2_xmlParsePubidLiteral -#define xmlParseQuotedString vtk_libxml2_xmlParseQuotedString -#define xmlParseReference vtk_libxml2_xmlParseReference -#define xmlParseSDDecl vtk_libxml2_xmlParseSDDecl -#define xmlParseStartTag vtk_libxml2_xmlParseStartTag -#define xmlParseStringEntityRef vtk_libxml2_xmlParseStringEntityRef -#define xmlParseStringPEReference vtk_libxml2_xmlParseStringPEReference -#define xmlParseSystemLiteral vtk_libxml2_xmlParseSystemLiteral -#define xmlParseTextDecl vtk_libxml2_xmlParseTextDecl -#define xmlParseURI vtk_libxml2_xmlParseURI -#define xmlParseURIRaw vtk_libxml2_xmlParseURIRaw -#define xmlParseURIReference vtk_libxml2_xmlParseURIReference -#define xmlParseVersionInfo vtk_libxml2_xmlParseVersionInfo -#define xmlParseVersionNum vtk_libxml2_xmlParseVersionNum -#define xmlParseXMLDecl vtk_libxml2_xmlParseXMLDecl -#define xmlParserAddNodeInfo vtk_libxml2_xmlParserAddNodeInfo -#define xmlParserDebugEntities vtk_libxml2_xmlParserDebugEntities -#define xmlParserError vtk_libxml2_xmlParserError -#define xmlParserFindNodeInfo vtk_libxml2_xmlParserFindNodeInfo -#define xmlParserFindNodeInfoIndex vtk_libxml2_xmlParserFindNodeInfoIndex -#define xmlParserGetDirectory vtk_libxml2_xmlParserGetDirectory -#define xmlParserHandlePEReference vtk_libxml2_xmlParserHandlePEReference -#define xmlParserHandleReference vtk_libxml2_xmlParserHandleReference -#define xmlParserInputBufferCreateFd vtk_libxml2_xmlParserInputBufferCreateFd -#define xmlParserInputBufferCreateFile vtk_libxml2_xmlParserInputBufferCreateFile -#define xmlParserInputBufferCreateFilename vtk_libxml2_xmlParserInputBufferCreateFilename -#define xmlParserInputBufferCreateFilenameDefault vtk_libxml2_xmlParserInputBufferCreateFilenameDefault -#define xmlParserInputBufferCreateFilenameValue vtk_libxml2_xmlParserInputBufferCreateFilenameValue -#define xmlParserInputBufferCreateIO vtk_libxml2_xmlParserInputBufferCreateIO -#define xmlParserInputBufferCreateMem vtk_libxml2_xmlParserInputBufferCreateMem -#define xmlParserInputBufferCreateStatic vtk_libxml2_xmlParserInputBufferCreateStatic -#define xmlParserInputBufferGrow vtk_libxml2_xmlParserInputBufferGrow -#define xmlParserInputBufferPush vtk_libxml2_xmlParserInputBufferPush -#define xmlParserInputBufferRead vtk_libxml2_xmlParserInputBufferRead -#define xmlParserInputGrow vtk_libxml2_xmlParserInputGrow -#define xmlParserInputRead vtk_libxml2_xmlParserInputRead -#define xmlParserInputShrink vtk_libxml2_xmlParserInputShrink -#define xmlParserMaxDepth vtk_libxml2_xmlParserMaxDepth -#define xmlParserPrintFileContext vtk_libxml2_xmlParserPrintFileContext -#define xmlParserPrintFileInfo vtk_libxml2_xmlParserPrintFileInfo -#define xmlParserValidityError vtk_libxml2_xmlParserValidityError -#define xmlParserValidityWarning vtk_libxml2_xmlParserValidityWarning -#define xmlParserVersion vtk_libxml2_xmlParserVersion -#define xmlParserWarning vtk_libxml2_xmlParserWarning -#define xmlPathToURI vtk_libxml2_xmlPathToURI -#define xmlPatternFromRoot vtk_libxml2_xmlPatternFromRoot -#define xmlPatternGetStreamCtxt vtk_libxml2_xmlPatternGetStreamCtxt -#define xmlPatternMatch vtk_libxml2_xmlPatternMatch -#define xmlPatternMaxDepth vtk_libxml2_xmlPatternMaxDepth -#define xmlPatternMinDepth vtk_libxml2_xmlPatternMinDepth -#define xmlPatternStreamable vtk_libxml2_xmlPatternStreamable -#define xmlPatterncompile vtk_libxml2_xmlPatterncompile -#define xmlPedanticParserDefault vtk_libxml2_xmlPedanticParserDefault -#define xmlPedanticParserDefaultValue vtk_libxml2_xmlPedanticParserDefaultValue -#define xmlPopInput vtk_libxml2_xmlPopInput -#define xmlPopInputCallbacks vtk_libxml2_xmlPopInputCallbacks -#define xmlPrintURI vtk_libxml2_xmlPrintURI -#define xmlPushInput vtk_libxml2_xmlPushInput -#define xmlRMutexLock vtk_libxml2_xmlRMutexLock -#define xmlRMutexUnlock vtk_libxml2_xmlRMutexUnlock -#define xmlReadDoc vtk_libxml2_xmlReadDoc -#define xmlReadFd vtk_libxml2_xmlReadFd -#define xmlReadFile vtk_libxml2_xmlReadFile -#define xmlReadIO vtk_libxml2_xmlReadIO -#define xmlReadMemory vtk_libxml2_xmlReadMemory -#define xmlReaderForDoc vtk_libxml2_xmlReaderForDoc -#define xmlReaderForFd vtk_libxml2_xmlReaderForFd -#define xmlReaderForFile vtk_libxml2_xmlReaderForFile -#define xmlReaderForIO vtk_libxml2_xmlReaderForIO -#define xmlReaderForMemory vtk_libxml2_xmlReaderForMemory -#define xmlReaderNewDoc vtk_libxml2_xmlReaderNewDoc -#define xmlReaderNewFd vtk_libxml2_xmlReaderNewFd -#define xmlReaderNewFile vtk_libxml2_xmlReaderNewFile -#define xmlReaderNewIO vtk_libxml2_xmlReaderNewIO -#define xmlReaderNewMemory vtk_libxml2_xmlReaderNewMemory -#define xmlReaderNewWalker vtk_libxml2_xmlReaderNewWalker -#define xmlReaderWalker vtk_libxml2_xmlReaderWalker -#define xmlRealloc vtk_libxml2_xmlRealloc -#define xmlReallocLoc vtk_libxml2_xmlReallocLoc -#define xmlReconciliateNs vtk_libxml2_xmlReconciliateNs -#define xmlRecoverDoc vtk_libxml2_xmlRecoverDoc -#define xmlRecoverFile vtk_libxml2_xmlRecoverFile -#define xmlRecoverMemory vtk_libxml2_xmlRecoverMemory -#define xmlRegExecErrInfo vtk_libxml2_xmlRegExecErrInfo -#define xmlRegExecNextValues vtk_libxml2_xmlRegExecNextValues -#define xmlRegExecPushString vtk_libxml2_xmlRegExecPushString -#define xmlRegExecPushString2 vtk_libxml2_xmlRegExecPushString2 -#define xmlRegFreeExecCtxt vtk_libxml2_xmlRegFreeExecCtxt -#define xmlRegFreeRegexp vtk_libxml2_xmlRegFreeRegexp -#define xmlRegNewExecCtxt vtk_libxml2_xmlRegNewExecCtxt -#define xmlRegexpCompile vtk_libxml2_xmlRegexpCompile -#define xmlRegexpExec vtk_libxml2_xmlRegexpExec -#define xmlRegexpIsDeterminist vtk_libxml2_xmlRegexpIsDeterminist -#define xmlRegexpPrint vtk_libxml2_xmlRegexpPrint -#define xmlRegisterCharEncodingHandler vtk_libxml2_xmlRegisterCharEncodingHandler -#define xmlRegisterDefaultInputCallbacks vtk_libxml2_xmlRegisterDefaultInputCallbacks -#define xmlRegisterDefaultOutputCallbacks vtk_libxml2_xmlRegisterDefaultOutputCallbacks -#define xmlRegisterInputCallbacks vtk_libxml2_xmlRegisterInputCallbacks -#define xmlRegisterNodeDefault vtk_libxml2_xmlRegisterNodeDefault -#define xmlRegisterNodeDefaultValue vtk_libxml2_xmlRegisterNodeDefaultValue -#define xmlRegisterOutputCallbacks vtk_libxml2_xmlRegisterOutputCallbacks -#define xmlRelaxNGCleanupTypes vtk_libxml2_xmlRelaxNGCleanupTypes -#define xmlRelaxNGDump vtk_libxml2_xmlRelaxNGDump -#define xmlRelaxNGDumpTree vtk_libxml2_xmlRelaxNGDumpTree -#define xmlRelaxNGFree vtk_libxml2_xmlRelaxNGFree -#define xmlRelaxNGFreeParserCtxt vtk_libxml2_xmlRelaxNGFreeParserCtxt -#define xmlRelaxNGFreeValidCtxt vtk_libxml2_xmlRelaxNGFreeValidCtxt -#define xmlRelaxNGGetParserErrors vtk_libxml2_xmlRelaxNGGetParserErrors -#define xmlRelaxNGGetValidErrors vtk_libxml2_xmlRelaxNGGetValidErrors -#define xmlRelaxNGInitTypes vtk_libxml2_xmlRelaxNGInitTypes -#define xmlRelaxNGNewDocParserCtxt vtk_libxml2_xmlRelaxNGNewDocParserCtxt -#define xmlRelaxNGNewMemParserCtxt vtk_libxml2_xmlRelaxNGNewMemParserCtxt -#define xmlRelaxNGNewParserCtxt vtk_libxml2_xmlRelaxNGNewParserCtxt -#define xmlRelaxNGNewValidCtxt vtk_libxml2_xmlRelaxNGNewValidCtxt -#define xmlRelaxNGParse vtk_libxml2_xmlRelaxNGParse -#define xmlRelaxNGSetParserErrors vtk_libxml2_xmlRelaxNGSetParserErrors -#define xmlRelaxNGSetParserStructuredErrors vtk_libxml2_xmlRelaxNGSetParserStructuredErrors -#define xmlRelaxNGSetValidErrors vtk_libxml2_xmlRelaxNGSetValidErrors -#define xmlRelaxNGSetValidStructuredErrors vtk_libxml2_xmlRelaxNGSetValidStructuredErrors -#define xmlRelaxNGValidateDoc vtk_libxml2_xmlRelaxNGValidateDoc -#define xmlRelaxNGValidateFullElement vtk_libxml2_xmlRelaxNGValidateFullElement -#define xmlRelaxNGValidatePopElement vtk_libxml2_xmlRelaxNGValidatePopElement -#define xmlRelaxNGValidatePushCData vtk_libxml2_xmlRelaxNGValidatePushCData -#define xmlRelaxNGValidatePushElement vtk_libxml2_xmlRelaxNGValidatePushElement -#define xmlRelaxParserSetFlag vtk_libxml2_xmlRelaxParserSetFlag -#define xmlRemoveID vtk_libxml2_xmlRemoveID -#define xmlRemoveProp vtk_libxml2_xmlRemoveProp -#define xmlRemoveRef vtk_libxml2_xmlRemoveRef -#define xmlReplaceNode vtk_libxml2_xmlReplaceNode -#define xmlResetError vtk_libxml2_xmlResetError -#define xmlResetLastError vtk_libxml2_xmlResetLastError -#define xmlResolveResourceFromCatalog vtk_libxml2_xmlResolveResourceFromCatalog -#define xmlSAX2AttributeDecl vtk_libxml2_xmlSAX2AttributeDecl -#define xmlSAX2CDataBlock vtk_libxml2_xmlSAX2CDataBlock -#define xmlSAX2Characters vtk_libxml2_xmlSAX2Characters -#define xmlSAX2Comment vtk_libxml2_xmlSAX2Comment -#define xmlSAX2ElementDecl vtk_libxml2_xmlSAX2ElementDecl -#define xmlSAX2EndDocument vtk_libxml2_xmlSAX2EndDocument -#define xmlSAX2EndElement vtk_libxml2_xmlSAX2EndElement -#define xmlSAX2EndElementNs vtk_libxml2_xmlSAX2EndElementNs -#define xmlSAX2EntityDecl vtk_libxml2_xmlSAX2EntityDecl -#define xmlSAX2ExternalSubset vtk_libxml2_xmlSAX2ExternalSubset -#define xmlSAX2GetColumnNumber vtk_libxml2_xmlSAX2GetColumnNumber -#define xmlSAX2GetEntity vtk_libxml2_xmlSAX2GetEntity -#define xmlSAX2GetLineNumber vtk_libxml2_xmlSAX2GetLineNumber -#define xmlSAX2GetParameterEntity vtk_libxml2_xmlSAX2GetParameterEntity -#define xmlSAX2GetPublicId vtk_libxml2_xmlSAX2GetPublicId -#define xmlSAX2GetSystemId vtk_libxml2_xmlSAX2GetSystemId -#define xmlSAX2HasExternalSubset vtk_libxml2_xmlSAX2HasExternalSubset -#define xmlSAX2HasInternalSubset vtk_libxml2_xmlSAX2HasInternalSubset -#define xmlSAX2IgnorableWhitespace vtk_libxml2_xmlSAX2IgnorableWhitespace -#define xmlSAX2InitDefaultSAXHandler vtk_libxml2_xmlSAX2InitDefaultSAXHandler -#define xmlSAX2InitDocbDefaultSAXHandler vtk_libxml2_xmlSAX2InitDocbDefaultSAXHandler -#define xmlSAX2InitHtmlDefaultSAXHandler vtk_libxml2_xmlSAX2InitHtmlDefaultSAXHandler -#define xmlSAX2InternalSubset vtk_libxml2_xmlSAX2InternalSubset -#define xmlSAX2IsStandalone vtk_libxml2_xmlSAX2IsStandalone -#define xmlSAX2NotationDecl vtk_libxml2_xmlSAX2NotationDecl -#define xmlSAX2ProcessingInstruction vtk_libxml2_xmlSAX2ProcessingInstruction -#define xmlSAX2Reference vtk_libxml2_xmlSAX2Reference -#define xmlSAX2ResolveEntity vtk_libxml2_xmlSAX2ResolveEntity -#define xmlSAX2SetDocumentLocator vtk_libxml2_xmlSAX2SetDocumentLocator -#define xmlSAX2StartDocument vtk_libxml2_xmlSAX2StartDocument -#define xmlSAX2StartElement vtk_libxml2_xmlSAX2StartElement -#define xmlSAX2StartElementNs vtk_libxml2_xmlSAX2StartElementNs -#define xmlSAX2UnparsedEntityDecl vtk_libxml2_xmlSAX2UnparsedEntityDecl -#define xmlSAXDefaultVersion vtk_libxml2_xmlSAXDefaultVersion -#define xmlSAXParseDTD vtk_libxml2_xmlSAXParseDTD -#define xmlSAXParseDoc vtk_libxml2_xmlSAXParseDoc -#define xmlSAXParseEntity vtk_libxml2_xmlSAXParseEntity -#define xmlSAXParseFile vtk_libxml2_xmlSAXParseFile -#define xmlSAXParseFileWithData vtk_libxml2_xmlSAXParseFileWithData -#define xmlSAXParseMemory vtk_libxml2_xmlSAXParseMemory -#define xmlSAXParseMemoryWithData vtk_libxml2_xmlSAXParseMemoryWithData -#define xmlSAXUserParseFile vtk_libxml2_xmlSAXUserParseFile -#define xmlSAXUserParseMemory vtk_libxml2_xmlSAXUserParseMemory -#define xmlSAXVersion vtk_libxml2_xmlSAXVersion -#define xmlSaveClose vtk_libxml2_xmlSaveClose -#define xmlSaveDoc vtk_libxml2_xmlSaveDoc -#define xmlSaveFile vtk_libxml2_xmlSaveFile -#define xmlSaveFileEnc vtk_libxml2_xmlSaveFileEnc -#define xmlSaveFileTo vtk_libxml2_xmlSaveFileTo -#define xmlSaveFlush vtk_libxml2_xmlSaveFlush -#define xmlSaveFormatFile vtk_libxml2_xmlSaveFormatFile -#define xmlSaveFormatFileEnc vtk_libxml2_xmlSaveFormatFileEnc -#define xmlSaveFormatFileTo vtk_libxml2_xmlSaveFormatFileTo -#define xmlSaveNoEmptyTags vtk_libxml2_xmlSaveNoEmptyTags -#define xmlSaveSetAttrEscape vtk_libxml2_xmlSaveSetAttrEscape -#define xmlSaveSetEscape vtk_libxml2_xmlSaveSetEscape -#define xmlSaveToBuffer vtk_libxml2_xmlSaveToBuffer -#define xmlSaveToFd vtk_libxml2_xmlSaveToFd -#define xmlSaveToFilename vtk_libxml2_xmlSaveToFilename -#define xmlSaveToIO vtk_libxml2_xmlSaveToIO -#define xmlSaveTree vtk_libxml2_xmlSaveTree -#define xmlSaveUri vtk_libxml2_xmlSaveUri -#define xmlScanAttributeDecl vtk_libxml2_xmlScanAttributeDecl -#define xmlScanName vtk_libxml2_xmlScanName -#define xmlSchemaCheckFacet vtk_libxml2_xmlSchemaCheckFacet -#define xmlSchemaCleanupTypes vtk_libxml2_xmlSchemaCleanupTypes -#define xmlSchemaCollapseString vtk_libxml2_xmlSchemaCollapseString -#define xmlSchemaCompareValues vtk_libxml2_xmlSchemaCompareValues -#define xmlSchemaCompareValuesWhtsp vtk_libxml2_xmlSchemaCompareValuesWhtsp -#define xmlSchemaCopyValue vtk_libxml2_xmlSchemaCopyValue -#define xmlSchemaDump vtk_libxml2_xmlSchemaDump -#define xmlSchemaFree vtk_libxml2_xmlSchemaFree -#define xmlSchemaFreeFacet vtk_libxml2_xmlSchemaFreeFacet -#define xmlSchemaFreeParserCtxt vtk_libxml2_xmlSchemaFreeParserCtxt -#define xmlSchemaFreeType vtk_libxml2_xmlSchemaFreeType -#define xmlSchemaFreeValidCtxt vtk_libxml2_xmlSchemaFreeValidCtxt -#define xmlSchemaFreeValue vtk_libxml2_xmlSchemaFreeValue -#define xmlSchemaFreeWildcard vtk_libxml2_xmlSchemaFreeWildcard -#define xmlSchemaGetBuiltInListSimpleTypeItemType vtk_libxml2_xmlSchemaGetBuiltInListSimpleTypeItemType -#define xmlSchemaGetBuiltInType vtk_libxml2_xmlSchemaGetBuiltInType -#define xmlSchemaGetCanonValue vtk_libxml2_xmlSchemaGetCanonValue -#define xmlSchemaGetCanonValueWhtsp vtk_libxml2_xmlSchemaGetCanonValueWhtsp -#define xmlSchemaGetFacetValueAsULong vtk_libxml2_xmlSchemaGetFacetValueAsULong -#define xmlSchemaGetParserErrors vtk_libxml2_xmlSchemaGetParserErrors -#define xmlSchemaGetPredefinedType vtk_libxml2_xmlSchemaGetPredefinedType -#define xmlSchemaGetValType vtk_libxml2_xmlSchemaGetValType -#define xmlSchemaGetValidErrors vtk_libxml2_xmlSchemaGetValidErrors -#define xmlSchemaInitTypes vtk_libxml2_xmlSchemaInitTypes -#define xmlSchemaIsBuiltInTypeFacet vtk_libxml2_xmlSchemaIsBuiltInTypeFacet -#define xmlSchemaIsValid vtk_libxml2_xmlSchemaIsValid -#define xmlSchemaNewDocParserCtxt vtk_libxml2_xmlSchemaNewDocParserCtxt -#define xmlSchemaNewFacet vtk_libxml2_xmlSchemaNewFacet -#define xmlSchemaNewMemParserCtxt vtk_libxml2_xmlSchemaNewMemParserCtxt -#define xmlSchemaNewNOTATIONValue vtk_libxml2_xmlSchemaNewNOTATIONValue -#define xmlSchemaNewParserCtxt vtk_libxml2_xmlSchemaNewParserCtxt -#define xmlSchemaNewQNameValue vtk_libxml2_xmlSchemaNewQNameValue -#define xmlSchemaNewStringValue vtk_libxml2_xmlSchemaNewStringValue -#define xmlSchemaNewValidCtxt vtk_libxml2_xmlSchemaNewValidCtxt -#define xmlSchemaParse vtk_libxml2_xmlSchemaParse -#define xmlSchemaSAXPlug vtk_libxml2_xmlSchemaSAXPlug -#define xmlSchemaSAXUnplug vtk_libxml2_xmlSchemaSAXUnplug -#define xmlSchemaSetParserErrors vtk_libxml2_xmlSchemaSetParserErrors -#define xmlSchemaSetParserStructuredErrors vtk_libxml2_xmlSchemaSetParserStructuredErrors -#define xmlSchemaSetValidErrors vtk_libxml2_xmlSchemaSetValidErrors -#define xmlSchemaSetValidOptions vtk_libxml2_xmlSchemaSetValidOptions -#define xmlSchemaSetValidStructuredErrors vtk_libxml2_xmlSchemaSetValidStructuredErrors -#define xmlSchemaValPredefTypeNode vtk_libxml2_xmlSchemaValPredefTypeNode -#define xmlSchemaValPredefTypeNodeNoNorm vtk_libxml2_xmlSchemaValPredefTypeNodeNoNorm -#define xmlSchemaValidCtxtGetOptions vtk_libxml2_xmlSchemaValidCtxtGetOptions -#define xmlSchemaValidateDoc vtk_libxml2_xmlSchemaValidateDoc -#define xmlSchemaValidateFacet vtk_libxml2_xmlSchemaValidateFacet -#define xmlSchemaValidateFacetWhtsp vtk_libxml2_xmlSchemaValidateFacetWhtsp -#define xmlSchemaValidateFile vtk_libxml2_xmlSchemaValidateFile -#define xmlSchemaValidateLengthFacet vtk_libxml2_xmlSchemaValidateLengthFacet -#define xmlSchemaValidateLengthFacetWhtsp vtk_libxml2_xmlSchemaValidateLengthFacetWhtsp -#define xmlSchemaValidateListSimpleTypeFacet vtk_libxml2_xmlSchemaValidateListSimpleTypeFacet -#define xmlSchemaValidateOneElement vtk_libxml2_xmlSchemaValidateOneElement -#define xmlSchemaValidatePredefinedType vtk_libxml2_xmlSchemaValidatePredefinedType -#define xmlSchemaValidateStream vtk_libxml2_xmlSchemaValidateStream -#define xmlSchemaValueAppend vtk_libxml2_xmlSchemaValueAppend -#define xmlSchemaValueGetAsBoolean vtk_libxml2_xmlSchemaValueGetAsBoolean -#define xmlSchemaValueGetAsString vtk_libxml2_xmlSchemaValueGetAsString -#define xmlSchemaValueGetNext vtk_libxml2_xmlSchemaValueGetNext -#define xmlSchemaWhiteSpaceReplace vtk_libxml2_xmlSchemaWhiteSpaceReplace -#define xmlSchematronFree vtk_libxml2_xmlSchematronFree -#define xmlSchematronFreeParserCtxt vtk_libxml2_xmlSchematronFreeParserCtxt -#define xmlSchematronFreeValidCtxt vtk_libxml2_xmlSchematronFreeValidCtxt -#define xmlSchematronNewDocParserCtxt vtk_libxml2_xmlSchematronNewDocParserCtxt -#define xmlSchematronNewMemParserCtxt vtk_libxml2_xmlSchematronNewMemParserCtxt -#define xmlSchematronNewParserCtxt vtk_libxml2_xmlSchematronNewParserCtxt -#define xmlSchematronNewValidCtxt vtk_libxml2_xmlSchematronNewValidCtxt -#define xmlSchematronParse vtk_libxml2_xmlSchematronParse -#define xmlSchematronValidateDoc vtk_libxml2_xmlSchematronValidateDoc -#define xmlSearchNs vtk_libxml2_xmlSearchNs -#define xmlSearchNsByHref vtk_libxml2_xmlSearchNsByHref -#define xmlSetBufferAllocationScheme vtk_libxml2_xmlSetBufferAllocationScheme -#define xmlSetCompressMode vtk_libxml2_xmlSetCompressMode -#define xmlSetDocCompressMode vtk_libxml2_xmlSetDocCompressMode -#define xmlSetEntityReferenceFunc vtk_libxml2_xmlSetEntityReferenceFunc -#define xmlSetExternalEntityLoader vtk_libxml2_xmlSetExternalEntityLoader -#define xmlSetFeature vtk_libxml2_xmlSetFeature -#define xmlSetGenericErrorFunc vtk_libxml2_xmlSetGenericErrorFunc -#define xmlSetListDoc vtk_libxml2_xmlSetListDoc -#define xmlSetNs vtk_libxml2_xmlSetNs -#define xmlSetNsProp vtk_libxml2_xmlSetNsProp -#define xmlSetProp vtk_libxml2_xmlSetProp -#define xmlSetStructuredErrorFunc vtk_libxml2_xmlSetStructuredErrorFunc -#define xmlSetTreeDoc vtk_libxml2_xmlSetTreeDoc -#define xmlSetupParserForBuffer vtk_libxml2_xmlSetupParserForBuffer -#define xmlSkipBlankChars vtk_libxml2_xmlSkipBlankChars -#define xmlSnprintfElementContent vtk_libxml2_xmlSnprintfElementContent -#define xmlSplitQName vtk_libxml2_xmlSplitQName -#define xmlSplitQName2 vtk_libxml2_xmlSplitQName2 -#define xmlSplitQName3 vtk_libxml2_xmlSplitQName3 -#define xmlSprintfElementContent vtk_libxml2_xmlSprintfElementContent -#define xmlStopParser vtk_libxml2_xmlStopParser -#define xmlStrEqual vtk_libxml2_xmlStrEqual -#define xmlStrPrintf vtk_libxml2_xmlStrPrintf -#define xmlStrQEqual vtk_libxml2_xmlStrQEqual -#define xmlStrVPrintf vtk_libxml2_xmlStrVPrintf -#define xmlStrcasecmp vtk_libxml2_xmlStrcasecmp -#define xmlStrcasestr vtk_libxml2_xmlStrcasestr -#define xmlStrcat vtk_libxml2_xmlStrcat -#define xmlStrchr vtk_libxml2_xmlStrchr -#define xmlStrcmp vtk_libxml2_xmlStrcmp -#define xmlStrdup vtk_libxml2_xmlStrdup -#define xmlStreamPop vtk_libxml2_xmlStreamPop -#define xmlStreamPush vtk_libxml2_xmlStreamPush -#define xmlStreamPushAttr vtk_libxml2_xmlStreamPushAttr -#define xmlStreamPushNode vtk_libxml2_xmlStreamPushNode -#define xmlStreamWantsAnyNode vtk_libxml2_xmlStreamWantsAnyNode -#define xmlStringComment vtk_libxml2_xmlStringComment -#define xmlStringCurrentChar vtk_libxml2_xmlStringCurrentChar -#define xmlStringDecodeEntities vtk_libxml2_xmlStringDecodeEntities -#define xmlStringGetNodeList vtk_libxml2_xmlStringGetNodeList -#define xmlStringLenDecodeEntities vtk_libxml2_xmlStringLenDecodeEntities -#define xmlStringLenGetNodeList vtk_libxml2_xmlStringLenGetNodeList -#define xmlStringText vtk_libxml2_xmlStringText -#define xmlStringTextNoenc vtk_libxml2_xmlStringTextNoenc -#define xmlStrlen vtk_libxml2_xmlStrlen -#define xmlStrncasecmp vtk_libxml2_xmlStrncasecmp -#define xmlStrncat vtk_libxml2_xmlStrncat -#define xmlStrncatNew vtk_libxml2_xmlStrncatNew -#define xmlStrncmp vtk_libxml2_xmlStrncmp -#define xmlStrndup vtk_libxml2_xmlStrndup -#define xmlStrstr vtk_libxml2_xmlStrstr -#define xmlStrsub vtk_libxml2_xmlStrsub -#define xmlStructuredError vtk_libxml2_xmlStructuredError -#define xmlSubstituteEntitiesDefault vtk_libxml2_xmlSubstituteEntitiesDefault -#define xmlSubstituteEntitiesDefaultValue vtk_libxml2_xmlSubstituteEntitiesDefaultValue -#define xmlSwitchEncoding vtk_libxml2_xmlSwitchEncoding -#define xmlSwitchInputEncoding vtk_libxml2_xmlSwitchInputEncoding -#define xmlSwitchToEncoding vtk_libxml2_xmlSwitchToEncoding -#define xmlTextConcat vtk_libxml2_xmlTextConcat -#define xmlTextMerge vtk_libxml2_xmlTextMerge -#define xmlTextReaderAttributeCount vtk_libxml2_xmlTextReaderAttributeCount -#define xmlTextReaderBaseUri vtk_libxml2_xmlTextReaderBaseUri -#define xmlTextReaderByteConsumed vtk_libxml2_xmlTextReaderByteConsumed -#define xmlTextReaderClose vtk_libxml2_xmlTextReaderClose -#define xmlTextReaderConstBaseUri vtk_libxml2_xmlTextReaderConstBaseUri -#define xmlTextReaderConstEncoding vtk_libxml2_xmlTextReaderConstEncoding -#define xmlTextReaderConstLocalName vtk_libxml2_xmlTextReaderConstLocalName -#define xmlTextReaderConstName vtk_libxml2_xmlTextReaderConstName -#define xmlTextReaderConstNamespaceUri vtk_libxml2_xmlTextReaderConstNamespaceUri -#define xmlTextReaderConstPrefix vtk_libxml2_xmlTextReaderConstPrefix -#define xmlTextReaderConstString vtk_libxml2_xmlTextReaderConstString -#define xmlTextReaderConstValue vtk_libxml2_xmlTextReaderConstValue -#define xmlTextReaderConstXmlLang vtk_libxml2_xmlTextReaderConstXmlLang -#define xmlTextReaderConstXmlVersion vtk_libxml2_xmlTextReaderConstXmlVersion -#define xmlTextReaderCurrentDoc vtk_libxml2_xmlTextReaderCurrentDoc -#define xmlTextReaderCurrentNode vtk_libxml2_xmlTextReaderCurrentNode -#define xmlTextReaderDepth vtk_libxml2_xmlTextReaderDepth -#define xmlTextReaderExpand vtk_libxml2_xmlTextReaderExpand -#define xmlTextReaderGetAttribute vtk_libxml2_xmlTextReaderGetAttribute -#define xmlTextReaderGetAttributeNo vtk_libxml2_xmlTextReaderGetAttributeNo -#define xmlTextReaderGetAttributeNs vtk_libxml2_xmlTextReaderGetAttributeNs -#define xmlTextReaderGetErrorHandler vtk_libxml2_xmlTextReaderGetErrorHandler -#define xmlTextReaderGetParserColumnNumber vtk_libxml2_xmlTextReaderGetParserColumnNumber -#define xmlTextReaderGetParserLineNumber vtk_libxml2_xmlTextReaderGetParserLineNumber -#define xmlTextReaderGetParserProp vtk_libxml2_xmlTextReaderGetParserProp -#define xmlTextReaderGetRemainder vtk_libxml2_xmlTextReaderGetRemainder -#define xmlTextReaderHasAttributes vtk_libxml2_xmlTextReaderHasAttributes -#define xmlTextReaderHasValue vtk_libxml2_xmlTextReaderHasValue -#define xmlTextReaderIsDefault vtk_libxml2_xmlTextReaderIsDefault -#define xmlTextReaderIsEmptyElement vtk_libxml2_xmlTextReaderIsEmptyElement -#define xmlTextReaderIsNamespaceDecl vtk_libxml2_xmlTextReaderIsNamespaceDecl -#define xmlTextReaderIsValid vtk_libxml2_xmlTextReaderIsValid -#define xmlTextReaderLocalName vtk_libxml2_xmlTextReaderLocalName -#define xmlTextReaderLocatorBaseURI vtk_libxml2_xmlTextReaderLocatorBaseURI -#define xmlTextReaderLocatorLineNumber vtk_libxml2_xmlTextReaderLocatorLineNumber -#define xmlTextReaderLookupNamespace vtk_libxml2_xmlTextReaderLookupNamespace -#define xmlTextReaderMoveToAttribute vtk_libxml2_xmlTextReaderMoveToAttribute -#define xmlTextReaderMoveToAttributeNo vtk_libxml2_xmlTextReaderMoveToAttributeNo -#define xmlTextReaderMoveToAttributeNs vtk_libxml2_xmlTextReaderMoveToAttributeNs -#define xmlTextReaderMoveToElement vtk_libxml2_xmlTextReaderMoveToElement -#define xmlTextReaderMoveToFirstAttribute vtk_libxml2_xmlTextReaderMoveToFirstAttribute -#define xmlTextReaderMoveToNextAttribute vtk_libxml2_xmlTextReaderMoveToNextAttribute -#define xmlTextReaderName vtk_libxml2_xmlTextReaderName -#define xmlTextReaderNamespaceUri vtk_libxml2_xmlTextReaderNamespaceUri -#define xmlTextReaderNext vtk_libxml2_xmlTextReaderNext -#define xmlTextReaderNextSibling vtk_libxml2_xmlTextReaderNextSibling -#define xmlTextReaderNodeType vtk_libxml2_xmlTextReaderNodeType -#define xmlTextReaderNormalization vtk_libxml2_xmlTextReaderNormalization -#define xmlTextReaderPrefix vtk_libxml2_xmlTextReaderPrefix -#define xmlTextReaderPreserve vtk_libxml2_xmlTextReaderPreserve -#define xmlTextReaderPreservePattern vtk_libxml2_xmlTextReaderPreservePattern -#define xmlTextReaderQuoteChar vtk_libxml2_xmlTextReaderQuoteChar -#define xmlTextReaderRead vtk_libxml2_xmlTextReaderRead -#define xmlTextReaderReadAttributeValue vtk_libxml2_xmlTextReaderReadAttributeValue -#define xmlTextReaderReadInnerXml vtk_libxml2_xmlTextReaderReadInnerXml -#define xmlTextReaderReadOuterXml vtk_libxml2_xmlTextReaderReadOuterXml -#define xmlTextReaderReadState vtk_libxml2_xmlTextReaderReadState -#define xmlTextReaderReadString vtk_libxml2_xmlTextReaderReadString -#define xmlTextReaderRelaxNGSetSchema vtk_libxml2_xmlTextReaderRelaxNGSetSchema -#define xmlTextReaderRelaxNGValidate vtk_libxml2_xmlTextReaderRelaxNGValidate -#define xmlTextReaderSchemaValidate vtk_libxml2_xmlTextReaderSchemaValidate -#define xmlTextReaderSchemaValidateCtxt vtk_libxml2_xmlTextReaderSchemaValidateCtxt -#define xmlTextReaderSetErrorHandler vtk_libxml2_xmlTextReaderSetErrorHandler -#define xmlTextReaderSetParserProp vtk_libxml2_xmlTextReaderSetParserProp -#define xmlTextReaderSetSchema vtk_libxml2_xmlTextReaderSetSchema -#define xmlTextReaderSetStructuredErrorHandler vtk_libxml2_xmlTextReaderSetStructuredErrorHandler -#define xmlTextReaderStandalone vtk_libxml2_xmlTextReaderStandalone -#define xmlTextReaderValue vtk_libxml2_xmlTextReaderValue -#define xmlTextReaderXmlLang vtk_libxml2_xmlTextReaderXmlLang -#define xmlTextWriterEndAttribute vtk_libxml2_xmlTextWriterEndAttribute -#define xmlTextWriterEndCDATA vtk_libxml2_xmlTextWriterEndCDATA -#define xmlTextWriterEndComment vtk_libxml2_xmlTextWriterEndComment -#define xmlTextWriterEndDTD vtk_libxml2_xmlTextWriterEndDTD -#define xmlTextWriterEndDTDAttlist vtk_libxml2_xmlTextWriterEndDTDAttlist -#define xmlTextWriterEndDTDElement vtk_libxml2_xmlTextWriterEndDTDElement -#define xmlTextWriterEndDTDEntity vtk_libxml2_xmlTextWriterEndDTDEntity -#define xmlTextWriterEndDocument vtk_libxml2_xmlTextWriterEndDocument -#define xmlTextWriterEndElement vtk_libxml2_xmlTextWriterEndElement -#define xmlTextWriterEndPI vtk_libxml2_xmlTextWriterEndPI -#define xmlTextWriterFlush vtk_libxml2_xmlTextWriterFlush -#define xmlTextWriterFullEndElement vtk_libxml2_xmlTextWriterFullEndElement -#define xmlTextWriterSetIndent vtk_libxml2_xmlTextWriterSetIndent -#define xmlTextWriterSetIndentString vtk_libxml2_xmlTextWriterSetIndentString -#define xmlTextWriterStartAttribute vtk_libxml2_xmlTextWriterStartAttribute -#define xmlTextWriterStartAttributeNS vtk_libxml2_xmlTextWriterStartAttributeNS -#define xmlTextWriterStartCDATA vtk_libxml2_xmlTextWriterStartCDATA -#define xmlTextWriterStartComment vtk_libxml2_xmlTextWriterStartComment -#define xmlTextWriterStartDTD vtk_libxml2_xmlTextWriterStartDTD -#define xmlTextWriterStartDTDAttlist vtk_libxml2_xmlTextWriterStartDTDAttlist -#define xmlTextWriterStartDTDElement vtk_libxml2_xmlTextWriterStartDTDElement -#define xmlTextWriterStartDTDEntity vtk_libxml2_xmlTextWriterStartDTDEntity -#define xmlTextWriterStartDocument vtk_libxml2_xmlTextWriterStartDocument -#define xmlTextWriterStartElement vtk_libxml2_xmlTextWriterStartElement -#define xmlTextWriterStartElementNS vtk_libxml2_xmlTextWriterStartElementNS -#define xmlTextWriterStartPI vtk_libxml2_xmlTextWriterStartPI -#define xmlTextWriterWriteAttribute vtk_libxml2_xmlTextWriterWriteAttribute -#define xmlTextWriterWriteAttributeNS vtk_libxml2_xmlTextWriterWriteAttributeNS -#define xmlTextWriterWriteBase64 vtk_libxml2_xmlTextWriterWriteBase64 -#define xmlTextWriterWriteBinHex vtk_libxml2_xmlTextWriterWriteBinHex -#define xmlTextWriterWriteCDATA vtk_libxml2_xmlTextWriterWriteCDATA -#define xmlTextWriterWriteComment vtk_libxml2_xmlTextWriterWriteComment -#define xmlTextWriterWriteDTD vtk_libxml2_xmlTextWriterWriteDTD -#define xmlTextWriterWriteDTDAttlist vtk_libxml2_xmlTextWriterWriteDTDAttlist -#define xmlTextWriterWriteDTDElement vtk_libxml2_xmlTextWriterWriteDTDElement -#define xmlTextWriterWriteDTDEntity vtk_libxml2_xmlTextWriterWriteDTDEntity -#define xmlTextWriterWriteDTDExternalEntity vtk_libxml2_xmlTextWriterWriteDTDExternalEntity -#define xmlTextWriterWriteDTDExternalEntityContents vtk_libxml2_xmlTextWriterWriteDTDExternalEntityContents -#define xmlTextWriterWriteDTDInternalEntity vtk_libxml2_xmlTextWriterWriteDTDInternalEntity -#define xmlTextWriterWriteDTDNotation vtk_libxml2_xmlTextWriterWriteDTDNotation -#define xmlTextWriterWriteElement vtk_libxml2_xmlTextWriterWriteElement -#define xmlTextWriterWriteElementNS vtk_libxml2_xmlTextWriterWriteElementNS -#define xmlTextWriterWriteFormatAttribute vtk_libxml2_xmlTextWriterWriteFormatAttribute -#define xmlTextWriterWriteFormatAttributeNS vtk_libxml2_xmlTextWriterWriteFormatAttributeNS -#define xmlTextWriterWriteFormatCDATA vtk_libxml2_xmlTextWriterWriteFormatCDATA -#define xmlTextWriterWriteFormatComment vtk_libxml2_xmlTextWriterWriteFormatComment -#define xmlTextWriterWriteFormatDTD vtk_libxml2_xmlTextWriterWriteFormatDTD -#define xmlTextWriterWriteFormatDTDAttlist vtk_libxml2_xmlTextWriterWriteFormatDTDAttlist -#define xmlTextWriterWriteFormatDTDElement vtk_libxml2_xmlTextWriterWriteFormatDTDElement -#define xmlTextWriterWriteFormatDTDInternalEntity vtk_libxml2_xmlTextWriterWriteFormatDTDInternalEntity -#define xmlTextWriterWriteFormatElement vtk_libxml2_xmlTextWriterWriteFormatElement -#define xmlTextWriterWriteFormatElementNS vtk_libxml2_xmlTextWriterWriteFormatElementNS -#define xmlTextWriterWriteFormatPI vtk_libxml2_xmlTextWriterWriteFormatPI -#define xmlTextWriterWriteFormatRaw vtk_libxml2_xmlTextWriterWriteFormatRaw -#define xmlTextWriterWriteFormatString vtk_libxml2_xmlTextWriterWriteFormatString -#define xmlTextWriterWritePI vtk_libxml2_xmlTextWriterWritePI -#define xmlTextWriterWriteRaw vtk_libxml2_xmlTextWriterWriteRaw -#define xmlTextWriterWriteRawLen vtk_libxml2_xmlTextWriterWriteRawLen -#define xmlTextWriterWriteString vtk_libxml2_xmlTextWriterWriteString -#define xmlTextWriterWriteVFormatAttribute vtk_libxml2_xmlTextWriterWriteVFormatAttribute -#define xmlTextWriterWriteVFormatAttributeNS vtk_libxml2_xmlTextWriterWriteVFormatAttributeNS -#define xmlTextWriterWriteVFormatCDATA vtk_libxml2_xmlTextWriterWriteVFormatCDATA -#define xmlTextWriterWriteVFormatComment vtk_libxml2_xmlTextWriterWriteVFormatComment -#define xmlTextWriterWriteVFormatDTD vtk_libxml2_xmlTextWriterWriteVFormatDTD -#define xmlTextWriterWriteVFormatDTDAttlist vtk_libxml2_xmlTextWriterWriteVFormatDTDAttlist -#define xmlTextWriterWriteVFormatDTDElement vtk_libxml2_xmlTextWriterWriteVFormatDTDElement -#define xmlTextWriterWriteVFormatDTDInternalEntity vtk_libxml2_xmlTextWriterWriteVFormatDTDInternalEntity -#define xmlTextWriterWriteVFormatElement vtk_libxml2_xmlTextWriterWriteVFormatElement -#define xmlTextWriterWriteVFormatElementNS vtk_libxml2_xmlTextWriterWriteVFormatElementNS -#define xmlTextWriterWriteVFormatPI vtk_libxml2_xmlTextWriterWriteVFormatPI -#define xmlTextWriterWriteVFormatRaw vtk_libxml2_xmlTextWriterWriteVFormatRaw -#define xmlTextWriterWriteVFormatString vtk_libxml2_xmlTextWriterWriteVFormatString -#define xmlThrDefBufferAllocScheme vtk_libxml2_xmlThrDefBufferAllocScheme -#define xmlThrDefDefaultBufferSize vtk_libxml2_xmlThrDefDefaultBufferSize -#define xmlThrDefDeregisterNodeDefault vtk_libxml2_xmlThrDefDeregisterNodeDefault -#define xmlThrDefDoValidityCheckingDefaultValue vtk_libxml2_xmlThrDefDoValidityCheckingDefaultValue -#define xmlThrDefGetWarningsDefaultValue vtk_libxml2_xmlThrDefGetWarningsDefaultValue -#define xmlThrDefIndentTreeOutput vtk_libxml2_xmlThrDefIndentTreeOutput -#define xmlThrDefKeepBlanksDefaultValue vtk_libxml2_xmlThrDefKeepBlanksDefaultValue -#define xmlThrDefLineNumbersDefaultValue vtk_libxml2_xmlThrDefLineNumbersDefaultValue -#define xmlThrDefLoadExtDtdDefaultValue vtk_libxml2_xmlThrDefLoadExtDtdDefaultValue -#define xmlThrDefOutputBufferCreateFilenameDefault vtk_libxml2_xmlThrDefOutputBufferCreateFilenameDefault -#define xmlThrDefParserDebugEntities vtk_libxml2_xmlThrDefParserDebugEntities -#define xmlThrDefParserInputBufferCreateFilenameDefault vtk_libxml2_xmlThrDefParserInputBufferCreateFilenameDefault -#define xmlThrDefPedanticParserDefaultValue vtk_libxml2_xmlThrDefPedanticParserDefaultValue -#define xmlThrDefRegisterNodeDefault vtk_libxml2_xmlThrDefRegisterNodeDefault -#define xmlThrDefSaveNoEmptyTags vtk_libxml2_xmlThrDefSaveNoEmptyTags -#define xmlThrDefSetGenericErrorFunc vtk_libxml2_xmlThrDefSetGenericErrorFunc -#define xmlThrDefSetStructuredErrorFunc vtk_libxml2_xmlThrDefSetStructuredErrorFunc -#define xmlThrDefSubstituteEntitiesDefaultValue vtk_libxml2_xmlThrDefSubstituteEntitiesDefaultValue -#define xmlThrDefTreeIndentString vtk_libxml2_xmlThrDefTreeIndentString -#define xmlTreeIndentString vtk_libxml2_xmlTreeIndentString -#define xmlUCSIsAegeanNumbers vtk_libxml2_xmlUCSIsAegeanNumbers -#define xmlUCSIsAlphabeticPresentationForms vtk_libxml2_xmlUCSIsAlphabeticPresentationForms -#define xmlUCSIsArabic vtk_libxml2_xmlUCSIsArabic -#define xmlUCSIsArabicPresentationFormsA vtk_libxml2_xmlUCSIsArabicPresentationFormsA -#define xmlUCSIsArabicPresentationFormsB vtk_libxml2_xmlUCSIsArabicPresentationFormsB -#define xmlUCSIsArmenian vtk_libxml2_xmlUCSIsArmenian -#define xmlUCSIsArrows vtk_libxml2_xmlUCSIsArrows -#define xmlUCSIsBasicLatin vtk_libxml2_xmlUCSIsBasicLatin -#define xmlUCSIsBengali vtk_libxml2_xmlUCSIsBengali -#define xmlUCSIsBlock vtk_libxml2_xmlUCSIsBlock -#define xmlUCSIsBlockElements vtk_libxml2_xmlUCSIsBlockElements -#define xmlUCSIsBopomofo vtk_libxml2_xmlUCSIsBopomofo -#define xmlUCSIsBopomofoExtended vtk_libxml2_xmlUCSIsBopomofoExtended -#define xmlUCSIsBoxDrawing vtk_libxml2_xmlUCSIsBoxDrawing -#define xmlUCSIsBraillePatterns vtk_libxml2_xmlUCSIsBraillePatterns -#define xmlUCSIsBuhid vtk_libxml2_xmlUCSIsBuhid -#define xmlUCSIsByzantineMusicalSymbols vtk_libxml2_xmlUCSIsByzantineMusicalSymbols -#define xmlUCSIsCJKCompatibility vtk_libxml2_xmlUCSIsCJKCompatibility -#define xmlUCSIsCJKCompatibilityForms vtk_libxml2_xmlUCSIsCJKCompatibilityForms -#define xmlUCSIsCJKCompatibilityIdeographs vtk_libxml2_xmlUCSIsCJKCompatibilityIdeographs -#define xmlUCSIsCJKCompatibilityIdeographsSupplement vtk_libxml2_xmlUCSIsCJKCompatibilityIdeographsSupplement -#define xmlUCSIsCJKRadicalsSupplement vtk_libxml2_xmlUCSIsCJKRadicalsSupplement -#define xmlUCSIsCJKSymbolsandPunctuation vtk_libxml2_xmlUCSIsCJKSymbolsandPunctuation -#define xmlUCSIsCJKUnifiedIdeographs vtk_libxml2_xmlUCSIsCJKUnifiedIdeographs -#define xmlUCSIsCJKUnifiedIdeographsExtensionA vtk_libxml2_xmlUCSIsCJKUnifiedIdeographsExtensionA -#define xmlUCSIsCJKUnifiedIdeographsExtensionB vtk_libxml2_xmlUCSIsCJKUnifiedIdeographsExtensionB -#define xmlUCSIsCat vtk_libxml2_xmlUCSIsCat -#define xmlUCSIsCatC vtk_libxml2_xmlUCSIsCatC -#define xmlUCSIsCatCc vtk_libxml2_xmlUCSIsCatCc -#define xmlUCSIsCatCf vtk_libxml2_xmlUCSIsCatCf -#define xmlUCSIsCatCo vtk_libxml2_xmlUCSIsCatCo -#define xmlUCSIsCatCs vtk_libxml2_xmlUCSIsCatCs -#define xmlUCSIsCatL vtk_libxml2_xmlUCSIsCatL -#define xmlUCSIsCatLl vtk_libxml2_xmlUCSIsCatLl -#define xmlUCSIsCatLm vtk_libxml2_xmlUCSIsCatLm -#define xmlUCSIsCatLo vtk_libxml2_xmlUCSIsCatLo -#define xmlUCSIsCatLt vtk_libxml2_xmlUCSIsCatLt -#define xmlUCSIsCatLu vtk_libxml2_xmlUCSIsCatLu -#define xmlUCSIsCatM vtk_libxml2_xmlUCSIsCatM -#define xmlUCSIsCatMc vtk_libxml2_xmlUCSIsCatMc -#define xmlUCSIsCatMe vtk_libxml2_xmlUCSIsCatMe -#define xmlUCSIsCatMn vtk_libxml2_xmlUCSIsCatMn -#define xmlUCSIsCatN vtk_libxml2_xmlUCSIsCatN -#define xmlUCSIsCatNd vtk_libxml2_xmlUCSIsCatNd -#define xmlUCSIsCatNl vtk_libxml2_xmlUCSIsCatNl -#define xmlUCSIsCatNo vtk_libxml2_xmlUCSIsCatNo -#define xmlUCSIsCatP vtk_libxml2_xmlUCSIsCatP -#define xmlUCSIsCatPc vtk_libxml2_xmlUCSIsCatPc -#define xmlUCSIsCatPd vtk_libxml2_xmlUCSIsCatPd -#define xmlUCSIsCatPe vtk_libxml2_xmlUCSIsCatPe -#define xmlUCSIsCatPf vtk_libxml2_xmlUCSIsCatPf -#define xmlUCSIsCatPi vtk_libxml2_xmlUCSIsCatPi -#define xmlUCSIsCatPo vtk_libxml2_xmlUCSIsCatPo -#define xmlUCSIsCatPs vtk_libxml2_xmlUCSIsCatPs -#define xmlUCSIsCatS vtk_libxml2_xmlUCSIsCatS -#define xmlUCSIsCatSc vtk_libxml2_xmlUCSIsCatSc -#define xmlUCSIsCatSk vtk_libxml2_xmlUCSIsCatSk -#define xmlUCSIsCatSm vtk_libxml2_xmlUCSIsCatSm -#define xmlUCSIsCatSo vtk_libxml2_xmlUCSIsCatSo -#define xmlUCSIsCatZ vtk_libxml2_xmlUCSIsCatZ -#define xmlUCSIsCatZl vtk_libxml2_xmlUCSIsCatZl -#define xmlUCSIsCatZp vtk_libxml2_xmlUCSIsCatZp -#define xmlUCSIsCatZs vtk_libxml2_xmlUCSIsCatZs -#define xmlUCSIsCherokee vtk_libxml2_xmlUCSIsCherokee -#define xmlUCSIsCombiningDiacriticalMarks vtk_libxml2_xmlUCSIsCombiningDiacriticalMarks -#define xmlUCSIsCombiningDiacriticalMarksforSymbols vtk_libxml2_xmlUCSIsCombiningDiacriticalMarksforSymbols -#define xmlUCSIsCombiningHalfMarks vtk_libxml2_xmlUCSIsCombiningHalfMarks -#define xmlUCSIsCombiningMarksforSymbols vtk_libxml2_xmlUCSIsCombiningMarksforSymbols -#define xmlUCSIsControlPictures vtk_libxml2_xmlUCSIsControlPictures -#define xmlUCSIsCurrencySymbols vtk_libxml2_xmlUCSIsCurrencySymbols -#define xmlUCSIsCypriotSyllabary vtk_libxml2_xmlUCSIsCypriotSyllabary -#define xmlUCSIsCyrillic vtk_libxml2_xmlUCSIsCyrillic -#define xmlUCSIsCyrillicSupplement vtk_libxml2_xmlUCSIsCyrillicSupplement -#define xmlUCSIsDeseret vtk_libxml2_xmlUCSIsDeseret -#define xmlUCSIsDevanagari vtk_libxml2_xmlUCSIsDevanagari -#define xmlUCSIsDingbats vtk_libxml2_xmlUCSIsDingbats -#define xmlUCSIsEnclosedAlphanumerics vtk_libxml2_xmlUCSIsEnclosedAlphanumerics -#define xmlUCSIsEnclosedCJKLettersandMonths vtk_libxml2_xmlUCSIsEnclosedCJKLettersandMonths -#define xmlUCSIsEthiopic vtk_libxml2_xmlUCSIsEthiopic -#define xmlUCSIsGeneralPunctuation vtk_libxml2_xmlUCSIsGeneralPunctuation -#define xmlUCSIsGeometricShapes vtk_libxml2_xmlUCSIsGeometricShapes -#define xmlUCSIsGeorgian vtk_libxml2_xmlUCSIsGeorgian -#define xmlUCSIsGothic vtk_libxml2_xmlUCSIsGothic -#define xmlUCSIsGreek vtk_libxml2_xmlUCSIsGreek -#define xmlUCSIsGreekExtended vtk_libxml2_xmlUCSIsGreekExtended -#define xmlUCSIsGreekandCoptic vtk_libxml2_xmlUCSIsGreekandCoptic -#define xmlUCSIsGujarati vtk_libxml2_xmlUCSIsGujarati -#define xmlUCSIsGurmukhi vtk_libxml2_xmlUCSIsGurmukhi -#define xmlUCSIsHalfwidthandFullwidthForms vtk_libxml2_xmlUCSIsHalfwidthandFullwidthForms -#define xmlUCSIsHangulCompatibilityJamo vtk_libxml2_xmlUCSIsHangulCompatibilityJamo -#define xmlUCSIsHangulJamo vtk_libxml2_xmlUCSIsHangulJamo -#define xmlUCSIsHangulSyllables vtk_libxml2_xmlUCSIsHangulSyllables -#define xmlUCSIsHanunoo vtk_libxml2_xmlUCSIsHanunoo -#define xmlUCSIsHebrew vtk_libxml2_xmlUCSIsHebrew -#define xmlUCSIsHighPrivateUseSurrogates vtk_libxml2_xmlUCSIsHighPrivateUseSurrogates -#define xmlUCSIsHighSurrogates vtk_libxml2_xmlUCSIsHighSurrogates -#define xmlUCSIsHiragana vtk_libxml2_xmlUCSIsHiragana -#define xmlUCSIsIPAExtensions vtk_libxml2_xmlUCSIsIPAExtensions -#define xmlUCSIsIdeographicDescriptionCharacters vtk_libxml2_xmlUCSIsIdeographicDescriptionCharacters -#define xmlUCSIsKanbun vtk_libxml2_xmlUCSIsKanbun -#define xmlUCSIsKangxiRadicals vtk_libxml2_xmlUCSIsKangxiRadicals -#define xmlUCSIsKannada vtk_libxml2_xmlUCSIsKannada -#define xmlUCSIsKatakana vtk_libxml2_xmlUCSIsKatakana -#define xmlUCSIsKatakanaPhoneticExtensions vtk_libxml2_xmlUCSIsKatakanaPhoneticExtensions -#define xmlUCSIsKhmer vtk_libxml2_xmlUCSIsKhmer -#define xmlUCSIsKhmerSymbols vtk_libxml2_xmlUCSIsKhmerSymbols -#define xmlUCSIsLao vtk_libxml2_xmlUCSIsLao -#define xmlUCSIsLatin1Supplement vtk_libxml2_xmlUCSIsLatin1Supplement -#define xmlUCSIsLatinExtendedA vtk_libxml2_xmlUCSIsLatinExtendedA -#define xmlUCSIsLatinExtendedAdditional vtk_libxml2_xmlUCSIsLatinExtendedAdditional -#define xmlUCSIsLatinExtendedB vtk_libxml2_xmlUCSIsLatinExtendedB -#define xmlUCSIsLetterlikeSymbols vtk_libxml2_xmlUCSIsLetterlikeSymbols -#define xmlUCSIsLimbu vtk_libxml2_xmlUCSIsLimbu -#define xmlUCSIsLinearBIdeograms vtk_libxml2_xmlUCSIsLinearBIdeograms -#define xmlUCSIsLinearBSyllabary vtk_libxml2_xmlUCSIsLinearBSyllabary -#define xmlUCSIsLowSurrogates vtk_libxml2_xmlUCSIsLowSurrogates -#define xmlUCSIsMalayalam vtk_libxml2_xmlUCSIsMalayalam -#define xmlUCSIsMathematicalAlphanumericSymbols vtk_libxml2_xmlUCSIsMathematicalAlphanumericSymbols -#define xmlUCSIsMathematicalOperators vtk_libxml2_xmlUCSIsMathematicalOperators -#define xmlUCSIsMiscellaneousMathematicalSymbolsA vtk_libxml2_xmlUCSIsMiscellaneousMathematicalSymbolsA -#define xmlUCSIsMiscellaneousMathematicalSymbolsB vtk_libxml2_xmlUCSIsMiscellaneousMathematicalSymbolsB -#define xmlUCSIsMiscellaneousSymbols vtk_libxml2_xmlUCSIsMiscellaneousSymbols -#define xmlUCSIsMiscellaneousSymbolsandArrows vtk_libxml2_xmlUCSIsMiscellaneousSymbolsandArrows -#define xmlUCSIsMiscellaneousTechnical vtk_libxml2_xmlUCSIsMiscellaneousTechnical -#define xmlUCSIsMongolian vtk_libxml2_xmlUCSIsMongolian -#define xmlUCSIsMusicalSymbols vtk_libxml2_xmlUCSIsMusicalSymbols -#define xmlUCSIsMyanmar vtk_libxml2_xmlUCSIsMyanmar -#define xmlUCSIsNumberForms vtk_libxml2_xmlUCSIsNumberForms -#define xmlUCSIsOgham vtk_libxml2_xmlUCSIsOgham -#define xmlUCSIsOldItalic vtk_libxml2_xmlUCSIsOldItalic -#define xmlUCSIsOpticalCharacterRecognition vtk_libxml2_xmlUCSIsOpticalCharacterRecognition -#define xmlUCSIsOriya vtk_libxml2_xmlUCSIsOriya -#define xmlUCSIsOsmanya vtk_libxml2_xmlUCSIsOsmanya -#define xmlUCSIsPhoneticExtensions vtk_libxml2_xmlUCSIsPhoneticExtensions -#define xmlUCSIsPrivateUse vtk_libxml2_xmlUCSIsPrivateUse -#define xmlUCSIsPrivateUseArea vtk_libxml2_xmlUCSIsPrivateUseArea -#define xmlUCSIsRunic vtk_libxml2_xmlUCSIsRunic -#define xmlUCSIsShavian vtk_libxml2_xmlUCSIsShavian -#define xmlUCSIsSinhala vtk_libxml2_xmlUCSIsSinhala -#define xmlUCSIsSmallFormVariants vtk_libxml2_xmlUCSIsSmallFormVariants -#define xmlUCSIsSpacingModifierLetters vtk_libxml2_xmlUCSIsSpacingModifierLetters -#define xmlUCSIsSpecials vtk_libxml2_xmlUCSIsSpecials -#define xmlUCSIsSuperscriptsandSubscripts vtk_libxml2_xmlUCSIsSuperscriptsandSubscripts -#define xmlUCSIsSupplementalArrowsA vtk_libxml2_xmlUCSIsSupplementalArrowsA -#define xmlUCSIsSupplementalArrowsB vtk_libxml2_xmlUCSIsSupplementalArrowsB -#define xmlUCSIsSupplementalMathematicalOperators vtk_libxml2_xmlUCSIsSupplementalMathematicalOperators -#define xmlUCSIsSupplementaryPrivateUseAreaA vtk_libxml2_xmlUCSIsSupplementaryPrivateUseAreaA -#define xmlUCSIsSupplementaryPrivateUseAreaB vtk_libxml2_xmlUCSIsSupplementaryPrivateUseAreaB -#define xmlUCSIsSyriac vtk_libxml2_xmlUCSIsSyriac -#define xmlUCSIsTagalog vtk_libxml2_xmlUCSIsTagalog -#define xmlUCSIsTagbanwa vtk_libxml2_xmlUCSIsTagbanwa -#define xmlUCSIsTags vtk_libxml2_xmlUCSIsTags -#define xmlUCSIsTaiLe vtk_libxml2_xmlUCSIsTaiLe -#define xmlUCSIsTaiXuanJingSymbols vtk_libxml2_xmlUCSIsTaiXuanJingSymbols -#define xmlUCSIsTamil vtk_libxml2_xmlUCSIsTamil -#define xmlUCSIsTelugu vtk_libxml2_xmlUCSIsTelugu -#define xmlUCSIsThaana vtk_libxml2_xmlUCSIsThaana -#define xmlUCSIsThai vtk_libxml2_xmlUCSIsThai -#define xmlUCSIsTibetan vtk_libxml2_xmlUCSIsTibetan -#define xmlUCSIsUgaritic vtk_libxml2_xmlUCSIsUgaritic -#define xmlUCSIsUnifiedCanadianAboriginalSyllabics vtk_libxml2_xmlUCSIsUnifiedCanadianAboriginalSyllabics -#define xmlUCSIsVariationSelectors vtk_libxml2_xmlUCSIsVariationSelectors -#define xmlUCSIsVariationSelectorsSupplement vtk_libxml2_xmlUCSIsVariationSelectorsSupplement -#define xmlUCSIsYiRadicals vtk_libxml2_xmlUCSIsYiRadicals -#define xmlUCSIsYiSyllables vtk_libxml2_xmlUCSIsYiSyllables -#define xmlUCSIsYijingHexagramSymbols vtk_libxml2_xmlUCSIsYijingHexagramSymbols -#define xmlURIEscape vtk_libxml2_xmlURIEscape -#define xmlURIEscapeStr vtk_libxml2_xmlURIEscapeStr -#define xmlURIUnescapeString vtk_libxml2_xmlURIUnescapeString -#define xmlUTF8Charcmp vtk_libxml2_xmlUTF8Charcmp -#define xmlUTF8Size vtk_libxml2_xmlUTF8Size -#define xmlUTF8Strlen vtk_libxml2_xmlUTF8Strlen -#define xmlUTF8Strloc vtk_libxml2_xmlUTF8Strloc -#define xmlUTF8Strndup vtk_libxml2_xmlUTF8Strndup -#define xmlUTF8Strpos vtk_libxml2_xmlUTF8Strpos -#define xmlUTF8Strsize vtk_libxml2_xmlUTF8Strsize -#define xmlUTF8Strsub vtk_libxml2_xmlUTF8Strsub -#define xmlUnlinkNode vtk_libxml2_xmlUnlinkNode -#define xmlUnlockLibrary vtk_libxml2_xmlUnlockLibrary -#define xmlUnsetNsProp vtk_libxml2_xmlUnsetNsProp -#define xmlUnsetProp vtk_libxml2_xmlUnsetProp -#define xmlUpgradeOldNs vtk_libxml2_xmlUpgradeOldNs -#define xmlValidBuildContentModel vtk_libxml2_xmlValidBuildContentModel -#define xmlValidCtxtNormalizeAttributeValue vtk_libxml2_xmlValidCtxtNormalizeAttributeValue -#define xmlValidGetPotentialChildren vtk_libxml2_xmlValidGetPotentialChildren -#define xmlValidGetValidElements vtk_libxml2_xmlValidGetValidElements -#define xmlValidNormalizeAttributeValue vtk_libxml2_xmlValidNormalizeAttributeValue -#define xmlValidateAttributeDecl vtk_libxml2_xmlValidateAttributeDecl -#define xmlValidateAttributeValue vtk_libxml2_xmlValidateAttributeValue -#define xmlValidateDocument vtk_libxml2_xmlValidateDocument -#define xmlValidateDocumentFinal vtk_libxml2_xmlValidateDocumentFinal -#define xmlValidateDtd vtk_libxml2_xmlValidateDtd -#define xmlValidateDtdFinal vtk_libxml2_xmlValidateDtdFinal -#define xmlValidateElement vtk_libxml2_xmlValidateElement -#define xmlValidateElementDecl vtk_libxml2_xmlValidateElementDecl -#define xmlValidateNCName vtk_libxml2_xmlValidateNCName -#define xmlValidateNMToken vtk_libxml2_xmlValidateNMToken -#define xmlValidateName vtk_libxml2_xmlValidateName -#define xmlValidateNameValue vtk_libxml2_xmlValidateNameValue -#define xmlValidateNamesValue vtk_libxml2_xmlValidateNamesValue -#define xmlValidateNmtokenValue vtk_libxml2_xmlValidateNmtokenValue -#define xmlValidateNmtokensValue vtk_libxml2_xmlValidateNmtokensValue -#define xmlValidateNotationDecl vtk_libxml2_xmlValidateNotationDecl -#define xmlValidateNotationUse vtk_libxml2_xmlValidateNotationUse -#define xmlValidateOneAttribute vtk_libxml2_xmlValidateOneAttribute -#define xmlValidateOneElement vtk_libxml2_xmlValidateOneElement -#define xmlValidateOneNamespace vtk_libxml2_xmlValidateOneNamespace -#define xmlValidatePopElement vtk_libxml2_xmlValidatePopElement -#define xmlValidatePushCData vtk_libxml2_xmlValidatePushCData -#define xmlValidatePushElement vtk_libxml2_xmlValidatePushElement -#define xmlValidateQName vtk_libxml2_xmlValidateQName -#define xmlValidateRoot vtk_libxml2_xmlValidateRoot -#define xmlXIncludeFreeContext vtk_libxml2_xmlXIncludeFreeContext -#define xmlXIncludeNewContext vtk_libxml2_xmlXIncludeNewContext -#define xmlXIncludeProcess vtk_libxml2_xmlXIncludeProcess -#define xmlXIncludeProcessFlags vtk_libxml2_xmlXIncludeProcessFlags -#define xmlXIncludeProcessFlagsData vtk_libxml2_xmlXIncludeProcessFlagsData -#define xmlXIncludeProcessNode vtk_libxml2_xmlXIncludeProcessNode -#define xmlXIncludeProcessTree vtk_libxml2_xmlXIncludeProcessTree -#define xmlXIncludeProcessTreeFlags vtk_libxml2_xmlXIncludeProcessTreeFlags -#define xmlXIncludeSetFlags vtk_libxml2_xmlXIncludeSetFlags -#define xmlXPathAddValues vtk_libxml2_xmlXPathAddValues -#define xmlXPathBooleanFunction vtk_libxml2_xmlXPathBooleanFunction -#define xmlXPathCastBooleanToNumber vtk_libxml2_xmlXPathCastBooleanToNumber -#define xmlXPathCastBooleanToString vtk_libxml2_xmlXPathCastBooleanToString -#define xmlXPathCastNodeSetToBoolean vtk_libxml2_xmlXPathCastNodeSetToBoolean -#define xmlXPathCastNodeSetToNumber vtk_libxml2_xmlXPathCastNodeSetToNumber -#define xmlXPathCastNodeSetToString vtk_libxml2_xmlXPathCastNodeSetToString -#define xmlXPathCastNodeToNumber vtk_libxml2_xmlXPathCastNodeToNumber -#define xmlXPathCastNodeToString vtk_libxml2_xmlXPathCastNodeToString -#define xmlXPathCastNumberToBoolean vtk_libxml2_xmlXPathCastNumberToBoolean -#define xmlXPathCastNumberToString vtk_libxml2_xmlXPathCastNumberToString -#define xmlXPathCastStringToBoolean vtk_libxml2_xmlXPathCastStringToBoolean -#define xmlXPathCastStringToNumber vtk_libxml2_xmlXPathCastStringToNumber -#define xmlXPathCastToBoolean vtk_libxml2_xmlXPathCastToBoolean -#define xmlXPathCastToNumber vtk_libxml2_xmlXPathCastToNumber -#define xmlXPathCastToString vtk_libxml2_xmlXPathCastToString -#define xmlXPathCeilingFunction vtk_libxml2_xmlXPathCeilingFunction -#define xmlXPathCmpNodes vtk_libxml2_xmlXPathCmpNodes -#define xmlXPathCompareValues vtk_libxml2_xmlXPathCompareValues -#define xmlXPathCompile vtk_libxml2_xmlXPathCompile -#define xmlXPathCompiledEval vtk_libxml2_xmlXPathCompiledEval -#define xmlXPathCompiledEvalToBoolean vtk_libxml2_xmlXPathCompiledEvalToBoolean -#define xmlXPathConcatFunction vtk_libxml2_xmlXPathConcatFunction -#define xmlXPathContainsFunction vtk_libxml2_xmlXPathContainsFunction -#define xmlXPathContextSetCache vtk_libxml2_xmlXPathContextSetCache -#define xmlXPathConvertBoolean vtk_libxml2_xmlXPathConvertBoolean -#define xmlXPathConvertNumber vtk_libxml2_xmlXPathConvertNumber -#define xmlXPathConvertString vtk_libxml2_xmlXPathConvertString -#define xmlXPathCountFunction vtk_libxml2_xmlXPathCountFunction -#define xmlXPathCtxtCompile vtk_libxml2_xmlXPathCtxtCompile -#define xmlXPathDifference vtk_libxml2_xmlXPathDifference -#define xmlXPathDistinct vtk_libxml2_xmlXPathDistinct -#define xmlXPathDistinctSorted vtk_libxml2_xmlXPathDistinctSorted -#define xmlXPathDivValues vtk_libxml2_xmlXPathDivValues -#define xmlXPathEqualValues vtk_libxml2_xmlXPathEqualValues -#define xmlXPathErr vtk_libxml2_xmlXPathErr -#define xmlXPathEval vtk_libxml2_xmlXPathEval -#define xmlXPathEvalExpr vtk_libxml2_xmlXPathEvalExpr -#define xmlXPathEvalExpression vtk_libxml2_xmlXPathEvalExpression -#define xmlXPathEvalPredicate vtk_libxml2_xmlXPathEvalPredicate -#define xmlXPathEvaluatePredicateResult vtk_libxml2_xmlXPathEvaluatePredicateResult -#define xmlXPathFalseFunction vtk_libxml2_xmlXPathFalseFunction -#define xmlXPathFloorFunction vtk_libxml2_xmlXPathFloorFunction -#define xmlXPathFreeCompExpr vtk_libxml2_xmlXPathFreeCompExpr -#define xmlXPathFreeContext vtk_libxml2_xmlXPathFreeContext -#define xmlXPathFreeNodeSet vtk_libxml2_xmlXPathFreeNodeSet -#define xmlXPathFreeNodeSetList vtk_libxml2_xmlXPathFreeNodeSetList -#define xmlXPathFreeObject vtk_libxml2_xmlXPathFreeObject -#define xmlXPathFreeParserContext vtk_libxml2_xmlXPathFreeParserContext -#define xmlXPathFunctionLookup vtk_libxml2_xmlXPathFunctionLookup -#define xmlXPathFunctionLookupNS vtk_libxml2_xmlXPathFunctionLookupNS -#define xmlXPathHasSameNodes vtk_libxml2_xmlXPathHasSameNodes -#define xmlXPathIdFunction vtk_libxml2_xmlXPathIdFunction -#define xmlXPathInit vtk_libxml2_xmlXPathInit -#define xmlXPathIntersection vtk_libxml2_xmlXPathIntersection -#define xmlXPathIsInf vtk_libxml2_xmlXPathIsInf -#define xmlXPathIsNaN vtk_libxml2_xmlXPathIsNaN -#define xmlXPathIsNodeType vtk_libxml2_xmlXPathIsNodeType -#define xmlXPathLangFunction vtk_libxml2_xmlXPathLangFunction -#define xmlXPathLastFunction vtk_libxml2_xmlXPathLastFunction -#define xmlXPathLeading vtk_libxml2_xmlXPathLeading -#define xmlXPathLeadingSorted vtk_libxml2_xmlXPathLeadingSorted -#define xmlXPathLocalNameFunction vtk_libxml2_xmlXPathLocalNameFunction -#define xmlXPathModValues vtk_libxml2_xmlXPathModValues -#define xmlXPathMultValues vtk_libxml2_xmlXPathMultValues -#define xmlXPathNAN vtk_libxml2_xmlXPathNAN -#define xmlXPathNINF vtk_libxml2_xmlXPathNINF -#define xmlXPathNamespaceURIFunction vtk_libxml2_xmlXPathNamespaceURIFunction -#define xmlXPathNewBoolean vtk_libxml2_xmlXPathNewBoolean -#define xmlXPathNewCString vtk_libxml2_xmlXPathNewCString -#define xmlXPathNewContext vtk_libxml2_xmlXPathNewContext -#define xmlXPathNewFloat vtk_libxml2_xmlXPathNewFloat -#define xmlXPathNewNodeSet vtk_libxml2_xmlXPathNewNodeSet -#define xmlXPathNewNodeSetList vtk_libxml2_xmlXPathNewNodeSetList -#define xmlXPathNewParserContext vtk_libxml2_xmlXPathNewParserContext -#define xmlXPathNewString vtk_libxml2_xmlXPathNewString -#define xmlXPathNewValueTree vtk_libxml2_xmlXPathNewValueTree -#define xmlXPathNextAncestor vtk_libxml2_xmlXPathNextAncestor -#define xmlXPathNextAncestorOrSelf vtk_libxml2_xmlXPathNextAncestorOrSelf -#define xmlXPathNextAttribute vtk_libxml2_xmlXPathNextAttribute -#define xmlXPathNextChild vtk_libxml2_xmlXPathNextChild -#define xmlXPathNextDescendant vtk_libxml2_xmlXPathNextDescendant -#define xmlXPathNextDescendantOrSelf vtk_libxml2_xmlXPathNextDescendantOrSelf -#define xmlXPathNextFollowing vtk_libxml2_xmlXPathNextFollowing -#define xmlXPathNextFollowingSibling vtk_libxml2_xmlXPathNextFollowingSibling -#define xmlXPathNextNamespace vtk_libxml2_xmlXPathNextNamespace -#define xmlXPathNextParent vtk_libxml2_xmlXPathNextParent -#define xmlXPathNextPreceding vtk_libxml2_xmlXPathNextPreceding -#define xmlXPathNextPrecedingSibling vtk_libxml2_xmlXPathNextPrecedingSibling -#define xmlXPathNextSelf vtk_libxml2_xmlXPathNextSelf -#define xmlXPathNodeLeading vtk_libxml2_xmlXPathNodeLeading -#define xmlXPathNodeLeadingSorted vtk_libxml2_xmlXPathNodeLeadingSorted -#define xmlXPathNodeSetAdd vtk_libxml2_xmlXPathNodeSetAdd -#define xmlXPathNodeSetAddNs vtk_libxml2_xmlXPathNodeSetAddNs -#define xmlXPathNodeSetAddUnique vtk_libxml2_xmlXPathNodeSetAddUnique -#define xmlXPathNodeSetContains vtk_libxml2_xmlXPathNodeSetContains -#define xmlXPathNodeSetCreate vtk_libxml2_xmlXPathNodeSetCreate -#define xmlXPathNodeSetDel vtk_libxml2_xmlXPathNodeSetDel -#define xmlXPathNodeSetFreeNs vtk_libxml2_xmlXPathNodeSetFreeNs -#define xmlXPathNodeSetMerge vtk_libxml2_xmlXPathNodeSetMerge -#define xmlXPathNodeSetRemove vtk_libxml2_xmlXPathNodeSetRemove -#define xmlXPathNodeSetSort vtk_libxml2_xmlXPathNodeSetSort -#define xmlXPathNodeTrailing vtk_libxml2_xmlXPathNodeTrailing -#define xmlXPathNodeTrailingSorted vtk_libxml2_xmlXPathNodeTrailingSorted -#define xmlXPathNormalizeFunction vtk_libxml2_xmlXPathNormalizeFunction -#define xmlXPathNotEqualValues vtk_libxml2_xmlXPathNotEqualValues -#define xmlXPathNotFunction vtk_libxml2_xmlXPathNotFunction -#define xmlXPathNsLookup vtk_libxml2_xmlXPathNsLookup -#define xmlXPathNumberFunction vtk_libxml2_xmlXPathNumberFunction -#define xmlXPathObjectCopy vtk_libxml2_xmlXPathObjectCopy -#define xmlXPathOrderDocElems vtk_libxml2_xmlXPathOrderDocElems -#define xmlXPathPINF vtk_libxml2_xmlXPathPINF -#define xmlXPathParseNCName vtk_libxml2_xmlXPathParseNCName -#define xmlXPathParseName vtk_libxml2_xmlXPathParseName -#define xmlXPathPopBoolean vtk_libxml2_xmlXPathPopBoolean -#define xmlXPathPopExternal vtk_libxml2_xmlXPathPopExternal -#define xmlXPathPopNodeSet vtk_libxml2_xmlXPathPopNodeSet -#define xmlXPathPopNumber vtk_libxml2_xmlXPathPopNumber -#define xmlXPathPopString vtk_libxml2_xmlXPathPopString -#define xmlXPathPositionFunction vtk_libxml2_xmlXPathPositionFunction -#define xmlXPathRegisterAllFunctions vtk_libxml2_xmlXPathRegisterAllFunctions -#define xmlXPathRegisterFunc vtk_libxml2_xmlXPathRegisterFunc -#define xmlXPathRegisterFuncLookup vtk_libxml2_xmlXPathRegisterFuncLookup -#define xmlXPathRegisterFuncNS vtk_libxml2_xmlXPathRegisterFuncNS -#define xmlXPathRegisterNs vtk_libxml2_xmlXPathRegisterNs -#define xmlXPathRegisterVariable vtk_libxml2_xmlXPathRegisterVariable -#define xmlXPathRegisterVariableLookup vtk_libxml2_xmlXPathRegisterVariableLookup -#define xmlXPathRegisterVariableNS vtk_libxml2_xmlXPathRegisterVariableNS -#define xmlXPathRegisteredFuncsCleanup vtk_libxml2_xmlXPathRegisteredFuncsCleanup -#define xmlXPathRegisteredNsCleanup vtk_libxml2_xmlXPathRegisteredNsCleanup -#define xmlXPathRegisteredVariablesCleanup vtk_libxml2_xmlXPathRegisteredVariablesCleanup -#define xmlXPathRoot vtk_libxml2_xmlXPathRoot -#define xmlXPathRoundFunction vtk_libxml2_xmlXPathRoundFunction -#define xmlXPathStartsWithFunction vtk_libxml2_xmlXPathStartsWithFunction -#define xmlXPathStringEvalNumber vtk_libxml2_xmlXPathStringEvalNumber -#define xmlXPathStringFunction vtk_libxml2_xmlXPathStringFunction -#define xmlXPathStringLengthFunction vtk_libxml2_xmlXPathStringLengthFunction -#define xmlXPathSubValues vtk_libxml2_xmlXPathSubValues -#define xmlXPathSubstringAfterFunction vtk_libxml2_xmlXPathSubstringAfterFunction -#define xmlXPathSubstringBeforeFunction vtk_libxml2_xmlXPathSubstringBeforeFunction -#define xmlXPathSubstringFunction vtk_libxml2_xmlXPathSubstringFunction -#define xmlXPathSumFunction vtk_libxml2_xmlXPathSumFunction -#define xmlXPathTrailing vtk_libxml2_xmlXPathTrailing -#define xmlXPathTrailingSorted vtk_libxml2_xmlXPathTrailingSorted -#define xmlXPathTranslateFunction vtk_libxml2_xmlXPathTranslateFunction -#define xmlXPathTrueFunction vtk_libxml2_xmlXPathTrueFunction -#define xmlXPathValueFlipSign vtk_libxml2_xmlXPathValueFlipSign -#define xmlXPathVariableLookup vtk_libxml2_xmlXPathVariableLookup -#define xmlXPathVariableLookupNS vtk_libxml2_xmlXPathVariableLookupNS -#define xmlXPathWrapCString vtk_libxml2_xmlXPathWrapCString -#define xmlXPathWrapExternal vtk_libxml2_xmlXPathWrapExternal -#define xmlXPathWrapNodeSet vtk_libxml2_xmlXPathWrapNodeSet -#define xmlXPathWrapString vtk_libxml2_xmlXPathWrapString -#define xmlXPatherror vtk_libxml2_xmlXPatherror -#define xmlXPtrAdvanceNode vtk_libxml2_xmlXPtrAdvanceNode -#define xmlXPtrBuildNodeList vtk_libxml2_xmlXPtrBuildNodeList -#define xmlXPtrEndPointFunction vtk_libxml2_xmlXPtrEndPointFunction -#define xmlXPtrEval vtk_libxml2_xmlXPtrEval -#define xmlXPtrEvalRangePredicate vtk_libxml2_xmlXPtrEvalRangePredicate -#define xmlXPtrFreeLocationSet vtk_libxml2_xmlXPtrFreeLocationSet -#define xmlXPtrHereFunction vtk_libxml2_xmlXPtrHereFunction -#define xmlXPtrLocationSetAdd vtk_libxml2_xmlXPtrLocationSetAdd -#define xmlXPtrLocationSetCreate vtk_libxml2_xmlXPtrLocationSetCreate -#define xmlXPtrLocationSetDel vtk_libxml2_xmlXPtrLocationSetDel -#define xmlXPtrLocationSetMerge vtk_libxml2_xmlXPtrLocationSetMerge -#define xmlXPtrLocationSetRemove vtk_libxml2_xmlXPtrLocationSetRemove -#define xmlXPtrNewCollapsedRange vtk_libxml2_xmlXPtrNewCollapsedRange -#define xmlXPtrNewContext vtk_libxml2_xmlXPtrNewContext -#define xmlXPtrNewLocationSetNodeSet vtk_libxml2_xmlXPtrNewLocationSetNodeSet -#define xmlXPtrNewLocationSetNodes vtk_libxml2_xmlXPtrNewLocationSetNodes -#define xmlXPtrNewRange vtk_libxml2_xmlXPtrNewRange -#define xmlXPtrNewRangeNodeObject vtk_libxml2_xmlXPtrNewRangeNodeObject -#define xmlXPtrNewRangeNodePoint vtk_libxml2_xmlXPtrNewRangeNodePoint -#define xmlXPtrNewRangeNodes vtk_libxml2_xmlXPtrNewRangeNodes -#define xmlXPtrNewRangePointNode vtk_libxml2_xmlXPtrNewRangePointNode -#define xmlXPtrNewRangePoints vtk_libxml2_xmlXPtrNewRangePoints -#define xmlXPtrOriginFunction vtk_libxml2_xmlXPtrOriginFunction -#define xmlXPtrRangeFunction vtk_libxml2_xmlXPtrRangeFunction -#define xmlXPtrRangeInsideFunction vtk_libxml2_xmlXPtrRangeInsideFunction -#define xmlXPtrRangeToFunction vtk_libxml2_xmlXPtrRangeToFunction -#define xmlXPtrStartPointFunction vtk_libxml2_xmlXPtrStartPointFunction -#define xmlXPtrStringRangeFunction vtk_libxml2_xmlXPtrStringRangeFunction -#define xmlXPtrWrapLocationSet vtk_libxml2_xmlXPtrWrapLocationSet - -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xinclude.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xinclude.h deleted file mode 100644 index 81b6e4d360f..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xinclude.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Summary: implementation of XInclude - * Description: API to handle XInclude processing, - * implements the - * World Wide Web Consortium Last Call Working Draft 10 November 2003 - * http://www.w3.org/TR/2003/WD-xinclude-20031110 - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_XINCLUDE_H__ -#define __XML_XINCLUDE_H__ - -#include "xmlversion.h" -#include "tree.h" - -#ifdef LIBXML_XINCLUDE_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * XINCLUDE_NS: - * - * Macro defining the Xinclude namespace: http://www.w3.org/2003/XInclude - */ -#define XINCLUDE_NS (const xmlChar *) "http://www.w3.org/2003/XInclude" -/** - * XINCLUDE_OLD_NS: - * - * Macro defining the draft Xinclude namespace: http://www.w3.org/2001/XInclude - */ -#define XINCLUDE_OLD_NS (const xmlChar *) "http://www.w3.org/2001/XInclude" -/** - * XINCLUDE_NODE: - * - * Macro defining "include" - */ -#define XINCLUDE_NODE (const xmlChar *) "include" -/** - * XINCLUDE_FALLBACK: - * - * Macro defining "fallback" - */ -#define XINCLUDE_FALLBACK (const xmlChar *) "fallback" -/** - * XINCLUDE_HREF: - * - * Macro defining "href" - */ -#define XINCLUDE_HREF (const xmlChar *) "href" -/** - * XINCLUDE_PARSE: - * - * Macro defining "parse" - */ -#define XINCLUDE_PARSE (const xmlChar *) "parse" -/** - * XINCLUDE_PARSE_XML: - * - * Macro defining "xml" - */ -#define XINCLUDE_PARSE_XML (const xmlChar *) "xml" -/** - * XINCLUDE_PARSE_TEXT: - * - * Macro defining "text" - */ -#define XINCLUDE_PARSE_TEXT (const xmlChar *) "text" -/** - * XINCLUDE_PARSE_ENCODING: - * - * Macro defining "encoding" - */ -#define XINCLUDE_PARSE_ENCODING (const xmlChar *) "encoding" -/** - * XINCLUDE_PARSE_XPOINTER: - * - * Macro defining "xpointer" - */ -#define XINCLUDE_PARSE_XPOINTER (const xmlChar *) "xpointer" - -typedef struct _xmlXIncludeCtxt xmlXIncludeCtxt; -typedef xmlXIncludeCtxt *xmlXIncludeCtxtPtr; - -/* - * standalone processing - */ -XMLPUBFUN int XMLCALL - xmlXIncludeProcess (xmlDocPtr doc); -XMLPUBFUN int XMLCALL - xmlXIncludeProcessFlags (xmlDocPtr doc, - int flags); -XMLPUBFUN int XMLCALL - xmlXIncludeProcessFlagsData(xmlDocPtr doc, - int flags, - void *data); -XMLPUBFUN int XMLCALL - xmlXIncludeProcessTree (xmlNodePtr tree); -XMLPUBFUN int XMLCALL - xmlXIncludeProcessTreeFlags(xmlNodePtr tree, - int flags); -/* - * contextual processing - */ -XMLPUBFUN xmlXIncludeCtxtPtr XMLCALL - xmlXIncludeNewContext (xmlDocPtr doc); -XMLPUBFUN int XMLCALL - xmlXIncludeSetFlags (xmlXIncludeCtxtPtr ctxt, - int flags); -XMLPUBFUN void XMLCALL - xmlXIncludeFreeContext (xmlXIncludeCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlXIncludeProcessNode (xmlXIncludeCtxtPtr ctxt, - xmlNodePtr tree); -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_XINCLUDE_ENABLED */ - -#endif /* __XML_XINCLUDE_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xlink.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xlink.h deleted file mode 100644 index bb6cea3f858..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xlink.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Summary: unfinished XLink detection module - * Description: unfinished XLink detection module - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_XLINK_H__ -#define __XML_XLINK_H__ - -#include "xmlversion.h" -#include "tree.h" - -#ifdef LIBXML_XPTR_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Various defines for the various Link properties. - * - * NOTE: the link detection layer will try to resolve QName expansion - * of namespaces. If "foo" is the prefix for "http://foo.com/" - * then the link detection layer will expand role="foo:myrole" - * to "http://foo.com/:myrole". - * NOTE: the link detection layer will expand URI-Refences found on - * href attributes by using the base mechanism if found. - */ -typedef xmlChar *xlinkHRef; -typedef xmlChar *xlinkRole; -typedef xmlChar *xlinkTitle; - -typedef enum { - XLINK_TYPE_NONE = 0, - XLINK_TYPE_SIMPLE, - XLINK_TYPE_EXTENDED, - XLINK_TYPE_EXTENDED_SET -} xlinkType; - -typedef enum { - XLINK_SHOW_NONE = 0, - XLINK_SHOW_NEW, - XLINK_SHOW_EMBED, - XLINK_SHOW_REPLACE -} xlinkShow; - -typedef enum { - XLINK_ACTUATE_NONE = 0, - XLINK_ACTUATE_AUTO, - XLINK_ACTUATE_ONREQUEST -} xlinkActuate; - -/** - * xlinkNodeDetectFunc: - * @ctx: user data pointer - * @node: the node to check - * - * This is the prototype for the link detection routine. - * It calls the default link detection callbacks upon link detection. - */ -typedef void (*xlinkNodeDetectFunc) (void *ctx, xmlNodePtr node); - -/* - * The link detection module interact with the upper layers using - * a set of callback registered at parsing time. - */ - -/** - * xlinkSimpleLinkFunk: - * @ctx: user data pointer - * @node: the node carrying the link - * @href: the target of the link - * @role: the role string - * @title: the link title - * - * This is the prototype for a simple link detection callback. - */ -typedef void -(*xlinkSimpleLinkFunk) (void *ctx, - xmlNodePtr node, - const xlinkHRef href, - const xlinkRole role, - const xlinkTitle title); - -/** - * xlinkExtendedLinkFunk: - * @ctx: user data pointer - * @node: the node carrying the link - * @nbLocators: the number of locators detected on the link - * @hrefs: pointer to the array of locator hrefs - * @roles: pointer to the array of locator roles - * @nbArcs: the number of arcs detected on the link - * @from: pointer to the array of source roles found on the arcs - * @to: pointer to the array of target roles found on the arcs - * @show: array of values for the show attributes found on the arcs - * @actuate: array of values for the actuate attributes found on the arcs - * @nbTitles: the number of titles detected on the link - * @title: array of titles detected on the link - * @langs: array of xml:lang values for the titles - * - * This is the prototype for a extended link detection callback. - */ -typedef void -(*xlinkExtendedLinkFunk)(void *ctx, - xmlNodePtr node, - int nbLocators, - const xlinkHRef *hrefs, - const xlinkRole *roles, - int nbArcs, - const xlinkRole *from, - const xlinkRole *to, - xlinkShow *show, - xlinkActuate *actuate, - int nbTitles, - const xlinkTitle *titles, - const xmlChar **langs); - -/** - * xlinkExtendedLinkSetFunk: - * @ctx: user data pointer - * @node: the node carrying the link - * @nbLocators: the number of locators detected on the link - * @hrefs: pointer to the array of locator hrefs - * @roles: pointer to the array of locator roles - * @nbTitles: the number of titles detected on the link - * @title: array of titles detected on the link - * @langs: array of xml:lang values for the titles - * - * This is the prototype for a extended link set detection callback. - */ -typedef void -(*xlinkExtendedLinkSetFunk) (void *ctx, - xmlNodePtr node, - int nbLocators, - const xlinkHRef *hrefs, - const xlinkRole *roles, - int nbTitles, - const xlinkTitle *titles, - const xmlChar **langs); - -/** - * This is the structure containing a set of Links detection callbacks. - * - * There is no default xlink callbacks, if one want to get link - * recognition activated, those call backs must be provided before parsing. - */ -typedef struct _xlinkHandler xlinkHandler; -typedef xlinkHandler *xlinkHandlerPtr; -struct _xlinkHandler { - xlinkSimpleLinkFunk simple; - xlinkExtendedLinkFunk extended; - xlinkExtendedLinkSetFunk set; -}; - -/* - * The default detection routine, can be overridden, they call the default - * detection callbacks. - */ - -XMLPUBFUN xlinkNodeDetectFunc XMLCALL - xlinkGetDefaultDetect (void); -XMLPUBFUN void XMLCALL - xlinkSetDefaultDetect (xlinkNodeDetectFunc func); - -/* - * Routines to set/get the default handlers. - */ -XMLPUBFUN xlinkHandlerPtr XMLCALL - xlinkGetDefaultHandler (void); -XMLPUBFUN void XMLCALL - xlinkSetDefaultHandler (xlinkHandlerPtr handler); - -/* - * Link detection module itself. - */ -XMLPUBFUN xlinkType XMLCALL - xlinkIsLink (xmlDocPtr doc, - xmlNodePtr node); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_XPTR_ENABLED */ - -#endif /* __XML_XLINK_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlIO.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlIO.h deleted file mode 100644 index f46a5f38cc5..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlIO.h +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Summary: interface for the I/O interfaces used by the parser - * Description: interface for the I/O interfaces used by the parser - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_IO_H__ -#define __XML_IO_H__ - -#include <stdio.h> -#include "xmlversion.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Those are the functions and datatypes for the parser input - * I/O structures. - */ - -/** - * xmlInputMatchCallback: - * @filename: the filename or URI - * - * Callback used in the I/O Input API to detect if the current handler - * can provide input fonctionnalities for this resource. - * - * Returns 1 if yes and 0 if another Input module should be used - */ -typedef int (XMLCALL *xmlInputMatchCallback) (char const *filename); -/** - * xmlInputOpenCallback: - * @filename: the filename or URI - * - * Callback used in the I/O Input API to open the resource - * - * Returns an Input context or NULL in case or error - */ -typedef void * (XMLCALL *xmlInputOpenCallback) (char const *filename); -/** - * xmlInputReadCallback: - * @context: an Input context - * @buffer: the buffer to store data read - * @len: the length of the buffer in bytes - * - * Callback used in the I/O Input API to read the resource - * - * Returns the number of bytes read or -1 in case of error - */ -typedef int (XMLCALL *xmlInputReadCallback) (void * context, char * buffer, int len); -/** - * xmlInputCloseCallback: - * @context: an Input context - * - * Callback used in the I/O Input API to close the resource - * - * Returns 0 or -1 in case of error - */ -typedef int (XMLCALL *xmlInputCloseCallback) (void * context); - -#ifdef LIBXML_OUTPUT_ENABLED -/* - * Those are the functions and datatypes for the library output - * I/O structures. - */ - -/** - * xmlOutputMatchCallback: - * @filename: the filename or URI - * - * Callback used in the I/O Output API to detect if the current handler - * can provide output fonctionnalities for this resource. - * - * Returns 1 if yes and 0 if another Output module should be used - */ -typedef int (XMLCALL *xmlOutputMatchCallback) (char const *filename); -/** - * xmlOutputOpenCallback: - * @filename: the filename or URI - * - * Callback used in the I/O Output API to open the resource - * - * Returns an Output context or NULL in case or error - */ -typedef void * (XMLCALL *xmlOutputOpenCallback) (char const *filename); -/** - * xmlOutputWriteCallback: - * @context: an Output context - * @buffer: the buffer of data to write - * @len: the length of the buffer in bytes - * - * Callback used in the I/O Output API to write to the resource - * - * Returns the number of bytes written or -1 in case of error - */ -typedef int (XMLCALL *xmlOutputWriteCallback) (void * context, const char * buffer, - int len); -/** - * xmlOutputCloseCallback: - * @context: an Output context - * - * Callback used in the I/O Output API to close the resource - * - * Returns 0 or -1 in case of error - */ -typedef int (XMLCALL *xmlOutputCloseCallback) (void * context); -#endif /* LIBXML_OUTPUT_ENABLED */ - -#ifdef __cplusplus -} -#endif - -#include "globals.h" -#include "tree.h" -#include "parser.h" -#include "encoding.h" - -#ifdef __cplusplus -extern "C" { -#endif -struct _xmlParserInputBuffer { - void* context; - xmlInputReadCallback readcallback; - xmlInputCloseCallback closecallback; - - xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */ - - xmlBufferPtr buffer; /* Local buffer encoded in UTF-8 */ - xmlBufferPtr raw; /* if encoder != NULL buffer for raw input */ - int compressed; /* -1=unknown, 0=not compressed, 1=compressed */ - int error; - unsigned long rawconsumed;/* amount consumed from raw */ -}; - - -#ifdef LIBXML_OUTPUT_ENABLED -struct _xmlOutputBuffer { - void* context; - xmlOutputWriteCallback writecallback; - xmlOutputCloseCallback closecallback; - - xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */ - - xmlBufferPtr buffer; /* Local buffer encoded in UTF-8 or ISOLatin */ - xmlBufferPtr conv; /* if encoder != NULL buffer for output */ - int written; /* total number of byte written */ - int error; -}; -#endif /* LIBXML_OUTPUT_ENABLED */ - -/* - * Interfaces for input - */ -XMLPUBFUN void XMLCALL - xmlCleanupInputCallbacks (void); - -XMLPUBFUN int XMLCALL - xmlPopInputCallbacks (void); - -XMLPUBFUN void XMLCALL - xmlRegisterDefaultInputCallbacks (void); -XMLPUBFUN xmlParserInputBufferPtr XMLCALL - xmlAllocParserInputBuffer (xmlCharEncoding enc); - -XMLPUBFUN xmlParserInputBufferPtr XMLCALL - xmlParserInputBufferCreateFilename (const char *URI, - xmlCharEncoding enc); -XMLPUBFUN xmlParserInputBufferPtr XMLCALL - xmlParserInputBufferCreateFile (FILE *file, - xmlCharEncoding enc); -XMLPUBFUN xmlParserInputBufferPtr XMLCALL - xmlParserInputBufferCreateFd (int fd, - xmlCharEncoding enc); -XMLPUBFUN xmlParserInputBufferPtr XMLCALL - xmlParserInputBufferCreateMem (const char *mem, int size, - xmlCharEncoding enc); -XMLPUBFUN xmlParserInputBufferPtr XMLCALL - xmlParserInputBufferCreateStatic (const char *mem, int size, - xmlCharEncoding enc); -XMLPUBFUN xmlParserInputBufferPtr XMLCALL - xmlParserInputBufferCreateIO (xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, - void *ioctx, - xmlCharEncoding enc); -XMLPUBFUN int XMLCALL - xmlParserInputBufferRead (xmlParserInputBufferPtr in, - int len); -XMLPUBFUN int XMLCALL - xmlParserInputBufferGrow (xmlParserInputBufferPtr in, - int len); -XMLPUBFUN int XMLCALL - xmlParserInputBufferPush (xmlParserInputBufferPtr in, - int len, - const char *buf); -XMLPUBFUN void XMLCALL - xmlFreeParserInputBuffer (xmlParserInputBufferPtr in); -XMLPUBFUN char * XMLCALL - xmlParserGetDirectory (const char *filename); - -XMLPUBFUN int XMLCALL - xmlRegisterInputCallbacks (xmlInputMatchCallback matchFunc, - xmlInputOpenCallback openFunc, - xmlInputReadCallback readFunc, - xmlInputCloseCallback closeFunc); - -xmlParserInputBufferPtr - __xmlParserInputBufferCreateFilename(const char *URI, - xmlCharEncoding enc); - -#ifdef LIBXML_OUTPUT_ENABLED -/* - * Interfaces for output - */ -XMLPUBFUN void XMLCALL - xmlCleanupOutputCallbacks (void); -XMLPUBFUN void XMLCALL - xmlRegisterDefaultOutputCallbacks(void); -XMLPUBFUN xmlOutputBufferPtr XMLCALL - xmlAllocOutputBuffer (xmlCharEncodingHandlerPtr encoder); - -XMLPUBFUN xmlOutputBufferPtr XMLCALL - xmlOutputBufferCreateFilename (const char *URI, - xmlCharEncodingHandlerPtr encoder, - int compression); - -XMLPUBFUN xmlOutputBufferPtr XMLCALL - xmlOutputBufferCreateFile (FILE *file, - xmlCharEncodingHandlerPtr encoder); - -XMLPUBFUN xmlOutputBufferPtr XMLCALL - xmlOutputBufferCreateBuffer (xmlBufferPtr buffer, - xmlCharEncodingHandlerPtr encoder); - -XMLPUBFUN xmlOutputBufferPtr XMLCALL - xmlOutputBufferCreateFd (int fd, - xmlCharEncodingHandlerPtr encoder); - -XMLPUBFUN xmlOutputBufferPtr XMLCALL - xmlOutputBufferCreateIO (xmlOutputWriteCallback iowrite, - xmlOutputCloseCallback ioclose, - void *ioctx, - xmlCharEncodingHandlerPtr encoder); - -XMLPUBFUN int XMLCALL - xmlOutputBufferWrite (xmlOutputBufferPtr out, - int len, - const char *buf); -XMLPUBFUN int XMLCALL - xmlOutputBufferWriteString (xmlOutputBufferPtr out, - const char *str); -XMLPUBFUN int XMLCALL - xmlOutputBufferWriteEscape (xmlOutputBufferPtr out, - const xmlChar *str, - xmlCharEncodingOutputFunc escaping); - -XMLPUBFUN int XMLCALL - xmlOutputBufferFlush (xmlOutputBufferPtr out); -XMLPUBFUN int XMLCALL - xmlOutputBufferClose (xmlOutputBufferPtr out); - -XMLPUBFUN int XMLCALL - xmlRegisterOutputCallbacks (xmlOutputMatchCallback matchFunc, - xmlOutputOpenCallback openFunc, - xmlOutputWriteCallback writeFunc, - xmlOutputCloseCallback closeFunc); - -xmlOutputBufferPtr - __xmlOutputBufferCreateFilename(const char *URI, - xmlCharEncodingHandlerPtr encoder, - int compression); - -#ifdef LIBXML_HTTP_ENABLED -/* This function only exists if HTTP support built into the library */ -XMLPUBFUN void XMLCALL - xmlRegisterHTTPPostCallbacks (void ); -#endif /* LIBXML_HTTP_ENABLED */ - -#endif /* LIBXML_OUTPUT_ENABLED */ - -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlCheckHTTPInput (xmlParserCtxtPtr ctxt, - xmlParserInputPtr ret); - -/* - * A predefined entity loader disabling network accesses - */ -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlNoNetExternalEntityLoader (const char *URL, - const char *ID, - xmlParserCtxtPtr ctxt); - -/* - * xmlNormalizeWindowsPath is obsolete, don't use it. - * Check xmlCanonicPath in uri.h for a better alternative. - */ -XMLPUBFUN xmlChar * XMLCALL - xmlNormalizeWindowsPath (const xmlChar *path); - -XMLPUBFUN int XMLCALL - xmlCheckFilename (const char *path); -/** - * Default 'file://' protocol callbacks - */ -XMLPUBFUN int XMLCALL - xmlFileMatch (const char *filename); -XMLPUBFUN void * XMLCALL - xmlFileOpen (const char *filename); -XMLPUBFUN int XMLCALL - xmlFileRead (void * context, - char * buffer, - int len); -XMLPUBFUN int XMLCALL - xmlFileClose (void * context); - -/** - * Default 'http://' protocol callbacks - */ -#ifdef LIBXML_HTTP_ENABLED -XMLPUBFUN int XMLCALL - xmlIOHTTPMatch (const char *filename); -XMLPUBFUN void * XMLCALL - xmlIOHTTPOpen (const char *filename); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void * XMLCALL - xmlIOHTTPOpenW (const char * post_uri, - int compression ); -#endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN int XMLCALL - xmlIOHTTPRead (void * context, - char * buffer, - int len); -XMLPUBFUN int XMLCALL - xmlIOHTTPClose (void * context); -#endif /* LIBXML_HTTP_ENABLED */ - -/** - * Default 'ftp://' protocol callbacks - */ -#ifdef LIBXML_FTP_ENABLED -XMLPUBFUN int XMLCALL - xmlIOFTPMatch (const char *filename); -XMLPUBFUN void * XMLCALL - xmlIOFTPOpen (const char *filename); -XMLPUBFUN int XMLCALL - xmlIOFTPRead (void * context, - char * buffer, - int len); -XMLPUBFUN int XMLCALL - xmlIOFTPClose (void * context); -#endif /* LIBXML_FTP_ENABLED */ - -#ifdef __cplusplus -} -#endif - -#endif /* __XML_IO_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlautomata.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlautomata.h deleted file mode 100644 index 388585cd27e..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlautomata.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Summary: API to build regexp automata - * Description: the API to build regexp automata - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_AUTOMATA_H__ -#define __XML_AUTOMATA_H__ - -#include "xmlversion.h" -#include "tree.h" - -#ifdef LIBXML_REGEXP_ENABLED -#ifdef LIBXML_AUTOMATA_ENABLED -#include "xmlregexp.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlAutomataPtr: - * - * A libxml automata description, It can be compiled into a regexp - */ -typedef struct _xmlAutomata xmlAutomata; -typedef xmlAutomata *xmlAutomataPtr; - -/** - * xmlAutomataStatePtr: - * - * A state int the automata description, - */ -typedef struct _xmlAutomataState xmlAutomataState; -typedef xmlAutomataState *xmlAutomataStatePtr; - -/* - * Building API - */ -XMLPUBFUN xmlAutomataPtr XMLCALL - xmlNewAutomata (void); -XMLPUBFUN void XMLCALL - xmlFreeAutomata (xmlAutomataPtr am); - -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataGetInitState (xmlAutomataPtr am); -XMLPUBFUN int XMLCALL - xmlAutomataSetFinalState (xmlAutomataPtr am, - xmlAutomataStatePtr state); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewState (xmlAutomataPtr am); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewTransition (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - const xmlChar *token, - void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewTransition2 (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - const xmlChar *token, - const xmlChar *token2, - void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewNegTrans (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - const xmlChar *token, - const xmlChar *token2, - void *data); - -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewCountTrans (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - const xmlChar *token, - int min, - int max, - void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewCountTrans2 (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - const xmlChar *token, - const xmlChar *token2, - int min, - int max, - void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewOnceTrans (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - const xmlChar *token, - int min, - int max, - void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewOnceTrans2 (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - const xmlChar *token, - const xmlChar *token2, - int min, - int max, - void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewAllTrans (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - int lax); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewEpsilon (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewCountedTrans (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - int counter); -XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewCounterTrans (xmlAutomataPtr am, - xmlAutomataStatePtr from, - xmlAutomataStatePtr to, - int counter); -XMLPUBFUN int XMLCALL - xmlAutomataNewCounter (xmlAutomataPtr am, - int min, - int max); - -XMLPUBFUN xmlRegexpPtr XMLCALL - xmlAutomataCompile (xmlAutomataPtr am); -XMLPUBFUN int XMLCALL - xmlAutomataIsDeterminist (xmlAutomataPtr am); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_AUTOMATA_ENABLED */ -#endif /* LIBXML_REGEXP_ENABLED */ - -#endif /* __XML_AUTOMATA_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlerror.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlerror.h deleted file mode 100644 index d6f682569c9..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlerror.h +++ /dev/null @@ -1,936 +0,0 @@ -/* - * Summary: error handling - * Description: the API used to report errors - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#include "parser.h" - -#ifndef __XML_ERROR_H__ -#define __XML_ERROR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlErrorLevel: - * - * Indicates the level of an error - */ -typedef enum { - XML_ERR_NONE = 0, - XML_ERR_WARNING = 1, /* A simple warning */ - XML_ERR_ERROR = 2, /* A recoverable error */ - XML_ERR_FATAL = 3 /* A fatal error */ -} xmlErrorLevel; - -/** - * xmlErrorDomain: - * - * Indicates where an error may have come from - */ -typedef enum { - XML_FROM_NONE = 0, - XML_FROM_PARSER, /* The XML parser */ - XML_FROM_TREE, /* The tree module */ - XML_FROM_NAMESPACE, /* The XML Namespace module */ - XML_FROM_DTD, /* The XML DTD validation with parser context*/ - XML_FROM_HTML, /* The HTML parser */ - XML_FROM_MEMORY, /* The memory allocator */ - XML_FROM_OUTPUT, /* The serialization code */ - XML_FROM_IO, /* The Input/Output stack */ - XML_FROM_FTP, /* The FTP module */ - XML_FROM_HTTP, /* The HTTP module */ - XML_FROM_XINCLUDE, /* The XInclude processing */ - XML_FROM_XPATH, /* The XPath module */ - XML_FROM_XPOINTER, /* The XPointer module */ - XML_FROM_REGEXP, /* The regular expressions module */ - XML_FROM_DATATYPE, /* The W3C XML Schemas Datatype module */ - XML_FROM_SCHEMASP, /* The W3C XML Schemas parser module */ - XML_FROM_SCHEMASV, /* The W3C XML Schemas validation module */ - XML_FROM_RELAXNGP, /* The Relax-NG parser module */ - XML_FROM_RELAXNGV, /* The Relax-NG validator module */ - XML_FROM_CATALOG, /* The Catalog module */ - XML_FROM_C14N, /* The Canonicalization module */ - XML_FROM_XSLT, /* The XSLT engine from libxslt */ - XML_FROM_VALID, /* The XML DTD validation with valid context */ - XML_FROM_CHECK, /* The error checking module */ - XML_FROM_WRITER, /* The xmlwriter module */ - XML_FROM_MODULE, /* The dynamically loaded module module*/ - XML_FROM_I18N /* The module handling character conversion */ -} xmlErrorDomain; - -/** - * xmlError: - * - * An XML Error instance. - */ - -typedef struct _xmlError xmlError; -typedef xmlError *xmlErrorPtr; -struct _xmlError { - int domain; /* What part of the library raised this error */ - int code; /* The error code, e.g. an xmlParserError */ - char *message;/* human-readable informative error message */ - xmlErrorLevel level;/* how consequent is the error */ - char *file; /* the filename */ - int line; /* the line number if available */ - char *str1; /* extra string information */ - char *str2; /* extra string information */ - char *str3; /* extra string information */ - int int1; /* extra number information */ - int int2; /* column number of the error or 0 if N/A (todo: rename this field when we would break ABI) */ - void *ctxt; /* the parser context if available */ - void *node; /* the node in the tree */ -}; - -/** - * xmlParserError: - * - * This is an error that the XML (or HTML) parser can generate - */ -typedef enum { - XML_ERR_OK = 0, - XML_ERR_INTERNAL_ERROR, /* 1 */ - XML_ERR_NO_MEMORY, /* 2 */ - XML_ERR_DOCUMENT_START, /* 3 */ - XML_ERR_DOCUMENT_EMPTY, /* 4 */ - XML_ERR_DOCUMENT_END, /* 5 */ - XML_ERR_INVALID_HEX_CHARREF, /* 6 */ - XML_ERR_INVALID_DEC_CHARREF, /* 7 */ - XML_ERR_INVALID_CHARREF, /* 8 */ - XML_ERR_INVALID_CHAR, /* 9 */ - XML_ERR_CHARREF_AT_EOF, /* 10 */ - XML_ERR_CHARREF_IN_PROLOG, /* 11 */ - XML_ERR_CHARREF_IN_EPILOG, /* 12 */ - XML_ERR_CHARREF_IN_DTD, /* 13 */ - XML_ERR_ENTITYREF_AT_EOF, /* 14 */ - XML_ERR_ENTITYREF_IN_PROLOG, /* 15 */ - XML_ERR_ENTITYREF_IN_EPILOG, /* 16 */ - XML_ERR_ENTITYREF_IN_DTD, /* 17 */ - XML_ERR_PEREF_AT_EOF, /* 18 */ - XML_ERR_PEREF_IN_PROLOG, /* 19 */ - XML_ERR_PEREF_IN_EPILOG, /* 20 */ - XML_ERR_PEREF_IN_INT_SUBSET, /* 21 */ - XML_ERR_ENTITYREF_NO_NAME, /* 22 */ - XML_ERR_ENTITYREF_SEMICOL_MISSING, /* 23 */ - XML_ERR_PEREF_NO_NAME, /* 24 */ - XML_ERR_PEREF_SEMICOL_MISSING, /* 25 */ - XML_ERR_UNDECLARED_ENTITY, /* 26 */ - XML_WAR_UNDECLARED_ENTITY, /* 27 */ - XML_ERR_UNPARSED_ENTITY, /* 28 */ - XML_ERR_ENTITY_IS_EXTERNAL, /* 29 */ - XML_ERR_ENTITY_IS_PARAMETER, /* 30 */ - XML_ERR_UNKNOWN_ENCODING, /* 31 */ - XML_ERR_UNSUPPORTED_ENCODING, /* 32 */ - XML_ERR_STRING_NOT_STARTED, /* 33 */ - XML_ERR_STRING_NOT_CLOSED, /* 34 */ - XML_ERR_NS_DECL_ERROR, /* 35 */ - XML_ERR_ENTITY_NOT_STARTED, /* 36 */ - XML_ERR_ENTITY_NOT_FINISHED, /* 37 */ - XML_ERR_LT_IN_ATTRIBUTE, /* 38 */ - XML_ERR_ATTRIBUTE_NOT_STARTED, /* 39 */ - XML_ERR_ATTRIBUTE_NOT_FINISHED, /* 40 */ - XML_ERR_ATTRIBUTE_WITHOUT_VALUE, /* 41 */ - XML_ERR_ATTRIBUTE_REDEFINED, /* 42 */ - XML_ERR_LITERAL_NOT_STARTED, /* 43 */ - XML_ERR_LITERAL_NOT_FINISHED, /* 44 */ - XML_ERR_COMMENT_NOT_FINISHED, /* 45 */ - XML_ERR_PI_NOT_STARTED, /* 46 */ - XML_ERR_PI_NOT_FINISHED, /* 47 */ - XML_ERR_NOTATION_NOT_STARTED, /* 48 */ - XML_ERR_NOTATION_NOT_FINISHED, /* 49 */ - XML_ERR_ATTLIST_NOT_STARTED, /* 50 */ - XML_ERR_ATTLIST_NOT_FINISHED, /* 51 */ - XML_ERR_MIXED_NOT_STARTED, /* 52 */ - XML_ERR_MIXED_NOT_FINISHED, /* 53 */ - XML_ERR_ELEMCONTENT_NOT_STARTED, /* 54 */ - XML_ERR_ELEMCONTENT_NOT_FINISHED, /* 55 */ - XML_ERR_XMLDECL_NOT_STARTED, /* 56 */ - XML_ERR_XMLDECL_NOT_FINISHED, /* 57 */ - XML_ERR_CONDSEC_NOT_STARTED, /* 58 */ - XML_ERR_CONDSEC_NOT_FINISHED, /* 59 */ - XML_ERR_EXT_SUBSET_NOT_FINISHED, /* 60 */ - XML_ERR_DOCTYPE_NOT_FINISHED, /* 61 */ - XML_ERR_MISPLACED_CDATA_END, /* 62 */ - XML_ERR_CDATA_NOT_FINISHED, /* 63 */ - XML_ERR_RESERVED_XML_NAME, /* 64 */ - XML_ERR_SPACE_REQUIRED, /* 65 */ - XML_ERR_SEPARATOR_REQUIRED, /* 66 */ - XML_ERR_NMTOKEN_REQUIRED, /* 67 */ - XML_ERR_NAME_REQUIRED, /* 68 */ - XML_ERR_PCDATA_REQUIRED, /* 69 */ - XML_ERR_URI_REQUIRED, /* 70 */ - XML_ERR_PUBID_REQUIRED, /* 71 */ - XML_ERR_LT_REQUIRED, /* 72 */ - XML_ERR_GT_REQUIRED, /* 73 */ - XML_ERR_LTSLASH_REQUIRED, /* 74 */ - XML_ERR_EQUAL_REQUIRED, /* 75 */ - XML_ERR_TAG_NAME_MISMATCH, /* 76 */ - XML_ERR_TAG_NOT_FINISHED, /* 77 */ - XML_ERR_STANDALONE_VALUE, /* 78 */ - XML_ERR_ENCODING_NAME, /* 79 */ - XML_ERR_HYPHEN_IN_COMMENT, /* 80 */ - XML_ERR_INVALID_ENCODING, /* 81 */ - XML_ERR_EXT_ENTITY_STANDALONE, /* 82 */ - XML_ERR_CONDSEC_INVALID, /* 83 */ - XML_ERR_VALUE_REQUIRED, /* 84 */ - XML_ERR_NOT_WELL_BALANCED, /* 85 */ - XML_ERR_EXTRA_CONTENT, /* 86 */ - XML_ERR_ENTITY_CHAR_ERROR, /* 87 */ - XML_ERR_ENTITY_PE_INTERNAL, /* 88 */ - XML_ERR_ENTITY_LOOP, /* 89 */ - XML_ERR_ENTITY_BOUNDARY, /* 90 */ - XML_ERR_INVALID_URI, /* 91 */ - XML_ERR_URI_FRAGMENT, /* 92 */ - XML_WAR_CATALOG_PI, /* 93 */ - XML_ERR_NO_DTD, /* 94 */ - XML_ERR_CONDSEC_INVALID_KEYWORD, /* 95 */ - XML_ERR_VERSION_MISSING, /* 96 */ - XML_WAR_UNKNOWN_VERSION, /* 97 */ - XML_WAR_LANG_VALUE, /* 98 */ - XML_WAR_NS_URI, /* 99 */ - XML_WAR_NS_URI_RELATIVE, /* 100 */ - XML_ERR_MISSING_ENCODING, /* 101 */ - XML_WAR_SPACE_VALUE, /* 102 */ - XML_ERR_NOT_STANDALONE, /* 103 */ - XML_ERR_ENTITY_PROCESSING, /* 104 */ - XML_ERR_NOTATION_PROCESSING, /* 105 */ - XML_WAR_NS_COLUMN, /* 106 */ - XML_WAR_ENTITY_REDEFINED, /* 107 */ - XML_NS_ERR_XML_NAMESPACE = 200, - XML_NS_ERR_UNDEFINED_NAMESPACE, /* 201 */ - XML_NS_ERR_QNAME, /* 202 */ - XML_NS_ERR_ATTRIBUTE_REDEFINED, /* 203 */ - XML_NS_ERR_EMPTY, /* 204 */ - XML_DTD_ATTRIBUTE_DEFAULT = 500, - XML_DTD_ATTRIBUTE_REDEFINED, /* 501 */ - XML_DTD_ATTRIBUTE_VALUE, /* 502 */ - XML_DTD_CONTENT_ERROR, /* 503 */ - XML_DTD_CONTENT_MODEL, /* 504 */ - XML_DTD_CONTENT_NOT_DETERMINIST, /* 505 */ - XML_DTD_DIFFERENT_PREFIX, /* 506 */ - XML_DTD_ELEM_DEFAULT_NAMESPACE, /* 507 */ - XML_DTD_ELEM_NAMESPACE, /* 508 */ - XML_DTD_ELEM_REDEFINED, /* 509 */ - XML_DTD_EMPTY_NOTATION, /* 510 */ - XML_DTD_ENTITY_TYPE, /* 511 */ - XML_DTD_ID_FIXED, /* 512 */ - XML_DTD_ID_REDEFINED, /* 513 */ - XML_DTD_ID_SUBSET, /* 514 */ - XML_DTD_INVALID_CHILD, /* 515 */ - XML_DTD_INVALID_DEFAULT, /* 516 */ - XML_DTD_LOAD_ERROR, /* 517 */ - XML_DTD_MISSING_ATTRIBUTE, /* 518 */ - XML_DTD_MIXED_CORRUPT, /* 519 */ - XML_DTD_MULTIPLE_ID, /* 520 */ - XML_DTD_NO_DOC, /* 521 */ - XML_DTD_NO_DTD, /* 522 */ - XML_DTD_NO_ELEM_NAME, /* 523 */ - XML_DTD_NO_PREFIX, /* 524 */ - XML_DTD_NO_ROOT, /* 525 */ - XML_DTD_NOTATION_REDEFINED, /* 526 */ - XML_DTD_NOTATION_VALUE, /* 527 */ - XML_DTD_NOT_EMPTY, /* 528 */ - XML_DTD_NOT_PCDATA, /* 529 */ - XML_DTD_NOT_STANDALONE, /* 530 */ - XML_DTD_ROOT_NAME, /* 531 */ - XML_DTD_STANDALONE_WHITE_SPACE, /* 532 */ - XML_DTD_UNKNOWN_ATTRIBUTE, /* 533 */ - XML_DTD_UNKNOWN_ELEM, /* 534 */ - XML_DTD_UNKNOWN_ENTITY, /* 535 */ - XML_DTD_UNKNOWN_ID, /* 536 */ - XML_DTD_UNKNOWN_NOTATION, /* 537 */ - XML_DTD_STANDALONE_DEFAULTED, /* 538 */ - XML_DTD_XMLID_VALUE, /* 539 */ - XML_DTD_XMLID_TYPE, /* 540 */ - XML_HTML_STRUCURE_ERROR = 800, - XML_HTML_UNKNOWN_TAG, /* 801 */ - XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000, - XML_RNGP_ATTR_CONFLICT, /* 1001 */ - XML_RNGP_ATTRIBUTE_CHILDREN, /* 1002 */ - XML_RNGP_ATTRIBUTE_CONTENT, /* 1003 */ - XML_RNGP_ATTRIBUTE_EMPTY, /* 1004 */ - XML_RNGP_ATTRIBUTE_NOOP, /* 1005 */ - XML_RNGP_CHOICE_CONTENT, /* 1006 */ - XML_RNGP_CHOICE_EMPTY, /* 1007 */ - XML_RNGP_CREATE_FAILURE, /* 1008 */ - XML_RNGP_DATA_CONTENT, /* 1009 */ - XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, /* 1010 */ - XML_RNGP_DEFINE_CREATE_FAILED, /* 1011 */ - XML_RNGP_DEFINE_EMPTY, /* 1012 */ - XML_RNGP_DEFINE_MISSING, /* 1013 */ - XML_RNGP_DEFINE_NAME_MISSING, /* 1014 */ - XML_RNGP_ELEM_CONTENT_EMPTY, /* 1015 */ - XML_RNGP_ELEM_CONTENT_ERROR, /* 1016 */ - XML_RNGP_ELEMENT_EMPTY, /* 1017 */ - XML_RNGP_ELEMENT_CONTENT, /* 1018 */ - XML_RNGP_ELEMENT_NAME, /* 1019 */ - XML_RNGP_ELEMENT_NO_CONTENT, /* 1020 */ - XML_RNGP_ELEM_TEXT_CONFLICT, /* 1021 */ - XML_RNGP_EMPTY, /* 1022 */ - XML_RNGP_EMPTY_CONSTRUCT, /* 1023 */ - XML_RNGP_EMPTY_CONTENT, /* 1024 */ - XML_RNGP_EMPTY_NOT_EMPTY, /* 1025 */ - XML_RNGP_ERROR_TYPE_LIB, /* 1026 */ - XML_RNGP_EXCEPT_EMPTY, /* 1027 */ - XML_RNGP_EXCEPT_MISSING, /* 1028 */ - XML_RNGP_EXCEPT_MULTIPLE, /* 1029 */ - XML_RNGP_EXCEPT_NO_CONTENT, /* 1030 */ - XML_RNGP_EXTERNALREF_EMTPY, /* 1031 */ - XML_RNGP_EXTERNAL_REF_FAILURE, /* 1032 */ - XML_RNGP_EXTERNALREF_RECURSE, /* 1033 */ - XML_RNGP_FORBIDDEN_ATTRIBUTE, /* 1034 */ - XML_RNGP_FOREIGN_ELEMENT, /* 1035 */ - XML_RNGP_GRAMMAR_CONTENT, /* 1036 */ - XML_RNGP_GRAMMAR_EMPTY, /* 1037 */ - XML_RNGP_GRAMMAR_MISSING, /* 1038 */ - XML_RNGP_GRAMMAR_NO_START, /* 1039 */ - XML_RNGP_GROUP_ATTR_CONFLICT, /* 1040 */ - XML_RNGP_HREF_ERROR, /* 1041 */ - XML_RNGP_INCLUDE_EMPTY, /* 1042 */ - XML_RNGP_INCLUDE_FAILURE, /* 1043 */ - XML_RNGP_INCLUDE_RECURSE, /* 1044 */ - XML_RNGP_INTERLEAVE_ADD, /* 1045 */ - XML_RNGP_INTERLEAVE_CREATE_FAILED, /* 1046 */ - XML_RNGP_INTERLEAVE_EMPTY, /* 1047 */ - XML_RNGP_INTERLEAVE_NO_CONTENT, /* 1048 */ - XML_RNGP_INVALID_DEFINE_NAME, /* 1049 */ - XML_RNGP_INVALID_URI, /* 1050 */ - XML_RNGP_INVALID_VALUE, /* 1051 */ - XML_RNGP_MISSING_HREF, /* 1052 */ - XML_RNGP_NAME_MISSING, /* 1053 */ - XML_RNGP_NEED_COMBINE, /* 1054 */ - XML_RNGP_NOTALLOWED_NOT_EMPTY, /* 1055 */ - XML_RNGP_NSNAME_ATTR_ANCESTOR, /* 1056 */ - XML_RNGP_NSNAME_NO_NS, /* 1057 */ - XML_RNGP_PARAM_FORBIDDEN, /* 1058 */ - XML_RNGP_PARAM_NAME_MISSING, /* 1059 */ - XML_RNGP_PARENTREF_CREATE_FAILED, /* 1060 */ - XML_RNGP_PARENTREF_NAME_INVALID, /* 1061 */ - XML_RNGP_PARENTREF_NO_NAME, /* 1062 */ - XML_RNGP_PARENTREF_NO_PARENT, /* 1063 */ - XML_RNGP_PARENTREF_NOT_EMPTY, /* 1064 */ - XML_RNGP_PARSE_ERROR, /* 1065 */ - XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME, /* 1066 */ - XML_RNGP_PAT_ATTR_ATTR, /* 1067 */ - XML_RNGP_PAT_ATTR_ELEM, /* 1068 */ - XML_RNGP_PAT_DATA_EXCEPT_ATTR, /* 1069 */ - XML_RNGP_PAT_DATA_EXCEPT_ELEM, /* 1070 */ - XML_RNGP_PAT_DATA_EXCEPT_EMPTY, /* 1071 */ - XML_RNGP_PAT_DATA_EXCEPT_GROUP, /* 1072 */ - XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, /* 1073 */ - XML_RNGP_PAT_DATA_EXCEPT_LIST, /* 1074 */ - XML_RNGP_PAT_DATA_EXCEPT_ONEMORE, /* 1075 */ - XML_RNGP_PAT_DATA_EXCEPT_REF, /* 1076 */ - XML_RNGP_PAT_DATA_EXCEPT_TEXT, /* 1077 */ - XML_RNGP_PAT_LIST_ATTR, /* 1078 */ - XML_RNGP_PAT_LIST_ELEM, /* 1079 */ - XML_RNGP_PAT_LIST_INTERLEAVE, /* 1080 */ - XML_RNGP_PAT_LIST_LIST, /* 1081 */ - XML_RNGP_PAT_LIST_REF, /* 1082 */ - XML_RNGP_PAT_LIST_TEXT, /* 1083 */ - XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, /* 1084 */ - XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME, /* 1085 */ - XML_RNGP_PAT_ONEMORE_GROUP_ATTR, /* 1086 */ - XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR, /* 1087 */ - XML_RNGP_PAT_START_ATTR, /* 1088 */ - XML_RNGP_PAT_START_DATA, /* 1089 */ - XML_RNGP_PAT_START_EMPTY, /* 1090 */ - XML_RNGP_PAT_START_GROUP, /* 1091 */ - XML_RNGP_PAT_START_INTERLEAVE, /* 1092 */ - XML_RNGP_PAT_START_LIST, /* 1093 */ - XML_RNGP_PAT_START_ONEMORE, /* 1094 */ - XML_RNGP_PAT_START_TEXT, /* 1095 */ - XML_RNGP_PAT_START_VALUE, /* 1096 */ - XML_RNGP_PREFIX_UNDEFINED, /* 1097 */ - XML_RNGP_REF_CREATE_FAILED, /* 1098 */ - XML_RNGP_REF_CYCLE, /* 1099 */ - XML_RNGP_REF_NAME_INVALID, /* 1100 */ - XML_RNGP_REF_NO_DEF, /* 1101 */ - XML_RNGP_REF_NO_NAME, /* 1102 */ - XML_RNGP_REF_NOT_EMPTY, /* 1103 */ - XML_RNGP_START_CHOICE_AND_INTERLEAVE, /* 1104 */ - XML_RNGP_START_CONTENT, /* 1105 */ - XML_RNGP_START_EMPTY, /* 1106 */ - XML_RNGP_START_MISSING, /* 1107 */ - XML_RNGP_TEXT_EXPECTED, /* 1108 */ - XML_RNGP_TEXT_HAS_CHILD, /* 1109 */ - XML_RNGP_TYPE_MISSING, /* 1110 */ - XML_RNGP_TYPE_NOT_FOUND, /* 1111 */ - XML_RNGP_TYPE_VALUE, /* 1112 */ - XML_RNGP_UNKNOWN_ATTRIBUTE, /* 1113 */ - XML_RNGP_UNKNOWN_COMBINE, /* 1114 */ - XML_RNGP_UNKNOWN_CONSTRUCT, /* 1115 */ - XML_RNGP_UNKNOWN_TYPE_LIB, /* 1116 */ - XML_RNGP_URI_FRAGMENT, /* 1117 */ - XML_RNGP_URI_NOT_ABSOLUTE, /* 1118 */ - XML_RNGP_VALUE_EMPTY, /* 1119 */ - XML_RNGP_VALUE_NO_CONTENT, /* 1120 */ - XML_RNGP_XMLNS_NAME, /* 1121 */ - XML_RNGP_XML_NS, /* 1122 */ - XML_XPATH_EXPRESSION_OK = 1200, - XML_XPATH_NUMBER_ERROR, /* 1201 */ - XML_XPATH_UNFINISHED_LITERAL_ERROR, /* 1202 */ - XML_XPATH_START_LITERAL_ERROR, /* 1203 */ - XML_XPATH_VARIABLE_REF_ERROR, /* 1204 */ - XML_XPATH_UNDEF_VARIABLE_ERROR, /* 1205 */ - XML_XPATH_INVALID_PREDICATE_ERROR, /* 1206 */ - XML_XPATH_EXPR_ERROR, /* 1207 */ - XML_XPATH_UNCLOSED_ERROR, /* 1208 */ - XML_XPATH_UNKNOWN_FUNC_ERROR, /* 1209 */ - XML_XPATH_INVALID_OPERAND, /* 1210 */ - XML_XPATH_INVALID_TYPE, /* 1211 */ - XML_XPATH_INVALID_ARITY, /* 1212 */ - XML_XPATH_INVALID_CTXT_SIZE, /* 1213 */ - XML_XPATH_INVALID_CTXT_POSITION, /* 1214 */ - XML_XPATH_MEMORY_ERROR, /* 1215 */ - XML_XPTR_SYNTAX_ERROR, /* 1216 */ - XML_XPTR_RESOURCE_ERROR, /* 1217 */ - XML_XPTR_SUB_RESOURCE_ERROR, /* 1218 */ - XML_XPATH_UNDEF_PREFIX_ERROR, /* 1219 */ - XML_XPATH_ENCODING_ERROR, /* 1220 */ - XML_XPATH_INVALID_CHAR_ERROR, /* 1221 */ - XML_TREE_INVALID_HEX = 1300, - XML_TREE_INVALID_DEC, /* 1301 */ - XML_TREE_UNTERMINATED_ENTITY, /* 1302 */ - XML_SAVE_NOT_UTF8 = 1400, - XML_SAVE_CHAR_INVALID, /* 1401 */ - XML_SAVE_NO_DOCTYPE, /* 1402 */ - XML_SAVE_UNKNOWN_ENCODING, /* 1403 */ - XML_REGEXP_COMPILE_ERROR = 1450, - XML_IO_UNKNOWN = 1500, - XML_IO_EACCES, /* 1501 */ - XML_IO_EAGAIN, /* 1502 */ - XML_IO_EBADF, /* 1503 */ - XML_IO_EBADMSG, /* 1504 */ - XML_IO_EBUSY, /* 1505 */ - XML_IO_ECANCELED, /* 1506 */ - XML_IO_ECHILD, /* 1507 */ - XML_IO_EDEADLK, /* 1508 */ - XML_IO_EDOM, /* 1509 */ - XML_IO_EEXIST, /* 1510 */ - XML_IO_EFAULT, /* 1511 */ - XML_IO_EFBIG, /* 1512 */ - XML_IO_EINPROGRESS, /* 1513 */ - XML_IO_EINTR, /* 1514 */ - XML_IO_EINVAL, /* 1515 */ - XML_IO_EIO, /* 1516 */ - XML_IO_EISDIR, /* 1517 */ - XML_IO_EMFILE, /* 1518 */ - XML_IO_EMLINK, /* 1519 */ - XML_IO_EMSGSIZE, /* 1520 */ - XML_IO_ENAMETOOLONG, /* 1521 */ - XML_IO_ENFILE, /* 1522 */ - XML_IO_ENODEV, /* 1523 */ - XML_IO_ENOENT, /* 1524 */ - XML_IO_ENOEXEC, /* 1525 */ - XML_IO_ENOLCK, /* 1526 */ - XML_IO_ENOMEM, /* 1527 */ - XML_IO_ENOSPC, /* 1528 */ - XML_IO_ENOSYS, /* 1529 */ - XML_IO_ENOTDIR, /* 1530 */ - XML_IO_ENOTEMPTY, /* 1531 */ - XML_IO_ENOTSUP, /* 1532 */ - XML_IO_ENOTTY, /* 1533 */ - XML_IO_ENXIO, /* 1534 */ - XML_IO_EPERM, /* 1535 */ - XML_IO_EPIPE, /* 1536 */ - XML_IO_ERANGE, /* 1537 */ - XML_IO_EROFS, /* 1538 */ - XML_IO_ESPIPE, /* 1539 */ - XML_IO_ESRCH, /* 1540 */ - XML_IO_ETIMEDOUT, /* 1541 */ - XML_IO_EXDEV, /* 1542 */ - XML_IO_NETWORK_ATTEMPT, /* 1543 */ - XML_IO_ENCODER, /* 1544 */ - XML_IO_FLUSH, /* 1545 */ - XML_IO_WRITE, /* 1546 */ - XML_IO_NO_INPUT, /* 1547 */ - XML_IO_BUFFER_FULL, /* 1548 */ - XML_IO_LOAD_ERROR, /* 1549 */ - XML_IO_ENOTSOCK, /* 1550 */ - XML_IO_EISCONN, /* 1551 */ - XML_IO_ECONNREFUSED, /* 1552 */ - XML_IO_ENETUNREACH, /* 1553 */ - XML_IO_EADDRINUSE, /* 1554 */ - XML_IO_EALREADY, /* 1555 */ - XML_IO_EAFNOSUPPORT, /* 1556 */ - XML_XINCLUDE_RECURSION=1600, - XML_XINCLUDE_PARSE_VALUE, /* 1601 */ - XML_XINCLUDE_ENTITY_DEF_MISMATCH, /* 1602 */ - XML_XINCLUDE_NO_HREF, /* 1603 */ - XML_XINCLUDE_NO_FALLBACK, /* 1604 */ - XML_XINCLUDE_HREF_URI, /* 1605 */ - XML_XINCLUDE_TEXT_FRAGMENT, /* 1606 */ - XML_XINCLUDE_TEXT_DOCUMENT, /* 1607 */ - XML_XINCLUDE_INVALID_CHAR, /* 1608 */ - XML_XINCLUDE_BUILD_FAILED, /* 1609 */ - XML_XINCLUDE_UNKNOWN_ENCODING, /* 1610 */ - XML_XINCLUDE_MULTIPLE_ROOT, /* 1611 */ - XML_XINCLUDE_XPTR_FAILED, /* 1612 */ - XML_XINCLUDE_XPTR_RESULT, /* 1613 */ - XML_XINCLUDE_INCLUDE_IN_INCLUDE, /* 1614 */ - XML_XINCLUDE_FALLBACKS_IN_INCLUDE, /* 1615 */ - XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE, /* 1616 */ - XML_XINCLUDE_DEPRECATED_NS, /* 1617 */ - XML_XINCLUDE_FRAGMENT_ID, /* 1618 */ - XML_CATALOG_MISSING_ATTR = 1650, - XML_CATALOG_ENTRY_BROKEN, /* 1651 */ - XML_CATALOG_PREFER_VALUE, /* 1652 */ - XML_CATALOG_NOT_CATALOG, /* 1653 */ - XML_CATALOG_RECURSION, /* 1654 */ - XML_SCHEMAP_PREFIX_UNDEFINED = 1700, - XML_SCHEMAP_ATTRFORMDEFAULT_VALUE, /* 1701 */ - XML_SCHEMAP_ATTRGRP_NONAME_NOREF, /* 1702 */ - XML_SCHEMAP_ATTR_NONAME_NOREF, /* 1703 */ - XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF, /* 1704 */ - XML_SCHEMAP_ELEMFORMDEFAULT_VALUE, /* 1705 */ - XML_SCHEMAP_ELEM_NONAME_NOREF, /* 1706 */ - XML_SCHEMAP_EXTENSION_NO_BASE, /* 1707 */ - XML_SCHEMAP_FACET_NO_VALUE, /* 1708 */ - XML_SCHEMAP_FAILED_BUILD_IMPORT, /* 1709 */ - XML_SCHEMAP_GROUP_NONAME_NOREF, /* 1710 */ - XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI, /* 1711 */ - XML_SCHEMAP_IMPORT_REDEFINE_NSNAME, /* 1712 */ - XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI, /* 1713 */ - XML_SCHEMAP_INVALID_BOOLEAN, /* 1714 */ - XML_SCHEMAP_INVALID_ENUM, /* 1715 */ - XML_SCHEMAP_INVALID_FACET, /* 1716 */ - XML_SCHEMAP_INVALID_FACET_VALUE, /* 1717 */ - XML_SCHEMAP_INVALID_MAXOCCURS, /* 1718 */ - XML_SCHEMAP_INVALID_MINOCCURS, /* 1719 */ - XML_SCHEMAP_INVALID_REF_AND_SUBTYPE, /* 1720 */ - XML_SCHEMAP_INVALID_WHITE_SPACE, /* 1721 */ - XML_SCHEMAP_NOATTR_NOREF, /* 1722 */ - XML_SCHEMAP_NOTATION_NO_NAME, /* 1723 */ - XML_SCHEMAP_NOTYPE_NOREF, /* 1724 */ - XML_SCHEMAP_REF_AND_SUBTYPE, /* 1725 */ - XML_SCHEMAP_RESTRICTION_NONAME_NOREF, /* 1726 */ - XML_SCHEMAP_SIMPLETYPE_NONAME, /* 1727 */ - XML_SCHEMAP_TYPE_AND_SUBTYPE, /* 1728 */ - XML_SCHEMAP_UNKNOWN_ALL_CHILD, /* 1729 */ - XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD, /* 1730 */ - XML_SCHEMAP_UNKNOWN_ATTR_CHILD, /* 1731 */ - XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD, /* 1732 */ - XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP, /* 1733 */ - XML_SCHEMAP_UNKNOWN_BASE_TYPE, /* 1734 */ - XML_SCHEMAP_UNKNOWN_CHOICE_CHILD, /* 1735 */ - XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD, /* 1736 */ - XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD, /* 1737 */ - XML_SCHEMAP_UNKNOWN_ELEM_CHILD, /* 1738 */ - XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD, /* 1739 */ - XML_SCHEMAP_UNKNOWN_FACET_CHILD, /* 1740 */ - XML_SCHEMAP_UNKNOWN_FACET_TYPE, /* 1741 */ - XML_SCHEMAP_UNKNOWN_GROUP_CHILD, /* 1742 */ - XML_SCHEMAP_UNKNOWN_IMPORT_CHILD, /* 1743 */ - XML_SCHEMAP_UNKNOWN_LIST_CHILD, /* 1744 */ - XML_SCHEMAP_UNKNOWN_NOTATION_CHILD, /* 1745 */ - XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD, /* 1746 */ - XML_SCHEMAP_UNKNOWN_REF, /* 1747 */ - XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD, /* 1748 */ - XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD, /* 1749 */ - XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD, /* 1750 */ - XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD, /* 1751 */ - XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD, /* 1752 */ - XML_SCHEMAP_UNKNOWN_TYPE, /* 1753 */ - XML_SCHEMAP_UNKNOWN_UNION_CHILD, /* 1754 */ - XML_SCHEMAP_ELEM_DEFAULT_FIXED, /* 1755 */ - XML_SCHEMAP_REGEXP_INVALID, /* 1756 */ - XML_SCHEMAP_FAILED_LOAD, /* 1757 */ - XML_SCHEMAP_NOTHING_TO_PARSE, /* 1758 */ - XML_SCHEMAP_NOROOT, /* 1759 */ - XML_SCHEMAP_REDEFINED_GROUP, /* 1760 */ - XML_SCHEMAP_REDEFINED_TYPE, /* 1761 */ - XML_SCHEMAP_REDEFINED_ELEMENT, /* 1762 */ - XML_SCHEMAP_REDEFINED_ATTRGROUP, /* 1763 */ - XML_SCHEMAP_REDEFINED_ATTR, /* 1764 */ - XML_SCHEMAP_REDEFINED_NOTATION, /* 1765 */ - XML_SCHEMAP_FAILED_PARSE, /* 1766 */ - XML_SCHEMAP_UNKNOWN_PREFIX, /* 1767 */ - XML_SCHEMAP_DEF_AND_PREFIX, /* 1768 */ - XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD, /* 1769 */ - XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI, /* 1770 */ - XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI, /* 1771 */ - XML_SCHEMAP_NOT_SCHEMA, /* 1772 */ - XML_SCHEMAP_UNKNOWN_MEMBER_TYPE, /* 1773 */ - XML_SCHEMAP_INVALID_ATTR_USE, /* 1774 */ - XML_SCHEMAP_RECURSIVE, /* 1775 */ - XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE, /* 1776 */ - XML_SCHEMAP_INVALID_ATTR_COMBINATION, /* 1777 */ - XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION, /* 1778 */ - XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD, /* 1779 */ - XML_SCHEMAP_INVALID_ATTR_NAME, /* 1780 */ - XML_SCHEMAP_REF_AND_CONTENT, /* 1781 */ - XML_SCHEMAP_CT_PROPS_CORRECT_1, /* 1782 */ - XML_SCHEMAP_CT_PROPS_CORRECT_2, /* 1783 */ - XML_SCHEMAP_CT_PROPS_CORRECT_3, /* 1784 */ - XML_SCHEMAP_CT_PROPS_CORRECT_4, /* 1785 */ - XML_SCHEMAP_CT_PROPS_CORRECT_5, /* 1786 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, /* 1787 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1, /* 1788 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2, /* 1789 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2, /* 1790 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3, /* 1791 */ - XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER, /* 1792 */ - XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE, /* 1793 */ - XML_SCHEMAP_UNION_NOT_EXPRESSIBLE, /* 1794 */ - XML_SCHEMAP_SRC_IMPORT_3_1, /* 1795 */ - XML_SCHEMAP_SRC_IMPORT_3_2, /* 1796 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1, /* 1797 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2, /* 1798 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3, /* 1799 */ - XML_SCHEMAP_COS_CT_EXTENDS_1_3, /* 1800 */ - XML_SCHEMAV_NOROOT = 1801, - XML_SCHEMAV_UNDECLAREDELEM, /* 1802 */ - XML_SCHEMAV_NOTTOPLEVEL, /* 1803 */ - XML_SCHEMAV_MISSING, /* 1804 */ - XML_SCHEMAV_WRONGELEM, /* 1805 */ - XML_SCHEMAV_NOTYPE, /* 1806 */ - XML_SCHEMAV_NOROLLBACK, /* 1807 */ - XML_SCHEMAV_ISABSTRACT, /* 1808 */ - XML_SCHEMAV_NOTEMPTY, /* 1809 */ - XML_SCHEMAV_ELEMCONT, /* 1810 */ - XML_SCHEMAV_HAVEDEFAULT, /* 1811 */ - XML_SCHEMAV_NOTNILLABLE, /* 1812 */ - XML_SCHEMAV_EXTRACONTENT, /* 1813 */ - XML_SCHEMAV_INVALIDATTR, /* 1814 */ - XML_SCHEMAV_INVALIDELEM, /* 1815 */ - XML_SCHEMAV_NOTDETERMINIST, /* 1816 */ - XML_SCHEMAV_CONSTRUCT, /* 1817 */ - XML_SCHEMAV_INTERNAL, /* 1818 */ - XML_SCHEMAV_NOTSIMPLE, /* 1819 */ - XML_SCHEMAV_ATTRUNKNOWN, /* 1820 */ - XML_SCHEMAV_ATTRINVALID, /* 1821 */ - XML_SCHEMAV_VALUE, /* 1822 */ - XML_SCHEMAV_FACET, /* 1823 */ - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, /* 1824 */ - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2, /* 1825 */ - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3, /* 1826 */ - XML_SCHEMAV_CVC_TYPE_3_1_1, /* 1827 */ - XML_SCHEMAV_CVC_TYPE_3_1_2, /* 1828 */ - XML_SCHEMAV_CVC_FACET_VALID, /* 1829 */ - XML_SCHEMAV_CVC_LENGTH_VALID, /* 1830 */ - XML_SCHEMAV_CVC_MINLENGTH_VALID, /* 1831 */ - XML_SCHEMAV_CVC_MAXLENGTH_VALID, /* 1832 */ - XML_SCHEMAV_CVC_MININCLUSIVE_VALID, /* 1833 */ - XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID, /* 1834 */ - XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID, /* 1835 */ - XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID, /* 1836 */ - XML_SCHEMAV_CVC_TOTALDIGITS_VALID, /* 1837 */ - XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID, /* 1838 */ - XML_SCHEMAV_CVC_PATTERN_VALID, /* 1839 */ - XML_SCHEMAV_CVC_ENUMERATION_VALID, /* 1840 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, /* 1841 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2, /* 1842 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, /* 1843 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4, /* 1844 */ - XML_SCHEMAV_CVC_ELT_1, /* 1845 */ - XML_SCHEMAV_CVC_ELT_2, /* 1846 */ - XML_SCHEMAV_CVC_ELT_3_1, /* 1847 */ - XML_SCHEMAV_CVC_ELT_3_2_1, /* 1848 */ - XML_SCHEMAV_CVC_ELT_3_2_2, /* 1849 */ - XML_SCHEMAV_CVC_ELT_4_1, /* 1850 */ - XML_SCHEMAV_CVC_ELT_4_2, /* 1851 */ - XML_SCHEMAV_CVC_ELT_4_3, /* 1852 */ - XML_SCHEMAV_CVC_ELT_5_1_1, /* 1853 */ - XML_SCHEMAV_CVC_ELT_5_1_2, /* 1854 */ - XML_SCHEMAV_CVC_ELT_5_2_1, /* 1855 */ - XML_SCHEMAV_CVC_ELT_5_2_2_1, /* 1856 */ - XML_SCHEMAV_CVC_ELT_5_2_2_2_1, /* 1857 */ - XML_SCHEMAV_CVC_ELT_5_2_2_2_2, /* 1858 */ - XML_SCHEMAV_CVC_ELT_6, /* 1859 */ - XML_SCHEMAV_CVC_ELT_7, /* 1860 */ - XML_SCHEMAV_CVC_ATTRIBUTE_1, /* 1861 */ - XML_SCHEMAV_CVC_ATTRIBUTE_2, /* 1862 */ - XML_SCHEMAV_CVC_ATTRIBUTE_3, /* 1863 */ - XML_SCHEMAV_CVC_ATTRIBUTE_4, /* 1864 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1, /* 1865 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, /* 1866 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, /* 1867 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_4, /* 1868 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1, /* 1869 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2, /* 1870 */ - XML_SCHEMAV_ELEMENT_CONTENT, /* 1871 */ - XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING, /* 1872 */ - XML_SCHEMAV_CVC_COMPLEX_TYPE_1, /* 1873 */ - XML_SCHEMAV_CVC_AU, /* 1874 */ - XML_SCHEMAV_CVC_TYPE_1, /* 1875 */ - XML_SCHEMAV_CVC_TYPE_2, /* 1876 */ - XML_SCHEMAV_CVC_IDC, /* 1877 */ - XML_SCHEMAV_CVC_WILDCARD, /* 1878 */ - XML_SCHEMAV_MISC, /* 1879 */ - XML_XPTR_UNKNOWN_SCHEME = 1900, - XML_XPTR_CHILDSEQ_START, /* 1901 */ - XML_XPTR_EVAL_FAILED, /* 1902 */ - XML_XPTR_EXTRA_OBJECTS, /* 1903 */ - XML_C14N_CREATE_CTXT = 1950, - XML_C14N_REQUIRES_UTF8, /* 1951 */ - XML_C14N_CREATE_STACK, /* 1952 */ - XML_C14N_INVALID_NODE, /* 1953 */ - XML_C14N_UNKNOW_NODE, /* 1954 */ - XML_C14N_RELATIVE_NAMESPACE, /* 1955 */ - XML_FTP_PASV_ANSWER = 2000, - XML_FTP_EPSV_ANSWER, /* 2001 */ - XML_FTP_ACCNT, /* 2002 */ - XML_FTP_URL_SYNTAX, /* 2003 */ - XML_HTTP_URL_SYNTAX = 2020, - XML_HTTP_USE_IP, /* 2021 */ - XML_HTTP_UNKNOWN_HOST, /* 2022 */ - XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000, - XML_SCHEMAP_SRC_SIMPLE_TYPE_2, /* 3001 */ - XML_SCHEMAP_SRC_SIMPLE_TYPE_3, /* 3002 */ - XML_SCHEMAP_SRC_SIMPLE_TYPE_4, /* 3003 */ - XML_SCHEMAP_SRC_RESOLVE, /* 3004 */ - XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, /* 3005 */ - XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE, /* 3006 */ - XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES, /* 3007 */ - XML_SCHEMAP_ST_PROPS_CORRECT_1, /* 3008 */ - XML_SCHEMAP_ST_PROPS_CORRECT_2, /* 3009 */ - XML_SCHEMAP_ST_PROPS_CORRECT_3, /* 3010 */ - XML_SCHEMAP_COS_ST_RESTRICTS_1_1, /* 3011 */ - XML_SCHEMAP_COS_ST_RESTRICTS_1_2, /* 3012 */ - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1, /* 3013 */ - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2, /* 3014 */ - XML_SCHEMAP_COS_ST_RESTRICTS_2_1, /* 3015 */ - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1, /* 3016 */ - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2, /* 3017 */ - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1, /* 3018 */ - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2, /* 3019 */ - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3, /* 3020 */ - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4, /* 3021 */ - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5, /* 3022 */ - XML_SCHEMAP_COS_ST_RESTRICTS_3_1, /* 3023 */ - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1, /* 3024 */ - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2, /* 3025 */ - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2, /* 3026 */ - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1, /* 3027 */ - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3, /* 3028 */ - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4, /* 3029 */ - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5, /* 3030 */ - XML_SCHEMAP_COS_ST_DERIVED_OK_2_1, /* 3031 */ - XML_SCHEMAP_COS_ST_DERIVED_OK_2_2, /* 3032 */ - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, /* 3033 */ - XML_SCHEMAP_S4S_ELEM_MISSING, /* 3034 */ - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, /* 3035 */ - XML_SCHEMAP_S4S_ATTR_MISSING, /* 3036 */ - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* 3037 */ - XML_SCHEMAP_SRC_ELEMENT_1, /* 3038 */ - XML_SCHEMAP_SRC_ELEMENT_2_1, /* 3039 */ - XML_SCHEMAP_SRC_ELEMENT_2_2, /* 3040 */ - XML_SCHEMAP_SRC_ELEMENT_3, /* 3041 */ - XML_SCHEMAP_P_PROPS_CORRECT_1, /* 3042 */ - XML_SCHEMAP_P_PROPS_CORRECT_2_1, /* 3043 */ - XML_SCHEMAP_P_PROPS_CORRECT_2_2, /* 3044 */ - XML_SCHEMAP_E_PROPS_CORRECT_2, /* 3045 */ - XML_SCHEMAP_E_PROPS_CORRECT_3, /* 3046 */ - XML_SCHEMAP_E_PROPS_CORRECT_4, /* 3047 */ - XML_SCHEMAP_E_PROPS_CORRECT_5, /* 3048 */ - XML_SCHEMAP_E_PROPS_CORRECT_6, /* 3049 */ - XML_SCHEMAP_SRC_INCLUDE, /* 3050 */ - XML_SCHEMAP_SRC_ATTRIBUTE_1, /* 3051 */ - XML_SCHEMAP_SRC_ATTRIBUTE_2, /* 3052 */ - XML_SCHEMAP_SRC_ATTRIBUTE_3_1, /* 3053 */ - XML_SCHEMAP_SRC_ATTRIBUTE_3_2, /* 3054 */ - XML_SCHEMAP_SRC_ATTRIBUTE_4, /* 3055 */ - XML_SCHEMAP_NO_XMLNS, /* 3056 */ - XML_SCHEMAP_NO_XSI, /* 3057 */ - XML_SCHEMAP_COS_VALID_DEFAULT_1, /* 3058 */ - XML_SCHEMAP_COS_VALID_DEFAULT_2_1, /* 3059 */ - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1, /* 3060 */ - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2, /* 3061 */ - XML_SCHEMAP_CVC_SIMPLE_TYPE, /* 3062 */ - XML_SCHEMAP_COS_CT_EXTENDS_1_1, /* 3063 */ - XML_SCHEMAP_SRC_IMPORT_1_1, /* 3064 */ - XML_SCHEMAP_SRC_IMPORT_1_2, /* 3065 */ - XML_SCHEMAP_SRC_IMPORT_2, /* 3066 */ - XML_SCHEMAP_SRC_IMPORT_2_1, /* 3067 */ - XML_SCHEMAP_SRC_IMPORT_2_2, /* 3068 */ - XML_SCHEMAP_INTERNAL, /* 3069 non-W3C */ - XML_SCHEMAP_NOT_DETERMINISTIC, /* 3070 non-W3C */ - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1, /* 3071 */ - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2, /* 3072 */ - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3, /* 3073 */ - XML_SCHEMAP_MG_PROPS_CORRECT_1, /* 3074 */ - XML_SCHEMAP_MG_PROPS_CORRECT_2, /* 3075 */ - XML_SCHEMAP_SRC_CT_1, /* 3076 */ - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3, /* 3077 */ - XML_SCHEMAP_AU_PROPS_CORRECT_2, /* 3078 */ - XML_SCHEMAP_A_PROPS_CORRECT_2, /* 3079 */ - XML_SCHEMAP_C_PROPS_CORRECT, /* 3080 */ - XML_SCHEMAP_SRC_REDEFINE, /* 3081 */ - XML_SCHEMAP_SRC_IMPORT, /* 3082 */ - XML_SCHEMAP_WARN_SKIP_SCHEMA, /* 3083 */ - XML_SCHEMAP_WARN_UNLOCATED_SCHEMA, /* 3084 */ - XML_SCHEMAP_WARN_ATTR_REDECL_PROH, /* 3085 */ - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, /* 3085 */ - XML_SCHEMAP_AG_PROPS_CORRECT, /* 3086 */ - XML_SCHEMAP_COS_CT_EXTENDS_1_2, /* 3087 */ - XML_SCHEMAP_AU_PROPS_CORRECT, /* 3088 */ - XML_SCHEMAP_A_PROPS_CORRECT_3, /* 3089 */ - XML_SCHEMAP_COS_ALL_LIMITED, /* 3090 */ - XML_MODULE_OPEN = 4900, /* 4900 */ - XML_MODULE_CLOSE, /* 4901 */ - XML_CHECK_FOUND_ELEMENT = 5000, - XML_CHECK_FOUND_ATTRIBUTE, /* 5001 */ - XML_CHECK_FOUND_TEXT, /* 5002 */ - XML_CHECK_FOUND_CDATA, /* 5003 */ - XML_CHECK_FOUND_ENTITYREF, /* 5004 */ - XML_CHECK_FOUND_ENTITY, /* 5005 */ - XML_CHECK_FOUND_PI, /* 5006 */ - XML_CHECK_FOUND_COMMENT, /* 5007 */ - XML_CHECK_FOUND_DOCTYPE, /* 5008 */ - XML_CHECK_FOUND_FRAGMENT, /* 5009 */ - XML_CHECK_FOUND_NOTATION, /* 5010 */ - XML_CHECK_UNKNOWN_NODE, /* 5011 */ - XML_CHECK_ENTITY_TYPE, /* 5012 */ - XML_CHECK_NO_PARENT, /* 5013 */ - XML_CHECK_NO_DOC, /* 5014 */ - XML_CHECK_NO_NAME, /* 5015 */ - XML_CHECK_NO_ELEM, /* 5016 */ - XML_CHECK_WRONG_DOC, /* 5017 */ - XML_CHECK_NO_PREV, /* 5018 */ - XML_CHECK_WRONG_PREV, /* 5019 */ - XML_CHECK_NO_NEXT, /* 5020 */ - XML_CHECK_WRONG_NEXT, /* 5021 */ - XML_CHECK_NOT_DTD, /* 5022 */ - XML_CHECK_NOT_ATTR, /* 5023 */ - XML_CHECK_NOT_ATTR_DECL, /* 5024 */ - XML_CHECK_NOT_ELEM_DECL, /* 5025 */ - XML_CHECK_NOT_ENTITY_DECL, /* 5026 */ - XML_CHECK_NOT_NS_DECL, /* 5027 */ - XML_CHECK_NO_HREF, /* 5028 */ - XML_CHECK_WRONG_PARENT,/* 5029 */ - XML_CHECK_NS_SCOPE, /* 5030 */ - XML_CHECK_NS_ANCESTOR, /* 5031 */ - XML_CHECK_NOT_UTF8, /* 5032 */ - XML_CHECK_NO_DICT, /* 5033 */ - XML_CHECK_NOT_NCNAME, /* 5034 */ - XML_CHECK_OUTSIDE_DICT, /* 5035 */ - XML_CHECK_WRONG_NAME, /* 5036 */ - XML_CHECK_NAME_NOT_NULL, /* 5037 */ - XML_I18N_NO_NAME = 6000, - XML_I18N_NO_HANDLER, /* 6001 */ - XML_I18N_EXCESS_HANDLER, /* 6002 */ - XML_I18N_CONV_FAILED, /* 6003 */ - XML_I18N_NO_OUTPUT /* 6004 */ -#if 0 - XML_CHECK_, /* 5033 */ - XML_CHECK_X /* 503 */ -#endif -} xmlParserErrors; - -/** - * xmlGenericErrorFunc: - * @ctx: a parsing context - * @msg: the message - * @...: the extra arguments of the varags to format the message - * - * Signature of the function to use when there is an error and - * no parsing or validity context available . - */ -typedef void (XMLCDECL *xmlGenericErrorFunc) (void *ctx, - const char *msg, - ...); -/** - * xmlStructuredErrorFunc: - * @userData: user provided data for the error callback - * @error: the error being raised. - * - * Signature of the function to use when there is an error and - * the module handles the new error reporting mechanism. - */ -typedef void (XMLCALL *xmlStructuredErrorFunc) (void *userData, xmlErrorPtr error); - -/* - * Use the following function to reset the two global variables - * xmlGenericError and xmlGenericErrorContext. - */ -XMLPUBFUN void XMLCALL - xmlSetGenericErrorFunc (void *ctx, - xmlGenericErrorFunc handler); -XMLPUBFUN void XMLCALL - initGenericErrorDefaultFunc (xmlGenericErrorFunc *handler); - -XMLPUBFUN void XMLCALL - xmlSetStructuredErrorFunc (void *ctx, - xmlStructuredErrorFunc handler); -/* - * Default message routines used by SAX and Valid context for error - * and warning reporting. - */ -XMLPUBFUN void XMLCDECL - xmlParserError (void *ctx, - const char *msg, - ...); -XMLPUBFUN void XMLCDECL - xmlParserWarning (void *ctx, - const char *msg, - ...); -XMLPUBFUN void XMLCDECL - xmlParserValidityError (void *ctx, - const char *msg, - ...); -XMLPUBFUN void XMLCDECL - xmlParserValidityWarning (void *ctx, - const char *msg, - ...); -XMLPUBFUN void XMLCALL - xmlParserPrintFileInfo (xmlParserInputPtr input); -XMLPUBFUN void XMLCALL - xmlParserPrintFileContext (xmlParserInputPtr input); - -/* - * Extended error information routines - */ -XMLPUBFUN xmlErrorPtr XMLCALL - xmlGetLastError (void); -XMLPUBFUN void XMLCALL - xmlResetLastError (void); -XMLPUBFUN xmlErrorPtr XMLCALL - xmlCtxtGetLastError (void *ctx); -XMLPUBFUN void XMLCALL - xmlCtxtResetLastError (void *ctx); -XMLPUBFUN void XMLCALL - xmlResetError (xmlErrorPtr err); -XMLPUBFUN int XMLCALL - xmlCopyError (xmlErrorPtr from, - xmlErrorPtr to); - -#ifdef IN_LIBXML -/* - * Internal callback reporting routine - */ -XMLPUBFUN void XMLCALL - __xmlRaiseError (xmlStructuredErrorFunc schannel, - xmlGenericErrorFunc channel, - void *data, - void *ctx, - void *node, - int domain, - int code, - xmlErrorLevel level, - const char *file, - int line, - const char *str1, - const char *str2, - const char *str3, - int int1, - int col, - const char *msg, - ...); -XMLPUBFUN void XMLCALL - __xmlSimpleError (int domain, - int code, - xmlNodePtr node, - const char *msg, - const char *extra); -#endif -#ifdef __cplusplus -} -#endif -#endif /* __XML_ERROR_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlexports.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlexports.h deleted file mode 100644 index b83500a412b..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlexports.h +++ /dev/null @@ -1,156 +0,0 @@ -#include "vtk_libxml2_mangle.h" -/* - * Summary: macros for marking symbols as exportable/importable. - * Description: macros for marking symbols as exportable/importable. - * - * Copy: See Copyright for the status of this software. - * - * Author: Igor Zlatovic <igor@zlatkovic.com> - */ - -#ifndef __XML_EXPORTS_H__ -#define __XML_EXPORTS_H__ - -/** - * XMLPUBFUN, XMLPUBVAR, XMLCALL - * - * Macros which declare an exportable function, an exportable variable and - * the calling convention used for functions. - * - * Please use an extra block for every platform/compiler combination when - * modifying this, rather than overlong #ifdef lines. This helps - * readability as well as the fact that different compilers on the same - * platform might need different definitions. - */ - -/** - * XMLPUBFUN: - * - * Macros which declare an exportable function - */ -#define XMLPUBFUN -/** - * XMLPUBVAR: - * - * Macros which declare an exportable variable - */ -#define XMLPUBVAR extern -/** - * XMLCALL: - * - * Macros which declare the called convention for exported functions - */ -#define XMLCALL -/** - * XMLCDECL: - * - * Macro which declares the calling convention for exported functions that - * use '...'. - */ -#define XMLCDECL - -/** DOC_DISABLE */ - -/* Windows platform with MS compiler */ -#if defined(_WIN32) && defined(_MSC_VER) - #undef XMLPUBFUN - #undef XMLPUBVAR - #undef XMLCALL - #undef XMLCDECL - #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) - #define XMLPUBFUN __declspec(dllexport) - #define XMLPUBVAR __declspec(dllexport) - #else - #define XMLPUBFUN - #if !defined(LIBXML_STATIC) - #define XMLPUBVAR __declspec(dllimport) extern - #else - #define XMLPUBVAR extern - #endif - #endif - #if defined(LIBXML_FASTCALL) - #define XMLCALL __fastcall - #else - #define XMLCALL __cdecl - #endif - #define XMLCDECL __cdecl - #if !defined _REENTRANT - #define _REENTRANT - #endif -#endif - -/* Windows platform with Borland compiler */ -#if defined(_WIN32) && defined(__BORLANDC__) - #undef XMLPUBFUN - #undef XMLPUBVAR - #undef XMLCALL - #undef XMLCDECL - #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) - #define XMLPUBFUN __declspec(dllexport) - #define XMLPUBVAR __declspec(dllexport) extern - #else - #define XMLPUBFUN - #if !defined(LIBXML_STATIC) - #define XMLPUBVAR __declspec(dllimport) extern - #else - #define XMLPUBVAR extern - #endif - #endif - #define XMLCALL __cdecl - #define XMLCDECL __cdecl - #if !defined _REENTRANT - #define _REENTRANT - #endif -#endif - -/* Windows platform with GNU compiler (Mingw) */ -#if defined(_WIN32) && defined(__MINGW32__) - #undef XMLPUBFUN - #undef XMLPUBVAR - #undef XMLCALL - #undef XMLCDECL - #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) - #define XMLPUBFUN __declspec(dllexport) - #define XMLPUBVAR __declspec(dllexport) - #else - #define XMLPUBFUN - #if !defined(LIBXML_STATIC) - #define XMLPUBVAR __declspec(dllimport) extern - #else - #define XMLPUBVAR extern - #endif - #endif - #define XMLCALL __cdecl - #define XMLCDECL __cdecl - #if !defined _REENTRANT - #define _REENTRANT - #endif -#endif - -/* Cygwin platform, GNU compiler */ -#if defined(_WIN32) && defined(__CYGWIN__) - #undef XMLPUBFUN - #undef XMLPUBVAR - #undef XMLCALL - #undef XMLCDECL - #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) - #define XMLPUBFUN __declspec(dllexport) - #define XMLPUBVAR __declspec(dllexport) - #else - #define XMLPUBFUN - #if !defined(LIBXML_STATIC) - #define XMLPUBVAR __declspec(dllimport) extern - #else - #define XMLPUBVAR extern - #endif - #endif - #define XMLCALL __cdecl - #define XMLCDECL __cdecl -#endif - -/* Compatibility */ -#if !defined(LIBXML_DLL_IMPORT) -#define LIBXML_DLL_IMPORT XMLPUBVAR -#endif - -#endif /* __XML_EXPORTS_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlmemory.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlmemory.h deleted file mode 100644 index f6078048314..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlmemory.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Summary: interface for the memory allocator - * Description: provides interfaces for the memory allocator, - * including debugging capabilities. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - - -#ifndef __DEBUG_MEMORY_ALLOC__ -#define __DEBUG_MEMORY_ALLOC__ - -#include <stdio.h> -#include "xmlversion.h" - -/** - * DEBUG_MEMORY: - * - * DEBUG_MEMORY replaces the allocator with a collect and debug - * shell to the libc allocator. - * DEBUG_MEMORY should only be activated when debugging - * libxml i.e. if libxml has been configured with --with-debug-mem too. - */ -/* #define DEBUG_MEMORY_FREED */ -/* #define DEBUG_MEMORY_LOCATION */ - -#ifdef DEBUG -#ifndef DEBUG_MEMORY -#define DEBUG_MEMORY -#endif -#endif - -/** - * DEBUG_MEMORY_LOCATION: - * - * DEBUG_MEMORY_LOCATION should be activated only when debugging - * libxml i.e. if libxml has been configured with --with-debug-mem too. - */ -#ifdef DEBUG_MEMORY_LOCATION -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * The XML memory wrapper support 4 basic overloadable functions. - */ -/** - * xmlFreeFunc: - * @mem: an already allocated block of memory - * - * Signature for a free() implementation. - */ -typedef void (XMLCALL *xmlFreeFunc)(void *mem); -/** - * xmlMallocFunc: - * @size: the size requested in bytes - * - * Signature for a malloc() implementation. - * - * Returns a pointer to the newly allocated block or NULL in case of error. - */ -typedef void *(XMLCALL *xmlMallocFunc)(size_t size); - -/** - * xmlReallocFunc: - * @mem: an already allocated block of memory - * @size: the new size requested in bytes - * - * Signature for a realloc() implementation. - * - * Returns a pointer to the newly reallocated block or NULL in case of error. - */ -typedef void *(XMLCALL *xmlReallocFunc)(void *mem, size_t size); - -/** - * xmlStrdupFunc: - * @str: a zero terminated string - * - * Signature for an strdup() implementation. - * - * Returns the copy of the string or NULL in case of error. - */ -typedef char *(XMLCALL *xmlStrdupFunc)(const char *str); - -/* - * The 4 interfaces used for all memory handling within libxml. -LIBXML_DLL_IMPORT extern xmlFreeFunc xmlFree; -LIBXML_DLL_IMPORT extern xmlMallocFunc xmlMalloc; -LIBXML_DLL_IMPORT extern xmlMallocFunc xmlMallocAtomic; -LIBXML_DLL_IMPORT extern xmlReallocFunc xmlRealloc; -LIBXML_DLL_IMPORT extern xmlStrdupFunc xmlMemStrdup; - */ - -/* - * The way to overload the existing functions. - * The xmlGc function have an extra entry for atomic block - * allocations useful for garbage collected memory allocators - */ -XMLPUBFUN int XMLCALL - xmlMemSetup (xmlFreeFunc freeFunc, - xmlMallocFunc mallocFunc, - xmlReallocFunc reallocFunc, - xmlStrdupFunc strdupFunc); -XMLPUBFUN int XMLCALL - xmlMemGet (xmlFreeFunc *freeFunc, - xmlMallocFunc *mallocFunc, - xmlReallocFunc *reallocFunc, - xmlStrdupFunc *strdupFunc); -XMLPUBFUN int XMLCALL - xmlGcMemSetup (xmlFreeFunc freeFunc, - xmlMallocFunc mallocFunc, - xmlMallocFunc mallocAtomicFunc, - xmlReallocFunc reallocFunc, - xmlStrdupFunc strdupFunc); -XMLPUBFUN int XMLCALL - xmlGcMemGet (xmlFreeFunc *freeFunc, - xmlMallocFunc *mallocFunc, - xmlMallocFunc *mallocAtomicFunc, - xmlReallocFunc *reallocFunc, - xmlStrdupFunc *strdupFunc); - -/* - * Initialization of the memory layer. - */ -XMLPUBFUN int XMLCALL - xmlInitMemory (void); - -/* - * Cleanup of the memory layer. - */ -XMLPUBFUN void XMLCALL - xmlCleanupMemory (void); -/* - * These are specific to the XML debug memory wrapper. - */ -XMLPUBFUN int XMLCALL - xmlMemUsed (void); -XMLPUBFUN int XMLCALL - xmlMemBlocks (void); -XMLPUBFUN void XMLCALL - xmlMemDisplay (FILE *fp); -XMLPUBFUN void XMLCALL - xmlMemShow (FILE *fp, int nr); -XMLPUBFUN void XMLCALL - xmlMemoryDump (void); -XMLPUBFUN void * XMLCALL - xmlMemMalloc (size_t size); -XMLPUBFUN void * XMLCALL - xmlMemRealloc (void *ptr,size_t size); -XMLPUBFUN void XMLCALL - xmlMemFree (void *ptr); -XMLPUBFUN char * XMLCALL - xmlMemoryStrdup (const char *str); -XMLPUBFUN void * XMLCALL - xmlMallocLoc (size_t size, const char *file, int line); -XMLPUBFUN void * XMLCALL - xmlReallocLoc (void *ptr, size_t size, const char *file, int line); -XMLPUBFUN void * XMLCALL - xmlMallocAtomicLoc (size_t size, const char *file, int line); -XMLPUBFUN char * XMLCALL - xmlMemStrdupLoc (const char *str, const char *file, int line); - - -#ifdef DEBUG_MEMORY_LOCATION -/** - * xmlMalloc: - * @size: number of bytes to allocate - * - * Wrapper for the malloc() function used in the XML library. - * - * Returns the pointer to the allocated area or NULL in case of error. - */ -#define xmlMalloc(size) xmlMallocLoc((size), __FILE__, __LINE__) -/** - * xmlMallocAtomic: - * @size: number of bytes to allocate - * - * Wrapper for the malloc() function used in the XML library for allocation - * of block not containing pointers to other areas. - * - * Returns the pointer to the allocated area or NULL in case of error. - */ -#define xmlMallocAtomic(size) xmlMallocAtomicLoc((size), __FILE__, __LINE__) -/** - * xmlRealloc: - * @ptr: pointer to the existing allocated area - * @size: number of bytes to allocate - * - * Wrapper for the realloc() function used in the XML library. - * - * Returns the pointer to the allocated area or NULL in case of error. - */ -#define xmlRealloc(ptr, size) xmlReallocLoc((ptr), (size), __FILE__, __LINE__) -/** - * xmlMemStrdup: - * @str: pointer to the existing string - * - * Wrapper for the strdup() function, xmlStrdup() is usually preferred. - * - * Returns the pointer to the allocated area or NULL in case of error. - */ -#define xmlMemStrdup(str) xmlMemStrdupLoc((str), __FILE__, __LINE__) - -#endif /* DEBUG_MEMORY_LOCATION */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#ifndef __XML_GLOBALS_H -#ifndef __XML_THREADS_H__ -#include "threads.h" -#include "globals.h" -#endif -#endif - -#endif /* __DEBUG_MEMORY_ALLOC__ */ - diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlmodule.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlmodule.h deleted file mode 100644 index f266bc4cda8..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlmodule.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Summary: dynamic module loading - * Description: basic API for dynamic module loading, used by - * libexslt added in 2.6.17 - * - * Copy: See Copyright for the status of this software. - * - * Author: Joel W. Reed - */ - -#ifndef __XML_MODULE_H__ -#define __XML_MODULE_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_MODULES_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlModulePtr: - * - * A handle to a dynamically loaded module - */ -typedef struct _xmlModule xmlModule; -typedef xmlModule *xmlModulePtr; - -/** - * xmlModuleOption: - * - * enumeration of options that can be passed down to xmlModuleOpen() - */ -typedef enum { - XML_MODULE_LAZY = 1, /* lazy binding */ - XML_MODULE_LOCAL= 2 /* local binding */ -} xmlModuleOption; - -XMLPUBFUN xmlModulePtr XMLCALL xmlModuleOpen (const char *filename, - int options); - -XMLPUBFUN int XMLCALL xmlModuleSymbol (xmlModulePtr module, - const char* name, - void **result); - -XMLPUBFUN int XMLCALL xmlModuleClose (xmlModulePtr module); - -XMLPUBFUN int XMLCALL xmlModuleFree (xmlModulePtr module); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_MODULES_ENABLED */ - -#endif /*__XML_MODULE_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlreader.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlreader.h deleted file mode 100644 index 941e530b659..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlreader.h +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Summary: the XMLReader implementation - * Description: API of the XML streaming API based on C# interfaces. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_XMLREADER_H__ -#define __XML_XMLREADER_H__ - -#include "xmlversion.h" -#include "tree.h" -#include "xmlIO.h" -#ifdef LIBXML_SCHEMAS_ENABLED -#include "relaxng.h" -#include "xmlschemas.h" -#endif - -#ifdef LIBXML_READER_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlTextReaderMode: - * - * Internal state values for the reader. - */ -typedef enum { - XML_TEXTREADER_MODE_INITIAL = 0, - XML_TEXTREADER_MODE_INTERACTIVE = 1, - XML_TEXTREADER_MODE_ERROR = 2, - XML_TEXTREADER_MODE_EOF =3, - XML_TEXTREADER_MODE_CLOSED = 4, - XML_TEXTREADER_MODE_READING = 5 -} xmlTextReaderMode; - -/** - * xmlParserProperties: - * - * Some common options to use with xmlTextReaderSetParserProp, but it - * is better to use xmlParserOption and the xmlReaderNewxxx and - * xmlReaderForxxx APIs now. - */ -typedef enum { - XML_PARSER_LOADDTD = 1, - XML_PARSER_DEFAULTATTRS = 2, - XML_PARSER_VALIDATE = 3, - XML_PARSER_SUBST_ENTITIES = 4 -} xmlParserProperties; - -/** - * xmlParserSeverities: - * - * How severe an error callback is when the per-reader error callback API - * is used. - */ -typedef enum { - XML_PARSER_SEVERITY_VALIDITY_WARNING = 1, - XML_PARSER_SEVERITY_VALIDITY_ERROR = 2, - XML_PARSER_SEVERITY_WARNING = 3, - XML_PARSER_SEVERITY_ERROR = 4 -} xmlParserSeverities; - -/** - * xmlReaderTypes: - * - * Predefined constants for the different types of nodes. - */ -typedef enum { - XML_READER_TYPE_NONE = 0, - XML_READER_TYPE_ELEMENT = 1, - XML_READER_TYPE_ATTRIBUTE = 2, - XML_READER_TYPE_TEXT = 3, - XML_READER_TYPE_CDATA = 4, - XML_READER_TYPE_ENTITY_REFERENCE = 5, - XML_READER_TYPE_ENTITY = 6, - XML_READER_TYPE_PROCESSING_INSTRUCTION = 7, - XML_READER_TYPE_COMMENT = 8, - XML_READER_TYPE_DOCUMENT = 9, - XML_READER_TYPE_DOCUMENT_TYPE = 10, - XML_READER_TYPE_DOCUMENT_FRAGMENT = 11, - XML_READER_TYPE_NOTATION = 12, - XML_READER_TYPE_WHITESPACE = 13, - XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14, - XML_READER_TYPE_END_ELEMENT = 15, - XML_READER_TYPE_END_ENTITY = 16, - XML_READER_TYPE_XML_DECLARATION = 17 -} xmlReaderTypes; - -/** - * xmlTextReader: - * - * Structure for an xmlReader context. - */ -typedef struct _xmlTextReader xmlTextReader; - -/** - * xmlTextReaderPtr: - * - * Pointer to an xmlReader context. - */ -typedef xmlTextReader *xmlTextReaderPtr; - -/* - * Constructors & Destructor - */ -XMLPUBFUN xmlTextReaderPtr XMLCALL - xmlNewTextReader (xmlParserInputBufferPtr input, - const char *URI); -XMLPUBFUN xmlTextReaderPtr XMLCALL - xmlNewTextReaderFilename(const char *URI); -XMLPUBFUN void XMLCALL - xmlFreeTextReader (xmlTextReaderPtr reader); - -/* - * Iterators - */ -XMLPUBFUN int XMLCALL - xmlTextReaderRead (xmlTextReaderPtr reader); - -#ifdef LIBXML_WRITER_ENABLED -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderReadInnerXml (xmlTextReaderPtr reader); - -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderReadOuterXml (xmlTextReaderPtr reader); -#endif - -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderReadString (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderReadAttributeValue (xmlTextReaderPtr reader); - -/* - * Attributes of the node - */ -XMLPUBFUN int XMLCALL - xmlTextReaderAttributeCount(xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderDepth (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderHasAttributes(xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderHasValue(xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderIsDefault (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderNodeType (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderQuoteChar (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderReadState (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader); - -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstBaseUri (xmlTextReaderPtr reader); -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstLocalName (xmlTextReaderPtr reader); -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstName (xmlTextReaderPtr reader); -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader); -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstPrefix (xmlTextReaderPtr reader); -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstXmlLang (xmlTextReaderPtr reader); -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstString (xmlTextReaderPtr reader, - const xmlChar *str); -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstValue (xmlTextReaderPtr reader); - -/* - * use the Const version of the routine for - * better performance and simpler code - */ -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderBaseUri (xmlTextReaderPtr reader); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderLocalName (xmlTextReaderPtr reader); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderName (xmlTextReaderPtr reader); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderNamespaceUri(xmlTextReaderPtr reader); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderPrefix (xmlTextReaderPtr reader); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderXmlLang (xmlTextReaderPtr reader); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderValue (xmlTextReaderPtr reader); - -/* - * Methods of the XmlTextReader - */ -XMLPUBFUN int XMLCALL - xmlTextReaderClose (xmlTextReaderPtr reader); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderGetAttributeNo (xmlTextReaderPtr reader, - int no); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderGetAttribute (xmlTextReaderPtr reader, - const xmlChar *name); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderGetAttributeNs (xmlTextReaderPtr reader, - const xmlChar *localName, - const xmlChar *namespaceURI); -XMLPUBFUN xmlParserInputBufferPtr XMLCALL - xmlTextReaderGetRemainder (xmlTextReaderPtr reader); -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderLookupNamespace(xmlTextReaderPtr reader, - const xmlChar *prefix); -XMLPUBFUN int XMLCALL - xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, - int no); -XMLPUBFUN int XMLCALL - xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader, - const xmlChar *name); -XMLPUBFUN int XMLCALL - xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader, - const xmlChar *localName, - const xmlChar *namespaceURI); -XMLPUBFUN int XMLCALL - xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderMoveToElement (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderNormalization (xmlTextReaderPtr reader); -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstEncoding (xmlTextReaderPtr reader); - -/* - * Extensions - */ -XMLPUBFUN int XMLCALL - xmlTextReaderSetParserProp (xmlTextReaderPtr reader, - int prop, - int value); -XMLPUBFUN int XMLCALL - xmlTextReaderGetParserProp (xmlTextReaderPtr reader, - int prop); -XMLPUBFUN xmlNodePtr XMLCALL - xmlTextReaderCurrentNode (xmlTextReaderPtr reader); - -XMLPUBFUN int XMLCALL - xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader); - -XMLPUBFUN int XMLCALL - xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader); - -XMLPUBFUN xmlNodePtr XMLCALL - xmlTextReaderPreserve (xmlTextReaderPtr reader); -#ifdef LIBXML_PATTERN_ENABLED -XMLPUBFUN int XMLCALL - xmlTextReaderPreservePattern(xmlTextReaderPtr reader, - const xmlChar *pattern, - const xmlChar **namespaces); -#endif /* LIBXML_PATTERN_ENABLED */ -XMLPUBFUN xmlDocPtr XMLCALL - xmlTextReaderCurrentDoc (xmlTextReaderPtr reader); -XMLPUBFUN xmlNodePtr XMLCALL - xmlTextReaderExpand (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderNext (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderNextSibling (xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderIsValid (xmlTextReaderPtr reader); -#ifdef LIBXML_SCHEMAS_ENABLED -XMLPUBFUN int XMLCALL - xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, - const char *rng); -XMLPUBFUN int XMLCALL - xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, - xmlRelaxNGPtr schema); -XMLPUBFUN int XMLCALL - xmlTextReaderSchemaValidate (xmlTextReaderPtr reader, - const char *xsd); -XMLPUBFUN int XMLCALL - xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader, - xmlSchemaValidCtxtPtr ctxt, - int options); -XMLPUBFUN int XMLCALL - xmlTextReaderSetSchema (xmlTextReaderPtr reader, - xmlSchemaPtr schema); -#endif -XMLPUBFUN const xmlChar * XMLCALL - xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader); -XMLPUBFUN int XMLCALL - xmlTextReaderStandalone (xmlTextReaderPtr reader); - - -/* - * Index lookup - */ -XMLPUBFUN long XMLCALL - xmlTextReaderByteConsumed (xmlTextReaderPtr reader); - -/* - * New more complete APIs for simpler creation and reuse of readers - */ -XMLPUBFUN xmlTextReaderPtr XMLCALL - xmlReaderWalker (xmlDocPtr doc); -XMLPUBFUN xmlTextReaderPtr XMLCALL - xmlReaderForDoc (const xmlChar * cur, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlTextReaderPtr XMLCALL - xmlReaderForFile (const char *filename, - const char *encoding, - int options); -XMLPUBFUN xmlTextReaderPtr XMLCALL - xmlReaderForMemory (const char *buffer, - int size, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlTextReaderPtr XMLCALL - xmlReaderForFd (int fd, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN xmlTextReaderPtr XMLCALL - xmlReaderForIO (xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, - void *ioctx, - const char *URL, - const char *encoding, - int options); - -XMLPUBFUN int XMLCALL - xmlReaderNewWalker (xmlTextReaderPtr reader, - xmlDocPtr doc); -XMLPUBFUN int XMLCALL - xmlReaderNewDoc (xmlTextReaderPtr reader, - const xmlChar * cur, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN int XMLCALL - xmlReaderNewFile (xmlTextReaderPtr reader, - const char *filename, - const char *encoding, - int options); -XMLPUBFUN int XMLCALL - xmlReaderNewMemory (xmlTextReaderPtr reader, - const char *buffer, - int size, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN int XMLCALL - xmlReaderNewFd (xmlTextReaderPtr reader, - int fd, - const char *URL, - const char *encoding, - int options); -XMLPUBFUN int XMLCALL - xmlReaderNewIO (xmlTextReaderPtr reader, - xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, - void *ioctx, - const char *URL, - const char *encoding, - int options); -/* - * Error handling extensions - */ -typedef void * xmlTextReaderLocatorPtr; -typedef void (XMLCALL *xmlTextReaderErrorFunc) (void *arg, - const char *msg, - xmlParserSeverities severity, - xmlTextReaderLocatorPtr locator); -XMLPUBFUN int XMLCALL - xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator); -/*int xmlTextReaderLocatorLinePosition(xmlTextReaderLocatorPtr locator);*/ -XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderLocatorBaseURI (xmlTextReaderLocatorPtr locator); -XMLPUBFUN void XMLCALL - xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, - xmlTextReaderErrorFunc f, - void *arg); -XMLPUBFUN void XMLCALL - xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, - xmlStructuredErrorFunc f, - void *arg); -XMLPUBFUN void XMLCALL - xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, - xmlTextReaderErrorFunc *f, - void **arg); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_READER_ENABLED */ - -#endif /* __XML_XMLREADER_H__ */ - diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlregexp.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlregexp.h deleted file mode 100644 index fce21505be2..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlregexp.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Summary: regular expressions handling - * Description: basic API for libxml regular expressions handling used - * for XML Schemas and validation. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_REGEXP_H__ -#define __XML_REGEXP_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_REGEXP_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlRegexpPtr: - * - * A libxml regular expression, they can actually be far more complex - * thank the POSIX regex expressions. - */ -typedef struct _xmlRegexp xmlRegexp; -typedef xmlRegexp *xmlRegexpPtr; - -/** - * xmlRegExecCtxtPtr: - * - * A libxml progressive regular expression evaluation context - */ -typedef struct _xmlRegExecCtxt xmlRegExecCtxt; -typedef xmlRegExecCtxt *xmlRegExecCtxtPtr; - -#ifdef __cplusplus -} -#endif -#include "tree.h" -#include "dict.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* - * The POSIX like API - */ -XMLPUBFUN xmlRegexpPtr XMLCALL - xmlRegexpCompile (const xmlChar *regexp); -XMLPUBFUN void XMLCALL xmlRegFreeRegexp(xmlRegexpPtr regexp); -XMLPUBFUN int XMLCALL - xmlRegexpExec (xmlRegexpPtr comp, - const xmlChar *value); -XMLPUBFUN void XMLCALL - xmlRegexpPrint (FILE *output, - xmlRegexpPtr regexp); -XMLPUBFUN int XMLCALL - xmlRegexpIsDeterminist(xmlRegexpPtr comp); - -/* - * Callback function when doing a transition in the automata - */ -typedef void (*xmlRegExecCallbacks) (xmlRegExecCtxtPtr exec, - const xmlChar *token, - void *transdata, - void *inputdata); - -/* - * The progressive API - */ -XMLPUBFUN xmlRegExecCtxtPtr XMLCALL - xmlRegNewExecCtxt (xmlRegexpPtr comp, - xmlRegExecCallbacks callback, - void *data); -XMLPUBFUN void XMLCALL - xmlRegFreeExecCtxt (xmlRegExecCtxtPtr exec); -XMLPUBFUN int XMLCALL - xmlRegExecPushString(xmlRegExecCtxtPtr exec, - const xmlChar *value, - void *data); -XMLPUBFUN int XMLCALL - xmlRegExecPushString2(xmlRegExecCtxtPtr exec, - const xmlChar *value, - const xmlChar *value2, - void *data); - -XMLPUBFUN int XMLCALL - xmlRegExecNextValues(xmlRegExecCtxtPtr exec, - int *nbval, - int *nbneg, - xmlChar **values, - int *terminal); -XMLPUBFUN int XMLCALL - xmlRegExecErrInfo (xmlRegExecCtxtPtr exec, - const xmlChar **string, - int *nbval, - int *nbneg, - xmlChar **values, - int *terminal); -#ifdef LIBXML_EXPR_ENABLED -/* - * Formal regular expression handling - * Its goal is to do some formal work on content models - */ - -/* expressions are used within a context */ -typedef struct _xmlExpCtxt xmlExpCtxt; -typedef xmlExpCtxt *xmlExpCtxtPtr; - -XMLPUBFUN void XMLCALL - xmlExpFreeCtxt (xmlExpCtxtPtr ctxt); -XMLPUBFUN xmlExpCtxtPtr XMLCALL - xmlExpNewCtxt (int maxNodes, - xmlDictPtr dict); - -XMLPUBFUN int XMLCALL - xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt); - -/* Expressions are trees but the tree is opaque */ -typedef struct _xmlExpNode xmlExpNode; -typedef xmlExpNode *xmlExpNodePtr; - -typedef enum { - XML_EXP_EMPTY = 0, - XML_EXP_FORBID = 1, - XML_EXP_ATOM = 2, - XML_EXP_SEQ = 3, - XML_EXP_OR = 4, - XML_EXP_COUNT = 5 -} xmlExpNodeType; - -/* - * 2 core expressions shared by all for the empty language set - * and for the set with just the empty token - */ -XMLPUBVAR xmlExpNodePtr forbiddenExp; -XMLPUBVAR xmlExpNodePtr emptyExp; - -/* - * Expressions are reference counted internally - */ -XMLPUBFUN void XMLCALL - xmlExpFree (xmlExpCtxtPtr ctxt, - xmlExpNodePtr expr); -XMLPUBFUN void XMLCALL - xmlExpRef (xmlExpNodePtr expr); - -/* - * constructors can be either manual or from a string - */ -XMLPUBFUN xmlExpNodePtr XMLCALL - xmlExpParse (xmlExpCtxtPtr ctxt, - const char *expr); -XMLPUBFUN xmlExpNodePtr XMLCALL - xmlExpNewAtom (xmlExpCtxtPtr ctxt, - const xmlChar *name, - int len); -XMLPUBFUN xmlExpNodePtr XMLCALL - xmlExpNewOr (xmlExpCtxtPtr ctxt, - xmlExpNodePtr left, - xmlExpNodePtr right); -XMLPUBFUN xmlExpNodePtr XMLCALL - xmlExpNewSeq (xmlExpCtxtPtr ctxt, - xmlExpNodePtr left, - xmlExpNodePtr right); -XMLPUBFUN xmlExpNodePtr XMLCALL - xmlExpNewRange (xmlExpCtxtPtr ctxt, - xmlExpNodePtr subset, - int min, - int max); -/* - * The really interesting APIs - */ -XMLPUBFUN int XMLCALL - xmlExpIsNillable(xmlExpNodePtr expr); -XMLPUBFUN int XMLCALL - xmlExpMaxToken (xmlExpNodePtr expr); -XMLPUBFUN int XMLCALL - xmlExpGetLanguage(xmlExpCtxtPtr ctxt, - xmlExpNodePtr expr, - const xmlChar**langList, - int len); -XMLPUBFUN int XMLCALL - xmlExpGetStart (xmlExpCtxtPtr ctxt, - xmlExpNodePtr expr, - const xmlChar**tokList, - int len); -XMLPUBFUN xmlExpNodePtr XMLCALL - xmlExpStringDerive(xmlExpCtxtPtr ctxt, - xmlExpNodePtr expr, - const xmlChar *str, - int len); -XMLPUBFUN xmlExpNodePtr XMLCALL - xmlExpExpDerive (xmlExpCtxtPtr ctxt, - xmlExpNodePtr expr, - xmlExpNodePtr sub); -XMLPUBFUN int XMLCALL - xmlExpSubsume (xmlExpCtxtPtr ctxt, - xmlExpNodePtr expr, - xmlExpNodePtr sub); -XMLPUBFUN void XMLCALL - xmlExpDump (xmlBufferPtr buf, - xmlExpNodePtr expr); -#endif /* LIBXML_EXPR_ENABLED */ -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_REGEXP_ENABLED */ - -#endif /*__XML_REGEXP_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlsave.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlsave.h deleted file mode 100644 index c4f9041a031..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlsave.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Summary: the XML document serializer - * Description: API to save document or subtree of document - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_XMLSAVE_H__ -#define __XML_XMLSAVE_H__ - -#include "xmlversion.h" -#include "tree.h" -#include "encoding.h" -#include "xmlIO.h" - -#ifdef LIBXML_OUTPUT_ENABLED -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlSaveOption: - * - * This is the set of XML save options that can be passed down - * to the xmlSaveToFd() and similar calls. - */ -typedef enum { - XML_SAVE_FORMAT = 1<<0, /* format save output */ - XML_SAVE_NO_DECL = 1<<1, /* drop the xml declaration */ - XML_SAVE_NO_EMPTY = 1<<2, /* no empty tags */ - XML_SAVE_NO_XHTML = 1<<3 /* disable XHTML1 specific rules */ -} xmlSaveOption; - - -typedef struct _xmlSaveCtxt xmlSaveCtxt; -typedef xmlSaveCtxt *xmlSaveCtxtPtr; - -XMLPUBFUN xmlSaveCtxtPtr XMLCALL - xmlSaveToFd (int fd, - const char *encoding, - int options); -XMLPUBFUN xmlSaveCtxtPtr XMLCALL - xmlSaveToFilename (const char *filename, - const char *encoding, - int options); - -XMLPUBFUN xmlSaveCtxtPtr XMLCALL - xmlSaveToBuffer (xmlBufferPtr buffer, - const char *encoding, - int options); - -XMLPUBFUN xmlSaveCtxtPtr XMLCALL - xmlSaveToIO (xmlOutputWriteCallback iowrite, - xmlOutputCloseCallback ioclose, - void *ioctx, - const char *encoding, - int options); - -XMLPUBFUN long XMLCALL - xmlSaveDoc (xmlSaveCtxtPtr ctxt, - xmlDocPtr doc); -XMLPUBFUN long XMLCALL - xmlSaveTree (xmlSaveCtxtPtr ctxt, - xmlNodePtr node); - -XMLPUBFUN int XMLCALL - xmlSaveFlush (xmlSaveCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlSaveClose (xmlSaveCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlSaveSetEscape (xmlSaveCtxtPtr ctxt, - xmlCharEncodingOutputFunc escape); -XMLPUBFUN int XMLCALL - xmlSaveSetAttrEscape (xmlSaveCtxtPtr ctxt, - xmlCharEncodingOutputFunc escape); -#ifdef __cplusplus -} -#endif -#endif /* LIBXML_OUTPUT_ENABLED */ -#endif /* __XML_XMLSAVE_H__ */ - - diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlschemas.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlschemas.h deleted file mode 100644 index 39915322a15..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlschemas.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Summary: incomplete XML Schemas structure implementation - * Description: interface to the XML Schemas handling and schema validity - * checking, it is incomplete right now. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - - -#ifndef __XML_SCHEMA_H__ -#define __XML_SCHEMA_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_SCHEMAS_ENABLED - -#include "tree.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * This error codes are obsolete; not used any more. - */ -typedef enum { - XML_SCHEMAS_ERR_OK = 0, - XML_SCHEMAS_ERR_NOROOT = 1, - XML_SCHEMAS_ERR_UNDECLAREDELEM, - XML_SCHEMAS_ERR_NOTTOPLEVEL, - XML_SCHEMAS_ERR_MISSING, - XML_SCHEMAS_ERR_WRONGELEM, - XML_SCHEMAS_ERR_NOTYPE, - XML_SCHEMAS_ERR_NOROLLBACK, - XML_SCHEMAS_ERR_ISABSTRACT, - XML_SCHEMAS_ERR_NOTEMPTY, - XML_SCHEMAS_ERR_ELEMCONT, - XML_SCHEMAS_ERR_HAVEDEFAULT, - XML_SCHEMAS_ERR_NOTNILLABLE, - XML_SCHEMAS_ERR_EXTRACONTENT, - XML_SCHEMAS_ERR_INVALIDATTR, - XML_SCHEMAS_ERR_INVALIDELEM, - XML_SCHEMAS_ERR_NOTDETERMINIST, - XML_SCHEMAS_ERR_CONSTRUCT, - XML_SCHEMAS_ERR_INTERNAL, - XML_SCHEMAS_ERR_NOTSIMPLE, - XML_SCHEMAS_ERR_ATTRUNKNOWN, - XML_SCHEMAS_ERR_ATTRINVALID, - XML_SCHEMAS_ERR_VALUE, - XML_SCHEMAS_ERR_FACET, - XML_SCHEMAS_ERR_, - XML_SCHEMAS_ERR_XXX -} xmlSchemaValidError; - -/* -* ATTENTION: Change xmlSchemaSetValidOptions's check -* for invalid values, if adding to the validation -* options below. -*/ -/** - * xmlSchemaValidOption: - * - * This is the set of XML Schema validation options. - */ -typedef enum { - XML_SCHEMA_VAL_VC_I_CREATE = 1<<0 - /* Default/fixed: create an attribute node - * or an element's text node on the instance. - */ -} xmlSchemaValidOption; - -/* - XML_SCHEMA_VAL_XSI_ASSEMBLE = 1<<1, - * assemble schemata using - * xsi:schemaLocation and - * xsi:noNamespaceSchemaLocation -*/ - -/** - * The schemas related types are kept internal - */ -typedef struct _xmlSchema xmlSchema; -typedef xmlSchema *xmlSchemaPtr; - -/** - * A schemas validation context - */ -typedef void (XMLCDECL *xmlSchemaValidityErrorFunc) (void *ctx, const char *msg, ...); -typedef void (XMLCDECL *xmlSchemaValidityWarningFunc) (void *ctx, const char *msg, ...); - -typedef struct _xmlSchemaParserCtxt xmlSchemaParserCtxt; -typedef xmlSchemaParserCtxt *xmlSchemaParserCtxtPtr; - -typedef struct _xmlSchemaValidCtxt xmlSchemaValidCtxt; -typedef xmlSchemaValidCtxt *xmlSchemaValidCtxtPtr; - -/* - * Interfaces for parsing. - */ -XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL - xmlSchemaNewParserCtxt (const char *URL); -XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL - xmlSchemaNewMemParserCtxt (const char *buffer, - int size); -XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL - xmlSchemaNewDocParserCtxt (xmlDocPtr doc); -XMLPUBFUN void XMLCALL - xmlSchemaFreeParserCtxt (xmlSchemaParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlSchemaSetParserErrors (xmlSchemaParserCtxtPtr ctxt, - xmlSchemaValidityErrorFunc err, - xmlSchemaValidityWarningFunc warn, - void *ctx); -XMLPUBFUN void XMLCALL - xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt, - xmlStructuredErrorFunc serror, - void *ctx); -XMLPUBFUN int XMLCALL - xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaValidityErrorFunc * err, - xmlSchemaValidityWarningFunc * warn, - void **ctx); -XMLPUBFUN int XMLCALL - xmlSchemaIsValid (xmlSchemaValidCtxtPtr ctxt); - -XMLPUBFUN xmlSchemaPtr XMLCALL - xmlSchemaParse (xmlSchemaParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL - xmlSchemaFree (xmlSchemaPtr schema); -#ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL - xmlSchemaDump (FILE *output, - xmlSchemaPtr schema); -#endif /* LIBXML_OUTPUT_ENABLED */ -/* - * Interfaces for validating - */ -XMLPUBFUN void XMLCALL - xmlSchemaSetValidErrors (xmlSchemaValidCtxtPtr ctxt, - xmlSchemaValidityErrorFunc err, - xmlSchemaValidityWarningFunc warn, - void *ctx); -XMLPUBFUN void XMLCALL - xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt, - xmlStructuredErrorFunc serror, - void *ctx); -XMLPUBFUN int XMLCALL - xmlSchemaGetValidErrors (xmlSchemaValidCtxtPtr ctxt, - xmlSchemaValidityErrorFunc *err, - xmlSchemaValidityWarningFunc *warn, - void **ctx); -XMLPUBFUN int XMLCALL - xmlSchemaSetValidOptions (xmlSchemaValidCtxtPtr ctxt, - int options); -XMLPUBFUN int XMLCALL - xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt); - -XMLPUBFUN xmlSchemaValidCtxtPtr XMLCALL - xmlSchemaNewValidCtxt (xmlSchemaPtr schema); -XMLPUBFUN void XMLCALL - xmlSchemaFreeValidCtxt (xmlSchemaValidCtxtPtr ctxt); -XMLPUBFUN int XMLCALL - xmlSchemaValidateDoc (xmlSchemaValidCtxtPtr ctxt, - xmlDocPtr instance); -XMLPUBFUN int XMLCALL - xmlSchemaValidateOneElement (xmlSchemaValidCtxtPtr ctxt, - xmlNodePtr elem); -XMLPUBFUN int XMLCALL - xmlSchemaValidateStream (xmlSchemaValidCtxtPtr ctxt, - xmlParserInputBufferPtr input, - xmlCharEncoding enc, - xmlSAXHandlerPtr sax, - void *user_data); -XMLPUBFUN int XMLCALL - xmlSchemaValidateFile (xmlSchemaValidCtxtPtr ctxt, - const char * filename, - int options); - -/* - * Interface to insert Schemas SAX velidation in a SAX stream - */ -typedef struct _xmlSchemaSAXPlug xmlSchemaSAXPlugStruct; -typedef xmlSchemaSAXPlugStruct *xmlSchemaSAXPlugPtr; - -XMLPUBFUN xmlSchemaSAXPlugPtr XMLCALL - xmlSchemaSAXPlug (xmlSchemaValidCtxtPtr ctxt, - xmlSAXHandlerPtr *sax, - void **user_data); -XMLPUBFUN int XMLCALL - xmlSchemaSAXUnplug (xmlSchemaSAXPlugPtr plug); -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_SCHEMAS_ENABLED */ -#endif /* __XML_SCHEMA_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlschemastypes.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlschemastypes.h deleted file mode 100644 index 35f60afa632..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlschemastypes.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Summary: implementation of XML Schema Datatypes - * Description: module providing the XML Schema Datatypes implementation - * both definition and validity checking - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - - -#ifndef __XML_SCHEMA_TYPES_H__ -#define __XML_SCHEMA_TYPES_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_SCHEMAS_ENABLED - -#include "schemasInternals.h" -#include "xmlschemas.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - XML_SCHEMA_WHITESPACE_UNKNOWN = 0, - XML_SCHEMA_WHITESPACE_PRESERVE = 1, - XML_SCHEMA_WHITESPACE_REPLACE = 2, - XML_SCHEMA_WHITESPACE_COLLAPSE = 3 -} xmlSchemaWhitespaceValueType; - -XMLPUBFUN void XMLCALL - xmlSchemaInitTypes (void); -XMLPUBFUN void XMLCALL - xmlSchemaCleanupTypes (void); -XMLPUBFUN xmlSchemaTypePtr XMLCALL - xmlSchemaGetPredefinedType (const xmlChar *name, - const xmlChar *ns); -XMLPUBFUN int XMLCALL - xmlSchemaValidatePredefinedType (xmlSchemaTypePtr type, - const xmlChar *value, - xmlSchemaValPtr *val); -XMLPUBFUN int XMLCALL - xmlSchemaValPredefTypeNode (xmlSchemaTypePtr type, - const xmlChar *value, - xmlSchemaValPtr *val, - xmlNodePtr node); -XMLPUBFUN int XMLCALL - xmlSchemaValidateFacet (xmlSchemaTypePtr base, - xmlSchemaFacetPtr facet, - const xmlChar *value, - xmlSchemaValPtr val); -XMLPUBFUN int XMLCALL - xmlSchemaValidateFacetWhtsp (xmlSchemaFacetPtr facet, - xmlSchemaWhitespaceValueType fws, - xmlSchemaValType valType, - const xmlChar *value, - xmlSchemaValPtr val, - xmlSchemaWhitespaceValueType ws); -XMLPUBFUN void XMLCALL - xmlSchemaFreeValue (xmlSchemaValPtr val); -XMLPUBFUN xmlSchemaFacetPtr XMLCALL - xmlSchemaNewFacet (void); -XMLPUBFUN int XMLCALL - xmlSchemaCheckFacet (xmlSchemaFacetPtr facet, - xmlSchemaTypePtr typeDecl, - xmlSchemaParserCtxtPtr ctxt, - const xmlChar *name); -XMLPUBFUN void XMLCALL - xmlSchemaFreeFacet (xmlSchemaFacetPtr facet); -XMLPUBFUN int XMLCALL - xmlSchemaCompareValues (xmlSchemaValPtr x, - xmlSchemaValPtr y); -XMLPUBFUN xmlSchemaTypePtr XMLCALL - xmlSchemaGetBuiltInListSimpleTypeItemType (xmlSchemaTypePtr type); -XMLPUBFUN int XMLCALL - xmlSchemaValidateListSimpleTypeFacet (xmlSchemaFacetPtr facet, - const xmlChar *value, - unsigned long actualLen, - unsigned long *expectedLen); -XMLPUBFUN xmlSchemaTypePtr XMLCALL - xmlSchemaGetBuiltInType (xmlSchemaValType type); -XMLPUBFUN int XMLCALL - xmlSchemaIsBuiltInTypeFacet (xmlSchemaTypePtr type, - int facetType); -XMLPUBFUN xmlChar * XMLCALL - xmlSchemaCollapseString (const xmlChar *value); -XMLPUBFUN xmlChar * XMLCALL - xmlSchemaWhiteSpaceReplace (const xmlChar *value); -XMLPUBFUN unsigned long XMLCALL - xmlSchemaGetFacetValueAsULong (xmlSchemaFacetPtr facet); -XMLPUBFUN int XMLCALL - xmlSchemaValidateLengthFacet (xmlSchemaTypePtr type, - xmlSchemaFacetPtr facet, - const xmlChar *value, - xmlSchemaValPtr val, - unsigned long *length); -XMLPUBFUN int XMLCALL - xmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, - xmlSchemaValType valType, - const xmlChar *value, - xmlSchemaValPtr val, - unsigned long *length, - xmlSchemaWhitespaceValueType ws); -XMLPUBFUN int XMLCALL - xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, - const xmlChar *value, - xmlSchemaValPtr *val, - xmlNodePtr node); -XMLPUBFUN int XMLCALL - xmlSchemaGetCanonValue (xmlSchemaValPtr val, - const xmlChar **retValue); -XMLPUBFUN int XMLCALL - xmlSchemaGetCanonValueWhtsp (xmlSchemaValPtr val, - const xmlChar **retValue, - xmlSchemaWhitespaceValueType ws); -XMLPUBFUN int XMLCALL - xmlSchemaValueAppend (xmlSchemaValPtr prev, - xmlSchemaValPtr cur); -XMLPUBFUN xmlSchemaValPtr XMLCALL - xmlSchemaValueGetNext (xmlSchemaValPtr cur); -XMLPUBFUN const xmlChar * XMLCALL - xmlSchemaValueGetAsString (xmlSchemaValPtr val); -XMLPUBFUN int XMLCALL - xmlSchemaValueGetAsBoolean (xmlSchemaValPtr val); -XMLPUBFUN xmlSchemaValPtr XMLCALL - xmlSchemaNewStringValue (xmlSchemaValType type, - const xmlChar *value); -XMLPUBFUN xmlSchemaValPtr XMLCALL - xmlSchemaNewNOTATIONValue (const xmlChar *name, - const xmlChar *ns); -XMLPUBFUN xmlSchemaValPtr XMLCALL - xmlSchemaNewQNameValue (const xmlChar *namespaceName, - const xmlChar *localName); -XMLPUBFUN int XMLCALL - xmlSchemaCompareValuesWhtsp (xmlSchemaValPtr x, - xmlSchemaWhitespaceValueType xws, - xmlSchemaValPtr y, - xmlSchemaWhitespaceValueType yws); -XMLPUBFUN xmlSchemaValPtr XMLCALL - xmlSchemaCopyValue (xmlSchemaValPtr val); -XMLPUBFUN xmlSchemaValType XMLCALL - xmlSchemaGetValType (xmlSchemaValPtr val); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_SCHEMAS_ENABLED */ -#endif /* __XML_SCHEMA_TYPES_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlstring.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlstring.h deleted file mode 100644 index dc4e0e606cb..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlstring.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Summary: set of routines to process strings - * Description: type and interfaces needed for the internal string handling - * of the library, especially UTF8 processing. - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_STRING_H__ -#define __XML_STRING_H__ - -#include <stdarg.h> -#include "xmlversion.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * xmlChar: - * - * This is a basic byte in an UTF-8 encoded string. - * It's unsigned allowing to pinpoint case where char * are assigned - * to xmlChar * (possibly making serialization back impossible). - */ -typedef unsigned char xmlChar; - -/** - * BAD_CAST: - * - * Macro to cast a string to an xmlChar * when one know its safe. - */ -#define BAD_CAST (xmlChar *) - -/* - * xmlChar handling - */ -XMLPUBFUN xmlChar * XMLCALL - xmlStrdup (const xmlChar *cur); -XMLPUBFUN xmlChar * XMLCALL - xmlStrndup (const xmlChar *cur, - int len); -XMLPUBFUN xmlChar * XMLCALL - xmlCharStrndup (const char *cur, - int len); -XMLPUBFUN xmlChar * XMLCALL - xmlCharStrdup (const char *cur); -XMLPUBFUN xmlChar * XMLCALL - xmlStrsub (const xmlChar *str, - int start, - int len); -XMLPUBFUN const xmlChar * XMLCALL - xmlStrchr (const xmlChar *str, - xmlChar val); -XMLPUBFUN const xmlChar * XMLCALL - xmlStrstr (const xmlChar *str, - const xmlChar *val); -XMLPUBFUN const xmlChar * XMLCALL - xmlStrcasestr (const xmlChar *str, - xmlChar *val); -XMLPUBFUN int XMLCALL - xmlStrcmp (const xmlChar *str1, - const xmlChar *str2); -XMLPUBFUN int XMLCALL - xmlStrncmp (const xmlChar *str1, - const xmlChar *str2, - int len); -XMLPUBFUN int XMLCALL - xmlStrcasecmp (const xmlChar *str1, - const xmlChar *str2); -XMLPUBFUN int XMLCALL - xmlStrncasecmp (const xmlChar *str1, - const xmlChar *str2, - int len); -XMLPUBFUN int XMLCALL - xmlStrEqual (const xmlChar *str1, - const xmlChar *str2); -XMLPUBFUN int XMLCALL - xmlStrQEqual (const xmlChar *pref, - const xmlChar *name, - const xmlChar *str); -XMLPUBFUN int XMLCALL - xmlStrlen (const xmlChar *str); -XMLPUBFUN xmlChar * XMLCALL - xmlStrcat (xmlChar *cur, - const xmlChar *add); -XMLPUBFUN xmlChar * XMLCALL - xmlStrncat (xmlChar *cur, - const xmlChar *add, - int len); -XMLPUBFUN xmlChar * XMLCALL - xmlStrncatNew (const xmlChar *str1, - const xmlChar *str2, - int len); -XMLPUBFUN int XMLCALL - xmlStrPrintf (xmlChar *buf, - int len, - const xmlChar *msg, - ...); -XMLPUBFUN int XMLCALL - xmlStrVPrintf (xmlChar *buf, - int len, - const xmlChar *msg, - va_list ap); - -XMLPUBFUN int XMLCALL - xmlGetUTF8Char (const unsigned char *utf, - int *len); -XMLPUBFUN int XMLCALL - xmlCheckUTF8 (const unsigned char *utf); -XMLPUBFUN int XMLCALL - xmlUTF8Strsize (const xmlChar *utf, - int len); -XMLPUBFUN xmlChar * XMLCALL - xmlUTF8Strndup (const xmlChar *utf, - int len); -XMLPUBFUN const xmlChar * XMLCALL - xmlUTF8Strpos (const xmlChar *utf, - int pos); -XMLPUBFUN int XMLCALL - xmlUTF8Strloc (const xmlChar *utf, - const xmlChar *utfchar); -XMLPUBFUN xmlChar * XMLCALL - xmlUTF8Strsub (const xmlChar *utf, - int start, - int len); -XMLPUBFUN int XMLCALL - xmlUTF8Strlen (const xmlChar *utf); -XMLPUBFUN int XMLCALL - xmlUTF8Size (const xmlChar *utf); -XMLPUBFUN int XMLCALL - xmlUTF8Charcmp (const xmlChar *utf1, - const xmlChar *utf2); - -#ifdef __cplusplus -} -#endif -#endif /* __XML_STRING_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlunicode.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlunicode.h deleted file mode 100644 index 195d441337a..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlunicode.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Summary: Unicode character APIs - * Description: API for the Unicode character APIs - * - * This file is automatically generated from the - * UCS description files of the Unicode Character Database - * http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html - * using the genUnicode.py Python script. - * - * Generation date: Mon Mar 27 11:09:52 2006 - * Sources: Blocks-4.0.1.txt UnicodeData-4.0.1.txt - * Author: Daniel Veillard - */ - -#ifndef __XML_UNICODE_H__ -#define __XML_UNICODE_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_UNICODE_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -XMLPUBFUN int XMLCALL xmlUCSIsAegeanNumbers (int code); -XMLPUBFUN int XMLCALL xmlUCSIsAlphabeticPresentationForms (int code); -XMLPUBFUN int XMLCALL xmlUCSIsArabic (int code); -XMLPUBFUN int XMLCALL xmlUCSIsArabicPresentationFormsA (int code); -XMLPUBFUN int XMLCALL xmlUCSIsArabicPresentationFormsB (int code); -XMLPUBFUN int XMLCALL xmlUCSIsArmenian (int code); -XMLPUBFUN int XMLCALL xmlUCSIsArrows (int code); -XMLPUBFUN int XMLCALL xmlUCSIsBasicLatin (int code); -XMLPUBFUN int XMLCALL xmlUCSIsBengali (int code); -XMLPUBFUN int XMLCALL xmlUCSIsBlockElements (int code); -XMLPUBFUN int XMLCALL xmlUCSIsBopomofo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsBopomofoExtended (int code); -XMLPUBFUN int XMLCALL xmlUCSIsBoxDrawing (int code); -XMLPUBFUN int XMLCALL xmlUCSIsBraillePatterns (int code); -XMLPUBFUN int XMLCALL xmlUCSIsBuhid (int code); -XMLPUBFUN int XMLCALL xmlUCSIsByzantineMusicalSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibility (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityForms (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityIdeographs (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityIdeographsSupplement (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKRadicalsSupplement (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKSymbolsandPunctuation (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographs (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographsExtensionA (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographsExtensionB (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCherokee (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCombiningDiacriticalMarks (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCombiningDiacriticalMarksforSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCombiningHalfMarks (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCombiningMarksforSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsControlPictures (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCurrencySymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCypriotSyllabary (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCyrillic (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCyrillicSupplement (int code); -XMLPUBFUN int XMLCALL xmlUCSIsDeseret (int code); -XMLPUBFUN int XMLCALL xmlUCSIsDevanagari (int code); -XMLPUBFUN int XMLCALL xmlUCSIsDingbats (int code); -XMLPUBFUN int XMLCALL xmlUCSIsEnclosedAlphanumerics (int code); -XMLPUBFUN int XMLCALL xmlUCSIsEnclosedCJKLettersandMonths (int code); -XMLPUBFUN int XMLCALL xmlUCSIsEthiopic (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGeneralPunctuation (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGeometricShapes (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGeorgian (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGothic (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGreek (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGreekExtended (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGreekandCoptic (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGujarati (int code); -XMLPUBFUN int XMLCALL xmlUCSIsGurmukhi (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHalfwidthandFullwidthForms (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHangulCompatibilityJamo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHangulJamo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHangulSyllables (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHanunoo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHebrew (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHighPrivateUseSurrogates (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHighSurrogates (int code); -XMLPUBFUN int XMLCALL xmlUCSIsHiragana (int code); -XMLPUBFUN int XMLCALL xmlUCSIsIPAExtensions (int code); -XMLPUBFUN int XMLCALL xmlUCSIsIdeographicDescriptionCharacters (int code); -XMLPUBFUN int XMLCALL xmlUCSIsKanbun (int code); -XMLPUBFUN int XMLCALL xmlUCSIsKangxiRadicals (int code); -XMLPUBFUN int XMLCALL xmlUCSIsKannada (int code); -XMLPUBFUN int XMLCALL xmlUCSIsKatakana (int code); -XMLPUBFUN int XMLCALL xmlUCSIsKatakanaPhoneticExtensions (int code); -XMLPUBFUN int XMLCALL xmlUCSIsKhmer (int code); -XMLPUBFUN int XMLCALL xmlUCSIsKhmerSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLao (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLatin1Supplement (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedA (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedB (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedAdditional (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLetterlikeSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLimbu (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLinearBIdeograms (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLinearBSyllabary (int code); -XMLPUBFUN int XMLCALL xmlUCSIsLowSurrogates (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMalayalam (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMathematicalAlphanumericSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMathematicalOperators (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousMathematicalSymbolsA (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousMathematicalSymbolsB (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousSymbolsandArrows (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousTechnical (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMongolian (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMusicalSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsMyanmar (int code); -XMLPUBFUN int XMLCALL xmlUCSIsNumberForms (int code); -XMLPUBFUN int XMLCALL xmlUCSIsOgham (int code); -XMLPUBFUN int XMLCALL xmlUCSIsOldItalic (int code); -XMLPUBFUN int XMLCALL xmlUCSIsOpticalCharacterRecognition (int code); -XMLPUBFUN int XMLCALL xmlUCSIsOriya (int code); -XMLPUBFUN int XMLCALL xmlUCSIsOsmanya (int code); -XMLPUBFUN int XMLCALL xmlUCSIsPhoneticExtensions (int code); -XMLPUBFUN int XMLCALL xmlUCSIsPrivateUse (int code); -XMLPUBFUN int XMLCALL xmlUCSIsPrivateUseArea (int code); -XMLPUBFUN int XMLCALL xmlUCSIsRunic (int code); -XMLPUBFUN int XMLCALL xmlUCSIsShavian (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSinhala (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSmallFormVariants (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSpacingModifierLetters (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSpecials (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSuperscriptsandSubscripts (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSupplementalArrowsA (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSupplementalArrowsB (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSupplementalMathematicalOperators (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSupplementaryPrivateUseAreaA (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSupplementaryPrivateUseAreaB (int code); -XMLPUBFUN int XMLCALL xmlUCSIsSyriac (int code); -XMLPUBFUN int XMLCALL xmlUCSIsTagalog (int code); -XMLPUBFUN int XMLCALL xmlUCSIsTagbanwa (int code); -XMLPUBFUN int XMLCALL xmlUCSIsTags (int code); -XMLPUBFUN int XMLCALL xmlUCSIsTaiLe (int code); -XMLPUBFUN int XMLCALL xmlUCSIsTaiXuanJingSymbols (int code); -XMLPUBFUN int XMLCALL xmlUCSIsTamil (int code); -XMLPUBFUN int XMLCALL xmlUCSIsTelugu (int code); -XMLPUBFUN int XMLCALL xmlUCSIsThaana (int code); -XMLPUBFUN int XMLCALL xmlUCSIsThai (int code); -XMLPUBFUN int XMLCALL xmlUCSIsTibetan (int code); -XMLPUBFUN int XMLCALL xmlUCSIsUgaritic (int code); -XMLPUBFUN int XMLCALL xmlUCSIsUnifiedCanadianAboriginalSyllabics (int code); -XMLPUBFUN int XMLCALL xmlUCSIsVariationSelectors (int code); -XMLPUBFUN int XMLCALL xmlUCSIsVariationSelectorsSupplement (int code); -XMLPUBFUN int XMLCALL xmlUCSIsYiRadicals (int code); -XMLPUBFUN int XMLCALL xmlUCSIsYiSyllables (int code); -XMLPUBFUN int XMLCALL xmlUCSIsYijingHexagramSymbols (int code); - -XMLPUBFUN int XMLCALL xmlUCSIsBlock (int code, const char *block); - -XMLPUBFUN int XMLCALL xmlUCSIsCatC (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatCc (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatCf (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatCo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatCs (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatL (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatLl (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatLm (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatLo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatLt (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatLu (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatM (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatMc (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatMe (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatMn (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatN (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatNd (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatNl (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatNo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatP (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatPc (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatPd (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatPe (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatPf (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatPi (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatPo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatPs (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatS (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatSc (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatSk (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatSm (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatSo (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatZ (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatZl (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatZp (int code); -XMLPUBFUN int XMLCALL xmlUCSIsCatZs (int code); - -XMLPUBFUN int XMLCALL xmlUCSIsCat (int code, const char *cat); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_UNICODE_ENABLED */ - -#endif /* __XML_UNICODE_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlversion.h.in b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlversion.h.in deleted file mode 100644 index 589820c5f78..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlversion.h.in +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Summary: compile-time version informations - * Description: compile-time version informations for the XML library - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_VERSION_H__ -#define __XML_VERSION_H__ - -#include "xmlexports.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * use those to be sure nothing nasty will happen if - * your library and includes mismatch - */ -#ifndef LIBXML2_COMPILING_MSCCDEF -XMLPUBFUN void XMLCALL xmlCheckVersion(int version); -#endif /* LIBXML2_COMPILING_MSCCDEF */ - -/** - * LIBXML_DOTTED_VERSION: - * - * the version string like "1.2.3" - */ -#define LIBXML_DOTTED_VERSION "@VERSION@" - -/** - * LIBXML_VERSION: - * - * the version number: 1.2.3 value is 10203 - */ -#define LIBXML_VERSION @LIBXML_VERSION_NUMBER@ - -/** - * LIBXML_VERSION_STRING: - * - * the version number string, 1.2.3 value is "10203" - */ -#define LIBXML_VERSION_STRING "@LIBXML_VERSION_NUMBER@" - -/** - * LIBXML_VERSION_EXTRA: - * - * extra version information, used to show a CVS compilation - */ -#define LIBXML_VERSION_EXTRA "@LIBXML_VERSION_EXTRA@" - -/** - * LIBXML_TEST_VERSION: - * - * Macro to check that the libxml version in use is compatible with - * the version the software has been compiled against - */ -#define LIBXML_TEST_VERSION xmlCheckVersion(@LIBXML_VERSION_NUMBER@); - -#ifndef VMS -#if @WITH_TRIO@ -/** - * WITH_TRIO: - * - * defined if the trio support need to be configured in - */ -#define WITH_TRIO -#else -/** - * WITHOUT_TRIO: - * - * defined if the trio support should not be configured in - */ -#define WITHOUT_TRIO -#endif -#else /* VMS */ -/** - * WITH_TRIO: - * - * defined if the trio support need to be configured in - */ -#define WITH_TRIO 1 -#endif /* VMS */ - -/** - * LIBXML_THREAD_ENABLED: - * - * Whether the thread support is configured in - */ -#if @WITH_THREADS@ -#if defined(_REENTRANT) || defined(__MT__) || (_POSIX_C_SOURCE - 0 >= 199506L) -#define LIBXML_THREAD_ENABLED -#endif -#endif - -/** - * LIBXML_TREE_ENABLED: - * - * Whether the DOM like tree manipulation API support is configured in - */ -#if @WITH_TREE@ -#define LIBXML_TREE_ENABLED -#endif - -/** - * LIBXML_OUTPUT_ENABLED: - * - * Whether the serialization/saving support is configured in - */ -#if @WITH_OUTPUT@ -#define LIBXML_OUTPUT_ENABLED -#endif - -/** - * LIBXML_PUSH_ENABLED: - * - * Whether the push parsing interfaces are configured in - */ -#if @WITH_PUSH@ -#define LIBXML_PUSH_ENABLED -#endif - -/** - * LIBXML_READER_ENABLED: - * - * Whether the xmlReader parsing interface is configured in - */ -#if @WITH_READER@ -#define LIBXML_READER_ENABLED -#endif - -/** - * LIBXML_PATTERN_ENABLED: - * - * Whether the xmlPattern node selection interface is configured in - */ -#if @WITH_PATTERN@ -#define LIBXML_PATTERN_ENABLED -#endif - -/** - * LIBXML_WRITER_ENABLED: - * - * Whether the xmlWriter saving interface is configured in - */ -#if @WITH_WRITER@ -#define LIBXML_WRITER_ENABLED -#endif - -/** - * LIBXML_SAX1_ENABLED: - * - * Whether the older SAX1 interface is configured in - */ -#if @WITH_SAX1@ -#define LIBXML_SAX1_ENABLED -#endif - -/** - * LIBXML_FTP_ENABLED: - * - * Whether the FTP support is configured in - */ -#if @WITH_FTP@ -#define LIBXML_FTP_ENABLED -#endif - -/** - * LIBXML_HTTP_ENABLED: - * - * Whether the HTTP support is configured in - */ -#if @WITH_HTTP@ -#define LIBXML_HTTP_ENABLED -#endif - -/** - * LIBXML_VALID_ENABLED: - * - * Whether the DTD validation support is configured in - */ -#if @WITH_VALID@ -#define LIBXML_VALID_ENABLED -#endif - -/** - * LIBXML_HTML_ENABLED: - * - * Whether the HTML support is configured in - */ -#if @WITH_HTML@ -#define LIBXML_HTML_ENABLED -#endif - -/** - * LIBXML_LEGACY_ENABLED: - * - * Whether the deprecated APIs are compiled in for compatibility - */ -#if @WITH_LEGACY@ -#define LIBXML_LEGACY_ENABLED -#endif - -/** - * LIBXML_C14N_ENABLED: - * - * Whether the Canonicalization support is configured in - */ -#if @WITH_C14N@ -#define LIBXML_C14N_ENABLED -#endif - -/** - * LIBXML_CATALOG_ENABLED: - * - * Whether the Catalog support is configured in - */ -#if @WITH_CATALOG@ -#define LIBXML_CATALOG_ENABLED -#endif - -/** - * LIBXML_DOCB_ENABLED: - * - * Whether the SGML Docbook support is configured in - */ -#if @WITH_DOCB@ -#define LIBXML_DOCB_ENABLED -#endif - -/** - * LIBXML_XPATH_ENABLED: - * - * Whether XPath is configured in - */ -#if @WITH_XPATH@ -#define LIBXML_XPATH_ENABLED -#endif - -/** - * LIBXML_XPTR_ENABLED: - * - * Whether XPointer is configured in - */ -#if @WITH_XPTR@ -#define LIBXML_XPTR_ENABLED -#endif - -/** - * LIBXML_XINCLUDE_ENABLED: - * - * Whether XInclude is configured in - */ -#if @WITH_XINCLUDE@ -#define LIBXML_XINCLUDE_ENABLED -#endif - -/** - * LIBXML_ICONV_ENABLED: - * - * Whether iconv support is available - */ -#if @WITH_ICONV@ -#define LIBXML_ICONV_ENABLED -#endif - -/** - * LIBXML_ISO8859X_ENABLED: - * - * Whether ISO-8859-* support is made available in case iconv is not - */ -#if @WITH_ISO8859X@ -#define LIBXML_ISO8859X_ENABLED -#endif - -/** - * LIBXML_DEBUG_ENABLED: - * - * Whether Debugging module is configured in - */ -#if @WITH_DEBUG@ -#define LIBXML_DEBUG_ENABLED -#endif - -/** - * DEBUG_MEMORY_LOCATION: - * - * Whether the memory debugging is configured in - */ -#if @WITH_MEM_DEBUG@ -#define DEBUG_MEMORY_LOCATION -#endif - -/** - * LIBXML_DEBUG_RUNTIME: - * - * Whether the runtime debugging is configured in - */ -#if @WITH_RUN_DEBUG@ -#define LIBXML_DEBUG_RUNTIME -#endif - -/** - * LIBXML_UNICODE_ENABLED: - * - * Whether the Unicode related interfaces are compiled in - */ -#if @WITH_REGEXPS@ -#define LIBXML_UNICODE_ENABLED -#endif - -/** - * LIBXML_REGEXP_ENABLED: - * - * Whether the regular expressions interfaces are compiled in - */ -#if @WITH_REGEXPS@ -#define LIBXML_REGEXP_ENABLED -#endif - -/** - * LIBXML_AUTOMATA_ENABLED: - * - * Whether the automata interfaces are compiled in - */ -#if @WITH_REGEXPS@ -#define LIBXML_AUTOMATA_ENABLED -#endif - -/** - * LIBXML_EXPR_ENABLED: - * - * Whether the formal expressions interfaces are compiled in - */ -#if @WITH_SCHEMAS@ -#define LIBXML_EXPR_ENABLED -#endif - -/** - * LIBXML_SCHEMAS_ENABLED: - * - * Whether the Schemas validation interfaces are compiled in - */ -#if @WITH_SCHEMAS@ -#define LIBXML_SCHEMAS_ENABLED -#endif - -/** - * LIBXML_SCHEMATRON_ENABLED: - * - * Whether the Schematron validation interfaces are compiled in - */ -#if @WITH_SCHEMATRON@ -#define LIBXML_SCHEMATRON_ENABLED -#endif - -/** - * LIBXML_MODULES_ENABLED: - * - * Whether the module interfaces are compiled in - */ -#if @WITH_MODULES@ -#define LIBXML_MODULES_ENABLED -/** - * LIBXML_MODULE_EXTENSION: - * - * the string suffix used by dynamic modules (usually shared libraries) - */ -#define LIBXML_MODULE_EXTENSION "@MODULE_EXTENSION@" -#endif - -/** - * LIBXML_ZLIB_ENABLED: - * - * Whether the Zlib support is compiled in - */ -#if @WITH_ZLIB@ -#define LIBXML_ZLIB_ENABLED -#endif - -/** - * ATTRIBUTE_UNUSED: - * - * Macro used to signal to GCC unused function parameters - */ -#ifdef __GNUC__ -#ifdef HAVE_ANSIDECL_H -#include <ansidecl.h> -#endif -#ifndef ATTRIBUTE_UNUSED -#define ATTRIBUTE_UNUSED __attribute__((unused)) -#endif -#else -#define ATTRIBUTE_UNUSED -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif - - diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlwin32version.h.in b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlwin32version.h.in deleted file mode 100644 index 544d5a975d8..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlwin32version.h.in +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Summary: compile-time version informations on Windows - * Description: compile-time version informations for the XML library - * when compiled on the Windows platform - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_VERSION_H__ -#define __XML_VERSION_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * use those to be sure nothing nasty will happen if - * your library and includes mismatch - */ -#ifndef LIBXML2_COMPILING_MSCCDEF -extern void xmlCheckVersion(int version); -#endif /* LIBXML2_COMPILING_MSCCDEF */ - -/** - * LIBXML_DOTTED_VERSION: - * - * the version string like "1.2.3" - */ -#define LIBXML_DOTTED_VERSION "@VERSION@" - -/** - * LIBXML_VERSION: - * - * the version number: 1.2.3 value is 1002003 - */ -#define LIBXML_VERSION @LIBXML_VERSION_NUMBER@ - -/** - * LIBXML_VERSION_STRING: - * - * the version number string, 1.2.3 value is "1002003" - */ -#define LIBXML_VERSION_STRING "@LIBXML_VERSION_NUMBER@" - -/** - * LIBXML_VERSION_EXTRA: - * - * extra version information, used to show a CVS compilation - */ -#define LIBXML_VERSION_EXTRA "-win32" - -/** - * LIBXML_TEST_VERSION: - * - * Macro to check that the libxml version in use is compatible with - * the version the software has been compiled against - */ -#define LIBXML_TEST_VERSION xmlCheckVersion(@LIBXML_VERSION_NUMBER@); - -#if 0 -/** - * WITH_TRIO: - * - * defined if the trio support need to be configured in - */ -#define WITH_TRIO -#else -/** - * WITHOUT_TRIO: - * - * defined if the trio support should not be configured in - */ -#define WITHOUT_TRIO -#endif - -/** - * LIBXML_THREAD_ENABLED: - * - * Whether the thread support is configured in - */ -#if 0 -#define LIBXML_THREAD_ENABLED -#endif - -/** - * LIBXML_FTP_ENABLED: - * - * Whether the FTP support is configured in - */ -#if 1 -#define LIBXML_FTP_ENABLED -#endif - -/** - * LIBXML_HTTP_ENABLED: - * - * Whether the HTTP support is configured in - */ -#if 1 -#define LIBXML_HTTP_ENABLED -#endif - -/** - * LIBXML_HTML_ENABLED: - * - * Whether the HTML support is configured in - */ -#if 1 -#define LIBXML_HTML_ENABLED -#endif - -/** - * LIBXML_CATALOG_ENABLED: - * - * Whether the Catalog support is configured in - */ -#if 1 -#define LIBXML_CATALOG_ENABLED -#endif - -/** - * LIBXML_DOCB_ENABLED: - * - * Whether the SGML Docbook support is configured in - */ -#if 1 -#define LIBXML_DOCB_ENABLED -#endif - -/** - * LIBXML_XPATH_ENABLED: - * - * Whether XPath is configured in - */ -#if 1 -#define LIBXML_XPATH_ENABLED -#endif - -/** - * LIBXML_XPTR_ENABLED: - * - * Whether XPointer is configured in - */ -#if 1 -#define LIBXML_XPTR_ENABLED -#endif - -/** - * LIBXML_C14N_ENABLED: - * - * Whether the Canonicalization support is configured in - */ -#if 0 -#define LIBXML_C14N_ENABLED -#endif - -/** - * LIBXML_XINCLUDE_ENABLED: - * - * Whether XInclude is configured in - */ -#if 1 -#define LIBXML_XINCLUDE_ENABLED -#endif - -/** - * LIBXML_SCHEMATRON_ENABLED: - * - * Whether the Schematron validation interfaces are compiled in - */ -#if 1 -#define LIBXML_SCHEMATRON_ENABLED -#endif - -/** - * LIBXML_ICONV_ENABLED: - * - * Whether iconv support is available - */ -#if 0 -#define LIBXML_ICONV_ENABLED -#endif - -/** - * LIBXML_ISO8859X_ENABLED: - * - * Whether ISO-8859-* support is made available in case iconv is not - */ -#if 1 -#define LIBXML_ISO8859X_ENABLED -#endif - -/** - * LIBXML_DEBUG_ENABLED: - * - * Whether Debugging module is configured in - */ -#if 1 -#define LIBXML_DEBUG_ENABLED -#endif - -/** - * DEBUG_MEMORY_LOCATION: - * - * Whether the memory debugging is configured in - */ -#if 0 -#define DEBUG_MEMORY_LOCATION -#endif - -/** - * LIBXML_DEBUG_RUNTIME: - * - * Whether the runtime debugging is configured in - */ -#if 0 -#define LIBXML_DEBUG_RUNTIME -#endif - -/** - * LIBXML_DLL_IMPORT: - * - * Used on Windows (MS C compiler only) to declare a variable as - * imported from the library. This macro should be empty when compiling - * libxml itself. It should expand to __declspec(dllimport) - * when the client code includes this header, and that only if the client - * links dynamically against libxml. - * For this to work, we need three macros. One tells us which compiler is - * being used and luckily the compiler defines such a thing: _MSC_VER. The - * second macro tells us if we are compiling libxml or the client code and - * we define the macro IN_LIBXML on the compiler's command line for this - * purpose. The third macro, LIBXML_STATIC, must be defined by any client - * code which links against libxml statically. - */ -#ifndef LIBXML_DLL_IMPORT -#if defined(_MSC_VER) && !defined(IN_LIBXML) && !defined(LIBXML_STATIC) -#define LIBXML_DLL_IMPORT __declspec(dllimport) -#else -#define LIBXML_DLL_IMPORT -#endif -#endif - -/** - * ATTRIBUTE_UNUSED: - * - * Macro used to signal to GCC unused function parameters - */ -#ifdef __GNUC__ -#ifdef HAVE_ANSIDECL_H -#include <ansidecl.h> -#endif -#ifndef ATTRIBUTE_UNUSED -#define ATTRIBUTE_UNUSED -#endif -#else -#define ATTRIBUTE_UNUSED -#endif - -/* - * #pragma comment(lib, "iconv.lib") - * - * pragma understood my MS compiler which enables a conditional link with - * iconv. - */ -#ifdef _MSC_VER -#if defined LIBXML_ICONV_ENABLED && !defined LIBXML2_COMPILING_MSCCDEF -#pragma comment(lib, "iconv.lib") -#endif -#endif - -/* - * #pragma comment(lib, "kernel32.lib") - * - * pragma understood my MS compiler which enables a conditional link with - * kernel32. - */ -#ifdef _MSC_VER -#if defined LIBXML_MODULES_ENABLED -#pragma comment(lib, "kernel32.lib") -#endif -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlwriter.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlwriter.h deleted file mode 100644 index e074f31d532..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xmlwriter.h +++ /dev/null @@ -1,459 +0,0 @@ - -/* - * Summary: text writing API for XML - * Description: text writing API for XML - * - * Copy: See Copyright for the status of this software. - * - * Author: Alfred Mickautsch <alfred@mickautsch.de> - */ - -#ifndef __XML_XMLWRITER_H__ -#define __XML_XMLWRITER_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_WRITER_ENABLED - -#include <stdarg.h> -#include "xmlIO.h" -#include "list.h" -#include "xmlstring.h" - -#ifdef __cplusplus -extern "C" { -#endif - - typedef struct _xmlTextWriter xmlTextWriter; - typedef xmlTextWriter *xmlTextWriterPtr; - -/* - * Constructors & Destructor - */ - XMLPUBFUN xmlTextWriterPtr XMLCALL - xmlNewTextWriter(xmlOutputBufferPtr out); - XMLPUBFUN xmlTextWriterPtr XMLCALL - xmlNewTextWriterFilename(const char *uri, int compression); - XMLPUBFUN xmlTextWriterPtr XMLCALL - xmlNewTextWriterMemory(xmlBufferPtr buf, int compression); - XMLPUBFUN xmlTextWriterPtr XMLCALL - xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt, int compression); - XMLPUBFUN xmlTextWriterPtr XMLCALL - xmlNewTextWriterDoc(xmlDocPtr * doc, int compression); - XMLPUBFUN xmlTextWriterPtr XMLCALL - xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, - int compression); - XMLPUBFUN void XMLCALL xmlFreeTextWriter(xmlTextWriterPtr writer); - -/* - * Functions - */ - - -/* - * Document - */ - XMLPUBFUN int XMLCALL - xmlTextWriterStartDocument(xmlTextWriterPtr writer, - const char *version, - const char *encoding, - const char *standalone); - XMLPUBFUN int XMLCALL xmlTextWriterEndDocument(xmlTextWriterPtr - writer); - -/* - * Comments - */ - XMLPUBFUN int XMLCALL xmlTextWriterStartComment(xmlTextWriterPtr - writer); - XMLPUBFUN int XMLCALL xmlTextWriterEndComment(xmlTextWriterPtr writer); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer, - const char *format, - va_list argptr); - XMLPUBFUN int XMLCALL xmlTextWriterWriteComment(xmlTextWriterPtr - writer, - const xmlChar * - content); - -/* - * Elements - */ - XMLPUBFUN int XMLCALL - xmlTextWriterStartElement(xmlTextWriterPtr writer, - const xmlChar * name); - XMLPUBFUN int XMLCALL xmlTextWriterStartElementNS(xmlTextWriterPtr - writer, - const xmlChar * - prefix, - const xmlChar * name, - const xmlChar * - namespaceURI); - XMLPUBFUN int XMLCALL xmlTextWriterEndElement(xmlTextWriterPtr writer); - XMLPUBFUN int XMLCALL xmlTextWriterFullEndElement(xmlTextWriterPtr - writer); - -/* - * Elements conveniency functions - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, - va_list argptr); - XMLPUBFUN int XMLCALL xmlTextWriterWriteElement(xmlTextWriterPtr - writer, - const xmlChar * name, - const xmlChar * - content); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer, - const xmlChar * prefix, - const xmlChar * name, - const xmlChar * namespaceURI, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer, - const xmlChar * prefix, - const xmlChar * name, - const xmlChar * namespaceURI, - const char *format, - va_list argptr); - XMLPUBFUN int XMLCALL xmlTextWriterWriteElementNS(xmlTextWriterPtr - writer, - const xmlChar * - prefix, - const xmlChar * name, - const xmlChar * - namespaceURI, - const xmlChar * - content); - -/* - * Text - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, - const char *format, va_list argptr); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteRawLen(xmlTextWriterPtr writer, - const xmlChar * content, int len); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteRaw(xmlTextWriterPtr writer, - const xmlChar * content); - XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatString(xmlTextWriterPtr - writer, - const char - *format, ...); - XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatString(xmlTextWriterPtr - writer, - const char - *format, - va_list argptr); - XMLPUBFUN int XMLCALL xmlTextWriterWriteString(xmlTextWriterPtr writer, - const xmlChar * - content); - XMLPUBFUN int XMLCALL xmlTextWriterWriteBase64(xmlTextWriterPtr writer, - const char *data, - int start, int len); - XMLPUBFUN int XMLCALL xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, - const char *data, - int start, int len); - -/* - * Attributes - */ - XMLPUBFUN int XMLCALL - xmlTextWriterStartAttribute(xmlTextWriterPtr writer, - const xmlChar * name); - XMLPUBFUN int XMLCALL xmlTextWriterStartAttributeNS(xmlTextWriterPtr - writer, - const xmlChar * - prefix, - const xmlChar * - name, - const xmlChar * - namespaceURI); - XMLPUBFUN int XMLCALL xmlTextWriterEndAttribute(xmlTextWriterPtr - writer); - -/* - * Attributes conveniency functions - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, - va_list argptr); - XMLPUBFUN int XMLCALL xmlTextWriterWriteAttribute(xmlTextWriterPtr - writer, - const xmlChar * name, - const xmlChar * - content); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer, - const xmlChar * prefix, - const xmlChar * name, - const xmlChar * namespaceURI, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer, - const xmlChar * prefix, - const xmlChar * name, - const xmlChar * namespaceURI, - const char *format, - va_list argptr); - XMLPUBFUN int XMLCALL xmlTextWriterWriteAttributeNS(xmlTextWriterPtr - writer, - const xmlChar * - prefix, - const xmlChar * - name, - const xmlChar * - namespaceURI, - const xmlChar * - content); - -/* - * PI's - */ - XMLPUBFUN int XMLCALL - xmlTextWriterStartPI(xmlTextWriterPtr writer, - const xmlChar * target); - XMLPUBFUN int XMLCALL xmlTextWriterEndPI(xmlTextWriterPtr writer); - -/* - * PI conveniency functions - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, - const xmlChar * target, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer, - const xmlChar * target, - const char *format, va_list argptr); - XMLPUBFUN int XMLCALL - xmlTextWriterWritePI(xmlTextWriterPtr writer, - const xmlChar * target, - const xmlChar * content); - -/** - * xmlTextWriterWriteProcessingInstruction: - * - * This macro maps to xmlTextWriterWritePI - */ -#define xmlTextWriterWriteProcessingInstruction xmlTextWriterWritePI - -/* - * CDATA - */ - XMLPUBFUN int XMLCALL xmlTextWriterStartCDATA(xmlTextWriterPtr writer); - XMLPUBFUN int XMLCALL xmlTextWriterEndCDATA(xmlTextWriterPtr writer); - -/* - * CDATA conveniency functions - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, - const char *format, va_list argptr); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteCDATA(xmlTextWriterPtr writer, - const xmlChar * content); - -/* - * DTD - */ - XMLPUBFUN int XMLCALL - xmlTextWriterStartDTD(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid); - XMLPUBFUN int XMLCALL xmlTextWriterEndDTD(xmlTextWriterPtr writer); - -/* - * DTD conveniency functions - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, - const char *format, va_list argptr); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteDTD(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, - const xmlChar * subset); - -/** - * xmlTextWriterWriteDocType: - * - * this macro maps to xmlTextWriterWriteDTD - */ -#define xmlTextWriterWriteDocType xmlTextWriterWriteDTD - -/* - * DTD element definition - */ - XMLPUBFUN int XMLCALL - xmlTextWriterStartDTDElement(xmlTextWriterPtr writer, - const xmlChar * name); - XMLPUBFUN int XMLCALL xmlTextWriterEndDTDElement(xmlTextWriterPtr - writer); - -/* - * DTD element definition conveniency functions - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, - va_list argptr); - XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDElement(xmlTextWriterPtr - writer, - const xmlChar * - name, - const xmlChar * - content); - -/* - * DTD attribute list definition - */ - XMLPUBFUN int XMLCALL - xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, - const xmlChar * name); - XMLPUBFUN int XMLCALL xmlTextWriterEndDTDAttlist(xmlTextWriterPtr - writer); - -/* - * DTD attribute list definition conveniency functions - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, - va_list argptr); - XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr - writer, - const xmlChar * - name, - const xmlChar * - content); - -/* - * DTD entity definition - */ - XMLPUBFUN int XMLCALL - xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer, - int pe, const xmlChar * name); - XMLPUBFUN int XMLCALL xmlTextWriterEndDTDEntity(xmlTextWriterPtr - writer); - -/* - * DTD entity definition conveniency functions - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const char *format, ...); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const char *format, - va_list argptr); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const xmlChar * content); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, - const xmlChar * ndataid); - XMLPUBFUN int XMLCALL - xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr - writer, - const xmlChar * pubid, - const xmlChar * sysid, - const xmlChar * - ndataid); - XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDEntity(xmlTextWriterPtr - writer, int pe, - const xmlChar * name, - const xmlChar * - pubid, - const xmlChar * - sysid, - const xmlChar * - ndataid, - const xmlChar * - content); - -/* - * DTD notation definition - */ - XMLPUBFUN int XMLCALL - xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid); - -/* - * Indentation - */ - XMLPUBFUN int XMLCALL - xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent); - XMLPUBFUN int XMLCALL - xmlTextWriterSetIndentString(xmlTextWriterPtr writer, - const xmlChar * str); - -/* - * misc - */ - XMLPUBFUN int XMLCALL xmlTextWriterFlush(xmlTextWriterPtr writer); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_WRITER_ENABLED */ - -#endif /* __XML_XMLWRITER_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xpath.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xpath.h deleted file mode 100644 index d73bf18d0a7..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xpath.h +++ /dev/null @@ -1,543 +0,0 @@ -/* - * Summary: XML Path Language implementation - * Description: API for the XML Path Language implementation - * - * XML Path Language implementation - * XPath is a language for addressing parts of an XML document, - * designed to be used by both XSLT and XPointer - * http://www.w3.org/TR/xpath - * - * Implements - * W3C Recommendation 16 November 1999 - * http://www.w3.org/TR/1999/REC-xpath-19991116 - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_XPATH_H__ -#define __XML_XPATH_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_XPATH_ENABLED - -#include "xmlerror.h" -#include "tree.h" -#include "hash.h" -#endif /* LIBXML_XPATH_ENABLED */ - -#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -#ifdef __cplusplus -extern "C" { -#endif -#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED */ - -#ifdef LIBXML_XPATH_ENABLED - -typedef struct _xmlXPathContext xmlXPathContext; -typedef xmlXPathContext *xmlXPathContextPtr; -typedef struct _xmlXPathParserContext xmlXPathParserContext; -typedef xmlXPathParserContext *xmlXPathParserContextPtr; - -/** - * The set of XPath error codes. - */ - -typedef enum { - XPATH_EXPRESSION_OK = 0, - XPATH_NUMBER_ERROR, - XPATH_UNFINISHED_LITERAL_ERROR, - XPATH_START_LITERAL_ERROR, - XPATH_VARIABLE_REF_ERROR, - XPATH_UNDEF_VARIABLE_ERROR, - XPATH_INVALID_PREDICATE_ERROR, - XPATH_EXPR_ERROR, - XPATH_UNCLOSED_ERROR, - XPATH_UNKNOWN_FUNC_ERROR, - XPATH_INVALID_OPERAND, - XPATH_INVALID_TYPE, - XPATH_INVALID_ARITY, - XPATH_INVALID_CTXT_SIZE, - XPATH_INVALID_CTXT_POSITION, - XPATH_MEMORY_ERROR, - XPTR_SYNTAX_ERROR, - XPTR_RESOURCE_ERROR, - XPTR_SUB_RESOURCE_ERROR, - XPATH_UNDEF_PREFIX_ERROR, - XPATH_ENCODING_ERROR, - XPATH_INVALID_CHAR_ERROR, - XPATH_INVALID_CTXT -} xmlXPathError; - -/* - * A node-set (an unordered collection of nodes without duplicates). - */ -typedef struct _xmlNodeSet xmlNodeSet; -typedef xmlNodeSet *xmlNodeSetPtr; -struct _xmlNodeSet { - int nodeNr; /* number of nodes in the set */ - int nodeMax; /* size of the array as allocated */ - xmlNodePtr *nodeTab; /* array of nodes in no particular order */ - /* @@ with_ns to check wether namespace nodes should be looked at @@ */ -}; - -/* - * An expression is evaluated to yield an object, which - * has one of the following four basic types: - * - node-set - * - boolean - * - number - * - string - * - * @@ XPointer will add more types ! - */ - -typedef enum { - XPATH_UNDEFINED = 0, - XPATH_NODESET = 1, - XPATH_BOOLEAN = 2, - XPATH_NUMBER = 3, - XPATH_STRING = 4, - XPATH_POINT = 5, - XPATH_RANGE = 6, - XPATH_LOCATIONSET = 7, - XPATH_USERS = 8, - XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */ -} xmlXPathObjectType; - -typedef struct _xmlXPathObject xmlXPathObject; -typedef xmlXPathObject *xmlXPathObjectPtr; -struct _xmlXPathObject { - xmlXPathObjectType type; - xmlNodeSetPtr nodesetval; - int boolval; - double floatval; - xmlChar *stringval; - void *user; - int index; - void *user2; - int index2; -}; - -/** - * xmlXPathConvertFunc: - * @obj: an XPath object - * @type: the number of the target type - * - * A conversion function is associated to a type and used to cast - * the new type to primitive values. - * - * Returns -1 in case of error, 0 otherwise - */ -typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type); - -/* - * Extra type: a name and a conversion function. - */ - -typedef struct _xmlXPathType xmlXPathType; -typedef xmlXPathType *xmlXPathTypePtr; -struct _xmlXPathType { - const xmlChar *name; /* the type name */ - xmlXPathConvertFunc func; /* the conversion function */ -}; - -/* - * Extra variable: a name and a value. - */ - -typedef struct _xmlXPathVariable xmlXPathVariable; -typedef xmlXPathVariable *xmlXPathVariablePtr; -struct _xmlXPathVariable { - const xmlChar *name; /* the variable name */ - xmlXPathObjectPtr value; /* the value */ -}; - -/** - * xmlXPathEvalFunc: - * @ctxt: an XPath parser context - * @nargs: the number of arguments passed to the function - * - * An XPath evaluation function, the parameters are on the XPath context stack. - */ - -typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt, - int nargs); - -/* - * Extra function: a name and a evaluation function. - */ - -typedef struct _xmlXPathFunct xmlXPathFunct; -typedef xmlXPathFunct *xmlXPathFuncPtr; -struct _xmlXPathFunct { - const xmlChar *name; /* the function name */ - xmlXPathEvalFunc func; /* the evaluation function */ -}; - -/** - * xmlXPathAxisFunc: - * @ctxt: the XPath interpreter context - * @cur: the previous node being explored on that axis - * - * An axis traversal function. To traverse an axis, the engine calls - * the first time with cur == NULL and repeat until the function returns - * NULL indicating the end of the axis traversal. - * - * Returns the next node in that axis or NULL if at the end of the axis. - */ - -typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt, - xmlXPathObjectPtr cur); - -/* - * Extra axis: a name and an axis function. - */ - -typedef struct _xmlXPathAxis xmlXPathAxis; -typedef xmlXPathAxis *xmlXPathAxisPtr; -struct _xmlXPathAxis { - const xmlChar *name; /* the axis name */ - xmlXPathAxisFunc func; /* the search function */ -}; - -/** - * xmlXPathFunction: - * @ctxt: the XPath interprestation context - * @nargs: the number of arguments - * - * An XPath function. - * The arguments (if any) are popped out from the context stack - * and the result is pushed on the stack. - */ - -typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs); - -/* - * Function and Variable Lookup. - */ - -/** - * xmlXPathVariableLookupFunc: - * @ctxt: an XPath context - * @name: name of the variable - * @ns_uri: the namespace name hosting this variable - * - * Prototype for callbacks used to plug variable lookup in the XPath - * engine. - * - * Returns the XPath object value or NULL if not found. - */ -typedef xmlXPathObjectPtr (*xmlXPathVariableLookupFunc) (void *ctxt, - const xmlChar *name, - const xmlChar *ns_uri); - -/** - * xmlXPathFuncLookupFunc: - * @ctxt: an XPath context - * @name: name of the function - * @ns_uri: the namespace name hosting this function - * - * Prototype for callbacks used to plug function lookup in the XPath - * engine. - * - * Returns the XPath function or NULL if not found. - */ -typedef xmlXPathFunction (*xmlXPathFuncLookupFunc) (void *ctxt, - const xmlChar *name, - const xmlChar *ns_uri); - -/** - * xmlXPathFlags: - * Flags for XPath engine compilation and runtime - */ -/** - * XML_XPATH_CHECKNS: - * - * check namespaces at compilation - */ -#define XML_XPATH_CHECKNS (1<<0) -/** - * XML_XPATH_NOVAR: - * - * forbid variables in expression - */ -#define XML_XPATH_NOVAR (1<<1) - -/** - * xmlXPathContext: - * - * Expression evaluation occurs with respect to a context. - * he context consists of: - * - a node (the context node) - * - a node list (the context node list) - * - a set of variable bindings - * - a function library - * - the set of namespace declarations in scope for the expression - * Following the switch to hash tables, this need to be trimmed up at - * the next binary incompatible release. - */ - -struct _xmlXPathContext { - xmlDocPtr doc; /* The current document */ - xmlNodePtr node; /* The current node */ - - int nb_variables_unused; /* unused (hash table) */ - int max_variables_unused; /* unused (hash table) */ - xmlHashTablePtr varHash; /* Hash table of defined variables */ - - int nb_types; /* number of defined types */ - int max_types; /* max number of types */ - xmlXPathTypePtr types; /* Array of defined types */ - - int nb_funcs_unused; /* unused (hash table) */ - int max_funcs_unused; /* unused (hash table) */ - xmlHashTablePtr funcHash; /* Hash table of defined funcs */ - - int nb_axis; /* number of defined axis */ - int max_axis; /* max number of axis */ - xmlXPathAxisPtr axis; /* Array of defined axis */ - - /* the namespace nodes of the context node */ - xmlNsPtr *namespaces; /* Array of namespaces */ - int nsNr; /* number of namespace in scope */ - void *user; /* function to free */ - - /* extra variables */ - int contextSize; /* the context size */ - int proximityPosition; /* the proximity position */ - - /* extra stuff for XPointer */ - int xptr; /* it this an XPointer context */ - xmlNodePtr here; /* for here() */ - xmlNodePtr origin; /* for origin() */ - - /* the set of namespace declarations in scope for the expression */ - xmlHashTablePtr nsHash; /* The namespaces hash table */ - xmlXPathVariableLookupFunc varLookupFunc;/* variable lookup func */ - void *varLookupData; /* variable lookup data */ - - /* Possibility to link in an extra item */ - void *extra; /* needed for XSLT */ - - /* The function name and URI when calling a function */ - const xmlChar *function; - const xmlChar *functionURI; - - /* function lookup function and data */ - xmlXPathFuncLookupFunc funcLookupFunc;/* function lookup func */ - void *funcLookupData; /* function lookup data */ - - /* temporary namespace lists kept for walking the namespace axis */ - xmlNsPtr *tmpNsList; /* Array of namespaces */ - int tmpNsNr; /* number of namespace in scope */ - - /* error reporting mechanism */ - void *userData; /* user specific data block */ - xmlStructuredErrorFunc error; /* the callback in case of errors */ - xmlError lastError; /* the last error */ - xmlNodePtr debugNode; /* the source node XSLT */ - - /* dictionnary */ - xmlDictPtr dict; /* dictionnary if any */ - - int flags; /* flags to control compilation */ - - /* Cache for reusal of XPath objects */ - void *cache; -}; - -/* - * The structure of a compiled expression form is not public. - */ - -typedef struct _xmlXPathCompExpr xmlXPathCompExpr; -typedef xmlXPathCompExpr *xmlXPathCompExprPtr; - -/** - * xmlXPathParserContext: - * - * An XPath parser context. It contains pure parsing informations, - * an xmlXPathContext, and the stack of objects. - */ -struct _xmlXPathParserContext { - const xmlChar *cur; /* the current char being parsed */ - const xmlChar *base; /* the full expression */ - - int error; /* error code */ - - xmlXPathContextPtr context; /* the evaluation context */ - xmlXPathObjectPtr value; /* the current value */ - int valueNr; /* number of values stacked */ - int valueMax; /* max number of values stacked */ - xmlXPathObjectPtr *valueTab; /* stack of values */ - - xmlXPathCompExprPtr comp; /* the precompiled expression */ - int xptr; /* it this an XPointer expression */ - xmlNodePtr ancestor; /* used for walking preceding axis */ -}; - -/************************************************************************ - * * - * Public API * - * * - ************************************************************************/ - -/** - * Objects and Nodesets handling - */ - -XMLPUBVAR double xmlXPathNAN; -XMLPUBVAR double xmlXPathPINF; -XMLPUBVAR double xmlXPathNINF; - -/* These macros may later turn into functions */ -/** - * xmlXPathNodeSetGetLength: - * @ns: a node-set - * - * Implement a functionality similar to the DOM NodeList.length. - * - * Returns the number of nodes in the node-set. - */ -#define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0) -/** - * xmlXPathNodeSetItem: - * @ns: a node-set - * @index: index of a node in the set - * - * Implements a functionality similar to the DOM NodeList.item(). - * - * Returns the xmlNodePtr at the given @index in @ns or NULL if - * @index is out of range (0 to length-1) - */ -#define xmlXPathNodeSetItem(ns, index) \ - ((((ns) != NULL) && \ - ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \ - (ns)->nodeTab[(index)] \ - : NULL) -/** - * xmlXPathNodeSetIsEmpty: - * @ns: a node-set - * - * Checks whether @ns is empty or not. - * - * Returns %TRUE if @ns is an empty node-set. - */ -#define xmlXPathNodeSetIsEmpty(ns) \ - (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL)) - - -XMLPUBFUN void XMLCALL - xmlXPathFreeObject (xmlXPathObjectPtr obj); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathNodeSetCreate (xmlNodePtr val); -XMLPUBFUN void XMLCALL - xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj); -XMLPUBFUN void XMLCALL - xmlXPathFreeNodeSet (xmlNodeSetPtr obj); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathObjectCopy (xmlXPathObjectPtr val); -XMLPUBFUN int XMLCALL - xmlXPathCmpNodes (xmlNodePtr node1, - xmlNodePtr node2); -/** - * Conversion functions to basic types. - */ -XMLPUBFUN int XMLCALL - xmlXPathCastNumberToBoolean (double val); -XMLPUBFUN int XMLCALL - xmlXPathCastStringToBoolean (const xmlChar * val); -XMLPUBFUN int XMLCALL - xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns); -XMLPUBFUN int XMLCALL - xmlXPathCastToBoolean (xmlXPathObjectPtr val); - -XMLPUBFUN double XMLCALL - xmlXPathCastBooleanToNumber (int val); -XMLPUBFUN double XMLCALL - xmlXPathCastStringToNumber (const xmlChar * val); -XMLPUBFUN double XMLCALL - xmlXPathCastNodeToNumber (xmlNodePtr node); -XMLPUBFUN double XMLCALL - xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns); -XMLPUBFUN double XMLCALL - xmlXPathCastToNumber (xmlXPathObjectPtr val); - -XMLPUBFUN xmlChar * XMLCALL - xmlXPathCastBooleanToString (int val); -XMLPUBFUN xmlChar * XMLCALL - xmlXPathCastNumberToString (double val); -XMLPUBFUN xmlChar * XMLCALL - xmlXPathCastNodeToString (xmlNodePtr node); -XMLPUBFUN xmlChar * XMLCALL - xmlXPathCastNodeSetToString (xmlNodeSetPtr ns); -XMLPUBFUN xmlChar * XMLCALL - xmlXPathCastToString (xmlXPathObjectPtr val); - -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathConvertBoolean (xmlXPathObjectPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathConvertNumber (xmlXPathObjectPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathConvertString (xmlXPathObjectPtr val); - -/** - * Context handling. - */ -XMLPUBFUN xmlXPathContextPtr XMLCALL - xmlXPathNewContext (xmlDocPtr doc); -XMLPUBFUN void XMLCALL - xmlXPathFreeContext (xmlXPathContextPtr ctxt); -XMLPUBFUN int XMLCALL - xmlXPathContextSetCache(xmlXPathContextPtr ctxt, - int active, - int value, - int options); -/** - * Evaluation functions. - */ -XMLPUBFUN long XMLCALL - xmlXPathOrderDocElems (xmlDocPtr doc); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathEval (const xmlChar *str, - xmlXPathContextPtr ctx); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathEvalExpression (const xmlChar *str, - xmlXPathContextPtr ctxt); -XMLPUBFUN int XMLCALL - xmlXPathEvalPredicate (xmlXPathContextPtr ctxt, - xmlXPathObjectPtr res); -/** - * Separate compilation/evaluation entry points. - */ -XMLPUBFUN xmlXPathCompExprPtr XMLCALL - xmlXPathCompile (const xmlChar *str); -XMLPUBFUN xmlXPathCompExprPtr XMLCALL - xmlXPathCtxtCompile (xmlXPathContextPtr ctxt, - const xmlChar *str); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathCompiledEval (xmlXPathCompExprPtr comp, - xmlXPathContextPtr ctx); -XMLPUBFUN int XMLCALL - xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, - xmlXPathContextPtr ctxt); -XMLPUBFUN void XMLCALL - xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp); -#endif /* LIBXML_XPATH_ENABLED */ -#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN void XMLCALL - xmlXPathInit (void); -XMLPUBFUN int XMLCALL - xmlXPathIsNaN (double val); -XMLPUBFUN int XMLCALL - xmlXPathIsInf (double val); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED*/ -#endif /* ! __XML_XPATH_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xpathInternals.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xpathInternals.h deleted file mode 100644 index f919e279ef7..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xpathInternals.h +++ /dev/null @@ -1,630 +0,0 @@ -/* - * Summary: internal interfaces for XML Path Language implementation - * Description: internal interfaces for XML Path Language implementation - * used to build new modules on top of XPath like XPointer and - * XSLT - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_XPATH_INTERNALS_H__ -#define __XML_XPATH_INTERNALS_H__ - -#include "xmlversion.h" -#include "xpath.h" - -#ifdef LIBXML_XPATH_ENABLED - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************ - * * - * Helpers * - * * - ************************************************************************/ - -/* - * Many of these macros may later turn into functions. They - * shouldn't be used in #ifdef's preprocessor instructions. - */ -/** - * xmlXPathSetError: - * @ctxt: an XPath parser context - * @err: an xmlXPathError code - * - * Raises an error. - */ -#define xmlXPathSetError(ctxt, err) \ - { xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \ - if ((ctxt) != NULL) (ctxt)->error = (err); } - -/** - * xmlXPathSetArityError: - * @ctxt: an XPath parser context - * - * Raises an XPATH_INVALID_ARITY error. - */ -#define xmlXPathSetArityError(ctxt) \ - xmlXPathSetError((ctxt), XPATH_INVALID_ARITY) - -/** - * xmlXPathSetTypeError: - * @ctxt: an XPath parser context - * - * Raises an XPATH_INVALID_TYPE error. - */ -#define xmlXPathSetTypeError(ctxt) \ - xmlXPathSetError((ctxt), XPATH_INVALID_TYPE) - -/** - * xmlXPathGetError: - * @ctxt: an XPath parser context - * - * Get the error code of an XPath context. - * - * Returns the context error. - */ -#define xmlXPathGetError(ctxt) ((ctxt)->error) - -/** - * xmlXPathCheckError: - * @ctxt: an XPath parser context - * - * Check if an XPath error was raised. - * - * Returns true if an error has been raised, false otherwise. - */ -#define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK) - -/** - * xmlXPathGetDocument: - * @ctxt: an XPath parser context - * - * Get the document of an XPath context. - * - * Returns the context document. - */ -#define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc) - -/** - * xmlXPathGetContextNode: - * @ctxt: an XPath parser context - * - * Get the context node of an XPath context. - * - * Returns the context node. - */ -#define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node) - -XMLPUBFUN int XMLCALL - xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt); -XMLPUBFUN double XMLCALL - xmlXPathPopNumber (xmlXPathParserContextPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlXPathPopString (xmlXPathParserContextPtr ctxt); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt); -XMLPUBFUN void * XMLCALL - xmlXPathPopExternal (xmlXPathParserContextPtr ctxt); - -/** - * xmlXPathReturnBoolean: - * @ctxt: an XPath parser context - * @val: a boolean - * - * Pushes the boolean @val on the context stack. - */ -#define xmlXPathReturnBoolean(ctxt, val) \ - valuePush((ctxt), xmlXPathNewBoolean(val)) - -/** - * xmlXPathReturnTrue: - * @ctxt: an XPath parser context - * - * Pushes true on the context stack. - */ -#define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1) - -/** - * xmlXPathReturnFalse: - * @ctxt: an XPath parser context - * - * Pushes false on the context stack. - */ -#define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0) - -/** - * xmlXPathReturnNumber: - * @ctxt: an XPath parser context - * @val: a double - * - * Pushes the double @val on the context stack. - */ -#define xmlXPathReturnNumber(ctxt, val) \ - valuePush((ctxt), xmlXPathNewFloat(val)) - -/** - * xmlXPathReturnString: - * @ctxt: an XPath parser context - * @str: a string - * - * Pushes the string @str on the context stack. - */ -#define xmlXPathReturnString(ctxt, str) \ - valuePush((ctxt), xmlXPathWrapString(str)) - -/** - * xmlXPathReturnEmptyString: - * @ctxt: an XPath parser context - * - * Pushes an empty string on the stack. - */ -#define xmlXPathReturnEmptyString(ctxt) \ - valuePush((ctxt), xmlXPathNewCString("")) - -/** - * xmlXPathReturnNodeSet: - * @ctxt: an XPath parser context - * @ns: a node-set - * - * Pushes the node-set @ns on the context stack. - */ -#define xmlXPathReturnNodeSet(ctxt, ns) \ - valuePush((ctxt), xmlXPathWrapNodeSet(ns)) - -/** - * xmlXPathReturnEmptyNodeSet: - * @ctxt: an XPath parser context - * - * Pushes an empty node-set on the context stack. - */ -#define xmlXPathReturnEmptyNodeSet(ctxt) \ - valuePush((ctxt), xmlXPathNewNodeSet(NULL)) - -/** - * xmlXPathReturnExternal: - * @ctxt: an XPath parser context - * @val: user data - * - * Pushes user data on the context stack. - */ -#define xmlXPathReturnExternal(ctxt, val) \ - valuePush((ctxt), xmlXPathWrapExternal(val)) - -/** - * xmlXPathStackIsNodeSet: - * @ctxt: an XPath parser context - * - * Check if the current value on the XPath stack is a node set or - * an XSLT value tree. - * - * Returns true if the current object on the stack is a node-set. - */ -#define xmlXPathStackIsNodeSet(ctxt) \ - (((ctxt)->value != NULL) \ - && (((ctxt)->value->type == XPATH_NODESET) \ - || ((ctxt)->value->type == XPATH_XSLT_TREE))) - -/** - * xmlXPathStackIsExternal: - * @ctxt: an XPath parser context - * - * Checks if the current value on the XPath stack is an external - * object. - * - * Returns true if the current object on the stack is an external - * object. - */ -#define xmlXPathStackIsExternal(ctxt) \ - ((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS)) - -/** - * xmlXPathEmptyNodeSet: - * @ns: a node-set - * - * Empties a node-set. - */ -#define xmlXPathEmptyNodeSet(ns) \ - { while ((ns)->nodeNr > 0) (ns)->nodeTab[(ns)->nodeNr--] = NULL; } - -/** - * CHECK_ERROR: - * - * Macro to return from the function if an XPath error was detected. - */ -#define CHECK_ERROR \ - if (ctxt->error != XPATH_EXPRESSION_OK) return - -/** - * CHECK_ERROR0: - * - * Macro to return 0 from the function if an XPath error was detected. - */ -#define CHECK_ERROR0 \ - if (ctxt->error != XPATH_EXPRESSION_OK) return(0) - -/** - * XP_ERROR: - * @X: the error code - * - * Macro to raise an XPath error and return. - */ -#define XP_ERROR(X) \ - { xmlXPathErr(ctxt, X); return; } - -/** - * XP_ERROR0: - * @X: the error code - * - * Macro to raise an XPath error and return 0. - */ -#define XP_ERROR0(X) \ - { xmlXPathErr(ctxt, X); return(0); } - -/** - * CHECK_TYPE: - * @typeval: the XPath type - * - * Macro to check that the value on top of the XPath stack is of a given - * type. - */ -#define CHECK_TYPE(typeval) \ - if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ - XP_ERROR(XPATH_INVALID_TYPE) - -/** - * CHECK_TYPE0: - * @typeval: the XPath type - * - * Macro to check that the value on top of the XPath stack is of a given - * type. Return(0) in case of failure - */ -#define CHECK_TYPE0(typeval) \ - if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ - XP_ERROR0(XPATH_INVALID_TYPE) - -/** - * CHECK_ARITY: - * @x: the number of expected args - * - * Macro to check that the number of args passed to an XPath function matches. - */ -#define CHECK_ARITY(x) \ - if (ctxt == NULL) return; \ - if (nargs != (x)) \ - XP_ERROR(XPATH_INVALID_ARITY); - -/** - * CAST_TO_STRING: - * - * Macro to try to cast the value on the top of the XPath stack to a string. - */ -#define CAST_TO_STRING \ - if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \ - xmlXPathStringFunction(ctxt, 1); - -/** - * CAST_TO_NUMBER: - * - * Macro to try to cast the value on the top of the XPath stack to a number. - */ -#define CAST_TO_NUMBER \ - if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \ - xmlXPathNumberFunction(ctxt, 1); - -/** - * CAST_TO_BOOLEAN: - * - * Macro to try to cast the value on the top of the XPath stack to a boolean. - */ -#define CAST_TO_BOOLEAN \ - if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \ - xmlXPathBooleanFunction(ctxt, 1); - -/* - * Variable Lookup forwarding. - */ - -XMLPUBFUN void XMLCALL - xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt, - xmlXPathVariableLookupFunc f, - void *data); - -/* - * Function Lookup forwarding. - */ - -XMLPUBFUN void XMLCALL - xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, - xmlXPathFuncLookupFunc f, - void *funcCtxt); - -/* - * Error reporting. - */ -XMLPUBFUN void XMLCALL - xmlXPatherror (xmlXPathParserContextPtr ctxt, - const char *file, - int line, - int no); - -XMLPUBFUN void XMLCALL - xmlXPathErr (xmlXPathParserContextPtr ctxt, - int error); - -#ifdef LIBXML_DEBUG_ENABLED -XMLPUBFUN void XMLCALL - xmlXPathDebugDumpObject (FILE *output, - xmlXPathObjectPtr cur, - int depth); -XMLPUBFUN void XMLCALL - xmlXPathDebugDumpCompExpr(FILE *output, - xmlXPathCompExprPtr comp, - int depth); -#endif -/** - * NodeSet handling. - */ -XMLPUBFUN int XMLCALL - xmlXPathNodeSetContains (xmlNodeSetPtr cur, - xmlNodePtr val); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathDifference (xmlNodeSetPtr nodes1, - xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathIntersection (xmlNodeSetPtr nodes1, - xmlNodeSetPtr nodes2); - -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathDistinctSorted (xmlNodeSetPtr nodes); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathDistinct (xmlNodeSetPtr nodes); - -XMLPUBFUN int XMLCALL - xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, - xmlNodeSetPtr nodes2); - -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, - xmlNodePtr node); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, - xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathNodeLeading (xmlNodeSetPtr nodes, - xmlNodePtr node); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathLeading (xmlNodeSetPtr nodes1, - xmlNodeSetPtr nodes2); - -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, - xmlNodePtr node); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, - xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathNodeTrailing (xmlNodeSetPtr nodes, - xmlNodePtr node); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathTrailing (xmlNodeSetPtr nodes1, - xmlNodeSetPtr nodes2); - - -/** - * Extending a context. - */ - -XMLPUBFUN int XMLCALL - xmlXPathRegisterNs (xmlXPathContextPtr ctxt, - const xmlChar *prefix, - const xmlChar *ns_uri); -XMLPUBFUN const xmlChar * XMLCALL - xmlXPathNsLookup (xmlXPathContextPtr ctxt, - const xmlChar *prefix); -XMLPUBFUN void XMLCALL - xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt); - -XMLPUBFUN int XMLCALL - xmlXPathRegisterFunc (xmlXPathContextPtr ctxt, - const xmlChar *name, - xmlXPathFunction f); -XMLPUBFUN int XMLCALL - xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt, - const xmlChar *name, - const xmlChar *ns_uri, - xmlXPathFunction f); -XMLPUBFUN int XMLCALL - xmlXPathRegisterVariable (xmlXPathContextPtr ctxt, - const xmlChar *name, - xmlXPathObjectPtr value); -XMLPUBFUN int XMLCALL - xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt, - const xmlChar *name, - const xmlChar *ns_uri, - xmlXPathObjectPtr value); -XMLPUBFUN xmlXPathFunction XMLCALL - xmlXPathFunctionLookup (xmlXPathContextPtr ctxt, - const xmlChar *name); -XMLPUBFUN xmlXPathFunction XMLCALL - xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt, - const xmlChar *name, - const xmlChar *ns_uri); -XMLPUBFUN void XMLCALL - xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathVariableLookup (xmlXPathContextPtr ctxt, - const xmlChar *name); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt, - const xmlChar *name, - const xmlChar *ns_uri); -XMLPUBFUN void XMLCALL - xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt); - -/** - * Utilities to extend XPath. - */ -XMLPUBFUN xmlXPathParserContextPtr XMLCALL - xmlXPathNewParserContext (const xmlChar *str, - xmlXPathContextPtr ctxt); -XMLPUBFUN void XMLCALL - xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt); - -/* TODO: remap to xmlXPathValuePop and Push. */ -XMLPUBFUN xmlXPathObjectPtr XMLCALL - valuePop (xmlXPathParserContextPtr ctxt); -XMLPUBFUN int XMLCALL - valuePush (xmlXPathParserContextPtr ctxt, - xmlXPathObjectPtr value); - -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathNewString (const xmlChar *val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathNewCString (const char *val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathWrapString (xmlChar *val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathWrapCString (char * val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathNewFloat (double val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathNewBoolean (int val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathNewNodeSet (xmlNodePtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathNewValueTree (xmlNodePtr val); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetAdd (xmlNodeSetPtr cur, - xmlNodePtr val); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur, - xmlNodePtr val); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetAddNs (xmlNodeSetPtr cur, - xmlNodePtr node, - xmlNsPtr ns); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetSort (xmlNodeSetPtr set); - -XMLPUBFUN void XMLCALL - xmlXPathRoot (xmlXPathParserContextPtr ctxt); -XMLPUBFUN void XMLCALL - xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlXPathParseName (xmlXPathParserContextPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlXPathParseNCName (xmlXPathParserContextPtr ctxt); - -/* - * Existing functions. - */ -XMLPUBFUN double XMLCALL - xmlXPathStringEvalNumber (const xmlChar *str); -XMLPUBFUN int XMLCALL - xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt, - xmlXPathObjectPtr res); -XMLPUBFUN void XMLCALL - xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathNodeSetMerge (xmlNodeSetPtr val1, - xmlNodeSetPtr val2); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetDel (xmlNodeSetPtr cur, - xmlNodePtr val); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetRemove (xmlNodeSetPtr cur, - int val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathNewNodeSetList (xmlNodeSetPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathWrapNodeSet (xmlNodeSetPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPathWrapExternal (void *val); - -XMLPUBFUN int XMLCALL xmlXPathEqualValues(xmlXPathParserContextPtr ctxt); -XMLPUBFUN int XMLCALL xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt); -XMLPUBFUN int XMLCALL xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict); -XMLPUBFUN void XMLCALL xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt); -XMLPUBFUN void XMLCALL xmlXPathAddValues(xmlXPathParserContextPtr ctxt); -XMLPUBFUN void XMLCALL xmlXPathSubValues(xmlXPathParserContextPtr ctxt); -XMLPUBFUN void XMLCALL xmlXPathMultValues(xmlXPathParserContextPtr ctxt); -XMLPUBFUN void XMLCALL xmlXPathDivValues(xmlXPathParserContextPtr ctxt); -XMLPUBFUN void XMLCALL xmlXPathModValues(xmlXPathParserContextPtr ctxt); - -XMLPUBFUN int XMLCALL xmlXPathIsNodeType(const xmlChar *name); - -/* - * Some of the axis navigation routines. - */ -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextSelf(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextChild(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextParent(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur); -/* - * The official core of XPath functions. - */ -XMLPUBFUN void XMLCALL xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs); -XMLPUBFUN void XMLCALL xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs); - -/** - * Really internal functions - */ -XMLPUBFUN void XMLCALL xmlXPathNodeSetFreeNs(xmlNsPtr ns); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_XPATH_ENABLED */ -#endif /* ! __XML_XPATH_INTERNALS_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/libxml/xpointer.h b/ThirdParty/libxml2/vtklibxml2/include/libxml/xpointer.h deleted file mode 100644 index ca2c5bd360b..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/libxml/xpointer.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Summary: API to handle XML Pointers - * Description: API to handle XML Pointers - * Base implementation was made accordingly to - * W3C Candidate Recommendation 7 June 2000 - * http://www.w3.org/TR/2000/CR-xptr-20000607 - * - * Added support for the element() scheme described in: - * W3C Proposed Recommendation 13 November 2002 - * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_XPTR_H__ -#define __XML_XPTR_H__ - -#include "xmlversion.h" - -#ifdef LIBXML_XPTR_ENABLED - -#include "tree.h" -#include "xpath.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * A Location Set - */ -typedef struct _xmlLocationSet xmlLocationSet; -typedef xmlLocationSet *xmlLocationSetPtr; -struct _xmlLocationSet { - int locNr; /* number of locations in the set */ - int locMax; /* size of the array as allocated */ - xmlXPathObjectPtr *locTab;/* array of locations */ -}; - -/* - * Handling of location sets. - */ - -XMLPUBFUN xmlLocationSetPtr XMLCALL - xmlXPtrLocationSetCreate (xmlXPathObjectPtr val); -XMLPUBFUN void XMLCALL - xmlXPtrFreeLocationSet (xmlLocationSetPtr obj); -XMLPUBFUN xmlLocationSetPtr XMLCALL - xmlXPtrLocationSetMerge (xmlLocationSetPtr val1, - xmlLocationSetPtr val2); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewRange (xmlNodePtr start, - int startindex, - xmlNodePtr end, - int endindex); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewRangePoints (xmlXPathObjectPtr start, - xmlXPathObjectPtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewRangeNodePoint (xmlNodePtr start, - xmlXPathObjectPtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewRangePointNode (xmlXPathObjectPtr start, - xmlNodePtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewRangeNodes (xmlNodePtr start, - xmlNodePtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewLocationSetNodes (xmlNodePtr start, - xmlNodePtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewLocationSetNodeSet(xmlNodeSetPtr set); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewRangeNodeObject (xmlNodePtr start, - xmlXPathObjectPtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrNewCollapsedRange (xmlNodePtr start); -XMLPUBFUN void XMLCALL - xmlXPtrLocationSetAdd (xmlLocationSetPtr cur, - xmlXPathObjectPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrWrapLocationSet (xmlLocationSetPtr val); -XMLPUBFUN void XMLCALL - xmlXPtrLocationSetDel (xmlLocationSetPtr cur, - xmlXPathObjectPtr val); -XMLPUBFUN void XMLCALL - xmlXPtrLocationSetRemove (xmlLocationSetPtr cur, - int val); - -/* - * Functions. - */ -XMLPUBFUN xmlXPathContextPtr XMLCALL - xmlXPtrNewContext (xmlDocPtr doc, - xmlNodePtr here, - xmlNodePtr origin); -XMLPUBFUN xmlXPathObjectPtr XMLCALL - xmlXPtrEval (const xmlChar *str, - xmlXPathContextPtr ctx); -XMLPUBFUN void XMLCALL - xmlXPtrRangeToFunction (xmlXPathParserContextPtr ctxt, - int nargs); -XMLPUBFUN xmlNodePtr XMLCALL - xmlXPtrBuildNodeList (xmlXPathObjectPtr obj); -XMLPUBFUN void XMLCALL - xmlXPtrEvalRangePredicate (xmlXPathParserContextPtr ctxt); -#ifdef __cplusplus -} -#endif - -#endif /* LIBXML_XPTR_ENABLED */ -#endif /* __XML_XPTR_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/include/wsockcompat.h b/ThirdParty/libxml2/vtklibxml2/include/wsockcompat.h deleted file mode 100644 index 333b5614f61..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/include/wsockcompat.h +++ /dev/null @@ -1,81 +0,0 @@ -/* include/wsockcompat.h - * Windows -> Berkeley Sockets compatibility things. - */ - -#if !defined __XML_WSOCKCOMPAT_H__ -#define __XML_WSOCKCOMPAT_H__ - -#ifdef _WIN32_WCE -#include <winsock.h> -#else -#undef HAVE_ERRNO_H -#include <winsock2.h> - -/* the following is a workaround a problem for 'inline' keyword in said - header when compiled with Borland C++ 6 */ -#if defined(__BORLANDC__) && !defined(__cplusplus) -#define inline __inline -#endif - -#include <ws2tcpip.h> - -/* Check if ws2tcpip.h is a recent version which provides getaddrinfo() */ -#if defined(GetAddrInfo) -#define HAVE_GETADDRINFO -#endif -#endif - -#ifdef __MINGW32__ -/* Include <errno.h> here to ensure that it doesn't get included later - * (e.g. by iconv.h) and overwrites the definition of EWOULDBLOCK. */ -#include <errno.h> -#undef EWOULDBLOCK -#endif - -#if !defined SOCKLEN_T -#define SOCKLEN_T int -#endif - -#define EWOULDBLOCK WSAEWOULDBLOCK -#define EINPROGRESS WSAEINPROGRESS -#define EALREADY WSAEALREADY -#define ENOTSOCK WSAENOTSOCK -#define EDESTADDRREQ WSAEDESTADDRREQ -#define EMSGSIZE WSAEMSGSIZE -#define EPROTOTYPE WSAEPROTOTYPE -#define ENOPROTOOPT WSAENOPROTOOPT -#define EPROTONOSUPPORT WSAEPROTONOSUPPORT -#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT -#define EOPNOTSUPP WSAEOPNOTSUPP -#define EPFNOSUPPORT WSAEPFNOSUPPORT -#define EAFNOSUPPORT WSAEAFNOSUPPORT -#define EADDRINUSE WSAEADDRINUSE -#define EADDRNOTAVAIL WSAEADDRNOTAVAIL -#define ENETDOWN WSAENETDOWN -#define ENETUNREACH WSAENETUNREACH -#define ENETRESET WSAENETRESET -#define ECONNABORTED WSAECONNABORTED -#define ECONNRESET WSAECONNRESET -#define ENOBUFS WSAENOBUFS -#define EISCONN WSAEISCONN -#define ENOTCONN WSAENOTCONN -#define ESHUTDOWN WSAESHUTDOWN -#define ETOOMANYREFS WSAETOOMANYREFS -#define ETIMEDOUT WSAETIMEDOUT -#define ECONNREFUSED WSAECONNREFUSED -#define ELOOP WSAELOOP -#define EHOSTDOWN WSAEHOSTDOWN -#define EHOSTUNREACH WSAEHOSTUNREACH -#define EPROCLIM WSAEPROCLIM -#define EUSERS WSAEUSERS -#define EDQUOT WSAEDQUOT -#define ESTALE WSAESTALE -#define EREMOTE WSAEREMOTE -/* These cause conflicts with the codes from errno.h. Since they are - not used in the relevant code (nanoftp, nanohttp), we can leave - them disabled. -#define ENAMETOOLONG WSAENAMETOOLONG -#define ENOTEMPTY WSAENOTEMPTY -*/ - -#endif /* __XML_WSOCKCOMPAT_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/legacy.c b/ThirdParty/libxml2/vtklibxml2/legacy.c deleted file mode 100644 index 80742af12c8..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/legacy.c +++ /dev/null @@ -1,1328 +0,0 @@ -/* - * legacy.c: set of deprecated routines, not to be used anymore but - * kept purely for ABI compatibility - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_LEGACY_ENABLED -#include <string.h> - -#include <libxml/tree.h> -#include <libxml/entities.h> -#include <libxml/SAX.h> -#include <libxml/parserInternals.h> -#include <libxml/HTMLparser.h> - -void xmlUpgradeOldNs(xmlDocPtr doc); - -/************************************************************************ - * * - * Deprecated functions kept for compatibility * - * * - ************************************************************************/ - -#ifdef LIBXML_HTML_ENABLED -xmlChar *htmlDecodeEntities(htmlParserCtxtPtr ctxt, int len, xmlChar end, - xmlChar end2, xmlChar end3); - -/** - * htmlDecodeEntities: - * @ctxt: the parser context - * @len: the len to decode (in bytes !), -1 for no size limit - * @end: an end marker xmlChar, 0 if none - * @end2: an end marker xmlChar, 0 if none - * @end3: an end marker xmlChar, 0 if none - * - * Substitute the HTML entities by their value - * - * DEPRECATED !!!! - * - * Returns A newly allocated string with the substitution done. The caller - * must deallocate it ! - */ -xmlChar * -htmlDecodeEntities(htmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - int len ATTRIBUTE_UNUSED, xmlChar end ATTRIBUTE_UNUSED, - xmlChar end2 ATTRIBUTE_UNUSED, - xmlChar end3 ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "htmlDecodeEntities() deprecated function reached\n"); - deprecated = 1; - } - return (NULL); -} -#endif - -/** - * xmlInitializePredefinedEntities: - * - * Set up the predefined entities. - * Deprecated call - */ -void -xmlInitializePredefinedEntities(void) -{ -} - -/** - * xmlCleanupPredefinedEntities: - * - * Cleanup up the predefined entities table. - * Deprecated call - */ -void -xmlCleanupPredefinedEntities(void) -{ -} - -static const char *xmlFeaturesList[] = { - "validate", - "load subset", - "keep blanks", - "disable SAX", - "fetch external entities", - "substitute entities", - "gather line info", - "user data", - "is html", - "is standalone", - "stop parser", - "document", - "is well formed", - "is valid", - "SAX block", - "SAX function internalSubset", - "SAX function isStandalone", - "SAX function hasInternalSubset", - "SAX function hasExternalSubset", - "SAX function resolveEntity", - "SAX function getEntity", - "SAX function entityDecl", - "SAX function notationDecl", - "SAX function attributeDecl", - "SAX function elementDecl", - "SAX function unparsedEntityDecl", - "SAX function setDocumentLocator", - "SAX function startDocument", - "SAX function endDocument", - "SAX function startElement", - "SAX function endElement", - "SAX function reference", - "SAX function characters", - "SAX function ignorableWhitespace", - "SAX function processingInstruction", - "SAX function comment", - "SAX function warning", - "SAX function error", - "SAX function fatalError", - "SAX function getParameterEntity", - "SAX function cdataBlock", - "SAX function externalSubset", -}; - -/** - * xmlGetFeaturesList: - * @len: the length of the features name array (input/output) - * @result: an array of string to be filled with the features name. - * - * Copy at most *@len feature names into the @result array - * - * Returns -1 in case or error, or the total number of features, - * len is updated with the number of strings copied, - * strings must not be deallocated - */ -int -xmlGetFeaturesList(int *len, const char **result) -{ - int ret, i; - - ret = sizeof(xmlFeaturesList) / sizeof(xmlFeaturesList[0]); - if ((len == NULL) || (result == NULL)) - return (ret); - if ((*len < 0) || (*len >= 1000)) - return (-1); - if (*len > ret) - *len = ret; - for (i = 0; i < *len; i++) - result[i] = xmlFeaturesList[i]; - return (ret); -} - -/** - * xmlGetFeature: - * @ctxt: an XML/HTML parser context - * @name: the feature name - * @result: location to store the result - * - * Read the current value of one feature of this parser instance - * - * Returns -1 in case or error, 0 otherwise - */ -int -xmlGetFeature(xmlParserCtxtPtr ctxt, const char *name, void *result) -{ - if ((ctxt == NULL) || (name == NULL) || (result == NULL)) - return (-1); - - if (!strcmp(name, "validate")) { - *((int *) result) = ctxt->validate; - } else if (!strcmp(name, "keep blanks")) { - *((int *) result) = ctxt->keepBlanks; - } else if (!strcmp(name, "disable SAX")) { - *((int *) result) = ctxt->disableSAX; - } else if (!strcmp(name, "fetch external entities")) { - *((int *) result) = ctxt->loadsubset; - } else if (!strcmp(name, "substitute entities")) { - *((int *) result) = ctxt->replaceEntities; - } else if (!strcmp(name, "gather line info")) { - *((int *) result) = ctxt->record_info; - } else if (!strcmp(name, "user data")) { - *((void **) result) = ctxt->userData; - } else if (!strcmp(name, "is html")) { - *((int *) result) = ctxt->html; - } else if (!strcmp(name, "is standalone")) { - *((int *) result) = ctxt->standalone; - } else if (!strcmp(name, "document")) { - *((xmlDocPtr *) result) = ctxt->myDoc; - } else if (!strcmp(name, "is well formed")) { - *((int *) result) = ctxt->wellFormed; - } else if (!strcmp(name, "is valid")) { - *((int *) result) = ctxt->valid; - } else if (!strcmp(name, "SAX block")) { - *((xmlSAXHandlerPtr *) result) = ctxt->sax; - } else if (!strcmp(name, "SAX function internalSubset")) { - *((internalSubsetSAXFunc *) result) = ctxt->sax->internalSubset; - } else if (!strcmp(name, "SAX function isStandalone")) { - *((isStandaloneSAXFunc *) result) = ctxt->sax->isStandalone; - } else if (!strcmp(name, "SAX function hasInternalSubset")) { - *((hasInternalSubsetSAXFunc *) result) = - ctxt->sax->hasInternalSubset; - } else if (!strcmp(name, "SAX function hasExternalSubset")) { - *((hasExternalSubsetSAXFunc *) result) = - ctxt->sax->hasExternalSubset; - } else if (!strcmp(name, "SAX function resolveEntity")) { - *((resolveEntitySAXFunc *) result) = ctxt->sax->resolveEntity; - } else if (!strcmp(name, "SAX function getEntity")) { - *((getEntitySAXFunc *) result) = ctxt->sax->getEntity; - } else if (!strcmp(name, "SAX function entityDecl")) { - *((entityDeclSAXFunc *) result) = ctxt->sax->entityDecl; - } else if (!strcmp(name, "SAX function notationDecl")) { - *((notationDeclSAXFunc *) result) = ctxt->sax->notationDecl; - } else if (!strcmp(name, "SAX function attributeDecl")) { - *((attributeDeclSAXFunc *) result) = ctxt->sax->attributeDecl; - } else if (!strcmp(name, "SAX function elementDecl")) { - *((elementDeclSAXFunc *) result) = ctxt->sax->elementDecl; - } else if (!strcmp(name, "SAX function unparsedEntityDecl")) { - *((unparsedEntityDeclSAXFunc *) result) = - ctxt->sax->unparsedEntityDecl; - } else if (!strcmp(name, "SAX function setDocumentLocator")) { - *((setDocumentLocatorSAXFunc *) result) = - ctxt->sax->setDocumentLocator; - } else if (!strcmp(name, "SAX function startDocument")) { - *((startDocumentSAXFunc *) result) = ctxt->sax->startDocument; - } else if (!strcmp(name, "SAX function endDocument")) { - *((endDocumentSAXFunc *) result) = ctxt->sax->endDocument; - } else if (!strcmp(name, "SAX function startElement")) { - *((startElementSAXFunc *) result) = ctxt->sax->startElement; - } else if (!strcmp(name, "SAX function endElement")) { - *((endElementSAXFunc *) result) = ctxt->sax->endElement; - } else if (!strcmp(name, "SAX function reference")) { - *((referenceSAXFunc *) result) = ctxt->sax->reference; - } else if (!strcmp(name, "SAX function characters")) { - *((charactersSAXFunc *) result) = ctxt->sax->characters; - } else if (!strcmp(name, "SAX function ignorableWhitespace")) { - *((ignorableWhitespaceSAXFunc *) result) = - ctxt->sax->ignorableWhitespace; - } else if (!strcmp(name, "SAX function processingInstruction")) { - *((processingInstructionSAXFunc *) result) = - ctxt->sax->processingInstruction; - } else if (!strcmp(name, "SAX function comment")) { - *((commentSAXFunc *) result) = ctxt->sax->comment; - } else if (!strcmp(name, "SAX function warning")) { - *((warningSAXFunc *) result) = ctxt->sax->warning; - } else if (!strcmp(name, "SAX function error")) { - *((errorSAXFunc *) result) = ctxt->sax->error; - } else if (!strcmp(name, "SAX function fatalError")) { - *((fatalErrorSAXFunc *) result) = ctxt->sax->fatalError; - } else if (!strcmp(name, "SAX function getParameterEntity")) { - *((getParameterEntitySAXFunc *) result) = - ctxt->sax->getParameterEntity; - } else if (!strcmp(name, "SAX function cdataBlock")) { - *((cdataBlockSAXFunc *) result) = ctxt->sax->cdataBlock; - } else if (!strcmp(name, "SAX function externalSubset")) { - *((externalSubsetSAXFunc *) result) = ctxt->sax->externalSubset; - } else { - return (-1); - } - return (0); -} - -/** - * xmlSetFeature: - * @ctxt: an XML/HTML parser context - * @name: the feature name - * @value: pointer to the location of the new value - * - * Change the current value of one feature of this parser instance - * - * Returns -1 in case or error, 0 otherwise - */ -int -xmlSetFeature(xmlParserCtxtPtr ctxt, const char *name, void *value) -{ - if ((ctxt == NULL) || (name == NULL) || (value == NULL)) - return (-1); - - if (!strcmp(name, "validate")) { - int newvalidate = *((int *) value); - - if ((!ctxt->validate) && (newvalidate != 0)) { - if (ctxt->vctxt.warning == NULL) - ctxt->vctxt.warning = xmlParserValidityWarning; - if (ctxt->vctxt.error == NULL) - ctxt->vctxt.error = xmlParserValidityError; - ctxt->vctxt.nodeMax = 0; - } - ctxt->validate = newvalidate; - } else if (!strcmp(name, "keep blanks")) { - ctxt->keepBlanks = *((int *) value); - } else if (!strcmp(name, "disable SAX")) { - ctxt->disableSAX = *((int *) value); - } else if (!strcmp(name, "fetch external entities")) { - ctxt->loadsubset = *((int *) value); - } else if (!strcmp(name, "substitute entities")) { - ctxt->replaceEntities = *((int *) value); - } else if (!strcmp(name, "gather line info")) { - ctxt->record_info = *((int *) value); - } else if (!strcmp(name, "user data")) { - ctxt->userData = *((void **) value); - } else if (!strcmp(name, "is html")) { - ctxt->html = *((int *) value); - } else if (!strcmp(name, "is standalone")) { - ctxt->standalone = *((int *) value); - } else if (!strcmp(name, "document")) { - ctxt->myDoc = *((xmlDocPtr *) value); - } else if (!strcmp(name, "is well formed")) { - ctxt->wellFormed = *((int *) value); - } else if (!strcmp(name, "is valid")) { - ctxt->valid = *((int *) value); - } else if (!strcmp(name, "SAX block")) { - ctxt->sax = *((xmlSAXHandlerPtr *) value); - } else if (!strcmp(name, "SAX function internalSubset")) { - ctxt->sax->internalSubset = *((internalSubsetSAXFunc *) value); - } else if (!strcmp(name, "SAX function isStandalone")) { - ctxt->sax->isStandalone = *((isStandaloneSAXFunc *) value); - } else if (!strcmp(name, "SAX function hasInternalSubset")) { - ctxt->sax->hasInternalSubset = - *((hasInternalSubsetSAXFunc *) value); - } else if (!strcmp(name, "SAX function hasExternalSubset")) { - ctxt->sax->hasExternalSubset = - *((hasExternalSubsetSAXFunc *) value); - } else if (!strcmp(name, "SAX function resolveEntity")) { - ctxt->sax->resolveEntity = *((resolveEntitySAXFunc *) value); - } else if (!strcmp(name, "SAX function getEntity")) { - ctxt->sax->getEntity = *((getEntitySAXFunc *) value); - } else if (!strcmp(name, "SAX function entityDecl")) { - ctxt->sax->entityDecl = *((entityDeclSAXFunc *) value); - } else if (!strcmp(name, "SAX function notationDecl")) { - ctxt->sax->notationDecl = *((notationDeclSAXFunc *) value); - } else if (!strcmp(name, "SAX function attributeDecl")) { - ctxt->sax->attributeDecl = *((attributeDeclSAXFunc *) value); - } else if (!strcmp(name, "SAX function elementDecl")) { - ctxt->sax->elementDecl = *((elementDeclSAXFunc *) value); - } else if (!strcmp(name, "SAX function unparsedEntityDecl")) { - ctxt->sax->unparsedEntityDecl = - *((unparsedEntityDeclSAXFunc *) value); - } else if (!strcmp(name, "SAX function setDocumentLocator")) { - ctxt->sax->setDocumentLocator = - *((setDocumentLocatorSAXFunc *) value); - } else if (!strcmp(name, "SAX function startDocument")) { - ctxt->sax->startDocument = *((startDocumentSAXFunc *) value); - } else if (!strcmp(name, "SAX function endDocument")) { - ctxt->sax->endDocument = *((endDocumentSAXFunc *) value); - } else if (!strcmp(name, "SAX function startElement")) { - ctxt->sax->startElement = *((startElementSAXFunc *) value); - } else if (!strcmp(name, "SAX function endElement")) { - ctxt->sax->endElement = *((endElementSAXFunc *) value); - } else if (!strcmp(name, "SAX function reference")) { - ctxt->sax->reference = *((referenceSAXFunc *) value); - } else if (!strcmp(name, "SAX function characters")) { - ctxt->sax->characters = *((charactersSAXFunc *) value); - } else if (!strcmp(name, "SAX function ignorableWhitespace")) { - ctxt->sax->ignorableWhitespace = - *((ignorableWhitespaceSAXFunc *) value); - } else if (!strcmp(name, "SAX function processingInstruction")) { - ctxt->sax->processingInstruction = - *((processingInstructionSAXFunc *) value); - } else if (!strcmp(name, "SAX function comment")) { - ctxt->sax->comment = *((commentSAXFunc *) value); - } else if (!strcmp(name, "SAX function warning")) { - ctxt->sax->warning = *((warningSAXFunc *) value); - } else if (!strcmp(name, "SAX function error")) { - ctxt->sax->error = *((errorSAXFunc *) value); - } else if (!strcmp(name, "SAX function fatalError")) { - ctxt->sax->fatalError = *((fatalErrorSAXFunc *) value); - } else if (!strcmp(name, "SAX function getParameterEntity")) { - ctxt->sax->getParameterEntity = - *((getParameterEntitySAXFunc *) value); - } else if (!strcmp(name, "SAX function cdataBlock")) { - ctxt->sax->cdataBlock = *((cdataBlockSAXFunc *) value); - } else if (!strcmp(name, "SAX function externalSubset")) { - ctxt->sax->externalSubset = *((externalSubsetSAXFunc *) value); - } else { - return (-1); - } - return (0); -} - -/** - * xmlDecodeEntities: - * @ctxt: the parser context - * @len: the len to decode (in bytes !), -1 for no size limit - * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF - * @end: an end marker xmlChar, 0 if none - * @end2: an end marker xmlChar, 0 if none - * @end3: an end marker xmlChar, 0 if none - * - * This function is deprecated, we now always process entities content - * through xmlStringDecodeEntities - * - * TODO: remove it in next major release. - * - * [67] Reference ::= EntityRef | CharRef - * - * [69] PEReference ::= '%' Name ';' - * - * Returns A newly allocated string with the substitution done. The caller - * must deallocate it ! - */ -xmlChar * -xmlDecodeEntities(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - int len ATTRIBUTE_UNUSED, int what ATTRIBUTE_UNUSED, - xmlChar end ATTRIBUTE_UNUSED, - xmlChar end2 ATTRIBUTE_UNUSED, - xmlChar end3 ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlDecodeEntities() deprecated function reached\n"); - deprecated = 1; - } - return (NULL); -} - -/** - * xmlNamespaceParseNCName: - * @ctxt: an XML parser context - * - * parse an XML namespace name. - * - * TODO: this seems not in use anymore, the namespace handling is done on - * top of the SAX interfaces, i.e. not on raw input. - * - * [NS 3] NCName ::= (Letter | '_') (NCNameChar)* - * - * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | - * CombiningChar | Extender - * - * Returns the namespace name or NULL - */ - -xmlChar * -xmlNamespaceParseNCName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlNamespaceParseNCName() deprecated function reached\n"); - deprecated = 1; - } - return (NULL); -} - -/** - * xmlNamespaceParseQName: - * @ctxt: an XML parser context - * @prefix: a xmlChar ** - * - * TODO: this seems not in use anymore, the namespace handling is done on - * top of the SAX interfaces, i.e. not on raw input. - * - * parse an XML qualified name - * - * [NS 5] QName ::= (Prefix ':')? LocalPart - * - * [NS 6] Prefix ::= NCName - * - * [NS 7] LocalPart ::= NCName - * - * Returns the local part, and prefix is updated - * to get the Prefix if any. - */ - -xmlChar * -xmlNamespaceParseQName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlChar ** prefix ATTRIBUTE_UNUSED) -{ - - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlNamespaceParseQName() deprecated function reached\n"); - deprecated = 1; - } - return (NULL); -} - -/** - * xmlNamespaceParseNSDef: - * @ctxt: an XML parser context - * - * parse a namespace prefix declaration - * - * TODO: this seems not in use anymore, the namespace handling is done on - * top of the SAX interfaces, i.e. not on raw input. - * - * [NS 1] NSDef ::= PrefixDef Eq SystemLiteral - * - * [NS 2] PrefixDef ::= 'xmlns' (':' NCName)? - * - * Returns the namespace name - */ - -xmlChar * -xmlNamespaceParseNSDef(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlNamespaceParseNSDef() deprecated function reached\n"); - deprecated = 1; - } - return (NULL); -} - -/** - * xmlParseQuotedString: - * @ctxt: an XML parser context - * - * Parse and return a string between quotes or doublequotes - * - * TODO: Deprecated, to be removed at next drop of binary compatibility - * - * Returns the string parser or NULL. - */ -xmlChar * -xmlParseQuotedString(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlParseQuotedString() deprecated function reached\n"); - deprecated = 1; - } - return (NULL); -} - -/** - * xmlParseNamespace: - * @ctxt: an XML parser context - * - * xmlParseNamespace: parse specific PI '<?namespace ...' constructs. - * - * This is what the older xml-name Working Draft specified, a bunch of - * other stuff may still rely on it, so support is still here as - * if it was declared on the root of the Tree:-( - * - * TODO: remove from library - * - * To be removed at next drop of binary compatibility - */ - -void -xmlParseNamespace(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlParseNamespace() deprecated function reached\n"); - deprecated = 1; - } -} - -/** - * xmlScanName: - * @ctxt: an XML parser context - * - * Trickery: parse an XML name but without consuming the input flow - * Needed for rollback cases. Used only when parsing entities references. - * - * TODO: seems deprecated now, only used in the default part of - * xmlParserHandleReference - * - * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | - * CombiningChar | Extender - * - * [5] Name ::= (Letter | '_' | ':') (NameChar)* - * - * [6] Names ::= Name (S Name)* - * - * Returns the Name parsed or NULL - */ - -xmlChar * -xmlScanName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlScanName() deprecated function reached\n"); - deprecated = 1; - } - return (NULL); -} - -/** - * xmlParserHandleReference: - * @ctxt: the parser context - * - * TODO: Remove, now deprecated ... the test is done directly in the - * content parsing - * routines. - * - * [67] Reference ::= EntityRef | CharRef - * - * [68] EntityRef ::= '&' Name ';' - * - * [ WFC: Entity Declared ] - * the Name given in the entity reference must match that in an entity - * declaration, except that well-formed documents need not declare any - * of the following entities: amp, lt, gt, apos, quot. - * - * [ WFC: Parsed Entity ] - * An entity reference must not contain the name of an unparsed entity - * - * [66] CharRef ::= '&#' [0-9]+ ';' | - * '&#x' [0-9a-fA-F]+ ';' - * - * A PEReference may have been detected in the current input stream - * the handling is done accordingly to - * http://www.w3.org/TR/REC-xml#entproc - */ -void -xmlParserHandleReference(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlParserHandleReference() deprecated function reached\n"); - deprecated = 1; - } - - return; -} - -/** - * xmlHandleEntity: - * @ctxt: an XML parser context - * @entity: an XML entity pointer. - * - * Default handling of defined entities, when should we define a new input - * stream ? When do we just handle that as a set of chars ? - * - * OBSOLETE: to be removed at some point. - */ - -void -xmlHandleEntity(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlEntityPtr entity ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlHandleEntity() deprecated function reached\n"); - deprecated = 1; - } -} - -/** - * xmlNewGlobalNs: - * @doc: the document carrying the namespace - * @href: the URI associated - * @prefix: the prefix for the namespace - * - * Creation of a Namespace, the old way using PI and without scoping - * DEPRECATED !!! - * Returns NULL this functionality had been removed - */ -xmlNsPtr -xmlNewGlobalNs(xmlDocPtr doc ATTRIBUTE_UNUSED, - const xmlChar * href ATTRIBUTE_UNUSED, - const xmlChar * prefix ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlNewGlobalNs() deprecated function reached\n"); - deprecated = 1; - } - return (NULL); -} - -/** - * xmlUpgradeOldNs: - * @doc: a document pointer - * - * Upgrade old style Namespaces (PI) and move them to the root of the document. - * DEPRECATED - */ -void -xmlUpgradeOldNs(xmlDocPtr doc ATTRIBUTE_UNUSED) -{ - static int deprecated = 0; - - if (!deprecated) { - xmlGenericError(xmlGenericErrorContext, - "xmlUpgradeOldNs() deprecated function reached\n"); - deprecated = 1; - } -} - -/** - * xmlEncodeEntities: - * @doc: the document containing the string - * @input: A string to convert to XML. - * - * TODO: remove xmlEncodeEntities, once we are not afraid of breaking binary - * compatibility - * - * People must migrate their code to xmlEncodeEntitiesReentrant ! - * This routine will issue a warning when encountered. - * - * Returns NULL - */ -const xmlChar * -xmlEncodeEntities(xmlDocPtr doc ATTRIBUTE_UNUSED, - const xmlChar * input ATTRIBUTE_UNUSED) -{ - static int warning = 1; - - if (warning) { - xmlGenericError(xmlGenericErrorContext, - "Deprecated API xmlEncodeEntities() used\n"); - xmlGenericError(xmlGenericErrorContext, - " change code to use xmlEncodeEntitiesReentrant()\n"); - warning = 0; - } - return (NULL); -} - -/************************************************************************ - * * - * Old set of SAXv1 functions * - * * - ************************************************************************/ -static int deprecated_v1_msg = 0; - -#define DEPRECATED(n) \ - if (deprecated_v1_msg == 0) \ - xmlGenericError(xmlGenericErrorContext, \ - "Use of deprecated SAXv1 function %s\n", n); \ - deprecated_v1_msg++; - -/** - * getPublicId: - * @ctx: the user data (XML parser context) - * - * Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" - * DEPRECATED: use xmlSAX2GetPublicId() - * - * Returns a xmlChar * - */ -const xmlChar * -getPublicId(void *ctx) -{ - DEPRECATED("getPublicId") - return (xmlSAX2GetPublicId(ctx)); -} - -/** - * getSystemId: - * @ctx: the user data (XML parser context) - * - * Provides the system ID, basically URL or filename e.g. - * http://www.sgmlsource.com/dtds/memo.dtd - * DEPRECATED: use xmlSAX2GetSystemId() - * - * Returns a xmlChar * - */ -const xmlChar * -getSystemId(void *ctx) -{ - DEPRECATED("getSystemId") - return (xmlSAX2GetSystemId(ctx)); -} - -/** - * getLineNumber: - * @ctx: the user data (XML parser context) - * - * Provide the line number of the current parsing point. - * DEPRECATED: use xmlSAX2GetLineNumber() - * - * Returns an int - */ -int -getLineNumber(void *ctx) -{ - DEPRECATED("getLineNumber") - return (xmlSAX2GetLineNumber(ctx)); -} - -/** - * getColumnNumber: - * @ctx: the user data (XML parser context) - * - * Provide the column number of the current parsing point. - * DEPRECATED: use xmlSAX2GetColumnNumber() - * - * Returns an int - */ -int -getColumnNumber(void *ctx) -{ - DEPRECATED("getColumnNumber") - return (xmlSAX2GetColumnNumber(ctx)); -} - -/** - * isStandalone: - * @ctx: the user data (XML parser context) - * - * Is this document tagged standalone ? - * DEPRECATED: use xmlSAX2IsStandalone() - * - * Returns 1 if true - */ -int -isStandalone(void *ctx) -{ - DEPRECATED("isStandalone") - return (xmlSAX2IsStandalone(ctx)); -} - -/** - * hasInternalSubset: - * @ctx: the user data (XML parser context) - * - * Does this document has an internal subset - * DEPRECATED: use xmlSAX2HasInternalSubset() - * - * Returns 1 if true - */ -int -hasInternalSubset(void *ctx) -{ - DEPRECATED("hasInternalSubset") - return (xmlSAX2HasInternalSubset(ctx)); -} - -/** - * hasExternalSubset: - * @ctx: the user data (XML parser context) - * - * Does this document has an external subset - * DEPRECATED: use xmlSAX2HasExternalSubset() - * - * Returns 1 if true - */ -int -hasExternalSubset(void *ctx) -{ - DEPRECATED("hasExternalSubset") - return (xmlSAX2HasExternalSubset(ctx)); -} - -/** - * internalSubset: - * @ctx: the user data (XML parser context) - * @name: the root element name - * @ExternalID: the external ID - * @SystemID: the SYSTEM ID (e.g. filename or URL) - * - * Callback on internal subset declaration. - * DEPRECATED: use xmlSAX2InternalSubset() - */ -void -internalSubset(void *ctx, const xmlChar * name, - const xmlChar * ExternalID, const xmlChar * SystemID) -{ - DEPRECATED("internalSubset") - xmlSAX2InternalSubset(ctx, name, ExternalID, SystemID); -} - -/** - * externalSubset: - * @ctx: the user data (XML parser context) - * @name: the root element name - * @ExternalID: the external ID - * @SystemID: the SYSTEM ID (e.g. filename or URL) - * - * Callback on external subset declaration. - * DEPRECATED: use xmlSAX2ExternalSubset() - */ -void -externalSubset(void *ctx, const xmlChar * name, - const xmlChar * ExternalID, const xmlChar * SystemID) -{ - DEPRECATED("externalSubset") - xmlSAX2ExternalSubset(ctx, name, ExternalID, SystemID); -} - -/** - * resolveEntity: - * @ctx: the user data (XML parser context) - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * The entity loader, to control the loading of external entities, - * the application can either: - * - override this resolveEntity() callback in the SAX block - * - or better use the xmlSetExternalEntityLoader() function to - * set up it's own entity resolution routine - * DEPRECATED: use xmlSAX2ResolveEntity() - * - * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. - */ -xmlParserInputPtr -resolveEntity(void *ctx, const xmlChar * publicId, - const xmlChar * systemId) -{ - DEPRECATED("resolveEntity") - return (xmlSAX2ResolveEntity(ctx, publicId, systemId)); -} - -/** - * getEntity: - * @ctx: the user data (XML parser context) - * @name: The entity name - * - * Get an entity by name - * DEPRECATED: use xmlSAX2GetEntity() - * - * Returns the xmlEntityPtr if found. - */ -xmlEntityPtr -getEntity(void *ctx, const xmlChar * name) -{ - DEPRECATED("getEntity") - return (xmlSAX2GetEntity(ctx, name)); -} - -/** - * getParameterEntity: - * @ctx: the user data (XML parser context) - * @name: The entity name - * - * Get a parameter entity by name - * DEPRECATED: use xmlSAX2GetParameterEntity() - * - * Returns the xmlEntityPtr if found. - */ -xmlEntityPtr -getParameterEntity(void *ctx, const xmlChar * name) -{ - DEPRECATED("getParameterEntity") - return (xmlSAX2GetParameterEntity(ctx, name)); -} - - -/** - * entityDecl: - * @ctx: the user data (XML parser context) - * @name: the entity name - * @type: the entity type - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @content: the entity value (without processing). - * - * An entity definition has been parsed - * DEPRECATED: use xmlSAX2EntityDecl() - */ -void -entityDecl(void *ctx, const xmlChar * name, int type, - const xmlChar * publicId, const xmlChar * systemId, - xmlChar * content) -{ - DEPRECATED("entityDecl") - xmlSAX2EntityDecl(ctx, name, type, publicId, systemId, content); -} - -/** - * attributeDecl: - * @ctx: the user data (XML parser context) - * @elem: the name of the element - * @fullname: the attribute name - * @type: the attribute type - * @def: the type of default value - * @defaultValue: the attribute default value - * @tree: the tree of enumerated value set - * - * An attribute definition has been parsed - * DEPRECATED: use xmlSAX2AttributeDecl() - */ -void -attributeDecl(void *ctx, const xmlChar * elem, const xmlChar * fullname, - int type, int def, const xmlChar * defaultValue, - xmlEnumerationPtr tree) -{ - DEPRECATED("attributeDecl") - xmlSAX2AttributeDecl(ctx, elem, fullname, type, def, defaultValue, - tree); -} - -/** - * elementDecl: - * @ctx: the user data (XML parser context) - * @name: the element name - * @type: the element type - * @content: the element value tree - * - * An element definition has been parsed - * DEPRECATED: use xmlSAX2ElementDecl() - */ -void -elementDecl(void *ctx, const xmlChar * name, int type, - xmlElementContentPtr content) -{ - DEPRECATED("elementDecl") - xmlSAX2ElementDecl(ctx, name, type, content); -} - -/** - * notationDecl: - * @ctx: the user data (XML parser context) - * @name: The name of the notation - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * What to do when a notation declaration has been parsed. - * DEPRECATED: use xmlSAX2NotationDecl() - */ -void -notationDecl(void *ctx, const xmlChar * name, - const xmlChar * publicId, const xmlChar * systemId) -{ - DEPRECATED("notationDecl") - xmlSAX2NotationDecl(ctx, name, publicId, systemId); -} - -/** - * unparsedEntityDecl: - * @ctx: the user data (XML parser context) - * @name: The name of the entity - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @notationName: the name of the notation - * - * What to do when an unparsed entity declaration is parsed - * DEPRECATED: use xmlSAX2UnparsedEntityDecl() - */ -void -unparsedEntityDecl(void *ctx, const xmlChar * name, - const xmlChar * publicId, const xmlChar * systemId, - const xmlChar * notationName) -{ - DEPRECATED("unparsedEntityDecl") - xmlSAX2UnparsedEntityDecl(ctx, name, publicId, systemId, - notationName); -} - -/** - * setDocumentLocator: - * @ctx: the user data (XML parser context) - * @loc: A SAX Locator - * - * Receive the document locator at startup, actually xmlDefaultSAXLocator - * Everything is available on the context, so this is useless in our case. - * DEPRECATED - */ -void -setDocumentLocator(void *ctx ATTRIBUTE_UNUSED, - xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) -{ - DEPRECATED("setDocumentLocator") -} - -/** - * startDocument: - * @ctx: the user data (XML parser context) - * - * called when the document start being processed. - * DEPRECATED: use xmlSAX2StartDocument() - */ -void -startDocument(void *ctx) -{ - /* don't be too painful for glade users */ - /* DEPRECATED("startDocument") */ - xmlSAX2StartDocument(ctx); -} - -/** - * endDocument: - * @ctx: the user data (XML parser context) - * - * called when the document end has been detected. - * DEPRECATED: use xmlSAX2EndDocument() - */ -void -endDocument(void *ctx) -{ - DEPRECATED("endDocument") - xmlSAX2EndDocument(ctx); -} - -/** - * attribute: - * @ctx: the user data (XML parser context) - * @fullname: The attribute name, including namespace prefix - * @value: The attribute value - * - * Handle an attribute that has been read by the parser. - * The default handling is to convert the attribute into an - * DOM subtree and past it in a new xmlAttr element added to - * the element. - * DEPRECATED: use xmlSAX2Attribute() - */ -void -attribute(void *ctx ATTRIBUTE_UNUSED, - const xmlChar * fullname ATTRIBUTE_UNUSED, - const xmlChar * value ATTRIBUTE_UNUSED) -{ - DEPRECATED("attribute") -} - -/** - * startElement: - * @ctx: the user data (XML parser context) - * @fullname: The element name, including namespace prefix - * @atts: An array of name/value attributes pairs, NULL terminated - * - * called when an opening tag has been processed. - * DEPRECATED: use xmlSAX2StartElement() - */ -void -startElement(void *ctx, const xmlChar * fullname, const xmlChar ** atts) -{ - xmlSAX2StartElement(ctx, fullname, atts); -} - -/** - * endElement: - * @ctx: the user data (XML parser context) - * @name: The element name - * - * called when the end of an element has been detected. - * DEPRECATED: use xmlSAX2EndElement() - */ -void -endElement(void *ctx, const xmlChar * name ATTRIBUTE_UNUSED) -{ - DEPRECATED("endElement") - xmlSAX2EndElement(ctx, name); -} - -/** - * characters: - * @ctx: the user data (XML parser context) - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some chars from the parser. - * DEPRECATED: use xmlSAX2Characters() - */ -void -characters(void *ctx, const xmlChar * ch, int len) -{ - DEPRECATED("characters") - xmlSAX2Characters(ctx, ch, len); -} - -/** - * ignorableWhitespace: - * @ctx: the user data (XML parser context) - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some ignorable whitespaces from the parser. - * UNUSED: by default the DOM building will use characters - * DEPRECATED: use xmlSAX2IgnorableWhitespace() - */ -void -ignorableWhitespace(void *ctx ATTRIBUTE_UNUSED, - const xmlChar * ch ATTRIBUTE_UNUSED, - int len ATTRIBUTE_UNUSED) -{ - DEPRECATED("ignorableWhitespace") -} - -/** - * processingInstruction: - * @ctx: the user data (XML parser context) - * @target: the target name - * @data: the PI data's - * - * A processing instruction has been parsed. - * DEPRECATED: use xmlSAX2ProcessingInstruction() - */ -void -processingInstruction(void *ctx, const xmlChar * target, - const xmlChar * data) -{ - DEPRECATED("processingInstruction") - xmlSAX2ProcessingInstruction(ctx, target, data); -} - -/** - * globalNamespace: - * @ctx: the user data (XML parser context) - * @href: the namespace associated URN - * @prefix: the namespace prefix - * - * An old global namespace has been parsed. - * DEPRECATED - */ -void -globalNamespace(void *ctx ATTRIBUTE_UNUSED, - const xmlChar * href ATTRIBUTE_UNUSED, - const xmlChar * prefix ATTRIBUTE_UNUSED) -{ - DEPRECATED("globalNamespace") -} - -/** - * setNamespace: - * @ctx: the user data (XML parser context) - * @name: the namespace prefix - * - * Set the current element namespace. - * DEPRECATED - */ - -void -setNamespace(void *ctx ATTRIBUTE_UNUSED, - const xmlChar * name ATTRIBUTE_UNUSED) -{ - DEPRECATED("setNamespace") -} - -/** - * getNamespace: - * @ctx: the user data (XML parser context) - * - * Get the current element namespace. - * DEPRECATED - * - * Returns the xmlNsPtr or NULL if none - */ - -xmlNsPtr -getNamespace(void *ctx ATTRIBUTE_UNUSED) -{ - DEPRECATED("getNamespace") - return (NULL); -} - -/** - * checkNamespace: - * @ctx: the user data (XML parser context) - * @namespace: the namespace to check against - * - * Check that the current element namespace is the same as the - * one read upon parsing. - * DEPRECATED - * - * Returns 1 if true 0 otherwise - */ - -int -checkNamespace(void *ctx ATTRIBUTE_UNUSED, - xmlChar * namespace ATTRIBUTE_UNUSED) -{ - DEPRECATED("checkNamespace") - return (0); -} - -/** - * namespaceDecl: - * @ctx: the user data (XML parser context) - * @href: the namespace associated URN - * @prefix: the namespace prefix - * - * A namespace has been parsed. - * DEPRECATED - */ -void -namespaceDecl(void *ctx ATTRIBUTE_UNUSED, - const xmlChar * href ATTRIBUTE_UNUSED, - const xmlChar * prefix ATTRIBUTE_UNUSED) -{ - DEPRECATED("namespaceDecl") -} - -/** - * comment: - * @ctx: the user data (XML parser context) - * @value: the comment content - * - * A comment has been parsed. - * DEPRECATED: use xmlSAX2Comment() - */ -void -comment(void *ctx, const xmlChar * value) -{ - DEPRECATED("comment") - xmlSAX2Comment(ctx, value); -} - -/** - * cdataBlock: - * @ctx: the user data (XML parser context) - * @value: The pcdata content - * @len: the block length - * - * called when a pcdata block has been parsed - * DEPRECATED: use xmlSAX2CDataBlock() - */ -void -cdataBlock(void *ctx, const xmlChar * value, int len) -{ - DEPRECATED("cdataBlock") - xmlSAX2CDataBlock(ctx, value, len); -} -#define bottom_legacy -#include "elfgcchack.h" -#endif /* LIBXML_LEGACY_ENABLED */ - diff --git a/ThirdParty/libxml2/vtklibxml2/libxml.h b/ThirdParty/libxml2/vtklibxml2/libxml.h deleted file mode 100644 index 455aa45b6ab..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/libxml.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * libxml.h: internal header only used during the compilation of libxml - * - * See COPYRIGHT for the status of this software - * - * Author: breese@users.sourceforge.net - */ - -#ifndef __XML_LIBXML_H__ -#define __XML_LIBXML_H__ - -#ifndef NO_LARGEFILE_SOURCE -#ifndef _LARGEFILE_SOURCE -#define _LARGEFILE_SOURCE -#endif -#ifndef _FILE_OFFSET_BITS -#define _FILE_OFFSET_BITS 64 -#endif -#endif - -#if defined(macintosh) -#include "config-mac.h" -#else -#include "config.h" -#include <libxml/xmlversion.h> -#endif - -#if defined(__Lynx__) -#include <stdio.h> /* pull definition of size_t */ -#include <varargs.h> -int snprintf(char *, size_t, const char *, ...); -int vfprintf(FILE *, const char *, va_list); -#endif - -#ifndef WITH_TRIO -#include <stdio.h> -#else -/** - * TRIO_REPLACE_STDIO: - * - * This macro is defined if the trio string formatting functions are to - * be used instead of the default stdio ones. - */ -#define TRIO_REPLACE_STDIO -#include "trio.h" -#endif - -/* - * Internal variable indicating if a callback has been registered for - * node creation/destruction. It avoids spending a lot of time in locking - * function while checking if the callback exists. - */ -extern int __xmlRegisterCallbacks; -/* - * internal error reporting routines, shared but not partof the API. - */ -void __xmlIOErr(int domain, int code, const char *extra); -void __xmlLoaderErr(void *ctx, const char *msg, const char *filename); -#ifdef LIBXML_HTML_ENABLED -/* - * internal function of HTML parser needed for xmlParseInNodeContext - * but not part of the API - */ -void __htmlParseContent(void *ctx); -#endif - - -#ifdef IN_LIBXML -#ifdef __GNUC__ -#ifdef PIC -#ifdef linux -#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) -#include "elfgcchack.h" -#endif -#endif -#endif -#endif -#endif -#endif /* ! __XML_LIBXML_H__ */ diff --git a/ThirdParty/libxml2/vtklibxml2/libxml2PlatformTests.cmake b/ThirdParty/libxml2/vtklibxml2/libxml2PlatformTests.cmake deleted file mode 100644 index 187c5f9b73d..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/libxml2PlatformTests.cmake +++ /dev/null @@ -1,134 +0,0 @@ -MACRO(LIBXML2_PLATFORM_TEST lang var description invert) - IF(NOT DEFINED "${var}_COMPILED") - MESSAGE(STATUS "${description}") - TRY_COMPILE(${var}_COMPILED - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/${LIBXML2_PLATFORM_TEST_FILE_${lang}} - COMPILE_DEFINITIONS -DTEST_${var} ${LIBXML2_PLATFORM_TEST_DEFINES} ${LIBXML2_PLATFORM_TEST_EXTRA_FLAGS} - OUTPUT_VARIABLE OUTPUT) - IF(${var}_COMPILED) - FILE(APPEND - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log - "${description} compiled with the following output:\n${OUTPUT}\n\n") - ELSE() - FILE(APPEND - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log - "${description} failed to compile with the following output:\n${OUTPUT}\n\n") - ENDIF() - IF(${invert} MATCHES INVERT) - IF(${var}_COMPILED) - MESSAGE(STATUS "${description} - no") - ELSE() - MESSAGE(STATUS "${description} - yes") - ENDIF() - ELSE() - IF(${var}_COMPILED) - MESSAGE(STATUS "${description} - yes") - ELSE() - MESSAGE(STATUS "${description} - no") - ENDIF() - ENDIF() - ENDIF() - IF(${invert} MATCHES INVERT) - IF(${var}_COMPILED) - SET(${var} 0) - ELSE() - SET(${var} 1) - ENDIF() - ELSE() - IF(${var}_COMPILED) - SET(${var} 1) - ELSE() - SET(${var} 0) - ENDIF() - ENDIF() -ENDMACRO() - -MACRO(LIBXML2_PLATFORM_TEST_RUN lang var description invert) - IF(NOT DEFINED "${var}") - MESSAGE(STATUS "${description}") - TRY_RUN(${var} ${var}_COMPILED - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/${LIBXML2_PLATFORM_TEST_FILE_${lang}} - COMPILE_DEFINITIONS -DTEST_${var} ${LIBXML2_PLATFORM_TEST_DEFINES} ${LIBXML2_PLATFORM_TEST_EXTRA_FLAGS} - OUTPUT_VARIABLE OUTPUT) - - # Note that ${var} will be a 0 return value on success. - IF(${var}_COMPILED) - IF(${var}) - FILE(APPEND - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log - "${description} compiled but failed to run with the following output:\n${OUTPUT}\n\n") - ELSE() - FILE(APPEND - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log - "${description} compiled and ran with the following output:\n${OUTPUT}\n\n") - ENDIF() - ELSE() - FILE(APPEND - ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log - "${description} failed to compile with the following output:\n${OUTPUT}\n\n") - SET(${var} -1 CACHE INTERNAL "${description} failed to compile.") - ENDIF() - - IF(${invert} MATCHES INVERT) - IF(${var}_COMPILED) - IF(${var}) - MESSAGE(STATUS "${description} - yes") - ELSE() - MESSAGE(STATUS "${description} - no") - ENDIF() - ELSE() - MESSAGE(STATUS "${description} - failed to compile") - ENDIF() - ELSE() - IF(${var}_COMPILED) - IF(${var}) - MESSAGE(STATUS "${description} - no") - ELSE() - MESSAGE(STATUS "${description} - yes") - ENDIF() - ELSE() - MESSAGE(STATUS "${description} - failed to compile") - ENDIF() - ENDIF() - ENDIF() - - IF(${invert} MATCHES INVERT) - IF(${var}_COMPILED) - IF(${var}) - SET(${var} 1) - ELSE() - SET(${var} 0) - ENDIF() - ELSE() - SET(${var} 1) - ENDIF() - ELSE() - IF(${var}_COMPILED) - IF(${var}) - SET(${var} 0) - ELSE() - SET(${var} 1) - ENDIF() - ELSE() - SET(${var} 0) - ENDIF() - ENDIF() -ENDMACRO() - -MACRO(LIBXML2_PLATFORM_C_TEST var description invert) - SET(LIBXML2_PLATFORM_TEST_DEFINES ${LIBXML2_PLATFORM_C_TEST_DEFINES}) - SET(LIBXML2_PLATFORM_TEST_EXTRA_FLAGS ${LIBXML2_PLATFORM_C_TEST_EXTRA_FLAGS}) - LIBXML2_PLATFORM_TEST(C "${var}" "${description}" "${invert}") - SET(LIBXML2_PLATFORM_TEST_DEFINES) - SET(LIBXML2_PLATFORM_TEST_EXTRA_FLAGS) -ENDMACRO() - -MACRO(LIBXML2_PLATFORM_C_TEST_RUN var description invert) - SET(LIBXML2_PLATFORM_TEST_DEFINES ${LIBXML2_PLATFORM_C_TEST_DEFINES}) - SET(LIBXML2_PLATFORM_TEST_EXTRA_FLAGS ${LIBXML2_PLATFORM_C_TEST_EXTRA_FLAGS}) - LIBXML2_PLATFORM_TEST_RUN(C "${var}" "${description}" "${invert}") - SET(LIBXML2_PLATFORM_TEST_DEFINES) - SET(LIBXML2_PLATFORM_TEST_EXTRA_FLAGS) -ENDMACRO() diff --git a/ThirdParty/libxml2/vtklibxml2/list.c b/ThirdParty/libxml2/vtklibxml2/list.c deleted file mode 100644 index 2eb9c0f2ee2..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/list.c +++ /dev/null @@ -1,779 +0,0 @@ -/* - * list.c: lists handling implementation - * - * Copyright (C) 2000 Gary Pennington and Daniel Veillard. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - * Author: Gary.Pennington@uk.sun.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <stdlib.h> -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/list.h> -#include <libxml/globals.h> - -/* - * Type definition are kept internal - */ - -struct _xmlLink -{ - struct _xmlLink *next; - struct _xmlLink *prev; - void *data; -}; - -struct _xmlList -{ - xmlLinkPtr sentinel; - void (*linkDeallocator)(xmlLinkPtr ); - int (*linkCompare)(const void *, const void*); -}; - -/************************************************************************ - * * - * Interfaces * - * * - ************************************************************************/ - -/** - * xmlLinkDeallocator: - * @l: a list - * @lk: a link - * - * Unlink and deallocate @lk from list @l - */ -static void -xmlLinkDeallocator(xmlListPtr l, xmlLinkPtr lk) -{ - (lk->prev)->next = lk->next; - (lk->next)->prev = lk->prev; - if(l->linkDeallocator) - l->linkDeallocator(lk); - xmlFree(lk); -} - -/** - * xmlLinkCompare: - * @data0: first data - * @data1: second data - * - * Compares two arbitrary data - * - * Returns -1, 0 or 1 depending on whether data1 is greater equal or smaller - * than data0 - */ -static int -xmlLinkCompare(const void *data0, const void *data1) -{ - if (data0 < data1) - return (-1); - else if (data0 == data1) - return (0); - return (1); -} - -/** - * xmlListLowerSearch: - * @l: a list - * @data: a data - * - * Search data in the ordered list walking from the beginning - * - * Returns the link containing the data or NULL - */ -static xmlLinkPtr -xmlListLowerSearch(xmlListPtr l, void *data) -{ - xmlLinkPtr lk; - - if (l == NULL) - return(NULL); - for(lk = l->sentinel->next;lk != l->sentinel && l->linkCompare(lk->data, data) <0 ;lk = lk->next); - return lk; -} - -/** - * xmlListHigherSearch: - * @l: a list - * @data: a data - * - * Search data in the ordered list walking backward from the end - * - * Returns the link containing the data or NULL - */ -static xmlLinkPtr -xmlListHigherSearch(xmlListPtr l, void *data) -{ - xmlLinkPtr lk; - - if (l == NULL) - return(NULL); - for(lk = l->sentinel->prev;lk != l->sentinel && l->linkCompare(lk->data, data) >0 ;lk = lk->prev); - return lk; -} - -/** - * xmlListSearch: - * @l: a list - * @data: a data - * - * Search data in the list - * - * Returns the link containing the data or NULL - */ -static xmlLinkPtr -xmlListLinkSearch(xmlListPtr l, void *data) -{ - xmlLinkPtr lk; - if (l == NULL) - return(NULL); - lk = xmlListLowerSearch(l, data); - if (lk == l->sentinel) - return NULL; - else { - if (l->linkCompare(lk->data, data) ==0) - return lk; - return NULL; - } -} - -/** - * xmlListLinkReverseSearch: - * @l: a list - * @data: a data - * - * Search data in the list processing backward - * - * Returns the link containing the data or NULL - */ -static xmlLinkPtr -xmlListLinkReverseSearch(xmlListPtr l, void *data) -{ - xmlLinkPtr lk; - if (l == NULL) - return(NULL); - lk = xmlListHigherSearch(l, data); - if (lk == l->sentinel) - return NULL; - else { - if (l->linkCompare(lk->data, data) ==0) - return lk; - return NULL; - } -} - -/** - * xmlListCreate: - * @deallocator: an optional deallocator function - * @compare: an optional comparison function - * - * Create a new list - * - * Returns the new list or NULL in case of error - */ -xmlListPtr -xmlListCreate(xmlListDeallocator deallocator, xmlListDataCompare compare) -{ - xmlListPtr l; - if (NULL == (l = (xmlListPtr )xmlMalloc( sizeof(xmlList)))) { - xmlGenericError(xmlGenericErrorContext, - "Cannot initialize memory for list"); - return (NULL); - } - /* Initialize the list to NULL */ - memset(l, 0, sizeof(xmlList)); - - /* Add the sentinel */ - if (NULL ==(l->sentinel = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { - xmlGenericError(xmlGenericErrorContext, - "Cannot initialize memory for sentinel"); - xmlFree(l); - return (NULL); - } - l->sentinel->next = l->sentinel; - l->sentinel->prev = l->sentinel; - l->sentinel->data = NULL; - - /* If there is a link deallocator, use it */ - if (deallocator != NULL) - l->linkDeallocator = deallocator; - /* If there is a link comparator, use it */ - if (compare != NULL) - l->linkCompare = compare; - else /* Use our own */ - l->linkCompare = xmlLinkCompare; - return l; -} - -/** - * xmlListSearch: - * @l: a list - * @data: a search value - * - * Search the list for an existing value of @data - * - * Returns the value associated to @data or NULL in case of error - */ -void * -xmlListSearch(xmlListPtr l, void *data) -{ - xmlLinkPtr lk; - if (l == NULL) - return(NULL); - lk = xmlListLinkSearch(l, data); - if (lk) - return (lk->data); - return NULL; -} - -/** - * xmlListReverseSearch: - * @l: a list - * @data: a search value - * - * Search the list in reverse order for an existing value of @data - * - * Returns the value associated to @data or NULL in case of error - */ -void * -xmlListReverseSearch(xmlListPtr l, void *data) -{ - xmlLinkPtr lk; - if (l == NULL) - return(NULL); - lk = xmlListLinkReverseSearch(l, data); - if (lk) - return (lk->data); - return NULL; -} - -/** - * xmlListInsert: - * @l: a list - * @data: the data - * - * Insert data in the ordered list at the beginning for this value - * - * Returns 0 in case of success, 1 in case of failure - */ -int -xmlListInsert(xmlListPtr l, void *data) -{ - xmlLinkPtr lkPlace, lkNew; - - if (l == NULL) - return(1); - lkPlace = xmlListLowerSearch(l, data); - /* Add the new link */ - lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); - if (lkNew == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Cannot initialize memory for new link"); - return (1); - } - lkNew->data = data; - lkPlace = lkPlace->prev; - lkNew->next = lkPlace->next; - (lkPlace->next)->prev = lkNew; - lkPlace->next = lkNew; - lkNew->prev = lkPlace; - return 0; -} - -/** - * xmlListAppend: - * @l: a list - * @data: the data - * - * Insert data in the ordered list at the end for this value - * - * Returns 0 in case of success, 1 in case of failure - */ -int xmlListAppend(xmlListPtr l, void *data) -{ - xmlLinkPtr lkPlace, lkNew; - - if (l == NULL) - return(1); - lkPlace = xmlListHigherSearch(l, data); - /* Add the new link */ - lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); - if (lkNew == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Cannot initialize memory for new link"); - return (0); - } - lkNew->data = data; - lkNew->next = lkPlace->next; - (lkPlace->next)->prev = lkNew; - lkPlace->next = lkNew; - lkNew->prev = lkPlace; - return 1; -} - -/** - * xmlListDelete: - * @l: a list - * - * Deletes the list and its associated data - */ -void xmlListDelete(xmlListPtr l) -{ - if (l == NULL) - return; - - xmlListClear(l); - xmlFree(l->sentinel); - xmlFree(l); -} - -/** - * xmlListRemoveFirst: - * @l: a list - * @data: list data - * - * Remove the first instance associated to data in the list - * - * Returns 1 if a deallocation occured, or 0 if not found - */ -int -xmlListRemoveFirst(xmlListPtr l, void *data) -{ - xmlLinkPtr lk; - - if (l == NULL) - return(0); - /*Find the first instance of this data */ - lk = xmlListLinkSearch(l, data); - if (lk != NULL) { - xmlLinkDeallocator(l, lk); - return 1; - } - return 0; -} - -/** - * xmlListRemoveLast: - * @l: a list - * @data: list data - * - * Remove the last instance associated to data in the list - * - * Returns 1 if a deallocation occured, or 0 if not found - */ -int -xmlListRemoveLast(xmlListPtr l, void *data) -{ - xmlLinkPtr lk; - - if (l == NULL) - return(0); - /*Find the last instance of this data */ - lk = xmlListLinkReverseSearch(l, data); - if (lk != NULL) { - xmlLinkDeallocator(l, lk); - return 1; - } - return 0; -} - -/** - * xmlListRemoveAll: - * @l: a list - * @data: list data - * - * Remove the all instance associated to data in the list - * - * Returns the number of deallocation, or 0 if not found - */ -int -xmlListRemoveAll(xmlListPtr l, void *data) -{ - int count=0; - - if (l == NULL) - return(0); - - while(xmlListRemoveFirst(l, data)) - count++; - return count; -} - -/** - * xmlListClear: - * @l: a list - * - * Remove the all data in the list - */ -void -xmlListClear(xmlListPtr l) -{ - xmlLinkPtr lk; - - if (l == NULL) - return; - lk = l->sentinel->next; - while(lk != l->sentinel) { - xmlLinkPtr next = lk->next; - - xmlLinkDeallocator(l, lk); - lk = next; - } -} - -/** - * xmlListEmpty: - * @l: a list - * - * Is the list empty ? - * - * Returns 1 if the list is empty, 0 if not empty and -1 in case of error - */ -int -xmlListEmpty(xmlListPtr l) -{ - if (l == NULL) - return(-1); - return (l->sentinel->next == l->sentinel); -} - -/** - * xmlListFront: - * @l: a list - * - * Get the first element in the list - * - * Returns the first element in the list, or NULL - */ -xmlLinkPtr -xmlListFront(xmlListPtr l) -{ - if (l == NULL) - return(NULL); - return (l->sentinel->next); -} - -/** - * xmlListEnd: - * @l: a list - * - * Get the last element in the list - * - * Returns the last element in the list, or NULL - */ -xmlLinkPtr -xmlListEnd(xmlListPtr l) -{ - if (l == NULL) - return(NULL); - return (l->sentinel->prev); -} - -/** - * xmlListSize: - * @l: a list - * - * Get the number of elements in the list - * - * Returns the number of elements in the list or -1 in case of error - */ -int -xmlListSize(xmlListPtr l) -{ - xmlLinkPtr lk; - int count=0; - - if (l == NULL) - return(-1); - /* TODO: keep a counter in xmlList instead */ - for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next, count++); - return count; -} - -/** - * xmlListPopFront: - * @l: a list - * - * Removes the first element in the list - */ -void -xmlListPopFront(xmlListPtr l) -{ - if(!xmlListEmpty(l)) - xmlLinkDeallocator(l, l->sentinel->next); -} - -/** - * xmlListPopBack: - * @l: a list - * - * Removes the last element in the list - */ -void -xmlListPopBack(xmlListPtr l) -{ - if(!xmlListEmpty(l)) - xmlLinkDeallocator(l, l->sentinel->prev); -} - -/** - * xmlListPushFront: - * @l: a list - * @data: new data - * - * add the new data at the beginning of the list - * - * Returns 1 if successful, 0 otherwise - */ -int -xmlListPushFront(xmlListPtr l, void *data) -{ - xmlLinkPtr lkPlace, lkNew; - - if (l == NULL) - return(0); - lkPlace = l->sentinel; - /* Add the new link */ - lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); - if (lkNew == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Cannot initialize memory for new link"); - return (0); - } - lkNew->data = data; - lkNew->next = lkPlace->next; - (lkPlace->next)->prev = lkNew; - lkPlace->next = lkNew; - lkNew->prev = lkPlace; - return 1; -} - -/** - * xmlListPushBack: - * @l: a list - * @data: new data - * - * add the new data at the end of the list - * - * Returns 1 if successful, 0 otherwise - */ -int -xmlListPushBack(xmlListPtr l, void *data) -{ - xmlLinkPtr lkPlace, lkNew; - - if (l == NULL) - return(0); - lkPlace = l->sentinel->prev; - /* Add the new link */ - if (NULL ==(lkNew = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { - xmlGenericError(xmlGenericErrorContext, - "Cannot initialize memory for new link"); - return (0); - } - lkNew->data = data; - lkNew->next = lkPlace->next; - (lkPlace->next)->prev = lkNew; - lkPlace->next = lkNew; - lkNew->prev = lkPlace; - return 1; -} - -/** - * xmlLinkGetData: - * @lk: a link - * - * See Returns. - * - * Returns a pointer to the data referenced from this link - */ -void * -xmlLinkGetData(xmlLinkPtr lk) -{ - if (lk == NULL) - return(NULL); - return lk->data; -} - -/** - * xmlListReverse: - * @l: a list - * - * Reverse the order of the elements in the list - */ -void -xmlListReverse(xmlListPtr l) -{ - xmlLinkPtr lk; - xmlLinkPtr lkPrev; - - if (l == NULL) - return; - lkPrev = l->sentinel; - for (lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) { - lkPrev->next = lkPrev->prev; - lkPrev->prev = lk; - lkPrev = lk; - } - /* Fix up the last node */ - lkPrev->next = lkPrev->prev; - lkPrev->prev = lk; -} - -/** - * xmlListSort: - * @l: a list - * - * Sort all the elements in the list - */ -void -xmlListSort(xmlListPtr l) -{ - xmlListPtr lTemp; - - if (l == NULL) - return; - if(xmlListEmpty(l)) - return; - - /* I think that the real answer is to implement quicksort, the - * alternative is to implement some list copying procedure which - * would be based on a list copy followed by a clear followed by - * an insert. This is slow... - */ - - if (NULL ==(lTemp = xmlListDup(l))) - return; - xmlListClear(l); - xmlListMerge(l, lTemp); - xmlListDelete(lTemp); - return; -} - -/** - * xmlListWalk: - * @l: a list - * @walker: a processing function - * @user: a user parameter passed to the walker function - * - * Walk all the element of the first from first to last and - * apply the walker function to it - */ -void -xmlListWalk(xmlListPtr l, xmlListWalker walker, const void *user) { - xmlLinkPtr lk; - - if ((l == NULL) || (walker == NULL)) - return; - for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) { - if((walker(lk->data, user)) == 0) - break; - } -} - -/** - * xmlListReverseWalk: - * @l: a list - * @walker: a processing function - * @user: a user parameter passed to the walker function - * - * Walk all the element of the list in reverse order and - * apply the walker function to it - */ -void -xmlListReverseWalk(xmlListPtr l, xmlListWalker walker, const void *user) { - xmlLinkPtr lk; - - if ((l == NULL) || (walker == NULL)) - return; - for(lk = l->sentinel->prev; lk != l->sentinel; lk = lk->prev) { - if((walker(lk->data, user)) == 0) - break; - } -} - -/** - * xmlListMerge: - * @l1: the original list - * @l2: the new list - * - * include all the elements of the second list in the first one and - * clear the second list - */ -void -xmlListMerge(xmlListPtr l1, xmlListPtr l2) -{ - xmlListCopy(l1, l2); - xmlListClear(l2); -} - -/** - * xmlListDup: - * @old: the list - * - * Duplicate the list - * - * Returns a new copy of the list or NULL in case of error - */ -xmlListPtr -xmlListDup(const xmlListPtr old) -{ - xmlListPtr cur; - - if (old == NULL) - return(NULL); - /* Hmmm, how to best deal with allocation issues when copying - * lists. If there is a de-allocator, should responsibility lie with - * the new list or the old list. Surely not both. I'll arbitrarily - * set it to be the old list for the time being whilst I work out - * the answer - */ - if (NULL ==(cur = xmlListCreate(NULL, old->linkCompare))) - return (NULL); - if (0 != xmlListCopy(cur, old)) - return NULL; - return cur; -} - -/** - * xmlListCopy: - * @cur: the new list - * @old: the old list - * - * Move all the element from the old list in the new list - * - * Returns 0 in case of success 1 in case of error - */ -int -xmlListCopy(xmlListPtr cur, const xmlListPtr old) -{ - /* Walk the old tree and insert the data into the new one */ - xmlLinkPtr lk; - - if ((old == NULL) || (cur == NULL)) - return(1); - for(lk = old->sentinel->next; lk != old->sentinel; lk = lk->next) { - if (0 !=xmlListInsert(cur, lk->data)) { - xmlListDelete(cur); - return (1); - } - } - return (0); -} -/* xmlListUnique() */ -/* xmlListSwap */ -#define bottom_list -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/nanoftp.c b/ThirdParty/libxml2/vtklibxml2/nanoftp.c deleted file mode 100644 index d22953afcd8..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/nanoftp.c +++ /dev/null @@ -1,2109 +0,0 @@ -/* - * nanoftp.c: basic FTP client support - * - * Reference: RFC 959 - */ - -#ifdef TESTING -#define STANDALONE -#define HAVE_STDLIB_H -#define HAVE_UNISTD_H -#define HAVE_SYS_SOCKET_H -#define HAVE_NETINET_IN_H -#define HAVE_NETDB_H -#define HAVE_SYS_TIME_H -#else /* TESTING */ -#define NEED_SOCKETS -#endif /* TESTING */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_FTP_ENABLED -#include <string.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_SYS_SELECT_H -#include <sys/select.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif - -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/xmlerror.h> -#include <libxml/uri.h> -#include <libxml/nanoftp.h> -#include <libxml/globals.h> - -/* #define DEBUG_FTP 1 */ -#ifdef STANDALONE -#ifndef DEBUG_FTP -#define DEBUG_FTP 1 -#endif -#endif - - -#ifdef __MINGW32__ -#define _WINSOCKAPI_ -#include <wsockcompat.h> -#include <winsock2.h> -#undef XML_SOCKLEN_T -#define XML_SOCKLEN_T unsigned int -#endif - -/** - * A couple portability macros - */ -#ifndef _WINSOCKAPI_ -#ifndef __BEOS__ -#define closesocket(s) close(s) -#endif -#define SOCKET int -#endif - -#ifdef __BEOS__ -#ifndef PF_INET -#define PF_INET AF_INET -#endif -#endif - -#ifdef _AIX -#define ss_family __ss_family -#endif - -#ifndef XML_SOCKLEN_T -#define XML_SOCKLEN_T unsigned int -#endif - -#define FTP_COMMAND_OK 200 -#define FTP_SYNTAX_ERROR 500 -#define FTP_GET_PASSWD 331 -#define FTP_BUF_SIZE 1024 - -#define XML_NANO_MAX_URLBUF 4096 - -typedef struct xmlNanoFTPCtxt { - char *protocol; /* the protocol name */ - char *hostname; /* the host name */ - int port; /* the port */ - char *path; /* the path within the URL */ - char *user; /* user string */ - char *passwd; /* passwd string */ -#ifdef SUPPORT_IP6 - struct sockaddr_storage ftpAddr; /* this is large enough to hold IPv6 address*/ -#else - struct sockaddr_in ftpAddr; /* the socket address struct */ -#endif - int passive; /* currently we support only passive !!! */ - SOCKET controlFd; /* the file descriptor for the control socket */ - SOCKET dataFd; /* the file descriptor for the data socket */ - int state; /* WRITE / READ / CLOSED */ - int returnValue; /* the protocol return value */ - /* buffer for data received from the control connection */ - char controlBuf[FTP_BUF_SIZE + 1]; - int controlBufIndex; - int controlBufUsed; - int controlBufAnswer; -} xmlNanoFTPCtxt, *xmlNanoFTPCtxtPtr; - -static int initialized = 0; -static char *proxy = NULL; /* the proxy name if any */ -static int proxyPort = 0; /* the proxy port if any */ -static char *proxyUser = NULL; /* user for proxy authentication */ -static char *proxyPasswd = NULL;/* passwd for proxy authentication */ -static int proxyType = 0; /* uses TYPE or a@b ? */ - -#ifdef SUPPORT_IP6 -static -int have_ipv6(void) { - int s; - - s = socket (AF_INET6, SOCK_STREAM, 0); - if (s != -1) { - close (s); - return (1); - } - return (0); -} -#endif - -/** - * xmlFTPErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlFTPErrMemory(const char *extra) -{ - __xmlSimpleError(XML_FROM_FTP, XML_ERR_NO_MEMORY, NULL, NULL, extra); -} - -/** - * xmlNanoFTPInit: - * - * Initialize the FTP protocol layer. - * Currently it just checks for proxy informations, - * and get the hostname - */ - -void -xmlNanoFTPInit(void) { - const char *env; -#ifdef _WINSOCKAPI_ - WSADATA wsaData; -#endif - - if (initialized) - return; - -#ifdef _WINSOCKAPI_ - if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) - return; -#endif - - proxyPort = 21; - env = getenv("no_proxy"); - if (env && ((env[0] == '*' ) && (env[1] == 0))) - return; - env = getenv("ftp_proxy"); - if (env != NULL) { - xmlNanoFTPScanProxy(env); - } else { - env = getenv("FTP_PROXY"); - if (env != NULL) { - xmlNanoFTPScanProxy(env); - } - } - env = getenv("ftp_proxy_user"); - if (env != NULL) { - proxyUser = xmlMemStrdup(env); - } - env = getenv("ftp_proxy_password"); - if (env != NULL) { - proxyPasswd = xmlMemStrdup(env); - } - initialized = 1; -} - -/** - * xmlNanoFTPCleanup: - * - * Cleanup the FTP protocol layer. This cleanup proxy informations. - */ - -void -xmlNanoFTPCleanup(void) { - if (proxy != NULL) { - xmlFree(proxy); - proxy = NULL; - } - if (proxyUser != NULL) { - xmlFree(proxyUser); - proxyUser = NULL; - } - if (proxyPasswd != NULL) { - xmlFree(proxyPasswd); - proxyPasswd = NULL; - } -#ifdef _WINSOCKAPI_ - if (initialized) - WSACleanup(); -#endif - initialized = 0; -} - -/** - * xmlNanoFTPProxy: - * @host: the proxy host name - * @port: the proxy port - * @user: the proxy user name - * @passwd: the proxy password - * @type: the type of proxy 1 for using SITE, 2 for USER a@b - * - * Setup the FTP proxy informations. - * This can also be done by using ftp_proxy ftp_proxy_user and - * ftp_proxy_password environment variables. - */ - -void -xmlNanoFTPProxy(const char *host, int port, const char *user, - const char *passwd, int type) { - if (proxy != NULL) { - xmlFree(proxy); - proxy = NULL; - } - if (proxyUser != NULL) { - xmlFree(proxyUser); - proxyUser = NULL; - } - if (proxyPasswd != NULL) { - xmlFree(proxyPasswd); - proxyPasswd = NULL; - } - if (host) - proxy = xmlMemStrdup(host); - if (user) - proxyUser = xmlMemStrdup(user); - if (passwd) - proxyPasswd = xmlMemStrdup(passwd); - proxyPort = port; - proxyType = type; -} - -/** - * xmlNanoFTPScanURL: - * @ctx: an FTP context - * @URL: The URL used to initialize the context - * - * (Re)Initialize an FTP context by parsing the URL and finding - * the protocol host port and path it indicates. - */ - -static void -xmlNanoFTPScanURL(void *ctx, const char *URL) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - xmlURIPtr uri; - - /* - * Clear any existing data from the context - */ - if (ctxt->protocol != NULL) { - xmlFree(ctxt->protocol); - ctxt->protocol = NULL; - } - if (ctxt->hostname != NULL) { - xmlFree(ctxt->hostname); - ctxt->hostname = NULL; - } - if (ctxt->path != NULL) { - xmlFree(ctxt->path); - ctxt->path = NULL; - } - if (URL == NULL) return; - - uri = xmlParseURIRaw(URL, 1); - if (uri == NULL) - return; - - if ((uri->scheme == NULL) || (uri->server == NULL)) { - xmlFreeURI(uri); - return; - } - - ctxt->protocol = xmlMemStrdup(uri->scheme); - ctxt->hostname = xmlMemStrdup(uri->server); - if (uri->path != NULL) - ctxt->path = xmlMemStrdup(uri->path); - else - ctxt->path = xmlMemStrdup("/"); - if (uri->port != 0) - ctxt->port = uri->port; - - if (uri->user != NULL) { - char *cptr; - if ((cptr=strchr(uri->user, ':')) == NULL) - ctxt->user = xmlMemStrdup(uri->user); - else { - ctxt->user = (char *)xmlStrndup((xmlChar *)uri->user, - (cptr - uri->user)); - ctxt->passwd = xmlMemStrdup(cptr+1); - } - } - - xmlFreeURI(uri); - -} - -/** - * xmlNanoFTPUpdateURL: - * @ctx: an FTP context - * @URL: The URL used to update the context - * - * Update an FTP context by parsing the URL and finding - * new path it indicates. If there is an error in the - * protocol, hostname, port or other information, the - * error is raised. It indicates a new connection has to - * be established. - * - * Returns 0 if Ok, -1 in case of error (other host). - */ - -int -xmlNanoFTPUpdateURL(void *ctx, const char *URL) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - xmlURIPtr uri; - - if (URL == NULL) - return(-1); - if (ctxt == NULL) - return(-1); - if (ctxt->protocol == NULL) - return(-1); - if (ctxt->hostname == NULL) - return(-1); - - uri = xmlParseURIRaw(URL, 1); - if (uri == NULL) - return(-1); - - if ((uri->scheme == NULL) || (uri->server == NULL)) { - xmlFreeURI(uri); - return(-1); - } - if ((strcmp(ctxt->protocol, uri->scheme)) || - (strcmp(ctxt->hostname, uri->server)) || - ((uri->port != 0) && (ctxt->port != uri->port))) { - xmlFreeURI(uri); - return(-1); - } - - if (uri->port != 0) - ctxt->port = uri->port; - - if (ctxt->path != NULL) { - xmlFree(ctxt->path); - ctxt->path = NULL; - } - - if (uri->path == NULL) - ctxt->path = xmlMemStrdup("/"); - else - ctxt->path = xmlMemStrdup(uri->path); - - xmlFreeURI(uri); - - return(0); -} - -/** - * xmlNanoFTPScanProxy: - * @URL: The proxy URL used to initialize the proxy context - * - * (Re)Initialize the FTP Proxy context by parsing the URL and finding - * the protocol host port it indicates. - * Should be like ftp://myproxy/ or ftp://myproxy:3128/ - * A NULL URL cleans up proxy informations. - */ - -void -xmlNanoFTPScanProxy(const char *URL) { - xmlURIPtr uri; - - if (proxy != NULL) { - xmlFree(proxy); - proxy = NULL; - } - proxyPort = 0; - -#ifdef DEBUG_FTP - if (URL == NULL) - xmlGenericError(xmlGenericErrorContext, - "Removing FTP proxy info\n"); - else - xmlGenericError(xmlGenericErrorContext, - "Using FTP proxy %s\n", URL); -#endif - if (URL == NULL) return; - - uri = xmlParseURIRaw(URL, 1); - if ((uri == NULL) || (uri->scheme == NULL) || - (strcmp(uri->scheme, "ftp")) || (uri->server == NULL)) { - __xmlIOErr(XML_FROM_FTP, XML_FTP_URL_SYNTAX, "Syntax Error\n"); - if (uri != NULL) - xmlFreeURI(uri); - return; - } - - proxy = xmlMemStrdup(uri->server); - if (uri->port != 0) - proxyPort = uri->port; - - xmlFreeURI(uri); -} - -/** - * xmlNanoFTPNewCtxt: - * @URL: The URL used to initialize the context - * - * Allocate and initialize a new FTP context. - * - * Returns an FTP context or NULL in case of error. - */ - -void* -xmlNanoFTPNewCtxt(const char *URL) { - xmlNanoFTPCtxtPtr ret; - char *unescaped; - - ret = (xmlNanoFTPCtxtPtr) xmlMalloc(sizeof(xmlNanoFTPCtxt)); - if (ret == NULL) { - xmlFTPErrMemory("allocating FTP context"); - return(NULL); - } - - memset(ret, 0, sizeof(xmlNanoFTPCtxt)); - ret->port = 21; - ret->passive = 1; - ret->returnValue = 0; - ret->controlBufIndex = 0; - ret->controlBufUsed = 0; - ret->controlFd = -1; - - unescaped = xmlURIUnescapeString(URL, 0, NULL); - if (unescaped != NULL) { - xmlNanoFTPScanURL(ret, unescaped); - xmlFree(unescaped); - } else if (URL != NULL) - xmlNanoFTPScanURL(ret, URL); - - return(ret); -} - -/** - * xmlNanoFTPFreeCtxt: - * @ctx: an FTP context - * - * Frees the context after closing the connection. - */ - -void -xmlNanoFTPFreeCtxt(void * ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - if (ctxt == NULL) return; - if (ctxt->hostname != NULL) xmlFree(ctxt->hostname); - if (ctxt->protocol != NULL) xmlFree(ctxt->protocol); - if (ctxt->path != NULL) xmlFree(ctxt->path); - ctxt->passive = 1; - if (ctxt->controlFd >= 0) closesocket(ctxt->controlFd); - ctxt->controlFd = -1; - ctxt->controlBufIndex = -1; - ctxt->controlBufUsed = -1; - xmlFree(ctxt); -} - -/** - * xmlNanoFTPParseResponse: - * @buf: the buffer containing the response - * @len: the buffer length - * - * Parsing of the server answer, we just extract the code. - * - * returns 0 for errors - * +XXX for last line of response - * -XXX for response to be continued - */ -static int -xmlNanoFTPParseResponse(char *buf, int len) { - int val = 0; - - if (len < 3) return(-1); - if ((*buf >= '0') && (*buf <= '9')) - val = val * 10 + (*buf - '0'); - else - return(0); - buf++; - if ((*buf >= '0') && (*buf <= '9')) - val = val * 10 + (*buf - '0'); - else - return(0); - buf++; - if ((*buf >= '0') && (*buf <= '9')) - val = val * 10 + (*buf - '0'); - else - return(0); - buf++; - if (*buf == '-') - return(-val); - return(val); -} - -/** - * xmlNanoFTPGetMore: - * @ctx: an FTP context - * - * Read more information from the FTP control connection - * Returns the number of bytes read, < 0 indicates an error - */ -static int -xmlNanoFTPGetMore(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - int len; - int size; - - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); - - if ((ctxt->controlBufIndex < 0) || (ctxt->controlBufIndex > FTP_BUF_SIZE)) { -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, - "xmlNanoFTPGetMore : controlBufIndex = %d\n", - ctxt->controlBufIndex); -#endif - return(-1); - } - - if ((ctxt->controlBufUsed < 0) || (ctxt->controlBufUsed > FTP_BUF_SIZE)) { -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, - "xmlNanoFTPGetMore : controlBufUsed = %d\n", - ctxt->controlBufUsed); -#endif - return(-1); - } - if (ctxt->controlBufIndex > ctxt->controlBufUsed) { -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, - "xmlNanoFTPGetMore : controlBufIndex > controlBufUsed %d > %d\n", - ctxt->controlBufIndex, ctxt->controlBufUsed); -#endif - return(-1); - } - - /* - * First pack the control buffer - */ - if (ctxt->controlBufIndex > 0) { - memmove(&ctxt->controlBuf[0], &ctxt->controlBuf[ctxt->controlBufIndex], - ctxt->controlBufUsed - ctxt->controlBufIndex); - ctxt->controlBufUsed -= ctxt->controlBufIndex; - ctxt->controlBufIndex = 0; - } - size = FTP_BUF_SIZE - ctxt->controlBufUsed; - if (size == 0) { -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, - "xmlNanoFTPGetMore : buffer full %d \n", ctxt->controlBufUsed); -#endif - return(0); - } - - /* - * Read the amount left on the control connection - */ - if ((len = recv(ctxt->controlFd, &ctxt->controlBuf[ctxt->controlBufIndex], - size, 0)) < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "recv failed"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, - "xmlNanoFTPGetMore : read %d [%d - %d]\n", len, - ctxt->controlBufUsed, ctxt->controlBufUsed + len); -#endif - ctxt->controlBufUsed += len; - ctxt->controlBuf[ctxt->controlBufUsed] = 0; - - return(len); -} - -/** - * xmlNanoFTPReadResponse: - * @ctx: an FTP context - * - * Read the response from the FTP server after a command. - * Returns the code number - */ -static int -xmlNanoFTPReadResponse(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char *ptr, *end; - int len; - int res = -1, cur = -1; - - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); - -get_more: - /* - * Assumes everything up to controlBuf[controlBufIndex] has been read - * and analyzed. - */ - len = xmlNanoFTPGetMore(ctx); - if (len < 0) { - return(-1); - } - if ((ctxt->controlBufUsed == 0) && (len == 0)) { - return(-1); - } - ptr = &ctxt->controlBuf[ctxt->controlBufIndex]; - end = &ctxt->controlBuf[ctxt->controlBufUsed]; - -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, - "\n<<<\n%s\n--\n", ptr); -#endif - while (ptr < end) { - cur = xmlNanoFTPParseResponse(ptr, end - ptr); - if (cur > 0) { - /* - * Successfully scanned the control code, scratch - * till the end of the line, but keep the index to be - * able to analyze the result if needed. - */ - res = cur; - ptr += 3; - ctxt->controlBufAnswer = ptr - ctxt->controlBuf; - while ((ptr < end) && (*ptr != '\n')) ptr++; - if (*ptr == '\n') ptr++; - if (*ptr == '\r') ptr++; - break; - } - while ((ptr < end) && (*ptr != '\n')) ptr++; - if (ptr >= end) { - ctxt->controlBufIndex = ctxt->controlBufUsed; - goto get_more; - } - if (*ptr != '\r') ptr++; - } - - if (res < 0) goto get_more; - ctxt->controlBufIndex = ptr - ctxt->controlBuf; -#ifdef DEBUG_FTP - ptr = &ctxt->controlBuf[ctxt->controlBufIndex]; - xmlGenericError(xmlGenericErrorContext, "\n---\n%s\n--\n", ptr); -#endif - -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "Got %d\n", res); -#endif - return(res / 100); -} - -/** - * xmlNanoFTPGetResponse: - * @ctx: an FTP context - * - * Get the response from the FTP server after a command. - * Returns the code number - */ - -int -xmlNanoFTPGetResponse(void *ctx) { - int res; - - res = xmlNanoFTPReadResponse(ctx); - - return(res); -} - -/** - * xmlNanoFTPCheckResponse: - * @ctx: an FTP context - * - * Check if there is a response from the FTP server after a command. - * Returns the code number, or 0 - */ - -int -xmlNanoFTPCheckResponse(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - fd_set rfd; - struct timeval tv; - - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); - tv.tv_sec = 0; - tv.tv_usec = 0; - FD_ZERO(&rfd); - FD_SET(ctxt->controlFd, &rfd); - switch(select(ctxt->controlFd + 1, &rfd, NULL, NULL, &tv)) { - case 0: - return(0); - case -1: - __xmlIOErr(XML_FROM_FTP, 0, "select"); - return(-1); - - } - - return(xmlNanoFTPReadResponse(ctx)); -} - -/** - * Send the user authentication - */ - -static int -xmlNanoFTPSendUser(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[200]; - int len; - int res; - - if (ctxt->user == NULL) - snprintf(buf, sizeof(buf), "USER anonymous\r\n"); - else - snprintf(buf, sizeof(buf), "USER %s\r\n", ctxt->user); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - return(res); - } - return(0); -} - -/** - * Send the password authentication - */ - -static int -xmlNanoFTPSendPasswd(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[200]; - int len; - int res; - - if (ctxt->passwd == NULL) - snprintf(buf, sizeof(buf), "PASS anonymous@\r\n"); - else - snprintf(buf, sizeof(buf), "PASS %s\r\n", ctxt->passwd); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - return(res); - } - return(0); -} - -/** - * xmlNanoFTPQuit: - * @ctx: an FTP context - * - * Send a QUIT command to the server - * - * Returns -1 in case of error, 0 otherwise - */ - - -int -xmlNanoFTPQuit(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[200]; - int len, res; - - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); - - snprintf(buf, sizeof(buf), "QUIT\r\n"); - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); /* Just to be consistent, even though we know it can't have a % in it */ -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - return(res); - } - return(0); -} - -/** - * xmlNanoFTPConnect: - * @ctx: an FTP context - * - * Tries to open a control connection - * - * Returns -1 in case of error, 0 otherwise - */ - -int -xmlNanoFTPConnect(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - struct hostent *hp; - int port; - int res; - int addrlen = sizeof (struct sockaddr_in); - - if (ctxt == NULL) - return(-1); - if (ctxt->hostname == NULL) - return(-1); - - /* - * do the blocking DNS query. - */ - if (proxy) { - port = proxyPort; - } else { - port = ctxt->port; - } - if (port == 0) - port = 21; - - memset (&ctxt->ftpAddr, 0, sizeof(ctxt->ftpAddr)); - -#ifdef SUPPORT_IP6 - if (have_ipv6 ()) { - struct addrinfo hints, *tmp, *result; - - result = NULL; - memset (&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - - if (proxy) { - if (getaddrinfo (proxy, NULL, &hints, &result) != 0) { - __xmlIOErr(XML_FROM_FTP, 0, "getaddrinfo failed"); - return (-1); - } - } - else - if (getaddrinfo (ctxt->hostname, NULL, &hints, &result) != 0) { - __xmlIOErr(XML_FROM_FTP, 0, "getaddrinfo failed"); - return (-1); - } - - for (tmp = result; tmp; tmp = tmp->ai_next) - if (tmp->ai_family == AF_INET || tmp->ai_family == AF_INET6) - break; - - if (!tmp) { - if (result) - freeaddrinfo (result); - __xmlIOErr(XML_FROM_FTP, 0, "getaddrinfo failed"); - return (-1); - } - if (tmp->ai_addrlen > sizeof(ctxt->ftpAddr)) { - __xmlIOErr(XML_FROM_FTP, 0, "gethostbyname address mismatch"); - return (-1); - } - if (tmp->ai_family == AF_INET6) { - memcpy (&ctxt->ftpAddr, tmp->ai_addr, tmp->ai_addrlen); - ((struct sockaddr_in6 *) &ctxt->ftpAddr)->sin6_port = htons (port); - ctxt->controlFd = socket (AF_INET6, SOCK_STREAM, 0); - } - else { - memcpy (&ctxt->ftpAddr, tmp->ai_addr, tmp->ai_addrlen); - ((struct sockaddr_in *) &ctxt->ftpAddr)->sin_port = htons (port); - ctxt->controlFd = socket (AF_INET, SOCK_STREAM, 0); - } - addrlen = tmp->ai_addrlen; - freeaddrinfo (result); - } - else -#endif - { - if (proxy) - hp = gethostbyname (proxy); - else - hp = gethostbyname (ctxt->hostname); - if (hp == NULL) { - __xmlIOErr(XML_FROM_FTP, 0, "gethostbyname failed"); - return (-1); - } - if ((unsigned int) hp->h_length > - sizeof(((struct sockaddr_in *)&ctxt->ftpAddr)->sin_addr)) { - __xmlIOErr(XML_FROM_FTP, 0, "gethostbyname address mismatch"); - return (-1); - } - - /* - * Prepare the socket - */ - ((struct sockaddr_in *)&ctxt->ftpAddr)->sin_family = AF_INET; - memcpy (&((struct sockaddr_in *)&ctxt->ftpAddr)->sin_addr, - hp->h_addr_list[0], hp->h_length); - ((struct sockaddr_in *)&ctxt->ftpAddr)->sin_port = (u_short)htons ((unsigned short)port); - ctxt->controlFd = socket (AF_INET, SOCK_STREAM, 0); - addrlen = sizeof (struct sockaddr_in); - } - - if (ctxt->controlFd < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "socket failed"); - return(-1); - } - - /* - * Do the connect. - */ - if (connect(ctxt->controlFd, (struct sockaddr *) &ctxt->ftpAddr, - addrlen) < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "Failed to create a connection"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - - /* - * Wait for the HELLO from the server. - */ - res = xmlNanoFTPGetResponse(ctxt); - if (res != 2) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - - /* - * State diagram for the login operation on the FTP server - * - * Reference: RFC 959 - * - * 1 - * +---+ USER +---+------------->+---+ - * | B |---------->| W | 2 ---->| E | - * +---+ +---+------ | -->+---+ - * | | | | | - * 3 | | 4,5 | | | - * -------------- ----- | | | - * | | | | | - * | | | | | - * | --------- | - * | 1| | | | - * V | | | | - * +---+ PASS +---+ 2 | ------>+---+ - * | |---------->| W |------------->| S | - * +---+ +---+ ---------->+---+ - * | | | | | - * 3 | |4,5| | | - * -------------- -------- | - * | | | | | - * | | | | | - * | ----------- - * | 1,3| | | | - * V | 2| | | - * +---+ ACCT +---+-- | ----->+---+ - * | |---------->| W | 4,5 -------->| F | - * +---+ +---+------------->+---+ - * - * Of course in case of using a proxy this get really nasty and is not - * standardized at all :-( - */ - if (proxy) { - int len; - char buf[400]; - - if (proxyUser != NULL) { - /* - * We need proxy auth - */ - snprintf(buf, sizeof(buf), "USER %s\r\n", proxyUser); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->controlFd); - ctxt->controlFd = -1; - return(res); - } - res = xmlNanoFTPGetResponse(ctxt); - switch (res) { - case 2: - if (proxyPasswd == NULL) - break; - case 3: - if (proxyPasswd != NULL) - snprintf(buf, sizeof(buf), "PASS %s\r\n", proxyPasswd); - else - snprintf(buf, sizeof(buf), "PASS anonymous@\r\n"); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->controlFd); - ctxt->controlFd = -1; - return(res); - } - res = xmlNanoFTPGetResponse(ctxt); - if (res > 3) { - closesocket(ctxt->controlFd); - ctxt->controlFd = -1; - return(-1); - } - break; - case 1: - break; - case 4: - case 5: - case -1: - default: - closesocket(ctxt->controlFd); - ctxt->controlFd = -1; - return(-1); - } - } - - /* - * We assume we don't need more authentication to the proxy - * and that it succeeded :-\ - */ - switch (proxyType) { - case 0: - /* we will try in sequence */ - case 1: - /* Using SITE command */ - snprintf(buf, sizeof(buf), "SITE %s\r\n", ctxt->hostname); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(res); - } - res = xmlNanoFTPGetResponse(ctxt); - if (res == 2) { - /* we assume it worked :-\ 1 is error for SITE command */ - proxyType = 1; - break; - } - if (proxyType == 1) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - case 2: - /* USER user@host command */ - if (ctxt->user == NULL) - snprintf(buf, sizeof(buf), "USER anonymous@%s\r\n", - ctxt->hostname); - else - snprintf(buf, sizeof(buf), "USER %s@%s\r\n", - ctxt->user, ctxt->hostname); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(res); - } - res = xmlNanoFTPGetResponse(ctxt); - if ((res == 1) || (res == 2)) { - /* we assume it worked :-\ */ - proxyType = 2; - return(0); - } - if (ctxt->passwd == NULL) - snprintf(buf, sizeof(buf), "PASS anonymous@\r\n"); - else - snprintf(buf, sizeof(buf), "PASS %s\r\n", ctxt->passwd); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(res); - } - res = xmlNanoFTPGetResponse(ctxt); - if ((res == 1) || (res == 2)) { - /* we assume it worked :-\ */ - proxyType = 2; - return(0); - } - if (proxyType == 2) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - case 3: - /* - * If you need support for other Proxy authentication scheme - * send the code or at least the sequence in use. - */ - default: - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - } - /* - * Non-proxy handling. - */ - res = xmlNanoFTPSendUser(ctxt); - if (res < 0) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - res = xmlNanoFTPGetResponse(ctxt); - switch (res) { - case 2: - return(0); - case 3: - break; - case 1: - case 4: - case 5: - case -1: - default: - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - res = xmlNanoFTPSendPasswd(ctxt); - if (res < 0) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - res = xmlNanoFTPGetResponse(ctxt); - switch (res) { - case 2: - break; - case 3: - __xmlIOErr(XML_FROM_FTP, XML_FTP_ACCNT, - "FTP server asking for ACCNT on anonymous\n"); - case 1: - case 4: - case 5: - case -1: - default: - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - ctxt->controlFd = -1; - return(-1); - } - - return(0); -} - -/** - * xmlNanoFTPConnectTo: - * @server: an FTP server name - * @port: the port (use 21 if 0) - * - * Tries to open a control connection to the given server/port - * - * Returns an fTP context or NULL if it failed - */ - -void* -xmlNanoFTPConnectTo(const char *server, int port) { - xmlNanoFTPCtxtPtr ctxt; - int res; - - xmlNanoFTPInit(); - if (server == NULL) - return(NULL); - if (port <= 0) - return(NULL); - ctxt = (xmlNanoFTPCtxtPtr) xmlNanoFTPNewCtxt(NULL); - ctxt->hostname = xmlMemStrdup(server); - if (port != 0) - ctxt->port = port; - res = xmlNanoFTPConnect(ctxt); - if (res < 0) { - xmlNanoFTPFreeCtxt(ctxt); - return(NULL); - } - return(ctxt); -} - -/** - * xmlNanoFTPCwd: - * @ctx: an FTP context - * @directory: a directory on the server - * - * Tries to change the remote directory - * - * Returns -1 incase of error, 1 if CWD worked, 0 if it failed - */ - -int -xmlNanoFTPCwd(void *ctx, const char *directory) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[400]; - int len; - int res; - - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); - if (directory == NULL) return 0; - - /* - * Expected response code for CWD: - * - * CWD - * 250 - * 500, 501, 502, 421, 530, 550 - */ - snprintf(buf, sizeof(buf), "CWD %s\r\n", directory); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - return(res); - } - res = xmlNanoFTPGetResponse(ctxt); - if (res == 4) { - return(-1); - } - if (res == 2) return(1); - if (res == 5) { - return(0); - } - return(0); -} - -/** - * xmlNanoFTPDele: - * @ctx: an FTP context - * @file: a file or directory on the server - * - * Tries to delete an item (file or directory) from server - * - * Returns -1 incase of error, 1 if DELE worked, 0 if it failed - */ - -int -xmlNanoFTPDele(void *ctx, const char *file) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[400]; - int len; - int res; - - if ((ctxt == NULL) || (ctxt->controlFd < 0) || (file == NULL)) return(-1); - if (file == NULL) return (0); - - /* - * Expected response code for DELE: - * - * DELE - * 250 - * 450, 550 - * 500, 501, 502, 421, 530 - */ - - snprintf(buf, sizeof(buf), "DELE %s\r\n", file); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - return(res); - } - res = xmlNanoFTPGetResponse(ctxt); - if (res == 4) { - return(-1); - } - if (res == 2) return(1); - if (res == 5) { - return(0); - } - return(0); -} -/** - * xmlNanoFTPGetConnection: - * @ctx: an FTP context - * - * Try to open a data connection to the server. Currently only - * passive mode is supported. - * - * Returns -1 incase of error, 0 otherwise - */ - -int -xmlNanoFTPGetConnection(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[200], *cur; - int len, i; - int res; - unsigned char ad[6], *adp, *portp; - unsigned int temp[6]; -#ifdef SUPPORT_IP6 - struct sockaddr_storage dataAddr; -#else - struct sockaddr_in dataAddr; -#endif - XML_SOCKLEN_T dataAddrLen; - - if (ctxt == NULL) return(-1); - - memset (&dataAddr, 0, sizeof(dataAddr)); -#ifdef SUPPORT_IP6 - if ((ctxt->ftpAddr).ss_family == AF_INET6) { - ctxt->dataFd = socket (AF_INET6, SOCK_STREAM, IPPROTO_TCP); - ((struct sockaddr_in6 *)&dataAddr)->sin6_family = AF_INET6; - dataAddrLen = sizeof(struct sockaddr_in6); - } else -#endif - { - ctxt->dataFd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); - ((struct sockaddr_in *)&dataAddr)->sin_family = AF_INET; - dataAddrLen = sizeof (struct sockaddr_in); - } - - if (ctxt->dataFd < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "socket failed"); - return (-1); - } - - if (ctxt->passive) { -#ifdef SUPPORT_IP6 - if ((ctxt->ftpAddr).ss_family == AF_INET6) - snprintf (buf, sizeof(buf), "EPSV\r\n"); - else -#endif - snprintf (buf, sizeof(buf), "PASV\r\n"); - len = strlen (buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); - } - res = xmlNanoFTPReadResponse(ctx); - if (res != 2) { - if (res == 5) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-1); - } else { - /* - * retry with an active connection - */ - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - ctxt->passive = 0; - } - } - cur = &ctxt->controlBuf[ctxt->controlBufAnswer]; - while (((*cur < '0') || (*cur > '9')) && *cur != '\0') cur++; -#ifdef SUPPORT_IP6 - if ((ctxt->ftpAddr).ss_family == AF_INET6) { - if (sscanf (cur, "%u", &temp[0]) != 1) { - __xmlIOErr(XML_FROM_FTP, XML_FTP_EPSV_ANSWER, - "Invalid answer to EPSV\n"); - if (ctxt->dataFd != -1) { - closesocket (ctxt->dataFd); ctxt->dataFd = -1; - } - return (-1); - } - memcpy (&((struct sockaddr_in6 *)&dataAddr)->sin6_addr, &((struct sockaddr_in6 *)&ctxt->ftpAddr)->sin6_addr, sizeof(struct in6_addr)); - ((struct sockaddr_in6 *)&dataAddr)->sin6_port = htons (temp[0]); - } - else -#endif - { - if (sscanf (cur, "%u,%u,%u,%u,%u,%u", &temp[0], &temp[1], &temp[2], - &temp[3], &temp[4], &temp[5]) != 6) { - __xmlIOErr(XML_FROM_FTP, XML_FTP_PASV_ANSWER, - "Invalid answer to PASV\n"); - if (ctxt->dataFd != -1) { - closesocket (ctxt->dataFd); ctxt->dataFd = -1; - } - return (-1); - } - for (i=0; i<6; i++) ad[i] = (unsigned char) (temp[i] & 0xff); - memcpy (&((struct sockaddr_in *)&dataAddr)->sin_addr, &ad[0], 4); - memcpy (&((struct sockaddr_in *)&dataAddr)->sin_port, &ad[4], 2); - } - - if (connect(ctxt->dataFd, (struct sockaddr *) &dataAddr, dataAddrLen) < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "Failed to create a data connection"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return (-1); - } - } else { - getsockname(ctxt->dataFd, (struct sockaddr *) &dataAddr, &dataAddrLen); -#ifdef SUPPORT_IP6 - if ((ctxt->ftpAddr).ss_family == AF_INET6) - ((struct sockaddr_in6 *)&dataAddr)->sin6_port = 0; - else -#endif - ((struct sockaddr_in *)&dataAddr)->sin_port = 0; - - if (bind(ctxt->dataFd, (struct sockaddr *) &dataAddr, dataAddrLen) < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "bind failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return (-1); - } - getsockname(ctxt->dataFd, (struct sockaddr *) &dataAddr, &dataAddrLen); - - if (listen(ctxt->dataFd, 1) < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "listen failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return (-1); - } -#ifdef SUPPORT_IP6 - if ((ctxt->ftpAddr).ss_family == AF_INET6) { - char buf6[INET6_ADDRSTRLEN]; - inet_ntop (AF_INET6, &((struct sockaddr_in6 *)&dataAddr)->sin6_addr, - buf6, INET6_ADDRSTRLEN); - adp = (unsigned char *) buf6; - portp = (unsigned char *) &((struct sockaddr_in6 *)&dataAddr)->sin6_port; - snprintf (buf, sizeof(buf), "EPRT |2|%s|%s|\r\n", adp, portp); - } else -#endif - { - adp = (unsigned char *) &((struct sockaddr_in *)&dataAddr)->sin_addr; - portp = (unsigned char *) &((struct sockaddr_in *)&dataAddr)->sin_port; - snprintf (buf, sizeof(buf), "PORT %d,%d,%d,%d,%d,%d\r\n", - adp[0] & 0xff, adp[1] & 0xff, adp[2] & 0xff, adp[3] & 0xff, - portp[0] & 0xff, portp[1] & 0xff); - } - - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); - } - res = xmlNanoFTPGetResponse(ctxt); - if (res != 2) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-1); - } - } - return(ctxt->dataFd); - -} - -/** - * xmlNanoFTPCloseConnection: - * @ctx: an FTP context - * - * Close the data connection from the server - * - * Returns -1 incase of error, 0 otherwise - */ - -int -xmlNanoFTPCloseConnection(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - int res; - fd_set rfd, efd; - struct timeval tv; - - if ((ctxt == NULL) || (ctxt->controlFd < 0)) return(-1); - - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - tv.tv_sec = 15; - tv.tv_usec = 0; - FD_ZERO(&rfd); - FD_SET(ctxt->controlFd, &rfd); - FD_ZERO(&efd); - FD_SET(ctxt->controlFd, &efd); - res = select(ctxt->controlFd + 1, &rfd, NULL, &efd, &tv); - if (res < 0) { -#ifdef DEBUG_FTP - perror("select"); -#endif - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - return(-1); - } - if (res == 0) { -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, - "xmlNanoFTPCloseConnection: timeout\n"); -#endif - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - } else { - res = xmlNanoFTPGetResponse(ctxt); - if (res != 2) { - closesocket(ctxt->controlFd); ctxt->controlFd = -1; - return(-1); - } - } - return(0); -} - -/** - * xmlNanoFTPParseList: - * @list: some data listing received from the server - * @callback: the user callback - * @userData: the user callback data - * - * Parse at most one entry from the listing. - * - * Returns -1 incase of error, the length of data parsed otherwise - */ - -static int -xmlNanoFTPParseList(const char *list, ftpListCallback callback, void *userData) { - const char *cur = list; - char filename[151]; - char attrib[11]; - char owner[11]; - char group[11]; - char month[4]; - int year = 0; - int minute = 0; - int hour = 0; - int day = 0; - unsigned long size = 0; - int links = 0; - int i; - - if (!strncmp(cur, "total", 5)) { - cur += 5; - while (*cur == ' ') cur++; - while ((*cur >= '0') && (*cur <= '9')) - links = (links * 10) + (*cur++ - '0'); - while ((*cur == ' ') || (*cur == '\n') || (*cur == '\r')) - cur++; - return(cur - list); - } else if (*list == '+') { - return(0); - } else { - while ((*cur == ' ') || (*cur == '\n') || (*cur == '\r')) - cur++; - if (*cur == 0) return(0); - i = 0; - while (*cur != ' ') { - if (i < 10) - attrib[i++] = *cur; - cur++; - if (*cur == 0) return(0); - } - attrib[10] = 0; - while (*cur == ' ') cur++; - if (*cur == 0) return(0); - while ((*cur >= '0') && (*cur <= '9')) - links = (links * 10) + (*cur++ - '0'); - while (*cur == ' ') cur++; - if (*cur == 0) return(0); - i = 0; - while (*cur != ' ') { - if (i < 10) - owner[i++] = *cur; - cur++; - if (*cur == 0) return(0); - } - owner[i] = 0; - while (*cur == ' ') cur++; - if (*cur == 0) return(0); - i = 0; - while (*cur != ' ') { - if (i < 10) - group[i++] = *cur; - cur++; - if (*cur == 0) return(0); - } - group[i] = 0; - while (*cur == ' ') cur++; - if (*cur == 0) return(0); - while ((*cur >= '0') && (*cur <= '9')) - size = (size * 10) + (*cur++ - '0'); - while (*cur == ' ') cur++; - if (*cur == 0) return(0); - i = 0; - while (*cur != ' ') { - if (i < 3) - month[i++] = *cur; - cur++; - if (*cur == 0) return(0); - } - month[i] = 0; - while (*cur == ' ') cur++; - if (*cur == 0) return(0); - while ((*cur >= '0') && (*cur <= '9')) - day = (day * 10) + (*cur++ - '0'); - while (*cur == ' ') cur++; - if (*cur == 0) return(0); - if ((cur[1] == 0) || (cur[2] == 0)) return(0); - if ((cur[1] == ':') || (cur[2] == ':')) { - while ((*cur >= '0') && (*cur <= '9')) - hour = (hour * 10) + (*cur++ - '0'); - if (*cur == ':') cur++; - while ((*cur >= '0') && (*cur <= '9')) - minute = (minute * 10) + (*cur++ - '0'); - } else { - while ((*cur >= '0') && (*cur <= '9')) - year = (year * 10) + (*cur++ - '0'); - } - while (*cur == ' ') cur++; - if (*cur == 0) return(0); - i = 0; - while ((*cur != '\n') && (*cur != '\r')) { - if (i < 150) - filename[i++] = *cur; - cur++; - if (*cur == 0) return(0); - } - filename[i] = 0; - if ((*cur != '\n') && (*cur != '\r')) - return(0); - while ((*cur == '\n') || (*cur == '\r')) - cur++; - } - if (callback != NULL) { - callback(userData, filename, attrib, owner, group, size, links, - year, month, day, hour, minute); - } - return(cur - list); -} - -/** - * xmlNanoFTPList: - * @ctx: an FTP context - * @callback: the user callback - * @userData: the user callback data - * @filename: optional files to list - * - * Do a listing on the server. All files info are passed back - * in the callbacks. - * - * Returns -1 incase of error, 0 otherwise - */ - -int -xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData, - const char *filename) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[4096 + 1]; - int len, res; - int indx = 0, base; - fd_set rfd, efd; - struct timeval tv; - - if (ctxt == NULL) return (-1); - if (filename == NULL) { - if (xmlNanoFTPCwd(ctxt, ctxt->path) < 1) - return(-1); - ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); - if (ctxt->dataFd == -1) - return(-1); - snprintf(buf, sizeof(buf), "LIST -L\r\n"); - } else { - if (filename[0] != '/') { - if (xmlNanoFTPCwd(ctxt, ctxt->path) < 1) - return(-1); - } - ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); - if (ctxt->dataFd == -1) - return(-1); - snprintf(buf, sizeof(buf), "LIST -L %s\r\n", filename); - } - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); - } - res = xmlNanoFTPReadResponse(ctxt); - if (res != 1) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-res); - } - - do { - tv.tv_sec = 1; - tv.tv_usec = 0; - FD_ZERO(&rfd); - FD_SET(ctxt->dataFd, &rfd); - FD_ZERO(&efd); - FD_SET(ctxt->dataFd, &efd); - res = select(ctxt->dataFd + 1, &rfd, NULL, &efd, &tv); - if (res < 0) { -#ifdef DEBUG_FTP - perror("select"); -#endif - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-1); - } - if (res == 0) { - res = xmlNanoFTPCheckResponse(ctxt); - if (res < 0) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - ctxt->dataFd = -1; - return(-1); - } - if (res == 2) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(0); - } - - continue; - } - - if ((len = recv(ctxt->dataFd, &buf[indx], sizeof(buf) - (indx + 1), 0)) < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "recv"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - ctxt->dataFd = -1; - return(-1); - } -#ifdef DEBUG_FTP - write(1, &buf[indx], len); -#endif - indx += len; - buf[indx] = 0; - base = 0; - do { - res = xmlNanoFTPParseList(&buf[base], callback, userData); - base += res; - } while (res > 0); - - memmove(&buf[0], &buf[base], indx - base); - indx -= base; - } while (len != 0); - xmlNanoFTPCloseConnection(ctxt); - return(0); -} - -/** - * xmlNanoFTPGetSocket: - * @ctx: an FTP context - * @filename: the file to retrieve (or NULL if path is in context). - * - * Initiate fetch of the given file from the server. - * - * Returns the socket for the data connection, or <0 in case of error - */ - - -int -xmlNanoFTPGetSocket(void *ctx, const char *filename) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[300]; - int res, len; - if (ctx == NULL) - return(-1); - if ((filename == NULL) && (ctxt->path == NULL)) - return(-1); - ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); - if (ctxt->dataFd == -1) - return(-1); - - snprintf(buf, sizeof(buf), "TYPE I\r\n"); - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); - } - res = xmlNanoFTPReadResponse(ctxt); - if (res != 2) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-res); - } - if (filename == NULL) - snprintf(buf, sizeof(buf), "RETR %s\r\n", ctxt->path); - else - snprintf(buf, sizeof(buf), "RETR %s\r\n", filename); - buf[sizeof(buf) - 1] = 0; - len = strlen(buf); -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "%s", buf); -#endif - res = send(ctxt->controlFd, buf, len, 0); - if (res < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "send failed"); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(res); - } - res = xmlNanoFTPReadResponse(ctxt); - if (res != 1) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-res); - } - return(ctxt->dataFd); -} - -/** - * xmlNanoFTPGet: - * @ctx: an FTP context - * @callback: the user callback - * @userData: the user callback data - * @filename: the file to retrieve - * - * Fetch the given file from the server. All data are passed back - * in the callbacks. The last callback has a size of 0 block. - * - * Returns -1 incase of error, 0 otherwise - */ - -int -xmlNanoFTPGet(void *ctx, ftpDataCallback callback, void *userData, - const char *filename) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - char buf[4096]; - int len = 0, res; - fd_set rfd; - struct timeval tv; - - if (ctxt == NULL) return(-1); - if ((filename == NULL) && (ctxt->path == NULL)) - return(-1); - if (callback == NULL) - return(-1); - if (xmlNanoFTPGetSocket(ctxt, filename) < 0) - return(-1); - - do { - tv.tv_sec = 1; - tv.tv_usec = 0; - FD_ZERO(&rfd); - FD_SET(ctxt->dataFd, &rfd); - res = select(ctxt->dataFd + 1, &rfd, NULL, NULL, &tv); - if (res < 0) { -#ifdef DEBUG_FTP - perror("select"); -#endif - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-1); - } - if (res == 0) { - res = xmlNanoFTPCheckResponse(ctxt); - if (res < 0) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - ctxt->dataFd = -1; - return(-1); - } - if (res == 2) { - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(0); - } - - continue; - } - if ((len = recv(ctxt->dataFd, buf, sizeof(buf), 0)) < 0) { - __xmlIOErr(XML_FROM_FTP, 0, "recv failed"); - callback(userData, buf, len); - closesocket(ctxt->dataFd); ctxt->dataFd = -1; - return(-1); - } - callback(userData, buf, len); - } while (len != 0); - - return(xmlNanoFTPCloseConnection(ctxt)); -} - -/** - * xmlNanoFTPRead: - * @ctx: the FTP context - * @dest: a buffer - * @len: the buffer length - * - * This function tries to read @len bytes from the existing FTP connection - * and saves them in @dest. This is a blocking call. - * - * Returns the number of byte read. 0 is an indication of an end of connection. - * -1 indicates a parameter error. - */ -int -xmlNanoFTPRead(void *ctx, void *dest, int len) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - - if (ctx == NULL) return(-1); - if (ctxt->dataFd < 0) return(0); - if (dest == NULL) return(-1); - if (len <= 0) return(0); - - len = recv(ctxt->dataFd, dest, len, 0); - if (len <= 0) { - if (len < 0) - __xmlIOErr(XML_FROM_FTP, 0, "recv failed"); - xmlNanoFTPCloseConnection(ctxt); - } -#ifdef DEBUG_FTP - xmlGenericError(xmlGenericErrorContext, "Recvd %d bytes\n", len); -#endif - return(len); -} - -/** - * xmlNanoFTPOpen: - * @URL: the URL to the resource - * - * Start to fetch the given ftp:// resource - * - * Returns an FTP context, or NULL - */ - -void* -xmlNanoFTPOpen(const char *URL) { - xmlNanoFTPCtxtPtr ctxt; - int sock; - - xmlNanoFTPInit(); - if (URL == NULL) return(NULL); - if (strncmp("ftp://", URL, 6)) return(NULL); - - ctxt = (xmlNanoFTPCtxtPtr) xmlNanoFTPNewCtxt(URL); - if (ctxt == NULL) return(NULL); - if (xmlNanoFTPConnect(ctxt) < 0) { - xmlNanoFTPFreeCtxt(ctxt); - return(NULL); - } - sock = xmlNanoFTPGetSocket(ctxt, ctxt->path); - if (sock < 0) { - xmlNanoFTPFreeCtxt(ctxt); - return(NULL); - } - return(ctxt); -} - -/** - * xmlNanoFTPClose: - * @ctx: an FTP context - * - * Close the connection and both control and transport - * - * Returns -1 incase of error, 0 otherwise - */ - -int -xmlNanoFTPClose(void *ctx) { - xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; - - if (ctxt == NULL) - return(-1); - - if (ctxt->dataFd >= 0) { - closesocket(ctxt->dataFd); - ctxt->dataFd = -1; - } - if (ctxt->controlFd >= 0) { - xmlNanoFTPQuit(ctxt); - closesocket(ctxt->controlFd); - ctxt->controlFd = -1; - } - xmlNanoFTPFreeCtxt(ctxt); - return(0); -} - -#ifdef STANDALONE -/************************************************************************ - * * - * Basic test in Standalone mode * - * * - ************************************************************************/ -static -void ftpList(void *userData, const char *filename, const char* attrib, - const char *owner, const char *group, unsigned long size, int links, - int year, const char *month, int day, int hour, int minute) { - xmlGenericError(xmlGenericErrorContext, - "%s %s %s %ld %s\n", attrib, owner, group, size, filename); -} -static -void ftpData(void *userData, const char *data, int len) { - if (userData == NULL) return; - if (len <= 0) { - fclose((FILE*)userData); - return; - } - fwrite(data, len, 1, (FILE*)userData); -} - -int main(int argc, char **argv) { - void *ctxt; - FILE *output; - char *tstfile = NULL; - - xmlNanoFTPInit(); - if (argc > 1) { - ctxt = xmlNanoFTPNewCtxt(argv[1]); - if (xmlNanoFTPConnect(ctxt) < 0) { - xmlGenericError(xmlGenericErrorContext, - "Couldn't connect to %s\n", argv[1]); - exit(1); - } - if (argc > 2) - tstfile = argv[2]; - } else - ctxt = xmlNanoFTPConnectTo("localhost", 0); - if (ctxt == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Couldn't connect to localhost\n"); - exit(1); - } - xmlNanoFTPList(ctxt, ftpList, NULL, tstfile); - output = fopen("/tmp/tstdata", "w"); - if (output != NULL) { - if (xmlNanoFTPGet(ctxt, ftpData, (void *) output, tstfile) < 0) - xmlGenericError(xmlGenericErrorContext, - "Failed to get file\n"); - - } - xmlNanoFTPClose(ctxt); - xmlMemoryDump(); - exit(0); -} -#endif /* STANDALONE */ -#else /* !LIBXML_FTP_ENABLED */ -#ifdef STANDALONE -#include <stdio.h> -int main(int argc, char **argv) { - xmlGenericError(xmlGenericErrorContext, - "%s : FTP support not compiled in\n", argv[0]); - return(0); -} -#endif /* STANDALONE */ -#endif /* LIBXML_FTP_ENABLED */ -#define bottom_nanoftp -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/nanohttp.c b/ThirdParty/libxml2/vtklibxml2/nanohttp.c deleted file mode 100644 index 9f54a9cf123..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/nanohttp.c +++ /dev/null @@ -1,1789 +0,0 @@ -/* - * nanohttp.c: minimalist HTTP GET implementation to fetch external subsets. - * focuses on size, streamability, reentrancy and portability - * - * This is clearly not a general purpose HTTP implementation - * If you look for one, check: - * http://www.w3.org/Library/ - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define NEED_SOCKETS -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_HTTP_ENABLED -#include <string.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif -#ifdef HAVE_RESOLV_H -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#include <resolv.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_SYS_SELECT_H -#include <sys/select.h> -#endif -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif -#ifdef SUPPORT_IP6 -#include <resolv.h> -#endif -#include "vtk_libxml2_zlib.h" - - -#ifdef VMS -#include <stropts> -#define XML_SOCKLEN_T unsigned int -#define SOCKET int -#endif - - -#ifdef __MINGW32__ -#define _WINSOCKAPI_ -#include <wsockcompat.h> -#include <winsock2.h> -#undef XML_SOCKLEN_T -#define XML_SOCKLEN_T unsigned int -#endif - - -#include <libxml/globals.h> -#include <libxml/xmlerror.h> -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> /* for xmlStr(n)casecmp() */ -#include <libxml/nanohttp.h> -#include <libxml/globals.h> -#include <libxml/uri.h> - -/** - * A couple portability macros - */ -#ifndef _WINSOCKAPI_ -#ifndef __BEOS__ -#define closesocket(s) close(s) -#endif -#define SOCKET int -#endif - -#ifdef __BEOS__ -#ifndef PF_INET -#define PF_INET AF_INET -#endif -#endif - -#ifndef XML_SOCKLEN_T -#define XML_SOCKLEN_T unsigned int -#endif -#ifndef SOCKET -#define SOCKET int -#endif - -#ifdef STANDALONE -#define DEBUG_HTTP -#define xmlStrncasecmp(a, b, n) strncasecmp((char *)a, (char *)b, n) -#define xmlStrcasecmpi(a, b) strcasecmp((char *)a, (char *)b) -#endif - -#define XML_NANO_HTTP_MAX_REDIR 10 - -#define XML_NANO_HTTP_CHUNK 4096 - -#define XML_NANO_HTTP_CLOSED 0 -#define XML_NANO_HTTP_WRITE 1 -#define XML_NANO_HTTP_READ 2 -#define XML_NANO_HTTP_NONE 4 - -typedef struct xmlNanoHTTPCtxt { - char *protocol; /* the protocol name */ - char *hostname; /* the host name */ - int port; /* the port */ - char *path; /* the path within the URL */ - char *query; /* the query string */ - SOCKET fd; /* the file descriptor for the socket */ - int state; /* WRITE / READ / CLOSED */ - char *out; /* buffer sent (zero terminated) */ - char *outptr; /* index within the buffer sent */ - char *in; /* the receiving buffer */ - char *content; /* the start of the content */ - char *inptr; /* the next byte to read from network */ - char *inrptr; /* the next byte to give back to the client */ - int inlen; /* len of the input buffer */ - int last; /* return code for last operation */ - int returnValue; /* the protocol return value */ - int ContentLength; /* specified content length from HTTP header */ - char *contentType; /* the MIME type for the input */ - char *location; /* the new URL in case of redirect */ - char *authHeader; /* contents of {WWW,Proxy}-Authenticate header */ - char *encoding; /* encoding extracted from the contentType */ - char *mimeType; /* Mime-Type extracted from the contentType */ -#ifdef HAVE_ZLIB_H - z_stream *strm; /* Zlib stream object */ - int usesGzip; /* "Content-Encoding: gzip" was detected */ -#endif -} xmlNanoHTTPCtxt, *xmlNanoHTTPCtxtPtr; - -static int initialized = 0; -static char *proxy = NULL; /* the proxy name if any */ -static int proxyPort; /* the proxy port if any */ -static unsigned int timeout = 60;/* the select() timeout in seconds */ - -static int xmlNanoHTTPFetchContent( void * ctx, char ** ptr, int * len ); - -/** - * xmlHTTPErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlHTTPErrMemory(const char *extra) -{ - __xmlSimpleError(XML_FROM_HTTP, XML_ERR_NO_MEMORY, NULL, NULL, extra); -} - -/** - * A portability function - */ -static int socket_errno(void) { -#ifdef _WINSOCKAPI_ - return(WSAGetLastError()); -#else - return(errno); -#endif -} - -#ifdef SUPPORT_IP6 -static -int have_ipv6(void) { - int s; - - s = socket (AF_INET6, SOCK_STREAM, 0); - if (s != -1) { - close (s); - return (1); - } - return (0); -} -#endif - -/** - * xmlNanoHTTPInit: - * - * Initialize the HTTP protocol layer. - * Currently it just checks for proxy informations - */ - -void -xmlNanoHTTPInit(void) { - const char *env; -#ifdef _WINSOCKAPI_ - WSADATA wsaData; -#endif - - if (initialized) - return; - -#ifdef _WINSOCKAPI_ - if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) - return; -#endif - - if (proxy == NULL) { - proxyPort = 80; - env = getenv("no_proxy"); - if (env && ((env[0] == '*') && (env[1] == 0))) - goto done; - env = getenv("http_proxy"); - if (env != NULL) { - xmlNanoHTTPScanProxy(env); - goto done; - } - env = getenv("HTTP_PROXY"); - if (env != NULL) { - xmlNanoHTTPScanProxy(env); - goto done; - } - } -done: - initialized = 1; -} - -/** - * xmlNanoHTTPCleanup: - * - * Cleanup the HTTP protocol layer. - */ - -void -xmlNanoHTTPCleanup(void) { - if (proxy != NULL) { - xmlFree(proxy); - proxy = NULL; - } -#ifdef _WINSOCKAPI_ - if (initialized) - WSACleanup(); -#endif - initialized = 0; - return; -} - -/** - * xmlNanoHTTPScanURL: - * @ctxt: an HTTP context - * @URL: The URL used to initialize the context - * - * (Re)Initialize an HTTP context by parsing the URL and finding - * the protocol host port and path it indicates. - */ - -static void -xmlNanoHTTPScanURL(xmlNanoHTTPCtxtPtr ctxt, const char *URL) { - xmlURIPtr uri; - /* - * Clear any existing data from the context - */ - if (ctxt->protocol != NULL) { - xmlFree(ctxt->protocol); - ctxt->protocol = NULL; - } - if (ctxt->hostname != NULL) { - xmlFree(ctxt->hostname); - ctxt->hostname = NULL; - } - if (ctxt->path != NULL) { - xmlFree(ctxt->path); - ctxt->path = NULL; - } - if (ctxt->query != NULL) { - xmlFree(ctxt->query); - ctxt->query = NULL; - } - if (URL == NULL) return; - - uri = xmlParseURIRaw(URL, 1); - if (uri == NULL) - return; - - if ((uri->scheme == NULL) || (uri->server == NULL)) { - xmlFreeURI(uri); - return; - } - - ctxt->protocol = xmlMemStrdup(uri->scheme); - ctxt->hostname = xmlMemStrdup(uri->server); - if (uri->path != NULL) - ctxt->path = xmlMemStrdup(uri->path); - else - ctxt->path = xmlMemStrdup("/"); - if (uri->query != NULL) - ctxt->query = xmlMemStrdup(uri->query); - if (uri->port != 0) - ctxt->port = uri->port; - - xmlFreeURI(uri); -} - -/** - * xmlNanoHTTPScanProxy: - * @URL: The proxy URL used to initialize the proxy context - * - * (Re)Initialize the HTTP Proxy context by parsing the URL and finding - * the protocol host port it indicates. - * Should be like http://myproxy/ or http://myproxy:3128/ - * A NULL URL cleans up proxy informations. - */ - -void -xmlNanoHTTPScanProxy(const char *URL) { - xmlURIPtr uri; - - if (proxy != NULL) { - xmlFree(proxy); - proxy = NULL; - } - proxyPort = 0; - -#ifdef DEBUG_HTTP - if (URL == NULL) - xmlGenericError(xmlGenericErrorContext, - "Removing HTTP proxy info\n"); - else - xmlGenericError(xmlGenericErrorContext, - "Using HTTP proxy %s\n", URL); -#endif - if (URL == NULL) return; - - uri = xmlParseURIRaw(URL, 1); - if ((uri == NULL) || (uri->scheme == NULL) || - (strcmp(uri->scheme, "http")) || (uri->server == NULL)) { - __xmlIOErr(XML_FROM_HTTP, XML_HTTP_URL_SYNTAX, "Syntax Error\n"); - if (uri != NULL) - xmlFreeURI(uri); - return; - } - - proxy = xmlMemStrdup(uri->server); - if (uri->port != 0) - proxyPort = uri->port; - - xmlFreeURI(uri); -} - -/** - * xmlNanoHTTPNewCtxt: - * @URL: The URL used to initialize the context - * - * Allocate and initialize a new HTTP context. - * - * Returns an HTTP context or NULL in case of error. - */ - -static xmlNanoHTTPCtxtPtr -xmlNanoHTTPNewCtxt(const char *URL) { - xmlNanoHTTPCtxtPtr ret; - - ret = (xmlNanoHTTPCtxtPtr) xmlMalloc(sizeof(xmlNanoHTTPCtxt)); - if (ret == NULL) { - xmlHTTPErrMemory("allocating context"); - return(NULL); - } - - memset(ret, 0, sizeof(xmlNanoHTTPCtxt)); - ret->port = 80; - ret->returnValue = 0; - ret->fd = -1; - ret->ContentLength = -1; - - xmlNanoHTTPScanURL(ret, URL); - - return(ret); -} - -/** - * xmlNanoHTTPFreeCtxt: - * @ctxt: an HTTP context - * - * Frees the context after closing the connection. - */ - -static void -xmlNanoHTTPFreeCtxt(xmlNanoHTTPCtxtPtr ctxt) { - if (ctxt == NULL) return; - if (ctxt->hostname != NULL) xmlFree(ctxt->hostname); - if (ctxt->protocol != NULL) xmlFree(ctxt->protocol); - if (ctxt->path != NULL) xmlFree(ctxt->path); - if (ctxt->query != NULL) xmlFree(ctxt->query); - if (ctxt->out != NULL) xmlFree(ctxt->out); - if (ctxt->in != NULL) xmlFree(ctxt->in); - if (ctxt->contentType != NULL) xmlFree(ctxt->contentType); - if (ctxt->encoding != NULL) xmlFree(ctxt->encoding); - if (ctxt->mimeType != NULL) xmlFree(ctxt->mimeType); - if (ctxt->location != NULL) xmlFree(ctxt->location); - if (ctxt->authHeader != NULL) xmlFree(ctxt->authHeader); -#ifdef HAVE_ZLIB_H - if (ctxt->strm != NULL) { - inflateEnd(ctxt->strm); - xmlFree(ctxt->strm); - } -#endif - - ctxt->state = XML_NANO_HTTP_NONE; - if (ctxt->fd >= 0) closesocket(ctxt->fd); - ctxt->fd = -1; - xmlFree(ctxt); -} - -/** - * xmlNanoHTTPSend: - * @ctxt: an HTTP context - * - * Send the input needed to initiate the processing on the server side - * Returns number of bytes sent or -1 on error. - */ - -static int -xmlNanoHTTPSend(xmlNanoHTTPCtxtPtr ctxt, const char * xmt_ptr, int outlen) { - - int total_sent = 0; - - if ( (ctxt->state & XML_NANO_HTTP_WRITE) && (xmt_ptr != NULL ) ) { - while (total_sent < outlen) { - int nsent = send(ctxt->fd, xmt_ptr + total_sent, - outlen - total_sent, 0); - if (nsent>0) - total_sent += nsent; - else if ( ( nsent == -1 ) && -#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK - ( socket_errno( ) != EAGAIN ) && -#endif - ( socket_errno( ) != EWOULDBLOCK ) ) { - __xmlIOErr(XML_FROM_HTTP, 0, "send failed\n"); - if ( total_sent == 0 ) - total_sent = -1; - break; - } - else { - /* - ** No data sent - ** Since non-blocking sockets are used, wait for - ** socket to be writable or default timeout prior - ** to retrying. - */ - - struct timeval tv; - fd_set wfd; - - tv.tv_sec = timeout; - tv.tv_usec = 0; - FD_ZERO( &wfd ); -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4018) -#endif - FD_SET( ctxt->fd, &wfd ); -#ifdef _MSC_VER -#pragma warning(pop) -#endif - (void)select( ctxt->fd + 1, NULL, &wfd, NULL, &tv ); - } - } - } - - return total_sent; -} - -/** - * xmlNanoHTTPRecv: - * @ctxt: an HTTP context - * - * Read information coming from the HTTP connection. - * This is a blocking call (but it blocks in select(), not read()). - * - * Returns the number of byte read or -1 in case of error. - */ - -static int -xmlNanoHTTPRecv(xmlNanoHTTPCtxtPtr ctxt) { - fd_set rfd; - struct timeval tv; - - - while (ctxt->state & XML_NANO_HTTP_READ) { - if (ctxt->in == NULL) { - ctxt->in = (char *) xmlMallocAtomic(65000 * sizeof(char)); - if (ctxt->in == NULL) { - xmlHTTPErrMemory("allocating input"); - ctxt->last = -1; - return(-1); - } - ctxt->inlen = 65000; - ctxt->inptr = ctxt->content = ctxt->inrptr = ctxt->in; - } - if (ctxt->inrptr > ctxt->in + XML_NANO_HTTP_CHUNK) { - int delta = ctxt->inrptr - ctxt->in; - int len = ctxt->inptr - ctxt->inrptr; - - memmove(ctxt->in, ctxt->inrptr, len); - ctxt->inrptr -= delta; - ctxt->content -= delta; - ctxt->inptr -= delta; - } - if ((ctxt->in + ctxt->inlen) < (ctxt->inptr + XML_NANO_HTTP_CHUNK)) { - int d_inptr = ctxt->inptr - ctxt->in; - int d_content = ctxt->content - ctxt->in; - int d_inrptr = ctxt->inrptr - ctxt->in; - char * tmp_ptr = ctxt->in; - - ctxt->inlen *= 2; - ctxt->in = (char *) xmlRealloc(tmp_ptr, ctxt->inlen); - if (ctxt->in == NULL) { - xmlHTTPErrMemory("allocating input buffer"); - xmlFree( tmp_ptr ); - ctxt->last = -1; - return(-1); - } - ctxt->inptr = ctxt->in + d_inptr; - ctxt->content = ctxt->in + d_content; - ctxt->inrptr = ctxt->in + d_inrptr; - } - ctxt->last = recv(ctxt->fd, ctxt->inptr, XML_NANO_HTTP_CHUNK, 0); - if (ctxt->last > 0) { - ctxt->inptr += ctxt->last; - return(ctxt->last); - } - if (ctxt->last == 0) { - return(0); - } - if (ctxt->last == -1) { - switch (socket_errno()) { - case EINPROGRESS: - case EWOULDBLOCK: -#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK - case EAGAIN: -#endif - break; - - case ECONNRESET: - case ESHUTDOWN: - return ( 0 ); - - default: - __xmlIOErr(XML_FROM_HTTP, 0, "recv failed\n"); - return(-1); - } - } - - tv.tv_sec = timeout; - tv.tv_usec = 0; - FD_ZERO(&rfd); -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4018) -#endif - FD_SET(ctxt->fd, &rfd); -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - if ( (select(ctxt->fd+1, &rfd, NULL, NULL, &tv)<1) -#if defined(EINTR) - && (errno != EINTR) -#endif - ) - return(0); - } - return(0); -} - -/** - * xmlNanoHTTPReadLine: - * @ctxt: an HTTP context - * - * Read one line in the HTTP server output, usually for extracting - * the HTTP protocol informations from the answer header. - * - * Returns a newly allocated string with a copy of the line, or NULL - * which indicate the end of the input. - */ - -static char * -xmlNanoHTTPReadLine(xmlNanoHTTPCtxtPtr ctxt) { - char buf[4096]; - char *bp = buf; - int rc; - - while (bp - buf < 4095) { - if (ctxt->inrptr == ctxt->inptr) { - if ( (rc = xmlNanoHTTPRecv(ctxt)) == 0) { - if (bp == buf) - return(NULL); - else - *bp = 0; - return(xmlMemStrdup(buf)); - } - else if ( rc == -1 ) { - return ( NULL ); - } - } - *bp = *ctxt->inrptr++; - if (*bp == '\n') { - *bp = 0; - return(xmlMemStrdup(buf)); - } - if (*bp != '\r') - bp++; - } - buf[4095] = 0; - return(xmlMemStrdup(buf)); -} - - -/** - * xmlNanoHTTPScanAnswer: - * @ctxt: an HTTP context - * @line: an HTTP header line - * - * Try to extract useful informations from the server answer. - * We currently parse and process: - * - The HTTP revision/ return code - * - The Content-Type, Mime-Type and charset used - * - The Location for redirect processing. - * - * Returns -1 in case of failure, the file descriptor number otherwise - */ - -static void -xmlNanoHTTPScanAnswer(xmlNanoHTTPCtxtPtr ctxt, const char *line) { - const char *cur = line; - - if (line == NULL) return; - - if (!strncmp(line, "HTTP/", 5)) { - int version = 0; - int ret = 0; - - cur += 5; - while ((*cur >= '0') && (*cur <= '9')) { - version *= 10; - version += *cur - '0'; - cur++; - } - if (*cur == '.') { - cur++; - if ((*cur >= '0') && (*cur <= '9')) { - version *= 10; - version += *cur - '0'; - cur++; - } - while ((*cur >= '0') && (*cur <= '9')) - cur++; - } else - version *= 10; - if ((*cur != ' ') && (*cur != '\t')) return; - while ((*cur == ' ') || (*cur == '\t')) cur++; - if ((*cur < '0') || (*cur > '9')) return; - while ((*cur >= '0') && (*cur <= '9')) { - ret *= 10; - ret += *cur - '0'; - cur++; - } - if ((*cur != 0) && (*cur != ' ') && (*cur != '\t')) return; - ctxt->returnValue = ret; - } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Content-Type:", 13)) { - const xmlChar *charset, *last, *mime; - cur += 13; - while ((*cur == ' ') || (*cur == '\t')) cur++; - if (ctxt->contentType != NULL) - xmlFree(ctxt->contentType); - ctxt->contentType = xmlMemStrdup(cur); - mime = (const xmlChar *) cur; - last = mime; - while ((*last != 0) && (*last != ' ') && (*last != '\t') && - (*last != ';') && (*last != ',')) - last++; - if (ctxt->mimeType != NULL) - xmlFree(ctxt->mimeType); - ctxt->mimeType = (char *) xmlStrndup(mime, last - mime); - charset = xmlStrstr(BAD_CAST ctxt->contentType, BAD_CAST "charset="); - if (charset != NULL) { - charset += 8; - last = charset; - while ((*last != 0) && (*last != ' ') && (*last != '\t') && - (*last != ';') && (*last != ',')) - last++; - if (ctxt->encoding != NULL) - xmlFree(ctxt->encoding); - ctxt->encoding = (char *) xmlStrndup(charset, last - charset); - } - } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"ContentType:", 12)) { - const xmlChar *charset, *last, *mime; - cur += 12; - if (ctxt->contentType != NULL) return; - while ((*cur == ' ') || (*cur == '\t')) cur++; - ctxt->contentType = xmlMemStrdup(cur); - mime = (const xmlChar *) cur; - last = mime; - while ((*last != 0) && (*last != ' ') && (*last != '\t') && - (*last != ';') && (*last != ',')) - last++; - if (ctxt->mimeType != NULL) - xmlFree(ctxt->mimeType); - ctxt->mimeType = (char *) xmlStrndup(mime, last - mime); - charset = xmlStrstr(BAD_CAST ctxt->contentType, BAD_CAST "charset="); - if (charset != NULL) { - charset += 8; - last = charset; - while ((*last != 0) && (*last != ' ') && (*last != '\t') && - (*last != ';') && (*last != ',')) - last++; - if (ctxt->encoding != NULL) - xmlFree(ctxt->encoding); - ctxt->encoding = (char *) xmlStrndup(charset, last - charset); - } - } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Location:", 9)) { - cur += 9; - while ((*cur == ' ') || (*cur == '\t')) cur++; - if (ctxt->location != NULL) - xmlFree(ctxt->location); - if (*cur == '/') { - xmlChar *tmp_http = xmlStrdup(BAD_CAST "http://"); - xmlChar *tmp_loc = - xmlStrcat(tmp_http, (const xmlChar *) ctxt->hostname); - ctxt->location = - (char *) xmlStrcat (tmp_loc, (const xmlChar *) cur); - } else { - ctxt->location = xmlMemStrdup(cur); - } - } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"WWW-Authenticate:", 17)) { - cur += 17; - while ((*cur == ' ') || (*cur == '\t')) cur++; - if (ctxt->authHeader != NULL) - xmlFree(ctxt->authHeader); - ctxt->authHeader = xmlMemStrdup(cur); - } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Proxy-Authenticate:", 19)) { - cur += 19; - while ((*cur == ' ') || (*cur == '\t')) cur++; - if (ctxt->authHeader != NULL) - xmlFree(ctxt->authHeader); - ctxt->authHeader = xmlMemStrdup(cur); -#ifdef HAVE_ZLIB_H - } else if ( !xmlStrncasecmp( BAD_CAST line, BAD_CAST"Content-Encoding:", 17) ) { - cur += 17; - while ((*cur == ' ') || (*cur == '\t')) cur++; - if ( !xmlStrncasecmp( BAD_CAST cur, BAD_CAST"gzip", 4) ) { - ctxt->usesGzip = 1; - - ctxt->strm = xmlMalloc(sizeof(z_stream)); - - if (ctxt->strm != NULL) { - ctxt->strm->zalloc = Z_NULL; - ctxt->strm->zfree = Z_NULL; - ctxt->strm->opaque = Z_NULL; - ctxt->strm->avail_in = 0; - ctxt->strm->next_in = Z_NULL; - - inflateInit2( ctxt->strm, 31 ); - } - } -#endif - } else if ( !xmlStrncasecmp( BAD_CAST line, BAD_CAST"Content-Length:", 15) ) { - cur += 15; - ctxt->ContentLength = strtol( cur, NULL, 10 ); - } -} - -/** - * xmlNanoHTTPConnectAttempt: - * @addr: a socket address structure - * - * Attempt a connection to the given IP:port endpoint. It forces - * non-blocking semantic on the socket, and allow 60 seconds for - * the host to answer. - * - * Returns -1 in case of failure, the file descriptor number otherwise - */ - -static int -xmlNanoHTTPConnectAttempt(struct sockaddr *addr) -{ - fd_set wfd; -#ifdef _WINSOCKAPI_ - fd_set xfd; -#endif - struct timeval tv; - int status; - int addrlen; - SOCKET s; - -#ifdef SUPPORT_IP6 - if (addr->sa_family == AF_INET6) { - s = socket (PF_INET6, SOCK_STREAM, IPPROTO_TCP); - addrlen = sizeof (struct sockaddr_in6); - } - else -#endif - { - s = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); - addrlen = sizeof (struct sockaddr_in); - } - if (s==-1) { -#ifdef DEBUG_HTTP - perror("socket"); -#endif - __xmlIOErr(XML_FROM_HTTP, 0, "socket failed\n"); - return(-1); - } - -#ifdef _WINSOCKAPI_ - { - u_long one = 1; - - status = ioctlsocket(s, FIONBIO, &one) == SOCKET_ERROR ? -1 : 0; - } -#else /* _WINSOCKAPI_ */ -#if defined(VMS) - { - int enable = 1; - status = ioctl(s, FIONBIO, &enable); - } -#else /* VMS */ -#if defined(__BEOS__) - { - bool noblock = true; - status = setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &noblock, sizeof(noblock)); - } -#else /* __BEOS__ */ - if ((status = fcntl(s, F_GETFL, 0)) != -1) { -#ifdef O_NONBLOCK - status |= O_NONBLOCK; -#else /* O_NONBLOCK */ -#ifdef F_NDELAY - status |= F_NDELAY; -#endif /* F_NDELAY */ -#endif /* !O_NONBLOCK */ - status = fcntl(s, F_SETFL, status); - } - if (status < 0) { -#ifdef DEBUG_HTTP - perror("nonblocking"); -#endif - __xmlIOErr(XML_FROM_HTTP, 0, "error setting non-blocking IO\n"); - closesocket(s); - return(-1); - } -#endif /* !__BEOS__ */ -#endif /* !VMS */ -#endif /* !_WINSOCKAPI_ */ - - if (connect (s, addr, addrlen) == -1) { - switch (socket_errno()) { - case EINPROGRESS: - case EWOULDBLOCK: - break; - default: - __xmlIOErr(XML_FROM_HTTP, 0, "error connecting to HTTP server"); - closesocket(s); - return(-1); - } - } - - tv.tv_sec = timeout; - tv.tv_usec = 0; - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4018) -#endif - FD_ZERO(&wfd); - FD_SET(s, &wfd); - -#ifdef _WINSOCKAPI_ - FD_ZERO(&xfd); - FD_SET(s, &xfd); - - switch(select(s+1, NULL, &wfd, &xfd, &tv)) -#else - switch(select(s+1, NULL, &wfd, NULL, &tv)) -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - { - case 0: - /* Time out */ - __xmlIOErr(XML_FROM_HTTP, 0, "Connect attempt timed out"); - closesocket(s); - return(-1); - case -1: - /* Ermm.. ?? */ - __xmlIOErr(XML_FROM_HTTP, 0, "Connect failed"); - closesocket(s); - return(-1); - } - - if ( FD_ISSET(s, &wfd) -#ifdef _WINSOCKAPI_ - || FD_ISSET(s, &xfd) -#endif - ) { - XML_SOCKLEN_T len; - len = sizeof(status); -#ifdef SO_ERROR - if (getsockopt(s, SOL_SOCKET, SO_ERROR, (char*)&status, &len) < 0 ) { - /* Solaris error code */ - __xmlIOErr(XML_FROM_HTTP, 0, "getsockopt failed\n"); - return (-1); - } -#endif - if ( status ) { - __xmlIOErr(XML_FROM_HTTP, 0, "Error connecting to remote host"); - closesocket(s); - errno = status; - return (-1); - } - } else { - /* pbm */ - __xmlIOErr(XML_FROM_HTTP, 0, "select failed\n"); - closesocket(s); - return (-1); - } - - return(s); -} - -/** - * xmlNanoHTTPConnectHost: - * @host: the host name - * @port: the port number - * - * Attempt a connection to the given host:port endpoint. It tries - * the multiple IP provided by the DNS if available. - * - * Returns -1 in case of failure, the file descriptor number otherwise - */ - -static int -xmlNanoHTTPConnectHost(const char *host, int port) -{ - struct hostent *h; - struct sockaddr *addr = NULL; - struct in_addr ia; - struct sockaddr_in sockin; - -#ifdef SUPPORT_IP6 - struct in6_addr ia6; - struct sockaddr_in6 sockin6; -#endif - int i; - int s; - - memset (&sockin, 0, sizeof(sockin)); -#ifdef SUPPORT_IP6 - memset (&sockin6, 0, sizeof(sockin6)); -#endif - -#if !defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && defined(RES_USE_INET6) - if (have_ipv6 ()) - { - if (!(_res.options & RES_INIT)) - res_init(); - _res.options |= RES_USE_INET6; - } -#endif - -#if defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && !defined(_WIN32) - if (have_ipv6 ()) -#endif -#if defined(HAVE_GETADDRINFO) && (defined(SUPPORT_IP6) || defined(_WIN32)) - { - int status; - struct addrinfo hints, *res, *result; - - result = NULL; - memset (&hints, 0,sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - - status = getaddrinfo (host, NULL, &hints, &result); - if (status) { - __xmlIOErr(XML_FROM_HTTP, 0, "getaddrinfo failed\n"); - return (-1); - } - - for (res = result; res; res = res->ai_next) { - if (res->ai_family == AF_INET) { - if (res->ai_addrlen > sizeof(sockin)) { - __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); - freeaddrinfo (result); - return (-1); - } - memcpy (&sockin, res->ai_addr, res->ai_addrlen); - sockin.sin_port = htons (port); - addr = (struct sockaddr *)&sockin; -#ifdef SUPPORT_IP6 - } else if (have_ipv6 () && (res->ai_family == AF_INET6)) { - if (res->ai_addrlen > sizeof(sockin6)) { - __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); - freeaddrinfo (result); - return (-1); - } - memcpy (&sockin6, res->ai_addr, res->ai_addrlen); - sockin6.sin6_port = htons (port); - addr = (struct sockaddr *)&sockin6; -#endif - } else - continue; /* for */ - - s = xmlNanoHTTPConnectAttempt (addr); - if (s != -1) { - freeaddrinfo (result); - return (s); - } - } - - if (result) - freeaddrinfo (result); - } -#endif -#if defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && !defined(_WIN32) - else -#endif -#if !defined(HAVE_GETADDRINFO) || !defined(_WIN32) - { - h = gethostbyname (host); - if (h == NULL) { - -/* - * Okay, I got fed up by the non-portability of this error message - * extraction code. it work on Linux, if it work on your platform - * and one want to enable it, send me the defined(foobar) needed - */ -#if defined(HAVE_NETDB_H) && defined(HOST_NOT_FOUND) && defined(linux) - const char *h_err_txt = ""; - - switch (h_errno) { - case HOST_NOT_FOUND: - h_err_txt = "Authoritive host not found"; - break; - - case TRY_AGAIN: - h_err_txt = - "Non-authoritive host not found or server failure."; - break; - - case NO_RECOVERY: - h_err_txt = - "Non-recoverable errors: FORMERR, REFUSED, or NOTIMP."; - break; - - case NO_ADDRESS: - h_err_txt = - "Valid name, no data record of requested type."; - break; - - default: - h_err_txt = "No error text defined."; - break; - } - __xmlIOErr(XML_FROM_HTTP, 0, h_err_txt); -#else - __xmlIOErr(XML_FROM_HTTP, 0, "Failed to resolve host"); -#endif - return (-1); - } - - for (i = 0; h->h_addr_list[i]; i++) { - if (h->h_addrtype == AF_INET) { - /* A records (IPv4) */ - if ((unsigned int) h->h_length > sizeof(ia)) { - __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); - return (-1); - } - memcpy (&ia, h->h_addr_list[i], h->h_length); - sockin.sin_family = h->h_addrtype; - sockin.sin_addr = ia; - sockin.sin_port = (u_short)htons ((unsigned short)port); - addr = (struct sockaddr *) &sockin; -#ifdef SUPPORT_IP6 - } else if (have_ipv6 () && (h->h_addrtype == AF_INET6)) { - /* AAAA records (IPv6) */ - if ((unsigned int) h->h_length > sizeof(ia6)) { - __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); - return (-1); - } - memcpy (&ia6, h->h_addr_list[i], h->h_length); - sockin6.sin6_family = h->h_addrtype; - sockin6.sin6_addr = ia6; - sockin6.sin6_port = htons (port); - addr = (struct sockaddr *) &sockin6; -#endif - } else - break; /* for */ - - s = xmlNanoHTTPConnectAttempt (addr); - if (s != -1) - return (s); - } - } -#endif - -#ifdef DEBUG_HTTP - xmlGenericError(xmlGenericErrorContext, - "xmlNanoHTTPConnectHost: unable to connect to '%s'.\n", - host); -#endif - return (-1); -} - - -/** - * xmlNanoHTTPOpen: - * @URL: The URL to load - * @contentType: if available the Content-Type information will be - * returned at that location - * - * This function try to open a connection to the indicated resource - * via HTTP GET. - * - * Returns NULL in case of failure, otherwise a request handler. - * The contentType, if provided must be freed by the caller - */ - -void* -xmlNanoHTTPOpen(const char *URL, char **contentType) { - if (contentType != NULL) *contentType = NULL; - return(xmlNanoHTTPMethod(URL, NULL, NULL, contentType, NULL, 0)); -} - -/** - * xmlNanoHTTPOpenRedir: - * @URL: The URL to load - * @contentType: if available the Content-Type information will be - * returned at that location - * @redir: if available the redirected URL will be returned - * - * This function try to open a connection to the indicated resource - * via HTTP GET. - * - * Returns NULL in case of failure, otherwise a request handler. - * The contentType, if provided must be freed by the caller - */ - -void* -xmlNanoHTTPOpenRedir(const char *URL, char **contentType, char **redir) { - if (contentType != NULL) *contentType = NULL; - if (redir != NULL) *redir = NULL; - return(xmlNanoHTTPMethodRedir(URL, NULL, NULL, contentType, redir, NULL,0)); -} - -/** - * xmlNanoHTTPRead: - * @ctx: the HTTP context - * @dest: a buffer - * @len: the buffer length - * - * This function tries to read @len bytes from the existing HTTP connection - * and saves them in @dest. This is a blocking call. - * - * Returns the number of byte read. 0 is an indication of an end of connection. - * -1 indicates a parameter error. - */ -int -xmlNanoHTTPRead(void *ctx, void *dest, int len) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; -#ifdef HAVE_ZLIB_H - int bytes_read = 0; - int orig_avail_in; - int z_ret; -#endif - - if (ctx == NULL) return(-1); - if (dest == NULL) return(-1); - if (len <= 0) return(0); - -#ifdef HAVE_ZLIB_H - if (ctxt->usesGzip == 1) { - if (ctxt->strm == NULL) return(0); - - ctxt->strm->next_out = dest; - ctxt->strm->avail_out = len; - - do { - orig_avail_in = ctxt->strm->avail_in = ctxt->inptr - ctxt->inrptr - bytes_read; - ctxt->strm->next_in = BAD_CAST (ctxt->inrptr + bytes_read); - - z_ret = inflate(ctxt->strm, Z_NO_FLUSH); - bytes_read += orig_avail_in - ctxt->strm->avail_in; - - if (z_ret != Z_OK) break; - } while (ctxt->strm->avail_out > 0 && xmlNanoHTTPRecv(ctxt) > 0); - - ctxt->inrptr += bytes_read; - return(len - ctxt->strm->avail_out); - } -#endif - - while (ctxt->inptr - ctxt->inrptr < len) { - if (xmlNanoHTTPRecv(ctxt) <= 0) break; - } - if (ctxt->inptr - ctxt->inrptr < len) - len = ctxt->inptr - ctxt->inrptr; - memcpy(dest, ctxt->inrptr, len); - ctxt->inrptr += len; - return(len); -} - -/** - * xmlNanoHTTPClose: - * @ctx: the HTTP context - * - * This function closes an HTTP context, it ends up the connection and - * free all data related to it. - */ -void -xmlNanoHTTPClose(void *ctx) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; - - if (ctx == NULL) return; - - xmlNanoHTTPFreeCtxt(ctxt); -} - -/** - * xmlNanoHTTPMethodRedir: - * @URL: The URL to load - * @method: the HTTP method to use - * @input: the input string if any - * @contentType: the Content-Type information IN and OUT - * @redir: the redirected URL OUT - * @headers: the extra headers - * @ilen: input length - * - * This function try to open a connection to the indicated resource - * via HTTP using the given @method, adding the given extra headers - * and the input buffer for the request content. - * - * Returns NULL in case of failure, otherwise a request handler. - * The contentType, or redir, if provided must be freed by the caller - */ - -void* -xmlNanoHTTPMethodRedir(const char *URL, const char *method, const char *input, - char **contentType, char **redir, - const char *headers, int ilen ) { - xmlNanoHTTPCtxtPtr ctxt; - char *bp, *p; - int blen, ret; - int head; - int nbRedirects = 0; - char *redirURL = NULL; -#ifdef DEBUG_HTTP - int xmt_bytes; -#endif - - if (URL == NULL) return(NULL); - if (method == NULL) method = "GET"; - xmlNanoHTTPInit(); - -retry: - if (redirURL == NULL) - ctxt = xmlNanoHTTPNewCtxt(URL); - else { - ctxt = xmlNanoHTTPNewCtxt(redirURL); - ctxt->location = xmlMemStrdup(redirURL); - } - - if ( ctxt == NULL ) { - return ( NULL ); - } - - if ((ctxt->protocol == NULL) || (strcmp(ctxt->protocol, "http"))) { - __xmlIOErr(XML_FROM_HTTP, XML_HTTP_URL_SYNTAX, "Not a valid HTTP URI"); - xmlNanoHTTPFreeCtxt(ctxt); - if (redirURL != NULL) xmlFree(redirURL); - return(NULL); - } - if (ctxt->hostname == NULL) { - __xmlIOErr(XML_FROM_HTTP, XML_HTTP_UNKNOWN_HOST, - "Failed to identify host in URI"); - xmlNanoHTTPFreeCtxt(ctxt); - if (redirURL != NULL) xmlFree(redirURL); - return(NULL); - } - if (proxy) { - blen = strlen(ctxt->hostname) * 2 + 16; - ret = xmlNanoHTTPConnectHost(proxy, proxyPort); - } - else { - blen = strlen(ctxt->hostname); - ret = xmlNanoHTTPConnectHost(ctxt->hostname, ctxt->port); - } - if (ret < 0) { - xmlNanoHTTPFreeCtxt(ctxt); - if (redirURL != NULL) xmlFree(redirURL); - return(NULL); - } - ctxt->fd = ret; - - if (input == NULL) - ilen = 0; - else - blen += 36; - - if (headers != NULL) - blen += strlen(headers) + 2; - if (contentType && *contentType) - blen += strlen(*contentType) + 16; - if (ctxt->query != NULL) - blen += strlen(ctxt->query) + 1; - blen += strlen(method) + strlen(ctxt->path) + 24; -#ifdef HAVE_ZLIB_H - blen += 23; -#endif - bp = (char*)xmlMallocAtomic(blen); - if ( bp == NULL ) { - xmlNanoHTTPFreeCtxt( ctxt ); - xmlHTTPErrMemory("allocating header buffer"); - return ( NULL ); - } - - p = bp; - - if (proxy) { - if (ctxt->port != 80) { - p += snprintf( p, blen - (p - bp), "%s http://%s:%d%s", - method, ctxt->hostname, - ctxt->port, ctxt->path ); - } - else - p += snprintf( p, blen - (p - bp), "%s http://%s%s", method, - ctxt->hostname, ctxt->path); - } - else - p += snprintf( p, blen - (p - bp), "%s %s", method, ctxt->path); - - if (ctxt->query != NULL) - p += snprintf( p, blen - (p - bp), "?%s", ctxt->query); - - p += snprintf( p, blen - (p - bp), " HTTP/1.0\r\nHost: %s\r\n", - ctxt->hostname); - -#ifdef HAVE_ZLIB_H - p += snprintf(p, blen - (p - bp), "Accept-Encoding: gzip\r\n"); -#endif - - if (contentType != NULL && *contentType) - p += snprintf(p, blen - (p - bp), "Content-Type: %s\r\n", *contentType); - - if (headers != NULL) - p += snprintf( p, blen - (p - bp), "%s", headers ); - - if (input != NULL) - snprintf(p, blen - (p - bp), "Content-Length: %d\r\n\r\n", ilen ); - else - snprintf(p, blen - (p - bp), "\r\n"); - -#ifdef DEBUG_HTTP - xmlGenericError(xmlGenericErrorContext, - "-> %s%s", proxy? "(Proxy) " : "", bp); - if ((blen -= strlen(bp)+1) < 0) - xmlGenericError(xmlGenericErrorContext, - "ERROR: overflowed buffer by %d bytes\n", -blen); -#endif - ctxt->outptr = ctxt->out = bp; - ctxt->state = XML_NANO_HTTP_WRITE; - blen = strlen( ctxt->out ); -#ifdef DEBUG_HTTP - xmt_bytes = xmlNanoHTTPSend(ctxt, ctxt->out, blen ); - if ( xmt_bytes != blen ) - xmlGenericError( xmlGenericErrorContext, - "xmlNanoHTTPMethodRedir: Only %d of %d %s %s\n", - xmt_bytes, blen, - "bytes of HTTP headers sent to host", - ctxt->hostname ); -#else - xmlNanoHTTPSend(ctxt, ctxt->out, blen ); -#endif - - if ( input != NULL ) { -#ifdef DEBUG_HTTP - xmt_bytes = xmlNanoHTTPSend( ctxt, input, ilen ); - - if ( xmt_bytes != ilen ) - xmlGenericError( xmlGenericErrorContext, - "xmlNanoHTTPMethodRedir: Only %d of %d %s %s\n", - xmt_bytes, ilen, - "bytes of HTTP content sent to host", - ctxt->hostname ); -#else - xmlNanoHTTPSend( ctxt, input, ilen ); -#endif - } - - ctxt->state = XML_NANO_HTTP_READ; - head = 1; - - while ((p = xmlNanoHTTPReadLine(ctxt)) != NULL) { - if (head && (*p == 0)) { - head = 0; - ctxt->content = ctxt->inrptr; - xmlFree(p); - break; - } - xmlNanoHTTPScanAnswer(ctxt, p); - -#ifdef DEBUG_HTTP - xmlGenericError(xmlGenericErrorContext, "<- %s\n", p); -#endif - xmlFree(p); - } - - if ((ctxt->location != NULL) && (ctxt->returnValue >= 300) && - (ctxt->returnValue < 400)) { -#ifdef DEBUG_HTTP - xmlGenericError(xmlGenericErrorContext, - "\nRedirect to: %s\n", ctxt->location); -#endif - while ( xmlNanoHTTPRecv(ctxt) > 0 ) ; - if (nbRedirects < XML_NANO_HTTP_MAX_REDIR) { - nbRedirects++; - if (redirURL != NULL) - xmlFree(redirURL); - redirURL = xmlMemStrdup(ctxt->location); - xmlNanoHTTPFreeCtxt(ctxt); - goto retry; - } - xmlNanoHTTPFreeCtxt(ctxt); - if (redirURL != NULL) xmlFree(redirURL); -#ifdef DEBUG_HTTP - xmlGenericError(xmlGenericErrorContext, - "xmlNanoHTTPMethodRedir: Too many redirects, aborting ...\n"); -#endif - return(NULL); - } - - if (contentType != NULL) { - if (ctxt->contentType != NULL) - *contentType = xmlMemStrdup(ctxt->contentType); - else - *contentType = NULL; - } - - if ((redir != NULL) && (redirURL != NULL)) { - *redir = redirURL; - } else { - if (redirURL != NULL) - xmlFree(redirURL); - if (redir != NULL) - *redir = NULL; - } - -#ifdef DEBUG_HTTP - if (ctxt->contentType != NULL) - xmlGenericError(xmlGenericErrorContext, - "\nCode %d, content-type '%s'\n\n", - ctxt->returnValue, ctxt->contentType); - else - xmlGenericError(xmlGenericErrorContext, - "\nCode %d, no content-type\n\n", - ctxt->returnValue); -#endif - - return((void *) ctxt); -} - -/** - * xmlNanoHTTPMethod: - * @URL: The URL to load - * @method: the HTTP method to use - * @input: the input string if any - * @contentType: the Content-Type information IN and OUT - * @headers: the extra headers - * @ilen: input length - * - * This function try to open a connection to the indicated resource - * via HTTP using the given @method, adding the given extra headers - * and the input buffer for the request content. - * - * Returns NULL in case of failure, otherwise a request handler. - * The contentType, if provided must be freed by the caller - */ - -void* -xmlNanoHTTPMethod(const char *URL, const char *method, const char *input, - char **contentType, const char *headers, int ilen) { - return(xmlNanoHTTPMethodRedir(URL, method, input, contentType, - NULL, headers, ilen)); -} - -/** - * xmlNanoHTTPFetch: - * @URL: The URL to load - * @filename: the filename where the content should be saved - * @contentType: if available the Content-Type information will be - * returned at that location - * - * This function try to fetch the indicated resource via HTTP GET - * and save it's content in the file. - * - * Returns -1 in case of failure, 0 incase of success. The contentType, - * if provided must be freed by the caller - */ -int -xmlNanoHTTPFetch(const char *URL, const char *filename, char **contentType) { - void *ctxt = NULL; - char *buf = NULL; - int fd; - int len; - - if (filename == NULL) return(-1); - ctxt = xmlNanoHTTPOpen(URL, contentType); - if (ctxt == NULL) return(-1); - - if (!strcmp(filename, "-")) - fd = 0; - else { - fd = open(filename, O_CREAT | O_WRONLY, 00644); - if (fd < 0) { - xmlNanoHTTPClose(ctxt); - if ((contentType != NULL) && (*contentType != NULL)) { - xmlFree(*contentType); - *contentType = NULL; - } - return(-1); - } - } - - xmlNanoHTTPFetchContent( ctxt, &buf, &len ); - if ( len > 0 ) { - write(fd, buf, len); - } - - xmlNanoHTTPClose(ctxt); - close(fd); - return(0); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlNanoHTTPSave: - * @ctxt: the HTTP context - * @filename: the filename where the content should be saved - * - * This function saves the output of the HTTP transaction to a file - * It closes and free the context at the end - * - * Returns -1 in case of failure, 0 incase of success. - */ -int -xmlNanoHTTPSave(void *ctxt, const char *filename) { - char *buf = NULL; - int fd; - int len; - - if ((ctxt == NULL) || (filename == NULL)) return(-1); - - if (!strcmp(filename, "-")) - fd = 0; - else { - fd = open(filename, O_CREAT | O_WRONLY); - if (fd < 0) { - xmlNanoHTTPClose(ctxt); - return(-1); - } - } - - xmlNanoHTTPFetchContent( ctxt, &buf, &len ); - if ( len > 0 ) { - write(fd, buf, len); - } - - xmlNanoHTTPClose(ctxt); - close(fd); - return(0); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlNanoHTTPReturnCode: - * @ctx: the HTTP context - * - * Get the latest HTTP return code received - * - * Returns the HTTP return code for the request. - */ -int -xmlNanoHTTPReturnCode(void *ctx) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; - - if (ctxt == NULL) return(-1); - - return(ctxt->returnValue); -} - -/** - * xmlNanoHTTPAuthHeader: - * @ctx: the HTTP context - * - * Get the authentication header of an HTTP context - * - * Returns the stashed value of the WWW-Authenticate or Proxy-Authenticate - * header. - */ -const char * -xmlNanoHTTPAuthHeader(void *ctx) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; - - if (ctxt == NULL) return(NULL); - - return(ctxt->authHeader); -} - -/** - * xmlNanoHTTPContentLength: - * @ctx: the HTTP context - * - * Provides the specified content length from the HTTP header. - * - * Return the specified content length from the HTTP header. Note that - * a value of -1 indicates that the content length element was not included in - * the response header. - */ -int -xmlNanoHTTPContentLength( void * ctx ) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; - - return ( ( ctxt == NULL ) ? -1 : ctxt->ContentLength ); -} - -/** - * xmlNanoHTTPRedir: - * @ctx: the HTTP context - * - * Provides the specified redirection URL if available from the HTTP header. - * - * Return the specified redirection URL or NULL if not redirected. - */ -const char * -xmlNanoHTTPRedir( void * ctx ) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; - - return ( ( ctxt == NULL ) ? NULL : ctxt->location ); -} - -/** - * xmlNanoHTTPEncoding: - * @ctx: the HTTP context - * - * Provides the specified encoding if specified in the HTTP headers. - * - * Return the specified encoding or NULL if not available - */ -const char * -xmlNanoHTTPEncoding( void * ctx ) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; - - return ( ( ctxt == NULL ) ? NULL : ctxt->encoding ); -} - -/** - * xmlNanoHTTPMimeType: - * @ctx: the HTTP context - * - * Provides the specified Mime-Type if specified in the HTTP headers. - * - * Return the specified Mime-Type or NULL if not available - */ -const char * -xmlNanoHTTPMimeType( void * ctx ) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; - - return ( ( ctxt == NULL ) ? NULL : ctxt->mimeType ); -} - -/** - * xmlNanoHTTPFetchContent: - * @ctx: the HTTP context - * @ptr: pointer to set to the content buffer. - * @len: integer pointer to hold the length of the content - * - * Check if all the content was read - * - * Returns 0 if all the content was read and available, returns - * -1 if received content length was less than specified or an error - * occurred. - */ -static int -xmlNanoHTTPFetchContent( void * ctx, char ** ptr, int * len ) { - xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; - - int rc = 0; - int cur_lgth; - int rcvd_lgth; - int dummy_int; - char * dummy_ptr = NULL; - - /* Dummy up return input parameters if not provided */ - - if ( len == NULL ) - len = &dummy_int; - - if ( ptr == NULL ) - ptr = &dummy_ptr; - - /* But can't work without the context pointer */ - - if ( ( ctxt == NULL ) || ( ctxt->content == NULL ) ) { - *len = 0; - *ptr = NULL; - return ( -1 ); - } - - rcvd_lgth = ctxt->inptr - ctxt->content; - - while ( (cur_lgth = xmlNanoHTTPRecv( ctxt )) > 0 ) { - - rcvd_lgth += cur_lgth; - if ( (ctxt->ContentLength > 0) && (rcvd_lgth >= ctxt->ContentLength) ) - break; - } - - *ptr = ctxt->content; - *len = rcvd_lgth; - - if ( ( ctxt->ContentLength > 0 ) && ( rcvd_lgth < ctxt->ContentLength ) ) - rc = -1; - else if ( rcvd_lgth == 0 ) - rc = -1; - - return ( rc ); -} - -#ifdef STANDALONE -int main(int argc, char **argv) { - char *contentType = NULL; - - if (argv[1] != NULL) { - if (argv[2] != NULL) - xmlNanoHTTPFetch(argv[1], argv[2], &contentType); - else - xmlNanoHTTPFetch(argv[1], "-", &contentType); - if (contentType != NULL) xmlFree(contentType); - } else { - xmlGenericError(xmlGenericErrorContext, - "%s: minimal HTTP GET implementation\n", argv[0]); - xmlGenericError(xmlGenericErrorContext, - "\tusage %s [ URL [ filename ] ]\n", argv[0]); - } - xmlNanoHTTPCleanup(); - xmlMemoryDump(); - return(0); -} -#endif /* STANDALONE */ -#else /* !LIBXML_HTTP_ENABLED */ -#ifdef STANDALONE -#include <stdio.h> -int main(int argc, char **argv) { - xmlGenericError(xmlGenericErrorContext, - "%s : HTTP support not compiled in\n", argv[0]); - return(0); -} -#endif /* STANDALONE */ -#endif /* LIBXML_HTTP_ENABLED */ -#define bottom_nanohttp -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/parser.c b/ThirdParty/libxml2/vtklibxml2/parser.c deleted file mode 100644 index 8a8ebc35b9e..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/parser.c +++ /dev/null @@ -1,13612 +0,0 @@ -/* - * parser.c : an XML 1.0 parser, namespaces and validity support are mostly - * implemented on top of the SAX interfaces - * - * References: - * The XML specification: - * http://www.w3.org/TR/REC-xml - * Original 1.0 version: - * http://www.w3.org/TR/1998/REC-xml-19980210 - * XML second edition working draft - * http://www.w3.org/TR/2000/WD-xml-2e-20000814 - * - * Okay this is a big file, the parser core is around 7000 lines, then it - * is followed by the progressive parser top routines, then the various - * high level APIs to call the parser and a few miscellaneous functions. - * A number of helper functions and deprecated ones have been moved to - * parserInternals.c to reduce this file size. - * As much as possible the functions are associated with their relative - * production in the XML specification. A few productions defining the - * different ranges of character are actually implanted either in - * parserInternals.h or parserInternals.c - * The DOM tree build is realized from the default SAX callbacks in - * the module SAX.c. - * The routines doing the validation checks are in valid.c and called either - * from the SAX callbacks or as standalone functions using a preparsed - * document. - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#if defined(WIN32) && !defined (__CYGWIN__) -#define XML_DIR_SEP '\\' -#else -#define XML_DIR_SEP '/' -#endif - -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <libxml/xmlmemory.h> -#include <libxml/threads.h> -#include <libxml/globals.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/valid.h> -#include <libxml/entities.h> -#include <libxml/xmlerror.h> -#include <libxml/encoding.h> -#include <libxml/xmlIO.h> -#include <libxml/uri.h> -#ifdef LIBXML_CATALOG_ENABLED -#include <libxml/catalog.h> -#endif -#ifdef LIBXML_SCHEMAS_ENABLED -#include <libxml/xmlschemastypes.h> -#include <libxml/relaxng.h> -#endif -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#include "vtk_libxml2_zlib.h" - -/** - * xmlParserMaxDepth: - * - * arbitrary depth limit for the XML documents that we allow to - * process. This is not a limitation of the parser but a safety - * boundary feature. - */ -unsigned int xmlParserMaxDepth = 1024; - -#define SAX2 1 - -#define XML_PARSER_BIG_BUFFER_SIZE 300 -#define XML_PARSER_BUFFER_SIZE 100 - -#define SAX_COMPAT_MODE BAD_CAST "SAX compatibility mode document" - -/* - * List of XML prefixed PI allowed by W3C specs - */ - -static const char *xmlW3CPIs[] = { - "xml-stylesheet", - NULL -}; - - -/* DEPR void xmlParserHandleReference(xmlParserCtxtPtr ctxt); */ -xmlEntityPtr xmlParseStringPEReference(xmlParserCtxtPtr ctxt, - const xmlChar **str); - -static xmlParserErrors -xmlParseExternalEntityPrivate(xmlDocPtr doc, xmlParserCtxtPtr oldctxt, - xmlSAXHandlerPtr sax, - void *user_data, int depth, const xmlChar *URL, - const xmlChar *ID, xmlNodePtr *list); - -#ifdef LIBXML_LEGACY_ENABLED -static void -xmlAddEntityReference(xmlEntityPtr ent, xmlNodePtr firstNode, - xmlNodePtr lastNode); -#endif /* LIBXML_LEGACY_ENABLED */ - -static xmlParserErrors -xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt, - const xmlChar *string, void *user_data, xmlNodePtr *lst); - -/************************************************************************ - * * - * Some factorized error routines * - * * - ************************************************************************/ - -/** - * xmlErrAttributeDup: - * @ctxt: an XML parser context - * @prefix: the attribute prefix - * @localname: the attribute localname - * - * Handle a redefinition of attribute error - */ -static void -xmlErrAttributeDup(xmlParserCtxtPtr ctxt, const xmlChar * prefix, - const xmlChar * localname) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = XML_ERR_ATTRIBUTE_REDEFINED; - if (prefix == NULL) - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, - ctxt->errNo, XML_ERR_FATAL, NULL, 0, - (const char *) localname, NULL, NULL, 0, 0, - "Attribute %s redefined\n", localname); - else - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, - ctxt->errNo, XML_ERR_FATAL, NULL, 0, - (const char *) prefix, (const char *) localname, - NULL, 0, 0, "Attribute %s:%s redefined\n", prefix, - localname); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlFatalErr: - * @ctxt: an XML parser context - * @error: the error number - * @extra: extra information string - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info) -{ - const char *errmsg; - - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - switch (error) { - case XML_ERR_INVALID_HEX_CHARREF: - errmsg = "CharRef: invalid hexadecimal value\n"; - break; - case XML_ERR_INVALID_DEC_CHARREF: - errmsg = "CharRef: invalid decimal value\n"; - break; - case XML_ERR_INVALID_CHARREF: - errmsg = "CharRef: invalid value\n"; - break; - case XML_ERR_INTERNAL_ERROR: - errmsg = "internal error"; - break; - case XML_ERR_PEREF_AT_EOF: - errmsg = "PEReference at end of document\n"; - break; - case XML_ERR_PEREF_IN_PROLOG: - errmsg = "PEReference in prolog\n"; - break; - case XML_ERR_PEREF_IN_EPILOG: - errmsg = "PEReference in epilog\n"; - break; - case XML_ERR_PEREF_NO_NAME: - errmsg = "PEReference: no name\n"; - break; - case XML_ERR_PEREF_SEMICOL_MISSING: - errmsg = "PEReference: expecting ';'\n"; - break; - case XML_ERR_ENTITY_LOOP: - errmsg = "Detected an entity reference loop\n"; - break; - case XML_ERR_ENTITY_NOT_STARTED: - errmsg = "EntityValue: \" or ' expected\n"; - break; - case XML_ERR_ENTITY_PE_INTERNAL: - errmsg = "PEReferences forbidden in internal subset\n"; - break; - case XML_ERR_ENTITY_NOT_FINISHED: - errmsg = "EntityValue: \" or ' expected\n"; - break; - case XML_ERR_ATTRIBUTE_NOT_STARTED: - errmsg = "AttValue: \" or ' expected\n"; - break; - case XML_ERR_LT_IN_ATTRIBUTE: - errmsg = "Unescaped '<' not allowed in attributes values\n"; - break; - case XML_ERR_LITERAL_NOT_STARTED: - errmsg = "SystemLiteral \" or ' expected\n"; - break; - case XML_ERR_LITERAL_NOT_FINISHED: - errmsg = "Unfinished System or Public ID \" or ' expected\n"; - break; - case XML_ERR_MISPLACED_CDATA_END: - errmsg = "Sequence ']]>' not allowed in content\n"; - break; - case XML_ERR_URI_REQUIRED: - errmsg = "SYSTEM or PUBLIC, the URI is missing\n"; - break; - case XML_ERR_PUBID_REQUIRED: - errmsg = "PUBLIC, the Public Identifier is missing\n"; - break; - case XML_ERR_HYPHEN_IN_COMMENT: - errmsg = "Comment must not contain '--' (double-hyphen)\n"; - break; - case XML_ERR_PI_NOT_STARTED: - errmsg = "xmlParsePI : no target name\n"; - break; - case XML_ERR_RESERVED_XML_NAME: - errmsg = "Invalid PI name\n"; - break; - case XML_ERR_NOTATION_NOT_STARTED: - errmsg = "NOTATION: Name expected here\n"; - break; - case XML_ERR_NOTATION_NOT_FINISHED: - errmsg = "'>' required to close NOTATION declaration\n"; - break; - case XML_ERR_VALUE_REQUIRED: - errmsg = "Entity value required\n"; - break; - case XML_ERR_URI_FRAGMENT: - errmsg = "Fragment not allowed"; - break; - case XML_ERR_ATTLIST_NOT_STARTED: - errmsg = "'(' required to start ATTLIST enumeration\n"; - break; - case XML_ERR_NMTOKEN_REQUIRED: - errmsg = "NmToken expected in ATTLIST enumeration\n"; - break; - case XML_ERR_ATTLIST_NOT_FINISHED: - errmsg = "')' required to finish ATTLIST enumeration\n"; - break; - case XML_ERR_MIXED_NOT_STARTED: - errmsg = "MixedContentDecl : '|' or ')*' expected\n"; - break; - case XML_ERR_PCDATA_REQUIRED: - errmsg = "MixedContentDecl : '#PCDATA' expected\n"; - break; - case XML_ERR_ELEMCONTENT_NOT_STARTED: - errmsg = "ContentDecl : Name or '(' expected\n"; - break; - case XML_ERR_ELEMCONTENT_NOT_FINISHED: - errmsg = "ContentDecl : ',' '|' or ')' expected\n"; - break; - case XML_ERR_PEREF_IN_INT_SUBSET: - errmsg = - "PEReference: forbidden within markup decl in internal subset\n"; - break; - case XML_ERR_GT_REQUIRED: - errmsg = "expected '>'\n"; - break; - case XML_ERR_CONDSEC_INVALID: - errmsg = "XML conditional section '[' expected\n"; - break; - case XML_ERR_EXT_SUBSET_NOT_FINISHED: - errmsg = "Content error in the external subset\n"; - break; - case XML_ERR_CONDSEC_INVALID_KEYWORD: - errmsg = - "conditional section INCLUDE or IGNORE keyword expected\n"; - break; - case XML_ERR_CONDSEC_NOT_FINISHED: - errmsg = "XML conditional section not closed\n"; - break; - case XML_ERR_XMLDECL_NOT_STARTED: - errmsg = "Text declaration '<?xml' required\n"; - break; - case XML_ERR_XMLDECL_NOT_FINISHED: - errmsg = "parsing XML declaration: '?>' expected\n"; - break; - case XML_ERR_EXT_ENTITY_STANDALONE: - errmsg = "external parsed entities cannot be standalone\n"; - break; - case XML_ERR_ENTITYREF_SEMICOL_MISSING: - errmsg = "EntityRef: expecting ';'\n"; - break; - case XML_ERR_DOCTYPE_NOT_FINISHED: - errmsg = "DOCTYPE improperly terminated\n"; - break; - case XML_ERR_LTSLASH_REQUIRED: - errmsg = "EndTag: '</' not found\n"; - break; - case XML_ERR_EQUAL_REQUIRED: - errmsg = "expected '='\n"; - break; - case XML_ERR_STRING_NOT_CLOSED: - errmsg = "String not closed expecting \" or '\n"; - break; - case XML_ERR_STRING_NOT_STARTED: - errmsg = "String not started expecting ' or \"\n"; - break; - case XML_ERR_ENCODING_NAME: - errmsg = "Invalid XML encoding name\n"; - break; - case XML_ERR_STANDALONE_VALUE: - errmsg = "standalone accepts only 'yes' or 'no'\n"; - break; - case XML_ERR_DOCUMENT_EMPTY: - errmsg = "Document is empty\n"; - break; - case XML_ERR_DOCUMENT_END: - errmsg = "Extra content at the end of the document\n"; - break; - case XML_ERR_NOT_WELL_BALANCED: - errmsg = "chunk is not well balanced\n"; - break; - case XML_ERR_EXTRA_CONTENT: - errmsg = "extra content at the end of well balanced chunk\n"; - break; - case XML_ERR_VERSION_MISSING: - errmsg = "Malformed declaration expecting version\n"; - break; -#if 0 - case: - errmsg = "\n"; - break; -#endif - default: - errmsg = "Unregistered error message\n"; - } - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, - XML_ERR_FATAL, NULL, 0, info, NULL, NULL, 0, 0, errmsg, - info); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlFatalErrMsg: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, - XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, msg); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlWarningMsg: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @str1: extra data - * @str2: extra data - * - * Handle a warning. - */ -static void -xmlWarningMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar *str1, const xmlChar *str2) -{ - xmlStructuredErrorFunc schannel = NULL; - - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if ((ctxt != NULL) && (ctxt->sax != NULL) && - (ctxt->sax->initialized == XML_SAX2_MAGIC)) - schannel = ctxt->sax->serror; - __xmlRaiseError(schannel, - (ctxt->sax) ? ctxt->sax->warning : NULL, - ctxt->userData, - ctxt, NULL, XML_FROM_PARSER, error, - XML_ERR_WARNING, NULL, 0, - (const char *) str1, (const char *) str2, NULL, 0, 0, - msg, (const char *) str1, (const char *) str2); -} - -/** - * xmlValidityError: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @str1: extra data - * - * Handle a validity error. - */ -static void -xmlValidityError(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar *str1) -{ - xmlStructuredErrorFunc schannel = NULL; - - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) { - ctxt->errNo = error; - if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC)) - schannel = ctxt->sax->serror; - } - __xmlRaiseError(schannel, - ctxt->vctxt.error, ctxt->vctxt.userData, - ctxt, NULL, XML_FROM_DTD, error, - XML_ERR_ERROR, NULL, 0, (const char *) str1, - NULL, NULL, 0, 0, - msg, (const char *) str1); - if (ctxt != NULL) { - ctxt->valid = 0; - } -} - -/** - * xmlFatalErrMsgInt: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @val: an integer value - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -xmlFatalErrMsgInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, int val) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, - ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, - NULL, 0, NULL, NULL, NULL, val, 0, msg, val); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlFatalErrMsgStrIntStr: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @str1: an string info - * @val: an integer value - * @str2: an string info - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -xmlFatalErrMsgStrIntStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar *str1, int val, - const xmlChar *str2) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, - ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, - NULL, 0, (const char *) str1, (const char *) str2, - NULL, val, 0, msg, str1, val, str2); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlFatalErrMsgStr: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @val: a string value - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -xmlFatalErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar * val) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, - XML_FROM_PARSER, error, XML_ERR_FATAL, - NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, - val); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlErrMsgStr: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @val: a string value - * - * Handle a non fatal parser error - */ -static void -xmlErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const xmlChar * val) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, - XML_FROM_PARSER, error, XML_ERR_ERROR, - NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, - val); -} - -/** - * xmlNsErr: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the message - * @info1: extra information string - * @info2: extra information string - * - * Handle a fatal parser error, i.e. violating Well-Formedness constraints - */ -static void -xmlNsErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, - const xmlChar * info1, const xmlChar * info2, - const xmlChar * info3) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, - XML_ERR_ERROR, NULL, 0, (const char *) info1, - (const char *) info2, (const char *) info3, 0, 0, msg, - info1, info2, info3); - if (ctxt != NULL) - ctxt->nsWellFormed = 0; -} - -/************************************************************************ - * * - * Library wide options * - * * - ************************************************************************/ - -/** - * xmlHasFeature: - * @feature: the feature to be examined - * - * Examines if the library has been compiled with a given feature. - * - * Returns a non-zero value if the feature exist, otherwise zero. - * Returns zero (0) if the feature does not exist or an unknown - * unknown feature is requested, non-zero otherwise. - */ -int -xmlHasFeature(xmlFeature feature) -{ - switch (feature) { - case XML_WITH_THREAD: -#ifdef LIBXML_THREAD_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_TREE: -#ifdef LIBXML_TREE_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_OUTPUT: -#ifdef LIBXML_OUTPUT_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_PUSH: -#ifdef LIBXML_PUSH_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_READER: -#ifdef LIBXML_READER_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_PATTERN: -#ifdef LIBXML_PATTERN_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_WRITER: -#ifdef LIBXML_WRITER_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_SAX1: -#ifdef LIBXML_SAX1_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_FTP: -#ifdef LIBXML_FTP_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_HTTP: -#ifdef LIBXML_HTTP_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_VALID: -#ifdef LIBXML_VALID_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_HTML: -#ifdef LIBXML_HTML_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_LEGACY: -#ifdef LIBXML_LEGACY_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_C14N: -#ifdef LIBXML_C14N_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_CATALOG: -#ifdef LIBXML_CATALOG_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_XPATH: -#ifdef LIBXML_XPATH_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_XPTR: -#ifdef LIBXML_XPTR_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_XINCLUDE: -#ifdef LIBXML_XINCLUDE_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_ICONV: -#ifdef LIBXML_ICONV_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_ISO8859X: -#ifdef LIBXML_ISO8859X_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_UNICODE: -#ifdef LIBXML_UNICODE_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_REGEXP: -#ifdef LIBXML_REGEXP_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_AUTOMATA: -#ifdef LIBXML_AUTOMATA_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_EXPR: -#ifdef LIBXML_EXPR_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_SCHEMAS: -#ifdef LIBXML_SCHEMAS_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_SCHEMATRON: -#ifdef LIBXML_SCHEMATRON_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_MODULES: -#ifdef LIBXML_MODULES_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_DEBUG: -#ifdef LIBXML_DEBUG_ENABLED - return(1); -#else - return(0); -#endif - case XML_WITH_DEBUG_MEM: -#ifdef DEBUG_MEMORY_LOCATION - return(1); -#else - return(0); -#endif - case XML_WITH_DEBUG_RUN: -#ifdef LIBXML_DEBUG_RUNTIME - return(1); -#else - return(0); -#endif - case XML_WITH_ZLIB: -#ifdef LIBXML_ZLIB_ENABLED - return(1); -#else - return(0); -#endif - default: - break; - } - return(0); -} - -/************************************************************************ - * * - * SAX2 defaulted attributes handling * - * * - ************************************************************************/ - -/** - * xmlDetectSAX2: - * @ctxt: an XML parser context - * - * Do the SAX2 detection and specific intialization - */ -static void -xmlDetectSAX2(xmlParserCtxtPtr ctxt) { - if (ctxt == NULL) return; -#ifdef LIBXML_SAX1_ENABLED - if ((ctxt->sax) && (ctxt->sax->initialized == XML_SAX2_MAGIC) && - ((ctxt->sax->startElementNs != NULL) || - (ctxt->sax->endElementNs != NULL))) ctxt->sax2 = 1; -#else - ctxt->sax2 = 1; -#endif /* LIBXML_SAX1_ENABLED */ - - ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); - ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); - ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); - if ((ctxt->str_xml==NULL) || (ctxt->str_xmlns==NULL) || - (ctxt->str_xml_ns == NULL)) { - xmlErrMemory(ctxt, NULL); - } -} - -typedef struct _xmlDefAttrs xmlDefAttrs; -typedef xmlDefAttrs *xmlDefAttrsPtr; -struct _xmlDefAttrs { - int nbAttrs; /* number of defaulted attributes on that element */ - int maxAttrs; /* the size of the array */ - const xmlChar *values[4]; /* array of localname/prefix/values */ -}; - -/** - * xmlAddDefAttrs: - * @ctxt: an XML parser context - * @fullname: the element fullname - * @fullattr: the attribute fullname - * @value: the attribute value - * - * Add a defaulted attribute for an element - */ -static void -xmlAddDefAttrs(xmlParserCtxtPtr ctxt, - const xmlChar *fullname, - const xmlChar *fullattr, - const xmlChar *value) { - xmlDefAttrsPtr defaults; - int len; - const xmlChar *name; - const xmlChar *prefix; - - if (ctxt->attsDefault == NULL) { - ctxt->attsDefault = xmlHashCreateDict(10, ctxt->dict); - if (ctxt->attsDefault == NULL) - goto mem_error; - } - - /* - * split the element name into prefix:localname , the string found - * are within the DTD and then not associated to namespace names. - */ - name = xmlSplitQName3(fullname, &len); - if (name == NULL) { - name = xmlDictLookup(ctxt->dict, fullname, -1); - prefix = NULL; - } else { - name = xmlDictLookup(ctxt->dict, name, -1); - prefix = xmlDictLookup(ctxt->dict, fullname, len); - } - - /* - * make sure there is some storage - */ - defaults = xmlHashLookup2(ctxt->attsDefault, name, prefix); - if (defaults == NULL) { - defaults = (xmlDefAttrsPtr) xmlMalloc(sizeof(xmlDefAttrs) + - (4 * 4) * sizeof(const xmlChar *)); - if (defaults == NULL) - goto mem_error; - defaults->nbAttrs = 0; - defaults->maxAttrs = 4; - xmlHashUpdateEntry2(ctxt->attsDefault, name, prefix, defaults, NULL); - } else if (defaults->nbAttrs >= defaults->maxAttrs) { - xmlDefAttrsPtr temp; - - temp = (xmlDefAttrsPtr) xmlRealloc(defaults, sizeof(xmlDefAttrs) + - (2 * defaults->maxAttrs * 4) * sizeof(const xmlChar *)); - if (temp == NULL) - goto mem_error; - defaults = temp; - defaults->maxAttrs *= 2; - xmlHashUpdateEntry2(ctxt->attsDefault, name, prefix, defaults, NULL); - } - - /* - * Split the element name into prefix:localname , the string found - * are within the DTD and hen not associated to namespace names. - */ - name = xmlSplitQName3(fullattr, &len); - if (name == NULL) { - name = xmlDictLookup(ctxt->dict, fullattr, -1); - prefix = NULL; - } else { - name = xmlDictLookup(ctxt->dict, name, -1); - prefix = xmlDictLookup(ctxt->dict, fullattr, len); - } - - defaults->values[4 * defaults->nbAttrs] = name; - defaults->values[4 * defaults->nbAttrs + 1] = prefix; - /* intern the string and precompute the end */ - len = xmlStrlen(value); - value = xmlDictLookup(ctxt->dict, value, len); - defaults->values[4 * defaults->nbAttrs + 2] = value; - defaults->values[4 * defaults->nbAttrs + 3] = value + len; - defaults->nbAttrs++; - - return; - -mem_error: - xmlErrMemory(ctxt, NULL); - return; -} - -/** - * xmlAddSpecialAttr: - * @ctxt: an XML parser context - * @fullname: the element fullname - * @fullattr: the attribute fullname - * @type: the attribute type - * - * Register that this attribute is not CDATA - */ -static void -xmlAddSpecialAttr(xmlParserCtxtPtr ctxt, - const xmlChar *fullname, - const xmlChar *fullattr, - int type) -{ - if (ctxt->attsSpecial == NULL) { - ctxt->attsSpecial = xmlHashCreateDict(10, ctxt->dict); - if (ctxt->attsSpecial == NULL) - goto mem_error; - } - - xmlHashAddEntry2(ctxt->attsSpecial, fullname, fullattr, - (void *) (long) type); - return; - -mem_error: - xmlErrMemory(ctxt, NULL); - return; -} - -/** - * xmlCheckLanguageID: - * @lang: pointer to the string value - * - * Checks that the value conforms to the LanguageID production: - * - * NOTE: this is somewhat deprecated, those productions were removed from - * the XML Second edition. - * - * [33] LanguageID ::= Langcode ('-' Subcode)* - * [34] Langcode ::= ISO639Code | IanaCode | UserCode - * [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) - * [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ - * [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ - * [38] Subcode ::= ([a-z] | [A-Z])+ - * - * Returns 1 if correct 0 otherwise - **/ -int -xmlCheckLanguageID(const xmlChar * lang) -{ - const xmlChar *cur = lang; - - if (cur == NULL) - return (0); - if (((cur[0] == 'i') && (cur[1] == '-')) || - ((cur[0] == 'I') && (cur[1] == '-'))) { - /* - * IANA code - */ - cur += 2; - while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming */ - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - } else if (((cur[0] == 'x') && (cur[1] == '-')) || - ((cur[0] == 'X') && (cur[1] == '-'))) { - /* - * User code - */ - cur += 2; - while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming */ - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - } else if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || - ((cur[0] >= 'a') && (cur[0] <= 'z'))) { - /* - * ISO639 - */ - cur++; - if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - else - return (0); - } else - return (0); - while (cur[0] != 0) { /* non input consuming */ - if (cur[0] != '-') - return (0); - cur++; - if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - else - return (0); - while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming */ - ((cur[0] >= 'a') && (cur[0] <= 'z'))) - cur++; - } - return (1); -} - -/************************************************************************ - * * - * Parser stacks related functions and macros * - * * - ************************************************************************/ - -xmlEntityPtr xmlParseStringEntityRef(xmlParserCtxtPtr ctxt, - const xmlChar ** str); - -#ifdef SAX2 -/** - * nsPush: - * @ctxt: an XML parser context - * @prefix: the namespace prefix or NULL - * @URL: the namespace name - * - * Pushes a new parser namespace on top of the ns stack - * - * Returns -1 in case of error, -2 if the namespace should be discarded - * and the index in the stack otherwise. - */ -static int -nsPush(xmlParserCtxtPtr ctxt, const xmlChar *prefix, const xmlChar *URL) -{ - if (ctxt->options & XML_PARSE_NSCLEAN) { - int i; - for (i = 0;i < ctxt->nsNr;i += 2) { - if (ctxt->nsTab[i] == prefix) { - /* in scope */ - if (ctxt->nsTab[i + 1] == URL) - return(-2); - /* out of scope keep it */ - break; - } - } - } - if ((ctxt->nsMax == 0) || (ctxt->nsTab == NULL)) { - ctxt->nsMax = 10; - ctxt->nsNr = 0; - ctxt->nsTab = (const xmlChar **) - xmlMalloc(ctxt->nsMax * sizeof(xmlChar *)); - if (ctxt->nsTab == NULL) { - xmlErrMemory(ctxt, NULL); - ctxt->nsMax = 0; - return (-1); - } - } else if (ctxt->nsNr >= ctxt->nsMax) { - ctxt->nsMax *= 2; - ctxt->nsTab = (const xmlChar **) - xmlRealloc((char *) ctxt->nsTab, - ctxt->nsMax * sizeof(ctxt->nsTab[0])); - if (ctxt->nsTab == NULL) { - xmlErrMemory(ctxt, NULL); - ctxt->nsMax /= 2; - return (-1); - } - } - ctxt->nsTab[ctxt->nsNr++] = prefix; - ctxt->nsTab[ctxt->nsNr++] = URL; - return (ctxt->nsNr); -} -/** - * nsPop: - * @ctxt: an XML parser context - * @nr: the number to pop - * - * Pops the top @nr parser prefix/namespace from the ns stack - * - * Returns the number of namespaces removed - */ -static int -nsPop(xmlParserCtxtPtr ctxt, int nr) -{ - int i; - - if (ctxt->nsTab == NULL) return(0); - if (ctxt->nsNr < nr) { - xmlGenericError(xmlGenericErrorContext, "Pbm popping %d NS\n", nr); - nr = ctxt->nsNr; - } - if (ctxt->nsNr <= 0) - return (0); - - for (i = 0;i < nr;i++) { - ctxt->nsNr--; - ctxt->nsTab[ctxt->nsNr] = NULL; - } - return(nr); -} -#endif - -static int -xmlCtxtGrowAttrs(xmlParserCtxtPtr ctxt, int nr) { - const xmlChar **atts; - int *attallocs; - int maxatts; - - if (ctxt->atts == NULL) { - maxatts = 55; /* allow for 10 attrs by default */ - atts = (const xmlChar **) - xmlMalloc(maxatts * sizeof(xmlChar *)); - if (atts == NULL) goto mem_error; - ctxt->atts = atts; - attallocs = (int *) xmlMalloc((maxatts / 5) * sizeof(int)); - if (attallocs == NULL) goto mem_error; - ctxt->attallocs = attallocs; - ctxt->maxatts = maxatts; - } else if (nr + 5 > ctxt->maxatts) { - maxatts = (nr + 5) * 2; - atts = (const xmlChar **) xmlRealloc((void *) ctxt->atts, - maxatts * sizeof(const xmlChar *)); - if (atts == NULL) goto mem_error; - ctxt->atts = atts; - attallocs = (int *) xmlRealloc((void *) ctxt->attallocs, - (maxatts / 5) * sizeof(int)); - if (attallocs == NULL) goto mem_error; - ctxt->attallocs = attallocs; - ctxt->maxatts = maxatts; - } - return(ctxt->maxatts); -mem_error: - xmlErrMemory(ctxt, NULL); - return(-1); -} - -/** - * inputPush: - * @ctxt: an XML parser context - * @value: the parser input - * - * Pushes a new parser input on top of the input stack - * - * Returns 0 in case of error, the index in the stack otherwise - */ -int -inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value) -{ - if ((ctxt == NULL) || (value == NULL)) - return(0); - if (ctxt->inputNr >= ctxt->inputMax) { - ctxt->inputMax *= 2; - ctxt->inputTab = - (xmlParserInputPtr *) xmlRealloc(ctxt->inputTab, - ctxt->inputMax * - sizeof(ctxt->inputTab[0])); - if (ctxt->inputTab == NULL) { - xmlErrMemory(ctxt, NULL); - return (0); - } - } - ctxt->inputTab[ctxt->inputNr] = value; - ctxt->input = value; - return (ctxt->inputNr++); -} -/** - * inputPop: - * @ctxt: an XML parser context - * - * Pops the top parser input from the input stack - * - * Returns the input just removed - */ -xmlParserInputPtr -inputPop(xmlParserCtxtPtr ctxt) -{ - xmlParserInputPtr ret; - - if (ctxt == NULL) - return(NULL); - if (ctxt->inputNr <= 0) - return (NULL); - ctxt->inputNr--; - if (ctxt->inputNr > 0) - ctxt->input = ctxt->inputTab[ctxt->inputNr - 1]; - else - ctxt->input = NULL; - ret = ctxt->inputTab[ctxt->inputNr]; - ctxt->inputTab[ctxt->inputNr] = NULL; - return (ret); -} -/** - * nodePush: - * @ctxt: an XML parser context - * @value: the element node - * - * Pushes a new element node on top of the node stack - * - * Returns 0 in case of error, the index in the stack otherwise - */ -int -nodePush(xmlParserCtxtPtr ctxt, xmlNodePtr value) -{ - if (ctxt == NULL) return(0); - if (ctxt->nodeNr >= ctxt->nodeMax) { - xmlNodePtr *tmp; - - tmp = (xmlNodePtr *) xmlRealloc(ctxt->nodeTab, - ctxt->nodeMax * 2 * - sizeof(ctxt->nodeTab[0])); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - return (0); - } - ctxt->nodeTab = tmp; - ctxt->nodeMax *= 2; - } - if (((unsigned int) ctxt->nodeNr) > xmlParserMaxDepth) { - xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR, - "Excessive depth in document: change xmlParserMaxDepth = %d\n", - xmlParserMaxDepth); - ctxt->instate = XML_PARSER_EOF; - return(0); - } - ctxt->nodeTab[ctxt->nodeNr] = value; - ctxt->node = value; - return (ctxt->nodeNr++); -} -/** - * nodePop: - * @ctxt: an XML parser context - * - * Pops the top element node from the node stack - * - * Returns the node just removed - */ -xmlNodePtr -nodePop(xmlParserCtxtPtr ctxt) -{ - xmlNodePtr ret; - - if (ctxt == NULL) return(NULL); - if (ctxt->nodeNr <= 0) - return (NULL); - ctxt->nodeNr--; - if (ctxt->nodeNr > 0) - ctxt->node = ctxt->nodeTab[ctxt->nodeNr - 1]; - else - ctxt->node = NULL; - ret = ctxt->nodeTab[ctxt->nodeNr]; - ctxt->nodeTab[ctxt->nodeNr] = NULL; - return (ret); -} - -#ifdef LIBXML_PUSH_ENABLED -/** - * nameNsPush: - * @ctxt: an XML parser context - * @value: the element name - * @prefix: the element prefix - * @URI: the element namespace name - * - * Pushes a new element name/prefix/URL on top of the name stack - * - * Returns -1 in case of error, the index in the stack otherwise - */ -static int -nameNsPush(xmlParserCtxtPtr ctxt, const xmlChar * value, - const xmlChar *prefix, const xmlChar *URI, int nsNr) -{ - if (ctxt->nameNr >= ctxt->nameMax) { - const xmlChar * *tmp; - void **tmp2; - ctxt->nameMax *= 2; - tmp = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, - ctxt->nameMax * - sizeof(ctxt->nameTab[0])); - if (tmp == NULL) { - ctxt->nameMax /= 2; - goto mem_error; - } - ctxt->nameTab = tmp; - tmp2 = (void **) xmlRealloc((void * *)ctxt->pushTab, - ctxt->nameMax * 3 * - sizeof(ctxt->pushTab[0])); - if (tmp2 == NULL) { - ctxt->nameMax /= 2; - goto mem_error; - } - ctxt->pushTab = tmp2; - } - ctxt->nameTab[ctxt->nameNr] = value; - ctxt->name = value; - ctxt->pushTab[ctxt->nameNr * 3] = (void *) prefix; - ctxt->pushTab[ctxt->nameNr * 3 + 1] = (void *) URI; - ctxt->pushTab[ctxt->nameNr * 3 + 2] = (void *) (long) nsNr; - return (ctxt->nameNr++); -mem_error: - xmlErrMemory(ctxt, NULL); - return (-1); -} -/** - * nameNsPop: - * @ctxt: an XML parser context - * - * Pops the top element/prefix/URI name from the name stack - * - * Returns the name just removed - */ -static const xmlChar * -nameNsPop(xmlParserCtxtPtr ctxt) -{ - const xmlChar *ret; - - if (ctxt->nameNr <= 0) - return (NULL); - ctxt->nameNr--; - if (ctxt->nameNr > 0) - ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; - else - ctxt->name = NULL; - ret = ctxt->nameTab[ctxt->nameNr]; - ctxt->nameTab[ctxt->nameNr] = NULL; - return (ret); -} -#endif /* LIBXML_PUSH_ENABLED */ - -/** - * namePush: - * @ctxt: an XML parser context - * @value: the element name - * - * Pushes a new element name on top of the name stack - * - * Returns -1 in case of error, the index in the stack otherwise - */ -int -namePush(xmlParserCtxtPtr ctxt, const xmlChar * value) -{ - if (ctxt == NULL) return (-1); - - if (ctxt->nameNr >= ctxt->nameMax) { - const xmlChar * *tmp; - ctxt->nameMax *= 2; - tmp = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, - ctxt->nameMax * - sizeof(ctxt->nameTab[0])); - if (tmp == NULL) { - ctxt->nameMax /= 2; - goto mem_error; - } - ctxt->nameTab = tmp; - } - ctxt->nameTab[ctxt->nameNr] = value; - ctxt->name = value; - return (ctxt->nameNr++); -mem_error: - xmlErrMemory(ctxt, NULL); - return (-1); -} -/** - * namePop: - * @ctxt: an XML parser context - * - * Pops the top element name from the name stack - * - * Returns the name just removed - */ -const xmlChar * -namePop(xmlParserCtxtPtr ctxt) -{ - const xmlChar *ret; - - if ((ctxt == NULL) || (ctxt->nameNr <= 0)) - return (NULL); - ctxt->nameNr--; - if (ctxt->nameNr > 0) - ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; - else - ctxt->name = NULL; - ret = ctxt->nameTab[ctxt->nameNr]; - ctxt->nameTab[ctxt->nameNr] = NULL; - return (ret); -} - -static int spacePush(xmlParserCtxtPtr ctxt, int val) { - if (ctxt->spaceNr >= ctxt->spaceMax) { - ctxt->spaceMax *= 2; - ctxt->spaceTab = (int *) xmlRealloc(ctxt->spaceTab, - ctxt->spaceMax * sizeof(ctxt->spaceTab[0])); - if (ctxt->spaceTab == NULL) { - xmlErrMemory(ctxt, NULL); - return(0); - } - } - ctxt->spaceTab[ctxt->spaceNr] = val; - ctxt->space = &ctxt->spaceTab[ctxt->spaceNr]; - return(ctxt->spaceNr++); -} - -static int spacePop(xmlParserCtxtPtr ctxt) { - int ret; - if (ctxt->spaceNr <= 0) return(0); - ctxt->spaceNr--; - if (ctxt->spaceNr > 0) - ctxt->space = &ctxt->spaceTab[ctxt->spaceNr - 1]; - else - ctxt->space = &ctxt->spaceTab[0]; - ret = ctxt->spaceTab[ctxt->spaceNr]; - ctxt->spaceTab[ctxt->spaceNr] = -1; - return(ret); -} - -/* - * Macros for accessing the content. Those should be used only by the parser, - * and not exported. - * - * Dirty macros, i.e. one often need to make assumption on the context to - * use them - * - * CUR_PTR return the current pointer to the xmlChar to be parsed. - * To be used with extreme caution since operations consuming - * characters may move the input buffer to a different location ! - * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled - * This should be used internally by the parser - * only to compare to ASCII values otherwise it would break when - * running with UTF-8 encoding. - * RAW same as CUR but in the input buffer, bypass any token - * extraction that may have been done - * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only - * to compare on ASCII based substring. - * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined - * strings without newlines within the parser. - * NEXT1(l) Skip 1 xmlChar, and must also be used only to skip 1 non-newline ASCII - * defined char within the parser. - * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding - * - * NEXT Skip to the next character, this does the proper decoding - * in UTF-8 mode. It also pop-up unfinished entities on the fly. - * NEXTL(l) Skip the current unicode character of l xmlChars long. - * CUR_CHAR(l) returns the current unicode character (int), set l - * to the number of xmlChars used for the encoding [0-5]. - * CUR_SCHAR same but operate on a string instead of the context - * COPY_BUF copy the current unicode char to the target buffer, increment - * the index - * GROW, SHRINK handling of input buffers - */ - -#define RAW (*ctxt->input->cur) -#define CUR (*ctxt->input->cur) -#define NXT(val) ctxt->input->cur[(val)] -#define CUR_PTR ctxt->input->cur - -#define CMP4( s, c1, c2, c3, c4 ) \ - ( ((unsigned char *) s)[ 0 ] == c1 && ((unsigned char *) s)[ 1 ] == c2 && \ - ((unsigned char *) s)[ 2 ] == c3 && ((unsigned char *) s)[ 3 ] == c4 ) -#define CMP5( s, c1, c2, c3, c4, c5 ) \ - ( CMP4( s, c1, c2, c3, c4 ) && ((unsigned char *) s)[ 4 ] == c5 ) -#define CMP6( s, c1, c2, c3, c4, c5, c6 ) \ - ( CMP5( s, c1, c2, c3, c4, c5 ) && ((unsigned char *) s)[ 5 ] == c6 ) -#define CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) \ - ( CMP6( s, c1, c2, c3, c4, c5, c6 ) && ((unsigned char *) s)[ 6 ] == c7 ) -#define CMP8( s, c1, c2, c3, c4, c5, c6, c7, c8 ) \ - ( CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) && ((unsigned char *) s)[ 7 ] == c8 ) -#define CMP9( s, c1, c2, c3, c4, c5, c6, c7, c8, c9 ) \ - ( CMP8( s, c1, c2, c3, c4, c5, c6, c7, c8 ) && \ - ((unsigned char *) s)[ 8 ] == c9 ) -#define CMP10( s, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 ) \ - ( CMP9( s, c1, c2, c3, c4, c5, c6, c7, c8, c9 ) && \ - ((unsigned char *) s)[ 9 ] == c10 ) - -#define SKIP(val) do { \ - ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val); \ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ - if ((*ctxt->input->cur == 0) && \ - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ - xmlPopInput(ctxt); \ - } while (0) - -#define SKIPL(val) do { \ - int skipl; \ - for(skipl=0; skipl<val; skipl++) { \ - if (*(ctxt->input->cur) == '\n') { \ - ctxt->input->line++; ctxt->input->col = 1; \ - } else ctxt->input->col++; \ - ctxt->nbChars++; \ - ctxt->input->cur++; \ - } \ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ - if ((*ctxt->input->cur == 0) && \ - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ - xmlPopInput(ctxt); \ - } while (0) - -#define SHRINK if ((ctxt->progressive == 0) && \ - (ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ - (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ - xmlSHRINK (ctxt); - -static void xmlSHRINK (xmlParserCtxtPtr ctxt) { - xmlParserInputShrink(ctxt->input); - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - xmlPopInput(ctxt); - } - -#define GROW if ((ctxt->progressive == 0) && \ - (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ - xmlGROW (ctxt); - -static void xmlGROW (xmlParserCtxtPtr ctxt) { - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - xmlPopInput(ctxt); -} - -#define SKIP_BLANKS xmlSkipBlankChars(ctxt) - -#define NEXT xmlNextChar(ctxt) - -#define NEXT1 { \ - ctxt->input->col++; \ - ctxt->input->cur++; \ - ctxt->nbChars++; \ - if (*ctxt->input->cur == 0) \ - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \ - } - -#define NEXTL(l) do { \ - if (*(ctxt->input->cur) == '\n') { \ - ctxt->input->line++; ctxt->input->col = 1; \ - } else ctxt->input->col++; \ - ctxt->input->cur += l; \ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ - } while (0) - -#define CUR_CHAR(l) xmlCurrentChar(ctxt, &l) -#define CUR_SCHAR(s, l) xmlStringCurrentChar(ctxt, s, &l) - -#define COPY_BUF(l,b,i,v) \ - if (l == 1) b[i++] = (xmlChar) v; \ - else i += xmlCopyCharMultiByte(&b[i],v) - -/** - * xmlSkipBlankChars: - * @ctxt: the XML parser context - * - * skip all blanks character found at that point in the input streams. - * It pops up finished entities in the process if allowable at that point. - * - * Returns the number of space chars skipped - */ - -int -xmlSkipBlankChars(xmlParserCtxtPtr ctxt) { - int res = 0; - - /* - * It's Okay to use CUR/NEXT here since all the blanks are on - * the ASCII range. - */ - if ((ctxt->inputNr == 1) && (ctxt->instate != XML_PARSER_DTD)) { - const xmlChar *cur; - /* - * if we are in the document content, go really fast - */ - cur = ctxt->input->cur; - while (IS_BLANK_CH(*cur)) { - if (*cur == '\n') { - ctxt->input->line++; ctxt->input->col = 1; - } - cur++; - res++; - if (*cur == 0) { - ctxt->input->cur = cur; - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - cur = ctxt->input->cur; - } - } - ctxt->input->cur = cur; - } else { - int cur; - do { - cur = CUR; - while (IS_BLANK_CH(cur)) { /* CHECKED tstblanks.xml */ - NEXT; - cur = CUR; - res++; - } - while ((cur == 0) && (ctxt->inputNr > 1) && - (ctxt->instate != XML_PARSER_COMMENT)) { - xmlPopInput(ctxt); - cur = CUR; - } - /* - * Need to handle support of entities branching here - */ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); - } while (IS_BLANK(cur)); /* CHECKED tstblanks.xml */ - } - return(res); -} - -/************************************************************************ - * * - * Commodity functions to handle entities * - * * - ************************************************************************/ - -/** - * xmlPopInput: - * @ctxt: an XML parser context - * - * xmlPopInput: the current input pointed by ctxt->input came to an end - * pop it and return the next char. - * - * Returns the current xmlChar in the parser context - */ -xmlChar -xmlPopInput(xmlParserCtxtPtr ctxt) { - if ((ctxt == NULL) || (ctxt->inputNr <= 1)) return(0); - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "Popping input %d\n", ctxt->inputNr); - xmlFreeInputStream(inputPop(ctxt)); - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - return(xmlPopInput(ctxt)); - return(CUR); -} - -/** - * xmlPushInput: - * @ctxt: an XML parser context - * @input: an XML parser input fragment (entity, XML fragment ...). - * - * xmlPushInput: switch to a new input stream which is stacked on top - * of the previous one(s). - */ -void -xmlPushInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr input) { - if (input == NULL) return; - - if (xmlParserDebugEntities) { - if ((ctxt->input != NULL) && (ctxt->input->filename)) - xmlGenericError(xmlGenericErrorContext, - "%s(%d): ", ctxt->input->filename, - ctxt->input->line); - xmlGenericError(xmlGenericErrorContext, - "Pushing input %d : %.30s\n", ctxt->inputNr+1, input->cur); - } - inputPush(ctxt, input); - GROW; -} - -/** - * xmlParseCharRef: - * @ctxt: an XML parser context - * - * parse Reference declarations - * - * [66] CharRef ::= '&#' [0-9]+ ';' | - * '&#x' [0-9a-fA-F]+ ';' - * - * [ WFC: Legal Character ] - * Characters referred to using character references must match the - * production for Char. - * - * Returns the value parsed (as an int), 0 in case of error - */ -int -xmlParseCharRef(xmlParserCtxtPtr ctxt) { - unsigned int val = 0; - int count = 0; - unsigned int outofrange = 0; - - /* - * Using RAW/CUR/NEXT is okay since we are working on ASCII range here - */ - if ((RAW == '&') && (NXT(1) == '#') && - (NXT(2) == 'x')) { - SKIP(3); - GROW; - while (RAW != ';') { /* loop blocked by count */ - if (count++ > 20) { - count = 0; - GROW; - } - if ((RAW >= '0') && (RAW <= '9')) - val = val * 16 + (CUR - '0'); - else if ((RAW >= 'a') && (RAW <= 'f') && (count < 20)) - val = val * 16 + (CUR - 'a') + 10; - else if ((RAW >= 'A') && (RAW <= 'F') && (count < 20)) - val = val * 16 + (CUR - 'A') + 10; - else { - xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); - val = 0; - break; - } - if (val > 0x10FFFF) - outofrange = val; - - NEXT; - count++; - } - if (RAW == ';') { - /* on purpose to avoid reentrancy problems with NEXT and SKIP */ - ctxt->input->col++; - ctxt->nbChars ++; - ctxt->input->cur++; - } - } else if ((RAW == '&') && (NXT(1) == '#')) { - SKIP(2); - GROW; - while (RAW != ';') { /* loop blocked by count */ - if (count++ > 20) { - count = 0; - GROW; - } - if ((RAW >= '0') && (RAW <= '9')) - val = val * 10 + (CUR - '0'); - else { - xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); - val = 0; - break; - } - if (val > 0x10FFFF) - outofrange = val; - - NEXT; - count++; - } - if (RAW == ';') { - /* on purpose to avoid reentrancy problems with NEXT and SKIP */ - ctxt->input->col++; - ctxt->nbChars ++; - ctxt->input->cur++; - } - } else { - xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); - } - - /* - * [ WFC: Legal Character ] - * Characters referred to using character references must match the - * production for Char. - */ - if ((IS_CHAR(val) && (outofrange == 0))) { - return(val); - } else { - xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, - "xmlParseCharRef: invalid xmlChar value %d\n", - val); - } - return(0); -} - -/** - * xmlParseStringCharRef: - * @ctxt: an XML parser context - * @str: a pointer to an index in the string - * - * parse Reference declarations, variant parsing from a string rather - * than an an input flow. - * - * [66] CharRef ::= '&#' [0-9]+ ';' | - * '&#x' [0-9a-fA-F]+ ';' - * - * [ WFC: Legal Character ] - * Characters referred to using character references must match the - * production for Char. - * - * Returns the value parsed (as an int), 0 in case of error, str will be - * updated to the current value of the index - */ -static int -xmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) { - const xmlChar *ptr; - xmlChar cur; - unsigned int val = 0; - unsigned int outofrange = 0; - - if ((str == NULL) || (*str == NULL)) return(0); - ptr = *str; - cur = *ptr; - if ((cur == '&') && (ptr[1] == '#') && (ptr[2] == 'x')) { - ptr += 3; - cur = *ptr; - while (cur != ';') { /* Non input consuming loop */ - if ((cur >= '0') && (cur <= '9')) - val = val * 16 + (cur - '0'); - else if ((cur >= 'a') && (cur <= 'f')) - val = val * 16 + (cur - 'a') + 10; - else if ((cur >= 'A') && (cur <= 'F')) - val = val * 16 + (cur - 'A') + 10; - else { - xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); - val = 0; - break; - } - if (val > 0x10FFFF) - outofrange = val; - - ptr++; - cur = *ptr; - } - if (cur == ';') - ptr++; - } else if ((cur == '&') && (ptr[1] == '#')){ - ptr += 2; - cur = *ptr; - while (cur != ';') { /* Non input consuming loops */ - if ((cur >= '0') && (cur <= '9')) - val = val * 10 + (cur - '0'); - else { - xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); - val = 0; - break; - } - if (val > 0x10FFFF) - outofrange = val; - - ptr++; - cur = *ptr; - } - if (cur == ';') - ptr++; - } else { - xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); - return(0); - } - *str = ptr; - - /* - * [ WFC: Legal Character ] - * Characters referred to using character references must match the - * production for Char. - */ - if ((IS_CHAR(val) && (outofrange == 0))) { - return(val); - } else { - xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, - "xmlParseStringCharRef: invalid xmlChar value %d\n", - val); - } - return(0); -} - -/** - * xmlNewBlanksWrapperInputStream: - * @ctxt: an XML parser context - * @entity: an Entity pointer - * - * Create a new input stream for wrapping - * blanks around a PEReference - * - * Returns the new input stream or NULL - */ - -static void deallocblankswrapper (xmlChar *str) {xmlFree(str);} - -static xmlParserInputPtr -xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { - xmlParserInputPtr input; - xmlChar *buffer; - size_t length; - if (entity == NULL) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlNewBlanksWrapperInputStream entity\n"); - return(NULL); - } - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "new blanks wrapper for entity: %s\n", entity->name); - input = xmlNewInputStream(ctxt); - if (input == NULL) { - return(NULL); - } - length = xmlStrlen(entity->name) + 5; - buffer = xmlMallocAtomic(length); - if (buffer == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - buffer [0] = ' '; - buffer [1] = '%'; - buffer [length-3] = ';'; - buffer [length-2] = ' '; - buffer [length-1] = 0; - memcpy(buffer + 2, entity->name, length - 5); - input->free = deallocblankswrapper; - input->base = buffer; - input->cur = buffer; - input->length = length; - input->end = &buffer[length]; - return(input); -} - -/** - * xmlParserHandlePEReference: - * @ctxt: the parser context - * - * [69] PEReference ::= '%' Name ';' - * - * [ WFC: No Recursion ] - * A parsed entity must not contain a recursive - * reference to itself, either directly or indirectly. - * - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an internal DTD - * subset which contains no parameter entity references, or a document - * with "standalone='yes'", ... ... The declaration of a parameter - * entity must precede any reference to it... - * - * [ VC: Entity Declared ] - * In a document with an external subset or external parameter entities - * with "standalone='no'", ... ... The declaration of a parameter entity - * must precede any reference to it... - * - * [ WFC: In DTD ] - * Parameter-entity references may only appear in the DTD. - * NOTE: misleading but this is handled. - * - * A PEReference may have been detected in the current input stream - * the handling is done accordingly to - * http://www.w3.org/TR/REC-xml#entproc - * i.e. - * - Included in literal in entity values - * - Included as Parameter Entity reference within DTDs - */ -void -xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - xmlEntityPtr entity = NULL; - xmlParserInputPtr input; - - if (RAW != '%') return; - switch(ctxt->instate) { - case XML_PARSER_CDATA_SECTION: - return; - case XML_PARSER_COMMENT: - return; - case XML_PARSER_START_TAG: - return; - case XML_PARSER_END_TAG: - return; - case XML_PARSER_EOF: - xmlFatalErr(ctxt, XML_ERR_PEREF_AT_EOF, NULL); - return; - case XML_PARSER_PROLOG: - case XML_PARSER_START: - case XML_PARSER_MISC: - xmlFatalErr(ctxt, XML_ERR_PEREF_IN_PROLOG, NULL); - return; - case XML_PARSER_ENTITY_DECL: - case XML_PARSER_CONTENT: - case XML_PARSER_ATTRIBUTE_VALUE: - case XML_PARSER_PI: - case XML_PARSER_SYSTEM_LITERAL: - case XML_PARSER_PUBLIC_LITERAL: - /* we just ignore it there */ - return; - case XML_PARSER_EPILOG: - xmlFatalErr(ctxt, XML_ERR_PEREF_IN_EPILOG, NULL); - return; - case XML_PARSER_ENTITY_VALUE: - /* - * NOTE: in the case of entity values, we don't do the - * substitution here since we need the literal - * entity value to be able to save the internal - * subset of the document. - * This will be handled by xmlStringDecodeEntities - */ - return; - case XML_PARSER_DTD: - /* - * [WFC: Well-Formedness Constraint: PEs in Internal Subset] - * In the internal DTD subset, parameter-entity references - * can occur only where markup declarations can occur, not - * within markup declarations. - * In that case this is handled in xmlParseMarkupDecl - */ - if ((ctxt->external == 0) && (ctxt->inputNr == 1)) - return; - if (IS_BLANK_CH(NXT(1)) || NXT(1) == 0) - return; - break; - case XML_PARSER_IGNORE: - return; - } - - NEXT; - name = xmlParseName(ctxt); - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "PEReference: %s\n", name); - if (name == NULL) { - xmlFatalErr(ctxt, XML_ERR_PEREF_NO_NAME, NULL); - } else { - if (RAW == ';') { - NEXT; - if ((ctxt->sax != NULL) && (ctxt->sax->getParameterEntity != NULL)) - entity = ctxt->sax->getParameterEntity(ctxt->userData, name); - if (entity == NULL) { - - /* - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an - * internal DTD subset which contains no parameter entity - * references, or a document with "standalone='yes'", ... - * ... The declaration of a parameter entity must precede - * any reference to it... - */ - if ((ctxt->standalone == 1) || - ((ctxt->hasExternalSubset == 0) && - (ctxt->hasPErefs == 0))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", name); - } else { - /* - * [ VC: Entity Declared ] - * In a document with an external subset or external - * parameter entities with "standalone='no'", ... - * ... The declaration of a parameter entity must precede - * any reference to it... - */ - if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) { - xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", - name); - } else - xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", - name, NULL); - ctxt->valid = 0; - } - } else if (ctxt->input->free != deallocblankswrapper) { - input = xmlNewBlanksWrapperInputStream(ctxt, entity); - xmlPushInput(ctxt, input); - } else { - if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) || - (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) { - xmlChar start[4]; - xmlCharEncoding enc; - - /* - * handle the extra spaces added before and after - * c.f. http://www.w3.org/TR/REC-xml#as-PE - * this is done independently. - */ - input = xmlNewEntityInputStream(ctxt, entity); - xmlPushInput(ctxt, input); - - /* - * Get the 4 first bytes and decode the charset - * if enc != XML_CHAR_ENCODING_NONE - * plug some encoding conversion routines. - * Note that, since we may have some non-UTF8 - * encoding (like UTF16, bug 135229), the 'length' - * is not known, but we can calculate based upon - * the amount of data in the buffer. - */ - GROW - if ((ctxt->input->end - ctxt->input->cur)>=4) { - start[0] = RAW; - start[1] = NXT(1); - start[2] = NXT(2); - start[3] = NXT(3); - enc = xmlDetectCharEncoding(start, 4); - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - } - - if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && - (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l' )) && - (IS_BLANK_CH(NXT(5)))) { - xmlParseTextDecl(ctxt); - } - } else { - xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER, - "PEReference: %s is not a parameter entity\n", - name); - } - } - } else { - xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL); - } - } -} - -/* - * Macro used to grow the current buffer. - */ -#define growBuffer(buffer) { \ - xmlChar *tmp; \ - buffer##_size *= 2; \ - tmp = (xmlChar *) \ - xmlRealloc(buffer, buffer##_size * sizeof(xmlChar)); \ - if (tmp == NULL) goto mem_error; \ - buffer = tmp; \ -} - -/** - * xmlStringLenDecodeEntities: - * @ctxt: the parser context - * @str: the input string - * @len: the string length - * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF - * @end: an end marker xmlChar, 0 if none - * @end2: an end marker xmlChar, 0 if none - * @end3: an end marker xmlChar, 0 if none - * - * Takes a entity string content and process to do the adequate substitutions. - * - * [67] Reference ::= EntityRef | CharRef - * - * [69] PEReference ::= '%' Name ';' - * - * Returns A newly allocated string with the substitution done. The caller - * must deallocate it ! - */ -xmlChar * -xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, - int what, xmlChar end, xmlChar end2, xmlChar end3) { - xmlChar *buffer = NULL; - int buffer_size = 0; - - xmlChar *current = NULL; - const xmlChar *last; - xmlEntityPtr ent; - int c,l; - int nbchars = 0; - - if ((ctxt == NULL) || (str == NULL) || (len < 0)) - return(NULL); - last = str + len; - - if (ctxt->depth > 40) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); - return(NULL); - } - - /* - * allocate a translation buffer. - */ - buffer_size = XML_PARSER_BIG_BUFFER_SIZE; - buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); - if (buffer == NULL) goto mem_error; - - /* - * OK loop until we reach one of the ending char or a size limit. - * we are operating on already parsed values. - */ - if (str < last) - c = CUR_SCHAR(str, l); - else - c = 0; - while ((c != 0) && (c != end) && /* non input consuming loop */ - (c != end2) && (c != end3)) { - - if (c == 0) break; - if ((c == '&') && (str[1] == '#')) { - int val = xmlParseStringCharRef(ctxt, &str); - if (val != 0) { - COPY_BUF(0,buffer,nbchars,val); - } - if (nbchars > buffer_size - XML_PARSER_BUFFER_SIZE) { - growBuffer(buffer); - } - } else if ((c == '&') && (what & XML_SUBSTITUTE_REF)) { - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "String decoding Entity Reference: %.30s\n", - str); - ent = xmlParseStringEntityRef(ctxt, &str); - if ((ent != NULL) && - (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { - if (ent->content != NULL) { - COPY_BUF(0,buffer,nbchars,ent->content[0]); - if (nbchars > buffer_size - XML_PARSER_BUFFER_SIZE) { - growBuffer(buffer); - } - } else { - xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, - "predefined entity has no content\n"); - } - } else if ((ent != NULL) && (ent->content != NULL)) { - xmlChar *rep; - - ctxt->depth++; - rep = xmlStringDecodeEntities(ctxt, ent->content, what, - 0, 0, 0); - ctxt->depth--; - if (rep != NULL) { - current = rep; - while (*current != 0) { /* non input consuming loop */ - buffer[nbchars++] = *current++; - if (nbchars > - buffer_size - XML_PARSER_BUFFER_SIZE) { - growBuffer(buffer); - } - } - xmlFree(rep); - } - } else if (ent != NULL) { - int i = xmlStrlen(ent->name); - const xmlChar *cur = ent->name; - - buffer[nbchars++] = '&'; - if (nbchars > buffer_size - i - XML_PARSER_BUFFER_SIZE) { - growBuffer(buffer); - } - for (;i > 0;i--) - buffer[nbchars++] = *cur++; - buffer[nbchars++] = ';'; - } - } else if (c == '%' && (what & XML_SUBSTITUTE_PEREF)) { - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "String decoding PE Reference: %.30s\n", str); - ent = xmlParseStringPEReference(ctxt, &str); - if (ent != NULL) { - xmlChar *rep; - - ctxt->depth++; - rep = xmlStringDecodeEntities(ctxt, ent->content, what, - 0, 0, 0); - ctxt->depth--; - if (rep != NULL) { - current = rep; - while (*current != 0) { /* non input consuming loop */ - buffer[nbchars++] = *current++; - if (nbchars > - buffer_size - XML_PARSER_BUFFER_SIZE) { - growBuffer(buffer); - } - } - xmlFree(rep); - } - } - } else { - COPY_BUF(l,buffer,nbchars,c); - str += l; - if (nbchars > buffer_size - XML_PARSER_BUFFER_SIZE) { - growBuffer(buffer); - } - } - if (str < last) - c = CUR_SCHAR(str, l); - else - c = 0; - } - buffer[nbchars++] = 0; - return(buffer); - -mem_error: - xmlErrMemory(ctxt, NULL); - return(NULL); -} - -/** - * xmlStringDecodeEntities: - * @ctxt: the parser context - * @str: the input string - * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF - * @end: an end marker xmlChar, 0 if none - * @end2: an end marker xmlChar, 0 if none - * @end3: an end marker xmlChar, 0 if none - * - * Takes a entity string content and process to do the adequate substitutions. - * - * [67] Reference ::= EntityRef | CharRef - * - * [69] PEReference ::= '%' Name ';' - * - * Returns A newly allocated string with the substitution done. The caller - * must deallocate it ! - */ -xmlChar * -xmlStringDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int what, - xmlChar end, xmlChar end2, xmlChar end3) { - if ((ctxt == NULL) || (str == NULL)) return(NULL); - return(xmlStringLenDecodeEntities(ctxt, str, xmlStrlen(str), what, - end, end2, end3)); -} - -/************************************************************************ - * * - * Commodity functions, cleanup needed ? * - * * - ************************************************************************/ - -/** - * areBlanks: - * @ctxt: an XML parser context - * @str: a xmlChar * - * @len: the size of @str - * @blank_chars: we know the chars are blanks - * - * Is this a sequence of blank chars that one can ignore ? - * - * Returns 1 if ignorable 0 otherwise. - */ - -static int areBlanks(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, - int blank_chars) { - int i, ret; - xmlNodePtr lastChild; - - /* - * Don't spend time trying to differentiate them, the same callback is - * used ! - */ - if (ctxt->sax->ignorableWhitespace == ctxt->sax->characters) - return(0); - - /* - * Check for xml:space value. - */ - if ((ctxt->space == NULL) || (*(ctxt->space) == 1) || - (*(ctxt->space) == -2)) - return(0); - - /* - * Check that the string is made of blanks - */ - if (blank_chars == 0) { - for (i = 0;i < len;i++) - if (!(IS_BLANK_CH(str[i]))) return(0); - } - - /* - * Look if the element is mixed content in the DTD if available - */ - if (ctxt->node == NULL) return(0); - if (ctxt->myDoc != NULL) { - ret = xmlIsMixedElement(ctxt->myDoc, ctxt->node->name); - if (ret == 0) return(1); - if (ret == 1) return(0); - } - - /* - * Otherwise, heuristic :-\ - */ - if ((RAW != '<') && (RAW != 0xD)) return(0); - if ((ctxt->node->children == NULL) && - (RAW == '<') && (NXT(1) == '/')) return(0); - - lastChild = xmlGetLastChild(ctxt->node); - if (lastChild == NULL) { - if ((ctxt->node->type != XML_ELEMENT_NODE) && - (ctxt->node->content != NULL)) return(0); - } else if (xmlNodeIsText(lastChild)) - return(0); - else if ((ctxt->node->children != NULL) && - (xmlNodeIsText(ctxt->node->children))) - return(0); - return(1); -} - -/************************************************************************ - * * - * Extra stuff for namespace support * - * Relates to http://www.w3.org/TR/WD-xml-names * - * * - ************************************************************************/ - -/** - * xmlSplitQName: - * @ctxt: an XML parser context - * @name: an XML parser context - * @prefix: a xmlChar ** - * - * parse an UTF8 encoded XML qualified name string - * - * [NS 5] QName ::= (Prefix ':')? LocalPart - * - * [NS 6] Prefix ::= NCName - * - * [NS 7] LocalPart ::= NCName - * - * Returns the local part, and prefix is updated - * to get the Prefix if any. - */ - -xmlChar * -xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix) { - xmlChar buf[XML_MAX_NAMELEN + 5]; - xmlChar *buffer = NULL; - int len = 0; - int max = XML_MAX_NAMELEN; - xmlChar *ret = NULL; - const xmlChar *cur = name; - int c; - - if (prefix == NULL) return(NULL); - *prefix = NULL; - - if (cur == NULL) return(NULL); - -#ifndef XML_XML_NAMESPACE - /* xml: prefix is not really a namespace */ - if ((cur[0] == 'x') && (cur[1] == 'm') && - (cur[2] == 'l') && (cur[3] == ':')) - return(xmlStrdup(name)); -#endif - - /* nasty but well=formed */ - if (cur[0] == ':') - return(xmlStrdup(name)); - - c = *cur++; - while ((c != 0) && (c != ':') && (len < max)) { /* tested bigname.xml */ - buf[len++] = c; - c = *cur++; - } - if (len >= max) { - /* - * Okay someone managed to make a huge name, so he's ready to pay - * for the processing speed. - */ - max = len * 2; - - buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); - if (buffer == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - memcpy(buffer, buf, len); - while ((c != 0) && (c != ':')) { /* tested bigname.xml */ - if (len + 10 > max) { - xmlChar *tmp; - - max *= 2; - tmp = (xmlChar *) xmlRealloc(buffer, - max * sizeof(xmlChar)); - if (tmp == NULL) { - xmlFree(tmp); - xmlErrMemory(ctxt, NULL); - return(NULL); - } - buffer = tmp; - } - buffer[len++] = c; - c = *cur++; - } - buffer[len] = 0; - } - - if ((c == ':') && (*cur == 0)) { - if (buffer != NULL) - xmlFree(buffer); - *prefix = NULL; - return(xmlStrdup(name)); - } - - if (buffer == NULL) - ret = xmlStrndup(buf, len); - else { - ret = buffer; - buffer = NULL; - max = XML_MAX_NAMELEN; - } - - - if (c == ':') { - c = *cur; - *prefix = ret; - if (c == 0) { - return(xmlStrndup(BAD_CAST "", 0)); - } - len = 0; - - /* - * Check that the first character is proper to start - * a new name - */ - if (!(((c >= 0x61) && (c <= 0x7A)) || - ((c >= 0x41) && (c <= 0x5A)) || - (c == '_') || (c == ':'))) { - int l; - int first = CUR_SCHAR(cur, l); - - if (!IS_LETTER(first) && (first != '_')) { - xmlFatalErrMsgStr(ctxt, XML_NS_ERR_QNAME, - "Name %s is not XML Namespace compliant\n", - name); - } - } - cur++; - - while ((c != 0) && (len < max)) { /* tested bigname2.xml */ - buf[len++] = c; - c = *cur++; - } - if (len >= max) { - /* - * Okay someone managed to make a huge name, so he's ready to pay - * for the processing speed. - */ - max = len * 2; - - buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); - if (buffer == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - memcpy(buffer, buf, len); - while (c != 0) { /* tested bigname2.xml */ - if (len + 10 > max) { - xmlChar *tmp; - - max *= 2; - tmp = (xmlChar *) xmlRealloc(buffer, - max * sizeof(xmlChar)); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFree(buffer); - return(NULL); - } - buffer = tmp; - } - buffer[len++] = c; - c = *cur++; - } - buffer[len] = 0; - } - - if (buffer == NULL) - ret = xmlStrndup(buf, len); - else { - ret = buffer; - } - } - - return(ret); -} - -/************************************************************************ - * * - * The parser itself * - * Relates to http://www.w3.org/TR/REC-xml * - * * - ************************************************************************/ - -static const xmlChar * xmlParseNameComplex(xmlParserCtxtPtr ctxt); -static xmlChar * xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, - int *len, int *alloc, int normalize); - -/** - * xmlParseName: - * @ctxt: an XML parser context - * - * parse an XML name. - * - * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | - * CombiningChar | Extender - * - * [5] Name ::= (Letter | '_' | ':') (NameChar)* - * - * [6] Names ::= Name (#x20 Name)* - * - * Returns the Name parsed or NULL - */ - -const xmlChar * -xmlParseName(xmlParserCtxtPtr ctxt) { - const xmlChar *in; - const xmlChar *ret; - int count = 0; - - GROW; - - /* - * Accelerator for simple ASCII names - */ - in = ctxt->input->cur; - if (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - (*in == '_') || (*in == ':')) { - in++; - while (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - ((*in >= 0x30) && (*in <= 0x39)) || - (*in == '_') || (*in == '-') || - (*in == ':') || (*in == '.')) - in++; - if ((*in > 0) && (*in < 0x80)) { - count = in - ctxt->input->cur; - ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); - ctxt->input->cur = in; - ctxt->nbChars += count; - ctxt->input->col += count; - if (ret == NULL) - xmlErrMemory(ctxt, NULL); - return(ret); - } - } - return(xmlParseNameComplex(ctxt)); -} - -/** - * xmlParseNameAndCompare: - * @ctxt: an XML parser context - * - * parse an XML name and compares for match - * (specialized for endtag parsing) - * - * Returns NULL for an illegal name, (xmlChar*) 1 for success - * and the name for mismatch - */ - -static const xmlChar * -xmlParseNameAndCompare(xmlParserCtxtPtr ctxt, xmlChar const *other) { - register const xmlChar *cmp = other; - register const xmlChar *in; - const xmlChar *ret; - - GROW; - - in = ctxt->input->cur; - while (*in != 0 && *in == *cmp) { - ++in; - ++cmp; - ctxt->input->col++; - } - if (*cmp == 0 && (*in == '>' || IS_BLANK_CH (*in))) { - /* success */ - ctxt->input->cur = in; - return (const xmlChar*) 1; - } - /* failure (or end of input buffer), check with full function */ - ret = xmlParseName (ctxt); - /* strings coming from the dictionnary direct compare possible */ - if (ret == other) { - return (const xmlChar*) 1; - } - return ret; -} - -static const xmlChar * -xmlParseNameComplex(xmlParserCtxtPtr ctxt) { - int len = 0, l; - int c; - int count = 0; - - /* - * Handler for more complex cases - */ - GROW; - c = CUR_CHAR(l); - if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ - (!IS_LETTER(c) && (c != '_') && - (c != ':'))) { - return(NULL); - } - - while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ - ((IS_LETTER(c)) || (IS_DIGIT(c)) || - (c == '.') || (c == '-') || - (c == '_') || (c == ':') || - (IS_COMBINING(c)) || - (IS_EXTENDER(c)))) { - if (count++ > 100) { - count = 0; - GROW; - } - len += l; - NEXTL(l); - c = CUR_CHAR(l); - } - if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) - return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); - return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); -} - -/** - * xmlParseStringName: - * @ctxt: an XML parser context - * @str: a pointer to the string pointer (IN/OUT) - * - * parse an XML name. - * - * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | - * CombiningChar | Extender - * - * [5] Name ::= (Letter | '_' | ':') (NameChar)* - * - * [6] Names ::= Name (#x20 Name)* - * - * Returns the Name parsed or NULL. The @str pointer - * is updated to the current location in the string. - */ - -static xmlChar * -xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) { - xmlChar buf[XML_MAX_NAMELEN + 5]; - const xmlChar *cur = *str; - int len = 0, l; - int c; - - c = CUR_SCHAR(cur, l); - if (!IS_LETTER(c) && (c != '_') && - (c != ':')) { - return(NULL); - } - - while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigentname.xml */ - (c == '.') || (c == '-') || - (c == '_') || (c == ':') || - (IS_COMBINING(c)) || - (IS_EXTENDER(c))) { - COPY_BUF(l,buf,len,c); - cur += l; - c = CUR_SCHAR(cur, l); - if (len >= XML_MAX_NAMELEN) { /* test bigentname.xml */ - /* - * Okay someone managed to make a huge name, so he's ready to pay - * for the processing speed. - */ - xmlChar *buffer; - int max = len * 2; - - buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); - if (buffer == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - memcpy(buffer, buf, len); - while ((IS_LETTER(c)) || (IS_DIGIT(c)) || - /* test bigentname.xml */ - (c == '.') || (c == '-') || - (c == '_') || (c == ':') || - (IS_COMBINING(c)) || - (IS_EXTENDER(c))) { - if (len + 10 > max) { - xmlChar *tmp; - max *= 2; - tmp = (xmlChar *) xmlRealloc(buffer, - max * sizeof(xmlChar)); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFree(buffer); - return(NULL); - } - buffer = tmp; - } - COPY_BUF(l,buffer,len,c); - cur += l; - c = CUR_SCHAR(cur, l); - } - buffer[len] = 0; - *str = cur; - return(buffer); - } - } - *str = cur; - return(xmlStrndup(buf, len)); -} - -/** - * xmlParseNmtoken: - * @ctxt: an XML parser context - * - * parse an XML Nmtoken. - * - * [7] Nmtoken ::= (NameChar)+ - * - * [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* - * - * Returns the Nmtoken parsed or NULL - */ - -xmlChar * -xmlParseNmtoken(xmlParserCtxtPtr ctxt) { - xmlChar buf[XML_MAX_NAMELEN + 5]; - int len = 0, l; - int c; - int count = 0; - - GROW; - c = CUR_CHAR(l); - - while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigtoken.xml */ - (c == '.') || (c == '-') || - (c == '_') || (c == ':') || - (IS_COMBINING(c)) || - (IS_EXTENDER(c))) { - if (count++ > 100) { - count = 0; - GROW; - } - COPY_BUF(l,buf,len,c); - NEXTL(l); - c = CUR_CHAR(l); - if (len >= XML_MAX_NAMELEN) { - /* - * Okay someone managed to make a huge token, so he's ready to pay - * for the processing speed. - */ - xmlChar *buffer; - int max = len * 2; - - buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); - if (buffer == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - memcpy(buffer, buf, len); - while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigtoken.xml */ - (c == '.') || (c == '-') || - (c == '_') || (c == ':') || - (IS_COMBINING(c)) || - (IS_EXTENDER(c))) { - if (count++ > 100) { - count = 0; - GROW; - } - if (len + 10 > max) { - xmlChar *tmp; - - max *= 2; - tmp = (xmlChar *) xmlRealloc(buffer, - max * sizeof(xmlChar)); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFree(buffer); - return(NULL); - } - buffer = tmp; - } - COPY_BUF(l,buffer,len,c); - NEXTL(l); - c = CUR_CHAR(l); - } - buffer[len] = 0; - return(buffer); - } - } - if (len == 0) - return(NULL); - return(xmlStrndup(buf, len)); -} - -/** - * xmlParseEntityValue: - * @ctxt: an XML parser context - * @orig: if non-NULL store a copy of the original entity value - * - * parse a value for ENTITY declarations - * - * [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | - * "'" ([^%&'] | PEReference | Reference)* "'" - * - * Returns the EntityValue parsed with reference substituted or NULL - */ - -xmlChar * -xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) { - xmlChar *buf = NULL; - int len = 0; - int size = XML_PARSER_BUFFER_SIZE; - int c, l; - xmlChar stop; - xmlChar *ret = NULL; - const xmlChar *cur = NULL; - xmlParserInputPtr input; - - if (RAW == '"') stop = '"'; - else if (RAW == '\'') stop = '\''; - else { - xmlFatalErr(ctxt, XML_ERR_ENTITY_NOT_STARTED, NULL); - return(NULL); - } - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - - /* - * The content of the entity definition is copied in a buffer. - */ - - ctxt->instate = XML_PARSER_ENTITY_VALUE; - input = ctxt->input; - GROW; - NEXT; - c = CUR_CHAR(l); - /* - * NOTE: 4.4.5 Included in Literal - * When a parameter entity reference appears in a literal entity - * value, ... a single or double quote character in the replacement - * text is always treated as a normal data character and will not - * terminate the literal. - * In practice it means we stop the loop only when back at parsing - * the initial entity and the quote is found - */ - while ((IS_CHAR(c)) && ((c != stop) || /* checked */ - (ctxt->input != input))) { - if (len + 5 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFree(buf); - return(NULL); - } - buf = tmp; - } - COPY_BUF(l,buf,len,c); - NEXTL(l); - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) /* non input consuming */ - xmlPopInput(ctxt); - - GROW; - c = CUR_CHAR(l); - if (c == 0) { - GROW; - c = CUR_CHAR(l); - } - } - buf[len] = 0; - - /* - * Raise problem w.r.t. '&' and '%' being used in non-entities - * reference constructs. Note Charref will be handled in - * xmlStringDecodeEntities() - */ - cur = buf; - while (*cur != 0) { /* non input consuming */ - if ((*cur == '%') || ((*cur == '&') && (cur[1] != '#'))) { - xmlChar *name; - xmlChar tmp = *cur; - - cur++; - name = xmlParseStringName(ctxt, &cur); - if ((name == NULL) || (*cur != ';')) { - xmlFatalErrMsgInt(ctxt, XML_ERR_ENTITY_CHAR_ERROR, - "EntityValue: '%c' forbidden except for entities references\n", - tmp); - } - if ((tmp == '%') && (ctxt->inSubset == 1) && - (ctxt->inputNr == 1)) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_PE_INTERNAL, NULL); - } - if (name != NULL) - xmlFree(name); - if (*cur == 0) - break; - } - cur++; - } - - /* - * Then PEReference entities are substituted. - */ - if (c != stop) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, NULL); - xmlFree(buf); - } else { - NEXT; - /* - * NOTE: 4.4.7 Bypassed - * When a general entity reference appears in the EntityValue in - * an entity declaration, it is bypassed and left as is. - * so XML_SUBSTITUTE_REF is not set here. - */ - ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, - 0, 0, 0); - if (orig != NULL) - *orig = buf; - else - xmlFree(buf); - } - - return(ret); -} - -/** - * xmlParseAttValueComplex: - * @ctxt: an XML parser context - * @len: the resulting attribute len - * @normalize: wether to apply the inner normalization - * - * parse a value for an attribute, this is the fallback function - * of xmlParseAttValue() when the attribute parsing requires handling - * of non-ASCII characters, or normalization compaction. - * - * Returns the AttValue parsed or NULL. The value has to be freed by the caller. - */ -static xmlChar * -xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { - xmlChar limit = 0; - xmlChar *buf = NULL; - int len = 0; - int buf_size = 0; - int c, l, in_space = 0; - xmlChar *current = NULL; - xmlEntityPtr ent; - - if (NXT(0) == '"') { - ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; - limit = '"'; - NEXT; - } else if (NXT(0) == '\'') { - limit = '\''; - ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; - NEXT; - } else { - xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL); - return(NULL); - } - - /* - * allocate a translation buffer. - */ - buf_size = XML_PARSER_BUFFER_SIZE; - buf = (xmlChar *) xmlMallocAtomic(buf_size * sizeof(xmlChar)); - if (buf == NULL) goto mem_error; - - /* - * OK loop until we reach one of the ending char or a size limit. - */ - c = CUR_CHAR(l); - while ((NXT(0) != limit) && /* checked */ - (c != '<')) { - if (c == 0) break; - if (c == '&') { - in_space = 0; - if (NXT(1) == '#') { - int val = xmlParseCharRef(ctxt); - - if (val == '&') { - if (ctxt->replaceEntities) { - if (len > buf_size - 10) { - growBuffer(buf); - } - buf[len++] = '&'; - } else { - /* - * The reparsing will be done in xmlStringGetNodeList() - * called by the attribute() function in SAX.c - */ - if (len > buf_size - 10) { - growBuffer(buf); - } - buf[len++] = '&'; - buf[len++] = '#'; - buf[len++] = '3'; - buf[len++] = '8'; - buf[len++] = ';'; - } - } else { - if (len > buf_size - 10) { - growBuffer(buf); - } - len += xmlCopyChar(0, &buf[len], val); - } - } else { - ent = xmlParseEntityRef(ctxt); - if ((ent != NULL) && - (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { - if (len > buf_size - 10) { - growBuffer(buf); - } - if ((ctxt->replaceEntities == 0) && - (ent->content[0] == '&')) { - buf[len++] = '&'; - buf[len++] = '#'; - buf[len++] = '3'; - buf[len++] = '8'; - buf[len++] = ';'; - } else { - buf[len++] = ent->content[0]; - } - } else if ((ent != NULL) && - (ctxt->replaceEntities != 0)) { - xmlChar *rep; - - if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, - 0, 0, 0); - if (rep != NULL) { - current = rep; - while (*current != 0) { /* non input consuming */ - buf[len++] = *current++; - if (len > buf_size - 10) { - growBuffer(buf); - } - } - xmlFree(rep); - } - } else { - if (len > buf_size - 10) { - growBuffer(buf); - } - if (ent->content != NULL) - buf[len++] = ent->content[0]; - } - } else if (ent != NULL) { - int i = xmlStrlen(ent->name); - const xmlChar *cur = ent->name; - - /* - * This may look absurd but is needed to detect - * entities problems - */ - if ((ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && - (ent->content != NULL)) { - xmlChar *rep; - rep = xmlStringDecodeEntities(ctxt, ent->content, - XML_SUBSTITUTE_REF, 0, 0, 0); - if (rep != NULL) - xmlFree(rep); - } - - /* - * Just output the reference - */ - buf[len++] = '&'; - if (len > buf_size - i - 10) { - growBuffer(buf); - } - for (;i > 0;i--) - buf[len++] = *cur++; - buf[len++] = ';'; - } - } - } else { - if ((c == 0x20) || (c == 0xD) || (c == 0xA) || (c == 0x9)) { - if ((len != 0) || (!normalize)) { - if ((!normalize) || (!in_space)) { - COPY_BUF(l,buf,len,0x20); - if (len > buf_size - 10) { - growBuffer(buf); - } - } - in_space = 1; - } - } else { - in_space = 0; - COPY_BUF(l,buf,len,c); - if (len > buf_size - 10) { - growBuffer(buf); - } - } - NEXTL(l); - } - GROW; - c = CUR_CHAR(l); - } - if ((in_space) && (normalize)) { - while (buf[len - 1] == 0x20) len--; - } - buf[len] = 0; - if (RAW == '<') { - xmlFatalErr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, NULL); - } else if (RAW != limit) { - xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, - "AttValue: ' expected\n"); - } else - NEXT; - if (attlen != NULL) *attlen = len; - return(buf); - -mem_error: - xmlErrMemory(ctxt, NULL); - return(NULL); -} - -/** - * xmlParseAttValue: - * @ctxt: an XML parser context - * - * parse a value for an attribute - * Note: the parser won't do substitution of entities here, this - * will be handled later in xmlStringGetNodeList - * - * [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | - * "'" ([^<&'] | Reference)* "'" - * - * 3.3.3 Attribute-Value Normalization: - * Before the value of an attribute is passed to the application or - * checked for validity, the XML processor must normalize it as follows: - * - a character reference is processed by appending the referenced - * character to the attribute value - * - an entity reference is processed by recursively processing the - * replacement text of the entity - * - a whitespace character (#x20, #xD, #xA, #x9) is processed by - * appending #x20 to the normalized value, except that only a single - * #x20 is appended for a "#xD#xA" sequence that is part of an external - * parsed entity or the literal entity value of an internal parsed entity - * - other characters are processed by appending them to the normalized value - * If the declared value is not CDATA, then the XML processor must further - * process the normalized attribute value by discarding any leading and - * trailing space (#x20) characters, and by replacing sequences of space - * (#x20) characters by a single space (#x20) character. - * All attributes for which no declaration has been read should be treated - * by a non-validating parser as if declared CDATA. - * - * Returns the AttValue parsed or NULL. The value has to be freed by the caller. - */ - - -xmlChar * -xmlParseAttValue(xmlParserCtxtPtr ctxt) { - if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); - return(xmlParseAttValueInternal(ctxt, NULL, NULL, 0)); -} - -/** - * xmlParseSystemLiteral: - * @ctxt: an XML parser context - * - * parse an XML Literal - * - * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") - * - * Returns the SystemLiteral parsed or NULL - */ - -xmlChar * -xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int len = 0; - int size = XML_PARSER_BUFFER_SIZE; - int cur, l; - xmlChar stop; - int state = ctxt->instate; - int count = 0; - - SHRINK; - if (RAW == '"') { - NEXT; - stop = '"'; - } else if (RAW == '\'') { - NEXT; - stop = '\''; - } else { - xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, NULL); - return(NULL); - } - - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - ctxt->instate = XML_PARSER_SYSTEM_LITERAL; - cur = CUR_CHAR(l); - while ((IS_CHAR(cur)) && (cur != stop)) { /* checked */ - if (len + 5 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlFree(buf); - xmlErrMemory(ctxt, NULL); - ctxt->instate = (xmlParserInputState) state; - return(NULL); - } - buf = tmp; - } - count++; - if (count > 50) { - GROW; - count = 0; - } - COPY_BUF(l,buf,len,cur); - NEXTL(l); - cur = CUR_CHAR(l); - if (cur == 0) { - GROW; - SHRINK; - cur = CUR_CHAR(l); - } - } - buf[len] = 0; - ctxt->instate = (xmlParserInputState) state; - if (!IS_CHAR(cur)) { - xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL); - } else { - NEXT; - } - return(buf); -} - -/** - * xmlParsePubidLiteral: - * @ctxt: an XML parser context - * - * parse an XML public literal - * - * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" - * - * Returns the PubidLiteral parsed or NULL. - */ - -xmlChar * -xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int len = 0; - int size = XML_PARSER_BUFFER_SIZE; - xmlChar cur; - xmlChar stop; - int count = 0; - xmlParserInputState oldstate = ctxt->instate; - - SHRINK; - if (RAW == '"') { - NEXT; - stop = '"'; - } else if (RAW == '\'') { - NEXT; - stop = '\''; - } else { - xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, NULL); - return(NULL); - } - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - ctxt->instate = XML_PARSER_PUBLIC_LITERAL; - cur = CUR; - while ((IS_PUBIDCHAR_CH(cur)) && (cur != stop)) { /* checked */ - if (len + 1 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFree(buf); - return(NULL); - } - buf = tmp; - } - buf[len++] = cur; - count++; - if (count > 50) { - GROW; - count = 0; - } - NEXT; - cur = CUR; - if (cur == 0) { - GROW; - SHRINK; - cur = CUR; - } - } - buf[len] = 0; - if (cur != stop) { - xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL); - } else { - NEXT; - } - ctxt->instate = oldstate; - return(buf); -} - -void xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata); - -/* - * used for the test in the inner loop of the char data testing - */ -static const unsigned char test_char_data[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x9, CR/LF separated */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x00, 0x27, /* & */ - 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3A, 0x3B, 0x00, 0x3D, 0x3E, 0x3F, /* < */ - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, - 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x00, 0x5E, 0x5F, /* ] */ - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* non-ascii */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -/** - * xmlParseCharData: - * @ctxt: an XML parser context - * @cdata: int indicating whether we are within a CDATA section - * - * parse a CharData section. - * if we are within a CDATA section ']]>' marks an end of section. - * - * The right angle bracket (>) may be represented using the string ">", - * and must, for compatibility, be escaped using ">" or a character - * reference when it appears in the string "]]>" in content, when that - * string is not marking the end of a CDATA section. - * - * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) - */ - -void -xmlParseCharData(xmlParserCtxtPtr ctxt, int cdata) { - const xmlChar *in; - int nbchar = 0; - int line = ctxt->input->line; - int col = ctxt->input->col; - int ccol; - - SHRINK; - GROW; - /* - * Accelerated common case where input don't need to be - * modified before passing it to the handler. - */ - if (!cdata) { - in = ctxt->input->cur; - do { -get_more_space: - while (*in == 0x20) in++; - if (*in == 0xA) { - do { - ctxt->input->line++; ctxt->input->col = 1; - in++; - } while (*in == 0xA); - goto get_more_space; - } - if (*in == '<') { - nbchar = in - ctxt->input->cur; - if (nbchar > 0) { - const xmlChar *tmp = ctxt->input->cur; - ctxt->input->cur = in; - - if ((ctxt->sax != NULL) && - (ctxt->sax->ignorableWhitespace != - ctxt->sax->characters)) { - if (areBlanks(ctxt, tmp, nbchar, 1)) { - if (ctxt->sax->ignorableWhitespace != NULL) - ctxt->sax->ignorableWhitespace(ctxt->userData, - tmp, nbchar); - } else { - if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, - tmp, nbchar); - if (*ctxt->space == -1) - *ctxt->space = -2; - } - } else if ((ctxt->sax != NULL) && - (ctxt->sax->characters != NULL)) { - ctxt->sax->characters(ctxt->userData, - tmp, nbchar); - } - } - return; - } - -get_more: - ccol = ctxt->input->col; - while (test_char_data[*in]) { - in++; - ccol++; - } - ctxt->input->col = ccol; - if (*in == 0xA) { - do { - ctxt->input->line++; ctxt->input->col = 1; - in++; - } while (*in == 0xA); - goto get_more; - } - if (*in == ']') { - if ((in[1] == ']') && (in[2] == '>')) { - xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); - ctxt->input->cur = in; - return; - } - in++; - ctxt->input->col++; - goto get_more; - } - nbchar = in - ctxt->input->cur; - if (nbchar > 0) { - if ((ctxt->sax != NULL) && - (ctxt->sax->ignorableWhitespace != - ctxt->sax->characters) && - (IS_BLANK_CH(*ctxt->input->cur))) { - const xmlChar *tmp = ctxt->input->cur; - ctxt->input->cur = in; - - if (areBlanks(ctxt, tmp, nbchar, 0)) { - if (ctxt->sax->ignorableWhitespace != NULL) - ctxt->sax->ignorableWhitespace(ctxt->userData, - tmp, nbchar); - } else { - if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, - tmp, nbchar); - if (*ctxt->space == -1) - *ctxt->space = -2; - } - line = ctxt->input->line; - col = ctxt->input->col; - } else if (ctxt->sax != NULL) { - if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, - ctxt->input->cur, nbchar); - line = ctxt->input->line; - col = ctxt->input->col; - } - } - ctxt->input->cur = in; - if (*in == 0xD) { - in++; - if (*in == 0xA) { - ctxt->input->cur = in; - in++; - ctxt->input->line++; ctxt->input->col = 1; - continue; /* while */ - } - in--; - } - if (*in == '<') { - return; - } - if (*in == '&') { - return; - } - SHRINK; - GROW; - in = ctxt->input->cur; - } while (((*in >= 0x20) && (*in <= 0x7F)) || (*in == 0x09)); - nbchar = 0; - } - ctxt->input->line = line; - ctxt->input->col = col; - xmlParseCharDataComplex(ctxt, cdata); -} - -/** - * xmlParseCharDataComplex: - * @ctxt: an XML parser context - * @cdata: int indicating whether we are within a CDATA section - * - * parse a CharData section.this is the fallback function - * of xmlParseCharData() when the parsing requires handling - * of non-ASCII characters. - */ -void -xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata) { - xmlChar buf[XML_PARSER_BIG_BUFFER_SIZE + 5]; - int nbchar = 0; - int cur, l; - int count = 0; - - SHRINK; - GROW; - cur = CUR_CHAR(l); - while ((cur != '<') && /* checked */ - (cur != '&') && - (IS_CHAR(cur))) /* test also done in xmlCurrentChar() */ { - if ((cur == ']') && (NXT(1) == ']') && - (NXT(2) == '>')) { - if (cdata) break; - else { - xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); - } - } - COPY_BUF(l,buf,nbchar,cur); - if (nbchar >= XML_PARSER_BIG_BUFFER_SIZE) { - buf[nbchar] = 0; - - /* - * OK the segment is to be consumed as chars. - */ - if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { - if (areBlanks(ctxt, buf, nbchar, 0)) { - if (ctxt->sax->ignorableWhitespace != NULL) - ctxt->sax->ignorableWhitespace(ctxt->userData, - buf, nbchar); - } else { - if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, buf, nbchar); - if ((ctxt->sax->characters != - ctxt->sax->ignorableWhitespace) && - (*ctxt->space == -1)) - *ctxt->space = -2; - } - } - nbchar = 0; - } - count++; - if (count > 50) { - GROW; - count = 0; - } - NEXTL(l); - cur = CUR_CHAR(l); - } - if (nbchar != 0) { - buf[nbchar] = 0; - /* - * OK the segment is to be consumed as chars. - */ - if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { - if (areBlanks(ctxt, buf, nbchar, 0)) { - if (ctxt->sax->ignorableWhitespace != NULL) - ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar); - } else { - if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, buf, nbchar); - if ((ctxt->sax->characters != ctxt->sax->ignorableWhitespace) && - (*ctxt->space == -1)) - *ctxt->space = -2; - } - } - } - if ((cur != 0) && (!IS_CHAR(cur))) { - /* Generate the error and skip the offending character */ - xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, - "PCDATA invalid Char value %d\n", - cur); - NEXTL(l); - } -} - -/** - * xmlParseExternalID: - * @ctxt: an XML parser context - * @publicID: a xmlChar** receiving PubidLiteral - * @strict: indicate whether we should restrict parsing to only - * production [75], see NOTE below - * - * Parse an External ID or a Public ID - * - * NOTE: Productions [75] and [83] interact badly since [75] can generate - * 'PUBLIC' S PubidLiteral S SystemLiteral - * - * [75] ExternalID ::= 'SYSTEM' S SystemLiteral - * | 'PUBLIC' S PubidLiteral S SystemLiteral - * - * [83] PublicID ::= 'PUBLIC' S PubidLiteral - * - * Returns the function returns SystemLiteral and in the second - * case publicID receives PubidLiteral, is strict is off - * it is possible to return NULL and have publicID set. - */ - -xmlChar * -xmlParseExternalID(xmlParserCtxtPtr ctxt, xmlChar **publicID, int strict) { - xmlChar *URI = NULL; - - SHRINK; - - *publicID = NULL; - if (CMP6(CUR_PTR, 'S', 'Y', 'S', 'T', 'E', 'M')) { - SKIP(6); - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after 'SYSTEM'\n"); - } - SKIP_BLANKS; - URI = xmlParseSystemLiteral(ctxt); - if (URI == NULL) { - xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); - } - } else if (CMP6(CUR_PTR, 'P', 'U', 'B', 'L', 'I', 'C')) { - SKIP(6); - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after 'PUBLIC'\n"); - } - SKIP_BLANKS; - *publicID = xmlParsePubidLiteral(ctxt); - if (*publicID == NULL) { - xmlFatalErr(ctxt, XML_ERR_PUBID_REQUIRED, NULL); - } - if (strict) { - /* - * We don't handle [83] so "S SystemLiteral" is required. - */ - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after the Public Identifier\n"); - } - } else { - /* - * We handle [83] so we return immediately, if - * "S SystemLiteral" is not detected. From a purely parsing - * point of view that's a nice mess. - */ - const xmlChar *ptr; - GROW; - - ptr = CUR_PTR; - if (!IS_BLANK_CH(*ptr)) return(NULL); - - while (IS_BLANK_CH(*ptr)) ptr++; /* TODO: dangerous, fix ! */ - if ((*ptr != '\'') && (*ptr != '"')) return(NULL); - } - SKIP_BLANKS; - URI = xmlParseSystemLiteral(ctxt); - if (URI == NULL) { - xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); - } - } - return(URI); -} - -/** - * xmlParseCommentComplex: - * @ctxt: an XML parser context - * @buf: the already parsed part of the buffer - * @len: number of bytes filles in the buffer - * @size: allocated size of the buffer - * - * Skip an XML (SGML) comment <!-- .... --> - * The spec says that "For compatibility, the string "--" (double-hyphen) - * must not occur within comments. " - * This is the slow routine in case the accelerator for ascii didn't work - * - * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' - */ -static void -xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf, int len, int size) { - int q, ql; - int r, rl; - int cur, l; - xmlParserInputPtr input = ctxt->input; - int count = 0; - - if (buf == NULL) { - len = 0; - size = XML_PARSER_BUFFER_SIZE; - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - return; - } - } - q = CUR_CHAR(ql); - if (q == 0) - goto not_terminated; - NEXTL(ql); - r = CUR_CHAR(rl); - if (r == 0) - goto not_terminated; - NEXTL(rl); - cur = CUR_CHAR(l); - if (cur == 0) - goto not_terminated; - while (IS_CHAR(cur) && /* checked */ - ((cur != '>') || - (r != '-') || (q != '-'))) { - if ((r == '-') && (q == '-')) { - xmlFatalErr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, NULL); - } - if (len + 5 >= size) { - xmlChar *new_buf; - size *= 2; - new_buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (new_buf == NULL) { - xmlFree (buf); - xmlErrMemory(ctxt, NULL); - return; - } - buf = new_buf; - } - COPY_BUF(ql,buf,len,q); - q = r; - ql = rl; - r = cur; - rl = l; - - count++; - if (count > 50) { - GROW; - count = 0; - } - NEXTL(l); - cur = CUR_CHAR(l); - if (cur == 0) { - SHRINK; - GROW; - cur = CUR_CHAR(l); - } - } - buf[len] = 0; - if (!IS_CHAR(cur)) { - xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, - "Comment not terminated \n<!--%.50s\n", buf); - xmlFree(buf); - } else { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Comment doesn't start and stop in the same entity\n"); - } - NEXT; - if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->comment(ctxt->userData, buf); - xmlFree(buf); - } - return; -not_terminated: - xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, - "Comment not terminated\n", NULL); - xmlFree(buf); -} -/** - * xmlParseComment: - * @ctxt: an XML parser context - * - * Skip an XML (SGML) comment <!-- .... --> - * The spec says that "For compatibility, the string "--" (double-hyphen) - * must not occur within comments. " - * - * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' - */ -void -xmlParseComment(xmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int size = XML_PARSER_BUFFER_SIZE; - int len = 0; - xmlParserInputState state; - const xmlChar *in; - int nbchar = 0, ccol; - - /* - * Check that there is a comment right here. - */ - if ((RAW != '<') || (NXT(1) != '!') || - (NXT(2) != '-') || (NXT(3) != '-')) return; - - state = ctxt->instate; - ctxt->instate = XML_PARSER_COMMENT; - SKIP(4); - SHRINK; - GROW; - - /* - * Accelerated common case where input don't need to be - * modified before passing it to the handler. - */ - in = ctxt->input->cur; - do { - if (*in == 0xA) { - do { - ctxt->input->line++; ctxt->input->col = 1; - in++; - } while (*in == 0xA); - } -get_more: - ccol = ctxt->input->col; - while (((*in > '-') && (*in <= 0x7F)) || - ((*in >= 0x20) && (*in < '-')) || - (*in == 0x09)) { - in++; - ccol++; - } - ctxt->input->col = ccol; - if (*in == 0xA) { - do { - ctxt->input->line++; ctxt->input->col = 1; - in++; - } while (*in == 0xA); - goto get_more; - } - nbchar = in - ctxt->input->cur; - /* - * save current set of data - */ - if (nbchar > 0) { - if ((ctxt->sax != NULL) && - (ctxt->sax->comment != NULL)) { - if (buf == NULL) { - if ((*in == '-') && (in[1] == '-')) - size = nbchar + 1; - else - size = XML_PARSER_BUFFER_SIZE + nbchar; - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - ctxt->instate = state; - return; - } - len = 0; - } else if (len + nbchar + 1 >= size) { - xmlChar *new_buf; - size += len + nbchar + XML_PARSER_BUFFER_SIZE; - new_buf = (xmlChar *) xmlRealloc(buf, - size * sizeof(xmlChar)); - if (new_buf == NULL) { - xmlFree (buf); - xmlErrMemory(ctxt, NULL); - ctxt->instate = state; - return; - } - buf = new_buf; - } - memcpy(&buf[len], ctxt->input->cur, nbchar); - len += nbchar; - buf[len] = 0; - } - } - ctxt->input->cur = in; - if (*in == 0xA) { - in++; - ctxt->input->line++; ctxt->input->col = 1; - } - if (*in == 0xD) { - in++; - if (*in == 0xA) { - ctxt->input->cur = in; - in++; - ctxt->input->line++; ctxt->input->col = 1; - continue; /* while */ - } - in--; - } - SHRINK; - GROW; - in = ctxt->input->cur; - if (*in == '-') { - if (in[1] == '-') { - if (in[2] == '>') { - SKIP(3); - if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && - (!ctxt->disableSAX)) { - if (buf != NULL) - ctxt->sax->comment(ctxt->userData, buf); - else - ctxt->sax->comment(ctxt->userData, BAD_CAST ""); - } - if (buf != NULL) - xmlFree(buf); - ctxt->instate = state; - return; - } - if (buf != NULL) - xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, - "Comment not terminated \n<!--%.50s\n", - buf); - else - xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, - "Comment not terminated \n", NULL); - in++; - ctxt->input->col++; - } - in++; - ctxt->input->col++; - goto get_more; - } - } while (((*in >= 0x20) && (*in <= 0x7F)) || (*in == 0x09)); - xmlParseCommentComplex(ctxt, buf, len, size); - ctxt->instate = state; - return; -} - - -/** - * xmlParsePITarget: - * @ctxt: an XML parser context - * - * parse the name of a PI - * - * [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) - * - * Returns the PITarget name or NULL - */ - -const xmlChar * -xmlParsePITarget(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - - name = xmlParseName(ctxt); - if ((name != NULL) && - ((name[0] == 'x') || (name[0] == 'X')) && - ((name[1] == 'm') || (name[1] == 'M')) && - ((name[2] == 'l') || (name[2] == 'L'))) { - int i; - if ((name[0] == 'x') && (name[1] == 'm') && - (name[2] == 'l') && (name[3] == 0)) { - xmlFatalErrMsg(ctxt, XML_ERR_RESERVED_XML_NAME, - "XML declaration allowed only at the start of the document\n"); - return(name); - } else if (name[3] == 0) { - xmlFatalErr(ctxt, XML_ERR_RESERVED_XML_NAME, NULL); - return(name); - } - for (i = 0;;i++) { - if (xmlW3CPIs[i] == NULL) break; - if (xmlStrEqual(name, (const xmlChar *)xmlW3CPIs[i])) - return(name); - } - xmlWarningMsg(ctxt, XML_ERR_RESERVED_XML_NAME, - "xmlParsePITarget: invalid name prefix 'xml'\n", - NULL, NULL); - } - return(name); -} - -#ifdef LIBXML_CATALOG_ENABLED -/** - * xmlParseCatalogPI: - * @ctxt: an XML parser context - * @catalog: the PI value string - * - * parse an XML Catalog Processing Instruction. - * - * <?oasis-xml-catalog catalog="http://example.com/catalog.xml"?> - * - * Occurs only if allowed by the user and if happening in the Misc - * part of the document before any doctype informations - * This will add the given catalog to the parsing context in order - * to be used if there is a resolution need further down in the document - */ - -static void -xmlParseCatalogPI(xmlParserCtxtPtr ctxt, const xmlChar *catalog) { - xmlChar *URL = NULL; - const xmlChar *tmp, *base; - xmlChar marker; - - tmp = catalog; - while (IS_BLANK_CH(*tmp)) tmp++; - if (xmlStrncmp(tmp, BAD_CAST"catalog", 7)) - goto error; - tmp += 7; - while (IS_BLANK_CH(*tmp)) tmp++; - if (*tmp != '=') { - return; - } - tmp++; - while (IS_BLANK_CH(*tmp)) tmp++; - marker = *tmp; - if ((marker != '\'') && (marker != '"')) - goto error; - tmp++; - base = tmp; - while ((*tmp != 0) && (*tmp != marker)) tmp++; - if (*tmp == 0) - goto error; - URL = xmlStrndup(base, tmp - base); - tmp++; - while (IS_BLANK_CH(*tmp)) tmp++; - if (*tmp != 0) - goto error; - - if (URL != NULL) { - ctxt->catalogs = xmlCatalogAddLocal(ctxt->catalogs, URL); - xmlFree(URL); - } - return; - -error: - xmlWarningMsg(ctxt, XML_WAR_CATALOG_PI, - "Catalog PI syntax error: %s\n", - catalog, NULL); - if (URL != NULL) - xmlFree(URL); -} -#endif - -/** - * xmlParsePI: - * @ctxt: an XML parser context - * - * parse an XML Processing Instruction. - * - * [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' - * - * The processing is transfered to SAX once parsed. - */ - -void -xmlParsePI(xmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int len = 0; - int size = XML_PARSER_BUFFER_SIZE; - int cur, l; - const xmlChar *target; - xmlParserInputState state; - int count = 0; - - if ((RAW == '<') && (NXT(1) == '?')) { - xmlParserInputPtr input = ctxt->input; - state = ctxt->instate; - ctxt->instate = XML_PARSER_PI; - /* - * this is a Processing Instruction. - */ - SKIP(2); - SHRINK; - - /* - * Parse the target name and check for special support like - * namespace. - */ - target = xmlParsePITarget(ctxt); - if (target != NULL) { - if ((RAW == '?') && (NXT(1) == '>')) { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "PI declaration doesn't start and stop in the same entity\n"); - } - SKIP(2); - - /* - * SAX: PI detected. - */ - if ((ctxt->sax) && (!ctxt->disableSAX) && - (ctxt->sax->processingInstruction != NULL)) - ctxt->sax->processingInstruction(ctxt->userData, - target, NULL); - ctxt->instate = state; - return; - } - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - ctxt->instate = state; - return; - } - cur = CUR; - if (!IS_BLANK(cur)) { - xmlFatalErrMsgStr(ctxt, XML_ERR_SPACE_REQUIRED, - "ParsePI: PI %s space expected\n", target); - } - SKIP_BLANKS; - cur = CUR_CHAR(l); - while (IS_CHAR(cur) && /* checked */ - ((cur != '?') || (NXT(1) != '>'))) { - if (len + 5 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFree(buf); - ctxt->instate = state; - return; - } - buf = tmp; - } - count++; - if (count > 50) { - GROW; - count = 0; - } - COPY_BUF(l,buf,len,cur); - NEXTL(l); - cur = CUR_CHAR(l); - if (cur == 0) { - SHRINK; - GROW; - cur = CUR_CHAR(l); - } - } - buf[len] = 0; - if (cur != '?') { - xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED, - "ParsePI: PI %s never end ...\n", target); - } else { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "PI declaration doesn't start and stop in the same entity\n"); - } - SKIP(2); - -#ifdef LIBXML_CATALOG_ENABLED - if (((state == XML_PARSER_MISC) || - (state == XML_PARSER_START)) && - (xmlStrEqual(target, XML_CATALOG_PI))) { - xmlCatalogAllow allow = xmlCatalogGetDefaults(); - if ((allow == XML_CATA_ALLOW_DOCUMENT) || - (allow == XML_CATA_ALLOW_ALL)) - xmlParseCatalogPI(ctxt, buf); - } -#endif - - - /* - * SAX: PI detected. - */ - if ((ctxt->sax) && (!ctxt->disableSAX) && - (ctxt->sax->processingInstruction != NULL)) - ctxt->sax->processingInstruction(ctxt->userData, - target, buf); - } - xmlFree(buf); - } else { - xmlFatalErr(ctxt, XML_ERR_PI_NOT_STARTED, NULL); - } - ctxt->instate = state; - } -} - -/** - * xmlParseNotationDecl: - * @ctxt: an XML parser context - * - * parse a notation declaration - * - * [82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>' - * - * Hence there is actually 3 choices: - * 'PUBLIC' S PubidLiteral - * 'PUBLIC' S PubidLiteral S SystemLiteral - * and 'SYSTEM' S SystemLiteral - * - * See the NOTE on xmlParseExternalID(). - */ - -void -xmlParseNotationDecl(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - xmlChar *Pubid; - xmlChar *Systemid; - - if (CMP10(CUR_PTR, '<', '!', 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) { - xmlParserInputPtr input = ctxt->input; - SHRINK; - SKIP(10); - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after '<!NOTATION'\n"); - return; - } - SKIP_BLANKS; - - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_STARTED, NULL); - return; - } - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after the NOTATION name'\n"); - return; - } - SKIP_BLANKS; - - /* - * Parse the IDs. - */ - Systemid = xmlParseExternalID(ctxt, &Pubid, 0); - SKIP_BLANKS; - - if (RAW == '>') { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Notation declaration doesn't start and stop in the same entity\n"); - } - NEXT; - if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && - (ctxt->sax->notationDecl != NULL)) - ctxt->sax->notationDecl(ctxt->userData, name, Pubid, Systemid); - } else { - xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_FINISHED, NULL); - } - if (Systemid != NULL) xmlFree(Systemid); - if (Pubid != NULL) xmlFree(Pubid); - } -} - -/** - * xmlParseEntityDecl: - * @ctxt: an XML parser context - * - * parse <!ENTITY declarations - * - * [70] EntityDecl ::= GEDecl | PEDecl - * - * [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' - * - * [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' - * - * [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) - * - * [74] PEDef ::= EntityValue | ExternalID - * - * [76] NDataDecl ::= S 'NDATA' S Name - * - * [ VC: Notation Declared ] - * The Name must match the declared name of a notation. - */ - -void -xmlParseEntityDecl(xmlParserCtxtPtr ctxt) { - const xmlChar *name = NULL; - xmlChar *value = NULL; - xmlChar *URI = NULL, *literal = NULL; - const xmlChar *ndata = NULL; - int isParameter = 0; - xmlChar *orig = NULL; - int skipped; - - /* GROW; done in the caller */ - if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) { - xmlParserInputPtr input = ctxt->input; - SHRINK; - SKIP(8); - skipped = SKIP_BLANKS; - if (skipped == 0) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after '<!ENTITY'\n"); - } - - if (RAW == '%') { - NEXT; - skipped = SKIP_BLANKS; - if (skipped == 0) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after '%'\n"); - } - isParameter = 1; - } - - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParseEntityDecl: no name\n"); - return; - } - skipped = SKIP_BLANKS; - if (skipped == 0) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after the entity name\n"); - } - - ctxt->instate = XML_PARSER_ENTITY_DECL; - /* - * handle the various case of definitions... - */ - if (isParameter) { - if ((RAW == '"') || (RAW == '\'')) { - value = xmlParseEntityValue(ctxt, &orig); - if (value) { - if ((ctxt->sax != NULL) && - (!ctxt->disableSAX) && (ctxt->sax->entityDecl != NULL)) - ctxt->sax->entityDecl(ctxt->userData, name, - XML_INTERNAL_PARAMETER_ENTITY, - NULL, NULL, value); - } - } else { - URI = xmlParseExternalID(ctxt, &literal, 1); - if ((URI == NULL) && (literal == NULL)) { - xmlFatalErr(ctxt, XML_ERR_VALUE_REQUIRED, NULL); - } - if (URI) { - xmlURIPtr uri; - - uri = xmlParseURI((const char *) URI); - if (uri == NULL) { - xmlErrMsgStr(ctxt, XML_ERR_INVALID_URI, - "Invalid URI: %s\n", URI); - /* - * This really ought to be a well formedness error - * but the XML Core WG decided otherwise c.f. issue - * E26 of the XML erratas. - */ - } else { - if (uri->fragment != NULL) { - /* - * Okay this is foolish to block those but not - * invalid URIs. - */ - xmlFatalErr(ctxt, XML_ERR_URI_FRAGMENT, NULL); - } else { - if ((ctxt->sax != NULL) && - (!ctxt->disableSAX) && - (ctxt->sax->entityDecl != NULL)) - ctxt->sax->entityDecl(ctxt->userData, name, - XML_EXTERNAL_PARAMETER_ENTITY, - literal, URI, NULL); - } - xmlFreeURI(uri); - } - } - } - } else { - if ((RAW == '"') || (RAW == '\'')) { - value = xmlParseEntityValue(ctxt, &orig); - if ((ctxt->sax != NULL) && - (!ctxt->disableSAX) && (ctxt->sax->entityDecl != NULL)) - ctxt->sax->entityDecl(ctxt->userData, name, - XML_INTERNAL_GENERAL_ENTITY, - NULL, NULL, value); - /* - * For expat compatibility in SAX mode. - */ - if ((ctxt->myDoc == NULL) || - (xmlStrEqual(ctxt->myDoc->version, SAX_COMPAT_MODE))) { - if (ctxt->myDoc == NULL) { - ctxt->myDoc = xmlNewDoc(SAX_COMPAT_MODE); - } - if (ctxt->myDoc->intSubset == NULL) - ctxt->myDoc->intSubset = xmlNewDtd(ctxt->myDoc, - BAD_CAST "fake", NULL, NULL); - - xmlSAX2EntityDecl(ctxt, name, XML_INTERNAL_GENERAL_ENTITY, - NULL, NULL, value); - } - } else { - URI = xmlParseExternalID(ctxt, &literal, 1); - if ((URI == NULL) && (literal == NULL)) { - xmlFatalErr(ctxt, XML_ERR_VALUE_REQUIRED, NULL); - } - if (URI) { - xmlURIPtr uri; - - uri = xmlParseURI((const char *)URI); - if (uri == NULL) { - xmlErrMsgStr(ctxt, XML_ERR_INVALID_URI, - "Invalid URI: %s\n", URI); - /* - * This really ought to be a well formedness error - * but the XML Core WG decided otherwise c.f. issue - * E26 of the XML erratas. - */ - } else { - if (uri->fragment != NULL) { - /* - * Okay this is foolish to block those but not - * invalid URIs. - */ - xmlFatalErr(ctxt, XML_ERR_URI_FRAGMENT, NULL); - } - xmlFreeURI(uri); - } - } - if ((RAW != '>') && (!IS_BLANK_CH(CUR))) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required before 'NDATA'\n"); - } - SKIP_BLANKS; - if (CMP5(CUR_PTR, 'N', 'D', 'A', 'T', 'A')) { - SKIP(5); - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after 'NDATA'\n"); - } - SKIP_BLANKS; - ndata = xmlParseName(ctxt); - if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && - (ctxt->sax->unparsedEntityDecl != NULL)) - ctxt->sax->unparsedEntityDecl(ctxt->userData, name, - literal, URI, ndata); - } else { - if ((ctxt->sax != NULL) && - (!ctxt->disableSAX) && (ctxt->sax->entityDecl != NULL)) - ctxt->sax->entityDecl(ctxt->userData, name, - XML_EXTERNAL_GENERAL_PARSED_ENTITY, - literal, URI, NULL); - /* - * For expat compatibility in SAX mode. - * assuming the entity repalcement was asked for - */ - if ((ctxt->replaceEntities != 0) && - ((ctxt->myDoc == NULL) || - (xmlStrEqual(ctxt->myDoc->version, SAX_COMPAT_MODE)))) { - if (ctxt->myDoc == NULL) { - ctxt->myDoc = xmlNewDoc(SAX_COMPAT_MODE); - } - - if (ctxt->myDoc->intSubset == NULL) - ctxt->myDoc->intSubset = xmlNewDtd(ctxt->myDoc, - BAD_CAST "fake", NULL, NULL); - xmlSAX2EntityDecl(ctxt, name, - XML_EXTERNAL_GENERAL_PARSED_ENTITY, - literal, URI, NULL); - } - } - } - } - SKIP_BLANKS; - if (RAW != '>') { - xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, - "xmlParseEntityDecl: entity %s not terminated\n", name); - } else { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Entity declaration doesn't start and stop in the same entity\n"); - } - NEXT; - } - if (orig != NULL) { - /* - * Ugly mechanism to save the raw entity value. - */ - xmlEntityPtr cur = NULL; - - if (isParameter) { - if ((ctxt->sax != NULL) && - (ctxt->sax->getParameterEntity != NULL)) - cur = ctxt->sax->getParameterEntity(ctxt->userData, name); - } else { - if ((ctxt->sax != NULL) && - (ctxt->sax->getEntity != NULL)) - cur = ctxt->sax->getEntity(ctxt->userData, name); - if ((cur == NULL) && (ctxt->userData==ctxt)) { - cur = xmlSAX2GetEntity(ctxt, name); - } - } - if (cur != NULL) { - if (cur->orig != NULL) - xmlFree(orig); - else - cur->orig = orig; - } else - xmlFree(orig); - } - if (value != NULL) xmlFree(value); - if (URI != NULL) xmlFree(URI); - if (literal != NULL) xmlFree(literal); - } -} - -/** - * xmlParseDefaultDecl: - * @ctxt: an XML parser context - * @value: Receive a possible fixed default value for the attribute - * - * Parse an attribute default declaration - * - * [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) - * - * [ VC: Required Attribute ] - * if the default declaration is the keyword #REQUIRED, then the - * attribute must be specified for all elements of the type in the - * attribute-list declaration. - * - * [ VC: Attribute Default Legal ] - * The declared default value must meet the lexical constraints of - * the declared attribute type c.f. xmlValidateAttributeDecl() - * - * [ VC: Fixed Attribute Default ] - * if an attribute has a default value declared with the #FIXED - * keyword, instances of that attribute must match the default value. - * - * [ WFC: No < in Attribute Values ] - * handled in xmlParseAttValue() - * - * returns: XML_ATTRIBUTE_NONE, XML_ATTRIBUTE_REQUIRED, XML_ATTRIBUTE_IMPLIED - * or XML_ATTRIBUTE_FIXED. - */ - -int -xmlParseDefaultDecl(xmlParserCtxtPtr ctxt, xmlChar **value) { - int val; - xmlChar *ret; - - *value = NULL; - if (CMP9(CUR_PTR, '#', 'R', 'E', 'Q', 'U', 'I', 'R', 'E', 'D')) { - SKIP(9); - return(XML_ATTRIBUTE_REQUIRED); - } - if (CMP8(CUR_PTR, '#', 'I', 'M', 'P', 'L', 'I', 'E', 'D')) { - SKIP(8); - return(XML_ATTRIBUTE_IMPLIED); - } - val = XML_ATTRIBUTE_NONE; - if (CMP6(CUR_PTR, '#', 'F', 'I', 'X', 'E', 'D')) { - SKIP(6); - val = XML_ATTRIBUTE_FIXED; - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after '#FIXED'\n"); - } - SKIP_BLANKS; - } - ret = xmlParseAttValue(ctxt); - ctxt->instate = XML_PARSER_DTD; - if (ret == NULL) { - xmlFatalErrMsg(ctxt, (xmlParserErrors)ctxt->errNo, - "Attribute default value declaration error\n"); - } else - *value = ret; - return(val); -} - -/** - * xmlParseNotationType: - * @ctxt: an XML parser context - * - * parse an Notation attribute type. - * - * Note: the leading 'NOTATION' S part has already being parsed... - * - * [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' - * - * [ VC: Notation Attributes ] - * Values of this type must match one of the notation names included - * in the declaration; all notation names in the declaration must be declared. - * - * Returns: the notation attribute tree built while parsing - */ - -xmlEnumerationPtr -xmlParseNotationType(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - xmlEnumerationPtr ret = NULL, last = NULL, cur; - - if (RAW != '(') { - xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_STARTED, NULL); - return(NULL); - } - SHRINK; - do { - NEXT; - SKIP_BLANKS; - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "Name expected in NOTATION declaration\n"); - return(ret); - } - cur = xmlCreateEnumeration(name); - if (cur == NULL) return(ret); - if (last == NULL) ret = last = cur; - else { - last->next = cur; - last = cur; - } - SKIP_BLANKS; - } while (RAW == '|'); - if (RAW != ')') { - xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_FINISHED, NULL); - if ((last != NULL) && (last != ret)) - xmlFreeEnumeration(last); - return(ret); - } - NEXT; - return(ret); -} - -/** - * xmlParseEnumerationType: - * @ctxt: an XML parser context - * - * parse an Enumeration attribute type. - * - * [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' - * - * [ VC: Enumeration ] - * Values of this type must match one of the Nmtoken tokens in - * the declaration - * - * Returns: the enumeration attribute tree built while parsing - */ - -xmlEnumerationPtr -xmlParseEnumerationType(xmlParserCtxtPtr ctxt) { - xmlChar *name; - xmlEnumerationPtr ret = NULL, last = NULL, cur; - - if (RAW != '(') { - xmlFatalErr(ctxt, XML_ERR_ATTLIST_NOT_STARTED, NULL); - return(NULL); - } - SHRINK; - do { - NEXT; - SKIP_BLANKS; - name = xmlParseNmtoken(ctxt); - if (name == NULL) { - xmlFatalErr(ctxt, XML_ERR_NMTOKEN_REQUIRED, NULL); - return(ret); - } - cur = xmlCreateEnumeration(name); - xmlFree(name); - if (cur == NULL) return(ret); - if (last == NULL) ret = last = cur; - else { - last->next = cur; - last = cur; - } - SKIP_BLANKS; - } while (RAW == '|'); - if (RAW != ')') { - xmlFatalErr(ctxt, XML_ERR_ATTLIST_NOT_FINISHED, NULL); - return(ret); - } - NEXT; - return(ret); -} - -/** - * xmlParseEnumeratedType: - * @ctxt: an XML parser context - * @tree: the enumeration tree built while parsing - * - * parse an Enumerated attribute type. - * - * [57] EnumeratedType ::= NotationType | Enumeration - * - * [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' - * - * - * Returns: XML_ATTRIBUTE_ENUMERATION or XML_ATTRIBUTE_NOTATION - */ - -int -xmlParseEnumeratedType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) { - if (CMP8(CUR_PTR, 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) { - SKIP(8); - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after 'NOTATION'\n"); - return(0); - } - SKIP_BLANKS; - *tree = xmlParseNotationType(ctxt); - if (*tree == NULL) return(0); - return(XML_ATTRIBUTE_NOTATION); - } - *tree = xmlParseEnumerationType(ctxt); - if (*tree == NULL) return(0); - return(XML_ATTRIBUTE_ENUMERATION); -} - -/** - * xmlParseAttributeType: - * @ctxt: an XML parser context - * @tree: the enumeration tree built while parsing - * - * parse the Attribute list def for an element - * - * [54] AttType ::= StringType | TokenizedType | EnumeratedType - * - * [55] StringType ::= 'CDATA' - * - * [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | - * 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' - * - * Validity constraints for attribute values syntax are checked in - * xmlValidateAttributeValue() - * - * [ VC: ID ] - * Values of type ID must match the Name production. A name must not - * appear more than once in an XML document as a value of this type; - * i.e., ID values must uniquely identify the elements which bear them. - * - * [ VC: One ID per Element Type ] - * No element type may have more than one ID attribute specified. - * - * [ VC: ID Attribute Default ] - * An ID attribute must have a declared default of #IMPLIED or #REQUIRED. - * - * [ VC: IDREF ] - * Values of type IDREF must match the Name production, and values - * of type IDREFS must match Names; each IDREF Name must match the value - * of an ID attribute on some element in the XML document; i.e. IDREF - * values must match the value of some ID attribute. - * - * [ VC: Entity Name ] - * Values of type ENTITY must match the Name production, values - * of type ENTITIES must match Names; each Entity Name must match the - * name of an unparsed entity declared in the DTD. - * - * [ VC: Name Token ] - * Values of type NMTOKEN must match the Nmtoken production; values - * of type NMTOKENS must match Nmtokens. - * - * Returns the attribute type - */ -int -xmlParseAttributeType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) { - SHRINK; - if (CMP5(CUR_PTR, 'C', 'D', 'A', 'T', 'A')) { - SKIP(5); - return(XML_ATTRIBUTE_CDATA); - } else if (CMP6(CUR_PTR, 'I', 'D', 'R', 'E', 'F', 'S')) { - SKIP(6); - return(XML_ATTRIBUTE_IDREFS); - } else if (CMP5(CUR_PTR, 'I', 'D', 'R', 'E', 'F')) { - SKIP(5); - return(XML_ATTRIBUTE_IDREF); - } else if ((RAW == 'I') && (NXT(1) == 'D')) { - SKIP(2); - return(XML_ATTRIBUTE_ID); - } else if (CMP6(CUR_PTR, 'E', 'N', 'T', 'I', 'T', 'Y')) { - SKIP(6); - return(XML_ATTRIBUTE_ENTITY); - } else if (CMP8(CUR_PTR, 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S')) { - SKIP(8); - return(XML_ATTRIBUTE_ENTITIES); - } else if (CMP8(CUR_PTR, 'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S')) { - SKIP(8); - return(XML_ATTRIBUTE_NMTOKENS); - } else if (CMP7(CUR_PTR, 'N', 'M', 'T', 'O', 'K', 'E', 'N')) { - SKIP(7); - return(XML_ATTRIBUTE_NMTOKEN); - } - return(xmlParseEnumeratedType(ctxt, tree)); -} - -/** - * xmlParseAttributeListDecl: - * @ctxt: an XML parser context - * - * : parse the Attribute list def for an element - * - * [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>' - * - * [53] AttDef ::= S Name S AttType S DefaultDecl - * - */ -void -xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt) { - const xmlChar *elemName; - const xmlChar *attrName; - xmlEnumerationPtr tree; - - if (CMP9(CUR_PTR, '<', '!', 'A', 'T', 'T', 'L', 'I', 'S', 'T')) { - xmlParserInputPtr input = ctxt->input; - - SKIP(9); - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after '<!ATTLIST'\n"); - } - SKIP_BLANKS; - elemName = xmlParseName(ctxt); - if (elemName == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "ATTLIST: no name for Element\n"); - return; - } - SKIP_BLANKS; - GROW; - while (RAW != '>') { - const xmlChar *check = CUR_PTR; - int type; - int def; - xmlChar *defaultValue = NULL; - - GROW; - tree = NULL; - attrName = xmlParseName(ctxt); - if (attrName == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "ATTLIST: no name for Attribute\n"); - break; - } - GROW; - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after the attribute name\n"); - break; - } - SKIP_BLANKS; - - type = xmlParseAttributeType(ctxt, &tree); - if (type <= 0) { - break; - } - - GROW; - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after the attribute type\n"); - if (tree != NULL) - xmlFreeEnumeration(tree); - break; - } - SKIP_BLANKS; - - def = xmlParseDefaultDecl(ctxt, &defaultValue); - if (def <= 0) { - if (defaultValue != NULL) - xmlFree(defaultValue); - if (tree != NULL) - xmlFreeEnumeration(tree); - break; - } - - GROW; - if (RAW != '>') { - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after the attribute default value\n"); - if (defaultValue != NULL) - xmlFree(defaultValue); - if (tree != NULL) - xmlFreeEnumeration(tree); - break; - } - SKIP_BLANKS; - } - if (check == CUR_PTR) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, - "in xmlParseAttributeListDecl\n"); - if (defaultValue != NULL) - xmlFree(defaultValue); - if (tree != NULL) - xmlFreeEnumeration(tree); - break; - } - if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && - (ctxt->sax->attributeDecl != NULL)) - ctxt->sax->attributeDecl(ctxt->userData, elemName, attrName, - type, def, defaultValue, tree); - else if (tree != NULL) - xmlFreeEnumeration(tree); - - if ((ctxt->sax2) && (defaultValue != NULL) && - (def != XML_ATTRIBUTE_IMPLIED) && - (def != XML_ATTRIBUTE_REQUIRED)) { - xmlAddDefAttrs(ctxt, elemName, attrName, defaultValue); - } - if ((ctxt->sax2) && (type != XML_ATTRIBUTE_CDATA)) { - xmlAddSpecialAttr(ctxt, elemName, attrName, type); - } - if (defaultValue != NULL) - xmlFree(defaultValue); - GROW; - } - if (RAW == '>') { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Attribute list declaration doesn't start and stop in the same entity\n"); - } - NEXT; - } - } -} - -/** - * xmlParseElementMixedContentDecl: - * @ctxt: an XML parser context - * @inputchk: the input used for the current entity, needed for boundary checks - * - * parse the declaration for a Mixed Element content - * The leading '(' and spaces have been skipped in xmlParseElementContentDecl - * - * [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | - * '(' S? '#PCDATA' S? ')' - * - * [ VC: Proper Group/PE Nesting ] applies to [51] too (see [49]) - * - * [ VC: No Duplicate Types ] - * The same name must not appear more than once in a single - * mixed-content declaration. - * - * returns: the list of the xmlElementContentPtr describing the element choices - */ -xmlElementContentPtr -xmlParseElementMixedContentDecl(xmlParserCtxtPtr ctxt, int inputchk) { - xmlElementContentPtr ret = NULL, cur = NULL, n; - const xmlChar *elem = NULL; - - GROW; - if (CMP7(CUR_PTR, '#', 'P', 'C', 'D', 'A', 'T', 'A')) { - SKIP(7); - SKIP_BLANKS; - SHRINK; - if (RAW == ')') { - if ((ctxt->validate) && (ctxt->input->id != inputchk)) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, -"Element content declaration doesn't start and stop in the same entity\n", - NULL); - } - NEXT; - ret = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_PCDATA); - if (RAW == '*') { - ret->ocur = XML_ELEMENT_CONTENT_MULT; - NEXT; - } - return(ret); - } - if ((RAW == '(') || (RAW == '|')) { - ret = cur = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_PCDATA); - if (ret == NULL) return(NULL); - } - while (RAW == '|') { - NEXT; - if (elem == NULL) { - ret = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_OR); - if (ret == NULL) return(NULL); - ret->c1 = cur; - if (cur != NULL) - cur->parent = ret; - cur = ret; - } else { - n = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_OR); - if (n == NULL) return(NULL); - n->c1 = xmlNewDocElementContent(ctxt->myDoc, elem, XML_ELEMENT_CONTENT_ELEMENT); - if (n->c1 != NULL) - n->c1->parent = n; - cur->c2 = n; - if (n != NULL) - n->parent = cur; - cur = n; - } - SKIP_BLANKS; - elem = xmlParseName(ctxt); - if (elem == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParseElementMixedContentDecl : Name expected\n"); - xmlFreeDocElementContent(ctxt->myDoc, cur); - return(NULL); - } - SKIP_BLANKS; - GROW; - } - if ((RAW == ')') && (NXT(1) == '*')) { - if (elem != NULL) { - cur->c2 = xmlNewDocElementContent(ctxt->myDoc, elem, - XML_ELEMENT_CONTENT_ELEMENT); - if (cur->c2 != NULL) - cur->c2->parent = cur; - } - ret->ocur = XML_ELEMENT_CONTENT_MULT; - if ((ctxt->validate) && (ctxt->input->id != inputchk)) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, -"Element content declaration doesn't start and stop in the same entity\n", - NULL); - } - SKIP(2); - } else { - xmlFreeDocElementContent(ctxt->myDoc, ret); - xmlFatalErr(ctxt, XML_ERR_MIXED_NOT_STARTED, NULL); - return(NULL); - } - - } else { - xmlFatalErr(ctxt, XML_ERR_PCDATA_REQUIRED, NULL); - } - return(ret); -} - -/** - * xmlParseElementChildrenContentDecl: - * @ctxt: an XML parser context - * @inputchk: the input used for the current entity, needed for boundary checks - * - * parse the declaration for a Mixed Element content - * The leading '(' and spaces have been skipped in xmlParseElementContentDecl - * - * - * [47] children ::= (choice | seq) ('?' | '*' | '+')? - * - * [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? - * - * [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' - * - * [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' - * - * [ VC: Proper Group/PE Nesting ] applies to [49] and [50] - * TODO Parameter-entity replacement text must be properly nested - * with parenthesized groups. That is to say, if either of the - * opening or closing parentheses in a choice, seq, or Mixed - * construct is contained in the replacement text for a parameter - * entity, both must be contained in the same replacement text. For - * interoperability, if a parameter-entity reference appears in a - * choice, seq, or Mixed construct, its replacement text should not - * be empty, and neither the first nor last non-blank character of - * the replacement text should be a connector (| or ,). - * - * Returns the tree of xmlElementContentPtr describing the element - * hierarchy. - */ -xmlElementContentPtr -xmlParseElementChildrenContentDecl (xmlParserCtxtPtr ctxt, int inputchk) { - xmlElementContentPtr ret = NULL, cur = NULL, last = NULL, op = NULL; - const xmlChar *elem; - xmlChar type = 0; - - SKIP_BLANKS; - GROW; - if (RAW == '(') { - int inputid = ctxt->input->id; - - /* Recurse on first child */ - NEXT; - SKIP_BLANKS; - cur = ret = xmlParseElementChildrenContentDecl(ctxt, inputid); - SKIP_BLANKS; - GROW; - } else { - elem = xmlParseName(ctxt); - if (elem == NULL) { - xmlFatalErr(ctxt, XML_ERR_ELEMCONTENT_NOT_STARTED, NULL); - return(NULL); - } - cur = ret = xmlNewDocElementContent(ctxt->myDoc, elem, XML_ELEMENT_CONTENT_ELEMENT); - if (cur == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - GROW; - if (RAW == '?') { - cur->ocur = XML_ELEMENT_CONTENT_OPT; - NEXT; - } else if (RAW == '*') { - cur->ocur = XML_ELEMENT_CONTENT_MULT; - NEXT; - } else if (RAW == '+') { - cur->ocur = XML_ELEMENT_CONTENT_PLUS; - NEXT; - } else { - cur->ocur = XML_ELEMENT_CONTENT_ONCE; - } - GROW; - } - SKIP_BLANKS; - SHRINK; - while (RAW != ')') { - /* - * Each loop we parse one separator and one element. - */ - if (RAW == ',') { - if (type == 0) type = CUR; - - /* - * Detect "Name | Name , Name" error - */ - else if (type != CUR) { - xmlFatalErrMsgInt(ctxt, XML_ERR_SEPARATOR_REQUIRED, - "xmlParseElementChildrenContentDecl : '%c' expected\n", - type); - if ((last != NULL) && (last != ret)) - xmlFreeDocElementContent(ctxt->myDoc, last); - if (ret != NULL) - xmlFreeDocElementContent(ctxt->myDoc, ret); - return(NULL); - } - NEXT; - - op = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_SEQ); - if (op == NULL) { - if ((last != NULL) && (last != ret)) - xmlFreeDocElementContent(ctxt->myDoc, last); - xmlFreeDocElementContent(ctxt->myDoc, ret); - return(NULL); - } - if (last == NULL) { - op->c1 = ret; - if (ret != NULL) - ret->parent = op; - ret = cur = op; - } else { - cur->c2 = op; - if (op != NULL) - op->parent = cur; - op->c1 = last; - if (last != NULL) - last->parent = op; - cur =op; - last = NULL; - } - } else if (RAW == '|') { - if (type == 0) type = CUR; - - /* - * Detect "Name , Name | Name" error - */ - else if (type != CUR) { - xmlFatalErrMsgInt(ctxt, XML_ERR_SEPARATOR_REQUIRED, - "xmlParseElementChildrenContentDecl : '%c' expected\n", - type); - if ((last != NULL) && (last != ret)) - xmlFreeDocElementContent(ctxt->myDoc, last); - if (ret != NULL) - xmlFreeDocElementContent(ctxt->myDoc, ret); - return(NULL); - } - NEXT; - - op = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_OR); - if (op == NULL) { - if ((last != NULL) && (last != ret)) - xmlFreeDocElementContent(ctxt->myDoc, last); - if (ret != NULL) - xmlFreeDocElementContent(ctxt->myDoc, ret); - return(NULL); - } - if (last == NULL) { - op->c1 = ret; - if (ret != NULL) - ret->parent = op; - ret = cur = op; - } else { - cur->c2 = op; - if (op != NULL) - op->parent = cur; - op->c1 = last; - if (last != NULL) - last->parent = op; - cur =op; - last = NULL; - } - } else { - xmlFatalErr(ctxt, XML_ERR_ELEMCONTENT_NOT_FINISHED, NULL); - if (ret != NULL) - xmlFreeDocElementContent(ctxt->myDoc, ret); - return(NULL); - } - GROW; - SKIP_BLANKS; - GROW; - if (RAW == '(') { - int inputid = ctxt->input->id; - /* Recurse on second child */ - NEXT; - SKIP_BLANKS; - last = xmlParseElementChildrenContentDecl(ctxt, inputid); - SKIP_BLANKS; - } else { - elem = xmlParseName(ctxt); - if (elem == NULL) { - xmlFatalErr(ctxt, XML_ERR_ELEMCONTENT_NOT_STARTED, NULL); - if (ret != NULL) - xmlFreeDocElementContent(ctxt->myDoc, ret); - return(NULL); - } - last = xmlNewDocElementContent(ctxt->myDoc, elem, XML_ELEMENT_CONTENT_ELEMENT); - if (RAW == '?') { - last->ocur = XML_ELEMENT_CONTENT_OPT; - NEXT; - } else if (RAW == '*') { - last->ocur = XML_ELEMENT_CONTENT_MULT; - NEXT; - } else if (RAW == '+') { - last->ocur = XML_ELEMENT_CONTENT_PLUS; - NEXT; - } else { - last->ocur = XML_ELEMENT_CONTENT_ONCE; - } - } - SKIP_BLANKS; - GROW; - } - if ((cur != NULL) && (last != NULL)) { - cur->c2 = last; - if (last != NULL) - last->parent = cur; - } - if ((ctxt->validate) && (ctxt->input->id != inputchk)) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, -"Element content declaration doesn't start and stop in the same entity\n", - NULL); - } - NEXT; - if (RAW == '?') { - if (ret != NULL) { - if ((ret->ocur == XML_ELEMENT_CONTENT_PLUS) || - (ret->ocur == XML_ELEMENT_CONTENT_MULT)) - ret->ocur = XML_ELEMENT_CONTENT_MULT; - else - ret->ocur = XML_ELEMENT_CONTENT_OPT; - } - NEXT; - } else if (RAW == '*') { - if (ret != NULL) { - ret->ocur = XML_ELEMENT_CONTENT_MULT; - cur = ret; - /* - * Some normalization: - * (a | b* | c?)* == (a | b | c)* - */ - while ((cur != NULL) && (cur->type == XML_ELEMENT_CONTENT_OR)) { - if ((cur->c1 != NULL) && - ((cur->c1->ocur == XML_ELEMENT_CONTENT_OPT) || - (cur->c1->ocur == XML_ELEMENT_CONTENT_MULT))) - cur->c1->ocur = XML_ELEMENT_CONTENT_ONCE; - if ((cur->c2 != NULL) && - ((cur->c2->ocur == XML_ELEMENT_CONTENT_OPT) || - (cur->c2->ocur == XML_ELEMENT_CONTENT_MULT))) - cur->c2->ocur = XML_ELEMENT_CONTENT_ONCE; - cur = cur->c2; - } - } - NEXT; - } else if (RAW == '+') { - if (ret != NULL) { - int found = 0; - - if ((ret->ocur == XML_ELEMENT_CONTENT_OPT) || - (ret->ocur == XML_ELEMENT_CONTENT_MULT)) - ret->ocur = XML_ELEMENT_CONTENT_MULT; - else - ret->ocur = XML_ELEMENT_CONTENT_PLUS; - /* - * Some normalization: - * (a | b*)+ == (a | b)* - * (a | b?)+ == (a | b)* - */ - while ((cur != NULL) && (cur->type == XML_ELEMENT_CONTENT_OR)) { - if ((cur->c1 != NULL) && - ((cur->c1->ocur == XML_ELEMENT_CONTENT_OPT) || - (cur->c1->ocur == XML_ELEMENT_CONTENT_MULT))) { - cur->c1->ocur = XML_ELEMENT_CONTENT_ONCE; - found = 1; - } - if ((cur->c2 != NULL) && - ((cur->c2->ocur == XML_ELEMENT_CONTENT_OPT) || - (cur->c2->ocur == XML_ELEMENT_CONTENT_MULT))) { - cur->c2->ocur = XML_ELEMENT_CONTENT_ONCE; - found = 1; - } - cur = cur->c2; - } - if (found) - ret->ocur = XML_ELEMENT_CONTENT_MULT; - } - NEXT; - } - return(ret); -} - -/** - * xmlParseElementContentDecl: - * @ctxt: an XML parser context - * @name: the name of the element being defined. - * @result: the Element Content pointer will be stored here if any - * - * parse the declaration for an Element content either Mixed or Children, - * the cases EMPTY and ANY are handled directly in xmlParseElementDecl - * - * [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children - * - * returns: the type of element content XML_ELEMENT_TYPE_xxx - */ - -int -xmlParseElementContentDecl(xmlParserCtxtPtr ctxt, const xmlChar *name, - xmlElementContentPtr *result) { - - xmlElementContentPtr tree = NULL; - int inputid = ctxt->input->id; - int res; - - *result = NULL; - - if (RAW != '(') { - xmlFatalErrMsgStr(ctxt, XML_ERR_ELEMCONTENT_NOT_STARTED, - "xmlParseElementContentDecl : %s '(' expected\n", name); - return(-1); - } - NEXT; - GROW; - SKIP_BLANKS; - if (CMP7(CUR_PTR, '#', 'P', 'C', 'D', 'A', 'T', 'A')) { - tree = xmlParseElementMixedContentDecl(ctxt, inputid); - res = XML_ELEMENT_TYPE_MIXED; - } else { - tree = xmlParseElementChildrenContentDecl(ctxt, inputid); - res = XML_ELEMENT_TYPE_ELEMENT; - } - SKIP_BLANKS; - *result = tree; - return(res); -} - -/** - * xmlParseElementDecl: - * @ctxt: an XML parser context - * - * parse an Element declaration. - * - * [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' - * - * [ VC: Unique Element Type Declaration ] - * No element type may be declared more than once - * - * Returns the type of the element, or -1 in case of error - */ -int -xmlParseElementDecl(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - int ret = -1; - xmlElementContentPtr content = NULL; - - /* GROW; done in the caller */ - if (CMP9(CUR_PTR, '<', '!', 'E', 'L', 'E', 'M', 'E', 'N', 'T')) { - xmlParserInputPtr input = ctxt->input; - - SKIP(9); - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after 'ELEMENT'\n"); - } - SKIP_BLANKS; - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParseElementDecl: no name for Element\n"); - return(-1); - } - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space required after the element name\n"); - } - SKIP_BLANKS; - if (CMP5(CUR_PTR, 'E', 'M', 'P', 'T', 'Y')) { - SKIP(5); - /* - * Element must always be empty. - */ - ret = XML_ELEMENT_TYPE_EMPTY; - } else if ((RAW == 'A') && (NXT(1) == 'N') && - (NXT(2) == 'Y')) { - SKIP(3); - /* - * Element is a generic container. - */ - ret = XML_ELEMENT_TYPE_ANY; - } else if (RAW == '(') { - ret = xmlParseElementContentDecl(ctxt, name, &content); - } else { - /* - * [ WFC: PEs in Internal Subset ] error handling. - */ - if ((RAW == '%') && (ctxt->external == 0) && - (ctxt->inputNr == 1)) { - xmlFatalErrMsg(ctxt, XML_ERR_PEREF_IN_INT_SUBSET, - "PEReference: forbidden within markup decl in internal subset\n"); - } else { - xmlFatalErrMsg(ctxt, XML_ERR_ELEMCONTENT_NOT_STARTED, - "xmlParseElementDecl: 'EMPTY', 'ANY' or '(' expected\n"); - } - return(-1); - } - - SKIP_BLANKS; - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - SKIP_BLANKS; - - if (RAW != '>') { - xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); - if (content != NULL) { - xmlFreeDocElementContent(ctxt->myDoc, content); - } - } else { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Element declaration doesn't start and stop in the same entity\n"); - } - - NEXT; - if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && - (ctxt->sax->elementDecl != NULL)) { - if (content != NULL) - content->parent = NULL; - ctxt->sax->elementDecl(ctxt->userData, name, ret, - content); - if ((content != NULL) && (content->parent == NULL)) { - /* - * this is a trick: if xmlAddElementDecl is called, - * instead of copying the full tree it is plugged directly - * if called from the parser. Avoid duplicating the - * interfaces or change the API/ABI - */ - xmlFreeDocElementContent(ctxt->myDoc, content); - } - } else if (content != NULL) { - xmlFreeDocElementContent(ctxt->myDoc, content); - } - } - } - return(ret); -} - -/** - * xmlParseConditionalSections - * @ctxt: an XML parser context - * - * [61] conditionalSect ::= includeSect | ignoreSect - * [62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>' - * [63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>' - * [64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)* - * [65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*) - */ - -static void -xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { - SKIP(3); - SKIP_BLANKS; - if (CMP7(CUR_PTR, 'I', 'N', 'C', 'L', 'U', 'D', 'E')) { - SKIP(7); - SKIP_BLANKS; - if (RAW != '[') { - xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); - } else { - NEXT; - } - if (xmlParserDebugEntities) { - if ((ctxt->input != NULL) && (ctxt->input->filename)) - xmlGenericError(xmlGenericErrorContext, - "%s(%d): ", ctxt->input->filename, - ctxt->input->line); - xmlGenericError(xmlGenericErrorContext, - "Entering INCLUDE Conditional Section\n"); - } - - while ((RAW != 0) && ((RAW != ']') || (NXT(1) != ']') || - (NXT(2) != '>'))) { - const xmlChar *check = CUR_PTR; - unsigned int cons = ctxt->input->consumed; - - if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) { - xmlParseConditionalSections(ctxt); - } else if (IS_BLANK_CH(CUR)) { - NEXT; - } else if (RAW == '%') { - xmlParsePEReference(ctxt); - } else - xmlParseMarkupDecl(ctxt); - - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - - if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { - xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); - break; - } - } - if (xmlParserDebugEntities) { - if ((ctxt->input != NULL) && (ctxt->input->filename)) - xmlGenericError(xmlGenericErrorContext, - "%s(%d): ", ctxt->input->filename, - ctxt->input->line); - xmlGenericError(xmlGenericErrorContext, - "Leaving INCLUDE Conditional Section\n"); - } - - } else if (CMP6(CUR_PTR, 'I', 'G', 'N', 'O', 'R', 'E')) { - int state; - xmlParserInputState instate; - int depth = 0; - - SKIP(6); - SKIP_BLANKS; - if (RAW != '[') { - xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); - } else { - NEXT; - } - if (xmlParserDebugEntities) { - if ((ctxt->input != NULL) && (ctxt->input->filename)) - xmlGenericError(xmlGenericErrorContext, - "%s(%d): ", ctxt->input->filename, - ctxt->input->line); - xmlGenericError(xmlGenericErrorContext, - "Entering IGNORE Conditional Section\n"); - } - - /* - * Parse up to the end of the conditional section - * But disable SAX event generating DTD building in the meantime - */ - state = ctxt->disableSAX; - instate = ctxt->instate; - if (ctxt->recovery == 0) ctxt->disableSAX = 1; - ctxt->instate = XML_PARSER_IGNORE; - - while ((depth >= 0) && (RAW != 0)) { - if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) { - depth++; - SKIP(3); - continue; - } - if ((RAW == ']') && (NXT(1) == ']') && (NXT(2) == '>')) { - if (--depth >= 0) SKIP(3); - continue; - } - NEXT; - continue; - } - - ctxt->disableSAX = state; - ctxt->instate = instate; - - if (xmlParserDebugEntities) { - if ((ctxt->input != NULL) && (ctxt->input->filename)) - xmlGenericError(xmlGenericErrorContext, - "%s(%d): ", ctxt->input->filename, - ctxt->input->line); - xmlGenericError(xmlGenericErrorContext, - "Leaving IGNORE Conditional Section\n"); - } - - } else { - xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID_KEYWORD, NULL); - } - - if (RAW == 0) - SHRINK; - - if (RAW == 0) { - xmlFatalErr(ctxt, XML_ERR_CONDSEC_NOT_FINISHED, NULL); - } else { - SKIP(3); - } -} - -/** - * xmlParseMarkupDecl: - * @ctxt: an XML parser context - * - * parse Markup declarations - * - * [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | - * NotationDecl | PI | Comment - * - * [ VC: Proper Declaration/PE Nesting ] - * Parameter-entity replacement text must be properly nested with - * markup declarations. That is to say, if either the first character - * or the last character of a markup declaration (markupdecl above) is - * contained in the replacement text for a parameter-entity reference, - * both must be contained in the same replacement text. - * - * [ WFC: PEs in Internal Subset ] - * In the internal DTD subset, parameter-entity references can occur - * only where markup declarations can occur, not within markup declarations. - * (This does not apply to references that occur in external parameter - * entities or to the external subset.) - */ -void -xmlParseMarkupDecl(xmlParserCtxtPtr ctxt) { - GROW; - if (CUR == '<') { - if (NXT(1) == '!') { - switch (NXT(2)) { - case 'E': - if (NXT(3) == 'L') - xmlParseElementDecl(ctxt); - else if (NXT(3) == 'N') - xmlParseEntityDecl(ctxt); - break; - case 'A': - xmlParseAttributeListDecl(ctxt); - break; - case 'N': - xmlParseNotationDecl(ctxt); - break; - case '-': - xmlParseComment(ctxt); - break; - default: - /* there is an error but it will be detected later */ - break; - } - } else if (NXT(1) == '?') { - xmlParsePI(ctxt); - } - } - /* - * This is only for internal subset. On external entities, - * the replacement is done before parsing stage - */ - if ((ctxt->external == 0) && (ctxt->inputNr == 1)) - xmlParsePEReference(ctxt); - - /* - * Conditional sections are allowed from entities included - * by PE References in the internal subset. - */ - if ((ctxt->external == 0) && (ctxt->inputNr > 1)) { - if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) { - xmlParseConditionalSections(ctxt); - } - } - - ctxt->instate = XML_PARSER_DTD; -} - -/** - * xmlParseTextDecl: - * @ctxt: an XML parser context - * - * parse an XML declaration header for external entities - * - * [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>' - * - * Question: Seems that EncodingDecl is mandatory ? Is that a typo ? - */ - -void -xmlParseTextDecl(xmlParserCtxtPtr ctxt) { - xmlChar *version; - const xmlChar *encoding; - - /* - * We know that '<?xml' is here. - */ - if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) { - SKIP(5); - } else { - xmlFatalErr(ctxt, XML_ERR_XMLDECL_NOT_STARTED, NULL); - return; - } - - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space needed after '<?xml'\n"); - } - SKIP_BLANKS; - - /* - * We may have the VersionInfo here. - */ - version = xmlParseVersionInfo(ctxt); - if (version == NULL) - version = xmlCharStrdup(XML_DEFAULT_VERSION); - else { - if (!IS_BLANK_CH(CUR)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Space needed here\n"); - } - } - ctxt->input->version = version; - - /* - * We must have the encoding declaration - */ - encoding = xmlParseEncodingDecl(ctxt); - if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { - /* - * The XML REC instructs us to stop parsing right here - */ - return; - } - if ((encoding == NULL) && (ctxt->errNo == XML_ERR_OK)) { - xmlFatalErrMsg(ctxt, XML_ERR_MISSING_ENCODING, - "Missing encoding in text declaration\n"); - } - - SKIP_BLANKS; - if ((RAW == '?') && (NXT(1) == '>')) { - SKIP(2); - } else if (RAW == '>') { - /* Deprecated old WD ... */ - xmlFatalErr(ctxt, XML_ERR_XMLDECL_NOT_FINISHED, NULL); - NEXT; - } else { - xmlFatalErr(ctxt, XML_ERR_XMLDECL_NOT_FINISHED, NULL); - MOVETO_ENDTAG(CUR_PTR); - NEXT; - } -} - -/** - * xmlParseExternalSubset: - * @ctxt: an XML parser context - * @ExternalID: the external identifier - * @SystemID: the system identifier (or URL) - * - * parse Markup declarations from an external subset - * - * [30] extSubset ::= textDecl? extSubsetDecl - * - * [31] extSubsetDecl ::= (markupdecl | conditionalSect | PEReference | S) * - */ -void -xmlParseExternalSubset(xmlParserCtxtPtr ctxt, const xmlChar *ExternalID, - const xmlChar *SystemID) { - xmlDetectSAX2(ctxt); - GROW; - if (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) { - xmlParseTextDecl(ctxt); - if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { - /* - * The XML REC instructs us to stop parsing right here - */ - ctxt->instate = XML_PARSER_EOF; - return; - } - } - if (ctxt->myDoc == NULL) { - ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0"); - } - if ((ctxt->myDoc != NULL) && (ctxt->myDoc->intSubset == NULL)) - xmlCreateIntSubset(ctxt->myDoc, NULL, ExternalID, SystemID); - - ctxt->instate = XML_PARSER_DTD; - ctxt->external = 1; - while (((RAW == '<') && (NXT(1) == '?')) || - ((RAW == '<') && (NXT(1) == '!')) || - (RAW == '%') || IS_BLANK_CH(CUR)) { - const xmlChar *check = CUR_PTR; - unsigned int cons = ctxt->input->consumed; - - GROW; - if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) { - xmlParseConditionalSections(ctxt); - } else if (IS_BLANK_CH(CUR)) { - NEXT; - } else if (RAW == '%') { - xmlParsePEReference(ctxt); - } else - xmlParseMarkupDecl(ctxt); - - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - - if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { - xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); - break; - } - } - - if (RAW != 0) { - xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); - } - -} - -/** - * xmlParseReference: - * @ctxt: an XML parser context - * - * parse and handle entity references in content, depending on the SAX - * interface, this may end-up in a call to character() if this is a - * CharRef, a predefined entity, if there is no reference() callback. - * or if the parser was asked to switch to that mode. - * - * [67] Reference ::= EntityRef | CharRef - */ -void -xmlParseReference(xmlParserCtxtPtr ctxt) { - xmlEntityPtr ent; - xmlChar *val; - if (RAW != '&') return; - - if (NXT(1) == '#') { - int i = 0; - xmlChar out[10]; - int hex = NXT(2); - int value = xmlParseCharRef(ctxt); - - if (ctxt->charset != XML_CHAR_ENCODING_UTF8) { - /* - * So we are using non-UTF-8 buffers - * Check that the char fit on 8bits, if not - * generate a CharRef. - */ - if (value <= 0xFF) { - out[0] = value; - out[1] = 0; - if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->characters(ctxt->userData, out, 1); - } else { - if ((hex == 'x') || (hex == 'X')) - snprintf((char *)out, sizeof(out), "#x%X", value); - else - snprintf((char *)out, sizeof(out), "#%d", value); - if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->reference(ctxt->userData, out); - } - } else { - /* - * Just encode the value in UTF-8 - */ - COPY_BUF(0 ,out, i, value); - out[i] = 0; - if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->characters(ctxt->userData, out, i); - } - } else { - int was_checked; - - ent = xmlParseEntityRef(ctxt); - if (ent == NULL) return; - if (!ctxt->wellFormed) - return; - was_checked = ent->checked; - if ((ent->name != NULL) && - (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY)) { - xmlNodePtr list = NULL; - xmlParserErrors ret = XML_ERR_OK; - - - /* - * The first reference to the entity trigger a parsing phase - * where the ent->children is filled with the result from - * the parsing. - */ - if (ent->checked == 0) { - xmlChar *value; - - value = ent->content; - - /* - * Check that this entity is well formed - */ - if ((value != NULL) && (value[0] != 0) && - (value[1] == 0) && (value[0] == '<') && - (xmlStrEqual(ent->name, BAD_CAST "lt"))) { - /* - * DONE: get definite answer on this !!! - * Lots of entity decls are used to declare a single - * char - * <!ENTITY lt "<"> - * Which seems to be valid since - * 2.4: The ampersand character (&) and the left angle - * bracket (<) may appear in their literal form only - * when used ... They are also legal within the literal - * entity value of an internal entity declaration;i - * see "4.3.2 Well-Formed Parsed Entities". - * IMHO 2.4 and 4.3.2 are directly in contradiction. - * Looking at the OASIS test suite and James Clark - * tests, this is broken. However the XML REC uses - * it. Is the XML REC not well-formed ???? - * This is a hack to avoid this problem - * - * ANSWER: since lt gt amp .. are already defined, - * this is a redefinition and hence the fact that the - * content is not well balanced is not a Wf error, this - * is lousy but acceptable. - */ - list = xmlNewDocText(ctxt->myDoc, value); - if (list != NULL) { - if ((ent->etype == XML_INTERNAL_GENERAL_ENTITY) && - (ent->children == NULL)) { - ent->children = list; - ent->last = list; - ent->owner = 1; - list->parent = (xmlNodePtr) ent; - } else { - xmlFreeNodeList(list); - } - } else if (list != NULL) { - xmlFreeNodeList(list); - } - } else { - /* - * 4.3.2: An internal general parsed entity is well-formed - * if its replacement text matches the production labeled - * content. - */ - - void *user_data; - /* - * This is a bit hackish but this seems the best - * way to make sure both SAX and DOM entity support - * behaves okay. - */ - if (ctxt->userData == ctxt) - user_data = NULL; - else - user_data = ctxt->userData; - - if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { - ctxt->depth++; - ret = xmlParseBalancedChunkMemoryInternal(ctxt, - value, user_data, &list); - ctxt->depth--; - } else if (ent->etype == - XML_EXTERNAL_GENERAL_PARSED_ENTITY) { - ctxt->depth++; - ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, - ctxt->sax, user_data, ctxt->depth, - ent->URI, ent->ExternalID, &list); - ctxt->depth--; - } else { - ret = XML_ERR_ENTITY_PE_INTERNAL; - xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, - "invalid entity type found\n", NULL); - } - if (ret == XML_ERR_ENTITY_LOOP) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); - return; - } else if ((ret == XML_ERR_OK) && (list != NULL)) { - if (((ent->etype == XML_INTERNAL_GENERAL_ENTITY) || - (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY))&& - (ent->children == NULL)) { - ent->children = list; - if (ctxt->replaceEntities) { - /* - * Prune it directly in the generated document - * except for single text nodes. - */ - if (((list->type == XML_TEXT_NODE) && - (list->next == NULL)) || - (ctxt->parseMode == XML_PARSE_READER)) { - list->parent = (xmlNodePtr) ent; - list = NULL; - ent->owner = 1; - } else { - ent->owner = 0; - while (list != NULL) { - list->parent = (xmlNodePtr) ctxt->node; - list->doc = ctxt->myDoc; - if (list->next == NULL) - ent->last = list; - list = list->next; - } - list = ent->children; -#ifdef LIBXML_LEGACY_ENABLED - if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) - xmlAddEntityReference(ent, list, NULL); -#endif /* LIBXML_LEGACY_ENABLED */ - } - } else { - ent->owner = 1; - while (list != NULL) { - list->parent = (xmlNodePtr) ent; - if (list->next == NULL) - ent->last = list; - list = list->next; - } - } - } else { - xmlFreeNodeList(list); - list = NULL; - } - } else if ((ret != XML_ERR_OK) && - (ret != XML_WAR_UNDECLARED_ENTITY)) { - xmlFatalErr(ctxt, ret, NULL); - } else if (list != NULL) { - xmlFreeNodeList(list); - list = NULL; - } - } - ent->checked = 1; - } - - if (ent->children == NULL) { - /* - * Probably running in SAX mode and the callbacks don't - * build the entity content. So unless we already went - * though parsing for first checking go though the entity - * content to generate callbacks associated to the entity - */ - if (was_checked == 1) { - void *user_data; - /* - * This is a bit hackish but this seems the best - * way to make sure both SAX and DOM entity support - * behaves okay. - */ - if (ctxt->userData == ctxt) - user_data = NULL; - else - user_data = ctxt->userData; - - if (ent->etype == XML_INTERNAL_GENERAL_ENTITY) { - ctxt->depth++; - ret = xmlParseBalancedChunkMemoryInternal(ctxt, - ent->content, user_data, NULL); - ctxt->depth--; - } else if (ent->etype == - XML_EXTERNAL_GENERAL_PARSED_ENTITY) { - ctxt->depth++; - ret = xmlParseExternalEntityPrivate(ctxt->myDoc, ctxt, - ctxt->sax, user_data, ctxt->depth, - ent->URI, ent->ExternalID, NULL); - ctxt->depth--; - } else { - ret = XML_ERR_ENTITY_PE_INTERNAL; - xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, - "invalid entity type found\n", NULL); - } - if (ret == XML_ERR_ENTITY_LOOP) { - xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); - return; - } - } - if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) && - (ctxt->replaceEntities == 0) && (!ctxt->disableSAX)) { - /* - * Entity reference callback comes second, it's somewhat - * superfluous but a compatibility to historical behaviour - */ - ctxt->sax->reference(ctxt->userData, ent->name); - } - return; - } - if ((ctxt->sax != NULL) && (ctxt->sax->reference != NULL) && - (ctxt->replaceEntities == 0) && (!ctxt->disableSAX)) { - /* - * Create a node. - */ - ctxt->sax->reference(ctxt->userData, ent->name); - return; - } - if ((ctxt->replaceEntities) || (ent->children == NULL)) { - /* - * There is a problem on the handling of _private for entities - * (bug 155816): Should we copy the content of the field from - * the entity (possibly overwriting some value set by the user - * when a copy is created), should we leave it alone, or should - * we try to take care of different situations? The problem - * is exacerbated by the usage of this field by the xmlReader. - * To fix this bug, we look at _private on the created node - * and, if it's NULL, we copy in whatever was in the entity. - * If it's not NULL we leave it alone. This is somewhat of a - * hack - maybe we should have further tests to determine - * what to do. - */ - if ((ctxt->node != NULL) && (ent->children != NULL)) { - /* - * Seems we are generating the DOM content, do - * a simple tree copy for all references except the first - * In the first occurrence list contains the replacement. - * progressive == 2 means we are operating on the Reader - * and since nodes are discarded we must copy all the time. - */ - if (((list == NULL) && (ent->owner == 0)) || - (ctxt->parseMode == XML_PARSE_READER)) { - xmlNodePtr nw = NULL, cur, firstChild = NULL; - - /* - * when operating on a reader, the entities definitions - * are always owning the entities subtree. - if (ctxt->parseMode == XML_PARSE_READER) - ent->owner = 1; - */ - - cur = ent->children; - while (cur != NULL) { - nw = xmlDocCopyNode(cur, ctxt->myDoc, 1); - if (nw != NULL) { - if (nw->_private == NULL) - nw->_private = cur->_private; - if (firstChild == NULL){ - firstChild = nw; - } - nw = xmlAddChild(ctxt->node, nw); - } - if (cur == ent->last) { - /* - * needed to detect some strange empty - * node cases in the reader tests - */ - if ((ctxt->parseMode == XML_PARSE_READER) && - (nw != NULL) && - (nw->type == XML_ELEMENT_NODE) && - (nw->children == NULL)) - nw->extra = 1; - - break; - } - cur = cur->next; - } -#ifdef LIBXML_LEGACY_ENABLED - if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) - xmlAddEntityReference(ent, firstChild, nw); -#endif /* LIBXML_LEGACY_ENABLED */ - } else if (list == NULL) { - xmlNodePtr nw = NULL, cur, next, last, - firstChild = NULL; - /* - * Copy the entity child list and make it the new - * entity child list. The goal is to make sure any - * ID or REF referenced will be the one from the - * document content and not the entity copy. - */ - cur = ent->children; - ent->children = NULL; - last = ent->last; - ent->last = NULL; - while (cur != NULL) { - next = cur->next; - cur->next = NULL; - cur->parent = NULL; - nw = xmlDocCopyNode(cur, ctxt->myDoc, 1); - if (nw != NULL) { - if (nw->_private == NULL) - nw->_private = cur->_private; - if (firstChild == NULL){ - firstChild = cur; - } - xmlAddChild((xmlNodePtr) ent, nw); - xmlAddChild(ctxt->node, cur); - } - if (cur == last) - break; - cur = next; - } - ent->owner = 1; -#ifdef LIBXML_LEGACY_ENABLED - if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) - xmlAddEntityReference(ent, firstChild, nw); -#endif /* LIBXML_LEGACY_ENABLED */ - } else { - const xmlChar *nbktext; - - /* - * the name change is to avoid coalescing of the - * node with a possible previous text one which - * would make ent->children a dangling pointer - */ - nbktext = xmlDictLookup(ctxt->dict, BAD_CAST "nbktext", - -1); - if (ent->children->type == XML_TEXT_NODE) - ent->children->name = nbktext; - if ((ent->last != ent->children) && - (ent->last->type == XML_TEXT_NODE)) - ent->last->name = nbktext; - xmlAddChildList(ctxt->node, ent->children); - } - - /* - * This is to avoid a nasty side effect, see - * characters() in SAX.c - */ - ctxt->nodemem = 0; - ctxt->nodelen = 0; - return; - } - } - } else { - val = ent->content; - if (val == NULL) return; - /* - * inline the entity. - */ - if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->characters(ctxt->userData, val, xmlStrlen(val)); - } - } -} - -/** - * xmlParseEntityRef: - * @ctxt: an XML parser context - * - * parse ENTITY references declarations - * - * [68] EntityRef ::= '&' Name ';' - * - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an internal DTD - * subset which contains no parameter entity references, or a document - * with "standalone='yes'", the Name given in the entity reference - * must match that in an entity declaration, except that well-formed - * documents need not declare any of the following entities: amp, lt, - * gt, apos, quot. The declaration of a parameter entity must precede - * any reference to it. Similarly, the declaration of a general entity - * must precede any reference to it which appears in a default value in an - * attribute-list declaration. Note that if entities are declared in the - * external subset or in external parameter entities, a non-validating - * processor is not obligated to read and process their declarations; - * for such documents, the rule that an entity must be declared is a - * well-formedness constraint only if standalone='yes'. - * - * [ WFC: Parsed Entity ] - * An entity reference must not contain the name of an unparsed entity - * - * Returns the xmlEntityPtr if found, or NULL otherwise. - */ -xmlEntityPtr -xmlParseEntityRef(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - xmlEntityPtr ent = NULL; - - GROW; - - if (RAW == '&') { - NEXT; - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParseEntityRef: no name\n"); - } else { - if (RAW == ';') { - NEXT; - /* - * Ask first SAX for entity resolution, otherwise try the - * predefined set. - */ - if (ctxt->sax != NULL) { - if (ctxt->sax->getEntity != NULL) - ent = ctxt->sax->getEntity(ctxt->userData, name); - if ((ctxt->wellFormed == 1 ) && (ent == NULL)) - ent = xmlGetPredefinedEntity(name); - if ((ctxt->wellFormed == 1 ) && (ent == NULL) && - (ctxt->userData==ctxt)) { - ent = xmlSAX2GetEntity(ctxt, name); - } - } - /* - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an - * internal DTD subset which contains no parameter entity - * references, or a document with "standalone='yes'", the - * Name given in the entity reference must match that in an - * entity declaration, except that well-formed documents - * need not declare any of the following entities: amp, lt, - * gt, apos, quot. - * The declaration of a parameter entity must precede any - * reference to it. - * Similarly, the declaration of a general entity must - * precede any reference to it which appears in a default - * value in an attribute-list declaration. Note that if - * entities are declared in the external subset or in - * external parameter entities, a non-validating processor - * is not obligated to read and process their declarations; - * for such documents, the rule that an entity must be - * declared is a well-formedness constraint only if - * standalone='yes'. - */ - if (ent == NULL) { - if ((ctxt->standalone == 1) || - ((ctxt->hasExternalSubset == 0) && - (ctxt->hasPErefs == 0))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, - "Entity '%s' not defined\n", name); - } else { - xmlErrMsgStr(ctxt, XML_WAR_UNDECLARED_ENTITY, - "Entity '%s' not defined\n", name); - if ((ctxt->inSubset == 0) && - (ctxt->sax != NULL) && - (ctxt->sax->reference != NULL)) { - ctxt->sax->reference(ctxt->userData, name); - } - } - ctxt->valid = 0; - } - - /* - * [ WFC: Parsed Entity ] - * An entity reference must not contain the name of an - * unparsed entity - */ - else if (ent->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNPARSED_ENTITY, - "Entity reference to unparsed entity %s\n", name); - } - - /* - * [ WFC: No External Entity References ] - * Attribute values cannot contain direct or indirect - * entity references to external entities. - */ - else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && - (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { - xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_EXTERNAL, - "Attribute references external entity '%s'\n", name); - } - /* - * [ WFC: No < in Attribute Values ] - * The replacement text of any entity referred to directly or - * indirectly in an attribute value (other than "<") must - * not contain a <. - */ - else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && - (ent != NULL) && - (!xmlStrEqual(ent->name, BAD_CAST "lt")) && - (ent->content != NULL) && - (xmlStrchr(ent->content, '<'))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, - "'<' in entity '%s' is not allowed in attributes values\n", name); - } - - /* - * Internal check, no parameter entities here ... - */ - else { - switch (ent->etype) { - case XML_INTERNAL_PARAMETER_ENTITY: - case XML_EXTERNAL_PARAMETER_ENTITY: - xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER, - "Attempt to reference the parameter entity '%s'\n", - name); - break; - default: - break; - } - } - - /* - * [ WFC: No Recursion ] - * A parsed entity must not contain a recursive reference - * to itself, either directly or indirectly. - * Done somewhere else - */ - - } else { - xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); - } - } - } - return(ent); -} - -/** - * xmlParseStringEntityRef: - * @ctxt: an XML parser context - * @str: a pointer to an index in the string - * - * parse ENTITY references declarations, but this version parses it from - * a string value. - * - * [68] EntityRef ::= '&' Name ';' - * - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an internal DTD - * subset which contains no parameter entity references, or a document - * with "standalone='yes'", the Name given in the entity reference - * must match that in an entity declaration, except that well-formed - * documents need not declare any of the following entities: amp, lt, - * gt, apos, quot. The declaration of a parameter entity must precede - * any reference to it. Similarly, the declaration of a general entity - * must precede any reference to it which appears in a default value in an - * attribute-list declaration. Note that if entities are declared in the - * external subset or in external parameter entities, a non-validating - * processor is not obligated to read and process their declarations; - * for such documents, the rule that an entity must be declared is a - * well-formedness constraint only if standalone='yes'. - * - * [ WFC: Parsed Entity ] - * An entity reference must not contain the name of an unparsed entity - * - * Returns the xmlEntityPtr if found, or NULL otherwise. The str pointer - * is updated to the current location in the string. - */ -xmlEntityPtr -xmlParseStringEntityRef(xmlParserCtxtPtr ctxt, const xmlChar ** str) { - xmlChar *name; - const xmlChar *ptr; - xmlChar cur; - xmlEntityPtr ent = NULL; - - if ((str == NULL) || (*str == NULL)) - return(NULL); - ptr = *str; - cur = *ptr; - if (cur == '&') { - ptr++; - cur = *ptr; - name = xmlParseStringName(ctxt, &ptr); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParseStringEntityRef: no name\n"); - } else { - if (*ptr == ';') { - ptr++; - /* - * Ask first SAX for entity resolution, otherwise try the - * predefined set. - */ - if (ctxt->sax != NULL) { - if (ctxt->sax->getEntity != NULL) - ent = ctxt->sax->getEntity(ctxt->userData, name); - if (ent == NULL) - ent = xmlGetPredefinedEntity(name); - if ((ent == NULL) && (ctxt->userData==ctxt)) { - ent = xmlSAX2GetEntity(ctxt, name); - } - } - /* - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an - * internal DTD subset which contains no parameter entity - * references, or a document with "standalone='yes'", the - * Name given in the entity reference must match that in an - * entity declaration, except that well-formed documents - * need not declare any of the following entities: amp, lt, - * gt, apos, quot. - * The declaration of a parameter entity must precede any - * reference to it. - * Similarly, the declaration of a general entity must - * precede any reference to it which appears in a default - * value in an attribute-list declaration. Note that if - * entities are declared in the external subset or in - * external parameter entities, a non-validating processor - * is not obligated to read and process their declarations; - * for such documents, the rule that an entity must be - * declared is a well-formedness constraint only if - * standalone='yes'. - */ - if (ent == NULL) { - if ((ctxt->standalone == 1) || - ((ctxt->hasExternalSubset == 0) && - (ctxt->hasPErefs == 0))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, - "Entity '%s' not defined\n", name); - } else { - xmlErrMsgStr(ctxt, XML_WAR_UNDECLARED_ENTITY, - "Entity '%s' not defined\n", - name); - } - /* TODO ? check regressions ctxt->valid = 0; */ - } - - /* - * [ WFC: Parsed Entity ] - * An entity reference must not contain the name of an - * unparsed entity - */ - else if (ent->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNPARSED_ENTITY, - "Entity reference to unparsed entity %s\n", name); - } - - /* - * [ WFC: No External Entity References ] - * Attribute values cannot contain direct or indirect - * entity references to external entities. - */ - else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && - (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { - xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_EXTERNAL, - "Attribute references external entity '%s'\n", name); - } - /* - * [ WFC: No < in Attribute Values ] - * The replacement text of any entity referred to directly or - * indirectly in an attribute value (other than "<") must - * not contain a <. - */ - else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && - (ent != NULL) && - (!xmlStrEqual(ent->name, BAD_CAST "lt")) && - (ent->content != NULL) && - (xmlStrchr(ent->content, '<'))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, - "'<' in entity '%s' is not allowed in attributes values\n", - name); - } - - /* - * Internal check, no parameter entities here ... - */ - else { - switch (ent->etype) { - case XML_INTERNAL_PARAMETER_ENTITY: - case XML_EXTERNAL_PARAMETER_ENTITY: - xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER, - "Attempt to reference the parameter entity '%s'\n", - name); - break; - default: - break; - } - } - - /* - * [ WFC: No Recursion ] - * A parsed entity must not contain a recursive reference - * to itself, either directly or indirectly. - * Done somewhere else - */ - - } else { - xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); - } - xmlFree(name); - } - } - *str = ptr; - return(ent); -} - -/** - * xmlParsePEReference: - * @ctxt: an XML parser context - * - * parse PEReference declarations - * The entity content is handled directly by pushing it's content as - * a new input stream. - * - * [69] PEReference ::= '%' Name ';' - * - * [ WFC: No Recursion ] - * A parsed entity must not contain a recursive - * reference to itself, either directly or indirectly. - * - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an internal DTD - * subset which contains no parameter entity references, or a document - * with "standalone='yes'", ... ... The declaration of a parameter - * entity must precede any reference to it... - * - * [ VC: Entity Declared ] - * In a document with an external subset or external parameter entities - * with "standalone='no'", ... ... The declaration of a parameter entity - * must precede any reference to it... - * - * [ WFC: In DTD ] - * Parameter-entity references may only appear in the DTD. - * NOTE: misleading but this is handled. - */ -void -xmlParsePEReference(xmlParserCtxtPtr ctxt) -{ - const xmlChar *name; - xmlEntityPtr entity = NULL; - xmlParserInputPtr input; - - if (RAW == '%') { - NEXT; - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParsePEReference: no name\n"); - } else { - if (RAW == ';') { - NEXT; - if ((ctxt->sax != NULL) && - (ctxt->sax->getParameterEntity != NULL)) - entity = ctxt->sax->getParameterEntity(ctxt->userData, - name); - if (entity == NULL) { - /* - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an - * internal DTD subset which contains no parameter entity - * references, or a document with "standalone='yes'", ... - * ... The declaration of a parameter entity must precede - * any reference to it... - */ - if ((ctxt->standalone == 1) || - ((ctxt->hasExternalSubset == 0) && - (ctxt->hasPErefs == 0))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", - name); - } else { - /* - * [ VC: Entity Declared ] - * In a document with an external subset or external - * parameter entities with "standalone='no'", ... - * ... The declaration of a parameter entity must - * precede any reference to it... - */ - xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", - name, NULL); - ctxt->valid = 0; - } - } else { - /* - * Internal checking in case the entity quest barfed - */ - if ((entity->etype != XML_INTERNAL_PARAMETER_ENTITY) && - (entity->etype != XML_EXTERNAL_PARAMETER_ENTITY)) { - xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, - "Internal: %%%s; is not a parameter entity\n", - name, NULL); - } else if (ctxt->input->free != deallocblankswrapper) { - input = - xmlNewBlanksWrapperInputStream(ctxt, entity); - xmlPushInput(ctxt, input); - } else { - /* - * TODO !!! - * handle the extra spaces added before and after - * c.f. http://www.w3.org/TR/REC-xml#as-PE - */ - input = xmlNewEntityInputStream(ctxt, entity); - xmlPushInput(ctxt, input); - if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && - (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && - (IS_BLANK_CH(NXT(5)))) { - xmlParseTextDecl(ctxt); - if (ctxt->errNo == - XML_ERR_UNSUPPORTED_ENCODING) { - /* - * The XML REC instructs us to stop parsing - * right here - */ - ctxt->instate = XML_PARSER_EOF; - return; - } - } - } - } - ctxt->hasPErefs = 1; - } else { - xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); - } - } - } -} - -/** - * xmlParseStringPEReference: - * @ctxt: an XML parser context - * @str: a pointer to an index in the string - * - * parse PEReference declarations - * - * [69] PEReference ::= '%' Name ';' - * - * [ WFC: No Recursion ] - * A parsed entity must not contain a recursive - * reference to itself, either directly or indirectly. - * - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an internal DTD - * subset which contains no parameter entity references, or a document - * with "standalone='yes'", ... ... The declaration of a parameter - * entity must precede any reference to it... - * - * [ VC: Entity Declared ] - * In a document with an external subset or external parameter entities - * with "standalone='no'", ... ... The declaration of a parameter entity - * must precede any reference to it... - * - * [ WFC: In DTD ] - * Parameter-entity references may only appear in the DTD. - * NOTE: misleading but this is handled. - * - * Returns the string of the entity content. - * str is updated to the current value of the index - */ -xmlEntityPtr -xmlParseStringPEReference(xmlParserCtxtPtr ctxt, const xmlChar **str) { - const xmlChar *ptr; - xmlChar cur; - xmlChar *name; - xmlEntityPtr entity = NULL; - - if ((str == NULL) || (*str == NULL)) return(NULL); - ptr = *str; - cur = *ptr; - if (cur == '%') { - ptr++; - cur = *ptr; - name = xmlParseStringName(ctxt, &ptr); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParseStringPEReference: no name\n"); - } else { - cur = *ptr; - if (cur == ';') { - ptr++; - cur = *ptr; - if ((ctxt->sax != NULL) && - (ctxt->sax->getParameterEntity != NULL)) - entity = ctxt->sax->getParameterEntity(ctxt->userData, - name); - if (entity == NULL) { - /* - * [ WFC: Entity Declared ] - * In a document without any DTD, a document with only an - * internal DTD subset which contains no parameter entity - * references, or a document with "standalone='yes'", ... - * ... The declaration of a parameter entity must precede - * any reference to it... - */ - if ((ctxt->standalone == 1) || - ((ctxt->hasExternalSubset == 0) && - (ctxt->hasPErefs == 0))) { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", name); - } else { - /* - * [ VC: Entity Declared ] - * In a document with an external subset or external - * parameter entities with "standalone='no'", ... - * ... The declaration of a parameter entity must - * precede any reference to it... - */ - xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, - "PEReference: %%%s; not found\n", - name, NULL); - ctxt->valid = 0; - } - } else { - /* - * Internal checking in case the entity quest barfed - */ - if ((entity->etype != XML_INTERNAL_PARAMETER_ENTITY) && - (entity->etype != XML_EXTERNAL_PARAMETER_ENTITY)) { - xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, - "%%%s; is not a parameter entity\n", - name, NULL); - } - } - ctxt->hasPErefs = 1; - } else { - xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); - } - xmlFree(name); - } - } - *str = ptr; - return(entity); -} - -/** - * xmlParseDocTypeDecl: - * @ctxt: an XML parser context - * - * parse a DOCTYPE declaration - * - * [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? - * ('[' (markupdecl | PEReference | S)* ']' S?)? '>' - * - * [ VC: Root Element Type ] - * The Name in the document type declaration must match the element - * type of the root element. - */ - -void -xmlParseDocTypeDecl(xmlParserCtxtPtr ctxt) { - const xmlChar *name = NULL; - xmlChar *ExternalID = NULL; - xmlChar *URI = NULL; - - /* - * We know that '<!DOCTYPE' has been detected. - */ - SKIP(9); - - SKIP_BLANKS; - - /* - * Parse the DOCTYPE name. - */ - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParseDocTypeDecl : no DOCTYPE name !\n"); - } - ctxt->intSubName = name; - - SKIP_BLANKS; - - /* - * Check for SystemID and ExternalID - */ - URI = xmlParseExternalID(ctxt, &ExternalID, 1); - - if ((URI != NULL) || (ExternalID != NULL)) { - ctxt->hasExternalSubset = 1; - } - ctxt->extSubURI = URI; - ctxt->extSubSystem = ExternalID; - - SKIP_BLANKS; - - /* - * Create and update the internal subset. - */ - if ((ctxt->sax != NULL) && (ctxt->sax->internalSubset != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->internalSubset(ctxt->userData, name, ExternalID, URI); - - /* - * Is there any internal subset declarations ? - * they are handled separately in xmlParseInternalSubset() - */ - if (RAW == '[') - return; - - /* - * We should be at the end of the DOCTYPE declaration. - */ - if (RAW != '>') { - xmlFatalErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, NULL); - } - NEXT; -} - -/** - * xmlParseInternalSubset: - * @ctxt: an XML parser context - * - * parse the internal subset declaration - * - * [28 end] ('[' (markupdecl | PEReference | S)* ']' S?)? '>' - */ - -static void -xmlParseInternalSubset(xmlParserCtxtPtr ctxt) { - /* - * Is there any DTD definition ? - */ - if (RAW == '[') { - ctxt->instate = XML_PARSER_DTD; - NEXT; - /* - * Parse the succession of Markup declarations and - * PEReferences. - * Subsequence (markupdecl | PEReference | S)* - */ - while (RAW != ']') { - const xmlChar *check = CUR_PTR; - unsigned int cons = ctxt->input->consumed; - - SKIP_BLANKS; - xmlParseMarkupDecl(ctxt); - xmlParsePEReference(ctxt); - - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - - if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlParseInternalSubset: error detected in Markup declaration\n"); - break; - } - } - if (RAW == ']') { - NEXT; - SKIP_BLANKS; - } - } - - /* - * We should be at the end of the DOCTYPE declaration. - */ - if (RAW != '>') { - xmlFatalErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, NULL); - } - NEXT; -} - -#ifdef LIBXML_SAX1_ENABLED -/** - * xmlParseAttribute: - * @ctxt: an XML parser context - * @value: a xmlChar ** used to store the value of the attribute - * - * parse an attribute - * - * [41] Attribute ::= Name Eq AttValue - * - * [ WFC: No External Entity References ] - * Attribute values cannot contain direct or indirect entity references - * to external entities. - * - * [ WFC: No < in Attribute Values ] - * The replacement text of any entity referred to directly or indirectly in - * an attribute value (other than "<") must not contain a <. - * - * [ VC: Attribute Value Type ] - * The attribute must have been declared; the value must be of the type - * declared for it. - * - * [25] Eq ::= S? '=' S? - * - * With namespace: - * - * [NS 11] Attribute ::= QName Eq AttValue - * - * Also the case QName == xmlns:??? is handled independently as a namespace - * definition. - * - * Returns the attribute name, and the value in *value. - */ - -const xmlChar * -xmlParseAttribute(xmlParserCtxtPtr ctxt, xmlChar **value) { - const xmlChar *name; - xmlChar *val; - - *value = NULL; - GROW; - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "error parsing attribute name\n"); - return(NULL); - } - - /* - * read the value - */ - SKIP_BLANKS; - if (RAW == '=') { - NEXT; - SKIP_BLANKS; - val = xmlParseAttValue(ctxt); - ctxt->instate = XML_PARSER_CONTENT; - } else { - xmlFatalErrMsgStr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, - "Specification mandate value for attribute %s\n", name); - return(NULL); - } - - /* - * Check that xml:lang conforms to the specification - * No more registered as an error, just generate a warning now - * since this was deprecated in XML second edition - */ - if ((ctxt->pedantic) && (xmlStrEqual(name, BAD_CAST "xml:lang"))) { - if (!xmlCheckLanguageID(val)) { - xmlWarningMsg(ctxt, XML_WAR_LANG_VALUE, - "Malformed value for xml:lang : %s\n", - val, NULL); - } - } - - /* - * Check that xml:space conforms to the specification - */ - if (xmlStrEqual(name, BAD_CAST "xml:space")) { - if (xmlStrEqual(val, BAD_CAST "default")) - *(ctxt->space) = 0; - else if (xmlStrEqual(val, BAD_CAST "preserve")) - *(ctxt->space) = 1; - else { - xmlWarningMsg(ctxt, XML_WAR_SPACE_VALUE, -"Invalid value \"%s\" for xml:space : \"default\" or \"preserve\" expected\n", - val, NULL); - } - } - - *value = val; - return(name); -} - -/** - * xmlParseStartTag: - * @ctxt: an XML parser context - * - * parse a start of tag either for rule element or - * EmptyElement. In both case we don't parse the tag closing chars. - * - * [40] STag ::= '<' Name (S Attribute)* S? '>' - * - * [ WFC: Unique Att Spec ] - * No attribute name may appear more than once in the same start-tag or - * empty-element tag. - * - * [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' - * - * [ WFC: Unique Att Spec ] - * No attribute name may appear more than once in the same start-tag or - * empty-element tag. - * - * With namespace: - * - * [NS 8] STag ::= '<' QName (S Attribute)* S? '>' - * - * [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' - * - * Returns the element name parsed - */ - -const xmlChar * -xmlParseStartTag(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - const xmlChar *attname; - xmlChar *attvalue; - const xmlChar **atts = ctxt->atts; - int nbatts = 0; - int maxatts = ctxt->maxatts; - int i; - - if (RAW != '<') return(NULL); - NEXT1; - - name = xmlParseName(ctxt); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "xmlParseStartTag: invalid element name\n"); - return(NULL); - } - - /* - * Now parse the attributes, it ends up with the ending - * - * (S Attribute)* S? - */ - SKIP_BLANKS; - GROW; - - while ((RAW != '>') && - ((RAW != '/') || (NXT(1) != '>')) && - (IS_BYTE_CHAR(RAW))) { - const xmlChar *q = CUR_PTR; - unsigned int cons = ctxt->input->consumed; - - attname = xmlParseAttribute(ctxt, &attvalue); - if ((attname != NULL) && (attvalue != NULL)) { - /* - * [ WFC: Unique Att Spec ] - * No attribute name may appear more than once in the same - * start-tag or empty-element tag. - */ - for (i = 0; i < nbatts;i += 2) { - if (xmlStrEqual(atts[i], attname)) { - xmlErrAttributeDup(ctxt, NULL, attname); - xmlFree(attvalue); - goto failed; - } - } - /* - * Add the pair to atts - */ - if (atts == NULL) { - maxatts = 22; /* allow for 10 attrs by default */ - atts = (const xmlChar **) - xmlMalloc(maxatts * sizeof(xmlChar *)); - if (atts == NULL) { - xmlErrMemory(ctxt, NULL); - if (attvalue != NULL) - xmlFree(attvalue); - goto failed; - } - ctxt->atts = atts; - ctxt->maxatts = maxatts; - } else if (nbatts + 4 > maxatts) { - const xmlChar **n; - - maxatts *= 2; - n = (const xmlChar **) xmlRealloc((void *) atts, - maxatts * sizeof(const xmlChar *)); - if (n == NULL) { - xmlErrMemory(ctxt, NULL); - if (attvalue != NULL) - xmlFree(attvalue); - goto failed; - } - atts = n; - ctxt->atts = atts; - ctxt->maxatts = maxatts; - } - atts[nbatts++] = attname; - atts[nbatts++] = attvalue; - atts[nbatts] = NULL; - atts[nbatts + 1] = NULL; - } else { - if (attvalue != NULL) - xmlFree(attvalue); - } - -failed: - - GROW - if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) - break; - if (!IS_BLANK_CH(RAW)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "attributes construct error\n"); - } - SKIP_BLANKS; - if ((cons == ctxt->input->consumed) && (q == CUR_PTR) && - (attname == NULL) && (attvalue == NULL)) { - xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlParseStartTag: problem parsing attributes\n"); - break; - } - SHRINK; - GROW; - } - - /* - * SAX: Start of Element ! - */ - if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL) && - (!ctxt->disableSAX)) { - if (nbatts > 0) - ctxt->sax->startElement(ctxt->userData, name, atts); - else - ctxt->sax->startElement(ctxt->userData, name, NULL); - } - - if (atts != NULL) { - /* Free only the content strings */ - for (i = 1;i < nbatts;i+=2) - if (atts[i] != NULL) - xmlFree((xmlChar *) atts[i]); - } - return(name); -} - -/** - * xmlParseEndTag1: - * @ctxt: an XML parser context - * @line: line of the start tag - * @nsNr: number of namespaces on the start tag - * - * parse an end of tag - * - * [42] ETag ::= '</' Name S? '>' - * - * With namespace - * - * [NS 9] ETag ::= '</' QName S? '>' - */ - -static void -xmlParseEndTag1(xmlParserCtxtPtr ctxt, int line) { - const xmlChar *name; - - GROW; - if ((RAW != '<') || (NXT(1) != '/')) { - xmlFatalErrMsg(ctxt, XML_ERR_LTSLASH_REQUIRED, - "xmlParseEndTag: '</' not found\n"); - return; - } - SKIP(2); - - name = xmlParseNameAndCompare(ctxt,ctxt->name); - - /* - * We should definitely be at the ending "S? '>'" part - */ - GROW; - SKIP_BLANKS; - if ((!IS_BYTE_CHAR(RAW)) || (RAW != '>')) { - xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); - } else - NEXT1; - - /* - * [ WFC: Element Type Match ] - * The Name in an element's end-tag must match the element type in the - * start-tag. - * - */ - if (name != (xmlChar*)1) { - if (name == NULL) name = BAD_CAST "unparseable"; - xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_TAG_NAME_MISMATCH, - "Opening and ending tag mismatch: %s line %d and %s\n", - ctxt->name, line, name); - } - - /* - * SAX: End of Tag - */ - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->endElement(ctxt->userData, ctxt->name); - - namePop(ctxt); - spacePop(ctxt); - return; -} - -/** - * xmlParseEndTag: - * @ctxt: an XML parser context - * - * parse an end of tag - * - * [42] ETag ::= '</' Name S? '>' - * - * With namespace - * - * [NS 9] ETag ::= '</' QName S? '>' - */ - -void -xmlParseEndTag(xmlParserCtxtPtr ctxt) { - xmlParseEndTag1(ctxt, 0); -} -#endif /* LIBXML_SAX1_ENABLED */ - -/************************************************************************ - * * - * SAX 2 specific operations * - * * - ************************************************************************/ - -static const xmlChar * -xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { - int len = 0, l; - int c; - int count = 0; - - /* - * Handler for more complex cases - */ - GROW; - c = CUR_CHAR(l); - if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ - (!IS_LETTER(c) && (c != '_'))) { - return(NULL); - } - - while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ - ((IS_LETTER(c)) || (IS_DIGIT(c)) || - (c == '.') || (c == '-') || (c == '_') || - (IS_COMBINING(c)) || - (IS_EXTENDER(c)))) { - if (count++ > 100) { - count = 0; - GROW; - } - len += l; - NEXTL(l); - c = CUR_CHAR(l); - } - return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); -} - -/* - * xmlGetNamespace: - * @ctxt: an XML parser context - * @prefix: the prefix to lookup - * - * Lookup the namespace name for the @prefix (which ca be NULL) - * The prefix must come from the @ctxt->dict dictionnary - * - * Returns the namespace name or NULL if not bound - */ -static const xmlChar * -xmlGetNamespace(xmlParserCtxtPtr ctxt, const xmlChar *prefix) { - int i; - - if (prefix == ctxt->str_xml) return(ctxt->str_xml_ns); - for (i = ctxt->nsNr - 2;i >= 0;i-=2) - if (ctxt->nsTab[i] == prefix) { - if ((prefix == NULL) && (*ctxt->nsTab[i + 1] == 0)) - return(NULL); - return(ctxt->nsTab[i + 1]); - } - return(NULL); -} - -/** - * xmlParseNCName: - * @ctxt: an XML parser context - * @len: length of the string parsed - * - * parse an XML name. - * - * [4NS] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | - * CombiningChar | Extender - * - * [5NS] NCName ::= (Letter | '_') (NCNameChar)* - * - * Returns the Name parsed or NULL - */ - -static const xmlChar * -xmlParseNCName(xmlParserCtxtPtr ctxt) { - const xmlChar *in; - const xmlChar *ret; - int count = 0; - - /* - * Accelerator for simple ASCII names - */ - in = ctxt->input->cur; - if (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - (*in == '_')) { - in++; - while (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - ((*in >= 0x30) && (*in <= 0x39)) || - (*in == '_') || (*in == '-') || - (*in == '.')) - in++; - if ((*in > 0) && (*in < 0x80)) { - count = in - ctxt->input->cur; - ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); - ctxt->input->cur = in; - ctxt->nbChars += count; - ctxt->input->col += count; - if (ret == NULL) { - xmlErrMemory(ctxt, NULL); - } - return(ret); - } - } - return(xmlParseNCNameComplex(ctxt)); -} - -/** - * xmlParseQName: - * @ctxt: an XML parser context - * @prefix: pointer to store the prefix part - * - * parse an XML Namespace QName - * - * [6] QName ::= (Prefix ':')? LocalPart - * [7] Prefix ::= NCName - * [8] LocalPart ::= NCName - * - * Returns the Name parsed or NULL - */ - -static const xmlChar * -xmlParseQName(xmlParserCtxtPtr ctxt, const xmlChar **prefix) { - const xmlChar *l, *p; - - GROW; - - l = xmlParseNCName(ctxt); - if (l == NULL) { - if (CUR == ':') { - l = xmlParseName(ctxt); - if (l != NULL) { - xmlNsErr(ctxt, XML_NS_ERR_QNAME, - "Failed to parse QName '%s'\n", l, NULL, NULL); - *prefix = NULL; - return(l); - } - } - return(NULL); - } - if (CUR == ':') { - NEXT; - p = l; - l = xmlParseNCName(ctxt); - if (l == NULL) { - xmlChar *tmp; - - xmlNsErr(ctxt, XML_NS_ERR_QNAME, - "Failed to parse QName '%s:'\n", p, NULL, NULL); - tmp = xmlBuildQName(BAD_CAST "", p, NULL, 0); - p = xmlDictLookup(ctxt->dict, tmp, -1); - if (tmp != NULL) xmlFree(tmp); - *prefix = NULL; - return(p); - } - if (CUR == ':') { - xmlChar *tmp; - - xmlNsErr(ctxt, XML_NS_ERR_QNAME, - "Failed to parse QName '%s:%s:'\n", p, l, NULL); - NEXT; - tmp = (xmlChar *) xmlParseName(ctxt); - if (tmp != NULL) { - tmp = xmlBuildQName(tmp, l, NULL, 0); - l = xmlDictLookup(ctxt->dict, tmp, -1); - if (tmp != NULL) xmlFree(tmp); - *prefix = p; - return(l); - } - tmp = xmlBuildQName(BAD_CAST "", l, NULL, 0); - l = xmlDictLookup(ctxt->dict, tmp, -1); - if (tmp != NULL) xmlFree(tmp); - *prefix = p; - return(l); - } - *prefix = p; - } else - *prefix = NULL; - return(l); -} - -/** - * xmlParseQNameAndCompare: - * @ctxt: an XML parser context - * @name: the localname - * @prefix: the prefix, if any. - * - * parse an XML name and compares for match - * (specialized for endtag parsing) - * - * Returns NULL for an illegal name, (xmlChar*) 1 for success - * and the name for mismatch - */ - -static const xmlChar * -xmlParseQNameAndCompare(xmlParserCtxtPtr ctxt, xmlChar const *name, - xmlChar const *prefix) { - const xmlChar *cmp = name; - const xmlChar *in; - const xmlChar *ret; - const xmlChar *prefix2; - - if (prefix == NULL) return(xmlParseNameAndCompare(ctxt, name)); - - GROW; - in = ctxt->input->cur; - - cmp = prefix; - while (*in != 0 && *in == *cmp) { - ++in; - ++cmp; - } - if ((*cmp == 0) && (*in == ':')) { - in++; - cmp = name; - while (*in != 0 && *in == *cmp) { - ++in; - ++cmp; - } - if (*cmp == 0 && (*in == '>' || IS_BLANK_CH (*in))) { - /* success */ - ctxt->input->cur = in; - return((const xmlChar*) 1); - } - } - /* - * all strings coms from the dictionary, equality can be done directly - */ - ret = xmlParseQName (ctxt, &prefix2); - if ((ret == name) && (prefix == prefix2)) - return((const xmlChar*) 1); - return ret; -} - -/** - * xmlParseAttValueInternal: - * @ctxt: an XML parser context - * @len: attribute len result - * @alloc: whether the attribute was reallocated as a new string - * @normalize: if 1 then further non-CDATA normalization must be done - * - * parse a value for an attribute. - * NOTE: if no normalization is needed, the routine will return pointers - * directly from the data buffer. - * - * 3.3.3 Attribute-Value Normalization: - * Before the value of an attribute is passed to the application or - * checked for validity, the XML processor must normalize it as follows: - * - a character reference is processed by appending the referenced - * character to the attribute value - * - an entity reference is processed by recursively processing the - * replacement text of the entity - * - a whitespace character (#x20, #xD, #xA, #x9) is processed by - * appending #x20 to the normalized value, except that only a single - * #x20 is appended for a "#xD#xA" sequence that is part of an external - * parsed entity or the literal entity value of an internal parsed entity - * - other characters are processed by appending them to the normalized value - * If the declared value is not CDATA, then the XML processor must further - * process the normalized attribute value by discarding any leading and - * trailing space (#x20) characters, and by replacing sequences of space - * (#x20) characters by a single space (#x20) character. - * All attributes for which no declaration has been read should be treated - * by a non-validating parser as if declared CDATA. - * - * Returns the AttValue parsed or NULL. The value has to be freed by the - * caller if it was copied, this can be detected by val[*len] == 0. - */ - -static xmlChar * -xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc, - int normalize) -{ - xmlChar limit = 0; - const xmlChar *in = NULL, *start, *end, *last; - xmlChar *ret = NULL; - - GROW; - in = (xmlChar *) CUR_PTR; - if (*in != '"' && *in != '\'') { - xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL); - return (NULL); - } - ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; - - /* - * try to handle in this routine the most common case where no - * allocation of a new string is required and where content is - * pure ASCII. - */ - limit = *in++; - end = ctxt->input->end; - start = in; - if (in >= end) { - const xmlChar *oldbase = ctxt->input->base; - GROW; - if (oldbase != ctxt->input->base) { - long delta = ctxt->input->base - oldbase; - start = start + delta; - in = in + delta; - } - end = ctxt->input->end; - } - if (normalize) { - /* - * Skip any leading spaces - */ - while ((in < end) && (*in != limit) && - ((*in == 0x20) || (*in == 0x9) || - (*in == 0xA) || (*in == 0xD))) { - in++; - start = in; - if (in >= end) { - const xmlChar *oldbase = ctxt->input->base; - GROW; - if (oldbase != ctxt->input->base) { - long delta = ctxt->input->base - oldbase; - start = start + delta; - in = in + delta; - } - end = ctxt->input->end; - } - } - while ((in < end) && (*in != limit) && (*in >= 0x20) && - (*in <= 0x7f) && (*in != '&') && (*in != '<')) { - if ((*in++ == 0x20) && (*in == 0x20)) break; - if (in >= end) { - const xmlChar *oldbase = ctxt->input->base; - GROW; - if (oldbase != ctxt->input->base) { - long delta = ctxt->input->base - oldbase; - start = start + delta; - in = in + delta; - } - end = ctxt->input->end; - } - } - last = in; - /* - * skip the trailing blanks - */ - while ((last[-1] == 0x20) && (last > start)) last--; - while ((in < end) && (*in != limit) && - ((*in == 0x20) || (*in == 0x9) || - (*in == 0xA) || (*in == 0xD))) { - in++; - if (in >= end) { - const xmlChar *oldbase = ctxt->input->base; - GROW; - if (oldbase != ctxt->input->base) { - long delta = ctxt->input->base - oldbase; - start = start + delta; - in = in + delta; - last = last + delta; - } - end = ctxt->input->end; - } - } - if (*in != limit) goto need_complex; - } else { - while ((in < end) && (*in != limit) && (*in >= 0x20) && - (*in <= 0x7f) && (*in != '&') && (*in != '<')) { - in++; - if (in >= end) { - const xmlChar *oldbase = ctxt->input->base; - GROW; - if (oldbase != ctxt->input->base) { - long delta = ctxt->input->base - oldbase; - start = start + delta; - in = in + delta; - } - end = ctxt->input->end; - } - } - last = in; - if (*in != limit) goto need_complex; - } - in++; - if (len != NULL) { - *len = last - start; - ret = (xmlChar *) start; - } else { - if (alloc) *alloc = 1; - ret = xmlStrndup(start, last - start); - } - CUR_PTR = in; - if (alloc) *alloc = 0; - return ret; -need_complex: - if (alloc) *alloc = 1; - return xmlParseAttValueComplex(ctxt, len, normalize); -} - -/** - * xmlParseAttribute2: - * @ctxt: an XML parser context - * @pref: the element prefix - * @elem: the element name - * @prefix: a xmlChar ** used to store the value of the attribute prefix - * @value: a xmlChar ** used to store the value of the attribute - * @len: an int * to save the length of the attribute - * @alloc: an int * to indicate if the attribute was allocated - * - * parse an attribute in the new SAX2 framework. - * - * Returns the attribute name, and the value in *value, . - */ - -static const xmlChar * -xmlParseAttribute2(xmlParserCtxtPtr ctxt, - const xmlChar *pref, const xmlChar *elem, - const xmlChar **prefix, xmlChar **value, - int *len, int *alloc) { - const xmlChar *name; - xmlChar *val, *internal_val = NULL; - int normalize = 0; - - *value = NULL; - GROW; - name = xmlParseQName(ctxt, prefix); - if (name == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "error parsing attribute name\n"); - return(NULL); - } - - /* - * get the type if needed - */ - if (ctxt->attsSpecial != NULL) { - int type; - - type = (int) (long) xmlHashQLookup2(ctxt->attsSpecial, - pref, elem, *prefix, name); - if (type != 0) normalize = 1; - } - - /* - * read the value - */ - SKIP_BLANKS; - if (RAW == '=') { - NEXT; - SKIP_BLANKS; - val = xmlParseAttValueInternal(ctxt, len, alloc, normalize); - ctxt->instate = XML_PARSER_CONTENT; - } else { - xmlFatalErrMsgStr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, - "Specification mandate value for attribute %s\n", name); - return(NULL); - } - - if (*prefix == ctxt->str_xml) { - /* - * Check that xml:lang conforms to the specification - * No more registered as an error, just generate a warning now - * since this was deprecated in XML second edition - */ - if ((ctxt->pedantic) && (xmlStrEqual(name, BAD_CAST "lang"))) { - internal_val = xmlStrndup(val, *len); - if (!xmlCheckLanguageID(internal_val)) { - xmlWarningMsg(ctxt, XML_WAR_LANG_VALUE, - "Malformed value for xml:lang : %s\n", - internal_val, NULL); - } - } - - /* - * Check that xml:space conforms to the specification - */ - if (xmlStrEqual(name, BAD_CAST "space")) { - internal_val = xmlStrndup(val, *len); - if (xmlStrEqual(internal_val, BAD_CAST "default")) - *(ctxt->space) = 0; - else if (xmlStrEqual(internal_val, BAD_CAST "preserve")) - *(ctxt->space) = 1; - else { - xmlWarningMsg(ctxt, XML_WAR_SPACE_VALUE, -"Invalid value \"%s\" for xml:space : \"default\" or \"preserve\" expected\n", - internal_val, NULL); - } - } - if (internal_val) { - xmlFree(internal_val); - } - } - - *value = val; - return(name); -} - -/** - * xmlParseStartTag2: - * @ctxt: an XML parser context - * - * parse a start of tag either for rule element or - * EmptyElement. In both case we don't parse the tag closing chars. - * This routine is called when running SAX2 parsing - * - * [40] STag ::= '<' Name (S Attribute)* S? '>' - * - * [ WFC: Unique Att Spec ] - * No attribute name may appear more than once in the same start-tag or - * empty-element tag. - * - * [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' - * - * [ WFC: Unique Att Spec ] - * No attribute name may appear more than once in the same start-tag or - * empty-element tag. - * - * With namespace: - * - * [NS 8] STag ::= '<' QName (S Attribute)* S? '>' - * - * [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' - * - * Returns the element name parsed - */ - -static const xmlChar * -xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref, - const xmlChar **URI, int *tlen) { - const xmlChar *localname; - const xmlChar *prefix; - const xmlChar *attname; - const xmlChar *aprefix; - const xmlChar *nsname; - xmlChar *attvalue; - const xmlChar **atts = ctxt->atts; - int maxatts = ctxt->maxatts; - int nratts, nbatts, nbdef; - int i, j, nbNs, attval, oldline, oldcol; - const xmlChar *base; - unsigned long cur; - int nsNr = ctxt->nsNr; - - if (RAW != '<') return(NULL); - NEXT1; - - /* - * NOTE: it is crucial with the SAX2 API to never call SHRINK beyond that - * point since the attribute values may be stored as pointers to - * the buffer and calling SHRINK would destroy them ! - * The Shrinking is only possible once the full set of attribute - * callbacks have been done. - */ -reparse: - SHRINK; - base = ctxt->input->base; - cur = ctxt->input->cur - ctxt->input->base; - oldline = ctxt->input->line; - oldcol = ctxt->input->col; - nbatts = 0; - nratts = 0; - nbdef = 0; - nbNs = 0; - attval = 0; - /* Forget any namespaces added during an earlier parse of this element. */ - ctxt->nsNr = nsNr; - - localname = xmlParseQName(ctxt, &prefix); - if (localname == NULL) { - xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, - "StartTag: invalid element name\n"); - return(NULL); - } - *tlen = ctxt->input->cur - ctxt->input->base - cur; - - /* - * Now parse the attributes, it ends up with the ending - * - * (S Attribute)* S? - */ - SKIP_BLANKS; - GROW; - if (ctxt->input->base != base) goto base_changed; - - while ((RAW != '>') && - ((RAW != '/') || (NXT(1) != '>')) && - (IS_BYTE_CHAR(RAW))) { - const xmlChar *q = CUR_PTR; - unsigned int cons = ctxt->input->consumed; - int len = -1, alloc = 0; - - attname = xmlParseAttribute2(ctxt, prefix, localname, - &aprefix, &attvalue, &len, &alloc); - if (ctxt->input->base != base) { - if ((attvalue != NULL) && (alloc != 0)) - xmlFree(attvalue); - attvalue = NULL; - goto base_changed; - } - if ((attname != NULL) && (attvalue != NULL)) { - if (len < 0) len = xmlStrlen(attvalue); - if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) { - const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); - xmlURIPtr uri; - - if (*URL != 0) { - uri = xmlParseURI((const char *) URL); - if (uri == NULL) { - xmlWarningMsg(ctxt, XML_WAR_NS_URI, - "xmlns: %s not a valid URI\n", - URL, NULL); - } else { - if (uri->scheme == NULL) { - xmlWarningMsg(ctxt, XML_WAR_NS_URI_RELATIVE, - "xmlns: URI %s is not absolute\n", - URL, NULL); - } - xmlFreeURI(uri); - } - } - /* - * check that it's not a defined namespace - */ - for (j = 1;j <= nbNs;j++) - if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) - break; - if (j <= nbNs) - xmlErrAttributeDup(ctxt, NULL, attname); - else - if (nsPush(ctxt, NULL, URL) > 0) nbNs++; - if (alloc != 0) xmlFree(attvalue); - SKIP_BLANKS; - continue; - } - if (aprefix == ctxt->str_xmlns) { - const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); - xmlURIPtr uri; - - if (attname == ctxt->str_xml) { - if (URL != ctxt->str_xml_ns) { - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, - "xml namespace prefix mapped to wrong URI\n", - NULL, NULL, NULL); - } - /* - * Do not keep a namespace definition node - */ - if (alloc != 0) xmlFree(attvalue); - SKIP_BLANKS; - continue; - } - uri = xmlParseURI((const char *) URL); - if (uri == NULL) { - xmlWarningMsg(ctxt, XML_WAR_NS_URI, - "xmlns:%s: '%s' is not a valid URI\n", - attname, URL); - } else { - if ((ctxt->pedantic) && (uri->scheme == NULL)) { - xmlWarningMsg(ctxt, XML_WAR_NS_URI_RELATIVE, - "xmlns:%s: URI %s is not absolute\n", - attname, URL); - } - xmlFreeURI(uri); - } - - /* - * check that it's not a defined namespace - */ - for (j = 1;j <= nbNs;j++) - if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) - break; - if (j <= nbNs) - xmlErrAttributeDup(ctxt, aprefix, attname); - else - if (nsPush(ctxt, attname, URL) > 0) nbNs++; - if (alloc != 0) xmlFree(attvalue); - SKIP_BLANKS; - if (ctxt->input->base != base) goto base_changed; - continue; - } - - /* - * Add the pair to atts - */ - if ((atts == NULL) || (nbatts + 5 > maxatts)) { - if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) { - if (attvalue[len] == 0) - xmlFree(attvalue); - goto failed; - } - maxatts = ctxt->maxatts; - atts = ctxt->atts; - } - ctxt->attallocs[nratts++] = alloc; - atts[nbatts++] = attname; - atts[nbatts++] = aprefix; - atts[nbatts++] = NULL; /* the URI will be fetched later */ - atts[nbatts++] = attvalue; - attvalue += len; - atts[nbatts++] = attvalue; - /* - * tag if some deallocation is needed - */ - if (alloc != 0) attval = 1; - } else { - if ((attvalue != NULL) && (attvalue[len] == 0)) - xmlFree(attvalue); - } - -failed: - - GROW - if (ctxt->input->base != base) goto base_changed; - if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) - break; - if (!IS_BLANK_CH(RAW)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "attributes construct error\n"); - break; - } - SKIP_BLANKS; - if ((cons == ctxt->input->consumed) && (q == CUR_PTR) && - (attname == NULL) && (attvalue == NULL)) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlParseStartTag: problem parsing attributes\n"); - break; - } - GROW; - if (ctxt->input->base != base) goto base_changed; - } - - /* - * The attributes defaulting - */ - if (ctxt->attsDefault != NULL) { - xmlDefAttrsPtr defaults; - - defaults = xmlHashLookup2(ctxt->attsDefault, localname, prefix); - if (defaults != NULL) { - for (i = 0;i < defaults->nbAttrs;i++) { - attname = defaults->values[4 * i]; - aprefix = defaults->values[4 * i + 1]; - - /* - * special work for namespaces defaulted defs - */ - if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) { - /* - * check that it's not a defined namespace - */ - for (j = 1;j <= nbNs;j++) - if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) - break; - if (j <= nbNs) continue; - - nsname = xmlGetNamespace(ctxt, NULL); - if (nsname != defaults->values[4 * i + 2]) { - if (nsPush(ctxt, NULL, - defaults->values[4 * i + 2]) > 0) - nbNs++; - } - } else if (aprefix == ctxt->str_xmlns) { - /* - * check that it's not a defined namespace - */ - for (j = 1;j <= nbNs;j++) - if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) - break; - if (j <= nbNs) continue; - - nsname = xmlGetNamespace(ctxt, attname); - if (nsname != defaults->values[2]) { - if (nsPush(ctxt, attname, - defaults->values[4 * i + 2]) > 0) - nbNs++; - } - } else { - /* - * check that it's not a defined attribute - */ - for (j = 0;j < nbatts;j+=5) { - if ((attname == atts[j]) && (aprefix == atts[j+1])) - break; - } - if (j < nbatts) continue; - - if ((atts == NULL) || (nbatts + 5 > maxatts)) { - if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) { - return(NULL); - } - maxatts = ctxt->maxatts; - atts = ctxt->atts; - } - atts[nbatts++] = attname; - atts[nbatts++] = aprefix; - if (aprefix == NULL) - atts[nbatts++] = NULL; - else - atts[nbatts++] = xmlGetNamespace(ctxt, aprefix); - atts[nbatts++] = defaults->values[4 * i + 2]; - atts[nbatts++] = defaults->values[4 * i + 3]; - nbdef++; - } - } - } - } - - /* - * The attributes checkings - */ - for (i = 0; i < nbatts;i += 5) { - /* - * The default namespace does not apply to attribute names. - */ - if (atts[i + 1] != NULL) { - nsname = xmlGetNamespace(ctxt, atts[i + 1]); - if (nsname == NULL) { - xmlNsErr(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, - "Namespace prefix %s for %s on %s is not defined\n", - atts[i + 1], atts[i], localname); - } - atts[i + 2] = nsname; - } else - nsname = NULL; - /* - * [ WFC: Unique Att Spec ] - * No attribute name may appear more than once in the same - * start-tag or empty-element tag. - * As extended by the Namespace in XML REC. - */ - for (j = 0; j < i;j += 5) { - if (atts[i] == atts[j]) { - if (atts[i+1] == atts[j+1]) { - xmlErrAttributeDup(ctxt, atts[i+1], atts[i]); - break; - } - if ((nsname != NULL) && (atts[j + 2] == nsname)) { - xmlNsErr(ctxt, XML_NS_ERR_ATTRIBUTE_REDEFINED, - "Namespaced Attribute %s in '%s' redefined\n", - atts[i], nsname, NULL); - break; - } - } - } - } - - nsname = xmlGetNamespace(ctxt, prefix); - if ((prefix != NULL) && (nsname == NULL)) { - xmlNsErr(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, - "Namespace prefix %s on %s is not defined\n", - prefix, localname, NULL); - } - *pref = prefix; - *URI = nsname; - - /* - * SAX: Start of Element ! - */ - if ((ctxt->sax != NULL) && (ctxt->sax->startElementNs != NULL) && - (!ctxt->disableSAX)) { - if (nbNs > 0) - ctxt->sax->startElementNs(ctxt->userData, localname, prefix, - nsname, nbNs, &ctxt->nsTab[ctxt->nsNr - 2 * nbNs], - nbatts / 5, nbdef, atts); - else - ctxt->sax->startElementNs(ctxt->userData, localname, prefix, - nsname, 0, NULL, nbatts / 5, nbdef, atts); - } - - /* - * Free up attribute allocated strings if needed - */ - if (attval != 0) { - for (i = 3,j = 0; j < nratts;i += 5,j++) - if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL)) - xmlFree((xmlChar *) atts[i]); - } - - return(localname); - -base_changed: - /* - * the attribute strings are valid iif the base didn't changed - */ - if (attval != 0) { - for (i = 3,j = 0; j < nratts;i += 5,j++) - if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL)) - xmlFree((xmlChar *) atts[i]); - } - ctxt->input->cur = ctxt->input->base + cur; - ctxt->input->line = oldline; - ctxt->input->col = oldcol; - if (ctxt->wellFormed == 1) { - goto reparse; - } - return(NULL); -} - -/** - * xmlParseEndTag2: - * @ctxt: an XML parser context - * @line: line of the start tag - * @nsNr: number of namespaces on the start tag - * - * parse an end of tag - * - * [42] ETag ::= '</' Name S? '>' - * - * With namespace - * - * [NS 9] ETag ::= '</' QName S? '>' - */ - -static void -xmlParseEndTag2(xmlParserCtxtPtr ctxt, const xmlChar *prefix, - const xmlChar *URI, int line, int nsNr, int tlen) { - const xmlChar *name; - - GROW; - if ((RAW != '<') || (NXT(1) != '/')) { - xmlFatalErr(ctxt, XML_ERR_LTSLASH_REQUIRED, NULL); - return; - } - SKIP(2); - - if ((tlen > 0) && (xmlStrncmp(ctxt->input->cur, ctxt->name, tlen) == 0)) { - if (ctxt->input->cur[tlen] == '>') { - ctxt->input->cur += tlen + 1; - goto done; - } - ctxt->input->cur += tlen; - name = (xmlChar*)1; - } else { - if (prefix == NULL) - name = xmlParseNameAndCompare(ctxt, ctxt->name); - else - name = xmlParseQNameAndCompare(ctxt, ctxt->name, prefix); - } - - /* - * We should definitely be at the ending "S? '>'" part - */ - GROW; - SKIP_BLANKS; - if ((!IS_BYTE_CHAR(RAW)) || (RAW != '>')) { - xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); - } else - NEXT1; - - /* - * [ WFC: Element Type Match ] - * The Name in an element's end-tag must match the element type in the - * start-tag. - * - */ - if (name != (xmlChar*)1) { - if (name == NULL) name = BAD_CAST "unparseable"; - xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_TAG_NAME_MISMATCH, - "Opening and ending tag mismatch: %s line %d and %s\n", - ctxt->name, line, name); - } - - /* - * SAX: End of Tag - */ -done: - if ((ctxt->sax != NULL) && (ctxt->sax->endElementNs != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->endElementNs(ctxt->userData, ctxt->name, prefix, URI); - - spacePop(ctxt); - if (nsNr != 0) - nsPop(ctxt, nsNr); - return; -} - -/** - * xmlParseCDSect: - * @ctxt: an XML parser context - * - * Parse escaped pure raw content. - * - * [18] CDSect ::= CDStart CData CDEnd - * - * [19] CDStart ::= '<![CDATA[' - * - * [20] Data ::= (Char* - (Char* ']]>' Char*)) - * - * [21] CDEnd ::= ']]>' - */ -void -xmlParseCDSect(xmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int len = 0; - int size = XML_PARSER_BUFFER_SIZE; - int r, rl; - int s, sl; - int cur, l; - int count = 0; - - /* Check 2.6.0 was NXT(0) not RAW */ - if (CMP9(CUR_PTR, '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '[')) { - SKIP(9); - } else - return; - - ctxt->instate = XML_PARSER_CDATA_SECTION; - r = CUR_CHAR(rl); - if (!IS_CHAR(r)) { - xmlFatalErr(ctxt, XML_ERR_CDATA_NOT_FINISHED, NULL); - ctxt->instate = XML_PARSER_CONTENT; - return; - } - NEXTL(rl); - s = CUR_CHAR(sl); - if (!IS_CHAR(s)) { - xmlFatalErr(ctxt, XML_ERR_CDATA_NOT_FINISHED, NULL); - ctxt->instate = XML_PARSER_CONTENT; - return; - } - NEXTL(sl); - cur = CUR_CHAR(l); - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - return; - } - while (IS_CHAR(cur) && - ((r != ']') || (s != ']') || (cur != '>'))) { - if (len + 5 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlFree(buf); - xmlErrMemory(ctxt, NULL); - return; - } - buf = tmp; - } - COPY_BUF(rl,buf,len,r); - r = s; - rl = sl; - s = cur; - sl = l; - count++; - if (count > 50) { - GROW; - count = 0; - } - NEXTL(l); - cur = CUR_CHAR(l); - } - buf[len] = 0; - ctxt->instate = XML_PARSER_CONTENT; - if (cur != '>') { - xmlFatalErrMsgStr(ctxt, XML_ERR_CDATA_NOT_FINISHED, - "CData section not finished\n%.50s\n", buf); - xmlFree(buf); - return; - } - NEXTL(l); - - /* - * OK the buffer is to be consumed as cdata. - */ - if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { - if (ctxt->sax->cdataBlock != NULL) - ctxt->sax->cdataBlock(ctxt->userData, buf, len); - else if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, buf, len); - } - xmlFree(buf); -} - -/** - * xmlParseContent: - * @ctxt: an XML parser context - * - * Parse a content: - * - * [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* - */ - -void -xmlParseContent(xmlParserCtxtPtr ctxt) { - GROW; - while ((RAW != 0) && - ((RAW != '<') || (NXT(1) != '/')) && - (ctxt->instate != XML_PARSER_EOF)) { - const xmlChar *test = CUR_PTR; - unsigned int cons = ctxt->input->consumed; - const xmlChar *cur = ctxt->input->cur; - - /* - * First case : a Processing Instruction. - */ - if ((*cur == '<') && (cur[1] == '?')) { - xmlParsePI(ctxt); - } - - /* - * Second case : a CDSection - */ - /* 2.6.0 test was *cur not RAW */ - else if (CMP9(CUR_PTR, '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '[')) { - xmlParseCDSect(ctxt); - } - - /* - * Third case : a comment - */ - else if ((*cur == '<') && (NXT(1) == '!') && - (NXT(2) == '-') && (NXT(3) == '-')) { - xmlParseComment(ctxt); - ctxt->instate = XML_PARSER_CONTENT; - } - - /* - * Fourth case : a sub-element. - */ - else if (*cur == '<') { - xmlParseElement(ctxt); - } - - /* - * Fifth case : a reference. If if has not been resolved, - * parsing returns it's Name, create the node - */ - - else if (*cur == '&') { - xmlParseReference(ctxt); - } - - /* - * Last case, text. Note that References are handled directly. - */ - else { - xmlParseCharData(ctxt, 0); - } - - GROW; - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - SHRINK; - - if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, - "detected an error in element content\n"); - ctxt->instate = XML_PARSER_EOF; - break; - } - } -} - -/** - * xmlParseElement: - * @ctxt: an XML parser context - * - * parse an XML element, this is highly recursive - * - * [39] element ::= EmptyElemTag | STag content ETag - * - * [ WFC: Element Type Match ] - * The Name in an element's end-tag must match the element type in the - * start-tag. - * - */ - -void -xmlParseElement(xmlParserCtxtPtr ctxt) { - const xmlChar *name; - const xmlChar *prefix; - const xmlChar *URI; - xmlParserNodeInfo node_info; - int line, tlen; - xmlNodePtr ret; - int nsNr = ctxt->nsNr; - - if ((unsigned int) ctxt->nameNr > xmlParserMaxDepth) { - xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR, - "Excessive depth in document: change xmlParserMaxDepth = %d\n", - xmlParserMaxDepth); - ctxt->instate = XML_PARSER_EOF; - return; - } - - /* Capture start position */ - if (ctxt->record_info) { - node_info.begin_pos = ctxt->input->consumed + - (CUR_PTR - ctxt->input->base); - node_info.begin_line = ctxt->input->line; - } - - if (ctxt->spaceNr == 0) - spacePush(ctxt, -1); - else if (*ctxt->space == -2) - spacePush(ctxt, -1); - else - spacePush(ctxt, *ctxt->space); - - line = ctxt->input->line; -#ifdef LIBXML_SAX1_ENABLED - if (ctxt->sax2) -#endif /* LIBXML_SAX1_ENABLED */ - name = xmlParseStartTag2(ctxt, &prefix, &URI, &tlen); -#ifdef LIBXML_SAX1_ENABLED - else - name = xmlParseStartTag(ctxt); -#endif /* LIBXML_SAX1_ENABLED */ - if (name == NULL) { - spacePop(ctxt); - return; - } - namePush(ctxt, name); - ret = ctxt->node; - -#ifdef LIBXML_VALID_ENABLED - /* - * [ VC: Root Element Type ] - * The Name in the document type declaration must match the element - * type of the root element. - */ - if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && - ctxt->node && (ctxt->node == ctxt->myDoc->children)) - ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); -#endif /* LIBXML_VALID_ENABLED */ - - /* - * Check for an Empty Element. - */ - if ((RAW == '/') && (NXT(1) == '>')) { - SKIP(2); - if (ctxt->sax2) { - if ((ctxt->sax != NULL) && (ctxt->sax->endElementNs != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->endElementNs(ctxt->userData, name, prefix, URI); -#ifdef LIBXML_SAX1_ENABLED - } else { - if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->endElement(ctxt->userData, name); -#endif /* LIBXML_SAX1_ENABLED */ - } - namePop(ctxt); - spacePop(ctxt); - if (nsNr != ctxt->nsNr) - nsPop(ctxt, ctxt->nsNr - nsNr); - if ( ret != NULL && ctxt->record_info ) { - node_info.end_pos = ctxt->input->consumed + - (CUR_PTR - ctxt->input->base); - node_info.end_line = ctxt->input->line; - node_info.node = ret; - xmlParserAddNodeInfo(ctxt, &node_info); - } - return; - } - if (RAW == '>') { - NEXT1; - } else { - xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_GT_REQUIRED, - "Couldn't find end of Start Tag %s line %d\n", - name, line, NULL); - - /* - * end of parsing of this node. - */ - nodePop(ctxt); - namePop(ctxt); - spacePop(ctxt); - if (nsNr != ctxt->nsNr) - nsPop(ctxt, ctxt->nsNr - nsNr); - - /* - * Capture end position and add node - */ - if ( ret != NULL && ctxt->record_info ) { - node_info.end_pos = ctxt->input->consumed + - (CUR_PTR - ctxt->input->base); - node_info.end_line = ctxt->input->line; - node_info.node = ret; - xmlParserAddNodeInfo(ctxt, &node_info); - } - return; - } - - /* - * Parse the content of the element: - */ - xmlParseContent(ctxt); - if (!IS_BYTE_CHAR(RAW)) { - xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_TAG_NOT_FINISHED, - "Premature end of data in tag %s line %d\n", - name, line, NULL); - - /* - * end of parsing of this node. - */ - nodePop(ctxt); - namePop(ctxt); - spacePop(ctxt); - if (nsNr != ctxt->nsNr) - nsPop(ctxt, ctxt->nsNr - nsNr); - return; - } - - /* - * parse the end of tag: '</' should be here. - */ - if (ctxt->sax2) { - xmlParseEndTag2(ctxt, prefix, URI, line, ctxt->nsNr - nsNr, tlen); - namePop(ctxt); - } -#ifdef LIBXML_SAX1_ENABLED - else - xmlParseEndTag1(ctxt, line); -#endif /* LIBXML_SAX1_ENABLED */ - - /* - * Capture end position and add node - */ - if ( ret != NULL && ctxt->record_info ) { - node_info.end_pos = ctxt->input->consumed + - (CUR_PTR - ctxt->input->base); - node_info.end_line = ctxt->input->line; - node_info.node = ret; - xmlParserAddNodeInfo(ctxt, &node_info); - } -} - -/** - * xmlParseVersionNum: - * @ctxt: an XML parser context - * - * parse the XML version value. - * - * [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+ - * - * Returns the string giving the XML version number, or NULL - */ -xmlChar * -xmlParseVersionNum(xmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int len = 0; - int size = 10; - xmlChar cur; - - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - cur = CUR; - while (((cur >= 'a') && (cur <= 'z')) || - ((cur >= 'A') && (cur <= 'Z')) || - ((cur >= '0') && (cur <= '9')) || - (cur == '_') || (cur == '.') || - (cur == ':') || (cur == '-')) { - if (len + 1 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - buf = tmp; - } - buf[len++] = cur; - NEXT; - cur=CUR; - } - buf[len] = 0; - return(buf); -} - -/** - * xmlParseVersionInfo: - * @ctxt: an XML parser context - * - * parse the XML version. - * - * [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ") - * - * [25] Eq ::= S? '=' S? - * - * Returns the version string, e.g. "1.0" - */ - -xmlChar * -xmlParseVersionInfo(xmlParserCtxtPtr ctxt) { - xmlChar *version = NULL; - - if (CMP7(CUR_PTR, 'v', 'e', 'r', 's', 'i', 'o', 'n')) { - SKIP(7); - SKIP_BLANKS; - if (RAW != '=') { - xmlFatalErr(ctxt, XML_ERR_EQUAL_REQUIRED, NULL); - return(NULL); - } - NEXT; - SKIP_BLANKS; - if (RAW == '"') { - NEXT; - version = xmlParseVersionNum(ctxt); - if (RAW != '"') { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_CLOSED, NULL); - } else - NEXT; - } else if (RAW == '\''){ - NEXT; - version = xmlParseVersionNum(ctxt); - if (RAW != '\'') { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_CLOSED, NULL); - } else - NEXT; - } else { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_STARTED, NULL); - } - } - return(version); -} - -/** - * xmlParseEncName: - * @ctxt: an XML parser context - * - * parse the XML encoding name - * - * [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* - * - * Returns the encoding name value or NULL - */ -xmlChar * -xmlParseEncName(xmlParserCtxtPtr ctxt) { - xmlChar *buf = NULL; - int len = 0; - int size = 10; - xmlChar cur; - - cur = CUR; - if (((cur >= 'a') && (cur <= 'z')) || - ((cur >= 'A') && (cur <= 'Z'))) { - buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); - if (buf == NULL) { - xmlErrMemory(ctxt, NULL); - return(NULL); - } - - buf[len++] = cur; - NEXT; - cur = CUR; - while (((cur >= 'a') && (cur <= 'z')) || - ((cur >= 'A') && (cur <= 'Z')) || - ((cur >= '0') && (cur <= '9')) || - (cur == '.') || (cur == '_') || - (cur == '-')) { - if (len + 1 >= size) { - xmlChar *tmp; - - size *= 2; - tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); - if (tmp == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFree(buf); - return(NULL); - } - buf = tmp; - } - buf[len++] = cur; - NEXT; - cur = CUR; - if (cur == 0) { - SHRINK; - GROW; - cur = CUR; - } - } - buf[len] = 0; - } else { - xmlFatalErr(ctxt, XML_ERR_ENCODING_NAME, NULL); - } - return(buf); -} - -/** - * xmlParseEncodingDecl: - * @ctxt: an XML parser context - * - * parse the XML encoding declaration - * - * [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") - * - * this setups the conversion filters. - * - * Returns the encoding value or NULL - */ - -const xmlChar * -xmlParseEncodingDecl(xmlParserCtxtPtr ctxt) { - xmlChar *encoding = NULL; - - SKIP_BLANKS; - if (CMP8(CUR_PTR, 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g')) { - SKIP(8); - SKIP_BLANKS; - if (RAW != '=') { - xmlFatalErr(ctxt, XML_ERR_EQUAL_REQUIRED, NULL); - return(NULL); - } - NEXT; - SKIP_BLANKS; - if (RAW == '"') { - NEXT; - encoding = xmlParseEncName(ctxt); - if (RAW != '"') { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_CLOSED, NULL); - } else - NEXT; - } else if (RAW == '\''){ - NEXT; - encoding = xmlParseEncName(ctxt); - if (RAW != '\'') { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_CLOSED, NULL); - } else - NEXT; - } else { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_STARTED, NULL); - } - /* - * UTF-16 encoding stwich has already taken place at this stage, - * more over the little-endian/big-endian selection is already done - */ - if ((encoding != NULL) && - ((!xmlStrcasecmp(encoding, BAD_CAST "UTF-16")) || - (!xmlStrcasecmp(encoding, BAD_CAST "UTF16")))) { - if (ctxt->encoding != NULL) - xmlFree((xmlChar *) ctxt->encoding); - ctxt->encoding = encoding; - } - /* - * UTF-8 encoding is handled natively - */ - else if ((encoding != NULL) && - ((!xmlStrcasecmp(encoding, BAD_CAST "UTF-8")) || - (!xmlStrcasecmp(encoding, BAD_CAST "UTF8")))) { - if (ctxt->encoding != NULL) - xmlFree((xmlChar *) ctxt->encoding); - ctxt->encoding = encoding; - } - else if (encoding != NULL) { - xmlCharEncodingHandlerPtr handler; - - if (ctxt->input->encoding != NULL) - xmlFree((xmlChar *) ctxt->input->encoding); - ctxt->input->encoding = encoding; - - handler = xmlFindCharEncodingHandler((const char *) encoding); - if (handler != NULL) { - xmlSwitchToEncoding(ctxt, handler); - } else { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "Unsupported encoding %s\n", encoding); - return(NULL); - } - } - } - return(encoding); -} - -/** - * xmlParseSDDecl: - * @ctxt: an XML parser context - * - * parse the XML standalone declaration - * - * [32] SDDecl ::= S 'standalone' Eq - * (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no')'"')) - * - * [ VC: Standalone Document Declaration ] - * TODO The standalone document declaration must have the value "no" - * if any external markup declarations contain declarations of: - * - attributes with default values, if elements to which these - * attributes apply appear in the document without specifications - * of values for these attributes, or - * - entities (other than amp, lt, gt, apos, quot), if references - * to those entities appear in the document, or - * - attributes with values subject to normalization, where the - * attribute appears in the document with a value which will change - * as a result of normalization, or - * - element types with element content, if white space occurs directly - * within any instance of those types. - * - * Returns 1 if standalone, 0 otherwise - */ - -int -xmlParseSDDecl(xmlParserCtxtPtr ctxt) { - int standalone = -1; - - SKIP_BLANKS; - if (CMP10(CUR_PTR, 's', 't', 'a', 'n', 'd', 'a', 'l', 'o', 'n', 'e')) { - SKIP(10); - SKIP_BLANKS; - if (RAW != '=') { - xmlFatalErr(ctxt, XML_ERR_EQUAL_REQUIRED, NULL); - return(standalone); - } - NEXT; - SKIP_BLANKS; - if (RAW == '\''){ - NEXT; - if ((RAW == 'n') && (NXT(1) == 'o')) { - standalone = 0; - SKIP(2); - } else if ((RAW == 'y') && (NXT(1) == 'e') && - (NXT(2) == 's')) { - standalone = 1; - SKIP(3); - } else { - xmlFatalErr(ctxt, XML_ERR_STANDALONE_VALUE, NULL); - } - if (RAW != '\'') { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_CLOSED, NULL); - } else - NEXT; - } else if (RAW == '"'){ - NEXT; - if ((RAW == 'n') && (NXT(1) == 'o')) { - standalone = 0; - SKIP(2); - } else if ((RAW == 'y') && (NXT(1) == 'e') && - (NXT(2) == 's')) { - standalone = 1; - SKIP(3); - } else { - xmlFatalErr(ctxt, XML_ERR_STANDALONE_VALUE, NULL); - } - if (RAW != '"') { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_CLOSED, NULL); - } else - NEXT; - } else { - xmlFatalErr(ctxt, XML_ERR_STRING_NOT_STARTED, NULL); - } - } - return(standalone); -} - -/** - * xmlParseXMLDecl: - * @ctxt: an XML parser context - * - * parse an XML declaration header - * - * [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' - */ - -void -xmlParseXMLDecl(xmlParserCtxtPtr ctxt) { - xmlChar *version; - - /* - * This value for standalone indicates that the document has an - * XML declaration but it does not have a standalone attribute. - * It will be overwritten later if a standalone attribute is found. - */ - ctxt->input->standalone = -2; - - /* - * We know that '<?xml' is here. - */ - SKIP(5); - - if (!IS_BLANK_CH(RAW)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "Blank needed after '<?xml'\n"); - } - SKIP_BLANKS; - - /* - * We must have the VersionInfo here. - */ - version = xmlParseVersionInfo(ctxt); - if (version == NULL) { - xmlFatalErr(ctxt, XML_ERR_VERSION_MISSING, NULL); - } else { - if (!xmlStrEqual(version, (const xmlChar *) XML_DEFAULT_VERSION)) { - /* - * TODO: Blueberry should be detected here - */ - xmlWarningMsg(ctxt, XML_WAR_UNKNOWN_VERSION, - "Unsupported version '%s'\n", - version, NULL); - } - if (ctxt->version != NULL) - xmlFree((void *) ctxt->version); - ctxt->version = version; - } - - /* - * We may have the encoding declaration - */ - if (!IS_BLANK_CH(RAW)) { - if ((RAW == '?') && (NXT(1) == '>')) { - SKIP(2); - return; - } - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Blank needed here\n"); - } - xmlParseEncodingDecl(ctxt); - if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { - /* - * The XML REC instructs us to stop parsing right here - */ - return; - } - - /* - * We may have the standalone status. - */ - if ((ctxt->input->encoding != NULL) && (!IS_BLANK_CH(RAW))) { - if ((RAW == '?') && (NXT(1) == '>')) { - SKIP(2); - return; - } - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Blank needed here\n"); - } - SKIP_BLANKS; - ctxt->input->standalone = xmlParseSDDecl(ctxt); - - SKIP_BLANKS; - if ((RAW == '?') && (NXT(1) == '>')) { - SKIP(2); - } else if (RAW == '>') { - /* Deprecated old WD ... */ - xmlFatalErr(ctxt, XML_ERR_XMLDECL_NOT_FINISHED, NULL); - NEXT; - } else { - xmlFatalErr(ctxt, XML_ERR_XMLDECL_NOT_FINISHED, NULL); - MOVETO_ENDTAG(CUR_PTR); - NEXT; - } -} - -/** - * xmlParseMisc: - * @ctxt: an XML parser context - * - * parse an XML Misc* optional field. - * - * [27] Misc ::= Comment | PI | S - */ - -void -xmlParseMisc(xmlParserCtxtPtr ctxt) { - while (((RAW == '<') && (NXT(1) == '?')) || - (CMP4(CUR_PTR, '<', '!', '-', '-')) || - IS_BLANK_CH(CUR)) { - if ((RAW == '<') && (NXT(1) == '?')) { - xmlParsePI(ctxt); - } else if (IS_BLANK_CH(CUR)) { - NEXT; - } else - xmlParseComment(ctxt); - } -} - -/** - * xmlParseDocument: - * @ctxt: an XML parser context - * - * parse an XML document (and build a tree if using the standard SAX - * interface). - * - * [1] document ::= prolog element Misc* - * - * [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? - * - * Returns 0, -1 in case of error. the parser context is augmented - * as a result of the parsing. - */ - -int -xmlParseDocument(xmlParserCtxtPtr ctxt) { - xmlChar start[4]; - xmlCharEncoding enc; - - xmlInitParser(); - - if ((ctxt == NULL) || (ctxt->input == NULL)) - return(-1); - - GROW; - - /* - * SAX: detecting the level. - */ - xmlDetectSAX2(ctxt); - - /* - * SAX: beginning of the document processing. - */ - if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) - ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); - - if ((ctxt->encoding == (const xmlChar *)XML_CHAR_ENCODING_NONE) && - ((ctxt->input->end - ctxt->input->cur) >= 4)) { - /* - * Get the 4 first bytes and decode the charset - * if enc != XML_CHAR_ENCODING_NONE - * plug some encoding conversion routines. - */ - start[0] = RAW; - start[1] = NXT(1); - start[2] = NXT(2); - start[3] = NXT(3); - enc = xmlDetectCharEncoding(&start[0], 4); - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - } - - - if (CUR == 0) { - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL); - } - - /* - * Check for the XMLDecl in the Prolog. - */ - GROW; - if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) { - - /* - * Note that we will switch encoding on the fly. - */ - xmlParseXMLDecl(ctxt); - if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { - /* - * The XML REC instructs us to stop parsing right here - */ - return(-1); - } - ctxt->standalone = ctxt->input->standalone; - SKIP_BLANKS; - } else { - ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); - } - if ((ctxt->sax) && (ctxt->sax->startDocument) && (!ctxt->disableSAX)) - ctxt->sax->startDocument(ctxt->userData); - - /* - * The Misc part of the Prolog - */ - GROW; - xmlParseMisc(ctxt); - - /* - * Then possibly doc type declaration(s) and more Misc - * (doctypedecl Misc*)? - */ - GROW; - if (CMP9(CUR_PTR, '<', '!', 'D', 'O', 'C', 'T', 'Y', 'P', 'E')) { - - ctxt->inSubset = 1; - xmlParseDocTypeDecl(ctxt); - if (RAW == '[') { - ctxt->instate = XML_PARSER_DTD; - xmlParseInternalSubset(ctxt); - } - - /* - * Create and update the external subset. - */ - ctxt->inSubset = 2; - if ((ctxt->sax != NULL) && (ctxt->sax->externalSubset != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->externalSubset(ctxt->userData, ctxt->intSubName, - ctxt->extSubSystem, ctxt->extSubURI); - ctxt->inSubset = 0; - - - ctxt->instate = XML_PARSER_PROLOG; - xmlParseMisc(ctxt); - } - - /* - * Time to start parsing the tree itself - */ - GROW; - if (RAW != '<') { - xmlFatalErrMsg(ctxt, XML_ERR_DOCUMENT_EMPTY, - "Start tag expected, '<' not found\n"); - } else { - ctxt->instate = XML_PARSER_CONTENT; - xmlParseElement(ctxt); - ctxt->instate = XML_PARSER_EPILOG; - - - /* - * The Misc part at the end - */ - xmlParseMisc(ctxt); - - if (RAW != 0) { - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); - } - ctxt->instate = XML_PARSER_EOF; - } - - /* - * SAX: end of the document processing. - */ - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - - /* - * Remove locally kept entity definitions if the tree was not built - */ - if ((ctxt->myDoc != NULL) && - (xmlStrEqual(ctxt->myDoc->version, SAX_COMPAT_MODE))) { - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - - if (! ctxt->wellFormed) { - ctxt->valid = 0; - return(-1); - } - return(0); -} - -/** - * xmlParseExtParsedEnt: - * @ctxt: an XML parser context - * - * parse a general parsed entity - * An external general parsed entity is well-formed if it matches the - * production labeled extParsedEnt. - * - * [78] extParsedEnt ::= TextDecl? content - * - * Returns 0, -1 in case of error. the parser context is augmented - * as a result of the parsing. - */ - -int -xmlParseExtParsedEnt(xmlParserCtxtPtr ctxt) { - xmlChar start[4]; - xmlCharEncoding enc; - - if ((ctxt == NULL) || (ctxt->input == NULL)) - return(-1); - - xmlDefaultSAXHandlerInit(); - - xmlDetectSAX2(ctxt); - - GROW; - - /* - * SAX: beginning of the document processing. - */ - if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) - ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); - - /* - * Get the 4 first bytes and decode the charset - * if enc != XML_CHAR_ENCODING_NONE - * plug some encoding conversion routines. - */ - if ((ctxt->input->end - ctxt->input->cur) >= 4) { - start[0] = RAW; - start[1] = NXT(1); - start[2] = NXT(2); - start[3] = NXT(3); - enc = xmlDetectCharEncoding(start, 4); - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - } - - - if (CUR == 0) { - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL); - } - - /* - * Check for the XMLDecl in the Prolog. - */ - GROW; - if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) { - - /* - * Note that we will switch encoding on the fly. - */ - xmlParseXMLDecl(ctxt); - if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { - /* - * The XML REC instructs us to stop parsing right here - */ - return(-1); - } - SKIP_BLANKS; - } else { - ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); - } - if ((ctxt->sax) && (ctxt->sax->startDocument) && (!ctxt->disableSAX)) - ctxt->sax->startDocument(ctxt->userData); - - /* - * Doing validity checking on chunk doesn't make sense - */ - ctxt->instate = XML_PARSER_CONTENT; - ctxt->validate = 0; - ctxt->loadsubset = 0; - ctxt->depth = 0; - - xmlParseContent(ctxt); - - if ((RAW == '<') && (NXT(1) == '/')) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } else if (RAW != 0) { - xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL); - } - - /* - * SAX: end of the document processing. - */ - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - - if (! ctxt->wellFormed) return(-1); - return(0); -} - -#ifdef LIBXML_PUSH_ENABLED -/************************************************************************ - * * - * Progressive parsing interfaces * - * * - ************************************************************************/ - -/** - * xmlParseLookupSequence: - * @ctxt: an XML parser context - * @first: the first char to lookup - * @next: the next char to lookup or zero - * @third: the next char to lookup or zero - * - * Try to find if a sequence (first, next, third) or just (first next) or - * (first) is available in the input stream. - * This function has a side effect of (possibly) incrementing ctxt->checkIndex - * to avoid rescanning sequences of bytes, it DOES change the state of the - * parser, do not use liberally. - * - * Returns the index to the current parsing point if the full sequence - * is available, -1 otherwise. - */ -static int -xmlParseLookupSequence(xmlParserCtxtPtr ctxt, xmlChar first, - xmlChar next, xmlChar third) { - int base, len; - xmlParserInputPtr in; - const xmlChar *buf; - - in = ctxt->input; - if (in == NULL) return(-1); - base = in->cur - in->base; - if (base < 0) return(-1); - if (ctxt->checkIndex > base) - base = ctxt->checkIndex; - if (in->buf == NULL) { - buf = in->base; - len = in->length; - } else { - buf = in->buf->buffer->content; - len = in->buf->buffer->use; - } - /* take into account the sequence length */ - if (third) len -= 2; - else if (next) len --; - for (;base < len;base++) { - if (buf[base] == first) { - if (third != 0) { - if ((buf[base + 1] != next) || - (buf[base + 2] != third)) continue; - } else if (next != 0) { - if (buf[base + 1] != next) continue; - } - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - if (next == 0) - xmlGenericError(xmlGenericErrorContext, - "PP: lookup '%c' found at %d\n", - first, base); - else if (third == 0) - xmlGenericError(xmlGenericErrorContext, - "PP: lookup '%c%c' found at %d\n", - first, next, base); - else - xmlGenericError(xmlGenericErrorContext, - "PP: lookup '%c%c%c' found at %d\n", - first, next, third, base); -#endif - return(base - (in->cur - in->base)); - } - } - ctxt->checkIndex = base; -#ifdef DEBUG_PUSH - if (next == 0) - xmlGenericError(xmlGenericErrorContext, - "PP: lookup '%c' failed\n", first); - else if (third == 0) - xmlGenericError(xmlGenericErrorContext, - "PP: lookup '%c%c' failed\n", first, next); - else - xmlGenericError(xmlGenericErrorContext, - "PP: lookup '%c%c%c' failed\n", first, next, third); -#endif - return(-1); -} - -/** - * xmlParseGetLasts: - * @ctxt: an XML parser context - * @lastlt: pointer to store the last '<' from the input - * @lastgt: pointer to store the last '>' from the input - * - * Lookup the last < and > in the current chunk - */ -static void -xmlParseGetLasts(xmlParserCtxtPtr ctxt, const xmlChar **lastlt, - const xmlChar **lastgt) { - const xmlChar *tmp; - - if ((ctxt == NULL) || (lastlt == NULL) || (lastgt == NULL)) { - xmlGenericError(xmlGenericErrorContext, - "Internal error: xmlParseGetLasts\n"); - return; - } - if ((ctxt->progressive != 0) && (ctxt->inputNr == 1)) { - tmp = ctxt->input->end; - tmp--; - while ((tmp >= ctxt->input->base) && (*tmp != '<')) tmp--; - if (tmp < ctxt->input->base) { - *lastlt = NULL; - *lastgt = NULL; - } else { - *lastlt = tmp; - tmp++; - while ((tmp < ctxt->input->end) && (*tmp != '>')) { - if (*tmp == '\'') { - tmp++; - while ((tmp < ctxt->input->end) && (*tmp != '\'')) tmp++; - if (tmp < ctxt->input->end) tmp++; - } else if (*tmp == '"') { - tmp++; - while ((tmp < ctxt->input->end) && (*tmp != '"')) tmp++; - if (tmp < ctxt->input->end) tmp++; - } else - tmp++; - } - if (tmp < ctxt->input->end) - *lastgt = tmp; - else { - tmp = *lastlt; - tmp--; - while ((tmp >= ctxt->input->base) && (*tmp != '>')) tmp--; - if (tmp >= ctxt->input->base) - *lastgt = tmp; - else - *lastgt = NULL; - } - } - } else { - *lastlt = NULL; - *lastgt = NULL; - } -} -/** - * xmlCheckCdataPush: - * @cur: pointer to the bock of characters - * @len: length of the block in bytes - * - * Check that the block of characters is okay as SCdata content [20] - * - * Returns the number of bytes to pass if okay, a negative index where an - * UTF-8 error occured otherwise - */ -static int -xmlCheckCdataPush(const xmlChar *utf, int len) { - int ix; - unsigned char c; - int codepoint; - - if ((utf == NULL) || (len <= 0)) - return(0); - - for (ix = 0; ix < len;) { /* string is 0-terminated */ - c = utf[ix]; - if ((c & 0x80) == 0x00) { /* 1-byte code, starts with 10 */ - if (c >= 0x20) - ix++; - else if ((c == 0xA) || (c == 0xD) || (c == 0x9)) - ix++; - else - return(-ix); - } else if ((c & 0xe0) == 0xc0) {/* 2-byte code, starts with 110 */ - if (ix + 2 > len) return(ix); - if ((utf[ix+1] & 0xc0 ) != 0x80) - return(-ix); - codepoint = (utf[ix] & 0x1f) << 6; - codepoint |= utf[ix+1] & 0x3f; - if (!xmlIsCharQ(codepoint)) - return(-ix); - ix += 2; - } else if ((c & 0xf0) == 0xe0) {/* 3-byte code, starts with 1110 */ - if (ix + 3 > len) return(ix); - if (((utf[ix+1] & 0xc0) != 0x80) || - ((utf[ix+2] & 0xc0) != 0x80)) - return(-ix); - codepoint = (utf[ix] & 0xf) << 12; - codepoint |= (utf[ix+1] & 0x3f) << 6; - codepoint |= utf[ix+2] & 0x3f; - if (!xmlIsCharQ(codepoint)) - return(-ix); - ix += 3; - } else if ((c & 0xf8) == 0xf0) {/* 4-byte code, starts with 11110 */ - if (ix + 4 > len) return(ix); - if (((utf[ix+1] & 0xc0) != 0x80) || - ((utf[ix+2] & 0xc0) != 0x80) || - ((utf[ix+3] & 0xc0) != 0x80)) - return(-ix); - codepoint = (utf[ix] & 0x7) << 18; - codepoint |= (utf[ix+1] & 0x3f) << 12; - codepoint |= (utf[ix+2] & 0x3f) << 6; - codepoint |= utf[ix+3] & 0x3f; - if (!xmlIsCharQ(codepoint)) - return(-ix); - ix += 4; - } else /* unknown encoding */ - return(-ix); - } - return(ix); -} - -/** - * xmlParseTryOrFinish: - * @ctxt: an XML parser context - * @terminate: last chunk indicator - * - * Try to progress on parsing - * - * Returns zero if no parsing was possible - */ -static int -xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) { - int ret = 0; - int avail, tlen; - xmlChar cur, next; - const xmlChar *lastlt, *lastgt; - - if (ctxt->input == NULL) - return(0); - -#ifdef DEBUG_PUSH - switch (ctxt->instate) { - case XML_PARSER_EOF: - xmlGenericError(xmlGenericErrorContext, - "PP: try EOF\n"); break; - case XML_PARSER_START: - xmlGenericError(xmlGenericErrorContext, - "PP: try START\n"); break; - case XML_PARSER_MISC: - xmlGenericError(xmlGenericErrorContext, - "PP: try MISC\n");break; - case XML_PARSER_COMMENT: - xmlGenericError(xmlGenericErrorContext, - "PP: try COMMENT\n");break; - case XML_PARSER_PROLOG: - xmlGenericError(xmlGenericErrorContext, - "PP: try PROLOG\n");break; - case XML_PARSER_START_TAG: - xmlGenericError(xmlGenericErrorContext, - "PP: try START_TAG\n");break; - case XML_PARSER_CONTENT: - xmlGenericError(xmlGenericErrorContext, - "PP: try CONTENT\n");break; - case XML_PARSER_CDATA_SECTION: - xmlGenericError(xmlGenericErrorContext, - "PP: try CDATA_SECTION\n");break; - case XML_PARSER_END_TAG: - xmlGenericError(xmlGenericErrorContext, - "PP: try END_TAG\n");break; - case XML_PARSER_ENTITY_DECL: - xmlGenericError(xmlGenericErrorContext, - "PP: try ENTITY_DECL\n");break; - case XML_PARSER_ENTITY_VALUE: - xmlGenericError(xmlGenericErrorContext, - "PP: try ENTITY_VALUE\n");break; - case XML_PARSER_ATTRIBUTE_VALUE: - xmlGenericError(xmlGenericErrorContext, - "PP: try ATTRIBUTE_VALUE\n");break; - case XML_PARSER_DTD: - xmlGenericError(xmlGenericErrorContext, - "PP: try DTD\n");break; - case XML_PARSER_EPILOG: - xmlGenericError(xmlGenericErrorContext, - "PP: try EPILOG\n");break; - case XML_PARSER_PI: - xmlGenericError(xmlGenericErrorContext, - "PP: try PI\n");break; - case XML_PARSER_IGNORE: - xmlGenericError(xmlGenericErrorContext, - "PP: try IGNORE\n");break; - } -#endif - - if ((ctxt->input != NULL) && - (ctxt->input->cur - ctxt->input->base > 4096)) { - xmlSHRINK(ctxt); - ctxt->checkIndex = 0; - } - xmlParseGetLasts(ctxt, &lastlt, &lastgt); - - while (1) { - if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) - return(0); - - - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - - if (ctxt->input == NULL) break; - if (ctxt->input->buf == NULL) - avail = ctxt->input->length - - (ctxt->input->cur - ctxt->input->base); - else { - /* - * If we are operating on converted input, try to flush - * remainng chars to avoid them stalling in the non-converted - * buffer. - */ - if ((ctxt->input->buf->raw != NULL) && - (ctxt->input->buf->raw->use > 0)) { - int base = ctxt->input->base - - ctxt->input->buf->buffer->content; - int current = ctxt->input->cur - ctxt->input->base; - - xmlParserInputBufferPush(ctxt->input->buf, 0, ""); - ctxt->input->base = ctxt->input->buf->buffer->content + base; - ctxt->input->cur = ctxt->input->base + current; - ctxt->input->end = - &ctxt->input->buf->buffer->content[ - ctxt->input->buf->buffer->use]; - } - avail = ctxt->input->buf->buffer->use - - (ctxt->input->cur - ctxt->input->base); - } - if (avail < 1) - goto done; - switch (ctxt->instate) { - case XML_PARSER_EOF: - /* - * Document parsing is done ! - */ - goto done; - case XML_PARSER_START: - if (ctxt->charset == XML_CHAR_ENCODING_NONE) { - xmlChar start[4]; - xmlCharEncoding enc; - - /* - * Very first chars read from the document flow. - */ - if (avail < 4) - goto done; - - /* - * Get the 4 first bytes and decode the charset - * if enc != XML_CHAR_ENCODING_NONE - * plug some encoding conversion routines, - * else xmlSwitchEncoding will set to (default) - * UTF8. - */ - start[0] = RAW; - start[1] = NXT(1); - start[2] = NXT(2); - start[3] = NXT(3); - enc = xmlDetectCharEncoding(start, 4); - xmlSwitchEncoding(ctxt, enc); - break; - } - - if (avail < 2) - goto done; - cur = ctxt->input->cur[0]; - next = ctxt->input->cur[1]; - if (cur == 0) { - if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) - ctxt->sax->setDocumentLocator(ctxt->userData, - &xmlDefaultSAXLocator); - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL); - ctxt->instate = XML_PARSER_EOF; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering EOF\n"); -#endif - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - goto done; - } - if ((cur == '<') && (next == '?')) { - /* PI or XML decl */ - if (avail < 5) return(ret); - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) - return(ret); - if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) - ctxt->sax->setDocumentLocator(ctxt->userData, - &xmlDefaultSAXLocator); - if ((ctxt->input->cur[2] == 'x') && - (ctxt->input->cur[3] == 'm') && - (ctxt->input->cur[4] == 'l') && - (IS_BLANK_CH(ctxt->input->cur[5]))) { - ret += 5; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: Parsing XML Decl\n"); -#endif - xmlParseXMLDecl(ctxt); - if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { - /* - * The XML REC instructs us to stop parsing right - * here - */ - ctxt->instate = XML_PARSER_EOF; - return(0); - } - ctxt->standalone = ctxt->input->standalone; - if ((ctxt->encoding == NULL) && - (ctxt->input->encoding != NULL)) - ctxt->encoding = xmlStrdup(ctxt->input->encoding); - if ((ctxt->sax) && (ctxt->sax->startDocument) && - (!ctxt->disableSAX)) - ctxt->sax->startDocument(ctxt->userData); - ctxt->instate = XML_PARSER_MISC; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering MISC\n"); -#endif - } else { - ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); - if ((ctxt->sax) && (ctxt->sax->startDocument) && - (!ctxt->disableSAX)) - ctxt->sax->startDocument(ctxt->userData); - ctxt->instate = XML_PARSER_MISC; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering MISC\n"); -#endif - } - } else { - if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) - ctxt->sax->setDocumentLocator(ctxt->userData, - &xmlDefaultSAXLocator); - ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); - if (ctxt->version == NULL) { - xmlErrMemory(ctxt, NULL); - break; - } - if ((ctxt->sax) && (ctxt->sax->startDocument) && - (!ctxt->disableSAX)) - ctxt->sax->startDocument(ctxt->userData); - ctxt->instate = XML_PARSER_MISC; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering MISC\n"); -#endif - } - break; - case XML_PARSER_START_TAG: { - const xmlChar *name; - const xmlChar *prefix; - const xmlChar *URI; - int nsNr = ctxt->nsNr; - - if ((avail < 2) && (ctxt->inputNr == 1)) - goto done; - cur = ctxt->input->cur[0]; - if (cur != '<') { - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL); - ctxt->instate = XML_PARSER_EOF; - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - goto done; - } - if (!terminate) { - if (ctxt->progressive) { - /* > can be found unescaped in attribute values */ - if ((lastgt == NULL) || (ctxt->input->cur >= lastgt)) - goto done; - } else if (xmlParseLookupSequence(ctxt, '>', 0, 0) < 0) { - goto done; - } - } - if (ctxt->spaceNr == 0) - spacePush(ctxt, -1); - else if (*ctxt->space == -2) - spacePush(ctxt, -1); - else - spacePush(ctxt, *ctxt->space); -#ifdef LIBXML_SAX1_ENABLED - if (ctxt->sax2) -#endif /* LIBXML_SAX1_ENABLED */ - name = xmlParseStartTag2(ctxt, &prefix, &URI, &tlen); -#ifdef LIBXML_SAX1_ENABLED - else - name = xmlParseStartTag(ctxt); -#endif /* LIBXML_SAX1_ENABLED */ - if (name == NULL) { - spacePop(ctxt); - ctxt->instate = XML_PARSER_EOF; - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - goto done; - } -#ifdef LIBXML_VALID_ENABLED - /* - * [ VC: Root Element Type ] - * The Name in the document type declaration must match - * the element type of the root element. - */ - if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && - ctxt->node && (ctxt->node == ctxt->myDoc->children)) - ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); -#endif /* LIBXML_VALID_ENABLED */ - - /* - * Check for an Empty Element. - */ - if ((RAW == '/') && (NXT(1) == '>')) { - SKIP(2); - - if (ctxt->sax2) { - if ((ctxt->sax != NULL) && - (ctxt->sax->endElementNs != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->endElementNs(ctxt->userData, name, - prefix, URI); - if (ctxt->nsNr - nsNr > 0) - nsPop(ctxt, ctxt->nsNr - nsNr); -#ifdef LIBXML_SAX1_ENABLED - } else { - if ((ctxt->sax != NULL) && - (ctxt->sax->endElement != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->endElement(ctxt->userData, name); -#endif /* LIBXML_SAX1_ENABLED */ - } - spacePop(ctxt); - if (ctxt->nameNr == 0) { - ctxt->instate = XML_PARSER_EPILOG; - } else { - ctxt->instate = XML_PARSER_CONTENT; - } - break; - } - if (RAW == '>') { - NEXT; - } else { - xmlFatalErrMsgStr(ctxt, XML_ERR_GT_REQUIRED, - "Couldn't find end of Start Tag %s\n", - name); - nodePop(ctxt); - spacePop(ctxt); - } - if (ctxt->sax2) - nameNsPush(ctxt, name, prefix, URI, ctxt->nsNr - nsNr); -#ifdef LIBXML_SAX1_ENABLED - else - namePush(ctxt, name); -#endif /* LIBXML_SAX1_ENABLED */ - - ctxt->instate = XML_PARSER_CONTENT; - break; - } - case XML_PARSER_CONTENT: { - const xmlChar *test; - unsigned int cons; - if ((avail < 2) && (ctxt->inputNr == 1)) - goto done; - cur = ctxt->input->cur[0]; - next = ctxt->input->cur[1]; - - test = CUR_PTR; - cons = ctxt->input->consumed; - if ((cur == '<') && (next == '/')) { - ctxt->instate = XML_PARSER_END_TAG; - break; - } else if ((cur == '<') && (next == '?')) { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) - goto done; - xmlParsePI(ctxt); - } else if ((cur == '<') && (next != '!')) { - ctxt->instate = XML_PARSER_START_TAG; - break; - } else if ((cur == '<') && (next == '!') && - (ctxt->input->cur[2] == '-') && - (ctxt->input->cur[3] == '-')) { - int term; - - if (avail < 4) - goto done; - ctxt->input->cur += 4; - term = xmlParseLookupSequence(ctxt, '-', '-', '>'); - ctxt->input->cur -= 4; - if ((!terminate) && (term < 0)) - goto done; - xmlParseComment(ctxt); - ctxt->instate = XML_PARSER_CONTENT; - } else if ((cur == '<') && (ctxt->input->cur[1] == '!') && - (ctxt->input->cur[2] == '[') && - (ctxt->input->cur[3] == 'C') && - (ctxt->input->cur[4] == 'D') && - (ctxt->input->cur[5] == 'A') && - (ctxt->input->cur[6] == 'T') && - (ctxt->input->cur[7] == 'A') && - (ctxt->input->cur[8] == '[')) { - SKIP(9); - ctxt->instate = XML_PARSER_CDATA_SECTION; - break; - } else if ((cur == '<') && (next == '!') && - (avail < 9)) { - goto done; - } else if (cur == '&') { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, ';', 0, 0) < 0)) - goto done; - xmlParseReference(ctxt); - } else { - /* TODO Avoid the extra copy, handle directly !!! */ - /* - * Goal of the following test is: - * - minimize calls to the SAX 'character' callback - * when they are mergeable - * - handle an problem for isBlank when we only parse - * a sequence of blank chars and the next one is - * not available to check against '<' presence. - * - tries to homogenize the differences in SAX - * callbacks between the push and pull versions - * of the parser. - */ - if ((ctxt->inputNr == 1) && - (avail < XML_PARSER_BIG_BUFFER_SIZE)) { - if (!terminate) { - if (ctxt->progressive) { - if ((lastlt == NULL) || - (ctxt->input->cur > lastlt)) - goto done; - } else if (xmlParseLookupSequence(ctxt, - '<', 0, 0) < 0) { - goto done; - } - } - } - ctxt->checkIndex = 0; - xmlParseCharData(ctxt, 0); - } - /* - * Pop-up of finished entities. - */ - while ((RAW == 0) && (ctxt->inputNr > 1)) - xmlPopInput(ctxt); - if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, - "detected an error in element content\n"); - ctxt->instate = XML_PARSER_EOF; - break; - } - break; - } - case XML_PARSER_END_TAG: - if (avail < 2) - goto done; - if (!terminate) { - if (ctxt->progressive) { - /* > can be found unescaped in attribute values */ - if ((lastgt == NULL) || (ctxt->input->cur >= lastgt)) - goto done; - } else if (xmlParseLookupSequence(ctxt, '>', 0, 0) < 0) { - goto done; - } - } - if (ctxt->sax2) { - xmlParseEndTag2(ctxt, - (void *) ctxt->pushTab[ctxt->nameNr * 3 - 3], - (void *) ctxt->pushTab[ctxt->nameNr * 3 - 2], 0, - (int) (long) ctxt->pushTab[ctxt->nameNr * 3 - 1], 0); - nameNsPop(ctxt); - } -#ifdef LIBXML_SAX1_ENABLED - else - xmlParseEndTag1(ctxt, 0); -#endif /* LIBXML_SAX1_ENABLED */ - if (ctxt->nameNr == 0) { - ctxt->instate = XML_PARSER_EPILOG; - } else { - ctxt->instate = XML_PARSER_CONTENT; - } - break; - case XML_PARSER_CDATA_SECTION: { - /* - * The Push mode need to have the SAX callback for - * cdataBlock merge back contiguous callbacks. - */ - int base; - - base = xmlParseLookupSequence(ctxt, ']', ']', '>'); - if (base < 0) { - if (avail >= XML_PARSER_BIG_BUFFER_SIZE + 2) { - int tmp; - - tmp = xmlCheckCdataPush(ctxt->input->cur, - XML_PARSER_BIG_BUFFER_SIZE); - if (tmp < 0) { - tmp = -tmp; - ctxt->input->cur += tmp; - goto encoding_error; - } - if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { - if (ctxt->sax->cdataBlock != NULL) - ctxt->sax->cdataBlock(ctxt->userData, - ctxt->input->cur, tmp); - else if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, - ctxt->input->cur, tmp); - } - SKIPL(tmp); - ctxt->checkIndex = 0; - } - goto done; - } else { - int tmp; - - tmp = xmlCheckCdataPush(ctxt->input->cur, base); - if ((tmp < 0) || (tmp != base)) { - tmp = -tmp; - ctxt->input->cur += tmp; - goto encoding_error; - } - if ((ctxt->sax != NULL) && (base > 0) && - (!ctxt->disableSAX)) { - if (ctxt->sax->cdataBlock != NULL) - ctxt->sax->cdataBlock(ctxt->userData, - ctxt->input->cur, base); - else if (ctxt->sax->characters != NULL) - ctxt->sax->characters(ctxt->userData, - ctxt->input->cur, base); - } - SKIPL(base + 3); - ctxt->checkIndex = 0; - ctxt->instate = XML_PARSER_CONTENT; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering CONTENT\n"); -#endif - } - break; - } - case XML_PARSER_MISC: - SKIP_BLANKS; - if (ctxt->input->buf == NULL) - avail = ctxt->input->length - - (ctxt->input->cur - ctxt->input->base); - else - avail = ctxt->input->buf->buffer->use - - (ctxt->input->cur - ctxt->input->base); - if (avail < 2) - goto done; - cur = ctxt->input->cur[0]; - next = ctxt->input->cur[1]; - if ((cur == '<') && (next == '?')) { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: Parsing PI\n"); -#endif - xmlParsePI(ctxt); - } else if ((cur == '<') && (next == '!') && - (ctxt->input->cur[2] == '-') && - (ctxt->input->cur[3] == '-')) { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: Parsing Comment\n"); -#endif - xmlParseComment(ctxt); - ctxt->instate = XML_PARSER_MISC; - } else if ((cur == '<') && (next == '!') && - (ctxt->input->cur[2] == 'D') && - (ctxt->input->cur[3] == 'O') && - (ctxt->input->cur[4] == 'C') && - (ctxt->input->cur[5] == 'T') && - (ctxt->input->cur[6] == 'Y') && - (ctxt->input->cur[7] == 'P') && - (ctxt->input->cur[8] == 'E')) { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '>', 0, 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: Parsing internal subset\n"); -#endif - ctxt->inSubset = 1; - xmlParseDocTypeDecl(ctxt); - if (RAW == '[') { - ctxt->instate = XML_PARSER_DTD; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering DTD\n"); -#endif - } else { - /* - * Create and update the external subset. - */ - ctxt->inSubset = 2; - if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && - (ctxt->sax->externalSubset != NULL)) - ctxt->sax->externalSubset(ctxt->userData, - ctxt->intSubName, ctxt->extSubSystem, - ctxt->extSubURI); - ctxt->inSubset = 0; - ctxt->instate = XML_PARSER_PROLOG; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering PROLOG\n"); -#endif - } - } else if ((cur == '<') && (next == '!') && - (avail < 9)) { - goto done; - } else { - ctxt->instate = XML_PARSER_START_TAG; - ctxt->progressive = 1; - xmlParseGetLasts(ctxt, &lastlt, &lastgt); -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering START_TAG\n"); -#endif - } - break; - case XML_PARSER_PROLOG: - SKIP_BLANKS; - if (ctxt->input->buf == NULL) - avail = ctxt->input->length - (ctxt->input->cur - ctxt->input->base); - else - avail = ctxt->input->buf->buffer->use - (ctxt->input->cur - ctxt->input->base); - if (avail < 2) - goto done; - cur = ctxt->input->cur[0]; - next = ctxt->input->cur[1]; - if ((cur == '<') && (next == '?')) { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: Parsing PI\n"); -#endif - xmlParsePI(ctxt); - } else if ((cur == '<') && (next == '!') && - (ctxt->input->cur[2] == '-') && (ctxt->input->cur[3] == '-')) { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: Parsing Comment\n"); -#endif - xmlParseComment(ctxt); - ctxt->instate = XML_PARSER_PROLOG; - } else if ((cur == '<') && (next == '!') && - (avail < 4)) { - goto done; - } else { - ctxt->instate = XML_PARSER_START_TAG; - if (ctxt->progressive == 0) - ctxt->progressive = 1; - xmlParseGetLasts(ctxt, &lastlt, &lastgt); -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering START_TAG\n"); -#endif - } - break; - case XML_PARSER_EPILOG: - SKIP_BLANKS; - if (ctxt->input->buf == NULL) - avail = ctxt->input->length - (ctxt->input->cur - ctxt->input->base); - else - avail = ctxt->input->buf->buffer->use - (ctxt->input->cur - ctxt->input->base); - if (avail < 2) - goto done; - cur = ctxt->input->cur[0]; - next = ctxt->input->cur[1]; - if ((cur == '<') && (next == '?')) { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: Parsing PI\n"); -#endif - xmlParsePI(ctxt); - ctxt->instate = XML_PARSER_EPILOG; - } else if ((cur == '<') && (next == '!') && - (ctxt->input->cur[2] == '-') && (ctxt->input->cur[3] == '-')) { - if ((!terminate) && - (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) - goto done; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: Parsing Comment\n"); -#endif - xmlParseComment(ctxt); - ctxt->instate = XML_PARSER_EPILOG; - } else if ((cur == '<') && (next == '!') && - (avail < 4)) { - goto done; - } else { - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); - ctxt->instate = XML_PARSER_EOF; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering EOF\n"); -#endif - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - goto done; - } - break; - case XML_PARSER_DTD: { - /* - * Sorry but progressive parsing of the internal subset - * is not expected to be supported. We first check that - * the full content of the internal subset is available and - * the parsing is launched only at that point. - * Internal subset ends up with "']' S? '>'" in an unescaped - * section and not in a ']]>' sequence which are conditional - * sections (whoever argued to keep that crap in XML deserve - * a place in hell !). - */ - int base, i; - xmlChar *buf; - xmlChar quote = 0; - - base = ctxt->input->cur - ctxt->input->base; - if (base < 0) return(0); - if (ctxt->checkIndex > base) - base = ctxt->checkIndex; - buf = ctxt->input->buf->buffer->content; - for (;(unsigned int) base < ctxt->input->buf->buffer->use; - base++) { - if (quote != 0) { - if (buf[base] == quote) - quote = 0; - continue; - } - if ((quote == 0) && (buf[base] == '<')) { - int found = 0; - /* special handling of comments */ - if (((unsigned int) base + 4 < - ctxt->input->buf->buffer->use) && - (buf[base + 1] == '!') && - (buf[base + 2] == '-') && - (buf[base + 3] == '-')) { - for (;(unsigned int) base + 3 < - ctxt->input->buf->buffer->use; base++) { - if ((buf[base] == '-') && - (buf[base + 1] == '-') && - (buf[base + 2] == '>')) { - found = 1; - base += 2; - break; - } - } - if (!found) { -#if 0 - fprintf(stderr, "unfinished comment\n"); -#endif - break; /* for */ - } - continue; - } - } - if (buf[base] == '"') { - quote = '"'; - continue; - } - if (buf[base] == '\'') { - quote = '\''; - continue; - } - if (buf[base] == ']') { -#if 0 - fprintf(stderr, "%c%c%c%c: ", buf[base], - buf[base + 1], buf[base + 2], buf[base + 3]); -#endif - if ((unsigned int) base +1 >= - ctxt->input->buf->buffer->use) - break; - if (buf[base + 1] == ']') { - /* conditional crap, skip both ']' ! */ - base++; - continue; - } - for (i = 1; - (unsigned int) base + i < ctxt->input->buf->buffer->use; - i++) { - if (buf[base + i] == '>') { -#if 0 - fprintf(stderr, "found\n"); -#endif - goto found_end_int_subset; - } - if (!IS_BLANK_CH(buf[base + i])) { -#if 0 - fprintf(stderr, "not found\n"); -#endif - goto not_end_of_int_subset; - } - } -#if 0 - fprintf(stderr, "end of stream\n"); -#endif - break; - - } -not_end_of_int_subset: - continue; /* for */ - } - /* - * We didn't found the end of the Internal subset - */ -#ifdef DEBUG_PUSH - if (next == 0) - xmlGenericError(xmlGenericErrorContext, - "PP: lookup of int subset end filed\n"); -#endif - goto done; - -found_end_int_subset: - xmlParseInternalSubset(ctxt); - ctxt->inSubset = 2; - if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && - (ctxt->sax->externalSubset != NULL)) - ctxt->sax->externalSubset(ctxt->userData, ctxt->intSubName, - ctxt->extSubSystem, ctxt->extSubURI); - ctxt->inSubset = 0; - ctxt->instate = XML_PARSER_PROLOG; - ctxt->checkIndex = 0; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering PROLOG\n"); -#endif - break; - } - case XML_PARSER_COMMENT: - xmlGenericError(xmlGenericErrorContext, - "PP: internal error, state == COMMENT\n"); - ctxt->instate = XML_PARSER_CONTENT; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_IGNORE: - xmlGenericError(xmlGenericErrorContext, - "PP: internal error, state == IGNORE"); - ctxt->instate = XML_PARSER_DTD; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering DTD\n"); -#endif - break; - case XML_PARSER_PI: - xmlGenericError(xmlGenericErrorContext, - "PP: internal error, state == PI\n"); - ctxt->instate = XML_PARSER_CONTENT; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering CONTENT\n"); -#endif - break; - case XML_PARSER_ENTITY_DECL: - xmlGenericError(xmlGenericErrorContext, - "PP: internal error, state == ENTITY_DECL\n"); - ctxt->instate = XML_PARSER_DTD; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering DTD\n"); -#endif - break; - case XML_PARSER_ENTITY_VALUE: - xmlGenericError(xmlGenericErrorContext, - "PP: internal error, state == ENTITY_VALUE\n"); - ctxt->instate = XML_PARSER_CONTENT; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering DTD\n"); -#endif - break; - case XML_PARSER_ATTRIBUTE_VALUE: - xmlGenericError(xmlGenericErrorContext, - "PP: internal error, state == ATTRIBUTE_VALUE\n"); - ctxt->instate = XML_PARSER_START_TAG; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering START_TAG\n"); -#endif - break; - case XML_PARSER_SYSTEM_LITERAL: - xmlGenericError(xmlGenericErrorContext, - "PP: internal error, state == SYSTEM_LITERAL\n"); - ctxt->instate = XML_PARSER_START_TAG; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering START_TAG\n"); -#endif - break; - case XML_PARSER_PUBLIC_LITERAL: - xmlGenericError(xmlGenericErrorContext, - "PP: internal error, state == PUBLIC_LITERAL\n"); - ctxt->instate = XML_PARSER_START_TAG; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, - "PP: entering START_TAG\n"); -#endif - break; - } - } -done: -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, "PP: done %d\n", ret); -#endif - return(ret); -encoding_error: - { - char buffer[150]; - - snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - ctxt->input->cur[0], ctxt->input->cur[1], - ctxt->input->cur[2], ctxt->input->cur[3]); - __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, - "Input is not proper UTF-8, indicate encoding !\n%s", - BAD_CAST buffer, NULL); - } - return(0); -} - -/** - * xmlParseChunk: - * @ctxt: an XML parser context - * @chunk: an char array - * @size: the size in byte of the chunk - * @terminate: last chunk indicator - * - * Parse a Chunk of memory - * - * Returns zero if no error, the xmlParserErrors otherwise. - */ -int -xmlParseChunk(xmlParserCtxtPtr ctxt, const char *chunk, int size, - int terminate) { - int end_in_lf = 0; - - if (ctxt == NULL) - return(XML_ERR_INTERNAL_ERROR); - if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) - return(ctxt->errNo); - if (ctxt->instate == XML_PARSER_START) - xmlDetectSAX2(ctxt); - if ((size > 0) && (chunk != NULL) && (!terminate) && - (chunk[size - 1] == '\r')) { - end_in_lf = 1; - size--; - } - if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && - (ctxt->input->buf != NULL) && (ctxt->instate != XML_PARSER_EOF)) { - int base = ctxt->input->base - ctxt->input->buf->buffer->content; - int cur = ctxt->input->cur - ctxt->input->base; - int res; - - res =xmlParserInputBufferPush(ctxt->input->buf, size, chunk); - if (res < 0) { - ctxt->errNo = XML_PARSER_EOF; - ctxt->disableSAX = 1; - return (XML_PARSER_EOF); - } - ctxt->input->base = ctxt->input->buf->buffer->content + base; - ctxt->input->cur = ctxt->input->base + cur; - ctxt->input->end = - &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer->use]; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); -#endif - - } else if (ctxt->instate != XML_PARSER_EOF) { - if ((ctxt->input != NULL) && ctxt->input->buf != NULL) { - xmlParserInputBufferPtr in = ctxt->input->buf; - if ((in->encoder != NULL) && (in->buffer != NULL) && - (in->raw != NULL)) { - int nbchars; - - nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); - if (nbchars < 0) { - /* TODO 2.6.0 */ - xmlGenericError(xmlGenericErrorContext, - "xmlParseChunk: encoder error\n"); - return(XML_ERR_INVALID_ENCODING); - } - } - } - } - xmlParseTryOrFinish(ctxt, terminate); - if ((end_in_lf == 1) && (ctxt->input != NULL) && - (ctxt->input->buf != NULL)) { - xmlParserInputBufferPush(ctxt->input->buf, 1, "\r"); - } - if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) - return(ctxt->errNo); - if (terminate) { - /* - * Check for termination - */ - int avail = 0; - - if (ctxt->input != NULL) { - if (ctxt->input->buf == NULL) - avail = ctxt->input->length - - (ctxt->input->cur - ctxt->input->base); - else - avail = ctxt->input->buf->buffer->use - - (ctxt->input->cur - ctxt->input->base); - } - - if ((ctxt->instate != XML_PARSER_EOF) && - (ctxt->instate != XML_PARSER_EPILOG)) { - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); - } - if ((ctxt->instate == XML_PARSER_EPILOG) && (avail > 0)) { - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); - } - if (ctxt->instate != XML_PARSER_EOF) { - if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) - ctxt->sax->endDocument(ctxt->userData); - } - ctxt->instate = XML_PARSER_EOF; - } - return((xmlParserErrors) ctxt->errNo); -} - -/************************************************************************ - * * - * I/O front end functions to the parser * - * * - ************************************************************************/ - -/** - * xmlCreatePushParserCtxt: - * @sax: a SAX handler - * @user_data: The user data returned on SAX callbacks - * @chunk: a pointer to an array of chars - * @size: number of chars in the array - * @filename: an optional file name or URI - * - * Create a parser context for using the XML parser in push mode. - * If @buffer and @size are non-NULL, the data is used to detect - * the encoding. The remaining characters will be parsed so they - * don't need to be fed in again through xmlParseChunk. - * To allow content encoding detection, @size should be >= 4 - * The value of @filename is used for fetching external entities - * and error/warning reports. - * - * Returns the new parser context or NULL - */ - -xmlParserCtxtPtr -xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, - const char *chunk, int size, const char *filename) { - xmlParserCtxtPtr ctxt; - xmlParserInputPtr inputStream; - xmlParserInputBufferPtr buf; - xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; - - /* - * plug some encoding conversion routines - */ - if ((chunk != NULL) && (size >= 4)) - enc = xmlDetectCharEncoding((const xmlChar *) chunk, size); - - buf = xmlAllocParserInputBuffer(enc); - if (buf == NULL) return(NULL); - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - xmlErrMemory(NULL, "creating parser: out of memory\n"); - xmlFreeParserInputBuffer(buf); - return(NULL); - } - ctxt->dictNames = 1; - ctxt->pushTab = (void **) xmlMalloc(ctxt->nameMax * 3 * sizeof(xmlChar *)); - if (ctxt->pushTab == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFreeParserInputBuffer(buf); - xmlFreeParserCtxt(ctxt); - return(NULL); - } - if (sax != NULL) { -#ifdef LIBXML_SAX1_ENABLED - if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) -#endif /* LIBXML_SAX1_ENABLED */ - xmlFree(ctxt->sax); - ctxt->sax = (xmlSAXHandlerPtr) xmlMalloc(sizeof(xmlSAXHandler)); - if (ctxt->sax == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFreeParserInputBuffer(buf); - xmlFreeParserCtxt(ctxt); - return(NULL); - } - memset(ctxt->sax, 0, sizeof(xmlSAXHandler)); - if (sax->initialized == XML_SAX2_MAGIC) - memcpy(ctxt->sax, sax, sizeof(xmlSAXHandler)); - else - memcpy(ctxt->sax, sax, sizeof(xmlSAXHandlerV1)); - if (user_data != NULL) - ctxt->userData = user_data; - } - if (filename == NULL) { - ctxt->directory = NULL; - } else { - ctxt->directory = xmlParserGetDirectory(filename); - } - - inputStream = xmlNewInputStream(ctxt); - if (inputStream == NULL) { - xmlFreeParserCtxt(ctxt); - xmlFreeParserInputBuffer(buf); - return(NULL); - } - - if (filename == NULL) - inputStream->filename = NULL; - else { - inputStream->filename = (char *) - xmlCanonicPath((const xmlChar *) filename); - if (inputStream->filename == NULL) { - xmlFreeParserCtxt(ctxt); - xmlFreeParserInputBuffer(buf); - return(NULL); - } - } - inputStream->buf = buf; - inputStream->base = inputStream->buf->buffer->content; - inputStream->cur = inputStream->buf->buffer->content; - inputStream->end = - &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; - - inputPush(ctxt, inputStream); - - /* - * If the caller didn't provide an initial 'chunk' for determining - * the encoding, we set the context to XML_CHAR_ENCODING_NONE so - * that it can be automatically determined later - */ - if ((size == 0) || (chunk == NULL)) { - ctxt->charset = XML_CHAR_ENCODING_NONE; - } else if ((ctxt->input != NULL) && (ctxt->input->buf != NULL)) { - int base = ctxt->input->base - ctxt->input->buf->buffer->content; - int cur = ctxt->input->cur - ctxt->input->base; - - xmlParserInputBufferPush(ctxt->input->buf, size, chunk); - - ctxt->input->base = ctxt->input->buf->buffer->content + base; - ctxt->input->cur = ctxt->input->base + cur; - ctxt->input->end = - &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer->use]; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); -#endif - } - - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - - return(ctxt); -} -#endif /* LIBXML_PUSH_ENABLED */ - -/** - * xmlStopParser: - * @ctxt: an XML parser context - * - * Blocks further parser processing - */ -void -xmlStopParser(xmlParserCtxtPtr ctxt) { - if (ctxt == NULL) - return; - ctxt->instate = XML_PARSER_EOF; - ctxt->disableSAX = 1; - if (ctxt->input != NULL) { - ctxt->input->cur = BAD_CAST""; - ctxt->input->base = ctxt->input->cur; - } -} - -/** - * xmlCreateIOParserCtxt: - * @sax: a SAX handler - * @user_data: The user data returned on SAX callbacks - * @ioread: an I/O read function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @enc: the charset encoding if known - * - * Create a parser context for using the XML parser with an existing - * I/O stream - * - * Returns the new parser context or NULL - */ -xmlParserCtxtPtr -xmlCreateIOParserCtxt(xmlSAXHandlerPtr sax, void *user_data, - xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, - void *ioctx, xmlCharEncoding enc) { - xmlParserCtxtPtr ctxt; - xmlParserInputPtr inputStream; - xmlParserInputBufferPtr buf; - - if (ioread == NULL) return(NULL); - - buf = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, enc); - if (buf == NULL) return(NULL); - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - xmlFreeParserInputBuffer(buf); - return(NULL); - } - if (sax != NULL) { -#ifdef LIBXML_SAX1_ENABLED - if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) -#endif /* LIBXML_SAX1_ENABLED */ - xmlFree(ctxt->sax); - ctxt->sax = (xmlSAXHandlerPtr) xmlMalloc(sizeof(xmlSAXHandler)); - if (ctxt->sax == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFreeParserCtxt(ctxt); - return(NULL); - } - memset(ctxt->sax, 0, sizeof(xmlSAXHandler)); - if (sax->initialized == XML_SAX2_MAGIC) - memcpy(ctxt->sax, sax, sizeof(xmlSAXHandler)); - else - memcpy(ctxt->sax, sax, sizeof(xmlSAXHandlerV1)); - if (user_data != NULL) - ctxt->userData = user_data; - } - - inputStream = xmlNewIOInputStream(ctxt, buf, enc); - if (inputStream == NULL) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - inputPush(ctxt, inputStream); - - return(ctxt); -} - -#ifdef LIBXML_VALID_ENABLED -/************************************************************************ - * * - * Front ends when parsing a DTD * - * * - ************************************************************************/ - -/** - * xmlIOParseDTD: - * @sax: the SAX handler block or NULL - * @input: an Input Buffer - * @enc: the charset encoding if known - * - * Load and parse a DTD - * - * Returns the resulting xmlDtdPtr or NULL in case of error. - * @input will be freed by the function in any case. - */ - -xmlDtdPtr -xmlIOParseDTD(xmlSAXHandlerPtr sax, xmlParserInputBufferPtr input, - xmlCharEncoding enc) { - xmlDtdPtr ret = NULL; - xmlParserCtxtPtr ctxt; - xmlParserInputPtr pinput = NULL; - xmlChar start[4]; - - if (input == NULL) - return(NULL); - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - xmlFreeParserInputBuffer(input); - return(NULL); - } - - /* - * Set-up the SAX context - */ - if (sax != NULL) { - if (ctxt->sax != NULL) - xmlFree(ctxt->sax); - ctxt->sax = sax; - ctxt->userData = ctxt; - } - xmlDetectSAX2(ctxt); - - /* - * generate a parser input from the I/O handler - */ - - pinput = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (pinput == NULL) { - if (sax != NULL) ctxt->sax = NULL; - xmlFreeParserInputBuffer(input); - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - /* - * plug some encoding conversion routines here. - */ - xmlPushInput(ctxt, pinput); - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - - pinput->filename = NULL; - pinput->line = 1; - pinput->col = 1; - pinput->base = ctxt->input->cur; - pinput->cur = ctxt->input->cur; - pinput->free = NULL; - - /* - * let's parse that entity knowing it's an external subset. - */ - ctxt->inSubset = 2; - ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0"); - ctxt->myDoc->extSubset = xmlNewDtd(ctxt->myDoc, BAD_CAST "none", - BAD_CAST "none", BAD_CAST "none"); - - if ((enc == XML_CHAR_ENCODING_NONE) && - ((ctxt->input->end - ctxt->input->cur) >= 4)) { - /* - * Get the 4 first bytes and decode the charset - * if enc != XML_CHAR_ENCODING_NONE - * plug some encoding conversion routines. - */ - start[0] = RAW; - start[1] = NXT(1); - start[2] = NXT(2); - start[3] = NXT(3); - enc = xmlDetectCharEncoding(start, 4); - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - } - - xmlParseExternalSubset(ctxt, BAD_CAST "none", BAD_CAST "none"); - - if (ctxt->myDoc != NULL) { - if (ctxt->wellFormed) { - ret = ctxt->myDoc->extSubset; - ctxt->myDoc->extSubset = NULL; - if (ret != NULL) { - xmlNodePtr tmp; - - ret->doc = NULL; - tmp = ret->children; - while (tmp != NULL) { - tmp->doc = NULL; - tmp = tmp->next; - } - } - } else { - ret = NULL; - } - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - if (sax != NULL) ctxt->sax = NULL; - xmlFreeParserCtxt(ctxt); - - return(ret); -} - -/** - * xmlSAXParseDTD: - * @sax: the SAX handler block - * @ExternalID: a NAME* containing the External ID of the DTD - * @SystemID: a NAME* containing the URL to the DTD - * - * Load and parse an external subset. - * - * Returns the resulting xmlDtdPtr or NULL in case of error. - */ - -xmlDtdPtr -xmlSAXParseDTD(xmlSAXHandlerPtr sax, const xmlChar *ExternalID, - const xmlChar *SystemID) { - xmlDtdPtr ret = NULL; - xmlParserCtxtPtr ctxt; - xmlParserInputPtr input = NULL; - xmlCharEncoding enc; - xmlChar* systemIdCanonic; - - if ((ExternalID == NULL) && (SystemID == NULL)) return(NULL); - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - return(NULL); - } - - /* - * Set-up the SAX context - */ - if (sax != NULL) { - if (ctxt->sax != NULL) - xmlFree(ctxt->sax); - ctxt->sax = sax; - ctxt->userData = ctxt; - } - - /* - * Canonicalise the system ID - */ - systemIdCanonic = xmlCanonicPath(SystemID); - if ((SystemID != NULL) && (systemIdCanonic == NULL)) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - /* - * Ask the Entity resolver to load the damn thing - */ - - if ((ctxt->sax != NULL) && (ctxt->sax->resolveEntity != NULL)) - input = ctxt->sax->resolveEntity(ctxt->userData, ExternalID, - systemIdCanonic); - if (input == NULL) { - if (sax != NULL) ctxt->sax = NULL; - xmlFreeParserCtxt(ctxt); - if (systemIdCanonic != NULL) - xmlFree(systemIdCanonic); - return(NULL); - } - - /* - * plug some encoding conversion routines here. - */ - xmlPushInput(ctxt, input); - if ((ctxt->input->end - ctxt->input->cur) >= 4) { - enc = xmlDetectCharEncoding(ctxt->input->cur, 4); - xmlSwitchEncoding(ctxt, enc); - } - - if (input->filename == NULL) - input->filename = (char *) systemIdCanonic; - else - xmlFree(systemIdCanonic); - input->line = 1; - input->col = 1; - input->base = ctxt->input->cur; - input->cur = ctxt->input->cur; - input->free = NULL; - - /* - * let's parse that entity knowing it's an external subset. - */ - ctxt->inSubset = 2; - ctxt->myDoc = xmlNewDoc(BAD_CAST "1.0"); - ctxt->myDoc->extSubset = xmlNewDtd(ctxt->myDoc, BAD_CAST "none", - ExternalID, SystemID); - xmlParseExternalSubset(ctxt, ExternalID, SystemID); - - if (ctxt->myDoc != NULL) { - if (ctxt->wellFormed) { - ret = ctxt->myDoc->extSubset; - ctxt->myDoc->extSubset = NULL; - if (ret != NULL) { - xmlNodePtr tmp; - - ret->doc = NULL; - tmp = ret->children; - while (tmp != NULL) { - tmp->doc = NULL; - tmp = tmp->next; - } - } - } else { - ret = NULL; - } - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - if (sax != NULL) ctxt->sax = NULL; - xmlFreeParserCtxt(ctxt); - - return(ret); -} - - -/** - * xmlParseDTD: - * @ExternalID: a NAME* containing the External ID of the DTD - * @SystemID: a NAME* containing the URL to the DTD - * - * Load and parse an external subset. - * - * Returns the resulting xmlDtdPtr or NULL in case of error. - */ - -xmlDtdPtr -xmlParseDTD(const xmlChar *ExternalID, const xmlChar *SystemID) { - return(xmlSAXParseDTD(NULL, ExternalID, SystemID)); -} -#endif /* LIBXML_VALID_ENABLED */ - -/************************************************************************ - * * - * Front ends when parsing an Entity * - * * - ************************************************************************/ - -/** - * xmlParseCtxtExternalEntity: - * @ctx: the existing parsing context - * @URL: the URL for the entity to load - * @ID: the System ID for the entity to load - * @lst: the return value for the set of parsed nodes - * - * Parse an external general entity within an existing parsing context - * An external general parsed entity is well-formed if it matches the - * production labeled extParsedEnt. - * - * [78] extParsedEnt ::= TextDecl? content - * - * Returns 0 if the entity is well formed, -1 in case of args problem and - * the parser error code otherwise - */ - -int -xmlParseCtxtExternalEntity(xmlParserCtxtPtr ctx, const xmlChar *URL, - const xmlChar *ID, xmlNodePtr *lst) { - xmlParserCtxtPtr ctxt; - xmlDocPtr newDoc; - xmlNodePtr newRoot; - xmlSAXHandlerPtr oldsax = NULL; - int ret = 0; - xmlChar start[4]; - xmlCharEncoding enc; - xmlParserInputPtr inputStream; - char *directory = NULL; - - if (ctx == NULL) return(-1); - - if (ctx->depth > 40) { - return(XML_ERR_ENTITY_LOOP); - } - - if (lst != NULL) - *lst = NULL; - if ((URL == NULL) && (ID == NULL)) - return(-1); - if (ctx->myDoc == NULL) /* @@ relax but check for dereferences */ - return(-1); - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - return(-1); - } - - ctxt->userData = ctxt; - ctxt->_private = ctx->_private; - - inputStream = xmlLoadExternalEntity((char *)URL, (char *)ID, ctxt); - if (inputStream == NULL) { - xmlFreeParserCtxt(ctxt); - return(-1); - } - - inputPush(ctxt, inputStream); - - if ((ctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory((char *)URL); - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = directory; - - oldsax = ctxt->sax; - ctxt->sax = ctx->sax; - xmlDetectSAX2(ctxt); - newDoc = xmlNewDoc(BAD_CAST "1.0"); - if (newDoc == NULL) { - xmlFreeParserCtxt(ctxt); - return(-1); - } - if (ctx->myDoc->dict) { - newDoc->dict = ctx->myDoc->dict; - xmlDictReference(newDoc->dict); - } - if (ctx->myDoc != NULL) { - newDoc->intSubset = ctx->myDoc->intSubset; - newDoc->extSubset = ctx->myDoc->extSubset; - } - if (ctx->myDoc->URL != NULL) { - newDoc->URL = xmlStrdup(ctx->myDoc->URL); - } - newRoot = xmlNewDocNode(newDoc, NULL, BAD_CAST "pseudoroot", NULL); - if (newRoot == NULL) { - ctxt->sax = oldsax; - xmlFreeParserCtxt(ctxt); - newDoc->intSubset = NULL; - newDoc->extSubset = NULL; - xmlFreeDoc(newDoc); - return(-1); - } - xmlAddChild((xmlNodePtr) newDoc, newRoot); - nodePush(ctxt, newDoc->children); - if (ctx->myDoc == NULL) { - ctxt->myDoc = newDoc; - } else { - ctxt->myDoc = ctx->myDoc; - newDoc->children->doc = ctx->myDoc; - } - - /* - * Get the 4 first bytes and decode the charset - * if enc != XML_CHAR_ENCODING_NONE - * plug some encoding conversion routines. - */ - GROW - if ((ctxt->input->end - ctxt->input->cur) >= 4) { - start[0] = RAW; - start[1] = NXT(1); - start[2] = NXT(2); - start[3] = NXT(3); - enc = xmlDetectCharEncoding(start, 4); - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - } - - /* - * Parse a possible text declaration first - */ - if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) { - xmlParseTextDecl(ctxt); - } - - /* - * Doing validity checking on chunk doesn't make sense - */ - ctxt->instate = XML_PARSER_CONTENT; - ctxt->validate = ctx->validate; - ctxt->valid = ctx->valid; - ctxt->loadsubset = ctx->loadsubset; - ctxt->depth = ctx->depth + 1; - ctxt->replaceEntities = ctx->replaceEntities; - if (ctxt->validate) { - ctxt->vctxt.error = ctx->vctxt.error; - ctxt->vctxt.warning = ctx->vctxt.warning; - } else { - ctxt->vctxt.error = NULL; - ctxt->vctxt.warning = NULL; - } - ctxt->vctxt.nodeTab = NULL; - ctxt->vctxt.nodeNr = 0; - ctxt->vctxt.nodeMax = 0; - ctxt->vctxt.node = NULL; - if (ctxt->dict != NULL) xmlDictFree(ctxt->dict); - ctxt->dict = ctx->dict; - ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); - ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); - ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); - ctxt->dictNames = ctx->dictNames; - ctxt->attsDefault = ctx->attsDefault; - ctxt->attsSpecial = ctx->attsSpecial; - ctxt->linenumbers = ctx->linenumbers; - - xmlParseContent(ctxt); - - ctx->validate = ctxt->validate; - ctx->valid = ctxt->valid; - if ((RAW == '<') && (NXT(1) == '/')) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } else if (RAW != 0) { - xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL); - } - if (ctxt->node != newDoc->children) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } - - if (!ctxt->wellFormed) { - if (ctxt->errNo == 0) - ret = 1; - else - ret = ctxt->errNo; - } else { - if (lst != NULL) { - xmlNodePtr cur; - - /* - * Return the newly created nodeset after unlinking it from - * they pseudo parent. - */ - cur = newDoc->children->children; - *lst = cur; - while (cur != NULL) { - cur->parent = NULL; - cur = cur->next; - } - newDoc->children->children = NULL; - } - ret = 0; - } - ctxt->sax = oldsax; - ctxt->dict = NULL; - ctxt->attsDefault = NULL; - ctxt->attsSpecial = NULL; - xmlFreeParserCtxt(ctxt); - newDoc->intSubset = NULL; - newDoc->extSubset = NULL; - xmlFreeDoc(newDoc); - - return(ret); -} - -/** - * xmlParseExternalEntityPrivate: - * @doc: the document the chunk pertains to - * @oldctxt: the previous parser context if available - * @sax: the SAX handler bloc (possibly NULL) - * @user_data: The user data returned on SAX callbacks (possibly NULL) - * @depth: Used for loop detection, use 0 - * @URL: the URL for the entity to load - * @ID: the System ID for the entity to load - * @list: the return value for the set of parsed nodes - * - * Private version of xmlParseExternalEntity() - * - * Returns 0 if the entity is well formed, -1 in case of args problem and - * the parser error code otherwise - */ - -static xmlParserErrors -xmlParseExternalEntityPrivate(xmlDocPtr doc, xmlParserCtxtPtr oldctxt, - xmlSAXHandlerPtr sax, - void *user_data, int depth, const xmlChar *URL, - const xmlChar *ID, xmlNodePtr *list) { - xmlParserCtxtPtr ctxt; - xmlDocPtr newDoc; - xmlNodePtr newRoot; - xmlSAXHandlerPtr oldsax = NULL; - xmlParserErrors ret = XML_ERR_OK; - xmlChar start[4]; - xmlCharEncoding enc; - - if (depth > 40) { - return(XML_ERR_ENTITY_LOOP); - } - - - - if (list != NULL) - *list = NULL; - if ((URL == NULL) && (ID == NULL)) - return(XML_ERR_INTERNAL_ERROR); - if (doc == NULL) - return(XML_ERR_INTERNAL_ERROR); - - - ctxt = xmlCreateEntityParserCtxt(URL, ID, NULL); - if (ctxt == NULL) return(XML_WAR_UNDECLARED_ENTITY); - ctxt->userData = ctxt; - if (oldctxt != NULL) { - ctxt->_private = oldctxt->_private; - ctxt->loadsubset = oldctxt->loadsubset; - ctxt->validate = oldctxt->validate; - ctxt->external = oldctxt->external; - ctxt->record_info = oldctxt->record_info; - ctxt->node_seq.maximum = oldctxt->node_seq.maximum; - ctxt->node_seq.length = oldctxt->node_seq.length; - ctxt->node_seq.buffer = oldctxt->node_seq.buffer; - } else { - /* - * Doing validity checking on chunk without context - * doesn't make sense - */ - ctxt->_private = NULL; - ctxt->validate = 0; - ctxt->external = 2; - ctxt->loadsubset = 0; - } - if (sax != NULL) { - oldsax = ctxt->sax; - ctxt->sax = sax; - if (user_data != NULL) - ctxt->userData = user_data; - } - xmlDetectSAX2(ctxt); - newDoc = xmlNewDoc(BAD_CAST "1.0"); - if (newDoc == NULL) { - ctxt->node_seq.maximum = 0; - ctxt->node_seq.length = 0; - ctxt->node_seq.buffer = NULL; - xmlFreeParserCtxt(ctxt); - return(XML_ERR_INTERNAL_ERROR); - } - newDoc->intSubset = doc->intSubset; - newDoc->extSubset = doc->extSubset; - newDoc->dict = doc->dict; - xmlDictReference(newDoc->dict); - - if (doc->URL != NULL) { - newDoc->URL = xmlStrdup(doc->URL); - } - newRoot = xmlNewDocNode(newDoc, NULL, BAD_CAST "pseudoroot", NULL); - if (newRoot == NULL) { - if (sax != NULL) - ctxt->sax = oldsax; - ctxt->node_seq.maximum = 0; - ctxt->node_seq.length = 0; - ctxt->node_seq.buffer = NULL; - xmlFreeParserCtxt(ctxt); - newDoc->intSubset = NULL; - newDoc->extSubset = NULL; - xmlFreeDoc(newDoc); - return(XML_ERR_INTERNAL_ERROR); - } - xmlAddChild((xmlNodePtr) newDoc, newRoot); - nodePush(ctxt, newDoc->children); - ctxt->myDoc = doc; - newRoot->doc = doc; - - /* - * Get the 4 first bytes and decode the charset - * if enc != XML_CHAR_ENCODING_NONE - * plug some encoding conversion routines. - */ - GROW; - if ((ctxt->input->end - ctxt->input->cur) >= 4) { - start[0] = RAW; - start[1] = NXT(1); - start[2] = NXT(2); - start[3] = NXT(3); - enc = xmlDetectCharEncoding(start, 4); - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - } - - /* - * Parse a possible text declaration first - */ - if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) { - xmlParseTextDecl(ctxt); - } - - ctxt->instate = XML_PARSER_CONTENT; - ctxt->depth = depth; - - xmlParseContent(ctxt); - - if ((RAW == '<') && (NXT(1) == '/')) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } else if (RAW != 0) { - xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL); - } - if (ctxt->node != newDoc->children) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } - - if (!ctxt->wellFormed) { - if (ctxt->errNo == 0) - ret = XML_ERR_INTERNAL_ERROR; - else - ret = (xmlParserErrors)ctxt->errNo; - } else { - if (list != NULL) { - xmlNodePtr cur; - - /* - * Return the newly created nodeset after unlinking it from - * they pseudo parent. - */ - cur = newDoc->children->children; - *list = cur; - while (cur != NULL) { - cur->parent = NULL; - cur = cur->next; - } - newDoc->children->children = NULL; - } - ret = XML_ERR_OK; - } - if (sax != NULL) - ctxt->sax = oldsax; - oldctxt->node_seq.maximum = ctxt->node_seq.maximum; - oldctxt->node_seq.length = ctxt->node_seq.length; - oldctxt->node_seq.buffer = ctxt->node_seq.buffer; - ctxt->node_seq.maximum = 0; - ctxt->node_seq.length = 0; - ctxt->node_seq.buffer = NULL; - xmlFreeParserCtxt(ctxt); - newDoc->intSubset = NULL; - newDoc->extSubset = NULL; - xmlFreeDoc(newDoc); - - return(ret); -} - -#ifdef LIBXML_SAX1_ENABLED -/** - * xmlParseExternalEntity: - * @doc: the document the chunk pertains to - * @sax: the SAX handler bloc (possibly NULL) - * @user_data: The user data returned on SAX callbacks (possibly NULL) - * @depth: Used for loop detection, use 0 - * @URL: the URL for the entity to load - * @ID: the System ID for the entity to load - * @lst: the return value for the set of parsed nodes - * - * Parse an external general entity - * An external general parsed entity is well-formed if it matches the - * production labeled extParsedEnt. - * - * [78] extParsedEnt ::= TextDecl? content - * - * Returns 0 if the entity is well formed, -1 in case of args problem and - * the parser error code otherwise - */ - -int -xmlParseExternalEntity(xmlDocPtr doc, xmlSAXHandlerPtr sax, void *user_data, - int depth, const xmlChar *URL, const xmlChar *ID, xmlNodePtr *lst) { - return(xmlParseExternalEntityPrivate(doc, NULL, sax, user_data, depth, URL, - ID, lst)); -} - -/** - * xmlParseBalancedChunkMemory: - * @doc: the document the chunk pertains to - * @sax: the SAX handler bloc (possibly NULL) - * @user_data: The user data returned on SAX callbacks (possibly NULL) - * @depth: Used for loop detection, use 0 - * @string: the input string in UTF8 or ISO-Latin (zero terminated) - * @lst: the return value for the set of parsed nodes - * - * Parse a well-balanced chunk of an XML document - * called by the parser - * The allowed sequence for the Well Balanced Chunk is the one defined by - * the content production in the XML grammar: - * - * [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* - * - * Returns 0 if the chunk is well balanced, -1 in case of args problem and - * the parser error code otherwise - */ - -int -xmlParseBalancedChunkMemory(xmlDocPtr doc, xmlSAXHandlerPtr sax, - void *user_data, int depth, const xmlChar *string, xmlNodePtr *lst) { - return xmlParseBalancedChunkMemoryRecover( doc, sax, user_data, - depth, string, lst, 0 ); -} -#endif /* LIBXML_SAX1_ENABLED */ - -/** - * xmlParseBalancedChunkMemoryInternal: - * @oldctxt: the existing parsing context - * @string: the input string in UTF8 or ISO-Latin (zero terminated) - * @user_data: the user data field for the parser context - * @lst: the return value for the set of parsed nodes - * - * - * Parse a well-balanced chunk of an XML document - * called by the parser - * The allowed sequence for the Well Balanced Chunk is the one defined by - * the content production in the XML grammar: - * - * [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* - * - * Returns XML_ERR_OK if the chunk is well balanced, and the parser - * error code otherwise - * - * In case recover is set to 1, the nodelist will not be empty even if - * the parsed chunk is not well balanced. - */ -static xmlParserErrors -xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt, - const xmlChar *string, void *user_data, xmlNodePtr *lst) { - xmlParserCtxtPtr ctxt; - xmlDocPtr newDoc = NULL; - xmlNodePtr newRoot; - xmlSAXHandlerPtr oldsax = NULL; - xmlNodePtr content = NULL; - xmlNodePtr last = NULL; - int size; - xmlParserErrors ret = XML_ERR_OK; - - if (oldctxt->depth > 40) { - return(XML_ERR_ENTITY_LOOP); - } - - - if (lst != NULL) - *lst = NULL; - if (string == NULL) - return(XML_ERR_INTERNAL_ERROR); - - size = xmlStrlen(string); - - ctxt = xmlCreateMemoryParserCtxt((char *) string, size); - if (ctxt == NULL) return(XML_WAR_UNDECLARED_ENTITY); - if (user_data != NULL) - ctxt->userData = user_data; - else - ctxt->userData = ctxt; - if (ctxt->dict != NULL) xmlDictFree(ctxt->dict); - ctxt->dict = oldctxt->dict; - ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); - ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); - ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); - - oldsax = ctxt->sax; - ctxt->sax = oldctxt->sax; - xmlDetectSAX2(ctxt); - ctxt->replaceEntities = oldctxt->replaceEntities; - ctxt->options = oldctxt->options; - - ctxt->_private = oldctxt->_private; - if (oldctxt->myDoc == NULL) { - newDoc = xmlNewDoc(BAD_CAST "1.0"); - if (newDoc == NULL) { - ctxt->sax = oldsax; - ctxt->dict = NULL; - xmlFreeParserCtxt(ctxt); - return(XML_ERR_INTERNAL_ERROR); - } - newDoc->dict = ctxt->dict; - xmlDictReference(newDoc->dict); - ctxt->myDoc = newDoc; - } else { - ctxt->myDoc = oldctxt->myDoc; - content = ctxt->myDoc->children; - last = ctxt->myDoc->last; - } - newRoot = xmlNewDocNode(ctxt->myDoc, NULL, BAD_CAST "pseudoroot", NULL); - if (newRoot == NULL) { - ctxt->sax = oldsax; - ctxt->dict = NULL; - xmlFreeParserCtxt(ctxt); - if (newDoc != NULL) { - xmlFreeDoc(newDoc); - } - return(XML_ERR_INTERNAL_ERROR); - } - ctxt->myDoc->children = NULL; - ctxt->myDoc->last = NULL; - xmlAddChild((xmlNodePtr) ctxt->myDoc, newRoot); - nodePush(ctxt, ctxt->myDoc->children); - ctxt->instate = XML_PARSER_CONTENT; - ctxt->depth = oldctxt->depth + 1; - - ctxt->validate = 0; - ctxt->loadsubset = oldctxt->loadsubset; - if ((oldctxt->validate) || (oldctxt->replaceEntities != 0)) { - /* - * ID/IDREF registration will be done in xmlValidateElement below - */ - ctxt->loadsubset |= XML_SKIP_IDS; - } - ctxt->dictNames = oldctxt->dictNames; - ctxt->attsDefault = oldctxt->attsDefault; - ctxt->attsSpecial = oldctxt->attsSpecial; - - xmlParseContent(ctxt); - if ((RAW == '<') && (NXT(1) == '/')) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } else if (RAW != 0) { - xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL); - } - if (ctxt->node != ctxt->myDoc->children) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } - - if (!ctxt->wellFormed) { - if (ctxt->errNo == 0) - ret = XML_ERR_INTERNAL_ERROR; - else - ret = (xmlParserErrors)ctxt->errNo; - } else { - ret = XML_ERR_OK; - } - - if ((lst != NULL) && (ret == XML_ERR_OK)) { - xmlNodePtr cur; - - /* - * Return the newly created nodeset after unlinking it from - * they pseudo parent. - */ - cur = ctxt->myDoc->children->children; - *lst = cur; - while (cur != NULL) { -#ifdef LIBXML_VALID_ENABLED - if ((oldctxt->validate) && (oldctxt->wellFormed) && - (oldctxt->myDoc) && (oldctxt->myDoc->intSubset) && - (cur->type == XML_ELEMENT_NODE)) { - oldctxt->valid &= xmlValidateElement(&oldctxt->vctxt, - oldctxt->myDoc, cur); - } -#endif /* LIBXML_VALID_ENABLED */ - cur->parent = NULL; - cur = cur->next; - } - ctxt->myDoc->children->children = NULL; - } - if (ctxt->myDoc != NULL) { - xmlFreeNode(ctxt->myDoc->children); - ctxt->myDoc->children = content; - ctxt->myDoc->last = last; - } - - ctxt->sax = oldsax; - ctxt->dict = NULL; - ctxt->attsDefault = NULL; - ctxt->attsSpecial = NULL; - xmlFreeParserCtxt(ctxt); - if (newDoc != NULL) { - xmlFreeDoc(newDoc); - } - - return(ret); -} - -/** - * xmlParseInNodeContext: - * @node: the context node - * @data: the input string - * @datalen: the input string length in bytes - * @options: a combination of xmlParserOption - * @lst: the return value for the set of parsed nodes - * - * Parse a well-balanced chunk of an XML document - * within the context (DTD, namespaces, etc ...) of the given node. - * - * The allowed sequence for the data is a Well Balanced Chunk defined by - * the content production in the XML grammar: - * - * [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* - * - * Returns XML_ERR_OK if the chunk is well balanced, and the parser - * error code otherwise - */ -xmlParserErrors -xmlParseInNodeContext(xmlNodePtr node, const char *data, int datalen, - int options, xmlNodePtr *lst) { -#ifdef SAX2 - xmlParserCtxtPtr ctxt; - xmlDocPtr doc = NULL; - xmlNodePtr fake, cur; - int nsnr = 0; - - xmlParserErrors ret = XML_ERR_OK; - - /* - * check all input parameters, grab the document - */ - if ((lst == NULL) || (node == NULL) || (data == NULL) || (datalen < 0)) - return(XML_ERR_INTERNAL_ERROR); - switch (node->type) { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: - break; - default: - return(XML_ERR_INTERNAL_ERROR); - - } - while ((node != NULL) && (node->type != XML_ELEMENT_NODE) && - (node->type != XML_DOCUMENT_NODE) && - (node->type != XML_HTML_DOCUMENT_NODE)) - node = node->parent; - if (node == NULL) - return(XML_ERR_INTERNAL_ERROR); - if (node->type == XML_ELEMENT_NODE) - doc = node->doc; - else - doc = (xmlDocPtr) node; - if (doc == NULL) - return(XML_ERR_INTERNAL_ERROR); - - /* - * allocate a context and set-up everything not related to the - * node position in the tree - */ - if (doc->type == XML_DOCUMENT_NODE) - ctxt = xmlCreateMemoryParserCtxt((char *) data, datalen); -#ifdef LIBXML_HTML_ENABLED - else if (doc->type == XML_HTML_DOCUMENT_NODE) - ctxt = htmlCreateMemoryParserCtxt((char *) data, datalen); -#endif - else - return(XML_ERR_INTERNAL_ERROR); - - if (ctxt == NULL) - return(XML_ERR_NO_MEMORY); - fake = xmlNewComment(NULL); - if (fake == NULL) { - xmlFreeParserCtxt(ctxt); - return(XML_ERR_NO_MEMORY); - } - xmlAddChild(node, fake); - - /* - * Use input doc's dict if present, else assure XML_PARSE_NODICT is set. - * We need a dictionary for xmlDetectSAX2, so if there's no doc dict - * we must wait until the last moment to free the original one. - */ - if (doc->dict != NULL) { - if (ctxt->dict != NULL) - xmlDictFree(ctxt->dict); - ctxt->dict = doc->dict; - } else - options |= XML_PARSE_NODICT; - - xmlCtxtUseOptions(ctxt, options); - xmlDetectSAX2(ctxt); - ctxt->myDoc = doc; - - if (node->type == XML_ELEMENT_NODE) { - nodePush(ctxt, node); - /* - * initialize the SAX2 namespaces stack - */ - cur = node; - while ((cur != NULL) && (cur->type == XML_ELEMENT_NODE)) { - xmlNsPtr ns = cur->nsDef; - const xmlChar *iprefix, *ihref; - - while (ns != NULL) { - if (ctxt->dict) { - iprefix = xmlDictLookup(ctxt->dict, ns->prefix, -1); - ihref = xmlDictLookup(ctxt->dict, ns->href, -1); - } else { - iprefix = ns->prefix; - ihref = ns->href; - } - - if (xmlGetNamespace(ctxt, iprefix) == NULL) { - nsPush(ctxt, iprefix, ihref); - nsnr++; - } - ns = ns->next; - } - cur = cur->parent; - } - ctxt->instate = XML_PARSER_CONTENT; - } - - if ((ctxt->validate) || (ctxt->replaceEntities != 0)) { - /* - * ID/IDREF registration will be done in xmlValidateElement below - */ - ctxt->loadsubset |= XML_SKIP_IDS; - } - -#ifdef LIBXML_HTML_ENABLED - if (doc->type == XML_HTML_DOCUMENT_NODE) - __htmlParseContent(ctxt); - else -#endif - xmlParseContent(ctxt); - - nsPop(ctxt, nsnr); - if ((RAW == '<') && (NXT(1) == '/')) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } else if (RAW != 0) { - xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL); - } - if ((ctxt->node != NULL) && (ctxt->node != node)) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - ctxt->wellFormed = 0; - } - - if (!ctxt->wellFormed) { - if (ctxt->errNo == 0) - ret = XML_ERR_INTERNAL_ERROR; - else - ret = (xmlParserErrors)ctxt->errNo; - } else { - ret = XML_ERR_OK; - } - - /* - * Return the newly created nodeset after unlinking it from - * the pseudo sibling. - */ - - cur = fake->next; - fake->next = NULL; - node->last = fake; - - if (cur != NULL) { - cur->prev = NULL; - } - - *lst = cur; - - while (cur != NULL) { - cur->parent = NULL; - cur = cur->next; - } - - xmlUnlinkNode(fake); - xmlFreeNode(fake); - - - if (ret != XML_ERR_OK) { - xmlFreeNodeList(*lst); - *lst = NULL; - } - - if (doc->dict != NULL) - ctxt->dict = NULL; - xmlFreeParserCtxt(ctxt); - - return(ret); -#else /* !SAX2 */ - return(XML_ERR_INTERNAL_ERROR); -#endif -} - -#ifdef LIBXML_SAX1_ENABLED -/** - * xmlParseBalancedChunkMemoryRecover: - * @doc: the document the chunk pertains to - * @sax: the SAX handler bloc (possibly NULL) - * @user_data: The user data returned on SAX callbacks (possibly NULL) - * @depth: Used for loop detection, use 0 - * @string: the input string in UTF8 or ISO-Latin (zero terminated) - * @lst: the return value for the set of parsed nodes - * @recover: return nodes even if the data is broken (use 0) - * - * - * Parse a well-balanced chunk of an XML document - * called by the parser - * The allowed sequence for the Well Balanced Chunk is the one defined by - * the content production in the XML grammar: - * - * [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)* - * - * Returns 0 if the chunk is well balanced, -1 in case of args problem and - * the parser error code otherwise - * - * In case recover is set to 1, the nodelist will not be empty even if - * the parsed chunk is not well balanced. - */ -int -xmlParseBalancedChunkMemoryRecover(xmlDocPtr doc, xmlSAXHandlerPtr sax, - void *user_data, int depth, const xmlChar *string, xmlNodePtr *lst, - int recover) { - xmlParserCtxtPtr ctxt; - xmlDocPtr newDoc; - xmlSAXHandlerPtr oldsax = NULL; - xmlNodePtr content, newRoot; - int size; - int ret = 0; - - if (depth > 40) { - return(XML_ERR_ENTITY_LOOP); - } - - - if (lst != NULL) - *lst = NULL; - if (string == NULL) - return(-1); - - size = xmlStrlen(string); - - ctxt = xmlCreateMemoryParserCtxt((char *) string, size); - if (ctxt == NULL) return(-1); - ctxt->userData = ctxt; - if (sax != NULL) { - oldsax = ctxt->sax; - ctxt->sax = sax; - if (user_data != NULL) - ctxt->userData = user_data; - } - newDoc = xmlNewDoc(BAD_CAST "1.0"); - if (newDoc == NULL) { - xmlFreeParserCtxt(ctxt); - return(-1); - } - if ((doc != NULL) && (doc->dict != NULL)) { - xmlDictFree(ctxt->dict); - ctxt->dict = doc->dict; - xmlDictReference(ctxt->dict); - ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); - ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); - ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); - ctxt->dictNames = 1; - } else { - xmlCtxtUseOptions(ctxt, XML_PARSE_NODICT); - } - if (doc != NULL) { - newDoc->intSubset = doc->intSubset; - newDoc->extSubset = doc->extSubset; - } - newRoot = xmlNewDocNode(newDoc, NULL, BAD_CAST "pseudoroot", NULL); - if (newRoot == NULL) { - if (sax != NULL) - ctxt->sax = oldsax; - xmlFreeParserCtxt(ctxt); - newDoc->intSubset = NULL; - newDoc->extSubset = NULL; - xmlFreeDoc(newDoc); - return(-1); - } - xmlAddChild((xmlNodePtr) newDoc, newRoot); - nodePush(ctxt, newRoot); - if (doc == NULL) { - ctxt->myDoc = newDoc; - } else { - ctxt->myDoc = newDoc; - newDoc->children->doc = doc; - /* Ensure that doc has XML spec namespace */ - xmlSearchNsByHref(doc, (xmlNodePtr)doc, XML_XML_NAMESPACE); - newDoc->oldNs = doc->oldNs; - } - ctxt->instate = XML_PARSER_CONTENT; - ctxt->depth = depth; - - /* - * Doing validity checking on chunk doesn't make sense - */ - ctxt->validate = 0; - ctxt->loadsubset = 0; - xmlDetectSAX2(ctxt); - - if ( doc != NULL ){ - content = doc->children; - doc->children = NULL; - xmlParseContent(ctxt); - doc->children = content; - } - else { - xmlParseContent(ctxt); - } - if ((RAW == '<') && (NXT(1) == '/')) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } else if (RAW != 0) { - xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL); - } - if (ctxt->node != newDoc->children) { - xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); - } - - if (!ctxt->wellFormed) { - if (ctxt->errNo == 0) - ret = 1; - else - ret = ctxt->errNo; - } else { - ret = 0; - } - - if ((lst != NULL) && ((ret == 0) || (recover == 1))) { - xmlNodePtr cur; - - /* - * Return the newly created nodeset after unlinking it from - * they pseudo parent. - */ - cur = newDoc->children->children; - *lst = cur; - while (cur != NULL) { - xmlSetTreeDoc(cur, doc); - cur->parent = NULL; - cur = cur->next; - } - newDoc->children->children = NULL; - } - - if (sax != NULL) - ctxt->sax = oldsax; - xmlFreeParserCtxt(ctxt); - newDoc->intSubset = NULL; - newDoc->extSubset = NULL; - newDoc->oldNs = NULL; - xmlFreeDoc(newDoc); - - return(ret); -} - -/** - * xmlSAXParseEntity: - * @sax: the SAX handler block - * @filename: the filename - * - * parse an XML external entity out of context and build a tree. - * It use the given SAX function block to handle the parsing callback. - * If sax is NULL, fallback to the default DOM tree building routines. - * - * [78] extParsedEnt ::= TextDecl? content - * - * This correspond to a "Well Balanced" chunk - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlSAXParseEntity(xmlSAXHandlerPtr sax, const char *filename) { - xmlDocPtr ret; - xmlParserCtxtPtr ctxt; - - ctxt = xmlCreateFileParserCtxt(filename); - if (ctxt == NULL) { - return(NULL); - } - if (sax != NULL) { - if (ctxt->sax != NULL) - xmlFree(ctxt->sax); - ctxt->sax = sax; - ctxt->userData = NULL; - } - - xmlParseExtParsedEnt(ctxt); - - if (ctxt->wellFormed) - ret = ctxt->myDoc; - else { - ret = NULL; - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - if (sax != NULL) - ctxt->sax = NULL; - xmlFreeParserCtxt(ctxt); - - return(ret); -} - -/** - * xmlParseEntity: - * @filename: the filename - * - * parse an XML external entity out of context and build a tree. - * - * [78] extParsedEnt ::= TextDecl? content - * - * This correspond to a "Well Balanced" chunk - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlParseEntity(const char *filename) { - return(xmlSAXParseEntity(NULL, filename)); -} -#endif /* LIBXML_SAX1_ENABLED */ - -/** - * xmlCreateEntityParserCtxt: - * @URL: the entity URL - * @ID: the entity PUBLIC ID - * @base: a possible base for the target URI - * - * Create a parser context for an external entity - * Automatic support for ZLIB/Compress compressed document is provided - * by default if found at compile-time. - * - * Returns the new parser context or NULL - */ -xmlParserCtxtPtr -xmlCreateEntityParserCtxt(const xmlChar *URL, const xmlChar *ID, - const xmlChar *base) { - xmlParserCtxtPtr ctxt; - xmlParserInputPtr inputStream; - char *directory = NULL; - xmlChar *uri; - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - return(NULL); - } - - uri = xmlBuildURI(URL, base); - - if (uri == NULL) { - inputStream = xmlLoadExternalEntity((char *)URL, (char *)ID, ctxt); - if (inputStream == NULL) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - inputPush(ctxt, inputStream); - - if ((ctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory((char *)URL); - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = directory; - } else { - inputStream = xmlLoadExternalEntity((char *)uri, (char *)ID, ctxt); - if (inputStream == NULL) { - xmlFree(uri); - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - inputPush(ctxt, inputStream); - - if ((ctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory((char *)uri); - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = directory; - xmlFree(uri); - } - return(ctxt); -} - -/************************************************************************ - * * - * Front ends when parsing from a file * - * * - ************************************************************************/ - -/** - * xmlCreateURLParserCtxt: - * @filename: the filename or URL - * @options: a combination of xmlParserOption - * - * Create a parser context for a file or URL content. - * Automatic support for ZLIB/Compress compressed document is provided - * by default if found at compile-time and for file accesses - * - * Returns the new parser context or NULL - */ -xmlParserCtxtPtr -xmlCreateURLParserCtxt(const char *filename, int options) -{ - xmlParserCtxtPtr ctxt; - xmlParserInputPtr inputStream; - char *directory = NULL; - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - xmlErrMemory(NULL, "cannot allocate parser context"); - return(NULL); - } - - if (options) - xmlCtxtUseOptions(ctxt, options); - ctxt->linenumbers = 1; - - inputStream = xmlLoadExternalEntity(filename, NULL, ctxt); - if (inputStream == NULL) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - inputPush(ctxt, inputStream); - if ((ctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory(filename); - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = directory; - - return(ctxt); -} - -/** - * xmlCreateFileParserCtxt: - * @filename: the filename - * - * Create a parser context for a file content. - * Automatic support for ZLIB/Compress compressed document is provided - * by default if found at compile-time. - * - * Returns the new parser context or NULL - */ -xmlParserCtxtPtr -xmlCreateFileParserCtxt(const char *filename) -{ - return(xmlCreateURLParserCtxt(filename, 0)); -} - -#ifdef LIBXML_SAX1_ENABLED -/** - * xmlSAXParseFileWithData: - * @sax: the SAX handler block - * @filename: the filename - * @recovery: work in recovery mode, i.e. tries to read no Well Formed - * documents - * @data: the userdata - * - * parse an XML file and build a tree. Automatic support for ZLIB/Compress - * compressed document is provided by default if found at compile-time. - * It use the given SAX function block to handle the parsing callback. - * If sax is NULL, fallback to the default DOM tree building routines. - * - * User data (void *) is stored within the parser context in the - * context's _private member, so it is available nearly everywhere in libxml - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlSAXParseFileWithData(xmlSAXHandlerPtr sax, const char *filename, - int recovery, void *data) { - xmlDocPtr ret; - xmlParserCtxtPtr ctxt; - char *directory = NULL; - - xmlInitParser(); - - ctxt = xmlCreateFileParserCtxt(filename); - if (ctxt == NULL) { - return(NULL); - } - if (sax != NULL) { - if (ctxt->sax != NULL) - xmlFree(ctxt->sax); - ctxt->sax = sax; - } - xmlDetectSAX2(ctxt); - if (data!=NULL) { - ctxt->_private = data; - } - - if ((ctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory(filename); - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = (char *) xmlStrdup((xmlChar *) directory); - - ctxt->recovery = recovery; - - xmlParseDocument(ctxt); - - if ((ctxt->wellFormed) || recovery) { - ret = ctxt->myDoc; - if (ret != NULL) { - if (ctxt->input->buf->compressed > 0) - ret->compression = 9; - else - ret->compression = ctxt->input->buf->compressed; - } - } - else { - ret = NULL; - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - if (sax != NULL) - ctxt->sax = NULL; - xmlFreeParserCtxt(ctxt); - - return(ret); -} - -/** - * xmlSAXParseFile: - * @sax: the SAX handler block - * @filename: the filename - * @recovery: work in recovery mode, i.e. tries to read no Well Formed - * documents - * - * parse an XML file and build a tree. Automatic support for ZLIB/Compress - * compressed document is provided by default if found at compile-time. - * It use the given SAX function block to handle the parsing callback. - * If sax is NULL, fallback to the default DOM tree building routines. - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename, - int recovery) { - return(xmlSAXParseFileWithData(sax,filename,recovery,NULL)); -} - -/** - * xmlRecoverDoc: - * @cur: a pointer to an array of xmlChar - * - * parse an XML in-memory document and build a tree. - * In the case the document is not Well Formed, a tree is built anyway - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlRecoverDoc(xmlChar *cur) { - return(xmlSAXParseDoc(NULL, cur, 1)); -} - -/** - * xmlParseFile: - * @filename: the filename - * - * parse an XML file and build a tree. Automatic support for ZLIB/Compress - * compressed document is provided by default if found at compile-time. - * - * Returns the resulting document tree if the file was wellformed, - * NULL otherwise. - */ - -xmlDocPtr -xmlParseFile(const char *filename) { - return(xmlSAXParseFile(NULL, filename, 0)); -} - -/** - * xmlRecoverFile: - * @filename: the filename - * - * parse an XML file and build a tree. Automatic support for ZLIB/Compress - * compressed document is provided by default if found at compile-time. - * In the case the document is not Well Formed, a tree is built anyway - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlRecoverFile(const char *filename) { - return(xmlSAXParseFile(NULL, filename, 1)); -} - - -/** - * xmlSetupParserForBuffer: - * @ctxt: an XML parser context - * @buffer: a xmlChar * buffer - * @filename: a file name - * - * Setup the parser context to parse a new buffer; Clears any prior - * contents from the parser context. The buffer parameter must not be - * NULL, but the filename parameter can be - */ -void -xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const xmlChar* buffer, - const char* filename) -{ - xmlParserInputPtr input; - - if ((ctxt == NULL) || (buffer == NULL)) - return; - - input = xmlNewInputStream(ctxt); - if (input == NULL) { - xmlErrMemory(NULL, "parsing new buffer: out of memory\n"); - xmlClearParserCtxt(ctxt); - return; - } - - xmlClearParserCtxt(ctxt); - if (filename != NULL) - input->filename = (char *) xmlCanonicPath((const xmlChar *)filename); - input->base = buffer; - input->cur = buffer; - input->end = &buffer[xmlStrlen(buffer)]; - inputPush(ctxt, input); -} - -/** - * xmlSAXUserParseFile: - * @sax: a SAX handler - * @user_data: The user data returned on SAX callbacks - * @filename: a file name - * - * parse an XML file and call the given SAX handler routines. - * Automatic support for ZLIB/Compress compressed document is provided - * - * Returns 0 in case of success or a error number otherwise - */ -int -xmlSAXUserParseFile(xmlSAXHandlerPtr sax, void *user_data, - const char *filename) { - int ret = 0; - xmlParserCtxtPtr ctxt; - - ctxt = xmlCreateFileParserCtxt(filename); - if (ctxt == NULL) return -1; -#ifdef LIBXML_SAX1_ENABLED - if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) -#endif /* LIBXML_SAX1_ENABLED */ - xmlFree(ctxt->sax); - ctxt->sax = sax; - xmlDetectSAX2(ctxt); - - if (user_data != NULL) - ctxt->userData = user_data; - - xmlParseDocument(ctxt); - - if (ctxt->wellFormed) - ret = 0; - else { - if (ctxt->errNo != 0) - ret = ctxt->errNo; - else - ret = -1; - } - if (sax != NULL) - ctxt->sax = NULL; - if (ctxt->myDoc != NULL) { - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - xmlFreeParserCtxt(ctxt); - - return ret; -} -#endif /* LIBXML_SAX1_ENABLED */ - -/************************************************************************ - * * - * Front ends when parsing from memory * - * * - ************************************************************************/ - -/** - * xmlCreateMemoryParserCtxt: - * @buffer: a pointer to a char array - * @size: the size of the array - * - * Create a parser context for an XML in-memory document. - * - * Returns the new parser context or NULL - */ -xmlParserCtxtPtr -xmlCreateMemoryParserCtxt(const char *buffer, int size) { - xmlParserCtxtPtr ctxt; - xmlParserInputPtr input; - xmlParserInputBufferPtr buf; - - if (buffer == NULL) - return(NULL); - if (size <= 0) - return(NULL); - - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) - return(NULL); - - /* TODO: xmlParserInputBufferCreateStatic, requires some serious changes */ - buf = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); - if (buf == NULL) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - input = xmlNewInputStream(ctxt); - if (input == NULL) { - xmlFreeParserInputBuffer(buf); - xmlFreeParserCtxt(ctxt); - return(NULL); - } - - input->filename = NULL; - input->buf = buf; - input->base = input->buf->buffer->content; - input->cur = input->buf->buffer->content; - input->end = &input->buf->buffer->content[input->buf->buffer->use]; - - inputPush(ctxt, input); - return(ctxt); -} - -#ifdef LIBXML_SAX1_ENABLED -/** - * xmlSAXParseMemoryWithData: - * @sax: the SAX handler block - * @buffer: an pointer to a char array - * @size: the size of the array - * @recovery: work in recovery mode, i.e. tries to read no Well Formed - * documents - * @data: the userdata - * - * parse an XML in-memory block and use the given SAX function block - * to handle the parsing callback. If sax is NULL, fallback to the default - * DOM tree building routines. - * - * User data (void *) is stored within the parser context in the - * context's _private member, so it is available nearly everywhere in libxml - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlSAXParseMemoryWithData(xmlSAXHandlerPtr sax, const char *buffer, - int size, int recovery, void *data) { - xmlDocPtr ret; - xmlParserCtxtPtr ctxt; - - ctxt = xmlCreateMemoryParserCtxt(buffer, size); - if (ctxt == NULL) return(NULL); - if (sax != NULL) { - if (ctxt->sax != NULL) - xmlFree(ctxt->sax); - ctxt->sax = sax; - } - xmlDetectSAX2(ctxt); - if (data!=NULL) { - ctxt->_private=data; - } - - ctxt->recovery = recovery; - - xmlParseDocument(ctxt); - - if ((ctxt->wellFormed) || recovery) ret = ctxt->myDoc; - else { - ret = NULL; - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - if (sax != NULL) - ctxt->sax = NULL; - xmlFreeParserCtxt(ctxt); - - return(ret); -} - -/** - * xmlSAXParseMemory: - * @sax: the SAX handler block - * @buffer: an pointer to a char array - * @size: the size of the array - * @recovery: work in recovery mode, i.e. tries to read not Well Formed - * documents - * - * parse an XML in-memory block and use the given SAX function block - * to handle the parsing callback. If sax is NULL, fallback to the default - * DOM tree building routines. - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlSAXParseMemory(xmlSAXHandlerPtr sax, const char *buffer, - int size, int recovery) { - return xmlSAXParseMemoryWithData(sax, buffer, size, recovery, NULL); -} - -/** - * xmlParseMemory: - * @buffer: an pointer to a char array - * @size: the size of the array - * - * parse an XML in-memory block and build a tree. - * - * Returns the resulting document tree - */ - -xmlDocPtr xmlParseMemory(const char *buffer, int size) { - return(xmlSAXParseMemory(NULL, buffer, size, 0)); -} - -/** - * xmlRecoverMemory: - * @buffer: an pointer to a char array - * @size: the size of the array - * - * parse an XML in-memory block and build a tree. - * In the case the document is not Well Formed, a tree is built anyway - * - * Returns the resulting document tree - */ - -xmlDocPtr xmlRecoverMemory(const char *buffer, int size) { - return(xmlSAXParseMemory(NULL, buffer, size, 1)); -} - -/** - * xmlSAXUserParseMemory: - * @sax: a SAX handler - * @user_data: The user data returned on SAX callbacks - * @buffer: an in-memory XML document input - * @size: the length of the XML document in bytes - * - * A better SAX parsing routine. - * parse an XML in-memory buffer and call the given SAX handler routines. - * - * Returns 0 in case of success or a error number otherwise - */ -int xmlSAXUserParseMemory(xmlSAXHandlerPtr sax, void *user_data, - const char *buffer, int size) { - int ret = 0; - xmlParserCtxtPtr ctxt; - xmlSAXHandlerPtr oldsax = NULL; - - if (sax == NULL) return -1; - ctxt = xmlCreateMemoryParserCtxt(buffer, size); - if (ctxt == NULL) return -1; - oldsax = ctxt->sax; - ctxt->sax = sax; - xmlDetectSAX2(ctxt); - if (user_data != NULL) - ctxt->userData = user_data; - - xmlParseDocument(ctxt); - - if (ctxt->wellFormed) - ret = 0; - else { - if (ctxt->errNo != 0) - ret = ctxt->errNo; - else - ret = -1; - } - ctxt->sax = oldsax; - if (ctxt->myDoc != NULL) { - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - xmlFreeParserCtxt(ctxt); - - return ret; -} -#endif /* LIBXML_SAX1_ENABLED */ - -/** - * xmlCreateDocParserCtxt: - * @cur: a pointer to an array of xmlChar - * - * Creates a parser context for an XML in-memory document. - * - * Returns the new parser context or NULL - */ -xmlParserCtxtPtr -xmlCreateDocParserCtxt(const xmlChar *cur) { - int len; - - if (cur == NULL) - return(NULL); - len = xmlStrlen(cur); - return(xmlCreateMemoryParserCtxt((const char *)cur, len)); -} - -#ifdef LIBXML_SAX1_ENABLED -/** - * xmlSAXParseDoc: - * @sax: the SAX handler block - * @cur: a pointer to an array of xmlChar - * @recovery: work in recovery mode, i.e. tries to read no Well Formed - * documents - * - * parse an XML in-memory document and build a tree. - * It use the given SAX function block to handle the parsing callback. - * If sax is NULL, fallback to the default DOM tree building routines. - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlSAXParseDoc(xmlSAXHandlerPtr sax, const xmlChar *cur, int recovery) { - xmlDocPtr ret; - xmlParserCtxtPtr ctxt; - xmlSAXHandlerPtr oldsax = NULL; - - if (cur == NULL) return(NULL); - - - ctxt = xmlCreateDocParserCtxt(cur); - if (ctxt == NULL) return(NULL); - if (sax != NULL) { - oldsax = ctxt->sax; - ctxt->sax = sax; - ctxt->userData = NULL; - } - xmlDetectSAX2(ctxt); - - xmlParseDocument(ctxt); - if ((ctxt->wellFormed) || recovery) ret = ctxt->myDoc; - else { - ret = NULL; - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - if (sax != NULL) - ctxt->sax = oldsax; - xmlFreeParserCtxt(ctxt); - - return(ret); -} - -/** - * xmlParseDoc: - * @cur: a pointer to an array of xmlChar - * - * parse an XML in-memory document and build a tree. - * - * Returns the resulting document tree - */ - -xmlDocPtr -xmlParseDoc(const xmlChar *cur) { - return(xmlSAXParseDoc(NULL, cur, 0)); -} -#endif /* LIBXML_SAX1_ENABLED */ - -#ifdef LIBXML_LEGACY_ENABLED -/************************************************************************ - * * - * Specific function to keep track of entities references * - * and used by the XSLT debugger * - * * - ************************************************************************/ - -static xmlEntityReferenceFunc xmlEntityRefFunc = NULL; - -/** - * xmlAddEntityReference: - * @ent : A valid entity - * @firstNode : A valid first node for children of entity - * @lastNode : A valid last node of children entity - * - * Notify of a reference to an entity of type XML_EXTERNAL_GENERAL_PARSED_ENTITY - */ -static void -xmlAddEntityReference(xmlEntityPtr ent, xmlNodePtr firstNode, - xmlNodePtr lastNode) -{ - if (xmlEntityRefFunc != NULL) { - (*xmlEntityRefFunc) (ent, firstNode, lastNode); - } -} - - -/** - * xmlSetEntityReferenceFunc: - * @func: A valid function - * - * Set the function to call call back when a xml reference has been made - */ -void -xmlSetEntityReferenceFunc(xmlEntityReferenceFunc func) -{ - xmlEntityRefFunc = func; -} -#endif /* LIBXML_LEGACY_ENABLED */ - -/************************************************************************ - * * - * Miscellaneous * - * * - ************************************************************************/ - -#ifdef LIBXML_XPATH_ENABLED -#include <libxml/xpath.h> -#endif - -extern void XMLCDECL xmlGenericErrorDefaultFunc(void *ctx, const char *msg, ...); -static int xmlParserInitialized = 0; - -/** - * xmlInitParser: - * - * Initialization function for the XML parser. - * This is not reentrant. Call once before processing in case of - * use in multithreaded programs. - */ - -void -xmlInitParser(void) { - if (xmlParserInitialized != 0) - return; - - if ((xmlGenericError == xmlGenericErrorDefaultFunc) || - (xmlGenericError == NULL)) - initGenericErrorDefaultFunc(NULL); - xmlInitGlobals(); - xmlInitThreads(); - xmlInitMemory(); - xmlInitCharEncodingHandlers(); - xmlDefaultSAXHandlerInit(); - xmlRegisterDefaultInputCallbacks(); -#ifdef LIBXML_OUTPUT_ENABLED - xmlRegisterDefaultOutputCallbacks(); -#endif /* LIBXML_OUTPUT_ENABLED */ -#ifdef LIBXML_HTML_ENABLED - htmlInitAutoClose(); - htmlDefaultSAXHandlerInit(); -#endif -#ifdef LIBXML_XPATH_ENABLED - xmlXPathInit(); -#endif - xmlParserInitialized = 1; -} - -/** - * xmlCleanupParser: - * - * Cleanup function for the XML library. It tries to reclaim all - * parsing related global memory allocated for the library processing. - * It doesn't deallocate any document related memory. Calling this - * function should not prevent reusing the library but one should - * call xmlCleanupParser() only when the process has - * finished using the library or XML document built with it. - */ - -void -xmlCleanupParser(void) { - if (!xmlParserInitialized) - return; - - xmlCleanupCharEncodingHandlers(); -#ifdef LIBXML_CATALOG_ENABLED - xmlCatalogCleanup(); -#endif - xmlDictCleanup(); - xmlCleanupInputCallbacks(); -#ifdef LIBXML_OUTPUT_ENABLED - xmlCleanupOutputCallbacks(); -#endif -#ifdef LIBXML_SCHEMAS_ENABLED - xmlSchemaCleanupTypes(); - xmlRelaxNGCleanupTypes(); -#endif - xmlCleanupGlobals(); - xmlResetLastError(); - xmlCleanupThreads(); /* must be last if called not from the main thread */ - xmlCleanupMemory(); - xmlParserInitialized = 0; -} - -/************************************************************************ - * * - * New set (2.6.0) of simpler and more flexible APIs * - * * - ************************************************************************/ - -/** - * DICT_FREE: - * @str: a string - * - * Free a string if it is not owned by the "dict" dictionnary in the - * current scope - */ -#define DICT_FREE(str) \ - if ((str) && ((!dict) || \ - (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ - xmlFree((char *)(str)); - -/** - * xmlCtxtReset: - * @ctxt: an XML parser context - * - * Reset a parser context - */ -void -xmlCtxtReset(xmlParserCtxtPtr ctxt) -{ - xmlParserInputPtr input; - xmlDictPtr dict; - - if (ctxt == NULL) - return; - - dict = ctxt->dict; - - while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ - xmlFreeInputStream(input); - } - ctxt->inputNr = 0; - ctxt->input = NULL; - - ctxt->spaceNr = 0; - ctxt->spaceTab[0] = -1; - ctxt->space = &ctxt->spaceTab[0]; - - - ctxt->nodeNr = 0; - ctxt->node = NULL; - - ctxt->nameNr = 0; - ctxt->name = NULL; - - DICT_FREE(ctxt->version); - ctxt->version = NULL; - DICT_FREE(ctxt->encoding); - ctxt->encoding = NULL; - DICT_FREE(ctxt->directory); - ctxt->directory = NULL; - DICT_FREE(ctxt->extSubURI); - ctxt->extSubURI = NULL; - DICT_FREE(ctxt->extSubSystem); - ctxt->extSubSystem = NULL; - if (ctxt->myDoc != NULL) - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - - ctxt->standalone = -1; - ctxt->hasExternalSubset = 0; - ctxt->hasPErefs = 0; - ctxt->html = 0; - ctxt->external = 0; - ctxt->instate = XML_PARSER_START; - ctxt->token = 0; - - ctxt->wellFormed = 1; - ctxt->nsWellFormed = 1; - ctxt->disableSAX = 0; - ctxt->valid = 1; -#if 0 - ctxt->vctxt.userData = ctxt; - ctxt->vctxt.error = xmlParserValidityError; - ctxt->vctxt.warning = xmlParserValidityWarning; -#endif - ctxt->record_info = 0; - ctxt->nbChars = 0; - ctxt->checkIndex = 0; - ctxt->inSubset = 0; - ctxt->errNo = XML_ERR_OK; - ctxt->depth = 0; - ctxt->charset = XML_CHAR_ENCODING_UTF8; - ctxt->catalogs = NULL; - xmlInitNodeInfoSeq(&ctxt->node_seq); - - if (ctxt->attsDefault != NULL) { - xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); - ctxt->attsDefault = NULL; - } - if (ctxt->attsSpecial != NULL) { - xmlHashFree(ctxt->attsSpecial, NULL); - ctxt->attsSpecial = NULL; - } - -#ifdef LIBXML_CATALOG_ENABLED - if (ctxt->catalogs != NULL) - xmlCatalogFreeLocal(ctxt->catalogs); -#endif - if (ctxt->lastError.code != XML_ERR_OK) - xmlResetError(&ctxt->lastError); -} - -/** - * xmlCtxtResetPush: - * @ctxt: an XML parser context - * @chunk: a pointer to an array of chars - * @size: number of chars in the array - * @filename: an optional file name or URI - * @encoding: the document encoding, or NULL - * - * Reset a push parser context - * - * Returns 0 in case of success and 1 in case of error - */ -int -xmlCtxtResetPush(xmlParserCtxtPtr ctxt, const char *chunk, - int size, const char *filename, const char *encoding) -{ - xmlParserInputPtr inputStream; - xmlParserInputBufferPtr buf; - xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; - - if (ctxt == NULL) - return(1); - - if ((encoding == NULL) && (chunk != NULL) && (size >= 4)) - enc = xmlDetectCharEncoding((const xmlChar *) chunk, size); - - buf = xmlAllocParserInputBuffer(enc); - if (buf == NULL) - return(1); - - if (ctxt == NULL) { - xmlFreeParserInputBuffer(buf); - return(1); - } - - xmlCtxtReset(ctxt); - - if (ctxt->pushTab == NULL) { - ctxt->pushTab = (void **) xmlMalloc(ctxt->nameMax * 3 * - sizeof(xmlChar *)); - if (ctxt->pushTab == NULL) { - xmlErrMemory(ctxt, NULL); - xmlFreeParserInputBuffer(buf); - return(1); - } - } - - if (filename == NULL) { - ctxt->directory = NULL; - } else { - ctxt->directory = xmlParserGetDirectory(filename); - } - - inputStream = xmlNewInputStream(ctxt); - if (inputStream == NULL) { - xmlFreeParserInputBuffer(buf); - return(1); - } - - if (filename == NULL) - inputStream->filename = NULL; - else - inputStream->filename = (char *) - xmlCanonicPath((const xmlChar *) filename); - inputStream->buf = buf; - inputStream->base = inputStream->buf->buffer->content; - inputStream->cur = inputStream->buf->buffer->content; - inputStream->end = - &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; - - inputPush(ctxt, inputStream); - - if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && - (ctxt->input->buf != NULL)) { - int base = ctxt->input->base - ctxt->input->buf->buffer->content; - int cur = ctxt->input->cur - ctxt->input->base; - - xmlParserInputBufferPush(ctxt->input->buf, size, chunk); - - ctxt->input->base = ctxt->input->buf->buffer->content + base; - ctxt->input->cur = ctxt->input->base + cur; - ctxt->input->end = - &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer-> - use]; -#ifdef DEBUG_PUSH - xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); -#endif - } - - if (encoding != NULL) { - xmlCharEncodingHandlerPtr hdlr; - - hdlr = xmlFindCharEncodingHandler(encoding); - if (hdlr != NULL) { - xmlSwitchToEncoding(ctxt, hdlr); - } else { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "Unsupported encoding %s\n", BAD_CAST encoding); - } - } else if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - - return(0); -} - -/** - * xmlCtxtUseOptions: - * @ctxt: an XML parser context - * @options: a combination of xmlParserOption - * - * Applies the options to the parser context - * - * Returns 0 in case of success, the set of unknown or unimplemented options - * in case of error. - */ -int -xmlCtxtUseOptions(xmlParserCtxtPtr ctxt, int options) -{ - if (ctxt == NULL) - return(-1); - if (options & XML_PARSE_RECOVER) { - ctxt->recovery = 1; - options -= XML_PARSE_RECOVER; - } else - ctxt->recovery = 0; - if (options & XML_PARSE_DTDLOAD) { - ctxt->loadsubset = XML_DETECT_IDS; - options -= XML_PARSE_DTDLOAD; - } else - ctxt->loadsubset = 0; - if (options & XML_PARSE_DTDATTR) { - ctxt->loadsubset |= XML_COMPLETE_ATTRS; - options -= XML_PARSE_DTDATTR; - } - if (options & XML_PARSE_NOENT) { - ctxt->replaceEntities = 1; - /* ctxt->loadsubset |= XML_DETECT_IDS; */ - options -= XML_PARSE_NOENT; - } else - ctxt->replaceEntities = 0; - if (options & XML_PARSE_PEDANTIC) { - ctxt->pedantic = 1; - options -= XML_PARSE_PEDANTIC; - } else - ctxt->pedantic = 0; - if (options & XML_PARSE_NOBLANKS) { - ctxt->keepBlanks = 0; - ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace; - options -= XML_PARSE_NOBLANKS; - } else - ctxt->keepBlanks = 1; - if (options & XML_PARSE_DTDVALID) { - ctxt->validate = 1; - if (options & XML_PARSE_NOWARNING) - ctxt->vctxt.warning = NULL; - if (options & XML_PARSE_NOERROR) - ctxt->vctxt.error = NULL; - options -= XML_PARSE_DTDVALID; - } else - ctxt->validate = 0; - if (options & XML_PARSE_NOWARNING) { - ctxt->sax->warning = NULL; - options -= XML_PARSE_NOWARNING; - } - if (options & XML_PARSE_NOERROR) { - ctxt->sax->error = NULL; - ctxt->sax->fatalError = NULL; - options -= XML_PARSE_NOERROR; - } -#ifdef LIBXML_SAX1_ENABLED - if (options & XML_PARSE_SAX1) { - ctxt->sax->startElement = xmlSAX2StartElement; - ctxt->sax->endElement = xmlSAX2EndElement; - ctxt->sax->startElementNs = NULL; - ctxt->sax->endElementNs = NULL; - ctxt->sax->initialized = 1; - options -= XML_PARSE_SAX1; - } -#endif /* LIBXML_SAX1_ENABLED */ - if (options & XML_PARSE_NODICT) { - ctxt->dictNames = 0; - options -= XML_PARSE_NODICT; - } else { - ctxt->dictNames = 1; - } - if (options & XML_PARSE_NOCDATA) { - ctxt->sax->cdataBlock = NULL; - options -= XML_PARSE_NOCDATA; - } - if (options & XML_PARSE_NSCLEAN) { - ctxt->options |= XML_PARSE_NSCLEAN; - options -= XML_PARSE_NSCLEAN; - } - if (options & XML_PARSE_NONET) { - ctxt->options |= XML_PARSE_NONET; - options -= XML_PARSE_NONET; - } - if (options & XML_PARSE_COMPACT) { - ctxt->options |= XML_PARSE_COMPACT; - options -= XML_PARSE_COMPACT; - } - ctxt->linenumbers = 1; - return (options); -} - -/** - * xmlDoRead: - * @ctxt: an XML parser context - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * @reuse: keep the context for reuse - * - * Common front-end for the xmlRead functions - * - * Returns the resulting document tree or NULL - */ -static xmlDocPtr -xmlDoRead(xmlParserCtxtPtr ctxt, const char *URL, const char *encoding, - int options, int reuse) -{ - xmlDocPtr ret; - - xmlCtxtUseOptions(ctxt, options); - if (encoding != NULL) { - xmlCharEncodingHandlerPtr hdlr; - - hdlr = xmlFindCharEncodingHandler(encoding); - if (hdlr != NULL) - xmlSwitchToEncoding(ctxt, hdlr); - } - if ((URL != NULL) && (ctxt->input != NULL) && - (ctxt->input->filename == NULL)) - ctxt->input->filename = (char *) xmlStrdup((const xmlChar *) URL); - xmlParseDocument(ctxt); - if ((ctxt->wellFormed) || ctxt->recovery) - ret = ctxt->myDoc; - else { - ret = NULL; - if (ctxt->myDoc != NULL) { - xmlFreeDoc(ctxt->myDoc); - } - } - ctxt->myDoc = NULL; - if (!reuse) { - xmlFreeParserCtxt(ctxt); - } - - return (ret); -} - -/** - * xmlReadDoc: - * @cur: a pointer to a zero terminated string - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML in-memory document and build a tree. - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlReadDoc(const xmlChar * cur, const char *URL, const char *encoding, int options) -{ - xmlParserCtxtPtr ctxt; - - if (cur == NULL) - return (NULL); - - ctxt = xmlCreateDocParserCtxt(cur); - if (ctxt == NULL) - return (NULL); - return (xmlDoRead(ctxt, URL, encoding, options, 0)); -} - -/** - * xmlReadFile: - * @filename: a file or URL - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML file from the filesystem or the network. - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlReadFile(const char *filename, const char *encoding, int options) -{ - xmlParserCtxtPtr ctxt; - - ctxt = xmlCreateURLParserCtxt(filename, options); - if (ctxt == NULL) - return (NULL); - return (xmlDoRead(ctxt, NULL, encoding, options, 0)); -} - -/** - * xmlReadMemory: - * @buffer: a pointer to a char array - * @size: the size of the array - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML in-memory document and build a tree. - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlReadMemory(const char *buffer, int size, const char *URL, const char *encoding, int options) -{ - xmlParserCtxtPtr ctxt; - - ctxt = xmlCreateMemoryParserCtxt(buffer, size); - if (ctxt == NULL) - return (NULL); - return (xmlDoRead(ctxt, URL, encoding, options, 0)); -} - -/** - * xmlReadFd: - * @fd: an open file descriptor - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML from a file descriptor and build a tree. - * NOTE that the file descriptor will not be closed when the - * reader is closed or reset. - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlReadFd(int fd, const char *URL, const char *encoding, int options) -{ - xmlParserCtxtPtr ctxt; - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (fd < 0) - return (NULL); - - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - input->closecallback = NULL; - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - xmlFreeParserCtxt(ctxt); - return (NULL); - } - inputPush(ctxt, stream); - return (xmlDoRead(ctxt, URL, encoding, options, 0)); -} - -/** - * xmlReadIO: - * @ioread: an I/O read function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML document from I/O functions and source and build a tree. - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlReadIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, - void *ioctx, const char *URL, const char *encoding, int options) -{ - xmlParserCtxtPtr ctxt; - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (ioread == NULL) - return (NULL); - - input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - xmlFreeParserCtxt(ctxt); - return (NULL); - } - inputPush(ctxt, stream); - return (xmlDoRead(ctxt, URL, encoding, options, 0)); -} - -/** - * xmlCtxtReadDoc: - * @ctxt: an XML parser context - * @cur: a pointer to a zero terminated string - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML in-memory document and build a tree. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlCtxtReadDoc(xmlParserCtxtPtr ctxt, const xmlChar * cur, - const char *URL, const char *encoding, int options) -{ - xmlParserInputPtr stream; - - if (cur == NULL) - return (NULL); - if (ctxt == NULL) - return (NULL); - - xmlCtxtReset(ctxt); - - stream = xmlNewStringInputStream(ctxt, cur); - if (stream == NULL) { - return (NULL); - } - inputPush(ctxt, stream); - return (xmlDoRead(ctxt, URL, encoding, options, 1)); -} - -/** - * xmlCtxtReadFile: - * @ctxt: an XML parser context - * @filename: a file or URL - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML file from the filesystem or the network. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlCtxtReadFile(xmlParserCtxtPtr ctxt, const char *filename, - const char *encoding, int options) -{ - xmlParserInputPtr stream; - - if (filename == NULL) - return (NULL); - if (ctxt == NULL) - return (NULL); - - xmlCtxtReset(ctxt); - - stream = xmlLoadExternalEntity(filename, NULL, ctxt); - if (stream == NULL) { - return (NULL); - } - inputPush(ctxt, stream); - return (xmlDoRead(ctxt, NULL, encoding, options, 1)); -} - -/** - * xmlCtxtReadMemory: - * @ctxt: an XML parser context - * @buffer: a pointer to a char array - * @size: the size of the array - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML in-memory document and build a tree. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlCtxtReadMemory(xmlParserCtxtPtr ctxt, const char *buffer, int size, - const char *URL, const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (ctxt == NULL) - return (NULL); - if (buffer == NULL) - return (NULL); - - xmlCtxtReset(ctxt); - - input = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); - if (input == NULL) { - return(NULL); - } - - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - return(NULL); - } - - inputPush(ctxt, stream); - return (xmlDoRead(ctxt, URL, encoding, options, 1)); -} - -/** - * xmlCtxtReadFd: - * @ctxt: an XML parser context - * @fd: an open file descriptor - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML from a file descriptor and build a tree. - * This reuses the existing @ctxt parser context - * NOTE that the file descriptor will not be closed when the - * reader is closed or reset. - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlCtxtReadFd(xmlParserCtxtPtr ctxt, int fd, - const char *URL, const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (fd < 0) - return (NULL); - if (ctxt == NULL) - return (NULL); - - xmlCtxtReset(ctxt); - - - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - input->closecallback = NULL; - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - inputPush(ctxt, stream); - return (xmlDoRead(ctxt, URL, encoding, options, 1)); -} - -/** - * xmlCtxtReadIO: - * @ctxt: an XML parser context - * @ioread: an I/O read function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML document from I/O functions and source and build a tree. - * This reuses the existing @ctxt parser context - * - * Returns the resulting document tree - */ -xmlDocPtr -xmlCtxtReadIO(xmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, void *ioctx, - const char *URL, - const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - xmlParserInputPtr stream; - - if (ioread == NULL) - return (NULL); - if (ctxt == NULL) - return (NULL); - - xmlCtxtReset(ctxt); - - input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); - if (stream == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - inputPush(ctxt, stream); - return (xmlDoRead(ctxt, URL, encoding, options, 1)); -} - -#define bottom_parser -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/parserInternals.c b/ThirdParty/libxml2/vtklibxml2/parserInternals.c deleted file mode 100644 index 9a062d60a55..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/parserInternals.c +++ /dev/null @@ -1,2059 +0,0 @@ -/* - * parserInternals.c : Internal routines (and obsolete ones) needed for the - * XML and HTML parsers. - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#if defined(WIN32) && !defined (__CYGWIN__) -#define XML_DIR_SEP '\\' -#else -#define XML_DIR_SEP '/' -#endif - -#include <string.h> -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#include "vtk_libxml2_zlib.h" - -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/valid.h> -#include <libxml/entities.h> -#include <libxml/xmlerror.h> -#include <libxml/encoding.h> -#include <libxml/valid.h> -#include <libxml/xmlIO.h> -#include <libxml/uri.h> -#include <libxml/dict.h> -#include <libxml/SAX.h> -#ifdef LIBXML_CATALOG_ENABLED -#include <libxml/catalog.h> -#endif -#include <libxml/globals.h> -#include <libxml/chvalid.h> - -/* - * Various global defaults for parsing - */ - -/** - * xmlCheckVersion: - * @version: the include version number - * - * check the compiled lib version against the include one. - * This can warn or immediately kill the application - */ -void -xmlCheckVersion(int version) { - int myversion = (int) LIBXML_VERSION; - - xmlInitParser(); - - if ((myversion / 10000) != (version / 10000)) { - xmlGenericError(xmlGenericErrorContext, - "Fatal: program compiled against libxml %d using libxml %d\n", - (version / 10000), (myversion / 10000)); - fprintf(stderr, - "Fatal: program compiled against libxml %d using libxml %d\n", - (version / 10000), (myversion / 10000)); - } - if ((myversion / 100) < (version / 100)) { - xmlGenericError(xmlGenericErrorContext, - "Warning: program compiled against libxml %d using older %d\n", - (version / 100), (myversion / 100)); - } -} - - -/************************************************************************ - * * - * Some factorized error routines * - * * - ************************************************************************/ - - -/** - * xmlErrMemory: - * @ctxt: an XML parser context - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -void -xmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) { - ctxt->errNo = XML_ERR_NO_MEMORY; - ctxt->instate = XML_PARSER_EOF; - ctxt->disableSAX = 1; - } - if (extra) - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, - NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); - else - __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, - NULL, NULL, 0, 0, "Memory allocation failed\n"); -} - -/** - * __xmlErrEncoding: - * @ctxt: an XML parser context - * @xmlerr: the error number - * @msg: the error message - * @str1: an string info - * @str2: an string info - * - * Handle an encoding error - */ -void -__xmlErrEncoding(xmlParserCtxtPtr ctxt, xmlParserErrors xmlerr, - const char *msg, const xmlChar * str1, const xmlChar * str2) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = xmlerr; - __xmlRaiseError(NULL, NULL, NULL, - ctxt, NULL, XML_FROM_PARSER, xmlerr, XML_ERR_FATAL, - NULL, 0, (const char *) str1, (const char *) str2, - NULL, 0, 0, msg, str1, str2); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlErrInternal: - * @ctxt: an XML parser context - * @msg: the error message - * @str: error informations - * - * Handle an internal error - */ -static void -xmlErrInternal(xmlParserCtxtPtr ctxt, const char *msg, const xmlChar * str) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = XML_ERR_INTERNAL_ERROR; - __xmlRaiseError(NULL, NULL, NULL, - ctxt, NULL, XML_FROM_PARSER, XML_ERR_INTERNAL_ERROR, - XML_ERR_FATAL, NULL, 0, (const char *) str, NULL, NULL, - 0, 0, msg, str); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlErrEncodingInt: - * @ctxt: an XML parser context - * @error: the error number - * @msg: the error message - * @val: an integer value - * - * n encoding error - */ -static void -xmlErrEncodingInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, - const char *msg, int val) -{ - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if (ctxt != NULL) - ctxt->errNo = error; - __xmlRaiseError(NULL, NULL, NULL, - ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, - NULL, 0, NULL, NULL, NULL, val, 0, msg, val); - if (ctxt != NULL) { - ctxt->wellFormed = 0; - if (ctxt->recovery == 0) - ctxt->disableSAX = 1; - } -} - -/** - * xmlIsLetter: - * @c: an unicode character (int) - * - * Check whether the character is allowed by the production - * [84] Letter ::= BaseChar | Ideographic - * - * Returns 0 if not, non-zero otherwise - */ -int -xmlIsLetter(int c) { - return(IS_BASECHAR(c) || IS_IDEOGRAPHIC(c)); -} - -/************************************************************************ - * * - * Input handling functions for progressive parsing * - * * - ************************************************************************/ - -/* #define DEBUG_INPUT */ -/* #define DEBUG_STACK */ -/* #define DEBUG_PUSH */ - - -/* we need to keep enough input to show errors in context */ -#define LINE_LEN 80 - -#ifdef DEBUG_INPUT -#define CHECK_BUFFER(in) check_buffer(in) - -static -void check_buffer(xmlParserInputPtr in) { - if (in->base != in->buf->buffer->content) { - xmlGenericError(xmlGenericErrorContext, - "xmlParserInput: base mismatch problem\n"); - } - if (in->cur < in->base) { - xmlGenericError(xmlGenericErrorContext, - "xmlParserInput: cur < base problem\n"); - } - if (in->cur > in->base + in->buf->buffer->use) { - xmlGenericError(xmlGenericErrorContext, - "xmlParserInput: cur > base + use problem\n"); - } - xmlGenericError(xmlGenericErrorContext,"buffer %x : content %x, cur %d, use %d, size %d\n", - (int) in, (int) in->buf->buffer->content, in->cur - in->base, - in->buf->buffer->use, in->buf->buffer->size); -} - -#else -#define CHECK_BUFFER(in) -#endif - - -/** - * xmlParserInputRead: - * @in: an XML parser input - * @len: an indicative size for the lookahead - * - * This function refresh the input for the parser. It doesn't try to - * preserve pointers to the input buffer, and discard already read data - * - * Returns the number of xmlChars read, or -1 in case of error, 0 indicate the - * end of this entity - */ -int -xmlParserInputRead(xmlParserInputPtr in, int len) { - int ret; - int used; - int indx; - - if (in == NULL) return(-1); -#ifdef DEBUG_INPUT - xmlGenericError(xmlGenericErrorContext, "Read\n"); -#endif - if (in->buf == NULL) return(-1); - if (in->base == NULL) return(-1); - if (in->cur == NULL) return(-1); - if (in->buf->buffer == NULL) return(-1); - if (in->buf->readcallback == NULL) return(-1); - - CHECK_BUFFER(in); - - used = in->cur - in->buf->buffer->content; - ret = xmlBufferShrink(in->buf->buffer, used); - if (ret > 0) { - in->cur -= ret; - in->consumed += ret; - } - ret = xmlParserInputBufferRead(in->buf, len); - if (in->base != in->buf->buffer->content) { - /* - * the buffer has been reallocated - */ - indx = in->cur - in->base; - in->base = in->buf->buffer->content; - in->cur = &in->buf->buffer->content[indx]; - } - in->end = &in->buf->buffer->content[in->buf->buffer->use]; - - CHECK_BUFFER(in); - - return(ret); -} - -/** - * xmlParserInputGrow: - * @in: an XML parser input - * @len: an indicative size for the lookahead - * - * This function increase the input for the parser. It tries to - * preserve pointers to the input buffer, and keep already read data - * - * Returns the number of xmlChars read, or -1 in case of error, 0 indicate the - * end of this entity - */ -int -xmlParserInputGrow(xmlParserInputPtr in, int len) { - int ret; - int indx; - - if (in == NULL) return(-1); -#ifdef DEBUG_INPUT - xmlGenericError(xmlGenericErrorContext, "Grow\n"); -#endif - if (in->buf == NULL) return(-1); - if (in->base == NULL) return(-1); - if (in->cur == NULL) return(-1); - if (in->buf->buffer == NULL) return(-1); - - CHECK_BUFFER(in); - - indx = in->cur - in->base; - if (in->buf->buffer->use > (unsigned int) indx + INPUT_CHUNK) { - - CHECK_BUFFER(in); - - return(0); - } - if (in->buf->readcallback != NULL) - ret = xmlParserInputBufferGrow(in->buf, len); - else - return(0); - - /* - * NOTE : in->base may be a "dangling" i.e. freed pointer in this - * block, but we use it really as an integer to do some - * pointer arithmetic. Insure will raise it as a bug but in - * that specific case, that's not ! - */ - if (in->base != in->buf->buffer->content) { - /* - * the buffer has been reallocated - */ - indx = in->cur - in->base; - in->base = in->buf->buffer->content; - in->cur = &in->buf->buffer->content[indx]; - } - in->end = &in->buf->buffer->content[in->buf->buffer->use]; - - CHECK_BUFFER(in); - - return(ret); -} - -/** - * xmlParserInputShrink: - * @in: an XML parser input - * - * This function removes used input for the parser. - */ -void -xmlParserInputShrink(xmlParserInputPtr in) { - int used; - int ret; - int indx; - -#ifdef DEBUG_INPUT - xmlGenericError(xmlGenericErrorContext, "Shrink\n"); -#endif - if (in == NULL) return; - if (in->buf == NULL) return; - if (in->base == NULL) return; - if (in->cur == NULL) return; - if (in->buf->buffer == NULL) return; - - CHECK_BUFFER(in); - - used = in->cur - in->buf->buffer->content; - /* - * Do not shrink on large buffers whose only a tiny fraction - * was consumed - */ - if (used > INPUT_CHUNK) { - ret = xmlBufferShrink(in->buf->buffer, used - LINE_LEN); - if (ret > 0) { - in->cur -= ret; - in->consumed += ret; - } - in->end = &in->buf->buffer->content[in->buf->buffer->use]; - } - - CHECK_BUFFER(in); - - if (in->buf->buffer->use > INPUT_CHUNK) { - return; - } - xmlParserInputBufferRead(in->buf, 2 * INPUT_CHUNK); - if (in->base != in->buf->buffer->content) { - /* - * the buffer has been reallocated - */ - indx = in->cur - in->base; - in->base = in->buf->buffer->content; - in->cur = &in->buf->buffer->content[indx]; - } - in->end = &in->buf->buffer->content[in->buf->buffer->use]; - - CHECK_BUFFER(in); -} - -/************************************************************************ - * * - * UTF8 character input and related functions * - * * - ************************************************************************/ - -/** - * xmlNextChar: - * @ctxt: the XML parser context - * - * Skip to the next char input char. - */ - -void -xmlNextChar(xmlParserCtxtPtr ctxt) -{ - if ((ctxt == NULL) || (ctxt->instate == XML_PARSER_EOF) || - (ctxt->input == NULL)) - return; - - if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0) && - (ctxt->instate != XML_PARSER_COMMENT)) { - /* - * If we are at the end of the current entity and - * the context allows it, we pop consumed entities - * automatically. - * the auto closing should be blocked in other cases - */ - xmlPopInput(ctxt); - } else { - const unsigned char *cur; - unsigned char c; - - /* - * 2.11 End-of-Line Handling - * the literal two-character sequence "#xD#xA" or a standalone - * literal #xD, an XML processor must pass to the application - * the single character #xA. - */ - if (*(ctxt->input->cur) == '\n') { - ctxt->input->line++; ctxt->input->col = 1; - } else - ctxt->input->col++; - - /* - * We are supposed to handle UTF8, check it's valid - * From rfc2044: encoding of the Unicode values on UTF-8: - * - * UCS-4 range (hex.) UTF-8 octet sequence (binary) - * 0000 0000-0000 007F 0xxxxxxx - * 0000 0080-0000 07FF 110xxxxx 10xxxxxx - * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx - * - * Check for the 0x110000 limit too - */ - cur = ctxt->input->cur; - - c = *cur; - if (c & 0x80) { - if (c == 0xC0) - goto encoding_error; - if (cur[1] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if ((cur[1] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xe0) == 0xe0) { - unsigned int val; - - if (cur[2] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if ((cur[2] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xf0) == 0xf0) { - if (cur[3] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if (((c & 0xf8) != 0xf0) || - ((cur[3] & 0xc0) != 0x80)) - goto encoding_error; - /* 4-byte code */ - ctxt->input->cur += 4; - val = (cur[0] & 0x7) << 18; - val |= (cur[1] & 0x3f) << 12; - val |= (cur[2] & 0x3f) << 6; - val |= cur[3] & 0x3f; - } else { - /* 3-byte code */ - ctxt->input->cur += 3; - val = (cur[0] & 0xf) << 12; - val |= (cur[1] & 0x3f) << 6; - val |= cur[2] & 0x3f; - } - if (((val > 0xd7ff) && (val < 0xe000)) || - ((val > 0xfffd) && (val < 0x10000)) || - (val >= 0x110000)) { - xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, - "Char 0x%X out of allowed range\n", - val); - } - } else - /* 2-byte code */ - ctxt->input->cur += 2; - } else - /* 1-byte code */ - ctxt->input->cur++; - - ctxt->nbChars++; - if (*ctxt->input->cur == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - } - } else { - /* - * Assume it's a fixed length encoding (1) with - * a compatible encoding for the ASCII set, since - * XML constructs only use < 128 chars - */ - - if (*(ctxt->input->cur) == '\n') { - ctxt->input->line++; ctxt->input->col = 1; - } else - ctxt->input->col++; - ctxt->input->cur++; - ctxt->nbChars++; - if (*ctxt->input->cur == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - } - if ((*ctxt->input->cur == '%') && (!ctxt->html)) - xmlParserHandlePEReference(ctxt); - if ((*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - xmlPopInput(ctxt); - return; -encoding_error: - /* - * If we detect an UTF8 error that probably mean that the - * input encoding didn't get properly advertised in the - * declaration header. Report the error and switch the encoding - * to ISO-Latin-1 (if you don't like this policy, just declare the - * encoding !) - */ - if ((ctxt == NULL) || (ctxt->input == NULL) || - (ctxt->input->end - ctxt->input->cur < 4)) { - __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, - "Input is not proper UTF-8, indicate encoding !\n", - NULL, NULL); - } else { - char buffer[150]; - - snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - ctxt->input->cur[0], ctxt->input->cur[1], - ctxt->input->cur[2], ctxt->input->cur[3]); - __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, - "Input is not proper UTF-8, indicate encoding !\n%s", - BAD_CAST buffer, NULL); - } - ctxt->charset = XML_CHAR_ENCODING_8859_1; - ctxt->input->cur++; - return; -} - -/** - * xmlCurrentChar: - * @ctxt: the XML parser context - * @len: pointer to the length of the char read - * - * The current char value, if using UTF-8 this may actually span multiple - * bytes in the input buffer. Implement the end of line normalization: - * 2.11 End-of-Line Handling - * Wherever an external parsed entity or the literal entity value - * of an internal parsed entity contains either the literal two-character - * sequence "#xD#xA" or a standalone literal #xD, an XML processor - * must pass to the application the single character #xA. - * This behavior can conveniently be produced by normalizing all - * line breaks to #xA on input, before parsing.) - * - * Returns the current char value and its length - */ - -int -xmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) { - if ((ctxt == NULL) || (len == NULL) || (ctxt->input == NULL)) return(0); - if (ctxt->instate == XML_PARSER_EOF) - return(0); - - if ((*ctxt->input->cur >= 0x20) && (*ctxt->input->cur <= 0x7F)) { - *len = 1; - return((int) *ctxt->input->cur); - } - if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { - /* - * We are supposed to handle UTF8, check it's valid - * From rfc2044: encoding of the Unicode values on UTF-8: - * - * UCS-4 range (hex.) UTF-8 octet sequence (binary) - * 0000 0000-0000 007F 0xxxxxxx - * 0000 0080-0000 07FF 110xxxxx 10xxxxxx - * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx - * - * Check for the 0x110000 limit too - */ - const unsigned char *cur = ctxt->input->cur; - unsigned char c; - unsigned int val; - - c = *cur; - if (c & 0x80) { - if (c == 0xC0) - goto encoding_error; - if (cur[1] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if ((cur[1] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xe0) == 0xe0) { - - if (cur[2] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if ((cur[2] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xf0) == 0xf0) { - if (cur[3] == 0) - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); - if (((c & 0xf8) != 0xf0) || - ((cur[3] & 0xc0) != 0x80)) - goto encoding_error; - /* 4-byte code */ - *len = 4; - val = (cur[0] & 0x7) << 18; - val |= (cur[1] & 0x3f) << 12; - val |= (cur[2] & 0x3f) << 6; - val |= cur[3] & 0x3f; - } else { - /* 3-byte code */ - *len = 3; - val = (cur[0] & 0xf) << 12; - val |= (cur[1] & 0x3f) << 6; - val |= cur[2] & 0x3f; - } - } else { - /* 2-byte code */ - *len = 2; - val = (cur[0] & 0x1f) << 6; - val |= cur[1] & 0x3f; - } - if (!IS_CHAR(val)) { - xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, - "Char 0x%X out of allowed range\n", val); - } - return(val); - } else { - /* 1-byte code */ - *len = 1; - if (*ctxt->input->cur == 0xD) { - if (ctxt->input->cur[1] == 0xA) { - ctxt->nbChars++; - ctxt->input->cur++; - } - return(0xA); - } - return((int) *ctxt->input->cur); - } - } - /* - * Assume it's a fixed length encoding (1) with - * a compatible encoding for the ASCII set, since - * XML constructs only use < 128 chars - */ - *len = 1; - if (*ctxt->input->cur == 0xD) { - if (ctxt->input->cur[1] == 0xA) { - ctxt->nbChars++; - ctxt->input->cur++; - } - return(0xA); - } - return((int) *ctxt->input->cur); -encoding_error: - /* - * An encoding problem may arise from a truncated input buffer - * splitting a character in the middle. In that case do not raise - * an error but return 0 to endicate an end of stream problem - */ - if (ctxt->input->end - ctxt->input->cur < 4) { - *len = 0; - return(0); - } - - /* - * If we detect an UTF8 error that probably mean that the - * input encoding didn't get properly advertised in the - * declaration header. Report the error and switch the encoding - * to ISO-Latin-1 (if you don't like this policy, just declare the - * encoding !) - */ - { - char buffer[150]; - - snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - ctxt->input->cur[0], ctxt->input->cur[1], - ctxt->input->cur[2], ctxt->input->cur[3]); - __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, - "Input is not proper UTF-8, indicate encoding !\n%s", - BAD_CAST buffer, NULL); - } - ctxt->charset = XML_CHAR_ENCODING_8859_1; - *len = 1; - return((int) *ctxt->input->cur); -} - -/** - * xmlStringCurrentChar: - * @ctxt: the XML parser context - * @cur: pointer to the beginning of the char - * @len: pointer to the length of the char read - * - * The current char value, if using UTF-8 this may actually span multiple - * bytes in the input buffer. - * - * Returns the current char value and its length - */ - -int -xmlStringCurrentChar(xmlParserCtxtPtr ctxt, const xmlChar * cur, int *len) -{ - if ((len == NULL) || (cur == NULL)) return(0); - if ((ctxt == NULL) || (ctxt->charset == XML_CHAR_ENCODING_UTF8)) { - /* - * We are supposed to handle UTF8, check it's valid - * From rfc2044: encoding of the Unicode values on UTF-8: - * - * UCS-4 range (hex.) UTF-8 octet sequence (binary) - * 0000 0000-0000 007F 0xxxxxxx - * 0000 0080-0000 07FF 110xxxxx 10xxxxxx - * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx - * - * Check for the 0x110000 limit too - */ - unsigned char c; - unsigned int val; - - c = *cur; - if (c & 0x80) { - if ((cur[1] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xe0) == 0xe0) { - - if ((cur[2] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xf0) == 0xf0) { - if (((c & 0xf8) != 0xf0) || ((cur[3] & 0xc0) != 0x80)) - goto encoding_error; - /* 4-byte code */ - *len = 4; - val = (cur[0] & 0x7) << 18; - val |= (cur[1] & 0x3f) << 12; - val |= (cur[2] & 0x3f) << 6; - val |= cur[3] & 0x3f; - } else { - /* 3-byte code */ - *len = 3; - val = (cur[0] & 0xf) << 12; - val |= (cur[1] & 0x3f) << 6; - val |= cur[2] & 0x3f; - } - } else { - /* 2-byte code */ - *len = 2; - val = (cur[0] & 0x1f) << 6; - val |= cur[1] & 0x3f; - } - if (!IS_CHAR(val)) { - xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, - "Char 0x%X out of allowed range\n", val); - } - return (val); - } else { - /* 1-byte code */ - *len = 1; - return ((int) *cur); - } - } - /* - * Assume it's a fixed length encoding (1) with - * a compatible encoding for the ASCII set, since - * XML constructs only use < 128 chars - */ - *len = 1; - return ((int) *cur); -encoding_error: - - /* - * An encoding problem may arise from a truncated input buffer - * splitting a character in the middle. In that case do not raise - * an error but return 0 to endicate an end of stream problem - */ - if ((ctxt == NULL) || (ctxt->input == NULL) || - (ctxt->input->end - ctxt->input->cur < 4)) { - *len = 0; - return(0); - } - /* - * If we detect an UTF8 error that probably mean that the - * input encoding didn't get properly advertised in the - * declaration header. Report the error and switch the encoding - * to ISO-Latin-1 (if you don't like this policy, just declare the - * encoding !) - */ - { - char buffer[150]; - - snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - ctxt->input->cur[0], ctxt->input->cur[1], - ctxt->input->cur[2], ctxt->input->cur[3]); - __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, - "Input is not proper UTF-8, indicate encoding !\n%s", - BAD_CAST buffer, NULL); - } - *len = 1; - return ((int) *cur); -} - -/** - * xmlCopyCharMultiByte: - * @out: pointer to an array of xmlChar - * @val: the char value - * - * append the char value in the array - * - * Returns the number of xmlChar written - */ -int -xmlCopyCharMultiByte(xmlChar *out, int val) { - if (out == NULL) return(0); - /* - * We are supposed to handle UTF8, check it's valid - * From rfc2044: encoding of the Unicode values on UTF-8: - * - * UCS-4 range (hex.) UTF-8 octet sequence (binary) - * 0000 0000-0000 007F 0xxxxxxx - * 0000 0080-0000 07FF 110xxxxx 10xxxxxx - * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx - */ - if (val >= 0x80) { - xmlChar *savedout = out; - int bits; - if (val < 0x800) { *out++= (val >> 6) | 0xC0; bits= 0; } - else if (val < 0x10000) { *out++= (val >> 12) | 0xE0; bits= 6;} - else if (val < 0x110000) { *out++= (val >> 18) | 0xF0; bits= 12; } - else { - xmlErrEncodingInt(NULL, XML_ERR_INVALID_CHAR, - "Internal error, xmlCopyCharMultiByte 0x%X out of bound\n", - val); - return(0); - } - for ( ; bits >= 0; bits-= 6) - *out++= ((val >> bits) & 0x3F) | 0x80 ; - return (out - savedout); - } - *out = (xmlChar) val; - return 1; -} - -/** - * xmlCopyChar: - * @len: Ignored, compatibility - * @out: pointer to an array of xmlChar - * @val: the char value - * - * append the char value in the array - * - * Returns the number of xmlChar written - */ - -int -xmlCopyChar(int len ATTRIBUTE_UNUSED, xmlChar *out, int val) { - if (out == NULL) return(0); - /* the len parameter is ignored */ - if (val >= 0x80) { - return(xmlCopyCharMultiByte (out, val)); - } - *out = (xmlChar) val; - return 1; -} - -/************************************************************************ - * * - * Commodity functions to switch encodings * - * * - ************************************************************************/ - -/** - * xmlSwitchEncoding: - * @ctxt: the parser context - * @enc: the encoding value (number) - * - * change the input functions when discovering the character encoding - * of a given entity. - * - * Returns 0 in case of success, -1 otherwise - */ -int -xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc) -{ - xmlCharEncodingHandlerPtr handler; - - if (ctxt == NULL) return(-1); - switch (enc) { - case XML_CHAR_ENCODING_ERROR: - __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING, - "encoding unknown\n", NULL, NULL); - return(-1); - case XML_CHAR_ENCODING_NONE: - /* let's assume it's UTF-8 without the XML decl */ - ctxt->charset = XML_CHAR_ENCODING_UTF8; - return(0); - case XML_CHAR_ENCODING_UTF8: - /* default encoding, no conversion should be needed */ - ctxt->charset = XML_CHAR_ENCODING_UTF8; - - /* - * Errata on XML-1.0 June 20 2001 - * Specific handling of the Byte Order Mark for - * UTF-8 - */ - if ((ctxt->input != NULL) && - (ctxt->input->cur[0] == 0xEF) && - (ctxt->input->cur[1] == 0xBB) && - (ctxt->input->cur[2] == 0xBF)) { - ctxt->input->cur += 3; - } - return(0); - case XML_CHAR_ENCODING_UTF16LE: - case XML_CHAR_ENCODING_UTF16BE: - /*The raw input characters are encoded - *in UTF-16. As we expect this function - *to be called after xmlCharEncInFunc, we expect - *ctxt->input->cur to contain UTF-8 encoded characters. - *So the raw UTF16 Byte Order Mark - *has also been converted into - *an UTF-8 BOM. Let's skip that BOM. - */ - if ((ctxt->input != NULL) && (ctxt->input->cur != NULL) && - (ctxt->input->cur[0] == 0xEF) && - (ctxt->input->cur[1] == 0xBB) && - (ctxt->input->cur[2] == 0xBF)) { - ctxt->input->cur += 3; - } - break ; - default: - break; - } - handler = xmlGetCharEncodingHandler(enc); - if (handler == NULL) { - /* - * Default handlers. - */ - switch (enc) { - case XML_CHAR_ENCODING_ASCII: - /* default encoding, no conversion should be needed */ - ctxt->charset = XML_CHAR_ENCODING_UTF8; - return(0); - case XML_CHAR_ENCODING_UTF16LE: - break; - case XML_CHAR_ENCODING_UTF16BE: - break; - case XML_CHAR_ENCODING_UCS4LE: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "USC4 little endian", NULL); - break; - case XML_CHAR_ENCODING_UCS4BE: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "USC4 big endian", NULL); - break; - case XML_CHAR_ENCODING_EBCDIC: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "EBCDIC", NULL); - break; - case XML_CHAR_ENCODING_UCS4_2143: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "UCS4 2143", NULL); - break; - case XML_CHAR_ENCODING_UCS4_3412: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "UCS4 3412", NULL); - break; - case XML_CHAR_ENCODING_UCS2: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "UCS2", NULL); - break; - case XML_CHAR_ENCODING_8859_1: - case XML_CHAR_ENCODING_8859_2: - case XML_CHAR_ENCODING_8859_3: - case XML_CHAR_ENCODING_8859_4: - case XML_CHAR_ENCODING_8859_5: - case XML_CHAR_ENCODING_8859_6: - case XML_CHAR_ENCODING_8859_7: - case XML_CHAR_ENCODING_8859_8: - case XML_CHAR_ENCODING_8859_9: - /* - * We used to keep the internal content in the - * document encoding however this turns being unmaintainable - * So xmlGetCharEncodingHandler() will return non-null - * values for this now. - */ - if ((ctxt->inputNr == 1) && - (ctxt->encoding == NULL) && - (ctxt->input != NULL) && - (ctxt->input->encoding != NULL)) { - ctxt->encoding = xmlStrdup(ctxt->input->encoding); - } - ctxt->charset = enc; - return(0); - case XML_CHAR_ENCODING_2022_JP: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "ISO-2022-JP", NULL); - break; - case XML_CHAR_ENCODING_SHIFT_JIS: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "Shift_JIS", NULL); - break; - case XML_CHAR_ENCODING_EUC_JP: - __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "encoding not supported %s\n", - BAD_CAST "EUC-JP", NULL); - break; - default: - break; - } - } - if (handler == NULL) - return(-1); - ctxt->charset = XML_CHAR_ENCODING_UTF8; - return(xmlSwitchToEncoding(ctxt, handler)); -} - -/** - * xmlSwitchInputEncoding: - * @ctxt: the parser context - * @input: the input stream - * @handler: the encoding handler - * - * change the input functions when discovering the character encoding - * of a given entity. - * - * Returns 0 in case of success, -1 otherwise - */ -int -xmlSwitchInputEncoding(xmlParserCtxtPtr ctxt, xmlParserInputPtr input, - xmlCharEncodingHandlerPtr handler) -{ - int nbchars; - - if (handler == NULL) - return (-1); - if (input == NULL) - return (-1); - if (input->buf != NULL) { - if (input->buf->encoder != NULL) { - /* - * Check in case the auto encoding detetection triggered - * in already. - */ - if (input->buf->encoder == handler) - return (0); - - /* - * "UTF-16" can be used for both LE and BE - if ((!xmlStrncmp(BAD_CAST input->buf->encoder->name, - BAD_CAST "UTF-16", 6)) && - (!xmlStrncmp(BAD_CAST handler->name, - BAD_CAST "UTF-16", 6))) { - return(0); - } - */ - - /* - * Note: this is a bit dangerous, but that's what it - * takes to use nearly compatible signature for different - * encodings. - */ - xmlCharEncCloseFunc(input->buf->encoder); - input->buf->encoder = handler; - return (0); - } - input->buf->encoder = handler; - - /* - * Is there already some content down the pipe to convert ? - */ - if ((input->buf->buffer != NULL) && (input->buf->buffer->use > 0)) { - int processed; - unsigned int use; - - /* - * Specific handling of the Byte Order Mark for - * UTF-16 - */ - if ((handler->name != NULL) && - (!strcmp(handler->name, "UTF-16LE") || - !strcmp(handler->name, "UTF-16")) && - (input->cur[0] == 0xFF) && (input->cur[1] == 0xFE)) { - input->cur += 2; - } - if ((handler->name != NULL) && - (!strcmp(handler->name, "UTF-16BE")) && - (input->cur[0] == 0xFE) && (input->cur[1] == 0xFF)) { - input->cur += 2; - } - /* - * Errata on XML-1.0 June 20 2001 - * Specific handling of the Byte Order Mark for - * UTF-8 - */ - if ((handler->name != NULL) && - (!strcmp(handler->name, "UTF-8")) && - (input->cur[0] == 0xEF) && - (input->cur[1] == 0xBB) && (input->cur[2] == 0xBF)) { - input->cur += 3; - } - - /* - * Shrink the current input buffer. - * Move it as the raw buffer and create a new input buffer - */ - processed = input->cur - input->base; - xmlBufferShrink(input->buf->buffer, processed); - input->buf->raw = input->buf->buffer; - input->buf->buffer = xmlBufferCreate(); - input->buf->rawconsumed = processed; - use = input->buf->raw->use; - - if (ctxt->html) { - /* - * convert as much as possible of the buffer - */ - nbchars = xmlCharEncInFunc(input->buf->encoder, - input->buf->buffer, - input->buf->raw); - } else { - /* - * convert just enough to get - * '<?xml version="1.0" encoding="xxx"?>' - * parsed with the autodetected encoding - * into the parser reading buffer. - */ - nbchars = xmlCharEncFirstLine(input->buf->encoder, - input->buf->buffer, - input->buf->raw); - } - if (nbchars < 0) { - xmlErrInternal(ctxt, - "switching encoding: encoder error\n", - NULL); - return (-1); - } - input->buf->rawconsumed += use - input->buf->raw->use; - input->base = input->cur = input->buf->buffer->content; - input->end = &input->base[input->buf->buffer->use]; - - } - return (0); - } else if (input->length == 0) { - /* - * When parsing a static memory array one must know the - * size to be able to convert the buffer. - */ - xmlErrInternal(ctxt, "switching encoding : no input\n", NULL); - return (-1); - } - return (0); -} - -/** - * xmlSwitchToEncoding: - * @ctxt: the parser context - * @handler: the encoding handler - * - * change the input functions when discovering the character encoding - * of a given entity. - * - * Returns 0 in case of success, -1 otherwise - */ -int -xmlSwitchToEncoding(xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler) -{ - int ret = 0; - - if (handler != NULL) { - if (ctxt->input != NULL) { - ret = xmlSwitchInputEncoding(ctxt, ctxt->input, handler); - } else { - xmlErrInternal(ctxt, "xmlSwitchToEncoding : no input\n", - NULL); - return(-1); - } - /* - * The parsing is now done in UTF8 natively - */ - ctxt->charset = XML_CHAR_ENCODING_UTF8; - } else - return(-1); - return(ret); -} - -/************************************************************************ - * * - * Commodity functions to handle entities processing * - * * - ************************************************************************/ - -/** - * xmlFreeInputStream: - * @input: an xmlParserInputPtr - * - * Free up an input stream. - */ -void -xmlFreeInputStream(xmlParserInputPtr input) { - if (input == NULL) return; - - if (input->filename != NULL) xmlFree((char *) input->filename); - if (input->directory != NULL) xmlFree((char *) input->directory); - if (input->encoding != NULL) xmlFree((char *) input->encoding); - if (input->version != NULL) xmlFree((char *) input->version); - if ((input->free != NULL) && (input->base != NULL)) - input->free((xmlChar *) input->base); - if (input->buf != NULL) - xmlFreeParserInputBuffer(input->buf); - xmlFree(input); -} - -/** - * xmlNewInputStream: - * @ctxt: an XML parser context - * - * Create a new input stream structure - * Returns the new input stream or NULL - */ -xmlParserInputPtr -xmlNewInputStream(xmlParserCtxtPtr ctxt) { - xmlParserInputPtr input; - static int id = 0; - - input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput)); - if (input == NULL) { - xmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); - return(NULL); - } - memset(input, 0, sizeof(xmlParserInput)); - input->line = 1; - input->col = 1; - input->standalone = -1; - /* - * we don't care about thread reentrancy unicity for a single - * parser context (and hence thread) is sufficient. - */ - input->id = id++; - return(input); -} - -/** - * xmlNewIOInputStream: - * @ctxt: an XML parser context - * @input: an I/O Input - * @enc: the charset encoding if known - * - * Create a new input stream structure encapsulating the @input into - * a stream suitable for the parser. - * - * Returns the new input stream or NULL - */ -xmlParserInputPtr -xmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input, - xmlCharEncoding enc) { - xmlParserInputPtr inputStream; - - if (input == NULL) return(NULL); - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, "new input from I/O\n"); - inputStream = xmlNewInputStream(ctxt); - if (inputStream == NULL) { - return(NULL); - } - inputStream->filename = NULL; - inputStream->buf = input; - inputStream->base = inputStream->buf->buffer->content; - inputStream->cur = inputStream->buf->buffer->content; - inputStream->end = &inputStream->base[inputStream->buf->buffer->use]; - if (enc != XML_CHAR_ENCODING_NONE) { - xmlSwitchEncoding(ctxt, enc); - } - - return(inputStream); -} - -/** - * xmlNewEntityInputStream: - * @ctxt: an XML parser context - * @entity: an Entity pointer - * - * Create a new input stream based on an xmlEntityPtr - * - * Returns the new input stream or NULL - */ -xmlParserInputPtr -xmlNewEntityInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { - xmlParserInputPtr input; - - if (entity == NULL) { - xmlErrInternal(ctxt, "xmlNewEntityInputStream entity = NULL\n", - NULL); - return(NULL); - } - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "new input from entity: %s\n", entity->name); - if (entity->content == NULL) { - switch (entity->etype) { - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - xmlErrInternal(ctxt, "Cannot parse entity %s\n", - entity->name); - break; - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - case XML_EXTERNAL_PARAMETER_ENTITY: - return(xmlLoadExternalEntity((char *) entity->URI, - (char *) entity->ExternalID, ctxt)); - case XML_INTERNAL_GENERAL_ENTITY: - xmlErrInternal(ctxt, - "Internal entity %s without content !\n", - entity->name); - break; - case XML_INTERNAL_PARAMETER_ENTITY: - xmlErrInternal(ctxt, - "Internal parameter entity %s without content !\n", - entity->name); - break; - case XML_INTERNAL_PREDEFINED_ENTITY: - xmlErrInternal(ctxt, - "Predefined entity %s without content !\n", - entity->name); - break; - } - return(NULL); - } - input = xmlNewInputStream(ctxt); - if (input == NULL) { - return(NULL); - } - input->filename = (char *) entity->URI; - input->base = entity->content; - input->cur = entity->content; - input->length = entity->length; - input->end = &entity->content[input->length]; - return(input); -} - -/** - * xmlNewStringInputStream: - * @ctxt: an XML parser context - * @buffer: an memory buffer - * - * Create a new input stream based on a memory buffer. - * Returns the new input stream - */ -xmlParserInputPtr -xmlNewStringInputStream(xmlParserCtxtPtr ctxt, const xmlChar *buffer) { - xmlParserInputPtr input; - - if (buffer == NULL) { - xmlErrInternal(ctxt, "xmlNewStringInputStream string = NULL\n", - NULL); - return(NULL); - } - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "new fixed input: %.30s\n", buffer); - input = xmlNewInputStream(ctxt); - if (input == NULL) { - xmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); - return(NULL); - } - input->base = buffer; - input->cur = buffer; - input->length = xmlStrlen(buffer); - input->end = &buffer[input->length]; - return(input); -} - -/** - * xmlNewInputFromFile: - * @ctxt: an XML parser context - * @filename: the filename to use as entity - * - * Create a new input stream based on a file or an URL. - * - * Returns the new input stream or NULL in case of error - */ -xmlParserInputPtr -xmlNewInputFromFile(xmlParserCtxtPtr ctxt, const char *filename) { - xmlParserInputBufferPtr buf; - xmlParserInputPtr inputStream; - char *directory = NULL; - xmlChar *URI = NULL; - - if (xmlParserDebugEntities) - xmlGenericError(xmlGenericErrorContext, - "new input from file: %s\n", filename); - if (ctxt == NULL) return(NULL); - buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); - if (buf == NULL) { - if (filename == NULL) - __xmlLoaderErr(ctxt, - "failed to load external entity: NULL filename \n", - NULL); - else - __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", - (const char *) filename); - return(NULL); - } - - inputStream = xmlNewInputStream(ctxt); - if (inputStream == NULL) - return(NULL); - - inputStream->buf = buf; - inputStream = xmlCheckHTTPInput(ctxt, inputStream); - if (inputStream == NULL) - return(NULL); - - if (inputStream->filename == NULL) - URI = xmlStrdup((xmlChar *) filename); - else - URI = xmlStrdup((xmlChar *) inputStream->filename); - directory = xmlParserGetDirectory((const char *) URI); - if (inputStream->filename != NULL) xmlFree((char *)inputStream->filename); - inputStream->filename = (char *) xmlCanonicPath((const xmlChar *) URI); - if (URI != NULL) xmlFree((char *) URI); - inputStream->directory = directory; - - inputStream->base = inputStream->buf->buffer->content; - inputStream->cur = inputStream->buf->buffer->content; - inputStream->end = &inputStream->base[inputStream->buf->buffer->use]; - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = (char *) xmlStrdup((const xmlChar *) directory); - return(inputStream); -} - -/************************************************************************ - * * - * Commodity functions to handle parser contexts * - * * - ************************************************************************/ - -/** - * xmlInitParserCtxt: - * @ctxt: an XML parser context - * - * Initialize a parser context - * - * Returns 0 in case of success and -1 in case of error - */ - -int -xmlInitParserCtxt(xmlParserCtxtPtr ctxt) -{ - xmlParserInputPtr input; - - if(ctxt==NULL) { - xmlErrInternal(NULL, "Got NULL parser context\n", NULL); - return(-1); - } - - xmlDefaultSAXHandlerInit(); - - if (ctxt->dict == NULL) - ctxt->dict = xmlDictCreate(); - if (ctxt->dict == NULL) { - xmlErrMemory(NULL, "cannot initialize parser context\n"); - return(-1); - } - if (ctxt->sax == NULL) - ctxt->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); - if (ctxt->sax == NULL) { - xmlErrMemory(NULL, "cannot initialize parser context\n"); - return(-1); - } - else - xmlSAXVersion(ctxt->sax, 2); - - ctxt->maxatts = 0; - ctxt->atts = NULL; - /* Allocate the Input stack */ - if (ctxt->inputTab == NULL) { - ctxt->inputTab = (xmlParserInputPtr *) - xmlMalloc(5 * sizeof(xmlParserInputPtr)); - ctxt->inputMax = 5; - } - if (ctxt->inputTab == NULL) { - xmlErrMemory(NULL, "cannot initialize parser context\n"); - ctxt->inputNr = 0; - ctxt->inputMax = 0; - ctxt->input = NULL; - return(-1); - } - while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ - xmlFreeInputStream(input); - } - ctxt->inputNr = 0; - ctxt->input = NULL; - - ctxt->version = NULL; - ctxt->encoding = NULL; - ctxt->standalone = -1; - ctxt->hasExternalSubset = 0; - ctxt->hasPErefs = 0; - ctxt->html = 0; - ctxt->external = 0; - ctxt->instate = XML_PARSER_START; - ctxt->token = 0; - ctxt->directory = NULL; - - /* Allocate the Node stack */ - if (ctxt->nodeTab == NULL) { - ctxt->nodeTab = (xmlNodePtr *) xmlMalloc(10 * sizeof(xmlNodePtr)); - ctxt->nodeMax = 10; - } - if (ctxt->nodeTab == NULL) { - xmlErrMemory(NULL, "cannot initialize parser context\n"); - ctxt->nodeNr = 0; - ctxt->nodeMax = 0; - ctxt->node = NULL; - ctxt->inputNr = 0; - ctxt->inputMax = 0; - ctxt->input = NULL; - return(-1); - } - ctxt->nodeNr = 0; - ctxt->node = NULL; - - /* Allocate the Name stack */ - if (ctxt->nameTab == NULL) { - ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *)); - ctxt->nameMax = 10; - } - if (ctxt->nameTab == NULL) { - xmlErrMemory(NULL, "cannot initialize parser context\n"); - ctxt->nodeNr = 0; - ctxt->nodeMax = 0; - ctxt->node = NULL; - ctxt->inputNr = 0; - ctxt->inputMax = 0; - ctxt->input = NULL; - ctxt->nameNr = 0; - ctxt->nameMax = 0; - ctxt->name = NULL; - return(-1); - } - ctxt->nameNr = 0; - ctxt->name = NULL; - - /* Allocate the space stack */ - if (ctxt->spaceTab == NULL) { - ctxt->spaceTab = (int *) xmlMalloc(10 * sizeof(int)); - ctxt->spaceMax = 10; - } - if (ctxt->spaceTab == NULL) { - xmlErrMemory(NULL, "cannot initialize parser context\n"); - ctxt->nodeNr = 0; - ctxt->nodeMax = 0; - ctxt->node = NULL; - ctxt->inputNr = 0; - ctxt->inputMax = 0; - ctxt->input = NULL; - ctxt->nameNr = 0; - ctxt->nameMax = 0; - ctxt->name = NULL; - ctxt->spaceNr = 0; - ctxt->spaceMax = 0; - ctxt->space = NULL; - return(-1); - } - ctxt->spaceNr = 1; - ctxt->spaceMax = 10; - ctxt->spaceTab[0] = -1; - ctxt->space = &ctxt->spaceTab[0]; - ctxt->userData = ctxt; - ctxt->myDoc = NULL; - ctxt->wellFormed = 1; - ctxt->nsWellFormed = 1; - ctxt->valid = 1; - ctxt->loadsubset = xmlLoadExtDtdDefaultValue; - ctxt->validate = xmlDoValidityCheckingDefaultValue; - ctxt->pedantic = xmlPedanticParserDefaultValue; - ctxt->linenumbers = xmlLineNumbersDefaultValue; - ctxt->keepBlanks = xmlKeepBlanksDefaultValue; - if (ctxt->keepBlanks == 0) - ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace; - - ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0; - ctxt->vctxt.userData = ctxt; - ctxt->vctxt.error = xmlParserValidityError; - ctxt->vctxt.warning = xmlParserValidityWarning; - if (ctxt->validate) { - if (xmlGetWarningsDefaultValue == 0) - ctxt->vctxt.warning = NULL; - else - ctxt->vctxt.warning = xmlParserValidityWarning; - ctxt->vctxt.nodeMax = 0; - } - ctxt->replaceEntities = xmlSubstituteEntitiesDefaultValue; - ctxt->record_info = 0; - ctxt->nbChars = 0; - ctxt->checkIndex = 0; - ctxt->inSubset = 0; - ctxt->errNo = XML_ERR_OK; - ctxt->depth = 0; - ctxt->charset = XML_CHAR_ENCODING_UTF8; - ctxt->catalogs = NULL; - xmlInitNodeInfoSeq(&ctxt->node_seq); - return(0); -} - -/** - * xmlFreeParserCtxt: - * @ctxt: an XML parser context - * - * Free all the memory used by a parser context. However the parsed - * document in ctxt->myDoc is not freed. - */ - -void -xmlFreeParserCtxt(xmlParserCtxtPtr ctxt) -{ - xmlParserInputPtr input; - - if (ctxt == NULL) return; - - while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ - xmlFreeInputStream(input); - } - if (ctxt->spaceTab != NULL) xmlFree(ctxt->spaceTab); - if (ctxt->nameTab != NULL) xmlFree((xmlChar * *)ctxt->nameTab); - if (ctxt->nodeTab != NULL) xmlFree(ctxt->nodeTab); - if (ctxt->inputTab != NULL) xmlFree(ctxt->inputTab); - if (ctxt->version != NULL) xmlFree((char *) ctxt->version); - if (ctxt->encoding != NULL) xmlFree((char *) ctxt->encoding); - if (ctxt->extSubURI != NULL) xmlFree((char *) ctxt->extSubURI); - if (ctxt->extSubSystem != NULL) xmlFree((char *) ctxt->extSubSystem); -#ifdef LIBXML_SAX1_ENABLED - if ((ctxt->sax != NULL) && - (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler)) -#else - if (ctxt->sax != NULL) -#endif /* LIBXML_SAX1_ENABLED */ - xmlFree(ctxt->sax); - if (ctxt->directory != NULL) xmlFree((char *) ctxt->directory); - if (ctxt->vctxt.nodeTab != NULL) xmlFree(ctxt->vctxt.nodeTab); - if (ctxt->atts != NULL) xmlFree((xmlChar * *)ctxt->atts); - if (ctxt->dict != NULL) xmlDictFree(ctxt->dict); - if (ctxt->nsTab != NULL) xmlFree((char *) ctxt->nsTab); - if (ctxt->pushTab != NULL) xmlFree(ctxt->pushTab); - if (ctxt->attallocs != NULL) xmlFree(ctxt->attallocs); - if (ctxt->attsDefault != NULL) - xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); - if (ctxt->attsSpecial != NULL) - xmlHashFree(ctxt->attsSpecial, NULL); - if (ctxt->freeElems != NULL) { - xmlNodePtr cur, next; - - cur = ctxt->freeElems; - while (cur != NULL) { - next = cur->next; - xmlFree(cur); - cur = next; - } - } - if (ctxt->freeAttrs != NULL) { - xmlAttrPtr cur, next; - - cur = ctxt->freeAttrs; - while (cur != NULL) { - next = cur->next; - xmlFree(cur); - cur = next; - } - } - /* - * cleanup the error strings - */ - if (ctxt->lastError.message != NULL) - xmlFree(ctxt->lastError.message); - if (ctxt->lastError.file != NULL) - xmlFree(ctxt->lastError.file); - if (ctxt->lastError.str1 != NULL) - xmlFree(ctxt->lastError.str1); - if (ctxt->lastError.str2 != NULL) - xmlFree(ctxt->lastError.str2); - if (ctxt->lastError.str3 != NULL) - xmlFree(ctxt->lastError.str3); - -#ifdef LIBXML_CATALOG_ENABLED - if (ctxt->catalogs != NULL) - xmlCatalogFreeLocal(ctxt->catalogs); -#endif - xmlFree(ctxt); -} - -/** - * xmlNewParserCtxt: - * - * Allocate and initialize a new parser context. - * - * Returns the xmlParserCtxtPtr or NULL - */ - -xmlParserCtxtPtr -xmlNewParserCtxt(void) -{ - xmlParserCtxtPtr ctxt; - - ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt)); - if (ctxt == NULL) { - xmlErrMemory(NULL, "cannot allocate parser context\n"); - return(NULL); - } - memset(ctxt, 0, sizeof(xmlParserCtxt)); - if (xmlInitParserCtxt(ctxt) < 0) { - xmlFreeParserCtxt(ctxt); - return(NULL); - } - return(ctxt); -} - -/************************************************************************ - * * - * Handling of node informations * - * * - ************************************************************************/ - -/** - * xmlClearParserCtxt: - * @ctxt: an XML parser context - * - * Clear (release owned resources) and reinitialize a parser context - */ - -void -xmlClearParserCtxt(xmlParserCtxtPtr ctxt) -{ - if (ctxt==NULL) - return; - xmlClearNodeInfoSeq(&ctxt->node_seq); - xmlCtxtReset(ctxt); -} - - -/** - * xmlParserFindNodeInfo: - * @ctx: an XML parser context - * @node: an XML node within the tree - * - * Find the parser node info struct for a given node - * - * Returns an xmlParserNodeInfo block pointer or NULL - */ -const xmlParserNodeInfo * -xmlParserFindNodeInfo(const xmlParserCtxtPtr ctx, const xmlNodePtr node) -{ - unsigned long pos; - - if ((ctx == NULL) || (node == NULL)) - return (NULL); - /* Find position where node should be at */ - pos = xmlParserFindNodeInfoIndex(&ctx->node_seq, node); - if (pos < ctx->node_seq.length - && ctx->node_seq.buffer[pos].node == node) - return &ctx->node_seq.buffer[pos]; - else - return NULL; -} - - -/** - * xmlInitNodeInfoSeq: - * @seq: a node info sequence pointer - * - * -- Initialize (set to initial state) node info sequence - */ -void -xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq) -{ - if (seq == NULL) - return; - seq->length = 0; - seq->maximum = 0; - seq->buffer = NULL; -} - -/** - * xmlClearNodeInfoSeq: - * @seq: a node info sequence pointer - * - * -- Clear (release memory and reinitialize) node - * info sequence - */ -void -xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq) -{ - if (seq == NULL) - return; - if (seq->buffer != NULL) - xmlFree(seq->buffer); - xmlInitNodeInfoSeq(seq); -} - -/** - * xmlParserFindNodeInfoIndex: - * @seq: a node info sequence pointer - * @node: an XML node pointer - * - * - * xmlParserFindNodeInfoIndex : Find the index that the info record for - * the given node is or should be at in a sorted sequence - * - * Returns a long indicating the position of the record - */ -unsigned long -xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq, - const xmlNodePtr node) -{ - unsigned long upper, lower, middle; - int found = 0; - - if ((seq == NULL) || (node == NULL)) - return ((unsigned long) -1); - - /* Do a binary search for the key */ - lower = 1; - upper = seq->length; - middle = 0; - while (lower <= upper && !found) { - middle = lower + (upper - lower) / 2; - if (node == seq->buffer[middle - 1].node) - found = 1; - else if (node < seq->buffer[middle - 1].node) - upper = middle - 1; - else - lower = middle + 1; - } - - /* Return position */ - if (middle == 0 || seq->buffer[middle - 1].node < node) - return middle; - else - return middle - 1; -} - - -/** - * xmlParserAddNodeInfo: - * @ctxt: an XML parser context - * @info: a node info sequence pointer - * - * Insert node info record into the sorted sequence - */ -void -xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt, - const xmlParserNodeInfoPtr info) -{ - unsigned long pos; - - if ((ctxt == NULL) || (info == NULL)) return; - - /* Find pos and check to see if node is already in the sequence */ - pos = xmlParserFindNodeInfoIndex(&ctxt->node_seq, (xmlNodePtr) - info->node); - - if ((pos < ctxt->node_seq.length) && - (ctxt->node_seq.buffer != NULL) && - (ctxt->node_seq.buffer[pos].node == info->node)) { - ctxt->node_seq.buffer[pos] = *info; - } - - /* Otherwise, we need to add new node to buffer */ - else { - if (ctxt->node_seq.length + 1 > ctxt->node_seq.maximum) { - xmlParserNodeInfo *tmp_buffer; - unsigned int byte_size; - - if (ctxt->node_seq.maximum == 0) - ctxt->node_seq.maximum = 2; - byte_size = (sizeof(*ctxt->node_seq.buffer) * - (2 * ctxt->node_seq.maximum)); - - if (ctxt->node_seq.buffer == NULL) - tmp_buffer = (xmlParserNodeInfo *) xmlMalloc(byte_size); - else - tmp_buffer = - (xmlParserNodeInfo *) xmlRealloc(ctxt->node_seq.buffer, - byte_size); - - if (tmp_buffer == NULL) { - xmlErrMemory(ctxt, "failed to allocate buffer\n"); - return; - } - ctxt->node_seq.buffer = tmp_buffer; - ctxt->node_seq.maximum *= 2; - } - - /* If position is not at end, move elements out of the way */ - if (pos != ctxt->node_seq.length) { - unsigned long i; - - for (i = ctxt->node_seq.length; i > pos; i--) - ctxt->node_seq.buffer[i] = ctxt->node_seq.buffer[i - 1]; - } - - /* Copy element and increase length */ - ctxt->node_seq.buffer[pos] = *info; - ctxt->node_seq.length++; - } -} - -/************************************************************************ - * * - * Defaults settings * - * * - ************************************************************************/ -/** - * xmlPedanticParserDefault: - * @val: int 0 or 1 - * - * Set and return the previous value for enabling pedantic warnings. - * - * Returns the last value for 0 for no substitution, 1 for substitution. - */ - -int -xmlPedanticParserDefault(int val) { - int old = xmlPedanticParserDefaultValue; - - xmlPedanticParserDefaultValue = val; - return(old); -} - -/** - * xmlLineNumbersDefault: - * @val: int 0 or 1 - * - * Set and return the previous value for enabling line numbers in elements - * contents. This may break on old application and is turned off by default. - * - * Returns the last value for 0 for no substitution, 1 for substitution. - */ - -int -xmlLineNumbersDefault(int val) { - int old = xmlLineNumbersDefaultValue; - - xmlLineNumbersDefaultValue = val; - return(old); -} - -/** - * xmlSubstituteEntitiesDefault: - * @val: int 0 or 1 - * - * Set and return the previous value for default entity support. - * Initially the parser always keep entity references instead of substituting - * entity values in the output. This function has to be used to change the - * default parser behavior - * SAX::substituteEntities() has to be used for changing that on a file by - * file basis. - * - * Returns the last value for 0 for no substitution, 1 for substitution. - */ - -int -xmlSubstituteEntitiesDefault(int val) { - int old = xmlSubstituteEntitiesDefaultValue; - - xmlSubstituteEntitiesDefaultValue = val; - return(old); -} - -/** - * xmlKeepBlanksDefault: - * @val: int 0 or 1 - * - * Set and return the previous value for default blanks text nodes support. - * The 1.x version of the parser used an heuristic to try to detect - * ignorable white spaces. As a result the SAX callback was generating - * xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when - * using the DOM output text nodes containing those blanks were not generated. - * The 2.x and later version will switch to the XML standard way and - * ignorableWhitespace() are only generated when running the parser in - * validating mode and when the current element doesn't allow CDATA or - * mixed content. - * This function is provided as a way to force the standard behavior - * on 1.X libs and to switch back to the old mode for compatibility when - * running 1.X client code on 2.X . Upgrade of 1.X code should be done - * by using xmlIsBlankNode() commodity function to detect the "empty" - * nodes generated. - * This value also affect autogeneration of indentation when saving code - * if blanks sections are kept, indentation is not generated. - * - * Returns the last value for 0 for no substitution, 1 for substitution. - */ - -int -xmlKeepBlanksDefault(int val) { - int old = xmlKeepBlanksDefaultValue; - - xmlKeepBlanksDefaultValue = val; - xmlIndentTreeOutput = !val; - return(old); -} - -#define bottom_parserInternals -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/pattern.c b/ThirdParty/libxml2/vtklibxml2/pattern.c deleted file mode 100644 index 55d92a53fbd..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/pattern.c +++ /dev/null @@ -1,2607 +0,0 @@ -/* - * pattern.c: Implemetation of selectors for nodes - * - * Reference: - * http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/ - * to some extent - * http://www.w3.org/TR/1999/REC-xml-19991116 - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -/* - * TODO: - * - compilation flags to check for specific syntaxes - * using flags of xmlPatterncompile() - * - making clear how pattern starting with / or . need to be handled, - * currently push(NULL, NULL) means a reset of the streaming context - * and indicating we are on / (the document node), probably need - * something similar for . - * - get rid of the "compile" starting with lowercase - * - DONE (2006-05-16): get rid of the Strdup/Strndup in case of dictionary - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/hash.h> -#include <libxml/dict.h> -#include <libxml/xmlerror.h> -#include <libxml/parserInternals.h> -#include <libxml/pattern.h> - -#ifdef LIBXML_PATTERN_ENABLED - -/* #define DEBUG_STREAMING */ - -#define ERROR(a, b, c, d) -#define ERROR5(a, b, c, d, e) - -#define XML_STREAM_STEP_DESC 1 -#define XML_STREAM_STEP_FINAL 2 -#define XML_STREAM_STEP_ROOT 4 -#define XML_STREAM_STEP_ATTR 8 -#define XML_STREAM_STEP_NODE 16 -#define XML_STREAM_STEP_IN_SET 32 - -/* -* NOTE: Those private flags (XML_STREAM_xxx) are used -* in _xmlStreamCtxt->flag. They extend the public -* xmlPatternFlags, so be carefull not to interfere with the -* reserved values for xmlPatternFlags. -*/ -#define XML_STREAM_FINAL_IS_ANY_NODE 1<<14 -#define XML_STREAM_FROM_ROOT 1<<15 -#define XML_STREAM_DESC 1<<16 - -/* -* XML_STREAM_ANY_NODE is used for comparison against -* xmlElementType enums, to indicate a node of any type. -*/ -#define XML_STREAM_ANY_NODE 100 - -#define XML_PATTERN_NOTPATTERN (XML_PATTERN_XPATH | \ - XML_PATTERN_XSSEL | \ - XML_PATTERN_XSFIELD) - -#define XML_STREAM_XS_IDC(c) ((c)->flags & \ - (XML_PATTERN_XSSEL | XML_PATTERN_XSFIELD)) - -#define XML_STREAM_XS_IDC_SEL(c) ((c)->flags & XML_PATTERN_XSSEL) - -#define XML_STREAM_XS_IDC_FIELD(c) ((c)->flags & XML_PATTERN_XSFIELD) - -#define XML_PAT_COPY_NSNAME(c, r, nsname) \ - if ((c)->comp->dict) \ - r = (xmlChar *) xmlDictLookup((c)->comp->dict, BAD_CAST nsname, -1); \ - else r = xmlStrdup(BAD_CAST nsname); - -#define XML_PAT_FREE_STRING(c, r) if ((c)->comp->dict == NULL) xmlFree(r); - -typedef struct _xmlStreamStep xmlStreamStep; -typedef xmlStreamStep *xmlStreamStepPtr; -struct _xmlStreamStep { - int flags; /* properties of that step */ - const xmlChar *name; /* first string value if NULL accept all */ - const xmlChar *ns; /* second string value */ - int nodeType; /* type of node */ -}; - -typedef struct _xmlStreamComp xmlStreamComp; -typedef xmlStreamComp *xmlStreamCompPtr; -struct _xmlStreamComp { - xmlDict *dict; /* the dictionary if any */ - int nbStep; /* number of steps in the automata */ - int maxStep; /* allocated number of steps */ - xmlStreamStepPtr steps; /* the array of steps */ - int flags; -}; - -struct _xmlStreamCtxt { - struct _xmlStreamCtxt *next;/* link to next sub pattern if | */ - xmlStreamCompPtr comp; /* the compiled stream */ - int nbState; /* number of states in the automata */ - int maxState; /* allocated number of states */ - int level; /* how deep are we ? */ - int *states; /* the array of step indexes */ - int flags; /* validation options */ - int blockLevel; -}; - -static void xmlFreeStreamComp(xmlStreamCompPtr comp); - -/* - * Types are private: - */ - -typedef enum { - XML_OP_END=0, - XML_OP_ROOT, - XML_OP_ELEM, - XML_OP_CHILD, - XML_OP_ATTR, - XML_OP_PARENT, - XML_OP_ANCESTOR, - XML_OP_NS, - XML_OP_ALL -} xmlPatOp; - - -typedef struct _xmlStepState xmlStepState; -typedef xmlStepState *xmlStepStatePtr; -struct _xmlStepState { - int step; - xmlNodePtr node; -}; - -typedef struct _xmlStepStates xmlStepStates; -typedef xmlStepStates *xmlStepStatesPtr; -struct _xmlStepStates { - int nbstates; - int maxstates; - xmlStepStatePtr states; -}; - -typedef struct _xmlStepOp xmlStepOp; -typedef xmlStepOp *xmlStepOpPtr; -struct _xmlStepOp { - xmlPatOp op; - const xmlChar *value; - const xmlChar *value2; /* The namespace name */ -}; - -#define PAT_FROM_ROOT (1<<8) -#define PAT_FROM_CUR (1<<9) - -struct _xmlPattern { - void *data; /* the associated template */ - xmlDictPtr dict; /* the optional dictionary */ - struct _xmlPattern *next; /* next pattern if | is used */ - const xmlChar *pattern; /* the pattern */ - int flags; /* flags */ - int nbStep; - int maxStep; - xmlStepOpPtr steps; /* ops for computation */ - xmlStreamCompPtr stream; /* the streaming data if any */ -}; - -typedef struct _xmlPatParserContext xmlPatParserContext; -typedef xmlPatParserContext *xmlPatParserContextPtr; -struct _xmlPatParserContext { - const xmlChar *cur; /* the current char being parsed */ - const xmlChar *base; /* the full expression */ - int error; /* error code */ - xmlDictPtr dict; /* the dictionary if any */ - xmlPatternPtr comp; /* the result */ - xmlNodePtr elem; /* the current node if any */ - const xmlChar **namespaces; /* the namespaces definitions */ - int nb_namespaces; /* the number of namespaces */ -}; - -/************************************************************************ - * * - * Type functions * - * * - ************************************************************************/ - -/** - * xmlNewPattern: - * - * Create a new XSLT Pattern - * - * Returns the newly allocated xmlPatternPtr or NULL in case of error - */ -static xmlPatternPtr -xmlNewPattern(void) { - xmlPatternPtr cur; - - cur = (xmlPatternPtr) xmlMalloc(sizeof(xmlPattern)); - if (cur == NULL) { - ERROR(NULL, NULL, NULL, - "xmlNewPattern : malloc failed\n"); - return(NULL); - } - memset(cur, 0, sizeof(xmlPattern)); - cur->maxStep = 10; - cur->steps = (xmlStepOpPtr) xmlMalloc(cur->maxStep * sizeof(xmlStepOp)); - if (cur->steps == NULL) { - xmlFree(cur); - ERROR(NULL, NULL, NULL, - "xmlNewPattern : malloc failed\n"); - return(NULL); - } - return(cur); -} - -/** - * xmlFreePattern: - * @comp: an XSLT comp - * - * Free up the memory allocated by @comp - */ -void -xmlFreePattern(xmlPatternPtr comp) { - xmlStepOpPtr op; - int i; - - if (comp == NULL) - return; - if (comp->next != NULL) - xmlFreePattern(comp->next); - if (comp->stream != NULL) - xmlFreeStreamComp(comp->stream); - if (comp->pattern != NULL) - xmlFree((xmlChar *)comp->pattern); - if (comp->steps != NULL) { - if (comp->dict == NULL) { - for (i = 0;i < comp->nbStep;i++) { - op = &comp->steps[i]; - if (op->value != NULL) - xmlFree((xmlChar *) op->value); - if (op->value2 != NULL) - xmlFree((xmlChar *) op->value2); - } - } - xmlFree(comp->steps); - } - if (comp->dict != NULL) - xmlDictFree(comp->dict); - - memset(comp, -1, sizeof(xmlPattern)); - xmlFree(comp); -} - -/** - * xmlFreePatternList: - * @comp: an XSLT comp list - * - * Free up the memory allocated by all the elements of @comp - */ -void -xmlFreePatternList(xmlPatternPtr comp) { - xmlPatternPtr cur; - - while (comp != NULL) { - cur = comp; - comp = comp->next; - cur->next = NULL; - xmlFreePattern(cur); - } -} - -/** - * xmlNewPatParserContext: - * @pattern: the pattern context - * @dict: the inherited dictionary or NULL - * @namespaces: the prefix definitions, array of [URI, prefix] terminated - * with [NULL, NULL] or NULL if no namespace is used - * - * Create a new XML pattern parser context - * - * Returns the newly allocated xmlPatParserContextPtr or NULL in case of error - */ -static xmlPatParserContextPtr -xmlNewPatParserContext(const xmlChar *pattern, xmlDictPtr dict, - const xmlChar **namespaces) { - xmlPatParserContextPtr cur; - - if (pattern == NULL) - return(NULL); - - cur = (xmlPatParserContextPtr) xmlMalloc(sizeof(xmlPatParserContext)); - if (cur == NULL) { - ERROR(NULL, NULL, NULL, - "xmlNewPatParserContext : malloc failed\n"); - return(NULL); - } - memset(cur, 0, sizeof(xmlPatParserContext)); - cur->dict = dict; - cur->cur = pattern; - cur->base = pattern; - if (namespaces != NULL) { - int i; - for (i = 0;namespaces[2 * i] != NULL;i++); - cur->nb_namespaces = i; - } else { - cur->nb_namespaces = 0; - } - cur->namespaces = namespaces; - return(cur); -} - -/** - * xmlFreePatParserContext: - * @ctxt: an XSLT parser context - * - * Free up the memory allocated by @ctxt - */ -static void -xmlFreePatParserContext(xmlPatParserContextPtr ctxt) { - if (ctxt == NULL) - return; - memset(ctxt, -1, sizeof(xmlPatParserContext)); - xmlFree(ctxt); -} - -/** - * xmlPatternAdd: - * @comp: the compiled match expression - * @op: an op - * @value: the first value - * @value2: the second value - * - * Add a step to an XSLT Compiled Match - * - * Returns -1 in case of failure, 0 otherwise. - */ -static int -xmlPatternAdd(xmlPatParserContextPtr ctxt ATTRIBUTE_UNUSED, - xmlPatternPtr comp, - xmlPatOp op, xmlChar * value, xmlChar * value2) -{ - if (comp->nbStep >= comp->maxStep) { - xmlStepOpPtr temp; - temp = (xmlStepOpPtr) xmlRealloc(comp->steps, comp->maxStep * 2 * - sizeof(xmlStepOp)); - if (temp == NULL) { - ERROR(ctxt, NULL, NULL, - "xmlPatternAdd: realloc failed\n"); - return (-1); - } - comp->steps = temp; - comp->maxStep *= 2; - } - comp->steps[comp->nbStep].op = op; - comp->steps[comp->nbStep].value = value; - comp->steps[comp->nbStep].value2 = value2; - comp->nbStep++; - return (0); -} - -#if 0 -/** - * xsltSwapTopPattern: - * @comp: the compiled match expression - * - * reverse the two top steps. - */ -static void -xsltSwapTopPattern(xmlPatternPtr comp) { - int i; - int j = comp->nbStep - 1; - - if (j > 0) { - register const xmlChar *tmp; - register xmlPatOp op; - i = j - 1; - tmp = comp->steps[i].value; - comp->steps[i].value = comp->steps[j].value; - comp->steps[j].value = tmp; - tmp = comp->steps[i].value2; - comp->steps[i].value2 = comp->steps[j].value2; - comp->steps[j].value2 = tmp; - op = comp->steps[i].op; - comp->steps[i].op = comp->steps[j].op; - comp->steps[j].op = op; - } -} -#endif - -/** - * xmlReversePattern: - * @comp: the compiled match expression - * - * reverse all the stack of expressions - * - * returns 0 in case of success and -1 in case of error. - */ -static int -xmlReversePattern(xmlPatternPtr comp) { - int i, j; - - /* - * remove the leading // for //a or .//a - */ - if ((comp->nbStep > 0) && (comp->steps[0].op == XML_OP_ANCESTOR)) { - for (i = 0, j = 1;j < comp->nbStep;i++,j++) { - comp->steps[i].value = comp->steps[j].value; - comp->steps[i].value2 = comp->steps[j].value2; - comp->steps[i].op = comp->steps[j].op; - } - comp->nbStep--; - } - if (comp->nbStep >= comp->maxStep) { - xmlStepOpPtr temp; - temp = (xmlStepOpPtr) xmlRealloc(comp->steps, comp->maxStep * 2 * - sizeof(xmlStepOp)); - if (temp == NULL) { - ERROR(ctxt, NULL, NULL, - "xmlReversePattern: realloc failed\n"); - return (-1); - } - comp->steps = temp; - comp->maxStep *= 2; - } - i = 0; - j = comp->nbStep - 1; - while (j > i) { - register const xmlChar *tmp; - register xmlPatOp op; - tmp = comp->steps[i].value; - comp->steps[i].value = comp->steps[j].value; - comp->steps[j].value = tmp; - tmp = comp->steps[i].value2; - comp->steps[i].value2 = comp->steps[j].value2; - comp->steps[j].value2 = tmp; - op = comp->steps[i].op; - comp->steps[i].op = comp->steps[j].op; - comp->steps[j].op = op; - j--; - i++; - } - comp->steps[comp->nbStep].value = NULL; - comp->steps[comp->nbStep].value2 = NULL; - comp->steps[comp->nbStep++].op = XML_OP_END; - return(0); -} - -/************************************************************************ - * * - * The interpreter for the precompiled patterns * - * * - ************************************************************************/ - -static int -xmlPatPushState(xmlStepStates *states, int step, xmlNodePtr node) { - if ((states->states == NULL) || (states->maxstates <= 0)) { - states->maxstates = 4; - states->nbstates = 0; - states->states = xmlMalloc(4 * sizeof(xmlStepState)); - } - else if (states->maxstates <= states->nbstates) { - xmlStepState *tmp; - - tmp = (xmlStepStatePtr) xmlRealloc(states->states, - 2 * states->maxstates * sizeof(xmlStepState)); - if (tmp == NULL) - return(-1); - states->states = tmp; - states->maxstates *= 2; - } - states->states[states->nbstates].step = step; - states->states[states->nbstates++].node = node; -#if 0 - fprintf(stderr, "Push: %d, %s\n", step, node->name); -#endif - return(0); -} - -/** - * xmlPatMatch: - * @comp: the precompiled pattern - * @node: a node - * - * Test whether the node matches the pattern - * - * Returns 1 if it matches, 0 if it doesn't and -1 in case of failure - */ -static int -xmlPatMatch(xmlPatternPtr comp, xmlNodePtr node) { - int i; - xmlStepOpPtr step; - xmlStepStates states = {0, 0, NULL}; /* // may require backtrack */ - - if ((comp == NULL) || (node == NULL)) return(-1); - i = 0; -restart: - for (;i < comp->nbStep;i++) { - step = &comp->steps[i]; - switch (step->op) { - case XML_OP_END: - goto found; - case XML_OP_ROOT: - if (node->type == XML_NAMESPACE_DECL) - goto rollback; - node = node->parent; - if ((node->type == XML_DOCUMENT_NODE) || -#ifdef LIBXML_DOCB_ENABLED - (node->type == XML_DOCB_DOCUMENT_NODE) || -#endif - (node->type == XML_HTML_DOCUMENT_NODE)) - continue; - goto rollback; - case XML_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 XML_OP_CHILD: { - xmlNodePtr lst; - - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_DOCUMENT_NODE) && -#ifdef LIBXML_DOCB_ENABLED - (node->type != XML_DOCB_DOCUMENT_NODE) && -#endif - (node->type != XML_HTML_DOCUMENT_NODE)) - goto rollback; - - lst = node->children; - - if (step->value != NULL) { - while (lst != NULL) { - if ((lst->type == XML_ELEMENT_NODE) && - (step->value[0] == lst->name[0]) && - (xmlStrEqual(step->value, lst->name))) - break; - lst = lst->next; - } - if (lst != NULL) - continue; - } - goto rollback; - } - case XML_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 XML_OP_PARENT: - if ((node->type == XML_DOCUMENT_NODE) || - (node->type == XML_HTML_DOCUMENT_NODE) || -#ifdef LIBXML_DOCB_ENABLED - (node->type == XML_DOCB_DOCUMENT_NODE) || -#endif - (node->type == XML_NAMESPACE_DECL)) - goto rollback; - node = node->parent; - if (node == NULL) - 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 XML_OP_ANCESTOR: - /* TODO: implement coalescing of ANCESTOR/NODE ops */ - if (step->value == NULL) { - i++; - step = &comp->steps[i]; - if (step->op == XML_OP_ROOT) - goto found; - if (step->op != XML_OP_ELEM) - goto rollback; - if (step->value == NULL) - return(-1); - } - if (node == NULL) - goto rollback; - if ((node->type == XML_DOCUMENT_NODE) || - (node->type == XML_HTML_DOCUMENT_NODE) || -#ifdef LIBXML_DOCB_ENABLED - (node->type == XML_DOCB_DOCUMENT_NODE) || -#endif - (node->type == XML_NAMESPACE_DECL)) - goto rollback; - node = node->parent; - while (node != NULL) { - if ((node->type == XML_ELEMENT_NODE) && - (step->value[0] == node->name[0]) && - (xmlStrEqual(step->value, node->name))) { - /* Namespace test */ - if (node->ns == NULL) { - if (step->value2 == NULL) - break; - } else if (node->ns->href != NULL) { - if ((step->value2 != NULL) && - (xmlStrEqual(step->value2, node->ns->href))) - break; - } - } - node = node->parent; - } - if (node == NULL) - goto rollback; - /* - * prepare a potential rollback from here - * for ancestors of that node. - */ - if (step->op == XML_OP_ANCESTOR) - xmlPatPushState(&states, i, node); - else - xmlPatPushState(&states, i - 1, node); - continue; - case XML_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 XML_OP_ALL: - if (node->type != XML_ELEMENT_NODE) - goto rollback; - break; - } - } -found: - if (states.states != NULL) { - /* Free the rollback states */ - xmlFree(states.states); - } - return(1); -rollback: - /* got an error try to rollback */ - if (states.states == NULL) - return(0); - if (states.nbstates <= 0) { - xmlFree(states.states); - return(0); - } - states.nbstates--; - i = states.states[states.nbstates].step; - node = states.states[states.nbstates].node; -#if 0 - fprintf(stderr, "Pop: %d, %s\n", i, node->name); -#endif - goto restart; -} - -/************************************************************************ - * * - * Dedicated parser for templates * - * * - ************************************************************************/ - -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); -#define CUR (*ctxt->cur) -#define SKIP(val) ctxt->cur += (val) -#define NXT(val) ctxt->cur[(val)] -#define PEEKPREV(val) ctxt->cur[-(val)] -#define CUR_PTR ctxt->cur - -#define SKIP_BLANKS \ - while (IS_BLANK_CH(CUR)) NEXT - -#define CURRENT (*ctxt->cur) -#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) - - -#define PUSH(op, val, val2) \ - if (xmlPatternAdd(ctxt, ctxt->comp, (op), (val), (val2))) goto error; - -#define XSLT_ERROR(X) \ - { xsltError(ctxt, __FILE__, __LINE__, X); \ - ctxt->error = (X); return; } - -#define XSLT_ERROR0(X) \ - { xsltError(ctxt, __FILE__, __LINE__, X); \ - ctxt->error = (X); return(0); } - -#if 0 -/** - * xmlPatScanLiteral: - * @ctxt: the XPath Parser context - * - * Parse an XPath Litteral: - * - * [29] Literal ::= '"' [^"]* '"' - * | "'" [^']* "'" - * - * Returns the Literal parsed or NULL - */ - -static xmlChar * -xmlPatScanLiteral(xmlPatParserContextPtr ctxt) { - const xmlChar *q, *cur; - xmlChar *ret = NULL; - int val, len; - - SKIP_BLANKS; - if (CUR == '"') { - NEXT; - cur = q = CUR_PTR; - val = xmlStringCurrentChar(NULL, cur, &len); - while ((IS_CHAR(val)) && (val != '"')) { - cur += len; - val = xmlStringCurrentChar(NULL, cur, &len); - } - if (!IS_CHAR(val)) { - ctxt->error = 1; - return(NULL); - } else { - if (ctxt->dict) - ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q); - else - ret = xmlStrndup(q, cur - q); - } - cur += len; - CUR_PTR = cur; - } else if (CUR == '\'') { - NEXT; - cur = q = CUR_PTR; - val = xmlStringCurrentChar(NULL, cur, &len); - while ((IS_CHAR(val)) && (val != '\'')) { - cur += len; - val = xmlStringCurrentChar(NULL, cur, &len); - } - if (!IS_CHAR(val)) { - ctxt->error = 1; - return(NULL); - } else { - if (ctxt->dict) - ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q); - else - ret = xmlStrndup(q, cur - q); - } - cur += len; - CUR_PTR = cur; - } else { - /* XP_ERROR(XPATH_START_LITERAL_ERROR); */ - ctxt->error = 1; - return(NULL); - } - return(ret); -} -#endif - -/** - * xmlPatScanName: - * @ctxt: the XPath Parser context - * - * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | - * CombiningChar | Extender - * - * [5] Name ::= (Letter | '_' | ':') (NameChar)* - * - * [6] Names ::= Name (S Name)* - * - * Returns the Name parsed or NULL - */ - -static xmlChar * -xmlPatScanName(xmlPatParserContextPtr ctxt) { - const xmlChar *q, *cur; - xmlChar *ret = NULL; - int val, len; - - SKIP_BLANKS; - - cur = q = CUR_PTR; - val = xmlStringCurrentChar(NULL, cur, &len); - if (!IS_LETTER(val) && (val != '_') && (val != ':')) - return(NULL); - - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || - (val == '.') || (val == '-') || - (val == '_') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { - cur += len; - val = xmlStringCurrentChar(NULL, cur, &len); - } - if (ctxt->dict) - ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q); - else - ret = xmlStrndup(q, cur - q); - CUR_PTR = cur; - return(ret); -} - -/** - * xmlPatScanNCName: - * @ctxt: the XPath Parser context - * - * Parses a non qualified name - * - * Returns the Name parsed or NULL - */ - -static xmlChar * -xmlPatScanNCName(xmlPatParserContextPtr ctxt) { - const xmlChar *q, *cur; - xmlChar *ret = NULL; - int val, len; - - SKIP_BLANKS; - - cur = q = CUR_PTR; - val = xmlStringCurrentChar(NULL, cur, &len); - if (!IS_LETTER(val) && (val != '_')) - return(NULL); - - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || - (val == '.') || (val == '-') || - (val == '_') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { - cur += len; - val = xmlStringCurrentChar(NULL, cur, &len); - } - if (ctxt->dict) - ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q); - else - ret = xmlStrndup(q, cur - q); - CUR_PTR = cur; - return(ret); -} - -#if 0 -/** - * xmlPatScanQName: - * @ctxt: the XPath Parser context - * @prefix: the place to store the prefix - * - * Parse a qualified name - * - * Returns the Name parsed or NULL - */ - -static xmlChar * -xmlPatScanQName(xmlPatParserContextPtr ctxt, xmlChar **prefix) { - xmlChar *ret = NULL; - - *prefix = NULL; - ret = xmlPatScanNCName(ctxt); - if (CUR == ':') { - *prefix = ret; - NEXT; - ret = xmlPatScanNCName(ctxt); - } - return(ret); -} -#endif - -/** - * xmlCompileAttributeTest: - * @ctxt: the compilation context - * - * Compile an attribute test. - */ -static void -xmlCompileAttributeTest(xmlPatParserContextPtr ctxt) { - xmlChar *token = NULL; - xmlChar *name = NULL; - xmlChar *URL = NULL; - - SKIP_BLANKS; - name = xmlPatScanNCName(ctxt); - if (name == NULL) { - if (CUR == '*') { - PUSH(XML_OP_ATTR, NULL, NULL); - NEXT; - } else { - ERROR(NULL, NULL, NULL, - "xmlCompileAttributeTest : Name expected\n"); - ctxt->error = 1; - } - return; - } - if (CUR == ':') { - int i; - xmlChar *prefix = name; - - NEXT; - - if (IS_BLANK_CH(CUR)) { - ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL); - XML_PAT_FREE_STRING(ctxt, prefix); - ctxt->error = 1; - goto error; - } - /* - * This is a namespace match - */ - token = xmlPatScanName(ctxt); - if ((prefix[0] == 'x') && - (prefix[1] == 'm') && - (prefix[2] == 'l') && - (prefix[3] == 0)) - { - XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE); - } else { - for (i = 0;i < ctxt->nb_namespaces;i++) { - if (xmlStrEqual(ctxt->namespaces[2 * i + 1], prefix)) { - XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i]) - break; - } - } - if (i >= ctxt->nb_namespaces) { - ERROR5(NULL, NULL, NULL, - "xmlCompileAttributeTest : no namespace bound to prefix %s\n", - prefix); - ctxt->error = 1; - goto error; - } - } - XML_PAT_FREE_STRING(ctxt, prefix); - if (token == NULL) { - if (CUR == '*') { - NEXT; - PUSH(XML_OP_ATTR, NULL, URL); - } else { - ERROR(NULL, NULL, NULL, - "xmlCompileAttributeTest : Name expected\n"); - ctxt->error = 1; - goto error; - } - } else { - PUSH(XML_OP_ATTR, token, URL); - } - } else { - PUSH(XML_OP_ATTR, name, NULL); - } - return; -error: - if (URL != NULL) - XML_PAT_FREE_STRING(ctxt, URL) - if (token != NULL) - XML_PAT_FREE_STRING(ctxt, token); -} - -/** - * xmlCompileStepPattern: - * @ctxt: the compilation context - * - * Compile the Step Pattern and generates a precompiled - * form suitable for fast matching. - * - * [3] Step ::= '.' | NameTest - * [4] NameTest ::= QName | '*' | NCName ':' '*' - */ - -static void -xmlCompileStepPattern(xmlPatParserContextPtr ctxt) { - xmlChar *token = NULL; - xmlChar *name = NULL; - xmlChar *URL = NULL; - int hasBlanks = 0; - - SKIP_BLANKS; - if (CUR == '.') { - /* - * Context node. - */ - NEXT; - PUSH(XML_OP_ELEM, NULL, NULL); - return; - } - if (CUR == '@') { - /* - * Attribute test. - */ - if (XML_STREAM_XS_IDC_SEL(ctxt->comp)) { - ERROR5(NULL, NULL, NULL, - "Unexpected attribute axis in '%s'.\n", ctxt->base); - ctxt->error = 1; - return; - } - NEXT; - xmlCompileAttributeTest(ctxt); - if (ctxt->error != 0) - goto error; - return; - } - name = xmlPatScanNCName(ctxt); - if (name == NULL) { - if (CUR == '*') { - NEXT; - PUSH(XML_OP_ALL, NULL, NULL); - return; - } else { - ERROR(NULL, NULL, NULL, - "xmlCompileStepPattern : Name expected\n"); - ctxt->error = 1; - return; - } - } - if (IS_BLANK_CH(CUR)) { - hasBlanks = 1; - SKIP_BLANKS; - } - if (CUR == ':') { - NEXT; - if (CUR != ':') { - xmlChar *prefix = name; - int i; - - if (hasBlanks || IS_BLANK_CH(CUR)) { - ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL); - ctxt->error = 1; - goto error; - } - /* - * This is a namespace match - */ - token = xmlPatScanName(ctxt); - if ((prefix[0] == 'x') && - (prefix[1] == 'm') && - (prefix[2] == 'l') && - (prefix[3] == 0)) - { - XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE) - } else { - for (i = 0;i < ctxt->nb_namespaces;i++) { - if (xmlStrEqual(ctxt->namespaces[2 * i + 1], prefix)) { - XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i]) - break; - } - } - if (i >= ctxt->nb_namespaces) { - ERROR5(NULL, NULL, NULL, - "xmlCompileStepPattern : no namespace bound to prefix %s\n", - prefix); - ctxt->error = 1; - goto error; - } - } - XML_PAT_FREE_STRING(ctxt, prefix); - if (token == NULL) { - if (CUR == '*') { - NEXT; - PUSH(XML_OP_NS, URL, NULL); - } else { - ERROR(NULL, NULL, NULL, - "xmlCompileStepPattern : Name expected\n"); - ctxt->error = 1; - goto error; - } - } else { - PUSH(XML_OP_ELEM, token, URL); - } - } else { - NEXT; - if (xmlStrEqual(name, (const xmlChar *) "child")) { - XML_PAT_FREE_STRING(ctxt, name); - name = xmlPatScanName(ctxt); - if (name == NULL) { - if (CUR == '*') { - NEXT; - PUSH(XML_OP_ALL, NULL, NULL); - return; - } else { - ERROR(NULL, NULL, NULL, - "xmlCompileStepPattern : QName expected\n"); - ctxt->error = 1; - goto error; - } - } - if (CUR == ':') { - xmlChar *prefix = name; - int i; - - NEXT; - if (IS_BLANK_CH(CUR)) { - ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL); - ctxt->error = 1; - goto error; - } - /* - * This is a namespace match - */ - token = xmlPatScanName(ctxt); - if ((prefix[0] == 'x') && - (prefix[1] == 'm') && - (prefix[2] == 'l') && - (prefix[3] == 0)) - { - XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE) - } else { - for (i = 0;i < ctxt->nb_namespaces;i++) { - if (xmlStrEqual(ctxt->namespaces[2 * i + 1], prefix)) { - XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i]) - break; - } - } - if (i >= ctxt->nb_namespaces) { - ERROR5(NULL, NULL, NULL, - "xmlCompileStepPattern : no namespace bound " - "to prefix %s\n", prefix); - ctxt->error = 1; - goto error; - } - } - XML_PAT_FREE_STRING(ctxt, prefix); - if (token == NULL) { - if (CUR == '*') { - NEXT; - PUSH(XML_OP_NS, URL, NULL); - } else { - ERROR(NULL, NULL, NULL, - "xmlCompileStepPattern : Name expected\n"); - ctxt->error = 1; - goto error; - } - } else { - PUSH(XML_OP_CHILD, token, URL); - } - } else - PUSH(XML_OP_CHILD, name, NULL); - return; - } else if (xmlStrEqual(name, (const xmlChar *) "attribute")) { - XML_PAT_FREE_STRING(ctxt, name) - name = NULL; - if (XML_STREAM_XS_IDC_SEL(ctxt->comp)) { - ERROR5(NULL, NULL, NULL, - "Unexpected attribute axis in '%s'.\n", ctxt->base); - ctxt->error = 1; - goto error; - } - xmlCompileAttributeTest(ctxt); - if (ctxt->error != 0) - goto error; - return; - } else { - ERROR5(NULL, NULL, NULL, - "The 'element' or 'attribute' axis is expected.\n", NULL); - ctxt->error = 1; - goto error; - } - } - } else if (CUR == '*') { - if (name != NULL) { - ctxt->error = 1; - goto error; - } - NEXT; - PUSH(XML_OP_ALL, token, NULL); - } else { - PUSH(XML_OP_ELEM, name, NULL); - } - return; -error: - if (URL != NULL) - XML_PAT_FREE_STRING(ctxt, URL) - if (token != NULL) - XML_PAT_FREE_STRING(ctxt, token) - if (name != NULL) - XML_PAT_FREE_STRING(ctxt, name) -} - -/** - * xmlCompilePathPattern: - * @ctxt: the compilation context - * - * Compile the Path Pattern and generates a precompiled - * form suitable for fast matching. - * - * [5] Path ::= ('.//')? ( Step '/' )* ( Step | '@' NameTest ) - */ -static void -xmlCompilePathPattern(xmlPatParserContextPtr ctxt) { - SKIP_BLANKS; - if (CUR == '/') { - ctxt->comp->flags |= PAT_FROM_ROOT; - } else if ((CUR == '.') || (ctxt->comp->flags & XML_PATTERN_NOTPATTERN)) { - ctxt->comp->flags |= PAT_FROM_CUR; - } - - if ((CUR == '/') && (NXT(1) == '/')) { - PUSH(XML_OP_ANCESTOR, NULL, NULL); - NEXT; - NEXT; - } else if ((CUR == '.') && (NXT(1) == '/') && (NXT(2) == '/')) { - PUSH(XML_OP_ANCESTOR, NULL, NULL); - NEXT; - NEXT; - NEXT; - /* Check for incompleteness. */ - SKIP_BLANKS; - if (CUR == 0) { - ERROR5(NULL, NULL, NULL, - "Incomplete expression '%s'.\n", ctxt->base); - ctxt->error = 1; - goto error; - } - } - if (CUR == '@') { - NEXT; - xmlCompileAttributeTest(ctxt); - SKIP_BLANKS; - /* TODO: check for incompleteness */ - if (CUR != 0) { - xmlCompileStepPattern(ctxt); - if (ctxt->error != 0) - goto error; - } - } else { - if (CUR == '/') { - PUSH(XML_OP_ROOT, NULL, NULL); - NEXT; - /* Check for incompleteness. */ - SKIP_BLANKS; - if (CUR == 0) { - ERROR5(NULL, NULL, NULL, - "Incomplete expression '%s'.\n", ctxt->base); - ctxt->error = 1; - goto error; - } - } - xmlCompileStepPattern(ctxt); - if (ctxt->error != 0) - goto error; - SKIP_BLANKS; - while (CUR == '/') { - if (NXT(1) == '/') { - PUSH(XML_OP_ANCESTOR, NULL, NULL); - NEXT; - NEXT; - SKIP_BLANKS; - xmlCompileStepPattern(ctxt); - if (ctxt->error != 0) - goto error; - } else { - PUSH(XML_OP_PARENT, NULL, NULL); - NEXT; - SKIP_BLANKS; - if (CUR == 0) { - ERROR5(NULL, NULL, NULL, - "Incomplete expression '%s'.\n", ctxt->base); - ctxt->error = 1; - goto error; - } - xmlCompileStepPattern(ctxt); - if (ctxt->error != 0) - goto error; - } - } - } - if (CUR != 0) { - ERROR5(NULL, NULL, NULL, - "Failed to compile pattern %s\n", ctxt->base); - ctxt->error = 1; - } -error: - return; -} - -/** - * xmlCompileIDCXPathPath: - * @ctxt: the compilation context - * - * Compile the Path Pattern and generates a precompiled - * form suitable for fast matching. - * - * [5] Path ::= ('.//')? ( Step '/' )* ( Step | '@' NameTest ) - */ -static void -xmlCompileIDCXPathPath(xmlPatParserContextPtr ctxt) { - SKIP_BLANKS; - if (CUR == '/') { - ERROR5(NULL, NULL, NULL, - "Unexpected selection of the document root in '%s'.\n", - ctxt->base); - goto error; - } - ctxt->comp->flags |= PAT_FROM_CUR; - - if (CUR == '.') { - /* "." - "self::node()" */ - NEXT; - SKIP_BLANKS; - if (CUR == 0) { - /* - * Selection of the context node. - */ - PUSH(XML_OP_ELEM, NULL, NULL); - return; - } - if (CUR != '/') { - /* TODO: A more meaningful error message. */ - ERROR5(NULL, NULL, NULL, - "Unexpected token after '.' in '%s'.\n", ctxt->base); - goto error; - } - /* "./" - "self::node()/" */ - NEXT; - SKIP_BLANKS; - if (CUR == '/') { - if (IS_BLANK_CH(PEEKPREV(1))) { - /* - * Disallow "./ /" - */ - ERROR5(NULL, NULL, NULL, - "Unexpected '/' token in '%s'.\n", ctxt->base); - goto error; - } - /* ".//" - "self:node()/descendant-or-self::node()/" */ - PUSH(XML_OP_ANCESTOR, NULL, NULL); - NEXT; - SKIP_BLANKS; - } - if (CUR == 0) - goto error_unfinished; - } - /* - * Process steps. - */ - do { - xmlCompileStepPattern(ctxt); - if (ctxt->error != 0) - goto error; - SKIP_BLANKS; - if (CUR != '/') - break; - PUSH(XML_OP_PARENT, NULL, NULL); - NEXT; - SKIP_BLANKS; - if (CUR == '/') { - /* - * Disallow subsequent '//'. - */ - ERROR5(NULL, NULL, NULL, - "Unexpected subsequent '//' in '%s'.\n", - ctxt->base); - goto error; - } - if (CUR == 0) - goto error_unfinished; - - } while (CUR != 0); - - if (CUR != 0) { - ERROR5(NULL, NULL, NULL, - "Failed to compile expression '%s'.\n", ctxt->base); - ctxt->error = 1; - } - return; -error: - ctxt->error = 1; - return; - -error_unfinished: - ctxt->error = 1; - ERROR5(NULL, NULL, NULL, - "Unfinished expression '%s'.\n", ctxt->base); - return; -} - -/************************************************************************ - * * - * The streaming code * - * * - ************************************************************************/ - -#ifdef DEBUG_STREAMING -static void -xmlDebugStreamComp(xmlStreamCompPtr stream) { - int i; - - if (stream == NULL) { - printf("Stream: NULL\n"); - return; - } - printf("Stream: %d steps\n", stream->nbStep); - for (i = 0;i < stream->nbStep;i++) { - if (stream->steps[i].ns != NULL) { - printf("{%s}", stream->steps[i].ns); - } - if (stream->steps[i].name == NULL) { - printf("* "); - } else { - printf("%s ", stream->steps[i].name); - } - if (stream->steps[i].flags & XML_STREAM_STEP_ROOT) - printf("root "); - if (stream->steps[i].flags & XML_STREAM_STEP_DESC) - printf("// "); - if (stream->steps[i].flags & XML_STREAM_STEP_FINAL) - printf("final "); - printf("\n"); - } -} -static void -xmlDebugStreamCtxt(xmlStreamCtxtPtr ctxt, int match) { - int i; - - if (ctxt == NULL) { - printf("Stream: NULL\n"); - return; - } - printf("Stream: level %d, %d states: ", ctxt->level, ctxt->nbState); - if (match) - printf("matches\n"); - else - printf("\n"); - for (i = 0;i < ctxt->nbState;i++) { - if (ctxt->states[2 * i] < 0) - printf(" %d: free\n", i); - else { - printf(" %d: step %d, level %d", i, ctxt->states[2 * i], - ctxt->states[(2 * i) + 1]); - if (ctxt->comp->steps[ctxt->states[2 * i]].flags & - XML_STREAM_STEP_DESC) - printf(" //\n"); - else - printf("\n"); - } - } -} -#endif -/** - * xmlNewStreamComp: - * @size: the number of expected steps - * - * build a new compiled pattern for streaming - * - * Returns the new structure or NULL in case of error. - */ -static xmlStreamCompPtr -xmlNewStreamComp(int size) { - xmlStreamCompPtr cur; - - if (size < 4) - size = 4; - - cur = (xmlStreamCompPtr) xmlMalloc(sizeof(xmlStreamComp)); - if (cur == NULL) { - ERROR(NULL, NULL, NULL, - "xmlNewStreamComp: malloc failed\n"); - return(NULL); - } - memset(cur, 0, sizeof(xmlStreamComp)); - cur->steps = (xmlStreamStepPtr) xmlMalloc(size * sizeof(xmlStreamStep)); - if (cur->steps == NULL) { - xmlFree(cur); - ERROR(NULL, NULL, NULL, - "xmlNewStreamComp: malloc failed\n"); - return(NULL); - } - cur->nbStep = 0; - cur->maxStep = size; - return(cur); -} - -/** - * xmlFreeStreamComp: - * @comp: the compiled pattern for streaming - * - * Free the compiled pattern for streaming - */ -static void -xmlFreeStreamComp(xmlStreamCompPtr comp) { - if (comp != NULL) { - if (comp->steps != NULL) - xmlFree(comp->steps); - if (comp->dict != NULL) - xmlDictFree(comp->dict); - xmlFree(comp); - } -} - -/** - * xmlStreamCompAddStep: - * @comp: the compiled pattern for streaming - * @name: the first string, the name, or NULL for * - * @ns: the second step, the namespace name - * @flags: the flags for that step - * - * Add a new step to the compiled pattern - * - * Returns -1 in case of error or the step index if successful - */ -static int -xmlStreamCompAddStep(xmlStreamCompPtr comp, const xmlChar *name, - const xmlChar *ns, int nodeType, int flags) { - xmlStreamStepPtr cur; - - if (comp->nbStep >= comp->maxStep) { - cur = (xmlStreamStepPtr) xmlRealloc(comp->steps, - comp->maxStep * 2 * sizeof(xmlStreamStep)); - if (cur == NULL) { - ERROR(NULL, NULL, NULL, - "xmlNewStreamComp: malloc failed\n"); - return(-1); - } - comp->steps = cur; - comp->maxStep *= 2; - } - cur = &comp->steps[comp->nbStep++]; - cur->flags = flags; - cur->name = name; - cur->ns = ns; - cur->nodeType = nodeType; - return(comp->nbStep - 1); -} - -/** - * xmlStreamCompile: - * @comp: the precompiled pattern - * - * Tries to stream compile a pattern - * - * Returns -1 in case of failure and 0 in case of success. - */ -static int -xmlStreamCompile(xmlPatternPtr comp) { - xmlStreamCompPtr stream; - int i, s = 0, root = 0, flags = 0, prevs = -1; - xmlStepOp step; - - if ((comp == NULL) || (comp->steps == NULL)) - return(-1); - /* - * special case for . - */ - if ((comp->nbStep == 1) && - (comp->steps[0].op == XML_OP_ELEM) && - (comp->steps[0].value == NULL) && - (comp->steps[0].value2 == NULL)) { - stream = xmlNewStreamComp(0); - if (stream == NULL) - return(-1); - /* Note that the stream will have no steps in this case. */ - stream->flags |= XML_STREAM_FINAL_IS_ANY_NODE; - comp->stream = stream; - return(0); - } - - stream = xmlNewStreamComp((comp->nbStep / 2) + 1); - if (stream == NULL) - return(-1); - if (comp->dict != NULL) { - stream->dict = comp->dict; - xmlDictReference(stream->dict); - } - - i = 0; - if (comp->flags & PAT_FROM_ROOT) - stream->flags |= XML_STREAM_FROM_ROOT; - - for (;i < comp->nbStep;i++) { - step = comp->steps[i]; - switch (step.op) { - case XML_OP_END: - break; - case XML_OP_ROOT: - if (i != 0) - goto error; - root = 1; - break; - case XML_OP_NS: - s = xmlStreamCompAddStep(stream, NULL, step.value, - XML_ELEMENT_NODE, flags); - if (s < 0) - goto error; - prevs = s; - flags = 0; - break; - case XML_OP_ATTR: - flags |= XML_STREAM_STEP_ATTR; - prevs = -1; - s = xmlStreamCompAddStep(stream, - step.value, step.value2, XML_ATTRIBUTE_NODE, flags); - flags = 0; - if (s < 0) - goto error; - break; - case XML_OP_ELEM: - if ((step.value == NULL) && (step.value2 == NULL)) { - /* - * We have a "." or "self::node()" here. - * Eliminate redundant self::node() tests like in "/./." - * or "//./" - * The only case we won't eliminate is "//.", i.e. if - * self::node() is the last node test and we had - * continuation somewhere beforehand. - */ - if ((comp->nbStep == i + 1) && - (flags & XML_STREAM_STEP_DESC)) { - /* - * Mark the special case where the expression resolves - * to any type of node. - */ - if (comp->nbStep == i + 1) { - stream->flags |= XML_STREAM_FINAL_IS_ANY_NODE; - } - flags |= XML_STREAM_STEP_NODE; - s = xmlStreamCompAddStep(stream, NULL, NULL, - XML_STREAM_ANY_NODE, flags); - if (s < 0) - goto error; - flags = 0; - /* - * If there was a previous step, mark it to be added to - * the result node-set; this is needed since only - * the last step will be marked as "final" and only - * "final" nodes are added to the resulting set. - */ - if (prevs != -1) { - stream->steps[prevs].flags |= XML_STREAM_STEP_IN_SET; - prevs = -1; - } - break; - - } else { - /* Just skip this one. */ - continue; - } - } - /* An element node. */ - s = xmlStreamCompAddStep(stream, step.value, step.value2, - XML_ELEMENT_NODE, flags); - if (s < 0) - goto error; - prevs = s; - flags = 0; - break; - case XML_OP_CHILD: - /* An element node child. */ - s = xmlStreamCompAddStep(stream, step.value, step.value2, - XML_ELEMENT_NODE, flags); - if (s < 0) - goto error; - prevs = s; - flags = 0; - break; - case XML_OP_ALL: - s = xmlStreamCompAddStep(stream, NULL, NULL, - XML_ELEMENT_NODE, flags); - if (s < 0) - goto error; - prevs = s; - flags = 0; - break; - case XML_OP_PARENT: - break; - case XML_OP_ANCESTOR: - /* Skip redundant continuations. */ - if (flags & XML_STREAM_STEP_DESC) - break; - flags |= XML_STREAM_STEP_DESC; - /* - * Mark the expression as having "//". - */ - if ((stream->flags & XML_STREAM_DESC) == 0) - stream->flags |= XML_STREAM_DESC; - break; - } - } - if ((! root) && (comp->flags & XML_PATTERN_NOTPATTERN) == 0) { - /* - * If this should behave like a real pattern, we will mark - * the first step as having "//", to be reentrant on every - * tree level. - */ - if ((stream->flags & XML_STREAM_DESC) == 0) - stream->flags |= XML_STREAM_DESC; - - if (stream->nbStep > 0) { - if ((stream->steps[0].flags & XML_STREAM_STEP_DESC) == 0) - stream->steps[0].flags |= XML_STREAM_STEP_DESC; - } - } - if (stream->nbStep <= s) - goto error; - stream->steps[s].flags |= XML_STREAM_STEP_FINAL; - if (root) - stream->steps[0].flags |= XML_STREAM_STEP_ROOT; -#ifdef DEBUG_STREAMING - xmlDebugStreamComp(stream); -#endif - comp->stream = stream; - return(0); -error: - xmlFreeStreamComp(stream); - return(0); -} - -/** - * xmlNewStreamCtxt: - * @size: the number of expected states - * - * build a new stream context - * - * Returns the new structure or NULL in case of error. - */ -static xmlStreamCtxtPtr -xmlNewStreamCtxt(xmlStreamCompPtr stream) { - xmlStreamCtxtPtr cur; - - cur = (xmlStreamCtxtPtr) xmlMalloc(sizeof(xmlStreamCtxt)); - if (cur == NULL) { - ERROR(NULL, NULL, NULL, - "xmlNewStreamCtxt: malloc failed\n"); - return(NULL); - } - memset(cur, 0, sizeof(xmlStreamCtxt)); - cur->states = (int *) xmlMalloc(4 * 2 * sizeof(int)); - if (cur->states == NULL) { - xmlFree(cur); - ERROR(NULL, NULL, NULL, - "xmlNewStreamCtxt: malloc failed\n"); - return(NULL); - } - cur->nbState = 0; - cur->maxState = 4; - cur->level = 0; - cur->comp = stream; - cur->blockLevel = -1; - return(cur); -} - -/** - * xmlFreeStreamCtxt: - * @stream: the stream context - * - * Free the stream context - */ -void -xmlFreeStreamCtxt(xmlStreamCtxtPtr stream) { - xmlStreamCtxtPtr next; - - while (stream != NULL) { - next = stream->next; - if (stream->states != NULL) - xmlFree(stream->states); - xmlFree(stream); - stream = next; - } -} - -/** - * xmlStreamCtxtAddState: - * @comp: the stream context - * @idx: the step index for that streaming state - * - * Add a new state to the stream context - * - * Returns -1 in case of error or the state index if successful - */ -static int -xmlStreamCtxtAddState(xmlStreamCtxtPtr comp, int idx, int level) { - int i; - for (i = 0;i < comp->nbState;i++) { - if (comp->states[2 * i] < 0) { - comp->states[2 * i] = idx; - comp->states[2 * i + 1] = level; - return(i); - } - } - if (comp->nbState >= comp->maxState) { - int *cur; - - cur = (int *) xmlRealloc(comp->states, - comp->maxState * 4 * sizeof(int)); - if (cur == NULL) { - ERROR(NULL, NULL, NULL, - "xmlNewStreamCtxt: malloc failed\n"); - return(-1); - } - comp->states = cur; - comp->maxState *= 2; - } - comp->states[2 * comp->nbState] = idx; - comp->states[2 * comp->nbState++ + 1] = level; - return(comp->nbState - 1); -} - -/** - * xmlStreamPushInternal: - * @stream: the stream context - * @name: the current name - * @ns: the namespace name - * @nodeType: the type of the node - * - * Push new data onto the stream. NOTE: if the call xmlPatterncompile() - * indicated a dictionary, then strings for name and ns will be expected - * to come from the dictionary. - * Both @name and @ns being NULL means the / i.e. the root of the document. - * This can also act as a reset. - * - * Returns: -1 in case of error, 1 if the current state in the stream is a - * match and 0 otherwise. - */ -static int -xmlStreamPushInternal(xmlStreamCtxtPtr stream, - const xmlChar *name, const xmlChar *ns, - int nodeType) { - int ret = 0, err = 0, final = 0, tmp, i, m, match, stepNr, desc; - xmlStreamCompPtr comp; - xmlStreamStep step; -#ifdef DEBUG_STREAMING - xmlStreamCtxtPtr orig = stream; -#endif - - if ((stream == NULL) || (stream->nbState < 0)) - return(-1); - - while (stream != NULL) { - comp = stream->comp; - - if ((nodeType == XML_ELEMENT_NODE) && - (name == NULL) && (ns == NULL)) { - /* We have a document node here (or a reset). */ - stream->nbState = 0; - stream->level = 0; - stream->blockLevel = -1; - if (comp->flags & XML_STREAM_FROM_ROOT) { - if (comp->nbStep == 0) { - /* TODO: We have a "/." here? */ - ret = 1; - } else { - if ((comp->nbStep == 1) && - (comp->steps[0].nodeType == XML_STREAM_ANY_NODE) && - (comp->steps[0].flags & XML_STREAM_STEP_DESC)) - { - /* - * In the case of "//." the document node will match - * as well. - */ - ret = 1; - } else if (comp->steps[0].flags & XML_STREAM_STEP_ROOT) { - /* TODO: Do we need this ? */ - tmp = xmlStreamCtxtAddState(stream, 0, 0); - if (tmp < 0) - err++; - } - } - } - stream = stream->next; - continue; /* while */ - } - - /* - * Fast check for ".". - */ - if (comp->nbStep == 0) { - /* - * / and . are handled at the XPath node set creation - * level by checking min depth - */ - if (stream->flags & XML_PATTERN_XPATH) { - stream = stream->next; - continue; /* while */ - } - /* - * For non-pattern like evaluation like XML Schema IDCs - * or traditional XPath expressions, this will match if - * we are at the first level only, otherwise on every level. - */ - if ((nodeType != XML_ATTRIBUTE_NODE) && - (((stream->flags & XML_PATTERN_NOTPATTERN) == 0) || - (stream->level == 0))) { - ret = 1; - } - stream->level++; - goto stream_next; - } - if (stream->blockLevel != -1) { - /* - * Skip blocked expressions. - */ - stream->level++; - goto stream_next; - } - - if ((nodeType != XML_ELEMENT_NODE) && - (nodeType != XML_ATTRIBUTE_NODE) && - ((comp->flags & XML_STREAM_FINAL_IS_ANY_NODE) == 0)) { - /* - * No need to process nodes of other types if we don't - * resolve to those types. - * TODO: Do we need to block the context here? - */ - stream->level++; - goto stream_next; - } - - /* - * Check evolution of existing states - */ - i = 0; - m = stream->nbState; - while (i < m) { - if ((comp->flags & XML_STREAM_DESC) == 0) { - /* - * If there is no "//", then only the last - * added state is of interest. - */ - stepNr = stream->states[2 * (stream->nbState -1)]; - /* - * TODO: Security check, should not happen, remove it. - */ - if (stream->states[(2 * (stream->nbState -1)) + 1] < - stream->level) { - return (-1); - } - desc = 0; - /* loop-stopper */ - i = m; - } else { - /* - * If there are "//", then we need to process every "//" - * occuring in the states, plus any other state for this - * level. - */ - stepNr = stream->states[2 * i]; - - /* TODO: should not happen anymore: dead states */ - if (stepNr < 0) - goto next_state; - - tmp = stream->states[(2 * i) + 1]; - - /* skip new states just added */ - if (tmp > stream->level) - goto next_state; - - /* skip states at ancestor levels, except if "//" */ - desc = comp->steps[stepNr].flags & XML_STREAM_STEP_DESC; - if ((tmp < stream->level) && (!desc)) - goto next_state; - } - /* - * Check for correct node-type. - */ - step = comp->steps[stepNr]; - if (step.nodeType != nodeType) { - if (step.nodeType == XML_ATTRIBUTE_NODE) { - /* - * Block this expression for deeper evaluation. - */ - if ((comp->flags & XML_STREAM_DESC) == 0) - stream->blockLevel = stream->level +1; - goto next_state; - } else if (step.nodeType != XML_STREAM_ANY_NODE) - goto next_state; - } - /* - * Compare local/namespace-name. - */ - match = 0; - if (step.nodeType == XML_STREAM_ANY_NODE) { - match = 1; - } else if (step.name == NULL) { - if (step.ns == NULL) { - /* - * This lets through all elements/attributes. - */ - match = 1; - } else if (ns != NULL) - match = xmlStrEqual(step.ns, ns); - } else if (((step.ns != NULL) == (ns != NULL)) && - (name != NULL) && - (step.name[0] == name[0]) && - xmlStrEqual(step.name, name) && - ((step.ns == ns) || xmlStrEqual(step.ns, ns))) - { - match = 1; - } -#if 0 -/* -* TODO: Pointer comparison won't work, since not guaranteed that the given -* values are in the same dict; especially if it's the namespace name, -* normally coming from ns->href. We need a namespace dict mechanism ! -*/ - } else if (comp->dict) { - if (step.name == NULL) { - if (step.ns == NULL) - match = 1; - else - match = (step.ns == ns); - } else { - match = ((step.name == name) && (step.ns == ns)); - } -#endif /* if 0 ------------------------------------------------------- */ - if (match) { - final = step.flags & XML_STREAM_STEP_FINAL; - if (desc) { - if (final) { - ret = 1; - } else { - /* descending match create a new state */ - xmlStreamCtxtAddState(stream, stepNr + 1, - stream->level + 1); - } - } else { - if (final) { - ret = 1; - } else { - xmlStreamCtxtAddState(stream, stepNr + 1, - stream->level + 1); - } - } - if ((ret != 1) && (step.flags & XML_STREAM_STEP_IN_SET)) { - /* - * Check if we have a special case like "foo/bar//.", where - * "foo" is selected as well. - */ - ret = 1; - } - } - if (((comp->flags & XML_STREAM_DESC) == 0) && - ((! match) || final)) { - /* - * Mark this expression as blocked for any evaluation at - * deeper levels. Note that this includes "/foo" - * expressions if the *pattern* behaviour is used. - */ - stream->blockLevel = stream->level +1; - } -next_state: - i++; - } - - stream->level++; - - /* - * Re/enter the expression. - * Don't reenter if it's an absolute expression like "/foo", - * except "//foo". - */ - step = comp->steps[0]; - if (step.flags & XML_STREAM_STEP_ROOT) - goto stream_next; - - desc = step.flags & XML_STREAM_STEP_DESC; - if (stream->flags & XML_PATTERN_NOTPATTERN) { - /* - * Re/enter the expression if it is a "descendant" one, - * or if we are at the 1st level of evaluation. - */ - - if (stream->level == 1) { - if (XML_STREAM_XS_IDC(stream)) { - /* - * XS-IDC: The missing "self::node()" will always - * match the first given node. - */ - goto stream_next; - } else - goto compare; - } - /* - * A "//" is always reentrant. - */ - if (desc) - goto compare; - - /* - * XS-IDC: Process the 2nd level, since the missing - * "self::node()" is responsible for the 2nd level being - * the real start level. - */ - if ((stream->level == 2) && XML_STREAM_XS_IDC(stream)) - goto compare; - - goto stream_next; - } - -compare: - /* - * Check expected node-type. - */ - if (step.nodeType != nodeType) { - if (nodeType == XML_ATTRIBUTE_NODE) - goto stream_next; - else if (step.nodeType != XML_STREAM_ANY_NODE) - goto stream_next; - } - /* - * Compare local/namespace-name. - */ - match = 0; - if (step.nodeType == XML_STREAM_ANY_NODE) { - match = 1; - } else if (step.name == NULL) { - if (step.ns == NULL) { - /* - * This lets through all elements/attributes. - */ - match = 1; - } else if (ns != NULL) - match = xmlStrEqual(step.ns, ns); - } else if (((step.ns != NULL) == (ns != NULL)) && - (name != NULL) && - (step.name[0] == name[0]) && - xmlStrEqual(step.name, name) && - ((step.ns == ns) || xmlStrEqual(step.ns, ns))) - { - match = 1; - } - final = step.flags & XML_STREAM_STEP_FINAL; - if (match) { - if (final) - ret = 1; - else - xmlStreamCtxtAddState(stream, 1, stream->level); - if ((ret != 1) && (step.flags & XML_STREAM_STEP_IN_SET)) { - /* - * Check if we have a special case like "foo//.", where - * "foo" is selected as well. - */ - ret = 1; - } - } - if (((comp->flags & XML_STREAM_DESC) == 0) && - ((! match) || final)) { - /* - * Mark this expression as blocked for any evaluation at - * deeper levels. - */ - stream->blockLevel = stream->level; - } - -stream_next: - stream = stream->next; - } /* while stream != NULL */ - - if (err > 0) - ret = -1; -#ifdef DEBUG_STREAMING - xmlDebugStreamCtxt(orig, ret); -#endif - return(ret); -} - -/** - * xmlStreamPush: - * @stream: the stream context - * @name: the current name - * @ns: the namespace name - * - * Push new data onto the stream. NOTE: if the call xmlPatterncompile() - * indicated a dictionary, then strings for name and ns will be expected - * to come from the dictionary. - * Both @name and @ns being NULL means the / i.e. the root of the document. - * This can also act as a reset. - * Otherwise the function will act as if it has been given an element-node. - * - * Returns: -1 in case of error, 1 if the current state in the stream is a - * match and 0 otherwise. - */ -int -xmlStreamPush(xmlStreamCtxtPtr stream, - const xmlChar *name, const xmlChar *ns) { - return (xmlStreamPushInternal(stream, name, ns, (int) XML_ELEMENT_NODE)); -} - -/** - * xmlStreamPushNode: - * @stream: the stream context - * @name: the current name - * @ns: the namespace name - * @nodeType: the type of the node being pushed - * - * Push new data onto the stream. NOTE: if the call xmlPatterncompile() - * indicated a dictionary, then strings for name and ns will be expected - * to come from the dictionary. - * Both @name and @ns being NULL means the / i.e. the root of the document. - * This can also act as a reset. - * Different from xmlStreamPush() this function can be fed with nodes of type: - * element-, attribute-, text-, cdata-section-, comment- and - * processing-instruction-node. - * - * Returns: -1 in case of error, 1 if the current state in the stream is a - * match and 0 otherwise. - */ -int -xmlStreamPushNode(xmlStreamCtxtPtr stream, - const xmlChar *name, const xmlChar *ns, - int nodeType) -{ - return (xmlStreamPushInternal(stream, name, ns, - nodeType)); -} - -/** -* xmlStreamPushAttr: -* @stream: the stream context -* @name: the current name -* @ns: the namespace name -* -* Push new attribute data onto the stream. NOTE: if the call xmlPatterncompile() -* indicated a dictionary, then strings for name and ns will be expected -* to come from the dictionary. -* Both @name and @ns being NULL means the / i.e. the root of the document. -* This can also act as a reset. -* Otherwise the function will act as if it has been given an attribute-node. -* -* Returns: -1 in case of error, 1 if the current state in the stream is a -* match and 0 otherwise. -*/ -int -xmlStreamPushAttr(xmlStreamCtxtPtr stream, - const xmlChar *name, const xmlChar *ns) { - return (xmlStreamPushInternal(stream, name, ns, (int) XML_ATTRIBUTE_NODE)); -} - -/** - * xmlStreamPop: - * @stream: the stream context - * - * push one level from the stream. - * - * Returns: -1 in case of error, 0 otherwise. - */ -int -xmlStreamPop(xmlStreamCtxtPtr stream) { - int i, lev; - - if (stream == NULL) - return(-1); - while (stream != NULL) { - /* - * Reset block-level. - */ - if (stream->blockLevel == stream->level) - stream->blockLevel = -1; - - stream->level--; - if (stream->level < 0) - return(-1); - /* - * Check evolution of existing states - */ - for (i = stream->nbState -1; i >= 0; i--) { - /* discard obsoleted states */ - lev = stream->states[(2 * i) + 1]; - if (lev > stream->level) - stream->nbState--; - if (lev <= stream->level) - break; - } - stream = stream->next; - } - return(0); -} - -/** - * xmlStreamWantsAnyNode: - * @streamCtxt: the stream context - * - * Query if the streaming pattern additionally needs to be fed with - * text-, cdata-section-, comment- and processing-instruction-nodes. - * If the result is 0 then only element-nodes and attribute-nodes - * need to be pushed. - * - * Returns: 1 in case of need of nodes of the above described types, - * 0 otherwise. -1 on API errors. - */ -int -xmlStreamWantsAnyNode(xmlStreamCtxtPtr streamCtxt) -{ - if (streamCtxt == NULL) - return(-1); - while (streamCtxt != NULL) { - if (streamCtxt->comp->flags & XML_STREAM_FINAL_IS_ANY_NODE) - return(1); - streamCtxt = streamCtxt->next; - } - return(0); -} - -/************************************************************************ - * * - * The public interfaces * - * * - ************************************************************************/ - -/** - * xmlPatterncompile: - * @pattern: the pattern to compile - * @dict: an optional dictionary for interned strings - * @flags: compilation flags, see xmlPatternFlags - * @namespaces: the prefix definitions, array of [URI, prefix] or NULL - * - * Compile a pattern. - * - * Returns the compiled form of the pattern or NULL in case of error - */ -xmlPatternPtr -xmlPatterncompile(const xmlChar *pattern, xmlDict *dict, int flags, - const xmlChar **namespaces) { - xmlPatternPtr ret = NULL, cur; - xmlPatParserContextPtr ctxt = NULL; - const xmlChar *or, *start; - xmlChar *tmp = NULL; - int type = 0; - int streamable = 1; - - if (pattern == NULL) - return(NULL); - - start = pattern; - or = start; - while (*or != 0) { - tmp = NULL; - while ((*or != 0) && (*or != '|')) or++; - if (*or == 0) - ctxt = xmlNewPatParserContext(start, dict, namespaces); - else { - tmp = xmlStrndup(start, or - start); - if (tmp != NULL) { - ctxt = xmlNewPatParserContext(tmp, dict, namespaces); - } - or++; - } - if (ctxt == NULL) goto error; - cur = xmlNewPattern(); - if (cur == NULL) goto error; - /* - * Assign string dict. - */ - if (dict) { - cur->dict = dict; - xmlDictReference(dict); - } - if (ret == NULL) - ret = cur; - else { - cur->next = ret->next; - ret->next = cur; - } - cur->flags = flags; - ctxt->comp = cur; - - if (XML_STREAM_XS_IDC(cur)) - xmlCompileIDCXPathPath(ctxt); - else - xmlCompilePathPattern(ctxt); - if (ctxt->error != 0) - goto error; - xmlFreePatParserContext(ctxt); - ctxt = NULL; - - - if (streamable) { - if (type == 0) { - type = cur->flags & (PAT_FROM_ROOT | PAT_FROM_CUR); - } else if (type == PAT_FROM_ROOT) { - if (cur->flags & PAT_FROM_CUR) - streamable = 0; - } else if (type == PAT_FROM_CUR) { - if (cur->flags & PAT_FROM_ROOT) - streamable = 0; - } - } - if (streamable) - xmlStreamCompile(cur); - if (xmlReversePattern(cur) < 0) - goto error; - if (tmp != NULL) { - xmlFree(tmp); - tmp = NULL; - } - start = or; - } - if (streamable == 0) { - cur = ret; - while (cur != NULL) { - if (cur->stream != NULL) { - xmlFreeStreamComp(cur->stream); - cur->stream = NULL; - } - cur = cur->next; - } - } - - return(ret); -error: - if (ctxt != NULL) xmlFreePatParserContext(ctxt); - if (ret != NULL) xmlFreePattern(ret); - if (tmp != NULL) xmlFree(tmp); - return(NULL); -} - -/** - * xmlPatternMatch: - * @comp: the precompiled pattern - * @node: a node - * - * Test whether the node matches the pattern - * - * Returns 1 if it matches, 0 if it doesn't and -1 in case of failure - */ -int -xmlPatternMatch(xmlPatternPtr comp, xmlNodePtr node) -{ - int ret = 0; - - if ((comp == NULL) || (node == NULL)) - return(-1); - - while (comp != NULL) { - ret = xmlPatMatch(comp, node); - if (ret != 0) - return(ret); - comp = comp->next; - } - return(ret); -} - -/** - * xmlPatternGetStreamCtxt: - * @comp: the precompiled pattern - * - * Get a streaming context for that pattern - * Use xmlFreeStreamCtxt to free the context. - * - * Returns a pointer to the context or NULL in case of failure - */ -xmlStreamCtxtPtr -xmlPatternGetStreamCtxt(xmlPatternPtr comp) -{ - xmlStreamCtxtPtr ret = NULL, cur; - - if ((comp == NULL) || (comp->stream == NULL)) - return(NULL); - - while (comp != NULL) { - if (comp->stream == NULL) - goto failed; - cur = xmlNewStreamCtxt(comp->stream); - if (cur == NULL) - goto failed; - if (ret == NULL) - ret = cur; - else { - cur->next = ret->next; - ret->next = cur; - } - cur->flags = comp->flags; - comp = comp->next; - } - return(ret); -failed: - xmlFreeStreamCtxt(ret); - return(NULL); -} - -/** - * xmlPatternStreamable: - * @comp: the precompiled pattern - * - * Check if the pattern is streamable i.e. xmlPatternGetStreamCtxt() - * should work. - * - * Returns 1 if streamable, 0 if not and -1 in case of error. - */ -int -xmlPatternStreamable(xmlPatternPtr comp) { - if (comp == NULL) - return(-1); - while (comp != NULL) { - if (comp->stream == NULL) - return(0); - comp = comp->next; - } - return(1); -} - -/** - * xmlPatternMaxDepth: - * @comp: the precompiled pattern - * - * Check the maximum depth reachable by a pattern - * - * Returns -2 if no limit (using //), otherwise the depth, - * and -1 in case of error - */ -int -xmlPatternMaxDepth(xmlPatternPtr comp) { - int ret = 0, i; - if (comp == NULL) - return(-1); - while (comp != NULL) { - if (comp->stream == NULL) - return(-1); - for (i = 0;i < comp->stream->nbStep;i++) - if (comp->stream->steps[i].flags & XML_STREAM_STEP_DESC) - return(-2); - if (comp->stream->nbStep > ret) - ret = comp->stream->nbStep; - comp = comp->next; - } - return(ret); -} - -/** - * xmlPatternMinDepth: - * @comp: the precompiled pattern - * - * Check the minimum depth reachable by a pattern, 0 mean the / or . are - * part of the set. - * - * Returns -1 in case of error otherwise the depth, - * - */ -int -xmlPatternMinDepth(xmlPatternPtr comp) { - int ret = 12345678; - if (comp == NULL) - return(-1); - while (comp != NULL) { - if (comp->stream == NULL) - return(-1); - if (comp->stream->nbStep < ret) - ret = comp->stream->nbStep; - if (ret == 0) - return(0); - comp = comp->next; - } - return(ret); -} - -/** - * xmlPatternFromRoot: - * @comp: the precompiled pattern - * - * Check if the pattern must be looked at from the root. - * - * Returns 1 if true, 0 if false and -1 in case of error - */ -int -xmlPatternFromRoot(xmlPatternPtr comp) { - if (comp == NULL) - return(-1); - while (comp != NULL) { - if (comp->stream == NULL) - return(-1); - if (comp->flags & PAT_FROM_ROOT) - return(1); - comp = comp->next; - } - return(0); - -} - -#define bottom_pattern -#include "elfgcchack.h" -#endif /* LIBXML_PATTERN_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/platformTestsC.c b/ThirdParty/libxml2/vtklibxml2/platformTestsC.c deleted file mode 100644 index 3b12752a699..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/platformTestsC.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - Macros to define main() in a cross-platform way. - - Usage: - - int PLATFORM_TEST_C_MAIN() - { - return 0; - } - - int PLATFORM_TEST_C_MAIN_ARGS(argc, argv) - { - (void)argc; (void)argv; - return 0; - } -*/ -#if defined(__CLASSIC_C__) -# define PLATFORM_TEST_C_MAIN() \ - main() -# define PLATFORM_TEST_C_MAIN_ARGS(argc, argv) \ - main(argc,argv) int argc; char* argv[]; -#else -# define PLATFORM_TEST_C_MAIN() \ - main(void) -# define PLATFORM_TEST_C_MAIN_ARGS(argc, argv) \ - main(int argc, char* argv[]) -#endif - -/*--------------------------------------------------------------------------*/ -#ifdef TEST_SUPPORT_IP6 -#include <sys/socket.h> -#include <sys/types.h> - -int PLATFORM_TEST_C_MAIN() -{ - struct sockaddr_storage ss; - socket(AF_INET6, SOCK_STREAM, 0); - return 0; -} -#endif - -/*--------------------------------------------------------------------------*/ -#ifdef TEST_HAVE_GETADDRINFO -#include <netdb.h> -#include <sys/types.h> -#include <sys/socket.h> - -int PLATFORM_TEST_C_MAIN() -{ - struct addrinfo hints, *ai; - int error; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; -#ifndef getaddrinfo - (void)getaddrinfo; -#endif - error = getaddrinfo("127.0.0.1", "8080", &hints, &ai); - if(error) - { - return 1; - } - return 0; -} -#endif - -/*--------------------------------------------------------------------------*/ -#ifdef TEST_HAVE_SYS_DIR_H -#include <sys/types.h> -#include <sys/dir.h> -int PLATFORM_TEST_C_MAIN() -{ - if((DIR*)0) return 0; - return 0; -} -#endif - -/*--------------------------------------------------------------------------*/ -#ifdef TEST_HAVE_SYS_NDIR_H -#include <sys/types.h> -#include <sys/ndir.h> -int PLATFORM_TEST_C_MAIN() -{ - if((DIR*)0) return 0; - return 0; -} -#endif - -/*--------------------------------------------------------------------------*/ -#ifdef TEST_HAVE_VA_COPY -#include <stdarg.h> -va_list ap1,ap2; -int PLATFORM_TEST_C_MAIN() -{ - va_copy(ap1,ap2); - return 0; -} -#endif - -/*--------------------------------------------------------------------------*/ -#ifdef TEST_HAVE___VA_COPY -#include <stdarg.h> -va_list ap1,ap2; -int PLATFORM_TEST_C_MAIN() -{ - __va_copy(ap1,ap2); - return 0; -} -#endif - -/*--------------------------------------------------------------------------*/ -#ifdef TEST_HAVE_SOCKLEN_T -#include <sys/types.h> -#include <sys/socket.h> -int PLATFORM_TEST_C_MAIN() -{ - if((socklen_t*)0) return 0; - if(sizeof(socklen_t)) return 0; - return 0; -} -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/regressions.xml b/ThirdParty/libxml2/vtklibxml2/regressions.xml deleted file mode 100644 index c78838ac51e..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/regressions.xml +++ /dev/null @@ -1,226 +0,0 @@ -<RegressionTests> -<!-- - Within the following test descriptions the possible elements are: - Element Name Description - testname Plain text name of test - execpath pathname for test program(s) - testprog program to run for the test - flag flags for program (may have several) - file filename of input file (several, or glob ok) - exclfile filename to be excuded (several, or glob ok) - srcdir global source directory for input file(s) - srcsub subdirectory for input - resdir directory for results file(s) - ressub subdirectory for results - resext extension for expected result - reserrext extension for error result ('None' => no chk) - extarg additional argument for command - errexcl string to ignore when checking diffs - stdin pipe input file to stdin ---> - -<!-- - Note: These defaults are set to run from the root of the build directory ---> - <defaults> - <testname>noname</testname> -<!-- <execpath>win32/bin.msvc</execpath> --> - <execpath>.</execpath> - <testprog>xmllint</testprog> - <srcdir>test</srcdir> - <resdir>result</resdir> - <file>*.xml</file> - <reserrext>err</reserrext> - <errexcl/> - </defaults> - - <test> - <testname>XML Regression Tests</testname> - <errexcl>failed to load external entity</errexcl> - </test> - <test> - <testname>XML Entity Subst Regression Tests</testname> - <ressub>noent</ressub> - <flag>--noent</flag> - </test> - <test> - <testname>XML Namespaces Regression Tests</testname> - <srcsub>namespaces</srcsub> - <ressub>namespaces</ressub> - </test> - <test> - <testname>xml:id Regression Tests</testname> - <testprog>testXPath</testprog> - <srcsub>xmlid</srcsub> - <ressub>xmlid</ressub> - <flag>-i</flag> - <file>id_*.xml</file> - <extarg>"id('bar')"</extarg> - </test> - <test> - <testname>Error Cases Regression Tests</testname> - <srcsub>errors</srcsub> - <ressub>errors</ressub> - </test> - <test> - <testname>Error Cases Stream Regression Tests</testname> - <srcsub>errors</srcsub> - <ressub>errors</ressub> - <reserrext>str</reserrext> - <flag>--stream</flag> - </test> - <test> - <testname>Reader Regression Tests</testname> - <resext>rdr</resext> - <flag>--nonet</flag> - <flag>--debug</flag> - <flag>--stream</flag> - <file>*</file> - <reserrext>None</reserrext> - </test> - <test> - <testname>Walker Regression Tests</testname> - <resext>rdr</resext> - <flag>--nonet</flag> - <flag>--debug</flag> - <flag>--walker</flag> - <file>*</file> - <reserrext>None</reserrext> - </test> - <test> - <testname>Reader Entities Substitution Regression Tests</testname> - <resext>rde</resext> - <flag>--nonet</flag> - <flag>--debug</flag> - <flag>--stream</flag> - <flag>--noent</flag> - <file>*</file> - <reserrext>None</reserrext> - </test> - <test> - <testname>SAX Callbacks Regression Tests</testname> - <testprog>testSAX</testprog> - <resext>sax</resext> - <file>*</file> - <exclfile>utf16*.xml</exclfile> - <reserrext>None</reserrext> - </test> - <test> - <testname>XML Push Regression Tests</testname> - <flag>--push</flag> - <errexcl>failed to load external entity</errexcl> - </test> - <test> - <testname>HTML Regression Tests</testname> - <testprog>testHTML</testprog> - <srcsub>HTML</srcsub> - <ressub>HTML</ressub> - <file>*</file> - <exclfile>wired.html</exclfile> - </test> - <test> - <testname>Push HTML Regression Tests</testname> - <testprog>testHTML</testprog> - <flag>--push</flag> - <srcsub>HTML</srcsub> - <ressub>HTML</ressub> - <file>*</file> - </test> - <test> - <testname>HTML SAX Regression Tests</testname> - <testprog>testHTML</testprog> - <flag>--sax</flag> - <srcsub>HTML</srcsub> - <ressub>HTML</ressub> - <resext>sax</resext> - <reserrext>None</reserrext> - <file>*</file> - </test> - <test> - <testname>Push HTML SAX Regression Tests</testname> - <testprog>testHTML</testprog> - <flag>--sax</flag> - <flag>--push</flag> - <srcsub>HTML</srcsub> - <ressub>HTML</ressub> - <resext>sax</resext> - <reserrext>None</reserrext> - <file>*</file> - </test> - <test> - <testname>Valid Documents Regression Tests</testname> - <srcsub>VCM</srcsub> - <ressub>VCM</ressub> - <resext>None</resext> - <reserrext>None</reserrext> - <file>*</file> - <flag>--valid</flag> - <flag>--noout</flag> - <flag>--nowarning</flag> - </test> - <test> - <testname>Validity Checking Regression Tests</testname> - <srcsub>VC</srcsub> - <ressub>VC</ressub> - <resext>None</resext> - <reserrext/> - <file>*</file> - <flag>--valid</flag> - <flag>--noout</flag> - </test> - <test> - <testname>General Documents Valid Regression Tests</testname> - <srcsub>valid</srcsub> - <ressub>valid</ressub> - <file>*</file> - <flag>--valid</flag> - </test> - <test> - <testname>URI Module Regression Tests (1)</testname> - <testprog>testURI</testprog> - <srcsub>URI</srcsub> - <stdin/> - <ressub>URI</ressub> - <reserrext>None</reserrext> - <file>*.data</file> - <!-- Note - the following arg needs to use ", not ' --> - <flag>-base "http://foo.com/path/to/index.html?orig#help"</flag> - </test> - <test> - <testname>URI Module Regression Tests (2)</testname> - <testprog>testURI</testprog> - <srcsub>URI</srcsub> - <stdin/> - <ressub>URI</ressub> - <reserrext>None</reserrext> - <file>*.uri</file> - </test> - <test> - <testname>XPath Regression Tests (1)</testname> - <testprog>testXPath</testprog> - <srcsub>XPath/expr</srcsub> - <ressub>XPath/expr</ressub> - <file>*</file> - <flag>-f</flag> - <flag>--expr</flag> - </test> - <test> - <testname>XInclude Regression Tests</testname> - <srcsub>XInclude/docs</srcsub> - <ressub>XInclude</ressub> - <file>*</file> - <flag>--nowarning</flag> - <flag>--xinclude</flag> - </test> - <test> - <testname>XInclude xmlReader Regression Tests</testname> - <srcsub>XInclude/docs</srcsub> - <ressub>XInclude</ressub> - <resext>rdr</resext> - <file>*</file> - <flag>--nowarning</flag> - <flag>--xinclude</flag> - <flag>--stream</flag> - <flag>--debug</flag> - </test> -</RegressionTests> diff --git a/ThirdParty/libxml2/vtklibxml2/relaxng.c b/ThirdParty/libxml2/vtklibxml2/relaxng.c deleted file mode 100644 index 4260f9ded70..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/relaxng.c +++ /dev/null @@ -1,10815 +0,0 @@ -/* - * relaxng.c : implementation of the Relax-NG handling and validity checking - * - * See Copyright for the status of this software. - * - * Daniel Veillard <veillard@redhat.com> - */ - -/** - * TODO: - * - add support for DTD compatibility spec - * http://www.oasis-open.org/committees/relax-ng/compatibility-20011203.html - * - report better mem allocations pbms at runtime and abort immediately. - */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_SCHEMAS_ENABLED - -#include <string.h> -#include <stdio.h> -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/hash.h> -#include <libxml/uri.h> - -#include <libxml/relaxng.h> - -#include <libxml/xmlschemastypes.h> -#include <libxml/xmlautomata.h> -#include <libxml/xmlregexp.h> -#include <libxml/xmlschemastypes.h> - -/* - * The Relax-NG namespace - */ -static const xmlChar *xmlRelaxNGNs = (const xmlChar *) - "http://relaxng.org/ns/structure/1.0"; - -#define IS_RELAXNG(node, type) \ - ((node != NULL) && (node->ns != NULL) && \ - (xmlStrEqual(node->name, (const xmlChar *) type)) && \ - (xmlStrEqual(node->ns->href, xmlRelaxNGNs))) - - -#if 0 -#define DEBUG 1 - -#define DEBUG_GRAMMAR 1 - -#define DEBUG_CONTENT 1 - -#define DEBUG_TYPE 1 - -#define DEBUG_VALID 1 - -#define DEBUG_INTERLEAVE 1 - -#define DEBUG_LIST 1 - -#define DEBUG_INCLUDE 1 - -#define DEBUG_ERROR 1 - -#define DEBUG_COMPILE 1 - -#define DEBUG_PROGRESSIVE 1 -#endif - -#define MAX_ERROR 5 - -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -typedef struct _xmlRelaxNGSchema xmlRelaxNGSchema; -typedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr; - -typedef struct _xmlRelaxNGDefine xmlRelaxNGDefine; -typedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr; - -typedef struct _xmlRelaxNGDocument xmlRelaxNGDocument; -typedef xmlRelaxNGDocument *xmlRelaxNGDocumentPtr; - -typedef struct _xmlRelaxNGInclude xmlRelaxNGInclude; -typedef xmlRelaxNGInclude *xmlRelaxNGIncludePtr; - -typedef enum { - XML_RELAXNG_COMBINE_UNDEFINED = 0, /* undefined */ - XML_RELAXNG_COMBINE_CHOICE, /* choice */ - XML_RELAXNG_COMBINE_INTERLEAVE /* interleave */ -} xmlRelaxNGCombine; - -typedef enum { - XML_RELAXNG_CONTENT_ERROR = -1, - XML_RELAXNG_CONTENT_EMPTY = 0, - XML_RELAXNG_CONTENT_SIMPLE, - XML_RELAXNG_CONTENT_COMPLEX -} xmlRelaxNGContentType; - -typedef struct _xmlRelaxNGGrammar xmlRelaxNGGrammar; -typedef xmlRelaxNGGrammar *xmlRelaxNGGrammarPtr; - -struct _xmlRelaxNGGrammar { - xmlRelaxNGGrammarPtr parent; /* the parent grammar if any */ - xmlRelaxNGGrammarPtr children; /* the children grammar if any */ - xmlRelaxNGGrammarPtr next; /* the next grammar if any */ - xmlRelaxNGDefinePtr start; /* <start> content */ - xmlRelaxNGCombine combine; /* the default combine value */ - xmlRelaxNGDefinePtr startList; /* list of <start> definitions */ - xmlHashTablePtr defs; /* define* */ - xmlHashTablePtr refs; /* references */ -}; - - -typedef enum { - XML_RELAXNG_NOOP = -1, /* a no operation from simplification */ - XML_RELAXNG_EMPTY = 0, /* an empty pattern */ - XML_RELAXNG_NOT_ALLOWED, /* not allowed top */ - XML_RELAXNG_EXCEPT, /* except present in nameclass defs */ - XML_RELAXNG_TEXT, /* textual content */ - XML_RELAXNG_ELEMENT, /* an element */ - XML_RELAXNG_DATATYPE, /* extenal data type definition */ - XML_RELAXNG_PARAM, /* extenal data type parameter */ - XML_RELAXNG_VALUE, /* value from an extenal data type definition */ - XML_RELAXNG_LIST, /* a list of patterns */ - XML_RELAXNG_ATTRIBUTE, /* an attrbute following a pattern */ - XML_RELAXNG_DEF, /* a definition */ - XML_RELAXNG_REF, /* reference to a definition */ - XML_RELAXNG_EXTERNALREF, /* reference to an external def */ - XML_RELAXNG_PARENTREF, /* reference to a def in the parent grammar */ - XML_RELAXNG_OPTIONAL, /* optional patterns */ - XML_RELAXNG_ZEROORMORE, /* zero or more non empty patterns */ - XML_RELAXNG_ONEORMORE, /* one or more non empty patterns */ - XML_RELAXNG_CHOICE, /* a choice between non empty patterns */ - XML_RELAXNG_GROUP, /* a pair/group of non empty patterns */ - XML_RELAXNG_INTERLEAVE, /* interleaving choice of non-empty patterns */ - XML_RELAXNG_START /* Used to keep track of starts on grammars */ -} xmlRelaxNGType; - -#define IS_NULLABLE (1 << 0) -#define IS_NOT_NULLABLE (1 << 1) -#define IS_INDETERMINIST (1 << 2) -#define IS_MIXED (1 << 3) -#define IS_TRIABLE (1 << 4) -#define IS_PROCESSED (1 << 5) -#define IS_COMPILABLE (1 << 6) -#define IS_NOT_COMPILABLE (1 << 7) - -struct _xmlRelaxNGDefine { - xmlRelaxNGType type; /* the type of definition */ - xmlNodePtr node; /* the node in the source */ - xmlChar *name; /* the element local name if present */ - xmlChar *ns; /* the namespace local name if present */ - xmlChar *value; /* value when available */ - void *data; /* data lib or specific pointer */ - xmlRelaxNGDefinePtr content; /* the expected content */ - xmlRelaxNGDefinePtr parent; /* the parent definition, if any */ - xmlRelaxNGDefinePtr next; /* list within grouping sequences */ - xmlRelaxNGDefinePtr attrs; /* list of attributes for elements */ - xmlRelaxNGDefinePtr nameClass; /* the nameClass definition if any */ - xmlRelaxNGDefinePtr nextHash; /* next define in defs/refs hash tables */ - short depth; /* used for the cycle detection */ - short dflags; /* define related flags */ - xmlRegexpPtr contModel; /* a compiled content model if available */ -}; - -/** - * _xmlRelaxNG: - * - * A RelaxNGs definition - */ -struct _xmlRelaxNG { - void *_private; /* unused by the library for users or bindings */ - xmlRelaxNGGrammarPtr topgrammar; - xmlDocPtr doc; - - int idref; /* requires idref checking */ - - xmlHashTablePtr defs; /* define */ - xmlHashTablePtr refs; /* references */ - xmlRelaxNGDocumentPtr documents; /* all the documents loaded */ - xmlRelaxNGIncludePtr includes; /* all the includes loaded */ - int defNr; /* number of defines used */ - xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */ - -}; - -#define XML_RELAXNG_IN_ATTRIBUTE (1 << 0) -#define XML_RELAXNG_IN_ONEORMORE (1 << 1) -#define XML_RELAXNG_IN_LIST (1 << 2) -#define XML_RELAXNG_IN_DATAEXCEPT (1 << 3) -#define XML_RELAXNG_IN_START (1 << 4) -#define XML_RELAXNG_IN_OOMGROUP (1 << 5) -#define XML_RELAXNG_IN_OOMINTERLEAVE (1 << 6) -#define XML_RELAXNG_IN_EXTERNALREF (1 << 7) -#define XML_RELAXNG_IN_ANYEXCEPT (1 << 8) -#define XML_RELAXNG_IN_NSEXCEPT (1 << 9) - -struct _xmlRelaxNGParserCtxt { - void *userData; /* user specific data block */ - xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ - xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */ - xmlStructuredErrorFunc serror; - xmlRelaxNGValidErr err; - - xmlRelaxNGPtr schema; /* The schema in use */ - xmlRelaxNGGrammarPtr grammar; /* the current grammar */ - xmlRelaxNGGrammarPtr parentgrammar; /* the parent grammar */ - int flags; /* parser flags */ - int nbErrors; /* number of errors at parse time */ - int nbWarnings; /* number of warnings at parse time */ - const xmlChar *define; /* the current define scope */ - xmlRelaxNGDefinePtr def; /* the current define */ - - int nbInterleaves; - xmlHashTablePtr interleaves; /* keep track of all the interleaves */ - - xmlRelaxNGDocumentPtr documents; /* all the documents loaded */ - xmlRelaxNGIncludePtr includes; /* all the includes loaded */ - xmlChar *URL; - xmlDocPtr document; - - int defNr; /* number of defines used */ - int defMax; /* number of defines aloocated */ - xmlRelaxNGDefinePtr *defTab; /* pointer to the allocated definitions */ - - const char *buffer; - int size; - - /* the document stack */ - xmlRelaxNGDocumentPtr doc; /* Current parsed external ref */ - int docNr; /* Depth of the parsing stack */ - int docMax; /* Max depth of the parsing stack */ - xmlRelaxNGDocumentPtr *docTab; /* array of docs */ - - /* the include stack */ - xmlRelaxNGIncludePtr inc; /* Current parsed include */ - int incNr; /* Depth of the include parsing stack */ - int incMax; /* Max depth of the parsing stack */ - xmlRelaxNGIncludePtr *incTab; /* array of incs */ - - int idref; /* requires idref checking */ - - /* used to compile content models */ - xmlAutomataPtr am; /* the automata */ - xmlAutomataStatePtr state; /* used to build the automata */ - - int crng; /* compact syntax and other flags */ - int freedoc; /* need to free the document */ -}; - -#define FLAGS_IGNORABLE 1 -#define FLAGS_NEGATIVE 2 -#define FLAGS_MIXED_CONTENT 4 -#define FLAGS_NOERROR 8 - -/** - * xmlRelaxNGInterleaveGroup: - * - * A RelaxNGs partition set associated to lists of definitions - */ -typedef struct _xmlRelaxNGInterleaveGroup xmlRelaxNGInterleaveGroup; -typedef xmlRelaxNGInterleaveGroup *xmlRelaxNGInterleaveGroupPtr; -struct _xmlRelaxNGInterleaveGroup { - xmlRelaxNGDefinePtr rule; /* the rule to satisfy */ - xmlRelaxNGDefinePtr *defs; /* the array of element definitions */ - xmlRelaxNGDefinePtr *attrs; /* the array of attributes definitions */ -}; - -#define IS_DETERMINIST 1 -#define IS_NEEDCHECK 2 - -/** - * xmlRelaxNGPartitions: - * - * A RelaxNGs partition associated to an interleave group - */ -typedef struct _xmlRelaxNGPartition xmlRelaxNGPartition; -typedef xmlRelaxNGPartition *xmlRelaxNGPartitionPtr; -struct _xmlRelaxNGPartition { - int nbgroups; /* number of groups in the partitions */ - xmlHashTablePtr triage; /* hash table used to direct nodes to the - * right group when possible */ - int flags; /* determinist ? */ - xmlRelaxNGInterleaveGroupPtr *groups; -}; - -/** - * xmlRelaxNGValidState: - * - * A RelaxNGs validation state - */ -#define MAX_ATTR 20 -typedef struct _xmlRelaxNGValidState xmlRelaxNGValidState; -typedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr; -struct _xmlRelaxNGValidState { - xmlNodePtr node; /* the current node */ - xmlNodePtr seq; /* the sequence of children left to validate */ - int nbAttrs; /* the number of attributes */ - int maxAttrs; /* the size of attrs */ - int nbAttrLeft; /* the number of attributes left to validate */ - xmlChar *value; /* the value when operating on string */ - xmlChar *endvalue; /* the end value when operating on string */ - xmlAttrPtr *attrs; /* the array of attributes */ -}; - -/** - * xmlRelaxNGStates: - * - * A RelaxNGs container for validation state - */ -typedef struct _xmlRelaxNGStates xmlRelaxNGStates; -typedef xmlRelaxNGStates *xmlRelaxNGStatesPtr; -struct _xmlRelaxNGStates { - int nbState; /* the number of states */ - int maxState; /* the size of the array */ - xmlRelaxNGValidStatePtr *tabState; -}; - -#define ERROR_IS_DUP 1 - -/** - * xmlRelaxNGValidError: - * - * A RelaxNGs validation error - */ -typedef struct _xmlRelaxNGValidError xmlRelaxNGValidError; -typedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr; -struct _xmlRelaxNGValidError { - xmlRelaxNGValidErr err; /* the error number */ - int flags; /* flags */ - xmlNodePtr node; /* the current node */ - xmlNodePtr seq; /* the current child */ - const xmlChar *arg1; /* first arg */ - const xmlChar *arg2; /* second arg */ -}; - -/** - * xmlRelaxNGValidCtxt: - * - * A RelaxNGs validation context - */ - -struct _xmlRelaxNGValidCtxt { - void *userData; /* user specific data block */ - xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ - xmlRelaxNGValidityWarningFunc warning; /* the callback in case of warning */ - xmlStructuredErrorFunc serror; - int nbErrors; /* number of errors in validation */ - - xmlRelaxNGPtr schema; /* The schema in use */ - xmlDocPtr doc; /* the document being validated */ - int flags; /* validation flags */ - int depth; /* validation depth */ - int idref; /* requires idref checking */ - int errNo; /* the first error found */ - - /* - * Errors accumulated in branches may have to be stacked to be - * provided back when it's sure they affect validation. - */ - xmlRelaxNGValidErrorPtr err; /* Last error */ - int errNr; /* Depth of the error stack */ - int errMax; /* Max depth of the error stack */ - xmlRelaxNGValidErrorPtr errTab; /* stack of errors */ - - xmlRelaxNGValidStatePtr state; /* the current validation state */ - xmlRelaxNGStatesPtr states; /* the accumulated state list */ - - xmlRelaxNGStatesPtr freeState; /* the pool of free valid states */ - int freeStatesNr; - int freeStatesMax; - xmlRelaxNGStatesPtr *freeStates; /* the pool of free state groups */ - - /* - * This is used for "progressive" validation - */ - xmlRegExecCtxtPtr elem; /* the current element regexp */ - int elemNr; /* the number of element validated */ - int elemMax; /* the max depth of elements */ - xmlRegExecCtxtPtr *elemTab; /* the stack of regexp runtime */ - int pstate; /* progressive state */ - xmlNodePtr pnode; /* the current node */ - xmlRelaxNGDefinePtr pdef; /* the non-streamable definition */ - int perr; /* signal error in content model - * outside the regexp */ -}; - -/** - * xmlRelaxNGInclude: - * - * Structure associated to a RelaxNGs document element - */ -struct _xmlRelaxNGInclude { - xmlRelaxNGIncludePtr next; /* keep a chain of includes */ - xmlChar *href; /* the normalized href value */ - xmlDocPtr doc; /* the associated XML document */ - xmlRelaxNGDefinePtr content; /* the definitions */ - xmlRelaxNGPtr schema; /* the schema */ -}; - -/** - * xmlRelaxNGDocument: - * - * Structure associated to a RelaxNGs document element - */ -struct _xmlRelaxNGDocument { - xmlRelaxNGDocumentPtr next; /* keep a chain of documents */ - xmlChar *href; /* the normalized href value */ - xmlDocPtr doc; /* the associated XML document */ - xmlRelaxNGDefinePtr content; /* the definitions */ - xmlRelaxNGPtr schema; /* the schema */ -}; - - -/************************************************************************ - * * - * Some factorized error routines * - * * - ************************************************************************/ - -/** - * xmlRngPErrMemory: - * @ctxt: an Relax-NG parser context - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -static void -xmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt, const char *extra) -{ - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - void *data = NULL; - - if (ctxt != NULL) { - if (ctxt->serror != NULL) - schannel = ctxt->serror; - else - channel = ctxt->error; - data = ctxt->userData; - ctxt->nbErrors++; - } - if (extra) - __xmlRaiseError(schannel, channel, data, - NULL, NULL, XML_FROM_RELAXNGP, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, - NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); - else - __xmlRaiseError(schannel, channel, data, - NULL, NULL, XML_FROM_RELAXNGP, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, - NULL, NULL, 0, 0, "Memory allocation failed\n"); -} - -/** - * xmlRngVErrMemory: - * @ctxt: a Relax-NG validation context - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -static void -xmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt, const char *extra) -{ - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - void *data = NULL; - - if (ctxt != NULL) { - if (ctxt->serror != NULL) - schannel = ctxt->serror; - else - channel = ctxt->error; - data = ctxt->userData; - ctxt->nbErrors++; - } - if (extra) - __xmlRaiseError(schannel, channel, data, - NULL, NULL, XML_FROM_RELAXNGV, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, - NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); - else - __xmlRaiseError(schannel, channel, data, - NULL, NULL, XML_FROM_RELAXNGV, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, - NULL, NULL, 0, 0, "Memory allocation failed\n"); -} - -/** - * xmlRngPErr: - * @ctxt: a Relax-NG parser context - * @node: the node raising the error - * @error: the error code - * @msg: message - * @str1: extra info - * @str2: extra info - * - * Handle a Relax NG Parsing error - */ -static void -xmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, int error, - const char *msg, const xmlChar * str1, const xmlChar * str2) -{ - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - void *data = NULL; - - if (ctxt != NULL) { - if (ctxt->serror != NULL) - schannel = ctxt->serror; - else - channel = ctxt->error; - data = ctxt->userData; - ctxt->nbErrors++; - } - __xmlRaiseError(schannel, channel, data, - NULL, node, XML_FROM_RELAXNGP, - error, XML_ERR_ERROR, NULL, 0, - (const char *) str1, (const char *) str2, NULL, 0, 0, - msg, str1, str2); -} - -/** - * xmlRngVErr: - * @ctxt: a Relax-NG validation context - * @node: the node raising the error - * @error: the error code - * @msg: message - * @str1: extra info - * @str2: extra info - * - * Handle a Relax NG Validation error - */ -static void -xmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error, - const char *msg, const xmlChar * str1, const xmlChar * str2) -{ - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - void *data = NULL; - - if (ctxt != NULL) { - if (ctxt->serror != NULL) - schannel = ctxt->serror; - else - channel = ctxt->error; - data = ctxt->userData; - ctxt->nbErrors++; - } - __xmlRaiseError(schannel, channel, data, - NULL, node, XML_FROM_RELAXNGV, - error, XML_ERR_ERROR, NULL, 0, - (const char *) str1, (const char *) str2, NULL, 0, 0, - msg, str1, str2); -} - -/************************************************************************ - * * - * Preliminary type checking interfaces * - * * - ************************************************************************/ - -/** - * xmlRelaxNGTypeHave: - * @data: data needed for the library - * @type: the type name - * @value: the value to check - * - * Function provided by a type library to check if a type is exported - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -typedef int (*xmlRelaxNGTypeHave) (void *data, const xmlChar * type); - -/** - * xmlRelaxNGTypeCheck: - * @data: data needed for the library - * @type: the type name - * @value: the value to check - * @result: place to store the result if needed - * - * Function provided by a type library to check if a value match a type - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -typedef int (*xmlRelaxNGTypeCheck) (void *data, const xmlChar * type, - const xmlChar * value, void **result, - xmlNodePtr node); - -/** - * xmlRelaxNGFacetCheck: - * @data: data needed for the library - * @type: the type name - * @facet: the facet name - * @val: the facet value - * @strval: the string value - * @value: the value to check - * - * Function provided by a type library to check a value facet - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -typedef int (*xmlRelaxNGFacetCheck) (void *data, const xmlChar * type, - const xmlChar * facet, - const xmlChar * val, - const xmlChar * strval, void *value); - -/** - * xmlRelaxNGTypeFree: - * @data: data needed for the library - * @result: the value to free - * - * Function provided by a type library to free a returned result - */ -typedef void (*xmlRelaxNGTypeFree) (void *data, void *result); - -/** - * xmlRelaxNGTypeCompare: - * @data: data needed for the library - * @type: the type name - * @value1: the first value - * @value2: the second value - * - * Function provided by a type library to compare two values accordingly - * to a type. - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -typedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar * type, - const xmlChar * value1, - xmlNodePtr ctxt1, - void *comp1, - const xmlChar * value2, - xmlNodePtr ctxt2); -typedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary; -typedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr; -struct _xmlRelaxNGTypeLibrary { - const xmlChar *namespace; /* the datatypeLibrary value */ - void *data; /* data needed for the library */ - xmlRelaxNGTypeHave have; /* the export function */ - xmlRelaxNGTypeCheck check; /* the checking function */ - xmlRelaxNGTypeCompare comp; /* the compare function */ - xmlRelaxNGFacetCheck facet; /* the facet check function */ - xmlRelaxNGTypeFree freef; /* the freeing function */ -}; - -/************************************************************************ - * * - * Allocation functions * - * * - ************************************************************************/ -static void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar); -static void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define); -static void xmlRelaxNGNormExtSpace(xmlChar * value); -static void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema); -static int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt - ATTRIBUTE_UNUSED, - xmlRelaxNGValidStatePtr state1, - xmlRelaxNGValidStatePtr state2); -static void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidStatePtr state); - -/** - * xmlRelaxNGFreeDocument: - * @docu: a document structure - * - * Deallocate a RelaxNG document structure. - */ -static void -xmlRelaxNGFreeDocument(xmlRelaxNGDocumentPtr docu) -{ - if (docu == NULL) - return; - - if (docu->href != NULL) - xmlFree(docu->href); - if (docu->doc != NULL) - xmlFreeDoc(docu->doc); - if (docu->schema != NULL) - xmlRelaxNGFreeInnerSchema(docu->schema); - xmlFree(docu); -} - -/** - * xmlRelaxNGFreeDocumentList: - * @docu: a list of document structure - * - * Deallocate a RelaxNG document structures. - */ -static void -xmlRelaxNGFreeDocumentList(xmlRelaxNGDocumentPtr docu) -{ - xmlRelaxNGDocumentPtr next; - - while (docu != NULL) { - next = docu->next; - xmlRelaxNGFreeDocument(docu); - docu = next; - } -} - -/** - * xmlRelaxNGFreeInclude: - * @incl: a include structure - * - * Deallocate a RelaxNG include structure. - */ -static void -xmlRelaxNGFreeInclude(xmlRelaxNGIncludePtr incl) -{ - if (incl == NULL) - return; - - if (incl->href != NULL) - xmlFree(incl->href); - if (incl->doc != NULL) - xmlFreeDoc(incl->doc); - if (incl->schema != NULL) - xmlRelaxNGFree(incl->schema); - xmlFree(incl); -} - -/** - * xmlRelaxNGFreeIncludeList: - * @incl: a include structure list - * - * Deallocate a RelaxNG include structure. - */ -static void -xmlRelaxNGFreeIncludeList(xmlRelaxNGIncludePtr incl) -{ - xmlRelaxNGIncludePtr next; - - while (incl != NULL) { - next = incl->next; - xmlRelaxNGFreeInclude(incl); - incl = next; - } -} - -/** - * xmlRelaxNGNewRelaxNG: - * @ctxt: a Relax-NG validation context (optional) - * - * Allocate a new RelaxNG structure. - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlRelaxNGPtr -xmlRelaxNGNewRelaxNG(xmlRelaxNGParserCtxtPtr ctxt) -{ - xmlRelaxNGPtr ret; - - ret = (xmlRelaxNGPtr) xmlMalloc(sizeof(xmlRelaxNG)); - if (ret == NULL) { - xmlRngPErrMemory(ctxt, NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNG)); - - return (ret); -} - -/** - * xmlRelaxNGFreeInnerSchema: - * @schema: a schema structure - * - * Deallocate a RelaxNG schema structure. - */ -static void -xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema) -{ - if (schema == NULL) - return; - - if (schema->doc != NULL) - xmlFreeDoc(schema->doc); - if (schema->defTab != NULL) { - int i; - - for (i = 0; i < schema->defNr; i++) - xmlRelaxNGFreeDefine(schema->defTab[i]); - xmlFree(schema->defTab); - } - - xmlFree(schema); -} - -/** - * xmlRelaxNGFree: - * @schema: a schema structure - * - * Deallocate a RelaxNG structure. - */ -void -xmlRelaxNGFree(xmlRelaxNGPtr schema) -{ - if (schema == NULL) - return; - - if (schema->topgrammar != NULL) - xmlRelaxNGFreeGrammar(schema->topgrammar); - if (schema->doc != NULL) - xmlFreeDoc(schema->doc); - if (schema->documents != NULL) - xmlRelaxNGFreeDocumentList(schema->documents); - if (schema->includes != NULL) - xmlRelaxNGFreeIncludeList(schema->includes); - if (schema->defTab != NULL) { - int i; - - for (i = 0; i < schema->defNr; i++) - xmlRelaxNGFreeDefine(schema->defTab[i]); - xmlFree(schema->defTab); - } - - xmlFree(schema); -} - -/** - * xmlRelaxNGNewGrammar: - * @ctxt: a Relax-NG validation context (optional) - * - * Allocate a new RelaxNG grammar. - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlRelaxNGGrammarPtr -xmlRelaxNGNewGrammar(xmlRelaxNGParserCtxtPtr ctxt) -{ - xmlRelaxNGGrammarPtr ret; - - ret = (xmlRelaxNGGrammarPtr) xmlMalloc(sizeof(xmlRelaxNGGrammar)); - if (ret == NULL) { - xmlRngPErrMemory(ctxt, NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGGrammar)); - - return (ret); -} - -/** - * xmlRelaxNGFreeGrammar: - * @grammar: a grammar structure - * - * Deallocate a RelaxNG grammar structure. - */ -static void -xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar) -{ - if (grammar == NULL) - return; - - if (grammar->children != NULL) { - xmlRelaxNGFreeGrammar(grammar->children); - } - if (grammar->next != NULL) { - xmlRelaxNGFreeGrammar(grammar->next); - } - if (grammar->refs != NULL) { - xmlHashFree(grammar->refs, NULL); - } - if (grammar->defs != NULL) { - xmlHashFree(grammar->defs, NULL); - } - - xmlFree(grammar); -} - -/** - * xmlRelaxNGNewDefine: - * @ctxt: a Relax-NG validation context - * @node: the node in the input document. - * - * Allocate a new RelaxNG define. - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGNewDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGDefinePtr ret; - - if (ctxt->defMax == 0) { - ctxt->defMax = 16; - ctxt->defNr = 0; - ctxt->defTab = (xmlRelaxNGDefinePtr *) - xmlMalloc(ctxt->defMax * sizeof(xmlRelaxNGDefinePtr)); - if (ctxt->defTab == NULL) { - xmlRngPErrMemory(ctxt, "allocating define\n"); - return (NULL); - } - } else if (ctxt->defMax <= ctxt->defNr) { - xmlRelaxNGDefinePtr *tmp; - - ctxt->defMax *= 2; - tmp = (xmlRelaxNGDefinePtr *) xmlRealloc(ctxt->defTab, - ctxt->defMax * - sizeof - (xmlRelaxNGDefinePtr)); - if (tmp == NULL) { - xmlRngPErrMemory(ctxt, "allocating define\n"); - return (NULL); - } - ctxt->defTab = tmp; - } - ret = (xmlRelaxNGDefinePtr) xmlMalloc(sizeof(xmlRelaxNGDefine)); - if (ret == NULL) { - xmlRngPErrMemory(ctxt, "allocating define\n"); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGDefine)); - ctxt->defTab[ctxt->defNr++] = ret; - ret->node = node; - ret->depth = -1; - return (ret); -} - -/** - * xmlRelaxNGFreePartition: - * @partitions: a partition set structure - * - * Deallocate RelaxNG partition set structures. - */ -static void -xmlRelaxNGFreePartition(xmlRelaxNGPartitionPtr partitions) -{ - xmlRelaxNGInterleaveGroupPtr group; - int j; - - if (partitions != NULL) { - if (partitions->groups != NULL) { - for (j = 0; j < partitions->nbgroups; j++) { - group = partitions->groups[j]; - if (group != NULL) { - if (group->defs != NULL) - xmlFree(group->defs); - if (group->attrs != NULL) - xmlFree(group->attrs); - xmlFree(group); - } - } - xmlFree(partitions->groups); - } - if (partitions->triage != NULL) { - xmlHashFree(partitions->triage, NULL); - } - xmlFree(partitions); - } -} - -/** - * xmlRelaxNGFreeDefine: - * @define: a define structure - * - * Deallocate a RelaxNG define structure. - */ -static void -xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define) -{ - if (define == NULL) - return; - - if ((define->type == XML_RELAXNG_VALUE) && (define->attrs != NULL)) { - xmlRelaxNGTypeLibraryPtr lib; - - lib = (xmlRelaxNGTypeLibraryPtr) define->data; - if ((lib != NULL) && (lib->freef != NULL)) - lib->freef(lib->data, (void *) define->attrs); - } - if ((define->data != NULL) && (define->type == XML_RELAXNG_INTERLEAVE)) - xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data); - if ((define->data != NULL) && (define->type == XML_RELAXNG_CHOICE)) - xmlHashFree((xmlHashTablePtr) define->data, NULL); - if (define->name != NULL) - xmlFree(define->name); - if (define->ns != NULL) - xmlFree(define->ns); - if (define->value != NULL) - xmlFree(define->value); - if (define->contModel != NULL) - xmlRegFreeRegexp(define->contModel); - xmlFree(define); -} - -/** - * xmlRelaxNGNewStates: - * @ctxt: a Relax-NG validation context - * @size: the default size for the container - * - * Allocate a new RelaxNG validation state container - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlRelaxNGStatesPtr -xmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size) -{ - xmlRelaxNGStatesPtr ret; - - if ((ctxt != NULL) && - (ctxt->freeState != NULL) && (ctxt->freeStatesNr > 0)) { - ctxt->freeStatesNr--; - ret = ctxt->freeStates[ctxt->freeStatesNr]; - ret->nbState = 0; - return (ret); - } - if (size < 16) - size = 16; - - ret = (xmlRelaxNGStatesPtr) xmlMalloc(sizeof(xmlRelaxNGStates) + - (size - - 1) * - sizeof(xmlRelaxNGValidStatePtr)); - if (ret == NULL) { - xmlRngVErrMemory(ctxt, "allocating states\n"); - return (NULL); - } - ret->nbState = 0; - ret->maxState = size; - ret->tabState = (xmlRelaxNGValidStatePtr *) xmlMalloc((size) * - sizeof - (xmlRelaxNGValidStatePtr)); - if (ret->tabState == NULL) { - xmlRngVErrMemory(ctxt, "allocating states\n"); - xmlFree(ret); - return (NULL); - } - return (ret); -} - -/** - * xmlRelaxNGAddStateUniq: - * @ctxt: a Relax-NG validation context - * @states: the states container - * @state: the validation state - * - * Add a RelaxNG validation state to the container without checking - * for unicity. - * - * Return 1 in case of success and 0 if this is a duplicate and -1 on error - */ -static int -xmlRelaxNGAddStatesUniq(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGStatesPtr states, - xmlRelaxNGValidStatePtr state) -{ - if (state == NULL) { - return (-1); - } - if (states->nbState >= states->maxState) { - xmlRelaxNGValidStatePtr *tmp; - int size; - - size = states->maxState * 2; - tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, - (size) * - sizeof - (xmlRelaxNGValidStatePtr)); - if (tmp == NULL) { - xmlRngVErrMemory(ctxt, "adding states\n"); - return (-1); - } - states->tabState = tmp; - states->maxState = size; - } - states->tabState[states->nbState++] = state; - return (1); -} - -/** - * xmlRelaxNGAddState: - * @ctxt: a Relax-NG validation context - * @states: the states container - * @state: the validation state - * - * Add a RelaxNG validation state to the container - * - * Return 1 in case of success and 0 if this is a duplicate and -1 on error - */ -static int -xmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGStatesPtr states, - xmlRelaxNGValidStatePtr state) -{ - int i; - - if (state == NULL) { - return (-1); - } - if (states->nbState >= states->maxState) { - xmlRelaxNGValidStatePtr *tmp; - int size; - - size = states->maxState * 2; - tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState, - (size) * - sizeof - (xmlRelaxNGValidStatePtr)); - if (tmp == NULL) { - xmlRngVErrMemory(ctxt, "adding states\n"); - return (-1); - } - states->tabState = tmp; - states->maxState = size; - } - for (i = 0; i < states->nbState; i++) { - if (xmlRelaxNGEqualValidState(ctxt, state, states->tabState[i])) { - xmlRelaxNGFreeValidState(ctxt, state); - return (0); - } - } - states->tabState[states->nbState++] = state; - return (1); -} - -/** - * xmlRelaxNGFreeStates: - * @ctxt: a Relax-NG validation context - * @states: the container - * - * Free a RelaxNG validation state container - */ -static void -xmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGStatesPtr states) -{ - if (states == NULL) - return; - if ((ctxt != NULL) && (ctxt->freeStates == NULL)) { - ctxt->freeStatesMax = 40; - ctxt->freeStatesNr = 0; - ctxt->freeStates = (xmlRelaxNGStatesPtr *) - xmlMalloc(ctxt->freeStatesMax * sizeof(xmlRelaxNGStatesPtr)); - if (ctxt->freeStates == NULL) { - xmlRngVErrMemory(ctxt, "storing states\n"); - } - } else if ((ctxt != NULL) - && (ctxt->freeStatesNr >= ctxt->freeStatesMax)) { - xmlRelaxNGStatesPtr *tmp; - - tmp = (xmlRelaxNGStatesPtr *) xmlRealloc(ctxt->freeStates, - 2 * ctxt->freeStatesMax * - sizeof - (xmlRelaxNGStatesPtr)); - if (tmp == NULL) { - xmlRngVErrMemory(ctxt, "storing states\n"); - xmlFree(states->tabState); - xmlFree(states); - return; - } - ctxt->freeStates = tmp; - ctxt->freeStatesMax *= 2; - } - if ((ctxt == NULL) || (ctxt->freeStates == NULL)) { - xmlFree(states->tabState); - xmlFree(states); - } else { - ctxt->freeStates[ctxt->freeStatesNr++] = states; - } -} - -/** - * xmlRelaxNGNewValidState: - * @ctxt: a Relax-NG validation context - * @node: the current node or NULL for the document - * - * Allocate a new RelaxNG validation state - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlRelaxNGValidStatePtr -xmlRelaxNGNewValidState(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGValidStatePtr ret; - xmlAttrPtr attr; - xmlAttrPtr attrs[MAX_ATTR]; - int nbAttrs = 0; - xmlNodePtr root = NULL; - - if (node == NULL) { - root = xmlDocGetRootElement(ctxt->doc); - if (root == NULL) - return (NULL); - } else { - attr = node->properties; - while (attr != NULL) { - if (nbAttrs < MAX_ATTR) - attrs[nbAttrs++] = attr; - else - nbAttrs++; - attr = attr->next; - } - } - if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) { - ctxt->freeState->nbState--; - ret = ctxt->freeState->tabState[ctxt->freeState->nbState]; - } else { - ret = - (xmlRelaxNGValidStatePtr) - xmlMalloc(sizeof(xmlRelaxNGValidState)); - if (ret == NULL) { - xmlRngVErrMemory(ctxt, "allocating states\n"); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGValidState)); - } - ret->value = NULL; - ret->endvalue = NULL; - if (node == NULL) { - ret->node = (xmlNodePtr) ctxt->doc; - ret->seq = root; - } else { - ret->node = node; - ret->seq = node->children; - } - ret->nbAttrs = 0; - if (nbAttrs > 0) { - if (ret->attrs == NULL) { - if (nbAttrs < 4) - ret->maxAttrs = 4; - else - ret->maxAttrs = nbAttrs; - ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs * - sizeof(xmlAttrPtr)); - if (ret->attrs == NULL) { - xmlRngVErrMemory(ctxt, "allocating states\n"); - return (ret); - } - } else if (ret->maxAttrs < nbAttrs) { - xmlAttrPtr *tmp; - - tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, nbAttrs * - sizeof(xmlAttrPtr)); - if (tmp == NULL) { - xmlRngVErrMemory(ctxt, "allocating states\n"); - return (ret); - } - ret->attrs = tmp; - ret->maxAttrs = nbAttrs; - } - ret->nbAttrs = nbAttrs; - if (nbAttrs < MAX_ATTR) { - memcpy(ret->attrs, attrs, sizeof(xmlAttrPtr) * nbAttrs); - } else { - attr = node->properties; - nbAttrs = 0; - while (attr != NULL) { - ret->attrs[nbAttrs++] = attr; - attr = attr->next; - } - } - } - ret->nbAttrLeft = ret->nbAttrs; - return (ret); -} - -/** - * xmlRelaxNGCopyValidState: - * @ctxt: a Relax-NG validation context - * @state: a validation state - * - * Copy the validation state - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlRelaxNGValidStatePtr -xmlRelaxNGCopyValidState(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidStatePtr state) -{ - xmlRelaxNGValidStatePtr ret; - unsigned int maxAttrs; - xmlAttrPtr *attrs; - - if (state == NULL) - return (NULL); - if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) { - ctxt->freeState->nbState--; - ret = ctxt->freeState->tabState[ctxt->freeState->nbState]; - } else { - ret = - (xmlRelaxNGValidStatePtr) - xmlMalloc(sizeof(xmlRelaxNGValidState)); - if (ret == NULL) { - xmlRngVErrMemory(ctxt, "allocating states\n"); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGValidState)); - } - attrs = ret->attrs; - maxAttrs = ret->maxAttrs; - memcpy(ret, state, sizeof(xmlRelaxNGValidState)); - ret->attrs = attrs; - ret->maxAttrs = maxAttrs; - if (state->nbAttrs > 0) { - if (ret->attrs == NULL) { - ret->maxAttrs = state->maxAttrs; - ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs * - sizeof(xmlAttrPtr)); - if (ret->attrs == NULL) { - xmlRngVErrMemory(ctxt, "allocating states\n"); - ret->nbAttrs = 0; - return (ret); - } - } else if (ret->maxAttrs < state->nbAttrs) { - xmlAttrPtr *tmp; - - tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, state->maxAttrs * - sizeof(xmlAttrPtr)); - if (tmp == NULL) { - xmlRngVErrMemory(ctxt, "allocating states\n"); - ret->nbAttrs = 0; - return (ret); - } - ret->maxAttrs = state->maxAttrs; - ret->attrs = tmp; - } - memcpy(ret->attrs, state->attrs, - state->nbAttrs * sizeof(xmlAttrPtr)); - } - return (ret); -} - -/** - * xmlRelaxNGEqualValidState: - * @ctxt: a Relax-NG validation context - * @state1: a validation state - * @state2: a validation state - * - * Compare the validation states for equality - * - * Returns 1 if equald, 0 otherwise - */ -static int -xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlRelaxNGValidStatePtr state1, - xmlRelaxNGValidStatePtr state2) -{ - int i; - - if ((state1 == NULL) || (state2 == NULL)) - return (0); - if (state1 == state2) - return (1); - if (state1->node != state2->node) - return (0); - if (state1->seq != state2->seq) - return (0); - if (state1->nbAttrLeft != state2->nbAttrLeft) - return (0); - if (state1->nbAttrs != state2->nbAttrs) - return (0); - if (state1->endvalue != state2->endvalue) - return (0); - if ((state1->value != state2->value) && - (!xmlStrEqual(state1->value, state2->value))) - return (0); - for (i = 0; i < state1->nbAttrs; i++) { - if (state1->attrs[i] != state2->attrs[i]) - return (0); - } - return (1); -} - -/** - * xmlRelaxNGFreeValidState: - * @state: a validation state structure - * - * Deallocate a RelaxNG validation state structure. - */ -static void -xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidStatePtr state) -{ - if (state == NULL) - return; - - if ((ctxt != NULL) && (ctxt->freeState == NULL)) { - ctxt->freeState = xmlRelaxNGNewStates(ctxt, 40); - } - if ((ctxt == NULL) || (ctxt->freeState == NULL)) { - if (state->attrs != NULL) - xmlFree(state->attrs); - xmlFree(state); - } else { - xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state); - } -} - -/************************************************************************ - * * - * Semi internal functions * - * * - ************************************************************************/ - -/** - * xmlRelaxParserSetFlag: - * @ctxt: a RelaxNG parser context - * @flags: a set of flags values - * - * Semi private function used to pass informations to a parser context - * which are a combination of xmlRelaxNGParserFlag . - * - * Returns 0 if success and -1 in case of error - */ -int -xmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags) -{ - if (ctxt == NULL) return(-1); - if (flags & XML_RELAXNGP_FREE_DOC) { - ctxt->crng |= XML_RELAXNGP_FREE_DOC; - flags -= XML_RELAXNGP_FREE_DOC; - } - if (flags & XML_RELAXNGP_CRNG) { - ctxt->crng |= XML_RELAXNGP_CRNG; - flags -= XML_RELAXNGP_CRNG; - } - if (flags != 0) return(-1); - return(0); -} - -/************************************************************************ - * * - * Document functions * - * * - ************************************************************************/ -static xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, - xmlDocPtr doc); - -/** - * xmlRelaxNGIncludePush: - * @ctxt: the parser context - * @value: the element doc - * - * Pushes a new include on top of the include stack - * - * Returns 0 in case of error, the index in the stack otherwise - */ -static int -xmlRelaxNGIncludePush(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGIncludePtr value) -{ - if (ctxt->incTab == NULL) { - ctxt->incMax = 4; - ctxt->incNr = 0; - ctxt->incTab = - (xmlRelaxNGIncludePtr *) xmlMalloc(ctxt->incMax * - sizeof(ctxt->incTab[0])); - if (ctxt->incTab == NULL) { - xmlRngPErrMemory(ctxt, "allocating include\n"); - return (0); - } - } - if (ctxt->incNr >= ctxt->incMax) { - ctxt->incMax *= 2; - ctxt->incTab = - (xmlRelaxNGIncludePtr *) xmlRealloc(ctxt->incTab, - ctxt->incMax * - sizeof(ctxt->incTab[0])); - if (ctxt->incTab == NULL) { - xmlRngPErrMemory(ctxt, "allocating include\n"); - return (0); - } - } - ctxt->incTab[ctxt->incNr] = value; - ctxt->inc = value; - return (ctxt->incNr++); -} - -/** - * xmlRelaxNGIncludePop: - * @ctxt: the parser context - * - * Pops the top include from the include stack - * - * Returns the include just removed - */ -static xmlRelaxNGIncludePtr -xmlRelaxNGIncludePop(xmlRelaxNGParserCtxtPtr ctxt) -{ - xmlRelaxNGIncludePtr ret; - - if (ctxt->incNr <= 0) - return (NULL); - ctxt->incNr--; - if (ctxt->incNr > 0) - ctxt->inc = ctxt->incTab[ctxt->incNr - 1]; - else - ctxt->inc = NULL; - ret = ctxt->incTab[ctxt->incNr]; - ctxt->incTab[ctxt->incNr] = NULL; - return (ret); -} - -/** - * xmlRelaxNGRemoveRedefine: - * @ctxt: the parser context - * @URL: the normalized URL - * @target: the included target - * @name: the define name to eliminate - * - * Applies the elimination algorithm of 4.7 - * - * Returns 0 in case of error, 1 in case of success. - */ -static int -xmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt, - const xmlChar * URL ATTRIBUTE_UNUSED, - xmlNodePtr target, const xmlChar * name) -{ - int found = 0; - xmlNodePtr tmp, tmp2; - xmlChar *name2; - -#ifdef DEBUG_INCLUDE - if (name == NULL) - xmlGenericError(xmlGenericErrorContext, - "Elimination of <include> start from %s\n", URL); - else - xmlGenericError(xmlGenericErrorContext, - "Elimination of <include> define %s from %s\n", - name, URL); -#endif - tmp = target; - while (tmp != NULL) { - tmp2 = tmp->next; - if ((name == NULL) && (IS_RELAXNG(tmp, "start"))) { - found = 1; - xmlUnlinkNode(tmp); - xmlFreeNode(tmp); - } else if ((name != NULL) && (IS_RELAXNG(tmp, "define"))) { - name2 = xmlGetProp(tmp, BAD_CAST "name"); - xmlRelaxNGNormExtSpace(name2); - if (name2 != NULL) { - if (xmlStrEqual(name, name2)) { - found = 1; - xmlUnlinkNode(tmp); - xmlFreeNode(tmp); - } - xmlFree(name2); - } - } else if (IS_RELAXNG(tmp, "include")) { - xmlChar *href = NULL; - xmlRelaxNGDocumentPtr inc = tmp->psvi; - - if ((inc != NULL) && (inc->doc != NULL) && - (inc->doc->children != NULL)) { - - if (xmlStrEqual - (inc->doc->children->name, BAD_CAST "grammar")) { -#ifdef DEBUG_INCLUDE - href = xmlGetProp(tmp, BAD_CAST "href"); -#endif - if (xmlRelaxNGRemoveRedefine(ctxt, href, - inc->doc->children-> - children, name) == 1) { - found = 1; - } -#ifdef DEBUG_INCLUDE - if (href != NULL) - xmlFree(href); -#endif - } - } - } - tmp = tmp2; - } - return (found); -} - -/** - * xmlRelaxNGLoadInclude: - * @ctxt: the parser context - * @URL: the normalized URL - * @node: the include node. - * @ns: the namespace passed from the context. - * - * First lookup if the document is already loaded into the parser context, - * check against recursion. If not found the resource is loaded and - * the content is preprocessed before being returned back to the caller. - * - * Returns the xmlRelaxNGIncludePtr or NULL in case of error - */ -static xmlRelaxNGIncludePtr -xmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * URL, - xmlNodePtr node, const xmlChar * ns) -{ - xmlRelaxNGIncludePtr ret = NULL; - xmlDocPtr doc; - int i; - xmlNodePtr root, cur; - -#ifdef DEBUG_INCLUDE - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGLoadInclude(%s)\n", URL); -#endif - - /* - * check against recursion in the stack - */ - for (i = 0; i < ctxt->incNr; i++) { - if (xmlStrEqual(ctxt->incTab[i]->href, URL)) { - xmlRngPErr(ctxt, NULL, XML_RNGP_INCLUDE_RECURSE, - "Detected an Include recursion for %s\n", URL, - NULL); - return (NULL); - } - } - - /* - * load the document - */ - doc = xmlReadFile((const char *) URL,NULL,0); - if (doc == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_PARSE_ERROR, - "xmlRelaxNG: could not load %s\n", URL, NULL); - return (NULL); - } -#ifdef DEBUG_INCLUDE - xmlGenericError(xmlGenericErrorContext, "Parsed %s Okay\n", URL); -#endif - - /* - * Allocate the document structures and register it first. - */ - ret = (xmlRelaxNGIncludePtr) xmlMalloc(sizeof(xmlRelaxNGInclude)); - if (ret == NULL) { - xmlRngPErrMemory(ctxt, "allocating include\n"); - xmlFreeDoc(doc); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGInclude)); - ret->doc = doc; - ret->href = xmlStrdup(URL); - ret->next = ctxt->includes; - ctxt->includes = ret; - - /* - * transmit the ns if needed - */ - if (ns != NULL) { - root = xmlDocGetRootElement(doc); - if (root != NULL) { - if (xmlHasProp(root, BAD_CAST "ns") == NULL) { - xmlSetProp(root, BAD_CAST "ns", ns); - } - } - } - - /* - * push it on the stack - */ - xmlRelaxNGIncludePush(ctxt, ret); - - /* - * Some preprocessing of the document content, this include recursing - * in the include stack. - */ -#ifdef DEBUG_INCLUDE - xmlGenericError(xmlGenericErrorContext, "cleanup of %s\n", URL); -#endif - - doc = xmlRelaxNGCleanupDoc(ctxt, doc); - if (doc == NULL) { - ctxt->inc = NULL; - return (NULL); - } - - /* - * Pop up the include from the stack - */ - xmlRelaxNGIncludePop(ctxt); - -#ifdef DEBUG_INCLUDE - xmlGenericError(xmlGenericErrorContext, "Checking of %s\n", URL); -#endif - /* - * Check that the top element is a grammar - */ - root = xmlDocGetRootElement(doc); - if (root == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, - "xmlRelaxNG: included document is empty %s\n", URL, - NULL); - return (NULL); - } - if (!IS_RELAXNG(root, "grammar")) { - xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING, - "xmlRelaxNG: included document %s root is not a grammar\n", - URL, NULL); - return (NULL); - } - - /* - * Elimination of redefined rules in the include. - */ - cur = node->children; - while (cur != NULL) { - if (IS_RELAXNG(cur, "start")) { - int found = 0; - - found = - xmlRelaxNGRemoveRedefine(ctxt, URL, root->children, NULL); - if (!found) { - xmlRngPErr(ctxt, node, XML_RNGP_START_MISSING, - "xmlRelaxNG: include %s has a start but not the included grammar\n", - URL, NULL); - } - } else if (IS_RELAXNG(cur, "define")) { - xmlChar *name; - - name = xmlGetProp(cur, BAD_CAST "name"); - if (name == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_NAME_MISSING, - "xmlRelaxNG: include %s has define without name\n", - URL, NULL); - } else { - int found; - - xmlRelaxNGNormExtSpace(name); - found = xmlRelaxNGRemoveRedefine(ctxt, URL, - root->children, name); - if (!found) { - xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_MISSING, - "xmlRelaxNG: include %s has a define %s but not the included grammar\n", - URL, name); - } - xmlFree(name); - } - } - cur = cur->next; - } - - - return (ret); -} - -/** - * xmlRelaxNGValidErrorPush: - * @ctxt: the validation context - * @err: the error code - * @arg1: the first string argument - * @arg2: the second string argument - * @dup: arg need to be duplicated - * - * Pushes a new error on top of the error stack - * - * Returns 0 in case of error, the index in the stack otherwise - */ -static int -xmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidErr err, const xmlChar * arg1, - const xmlChar * arg2, int dup) -{ - xmlRelaxNGValidErrorPtr cur; - -#ifdef DEBUG_ERROR - xmlGenericError(xmlGenericErrorContext, - "Pushing error %d at %d on stack\n", err, ctxt->errNr); -#endif - if (ctxt->errTab == NULL) { - ctxt->errMax = 8; - ctxt->errNr = 0; - ctxt->errTab = - (xmlRelaxNGValidErrorPtr) xmlMalloc(ctxt->errMax * - sizeof - (xmlRelaxNGValidError)); - if (ctxt->errTab == NULL) { - xmlRngVErrMemory(ctxt, "pushing error\n"); - return (0); - } - ctxt->err = NULL; - } - if (ctxt->errNr >= ctxt->errMax) { - ctxt->errMax *= 2; - ctxt->errTab = - (xmlRelaxNGValidErrorPtr) xmlRealloc(ctxt->errTab, - ctxt->errMax * - sizeof - (xmlRelaxNGValidError)); - if (ctxt->errTab == NULL) { - xmlRngVErrMemory(ctxt, "pushing error\n"); - return (0); - } - ctxt->err = &ctxt->errTab[ctxt->errNr - 1]; - } - if ((ctxt->err != NULL) && (ctxt->state != NULL) && - (ctxt->err->node == ctxt->state->node) && (ctxt->err->err == err)) - return (ctxt->errNr); - cur = &ctxt->errTab[ctxt->errNr]; - cur->err = err; - if (dup) { - cur->arg1 = xmlStrdup(arg1); - cur->arg2 = xmlStrdup(arg2); - cur->flags = ERROR_IS_DUP; - } else { - cur->arg1 = arg1; - cur->arg2 = arg2; - cur->flags = 0; - } - if (ctxt->state != NULL) { - cur->node = ctxt->state->node; - cur->seq = ctxt->state->seq; - } else { - cur->node = NULL; - cur->seq = NULL; - } - ctxt->err = cur; - return (ctxt->errNr++); -} - -/** - * xmlRelaxNGValidErrorPop: - * @ctxt: the validation context - * - * Pops the top error from the error stack - */ -static void -xmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt) -{ - xmlRelaxNGValidErrorPtr cur; - - if (ctxt->errNr <= 0) { - ctxt->err = NULL; - return; - } - ctxt->errNr--; - if (ctxt->errNr > 0) - ctxt->err = &ctxt->errTab[ctxt->errNr - 1]; - else - ctxt->err = NULL; - cur = &ctxt->errTab[ctxt->errNr]; - if (cur->flags & ERROR_IS_DUP) { - if (cur->arg1 != NULL) - xmlFree((xmlChar *) cur->arg1); - cur->arg1 = NULL; - if (cur->arg2 != NULL) - xmlFree((xmlChar *) cur->arg2); - cur->arg2 = NULL; - cur->flags = 0; - } -} - -/** - * xmlRelaxNGDocumentPush: - * @ctxt: the parser context - * @value: the element doc - * - * Pushes a new doc on top of the doc stack - * - * Returns 0 in case of error, the index in the stack otherwise - */ -static int -xmlRelaxNGDocumentPush(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDocumentPtr value) -{ - if (ctxt->docTab == NULL) { - ctxt->docMax = 4; - ctxt->docNr = 0; - ctxt->docTab = - (xmlRelaxNGDocumentPtr *) xmlMalloc(ctxt->docMax * - sizeof(ctxt->docTab[0])); - if (ctxt->docTab == NULL) { - xmlRngPErrMemory(ctxt, "adding document\n"); - return (0); - } - } - if (ctxt->docNr >= ctxt->docMax) { - ctxt->docMax *= 2; - ctxt->docTab = - (xmlRelaxNGDocumentPtr *) xmlRealloc(ctxt->docTab, - ctxt->docMax * - sizeof(ctxt->docTab[0])); - if (ctxt->docTab == NULL) { - xmlRngPErrMemory(ctxt, "adding document\n"); - return (0); - } - } - ctxt->docTab[ctxt->docNr] = value; - ctxt->doc = value; - return (ctxt->docNr++); -} - -/** - * xmlRelaxNGDocumentPop: - * @ctxt: the parser context - * - * Pops the top doc from the doc stack - * - * Returns the doc just removed - */ -static xmlRelaxNGDocumentPtr -xmlRelaxNGDocumentPop(xmlRelaxNGParserCtxtPtr ctxt) -{ - xmlRelaxNGDocumentPtr ret; - - if (ctxt->docNr <= 0) - return (NULL); - ctxt->docNr--; - if (ctxt->docNr > 0) - ctxt->doc = ctxt->docTab[ctxt->docNr - 1]; - else - ctxt->doc = NULL; - ret = ctxt->docTab[ctxt->docNr]; - ctxt->docTab[ctxt->docNr] = NULL; - return (ret); -} - -/** - * xmlRelaxNGLoadExternalRef: - * @ctxt: the parser context - * @URL: the normalized URL - * @ns: the inherited ns if any - * - * First lookup if the document is already loaded into the parser context, - * check against recursion. If not found the resource is loaded and - * the content is preprocessed before being returned back to the caller. - * - * Returns the xmlRelaxNGDocumentPtr or NULL in case of error - */ -static xmlRelaxNGDocumentPtr -xmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt, - const xmlChar * URL, const xmlChar * ns) -{ - xmlRelaxNGDocumentPtr ret = NULL; - xmlDocPtr doc; - xmlNodePtr root; - int i; - - /* - * check against recursion in the stack - */ - for (i = 0; i < ctxt->docNr; i++) { - if (xmlStrEqual(ctxt->docTab[i]->href, URL)) { - xmlRngPErr(ctxt, NULL, XML_RNGP_EXTERNALREF_RECURSE, - "Detected an externalRef recursion for %s\n", URL, - NULL); - return (NULL); - } - } - - /* - * load the document - */ - doc = xmlReadFile((const char *) URL,NULL,0); - if (doc == NULL) { - xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, - "xmlRelaxNG: could not load %s\n", URL, NULL); - return (NULL); - } - - /* - * Allocate the document structures and register it first. - */ - ret = (xmlRelaxNGDocumentPtr) xmlMalloc(sizeof(xmlRelaxNGDocument)); - if (ret == NULL) { - xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_ERR_NO_MEMORY, - "xmlRelaxNG: allocate memory for doc %s\n", URL, NULL); - xmlFreeDoc(doc); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGDocument)); - ret->doc = doc; - ret->href = xmlStrdup(URL); - ret->next = ctxt->documents; - ctxt->documents = ret; - - /* - * transmit the ns if needed - */ - if (ns != NULL) { - root = xmlDocGetRootElement(doc); - if (root != NULL) { - if (xmlHasProp(root, BAD_CAST "ns") == NULL) { - xmlSetProp(root, BAD_CAST "ns", ns); - } - } - } - - /* - * push it on the stack and register it in the hash table - */ - xmlRelaxNGDocumentPush(ctxt, ret); - - /* - * Some preprocessing of the document content - */ - doc = xmlRelaxNGCleanupDoc(ctxt, doc); - if (doc == NULL) { - ctxt->doc = NULL; - return (NULL); - } - - xmlRelaxNGDocumentPop(ctxt); - - return (ret); -} - -/************************************************************************ - * * - * Error functions * - * * - ************************************************************************/ - -#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0); -#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0); -#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0); -#define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1); -#define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1); - -static const char * -xmlRelaxNGDefName(xmlRelaxNGDefinePtr def) -{ - if (def == NULL) - return ("none"); - switch (def->type) { - case XML_RELAXNG_EMPTY: - return ("empty"); - case XML_RELAXNG_NOT_ALLOWED: - return ("notAllowed"); - case XML_RELAXNG_EXCEPT: - return ("except"); - case XML_RELAXNG_TEXT: - return ("text"); - case XML_RELAXNG_ELEMENT: - return ("element"); - case XML_RELAXNG_DATATYPE: - return ("datatype"); - case XML_RELAXNG_VALUE: - return ("value"); - case XML_RELAXNG_LIST: - return ("list"); - case XML_RELAXNG_ATTRIBUTE: - return ("attribute"); - case XML_RELAXNG_DEF: - return ("def"); - case XML_RELAXNG_REF: - return ("ref"); - case XML_RELAXNG_EXTERNALREF: - return ("externalRef"); - case XML_RELAXNG_PARENTREF: - return ("parentRef"); - case XML_RELAXNG_OPTIONAL: - return ("optional"); - case XML_RELAXNG_ZEROORMORE: - return ("zeroOrMore"); - case XML_RELAXNG_ONEORMORE: - return ("oneOrMore"); - case XML_RELAXNG_CHOICE: - return ("choice"); - case XML_RELAXNG_GROUP: - return ("group"); - case XML_RELAXNG_INTERLEAVE: - return ("interleave"); - case XML_RELAXNG_START: - return ("start"); - case XML_RELAXNG_NOOP: - return ("noop"); - case XML_RELAXNG_PARAM: - return ("param"); - } - return ("unknown"); -} - -/** - * xmlRelaxNGGetErrorString: - * @err: the error code - * @arg1: the first string argument - * @arg2: the second string argument - * - * computes a formatted error string for the given error code and args - * - * Returns the error string, it must be deallocated by the caller - */ -static xmlChar * -xmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar * arg1, - const xmlChar * arg2) -{ - char msg[1000]; - - if (arg1 == NULL) - arg1 = BAD_CAST ""; - if (arg2 == NULL) - arg2 = BAD_CAST ""; - - msg[0] = 0; - switch (err) { - case XML_RELAXNG_OK: - return (NULL); - case XML_RELAXNG_ERR_MEMORY: - return (xmlCharStrdup("out of memory\n")); - case XML_RELAXNG_ERR_TYPE: - snprintf(msg, 1000, "failed to validate type %s\n", arg1); - break; - case XML_RELAXNG_ERR_TYPEVAL: - snprintf(msg, 1000, "Type %s doesn't allow value '%s'\n", arg1, - arg2); - break; - case XML_RELAXNG_ERR_DUPID: - snprintf(msg, 1000, "ID %s redefined\n", arg1); - break; - case XML_RELAXNG_ERR_TYPECMP: - snprintf(msg, 1000, "failed to compare type %s\n", arg1); - break; - case XML_RELAXNG_ERR_NOSTATE: - return (xmlCharStrdup("Internal error: no state\n")); - case XML_RELAXNG_ERR_NODEFINE: - return (xmlCharStrdup("Internal error: no define\n")); - case XML_RELAXNG_ERR_INTERNAL: - snprintf(msg, 1000, "Internal error: %s\n", arg1); - break; - case XML_RELAXNG_ERR_LISTEXTRA: - snprintf(msg, 1000, "Extra data in list: %s\n", arg1); - break; - case XML_RELAXNG_ERR_INTERNODATA: - return (xmlCharStrdup - ("Internal: interleave block has no data\n")); - case XML_RELAXNG_ERR_INTERSEQ: - return (xmlCharStrdup("Invalid sequence in interleave\n")); - case XML_RELAXNG_ERR_INTEREXTRA: - snprintf(msg, 1000, "Extra element %s in interleave\n", arg1); - break; - case XML_RELAXNG_ERR_ELEMNAME: - snprintf(msg, 1000, "Expecting element %s, got %s\n", arg1, - arg2); - break; - case XML_RELAXNG_ERR_ELEMNONS: - snprintf(msg, 1000, "Expecting a namespace for element %s\n", - arg1); - break; - case XML_RELAXNG_ERR_ELEMWRONGNS: - snprintf(msg, 1000, - "Element %s has wrong namespace: expecting %s\n", arg1, - arg2); - break; - case XML_RELAXNG_ERR_ELEMWRONG: - snprintf(msg, 1000, "Did not expect element %s there\n", arg1); - break; - case XML_RELAXNG_ERR_TEXTWRONG: - snprintf(msg, 1000, - "Did not expect text in element %s content\n", arg1); - break; - case XML_RELAXNG_ERR_ELEMEXTRANS: - snprintf(msg, 1000, "Expecting no namespace for element %s\n", - arg1); - break; - case XML_RELAXNG_ERR_ELEMNOTEMPTY: - snprintf(msg, 1000, "Expecting element %s to be empty\n", arg1); - break; - case XML_RELAXNG_ERR_NOELEM: - snprintf(msg, 1000, "Expecting an element %s, got nothing\n", - arg1); - break; - case XML_RELAXNG_ERR_NOTELEM: - return (xmlCharStrdup("Expecting an element got text\n")); - case XML_RELAXNG_ERR_ATTRVALID: - snprintf(msg, 1000, "Element %s failed to validate attributes\n", - arg1); - break; - case XML_RELAXNG_ERR_CONTENTVALID: - snprintf(msg, 1000, "Element %s failed to validate content\n", - arg1); - break; - case XML_RELAXNG_ERR_EXTRACONTENT: - snprintf(msg, 1000, "Element %s has extra content: %s\n", - arg1, arg2); - break; - case XML_RELAXNG_ERR_INVALIDATTR: - snprintf(msg, 1000, "Invalid attribute %s for element %s\n", - arg1, arg2); - break; - case XML_RELAXNG_ERR_LACKDATA: - snprintf(msg, 1000, "Datatype element %s contains no data\n", - arg1); - break; - case XML_RELAXNG_ERR_DATAELEM: - snprintf(msg, 1000, "Datatype element %s has child elements\n", - arg1); - break; - case XML_RELAXNG_ERR_VALELEM: - snprintf(msg, 1000, "Value element %s has child elements\n", - arg1); - break; - case XML_RELAXNG_ERR_LISTELEM: - snprintf(msg, 1000, "List element %s has child elements\n", - arg1); - break; - case XML_RELAXNG_ERR_DATATYPE: - snprintf(msg, 1000, "Error validating datatype %s\n", arg1); - break; - case XML_RELAXNG_ERR_VALUE: - snprintf(msg, 1000, "Error validating value %s\n", arg1); - break; - case XML_RELAXNG_ERR_LIST: - return (xmlCharStrdup("Error validating list\n")); - case XML_RELAXNG_ERR_NOGRAMMAR: - return (xmlCharStrdup("No top grammar defined\n")); - case XML_RELAXNG_ERR_EXTRADATA: - return (xmlCharStrdup("Extra data in the document\n")); - default: - return (xmlCharStrdup("Unknown error !\n")); - } - if (msg[0] == 0) { - snprintf(msg, 1000, "Unknown error code %d\n", err); - } - msg[1000 - 1] = 0; - return (xmlStrdup((xmlChar *) msg)); -} - -/** - * xmlRelaxNGShowValidError: - * @ctxt: the validation context - * @err: the error number - * @node: the node - * @child: the node child generating the problem. - * @arg1: the first argument - * @arg2: the second argument - * - * Show a validation error. - */ -static void -xmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidErr err, xmlNodePtr node, - xmlNodePtr child, const xmlChar * arg1, - const xmlChar * arg2) -{ - xmlChar *msg; - - if (ctxt->flags & FLAGS_NOERROR) - return; - -#ifdef DEBUG_ERROR - xmlGenericError(xmlGenericErrorContext, "Show error %d\n", err); -#endif - msg = xmlRelaxNGGetErrorString(err, arg1, arg2); - if (msg == NULL) - return; - - if (ctxt->errNo == XML_RELAXNG_OK) - ctxt->errNo = err; - xmlRngVErr(ctxt, (child == NULL ? node : child), err, - (const char *) msg, arg1, arg2); - xmlFree(msg); -} - -/** - * xmlRelaxNGPopErrors: - * @ctxt: the validation context - * @level: the error level in the stack - * - * pop and discard all errors until the given level is reached - */ -static void -xmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level) -{ - int i; - xmlRelaxNGValidErrorPtr err; - -#ifdef DEBUG_ERROR - xmlGenericError(xmlGenericErrorContext, - "Pop errors till level %d\n", level); -#endif - for (i = level; i < ctxt->errNr; i++) { - err = &ctxt->errTab[i]; - if (err->flags & ERROR_IS_DUP) { - if (err->arg1 != NULL) - xmlFree((xmlChar *) err->arg1); - err->arg1 = NULL; - if (err->arg2 != NULL) - xmlFree((xmlChar *) err->arg2); - err->arg2 = NULL; - err->flags = 0; - } - } - ctxt->errNr = level; - if (ctxt->errNr <= 0) - ctxt->err = NULL; -} - -/** - * xmlRelaxNGDumpValidError: - * @ctxt: the validation context - * - * Show all validation error over a given index. - */ -static void -xmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt) -{ - int i, j, k; - xmlRelaxNGValidErrorPtr err, dup; - -#ifdef DEBUG_ERROR - xmlGenericError(xmlGenericErrorContext, - "Dumping error stack %d errors\n", ctxt->errNr); -#endif - for (i = 0, k = 0; i < ctxt->errNr; i++) { - err = &ctxt->errTab[i]; - if (k < MAX_ERROR) { - for (j = 0; j < i; j++) { - dup = &ctxt->errTab[j]; - if ((err->err == dup->err) && (err->node == dup->node) && - (xmlStrEqual(err->arg1, dup->arg1)) && - (xmlStrEqual(err->arg2, dup->arg2))) { - goto skip; - } - } - xmlRelaxNGShowValidError(ctxt, err->err, err->node, err->seq, - err->arg1, err->arg2); - k++; - } - skip: - if (err->flags & ERROR_IS_DUP) { - if (err->arg1 != NULL) - xmlFree((xmlChar *) err->arg1); - err->arg1 = NULL; - if (err->arg2 != NULL) - xmlFree((xmlChar *) err->arg2); - err->arg2 = NULL; - err->flags = 0; - } - } - ctxt->errNr = 0; -} - -/** - * xmlRelaxNGAddValidError: - * @ctxt: the validation context - * @err: the error number - * @arg1: the first argument - * @arg2: the second argument - * @dup: need to dup the args - * - * Register a validation error, either generating it if it's sure - * or stacking it for later handling if unsure. - */ -static void -xmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidErr err, const xmlChar * arg1, - const xmlChar * arg2, int dup) -{ - if (ctxt == NULL) - return; - if (ctxt->flags & FLAGS_NOERROR) - return; - -#ifdef DEBUG_ERROR - xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err); -#endif - /* - * generate the error directly - */ - if (((ctxt->flags & FLAGS_IGNORABLE) == 0) || - (ctxt->flags & FLAGS_NEGATIVE)) { - xmlNodePtr node, seq; - - /* - * Flush first any stacked error which might be the - * real cause of the problem. - */ - if (ctxt->errNr != 0) - xmlRelaxNGDumpValidError(ctxt); - if (ctxt->state != NULL) { - node = ctxt->state->node; - seq = ctxt->state->seq; - } else { - node = seq = NULL; - } - xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2); - } - /* - * Stack the error for later processing if needed - */ - else { - xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup); - } -} - - -/************************************************************************ - * * - * Type library hooks * - * * - ************************************************************************/ -static xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, - const xmlChar * str); - -/** - * xmlRelaxNGSchemaTypeHave: - * @data: data needed for the library - * @type: the type name - * - * Check if the given type is provided by - * the W3C XMLSchema Datatype library. - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -static int -xmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED, const xmlChar * type) -{ - xmlSchemaTypePtr typ; - - if (type == NULL) - return (-1); - typ = xmlSchemaGetPredefinedType(type, - BAD_CAST - "http://www.w3.org/2001/XMLSchema"); - if (typ == NULL) - return (0); - return (1); -} - -/** - * xmlRelaxNGSchemaTypeCheck: - * @data: data needed for the library - * @type: the type name - * @value: the value to check - * @node: the node - * - * Check if the given type and value are validated by - * the W3C XMLSchema Datatype library. - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -static int -xmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED, - const xmlChar * type, - const xmlChar * value, - void **result, xmlNodePtr node) -{ - xmlSchemaTypePtr typ; - int ret; - - if ((type == NULL) || (value == NULL)) - return (-1); - typ = xmlSchemaGetPredefinedType(type, - BAD_CAST - "http://www.w3.org/2001/XMLSchema"); - if (typ == NULL) - return (-1); - ret = xmlSchemaValPredefTypeNode(typ, value, - (xmlSchemaValPtr *) result, node); - if (ret == 2) /* special ID error code */ - return (2); - if (ret == 0) - return (1); - if (ret > 0) - return (0); - return (-1); -} - -/** - * xmlRelaxNGSchemaFacetCheck: - * @data: data needed for the library - * @type: the type name - * @facet: the facet name - * @val: the facet value - * @strval: the string value - * @value: the value to check - * - * Function provided by a type library to check a value facet - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -static int -xmlRelaxNGSchemaFacetCheck(void *data ATTRIBUTE_UNUSED, - const xmlChar * type, const xmlChar * facetname, - const xmlChar * val, const xmlChar * strval, - void *value) -{ - xmlSchemaFacetPtr facet; - xmlSchemaTypePtr typ; - int ret; - - if ((type == NULL) || (strval == NULL)) - return (-1); - typ = xmlSchemaGetPredefinedType(type, - BAD_CAST - "http://www.w3.org/2001/XMLSchema"); - if (typ == NULL) - return (-1); - - facet = xmlSchemaNewFacet(); - if (facet == NULL) - return (-1); - - if (xmlStrEqual(facetname, BAD_CAST "minInclusive")) { - facet->type = XML_SCHEMA_FACET_MININCLUSIVE; - } else if (xmlStrEqual(facetname, BAD_CAST "minExclusive")) { - facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE; - } else if (xmlStrEqual(facetname, BAD_CAST "maxInclusive")) { - facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE; - } else if (xmlStrEqual(facetname, BAD_CAST "maxExclusive")) { - facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE; - } else if (xmlStrEqual(facetname, BAD_CAST "totalDigits")) { - facet->type = XML_SCHEMA_FACET_TOTALDIGITS; - } else if (xmlStrEqual(facetname, BAD_CAST "fractionDigits")) { - facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS; - } else if (xmlStrEqual(facetname, BAD_CAST "pattern")) { - facet->type = XML_SCHEMA_FACET_PATTERN; - } else if (xmlStrEqual(facetname, BAD_CAST "enumeration")) { - facet->type = XML_SCHEMA_FACET_ENUMERATION; - } else if (xmlStrEqual(facetname, BAD_CAST "whiteSpace")) { - facet->type = XML_SCHEMA_FACET_WHITESPACE; - } else if (xmlStrEqual(facetname, BAD_CAST "length")) { - facet->type = XML_SCHEMA_FACET_LENGTH; - } else if (xmlStrEqual(facetname, BAD_CAST "maxLength")) { - facet->type = XML_SCHEMA_FACET_MAXLENGTH; - } else if (xmlStrEqual(facetname, BAD_CAST "minLength")) { - facet->type = XML_SCHEMA_FACET_MINLENGTH; - } else { - xmlSchemaFreeFacet(facet); - return (-1); - } - facet->value = val; - ret = xmlSchemaCheckFacet(facet, typ, NULL, type); - if (ret != 0) { - xmlSchemaFreeFacet(facet); - return (-1); - } - ret = xmlSchemaValidateFacet(typ, facet, strval, value); - xmlSchemaFreeFacet(facet); - if (ret != 0) - return (-1); - return (0); -} - -/** - * xmlRelaxNGSchemaFreeValue: - * @data: data needed for the library - * @value: the value to free - * - * Function provided by a type library to free a Schemas value - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -static void -xmlRelaxNGSchemaFreeValue(void *data ATTRIBUTE_UNUSED, void *value) -{ - xmlSchemaFreeValue(value); -} - -/** - * xmlRelaxNGSchemaTypeCompare: - * @data: data needed for the library - * @type: the type name - * @value1: the first value - * @value2: the second value - * - * Compare two values for equality accordingly a type from the W3C XMLSchema - * Datatype library. - * - * Returns 1 if equal, 0 if no and -1 in case of error. - */ -static int -xmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED, - const xmlChar * type, - const xmlChar * value1, - xmlNodePtr ctxt1, - void *comp1, - const xmlChar * value2, xmlNodePtr ctxt2) -{ - int ret; - xmlSchemaTypePtr typ; - xmlSchemaValPtr res1 = NULL, res2 = NULL; - - if ((type == NULL) || (value1 == NULL) || (value2 == NULL)) - return (-1); - typ = xmlSchemaGetPredefinedType(type, - BAD_CAST - "http://www.w3.org/2001/XMLSchema"); - if (typ == NULL) - return (-1); - if (comp1 == NULL) { - ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1); - if (ret != 0) - return (-1); - if (res1 == NULL) - return (-1); - } else { - res1 = (xmlSchemaValPtr) comp1; - } - ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2); - if (ret != 0) { - if ((comp1 == NULL) && (res1 != NULL)) - xmlSchemaFreeValue(res1); - return (-1); - } - if (res1 == NULL) { - return (-1); - } - ret = xmlSchemaCompareValues(res1, res2); - if (res1 != (xmlSchemaValPtr) comp1) - xmlSchemaFreeValue(res1); - xmlSchemaFreeValue(res2); - if (ret == -2) - return (-1); - if (ret == 0) - return (1); - return (0); -} - -/** - * xmlRelaxNGDefaultTypeHave: - * @data: data needed for the library - * @type: the type name - * - * Check if the given type is provided by - * the default datatype library. - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -static int -xmlRelaxNGDefaultTypeHave(void *data ATTRIBUTE_UNUSED, - const xmlChar * type) -{ - if (type == NULL) - return (-1); - if (xmlStrEqual(type, BAD_CAST "string")) - return (1); - if (xmlStrEqual(type, BAD_CAST "token")) - return (1); - return (0); -} - -/** - * xmlRelaxNGDefaultTypeCheck: - * @data: data needed for the library - * @type: the type name - * @value: the value to check - * @node: the node - * - * Check if the given type and value are validated by - * the default datatype library. - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -static int -xmlRelaxNGDefaultTypeCheck(void *data ATTRIBUTE_UNUSED, - const xmlChar * type ATTRIBUTE_UNUSED, - const xmlChar * value ATTRIBUTE_UNUSED, - void **result ATTRIBUTE_UNUSED, - xmlNodePtr node ATTRIBUTE_UNUSED) -{ - if (value == NULL) - return (-1); - if (xmlStrEqual(type, BAD_CAST "string")) - return (1); - if (xmlStrEqual(type, BAD_CAST "token")) { - return (1); - } - - return (0); -} - -/** - * xmlRelaxNGDefaultTypeCompare: - * @data: data needed for the library - * @type: the type name - * @value1: the first value - * @value2: the second value - * - * Compare two values accordingly a type from the default - * datatype library. - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -static int -xmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED, - const xmlChar * type, - const xmlChar * value1, - xmlNodePtr ctxt1 ATTRIBUTE_UNUSED, - void *comp1 ATTRIBUTE_UNUSED, - const xmlChar * value2, - xmlNodePtr ctxt2 ATTRIBUTE_UNUSED) -{ - int ret = -1; - - if (xmlStrEqual(type, BAD_CAST "string")) { - ret = xmlStrEqual(value1, value2); - } else if (xmlStrEqual(type, BAD_CAST "token")) { - if (!xmlStrEqual(value1, value2)) { - xmlChar *nval, *nvalue; - - /* - * TODO: trivial optimizations are possible by - * computing at compile-time - */ - nval = xmlRelaxNGNormalize(NULL, value1); - nvalue = xmlRelaxNGNormalize(NULL, value2); - - if ((nval == NULL) || (nvalue == NULL)) - ret = -1; - else if (xmlStrEqual(nval, nvalue)) - ret = 1; - else - ret = 0; - if (nval != NULL) - xmlFree(nval); - if (nvalue != NULL) - xmlFree(nvalue); - } else - ret = 1; - } - return (ret); -} - -static int xmlRelaxNGTypeInitialized = 0; -static xmlHashTablePtr xmlRelaxNGRegisteredTypes = NULL; - -/** - * xmlRelaxNGFreeTypeLibrary: - * @lib: the type library structure - * @namespace: the URI bound to the library - * - * Free the structure associated to the type library - */ -static void -xmlRelaxNGFreeTypeLibrary(xmlRelaxNGTypeLibraryPtr lib, - const xmlChar * namespace ATTRIBUTE_UNUSED) -{ - if (lib == NULL) - return; - if (lib->namespace != NULL) - xmlFree((xmlChar *) lib->namespace); - xmlFree(lib); -} - -/** - * xmlRelaxNGRegisterTypeLibrary: - * @namespace: the URI bound to the library - * @data: data associated to the library - * @have: the provide function - * @check: the checking function - * @comp: the comparison function - * - * Register a new type library - * - * Returns 0 in case of success and -1 in case of error. - */ -static int -xmlRelaxNGRegisterTypeLibrary(const xmlChar * namespace, void *data, - xmlRelaxNGTypeHave have, - xmlRelaxNGTypeCheck check, - xmlRelaxNGTypeCompare comp, - xmlRelaxNGFacetCheck facet, - xmlRelaxNGTypeFree freef) -{ - xmlRelaxNGTypeLibraryPtr lib; - int ret; - - if ((xmlRelaxNGRegisteredTypes == NULL) || (namespace == NULL) || - (check == NULL) || (comp == NULL)) - return (-1); - if (xmlHashLookup(xmlRelaxNGRegisteredTypes, namespace) != NULL) { - xmlGenericError(xmlGenericErrorContext, - "Relax-NG types library '%s' already registered\n", - namespace); - return (-1); - } - lib = - (xmlRelaxNGTypeLibraryPtr) - xmlMalloc(sizeof(xmlRelaxNGTypeLibrary)); - if (lib == NULL) { - xmlRngVErrMemory(NULL, "adding types library\n"); - return (-1); - } - memset(lib, 0, sizeof(xmlRelaxNGTypeLibrary)); - lib->namespace = xmlStrdup(namespace); - lib->data = data; - lib->have = have; - lib->comp = comp; - lib->check = check; - lib->facet = facet; - lib->freef = freef; - ret = xmlHashAddEntry(xmlRelaxNGRegisteredTypes, namespace, lib); - if (ret < 0) { - xmlGenericError(xmlGenericErrorContext, - "Relax-NG types library failed to register '%s'\n", - namespace); - xmlRelaxNGFreeTypeLibrary(lib, namespace); - return (-1); - } - return (0); -} - -/** - * xmlRelaxNGInitTypes: - * - * Initilize the default type libraries. - * - * Returns 0 in case of success and -1 in case of error. - */ -int -xmlRelaxNGInitTypes(void) -{ - if (xmlRelaxNGTypeInitialized != 0) - return (0); - xmlRelaxNGRegisteredTypes = xmlHashCreate(10); - if (xmlRelaxNGRegisteredTypes == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Failed to allocate sh table for Relax-NG types\n"); - return (-1); - } - xmlRelaxNGRegisterTypeLibrary(BAD_CAST - "http://www.w3.org/2001/XMLSchema-datatypes", - NULL, xmlRelaxNGSchemaTypeHave, - xmlRelaxNGSchemaTypeCheck, - xmlRelaxNGSchemaTypeCompare, - xmlRelaxNGSchemaFacetCheck, - xmlRelaxNGSchemaFreeValue); - xmlRelaxNGRegisterTypeLibrary(xmlRelaxNGNs, NULL, - xmlRelaxNGDefaultTypeHave, - xmlRelaxNGDefaultTypeCheck, - xmlRelaxNGDefaultTypeCompare, NULL, - NULL); - xmlRelaxNGTypeInitialized = 1; - return (0); -} - -/** - * xmlRelaxNGCleanupTypes: - * - * Cleanup the default Schemas type library associated to RelaxNG - */ -void -xmlRelaxNGCleanupTypes(void) -{ - xmlSchemaCleanupTypes(); - if (xmlRelaxNGTypeInitialized == 0) - return; - xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator) - xmlRelaxNGFreeTypeLibrary); - xmlRelaxNGTypeInitialized = 0; -} - -/************************************************************************ - * * - * Compiling element content into regexp * - * * - * Sometime the element content can be compiled into a pure regexp, * - * This allows a faster execution and streamability at that level * - * * - ************************************************************************/ - -static int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDefinePtr def); - -/** - * xmlRelaxNGIsCompileable: - * @define: the definition to check - * - * Check if a definition is nullable. - * - * Returns 1 if yes, 0 if no and -1 in case of error - */ -static int -xmlRelaxNGIsCompileable(xmlRelaxNGDefinePtr def) -{ - int ret = -1; - - if (def == NULL) { - return (-1); - } - if ((def->type != XML_RELAXNG_ELEMENT) && - (def->dflags & IS_COMPILABLE)) - return (1); - if ((def->type != XML_RELAXNG_ELEMENT) && - (def->dflags & IS_NOT_COMPILABLE)) - return (0); - switch (def->type) { - case XML_RELAXNG_NOOP: - ret = xmlRelaxNGIsCompileable(def->content); - break; - case XML_RELAXNG_TEXT: - case XML_RELAXNG_EMPTY: - ret = 1; - break; - case XML_RELAXNG_ELEMENT: - /* - * Check if the element content is compileable - */ - if (((def->dflags & IS_NOT_COMPILABLE) == 0) && - ((def->dflags & IS_COMPILABLE) == 0)) { - xmlRelaxNGDefinePtr list; - - list = def->content; - while (list != NULL) { - ret = xmlRelaxNGIsCompileable(list); - if (ret != 1) - break; - list = list->next; - } - /* - * Because the routine is recursive, we must guard against - * discovering both COMPILABLE and NOT_COMPILABLE - */ - if (ret == 0) { - def->dflags &= ~IS_COMPILABLE; - def->dflags |= IS_NOT_COMPILABLE; - } - if ((ret == 1) && !(def->dflags &= IS_NOT_COMPILABLE)) - def->dflags |= IS_COMPILABLE; -#ifdef DEBUG_COMPILE - if (ret == 1) { - xmlGenericError(xmlGenericErrorContext, - "element content for %s is compilable\n", - def->name); - } else if (ret == 0) { - xmlGenericError(xmlGenericErrorContext, - "element content for %s is not compilable\n", - def->name); - } else { - xmlGenericError(xmlGenericErrorContext, - "Problem in RelaxNGIsCompileable for element %s\n", - def->name); - } -#endif - } - /* - * All elements return a compileable status unless they - * are generic like anyName - */ - if ((def->nameClass != NULL) || (def->name == NULL)) - ret = 0; - else - ret = 1; - return (ret); - case XML_RELAXNG_REF: - case XML_RELAXNG_EXTERNALREF: - case XML_RELAXNG_PARENTREF: - if (def->depth == -20) { - return (1); - } else { - xmlRelaxNGDefinePtr list; - - def->depth = -20; - list = def->content; - while (list != NULL) { - ret = xmlRelaxNGIsCompileable(list); - if (ret != 1) - break; - list = list->next; - } - } - break; - case XML_RELAXNG_START: - case XML_RELAXNG_OPTIONAL: - case XML_RELAXNG_ZEROORMORE: - case XML_RELAXNG_ONEORMORE: - case XML_RELAXNG_CHOICE: - case XML_RELAXNG_GROUP: - case XML_RELAXNG_DEF:{ - xmlRelaxNGDefinePtr list; - - list = def->content; - while (list != NULL) { - ret = xmlRelaxNGIsCompileable(list); - if (ret != 1) - break; - list = list->next; - } - break; - } - case XML_RELAXNG_EXCEPT: - case XML_RELAXNG_ATTRIBUTE: - case XML_RELAXNG_INTERLEAVE: - case XML_RELAXNG_DATATYPE: - case XML_RELAXNG_LIST: - case XML_RELAXNG_PARAM: - case XML_RELAXNG_VALUE: - case XML_RELAXNG_NOT_ALLOWED: - ret = 0; - break; - } - if (ret == 0) - def->dflags |= IS_NOT_COMPILABLE; - if (ret == 1) - def->dflags |= IS_COMPILABLE; -#ifdef DEBUG_COMPILE - if (ret == 1) { - xmlGenericError(xmlGenericErrorContext, - "RelaxNGIsCompileable %s : true\n", - xmlRelaxNGDefName(def)); - } else if (ret == 0) { - xmlGenericError(xmlGenericErrorContext, - "RelaxNGIsCompileable %s : false\n", - xmlRelaxNGDefName(def)); - } else { - xmlGenericError(xmlGenericErrorContext, - "Problem in RelaxNGIsCompileable %s\n", - xmlRelaxNGDefName(def)); - } -#endif - return (ret); -} - -/** - * xmlRelaxNGCompile: - * ctxt: the RelaxNG parser context - * @define: the definition tree to compile - * - * Compile the set of definitions, it works recursively, till the - * element boundaries, where it tries to compile the content if possible - * - * Returns 0 if success and -1 in case of error - */ -static int -xmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) -{ - int ret = 0; - xmlRelaxNGDefinePtr list; - - if ((ctxt == NULL) || (def == NULL)) - return (-1); - - switch (def->type) { - case XML_RELAXNG_START: - if ((xmlRelaxNGIsCompileable(def) == 1) && (def->depth != -25)) { - xmlAutomataPtr oldam = ctxt->am; - xmlAutomataStatePtr oldstate = ctxt->state; - - def->depth = -25; - - list = def->content; - ctxt->am = xmlNewAutomata(); - if (ctxt->am == NULL) - return (-1); - ctxt->state = xmlAutomataGetInitState(ctxt->am); - while (list != NULL) { - xmlRelaxNGCompile(ctxt, list); - list = list->next; - } - xmlAutomataSetFinalState(ctxt->am, ctxt->state); - def->contModel = xmlAutomataCompile(ctxt->am); - xmlRegexpIsDeterminist(def->contModel); - - xmlFreeAutomata(ctxt->am); - ctxt->state = oldstate; - ctxt->am = oldam; - } - break; - case XML_RELAXNG_ELEMENT: - if ((ctxt->am != NULL) && (def->name != NULL)) { - ctxt->state = xmlAutomataNewTransition2(ctxt->am, - ctxt->state, NULL, - def->name, def->ns, - def); - } - if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) { - xmlAutomataPtr oldam = ctxt->am; - xmlAutomataStatePtr oldstate = ctxt->state; - - def->depth = -25; - - list = def->content; - ctxt->am = xmlNewAutomata(); - if (ctxt->am == NULL) - return (-1); - ctxt->state = xmlAutomataGetInitState(ctxt->am); - while (list != NULL) { - xmlRelaxNGCompile(ctxt, list); - list = list->next; - } - xmlAutomataSetFinalState(ctxt->am, ctxt->state); - def->contModel = xmlAutomataCompile(ctxt->am); - if (!xmlRegexpIsDeterminist(def->contModel)) { - /* - * we can only use the automata if it is determinist - */ - xmlRegFreeRegexp(def->contModel); - def->contModel = NULL; - } - xmlFreeAutomata(ctxt->am); - ctxt->state = oldstate; - ctxt->am = oldam; - } else { - xmlAutomataPtr oldam = ctxt->am; - - /* - * we can't build the content model for this element content - * but it still might be possible to build it for some of its - * children, recurse. - */ - ret = xmlRelaxNGTryCompile(ctxt, def); - ctxt->am = oldam; - } - break; - case XML_RELAXNG_NOOP: - ret = xmlRelaxNGCompile(ctxt, def->content); - break; - case XML_RELAXNG_OPTIONAL:{ - xmlAutomataStatePtr oldstate = ctxt->state; - - xmlRelaxNGCompile(ctxt, def->content); - xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); - break; - } - case XML_RELAXNG_ZEROORMORE:{ - xmlAutomataStatePtr oldstate; - - ctxt->state = - xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); - oldstate = ctxt->state; - list = def->content; - while (list != NULL) { - xmlRelaxNGCompile(ctxt, list); - list = list->next; - } - xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate); - ctxt->state = - xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); - break; - } - case XML_RELAXNG_ONEORMORE:{ - xmlAutomataStatePtr oldstate; - - list = def->content; - while (list != NULL) { - xmlRelaxNGCompile(ctxt, list); - list = list->next; - } - oldstate = ctxt->state; - list = def->content; - while (list != NULL) { - xmlRelaxNGCompile(ctxt, list); - list = list->next; - } - xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate); - ctxt->state = - xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); - break; - } - case XML_RELAXNG_CHOICE:{ - xmlAutomataStatePtr target = NULL; - xmlAutomataStatePtr oldstate = ctxt->state; - - list = def->content; - while (list != NULL) { - ctxt->state = oldstate; - ret = xmlRelaxNGCompile(ctxt, list); - if (ret != 0) - break; - if (target == NULL) - target = ctxt->state; - else { - xmlAutomataNewEpsilon(ctxt->am, ctxt->state, - target); - } - list = list->next; - } - ctxt->state = target; - - break; - } - case XML_RELAXNG_REF: - case XML_RELAXNG_EXTERNALREF: - case XML_RELAXNG_PARENTREF: - case XML_RELAXNG_GROUP: - case XML_RELAXNG_DEF: - list = def->content; - while (list != NULL) { - ret = xmlRelaxNGCompile(ctxt, list); - if (ret != 0) - break; - list = list->next; - } - break; - case XML_RELAXNG_TEXT:{ - xmlAutomataStatePtr oldstate; - - ctxt->state = - xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); - oldstate = ctxt->state; - xmlRelaxNGCompile(ctxt, def->content); - xmlAutomataNewTransition(ctxt->am, ctxt->state, - ctxt->state, BAD_CAST "#text", - NULL); - ctxt->state = - xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); - break; - } - case XML_RELAXNG_EMPTY: - ctxt->state = - xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); - break; - case XML_RELAXNG_EXCEPT: - case XML_RELAXNG_ATTRIBUTE: - case XML_RELAXNG_INTERLEAVE: - case XML_RELAXNG_NOT_ALLOWED: - case XML_RELAXNG_DATATYPE: - case XML_RELAXNG_LIST: - case XML_RELAXNG_PARAM: - case XML_RELAXNG_VALUE: - /* This should not happen and generate an internal error */ - fprintf(stderr, "RNG internal error trying to compile %s\n", - xmlRelaxNGDefName(def)); - break; - } - return (ret); -} - -/** - * xmlRelaxNGTryCompile: - * ctxt: the RelaxNG parser context - * @define: the definition tree to compile - * - * Try to compile the set of definitions, it works recursively, - * possibly ignoring parts which cannot be compiled. - * - * Returns 0 if success and -1 in case of error - */ -static int -xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) -{ - int ret = 0; - xmlRelaxNGDefinePtr list; - - if ((ctxt == NULL) || (def == NULL)) - return (-1); - - if ((def->type == XML_RELAXNG_START) || - (def->type == XML_RELAXNG_ELEMENT)) { - ret = xmlRelaxNGIsCompileable(def); - if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) { - ctxt->am = NULL; - ret = xmlRelaxNGCompile(ctxt, def); -#ifdef DEBUG_PROGRESSIVE - if (ret == 0) { - if (def->type == XML_RELAXNG_START) - xmlGenericError(xmlGenericErrorContext, - "compiled the start\n"); - else - xmlGenericError(xmlGenericErrorContext, - "compiled element %s\n", def->name); - } else { - if (def->type == XML_RELAXNG_START) - xmlGenericError(xmlGenericErrorContext, - "failed to compile the start\n"); - else - xmlGenericError(xmlGenericErrorContext, - "failed to compile element %s\n", - def->name); - } -#endif - return (ret); - } - } - switch (def->type) { - case XML_RELAXNG_NOOP: - ret = xmlRelaxNGTryCompile(ctxt, def->content); - break; - case XML_RELAXNG_TEXT: - case XML_RELAXNG_DATATYPE: - case XML_RELAXNG_LIST: - case XML_RELAXNG_PARAM: - case XML_RELAXNG_VALUE: - case XML_RELAXNG_EMPTY: - case XML_RELAXNG_ELEMENT: - ret = 0; - break; - case XML_RELAXNG_OPTIONAL: - case XML_RELAXNG_ZEROORMORE: - case XML_RELAXNG_ONEORMORE: - case XML_RELAXNG_CHOICE: - case XML_RELAXNG_GROUP: - case XML_RELAXNG_DEF: - case XML_RELAXNG_START: - case XML_RELAXNG_REF: - case XML_RELAXNG_EXTERNALREF: - case XML_RELAXNG_PARENTREF: - list = def->content; - while (list != NULL) { - ret = xmlRelaxNGTryCompile(ctxt, list); - if (ret != 0) - break; - list = list->next; - } - break; - case XML_RELAXNG_EXCEPT: - case XML_RELAXNG_ATTRIBUTE: - case XML_RELAXNG_INTERLEAVE: - case XML_RELAXNG_NOT_ALLOWED: - ret = 0; - break; - } - return (ret); -} - -/************************************************************************ - * * - * Parsing functions * - * * - ************************************************************************/ - -static xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr - ctxt, xmlNodePtr node); -static xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr - ctxt, xmlNodePtr node); -static xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr - ctxt, xmlNodePtr nodes, - int group); -static xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr - ctxt, xmlNodePtr node); -static xmlRelaxNGPtr xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, - xmlNodePtr node); -static int xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, - xmlNodePtr nodes); -static xmlRelaxNGDefinePtr xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr - ctxt, xmlNodePtr node, - xmlRelaxNGDefinePtr - def); -static xmlRelaxNGGrammarPtr xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr - ctxt, xmlNodePtr nodes); -static int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define, - xmlNodePtr elem); - - -#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content)) - -/** - * xmlRelaxNGIsNullable: - * @define: the definition to verify - * - * Check if a definition is nullable. - * - * Returns 1 if yes, 0 if no and -1 in case of error - */ -static int -xmlRelaxNGIsNullable(xmlRelaxNGDefinePtr define) -{ - int ret; - - if (define == NULL) - return (-1); - - if (define->dflags & IS_NULLABLE) - return (1); - if (define->dflags & IS_NOT_NULLABLE) - return (0); - switch (define->type) { - case XML_RELAXNG_EMPTY: - case XML_RELAXNG_TEXT: - ret = 1; - break; - case XML_RELAXNG_NOOP: - case XML_RELAXNG_DEF: - case XML_RELAXNG_REF: - case XML_RELAXNG_EXTERNALREF: - case XML_RELAXNG_PARENTREF: - case XML_RELAXNG_ONEORMORE: - ret = xmlRelaxNGIsNullable(define->content); - break; - case XML_RELAXNG_EXCEPT: - case XML_RELAXNG_NOT_ALLOWED: - case XML_RELAXNG_ELEMENT: - case XML_RELAXNG_DATATYPE: - case XML_RELAXNG_PARAM: - case XML_RELAXNG_VALUE: - case XML_RELAXNG_LIST: - case XML_RELAXNG_ATTRIBUTE: - ret = 0; - break; - case XML_RELAXNG_CHOICE:{ - xmlRelaxNGDefinePtr list = define->content; - - while (list != NULL) { - ret = xmlRelaxNGIsNullable(list); - if (ret != 0) - goto done; - list = list->next; - } - ret = 0; - break; - } - case XML_RELAXNG_START: - case XML_RELAXNG_INTERLEAVE: - case XML_RELAXNG_GROUP:{ - xmlRelaxNGDefinePtr list = define->content; - - while (list != NULL) { - ret = xmlRelaxNGIsNullable(list); - if (ret != 1) - goto done; - list = list->next; - } - return (1); - } - default: - return (-1); - } - done: - if (ret == 0) - define->dflags |= IS_NOT_NULLABLE; - if (ret == 1) - define->dflags |= IS_NULLABLE; - return (ret); -} - -/** - * xmlRelaxNGIsBlank: - * @str: a string - * - * Check if a string is ignorable c.f. 4.2. Whitespace - * - * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise - */ -static int -xmlRelaxNGIsBlank(xmlChar * str) -{ - if (str == NULL) - return (1); - while (*str != 0) { - if (!(IS_BLANK_CH(*str))) - return (0); - str++; - } - return (1); -} - -/** - * xmlRelaxNGGetDataTypeLibrary: - * @ctxt: a Relax-NG parser context - * @node: the current data or value element - * - * Applies algorithm from 4.3. datatypeLibrary attribute - * - * Returns the datatypeLibary value or NULL if not found - */ -static xmlChar * -xmlRelaxNGGetDataTypeLibrary(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlNodePtr node) -{ - xmlChar *ret, *escape; - - if ((IS_RELAXNG(node, "data")) || (IS_RELAXNG(node, "value"))) { - ret = xmlGetProp(node, BAD_CAST "datatypeLibrary"); - if (ret != NULL) { - if (ret[0] == 0) { - xmlFree(ret); - return (NULL); - } - escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?"); - if (escape == NULL) { - return (ret); - } - xmlFree(ret); - return (escape); - } - } - node = node->parent; - while ((node != NULL) && (node->type == XML_ELEMENT_NODE)) { - ret = xmlGetProp(node, BAD_CAST "datatypeLibrary"); - if (ret != NULL) { - if (ret[0] == 0) { - xmlFree(ret); - return (NULL); - } - escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?"); - if (escape == NULL) { - return (ret); - } - xmlFree(ret); - return (escape); - } - node = node->parent; - } - return (NULL); -} - -/** - * xmlRelaxNGParseValue: - * @ctxt: a Relax-NG parser context - * @node: the data node. - * - * parse the content of a RelaxNG value node. - * - * Returns the definition pointer or NULL in case of error - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGDefinePtr def = NULL; - xmlRelaxNGTypeLibraryPtr lib = NULL; - xmlChar *type; - xmlChar *library; - int success = 0; - - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_VALUE; - - type = xmlGetProp(node, BAD_CAST "type"); - if (type != NULL) { - xmlRelaxNGNormExtSpace(type); - if (xmlValidateNCName(type, 0)) { - xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE, - "value type '%s' is not an NCName\n", type, NULL); - } - library = xmlRelaxNGGetDataTypeLibrary(ctxt, node); - if (library == NULL) - library = - xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0"); - - def->name = type; - def->ns = library; - - lib = (xmlRelaxNGTypeLibraryPtr) - xmlHashLookup(xmlRelaxNGRegisteredTypes, library); - if (lib == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB, - "Use of unregistered type library '%s'\n", library, - NULL); - def->data = NULL; - } else { - def->data = lib; - if (lib->have == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB, - "Internal error with type library '%s': no 'have'\n", - library, NULL); - } else { - success = lib->have(lib->data, def->name); - if (success != 1) { - xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND, - "Error type '%s' is not exported by type library '%s'\n", - def->name, library); - } - } - } - } - if (node->children == NULL) { - def->value = xmlStrdup(BAD_CAST ""); - } else if (((node->children->type != XML_TEXT_NODE) && - (node->children->type != XML_CDATA_SECTION_NODE)) || - (node->children->next != NULL)) { - xmlRngPErr(ctxt, node, XML_RNGP_TEXT_EXPECTED, - "Expecting a single text value for <value>content\n", - NULL, NULL); - } else if (def != NULL) { - def->value = xmlNodeGetContent(node); - if (def->value == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_VALUE_NO_CONTENT, - "Element <value> has no content\n", NULL, NULL); - } else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) { - void *val = NULL; - - success = - lib->check(lib->data, def->name, def->value, &val, node); - if (success != 1) { - xmlRngPErr(ctxt, node, XML_RNGP_INVALID_VALUE, - "Value '%s' is not acceptable for type '%s'\n", - def->value, def->name); - } else { - if (val != NULL) - def->attrs = val; - } - } - } - return (def); -} - -/** - * xmlRelaxNGParseData: - * @ctxt: a Relax-NG parser context - * @node: the data node. - * - * parse the content of a RelaxNG data node. - * - * Returns the definition pointer or NULL in case of error - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGDefinePtr def = NULL, except; - xmlRelaxNGDefinePtr param, lastparam = NULL; - xmlRelaxNGTypeLibraryPtr lib; - xmlChar *type; - xmlChar *library; - xmlNodePtr content; - int tmp; - - type = xmlGetProp(node, BAD_CAST "type"); - if (type == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_TYPE_MISSING, "data has no type\n", NULL, - NULL); - return (NULL); - } - xmlRelaxNGNormExtSpace(type); - if (xmlValidateNCName(type, 0)) { - xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE, - "data type '%s' is not an NCName\n", type, NULL); - } - library = xmlRelaxNGGetDataTypeLibrary(ctxt, node); - if (library == NULL) - library = - xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0"); - - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) { - xmlFree(type); - return (NULL); - } - def->type = XML_RELAXNG_DATATYPE; - def->name = type; - def->ns = library; - - lib = (xmlRelaxNGTypeLibraryPtr) - xmlHashLookup(xmlRelaxNGRegisteredTypes, library); - if (lib == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB, - "Use of unregistered type library '%s'\n", library, - NULL); - def->data = NULL; - } else { - def->data = lib; - if (lib->have == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB, - "Internal error with type library '%s': no 'have'\n", - library, NULL); - } else { - tmp = lib->have(lib->data, def->name); - if (tmp != 1) { - xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND, - "Error type '%s' is not exported by type library '%s'\n", - def->name, library); - } else - if ((xmlStrEqual - (library, - BAD_CAST - "http://www.w3.org/2001/XMLSchema-datatypes")) - && ((xmlStrEqual(def->name, BAD_CAST "IDREF")) - || (xmlStrEqual(def->name, BAD_CAST "IDREFS")))) { - ctxt->idref = 1; - } - } - } - content = node->children; - - /* - * Handle optional params - */ - while (content != NULL) { - if (!xmlStrEqual(content->name, BAD_CAST "param")) - break; - if (xmlStrEqual(library, - BAD_CAST "http://relaxng.org/ns/structure/1.0")) { - xmlRngPErr(ctxt, node, XML_RNGP_PARAM_FORBIDDEN, - "Type library '%s' does not allow type parameters\n", - library, NULL); - content = content->next; - while ((content != NULL) && - (xmlStrEqual(content->name, BAD_CAST "param"))) - content = content->next; - } else { - param = xmlRelaxNGNewDefine(ctxt, node); - if (param != NULL) { - param->type = XML_RELAXNG_PARAM; - param->name = xmlGetProp(content, BAD_CAST "name"); - if (param->name == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_PARAM_NAME_MISSING, - "param has no name\n", NULL, NULL); - } - param->value = xmlNodeGetContent(content); - if (lastparam == NULL) { - def->attrs = lastparam = param; - } else { - lastparam->next = param; - lastparam = param; - } - if (lib != NULL) { - } - } - content = content->next; - } - } - /* - * Handle optional except - */ - if ((content != NULL) - && (xmlStrEqual(content->name, BAD_CAST "except"))) { - xmlNodePtr child; - xmlRelaxNGDefinePtr tmp2, last = NULL; - - except = xmlRelaxNGNewDefine(ctxt, node); - if (except == NULL) { - return (def); - } - except->type = XML_RELAXNG_EXCEPT; - child = content->children; - def->content = except; - if (child == NULL) { - xmlRngPErr(ctxt, content, XML_RNGP_EXCEPT_NO_CONTENT, - "except has no content\n", NULL, NULL); - } - while (child != NULL) { - tmp2 = xmlRelaxNGParsePattern(ctxt, child); - if (tmp2 != NULL) { - if (last == NULL) { - except->content = last = tmp2; - } else { - last->next = tmp2; - last = tmp2; - } - } - child = child->next; - } - content = content->next; - } - /* - * Check there is no unhandled data - */ - if (content != NULL) { - xmlRngPErr(ctxt, content, XML_RNGP_DATA_CONTENT, - "Element data has unexpected content %s\n", - content->name, NULL); - } - - return (def); -} - -static const xmlChar *invalidName = BAD_CAST "\1"; - -/** - * xmlRelaxNGCompareNameClasses: - * @defs1: the first element/attribute defs - * @defs2: the second element/attribute defs - * @name: the restriction on the name - * @ns: the restriction on the namespace - * - * Compare the 2 lists of element definitions. The comparison is - * that if both lists do not accept the same QNames, it returns 1 - * If the 2 lists can accept the same QName the comparison returns 0 - * - * Returns 1 disttinct, 0 if equal - */ -static int -xmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1, - xmlRelaxNGDefinePtr def2) -{ - int ret = 1; - xmlNode node; - xmlNs ns; - xmlRelaxNGValidCtxt ctxt; - - memset(&ctxt, 0, sizeof(xmlRelaxNGValidCtxt)); - - ctxt.flags = FLAGS_IGNORABLE | FLAGS_NOERROR; - - if ((def1->type == XML_RELAXNG_ELEMENT) || - (def1->type == XML_RELAXNG_ATTRIBUTE)) { - if (def2->type == XML_RELAXNG_TEXT) - return (1); - if (def1->name != NULL) { - node.name = def1->name; - } else { - node.name = invalidName; - } - if (def1->ns != NULL) { - if (def1->ns[0] == 0) { - node.ns = NULL; - } else { - node.ns = &ns; - ns.href = def1->ns; - } - } else { - node.ns = NULL; - } - if (xmlRelaxNGElementMatch(&ctxt, def2, &node)) { - if (def1->nameClass != NULL) { - ret = xmlRelaxNGCompareNameClasses(def1->nameClass, def2); - } else { - ret = 0; - } - } else { - ret = 1; - } - } else if (def1->type == XML_RELAXNG_TEXT) { - if (def2->type == XML_RELAXNG_TEXT) - return (0); - return (1); - } else if (def1->type == XML_RELAXNG_EXCEPT) { - TODO ret = 0; - } else { - TODO ret = 0; - } - if (ret == 0) - return (ret); - if ((def2->type == XML_RELAXNG_ELEMENT) || - (def2->type == XML_RELAXNG_ATTRIBUTE)) { - if (def2->name != NULL) { - node.name = def2->name; - } else { - node.name = invalidName; - } - node.ns = &ns; - if (def2->ns != NULL) { - if (def2->ns[0] == 0) { - node.ns = NULL; - } else { - ns.href = def2->ns; - } - } else { - ns.href = invalidName; - } - if (xmlRelaxNGElementMatch(&ctxt, def1, &node)) { - if (def2->nameClass != NULL) { - ret = xmlRelaxNGCompareNameClasses(def2->nameClass, def1); - } else { - ret = 0; - } - } else { - ret = 1; - } - } else { - TODO ret = 0; - } - - return (ret); -} - -/** - * xmlRelaxNGCompareElemDefLists: - * @ctxt: a Relax-NG parser context - * @defs1: the first list of element/attribute defs - * @defs2: the second list of element/attribute defs - * - * Compare the 2 lists of element or attribute definitions. The comparison - * is that if both lists do not accept the same QNames, it returns 1 - * If the 2 lists can accept the same QName the comparison returns 0 - * - * Returns 1 disttinct, 0 if equal - */ -static int -xmlRelaxNGCompareElemDefLists(xmlRelaxNGParserCtxtPtr ctxt - ATTRIBUTE_UNUSED, xmlRelaxNGDefinePtr * def1, - xmlRelaxNGDefinePtr * def2) -{ - xmlRelaxNGDefinePtr *basedef2 = def2; - - if ((def1 == NULL) || (def2 == NULL)) - return (1); - if ((*def1 == NULL) || (*def2 == NULL)) - return (1); - while (*def1 != NULL) { - while ((*def2) != NULL) { - if (xmlRelaxNGCompareNameClasses(*def1, *def2) == 0) - return (0); - def2++; - } - def2 = basedef2; - def1++; - } - return (1); -} - -/** - * xmlRelaxNGGenerateAttributes: - * @ctxt: a Relax-NG parser context - * @def: the definition definition - * - * Check if the definition can only generate attributes - * - * Returns 1 if yes, 0 if no and -1 in case of error. - */ -static int -xmlRelaxNGGenerateAttributes(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDefinePtr def) -{ - xmlRelaxNGDefinePtr parent, cur, tmp; - - /* - * Don't run that check in case of error. Infinite recursion - * becomes possible. - */ - if (ctxt->nbErrors != 0) - return (-1); - - parent = NULL; - cur = def; - while (cur != NULL) { - if ((cur->type == XML_RELAXNG_ELEMENT) || - (cur->type == XML_RELAXNG_TEXT) || - (cur->type == XML_RELAXNG_DATATYPE) || - (cur->type == XML_RELAXNG_PARAM) || - (cur->type == XML_RELAXNG_LIST) || - (cur->type == XML_RELAXNG_VALUE) || - (cur->type == XML_RELAXNG_EMPTY)) - return (0); - if ((cur->type == XML_RELAXNG_CHOICE) || - (cur->type == XML_RELAXNG_INTERLEAVE) || - (cur->type == XML_RELAXNG_GROUP) || - (cur->type == XML_RELAXNG_ONEORMORE) || - (cur->type == XML_RELAXNG_ZEROORMORE) || - (cur->type == XML_RELAXNG_OPTIONAL) || - (cur->type == XML_RELAXNG_PARENTREF) || - (cur->type == XML_RELAXNG_EXTERNALREF) || - (cur->type == XML_RELAXNG_REF) || - (cur->type == XML_RELAXNG_DEF)) { - if (cur->content != NULL) { - parent = cur; - cur = cur->content; - tmp = cur; - while (tmp != NULL) { - tmp->parent = parent; - tmp = tmp->next; - } - continue; - } - } - if (cur == def) - break; - if (cur->next != NULL) { - cur = cur->next; - continue; - } - do { - cur = cur->parent; - if (cur == NULL) - break; - if (cur == def) - return (1); - if (cur->next != NULL) { - cur = cur->next; - break; - } - } while (cur != NULL); - } - return (1); -} - -/** - * xmlRelaxNGGetElements: - * @ctxt: a Relax-NG parser context - * @def: the definition definition - * @eora: gather elements (0) or attributes (1) - * - * Compute the list of top elements a definition can generate - * - * Returns a list of elements or NULL if none was found. - */ -static xmlRelaxNGDefinePtr * -xmlRelaxNGGetElements(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDefinePtr def, int eora) -{ - xmlRelaxNGDefinePtr *ret = NULL, parent, cur, tmp; - int len = 0; - int max = 0; - - /* - * Don't run that check in case of error. Infinite recursion - * becomes possible. - */ - if (ctxt->nbErrors != 0) - return (NULL); - - parent = NULL; - cur = def; - while (cur != NULL) { - if (((eora == 0) && ((cur->type == XML_RELAXNG_ELEMENT) || - (cur->type == XML_RELAXNG_TEXT))) || - ((eora == 1) && (cur->type == XML_RELAXNG_ATTRIBUTE))) { - if (ret == NULL) { - max = 10; - ret = (xmlRelaxNGDefinePtr *) - xmlMalloc((max + 1) * sizeof(xmlRelaxNGDefinePtr)); - if (ret == NULL) { - xmlRngPErrMemory(ctxt, "getting element list\n"); - return (NULL); - } - } else if (max <= len) { - xmlRelaxNGDefinePtr *temp; - - max *= 2; - temp = xmlRealloc(ret, - (max + 1) * sizeof(xmlRelaxNGDefinePtr)); - if (temp == NULL) { - xmlRngPErrMemory(ctxt, "getting element list\n"); - xmlFree(ret); - return (NULL); - } - ret = temp; - } - ret[len++] = cur; - ret[len] = NULL; - } else if ((cur->type == XML_RELAXNG_CHOICE) || - (cur->type == XML_RELAXNG_INTERLEAVE) || - (cur->type == XML_RELAXNG_GROUP) || - (cur->type == XML_RELAXNG_ONEORMORE) || - (cur->type == XML_RELAXNG_ZEROORMORE) || - (cur->type == XML_RELAXNG_OPTIONAL) || - (cur->type == XML_RELAXNG_PARENTREF) || - (cur->type == XML_RELAXNG_REF) || - (cur->type == XML_RELAXNG_DEF) || - (cur->type == XML_RELAXNG_EXTERNALREF)) { - /* - * Don't go within elements or attributes or string values. - * Just gather the element top list - */ - if (cur->content != NULL) { - parent = cur; - cur = cur->content; - tmp = cur; - while (tmp != NULL) { - tmp->parent = parent; - tmp = tmp->next; - } - continue; - } - } - if (cur == def) - break; - if (cur->next != NULL) { - cur = cur->next; - continue; - } - do { - cur = cur->parent; - if (cur == NULL) - break; - if (cur == def) - return (ret); - if (cur->next != NULL) { - cur = cur->next; - break; - } - } while (cur != NULL); - } - return (ret); -} - -/** - * xmlRelaxNGCheckChoiceDeterminism: - * @ctxt: a Relax-NG parser context - * @def: the choice definition - * - * Also used to find indeterministic pattern in choice - */ -static void -xmlRelaxNGCheckChoiceDeterminism(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDefinePtr def) -{ - xmlRelaxNGDefinePtr **list; - xmlRelaxNGDefinePtr cur; - int nbchild = 0, i, j, ret; - int is_nullable = 0; - int is_indeterminist = 0; - xmlHashTablePtr triage = NULL; - int is_triable = 1; - - if ((def == NULL) || (def->type != XML_RELAXNG_CHOICE)) - return; - - if (def->dflags & IS_PROCESSED) - return; - - /* - * Don't run that check in case of error. Infinite recursion - * becomes possible. - */ - if (ctxt->nbErrors != 0) - return; - - is_nullable = xmlRelaxNGIsNullable(def); - - cur = def->content; - while (cur != NULL) { - nbchild++; - cur = cur->next; - } - - list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild * - sizeof(xmlRelaxNGDefinePtr - *)); - if (list == NULL) { - xmlRngPErrMemory(ctxt, "building choice\n"); - return; - } - i = 0; - /* - * a bit strong but safe - */ - if (is_nullable == 0) { - triage = xmlHashCreate(10); - } else { - is_triable = 0; - } - cur = def->content; - while (cur != NULL) { - list[i] = xmlRelaxNGGetElements(ctxt, cur, 0); - if ((list[i] == NULL) || (list[i][0] == NULL)) { - is_triable = 0; - } else if (is_triable == 1) { - xmlRelaxNGDefinePtr *tmp; - int res; - - tmp = list[i]; - while ((*tmp != NULL) && (is_triable == 1)) { - if ((*tmp)->type == XML_RELAXNG_TEXT) { - res = xmlHashAddEntry2(triage, - BAD_CAST "#text", NULL, - (void *) cur); - if (res != 0) - is_triable = -1; - } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && - ((*tmp)->name != NULL)) { - if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) - res = xmlHashAddEntry2(triage, - (*tmp)->name, NULL, - (void *) cur); - else - res = xmlHashAddEntry2(triage, - (*tmp)->name, (*tmp)->ns, - (void *) cur); - if (res != 0) - is_triable = -1; - } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { - if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) - res = xmlHashAddEntry2(triage, - BAD_CAST "#any", NULL, - (void *) cur); - else - res = xmlHashAddEntry2(triage, - BAD_CAST "#any", (*tmp)->ns, - (void *) cur); - if (res != 0) - is_triable = -1; - } else { - is_triable = -1; - } - tmp++; - } - } - i++; - cur = cur->next; - } - - for (i = 0; i < nbchild; i++) { - if (list[i] == NULL) - continue; - for (j = 0; j < i; j++) { - if (list[j] == NULL) - continue; - ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]); - if (ret == 0) { - is_indeterminist = 1; - } - } - } - for (i = 0; i < nbchild; i++) { - if (list[i] != NULL) - xmlFree(list[i]); - } - - xmlFree(list); - if (is_indeterminist) { - def->dflags |= IS_INDETERMINIST; - } - if (is_triable == 1) { - def->dflags |= IS_TRIABLE; - def->data = triage; - } else if (triage != NULL) { - xmlHashFree(triage, NULL); - } - def->dflags |= IS_PROCESSED; -} - -/** - * xmlRelaxNGCheckGroupAttrs: - * @ctxt: a Relax-NG parser context - * @def: the group definition - * - * Detects violations of rule 7.3 - */ -static void -xmlRelaxNGCheckGroupAttrs(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDefinePtr def) -{ - xmlRelaxNGDefinePtr **list; - xmlRelaxNGDefinePtr cur; - int nbchild = 0, i, j, ret; - - if ((def == NULL) || - ((def->type != XML_RELAXNG_GROUP) && - (def->type != XML_RELAXNG_ELEMENT))) - return; - - if (def->dflags & IS_PROCESSED) - return; - - /* - * Don't run that check in case of error. Infinite recursion - * becomes possible. - */ - if (ctxt->nbErrors != 0) - return; - - cur = def->attrs; - while (cur != NULL) { - nbchild++; - cur = cur->next; - } - cur = def->content; - while (cur != NULL) { - nbchild++; - cur = cur->next; - } - - list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild * - sizeof(xmlRelaxNGDefinePtr - *)); - if (list == NULL) { - xmlRngPErrMemory(ctxt, "building group\n"); - return; - } - i = 0; - cur = def->attrs; - while (cur != NULL) { - list[i] = xmlRelaxNGGetElements(ctxt, cur, 1); - i++; - cur = cur->next; - } - cur = def->content; - while (cur != NULL) { - list[i] = xmlRelaxNGGetElements(ctxt, cur, 1); - i++; - cur = cur->next; - } - - for (i = 0; i < nbchild; i++) { - if (list[i] == NULL) - continue; - for (j = 0; j < i; j++) { - if (list[j] == NULL) - continue; - ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]); - if (ret == 0) { - xmlRngPErr(ctxt, def->node, XML_RNGP_GROUP_ATTR_CONFLICT, - "Attributes conflicts in group\n", NULL, NULL); - } - } - } - for (i = 0; i < nbchild; i++) { - if (list[i] != NULL) - xmlFree(list[i]); - } - - xmlFree(list); - def->dflags |= IS_PROCESSED; -} - -/** - * xmlRelaxNGComputeInterleaves: - * @def: the interleave definition - * @ctxt: a Relax-NG parser context - * @name: the definition name - * - * A lot of work for preprocessing interleave definitions - * is potentially needed to get a decent execution speed at runtime - * - trying to get a total order on the element nodes generated - * by the interleaves, order the list of interleave definitions - * following that order. - * - if <text/> is used to handle mixed content, it is better to - * flag this in the define and simplify the runtime checking - * algorithm - */ -static void -xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def, - xmlRelaxNGParserCtxtPtr ctxt, - xmlChar * name ATTRIBUTE_UNUSED) -{ - xmlRelaxNGDefinePtr cur, *tmp; - - xmlRelaxNGPartitionPtr partitions = NULL; - xmlRelaxNGInterleaveGroupPtr *groups = NULL; - xmlRelaxNGInterleaveGroupPtr group; - int i, j, ret, res; - int nbgroups = 0; - int nbchild = 0; - int is_mixed = 0; - int is_determinist = 1; - - /* - * Don't run that check in case of error. Infinite recursion - * becomes possible. - */ - if (ctxt->nbErrors != 0) - return; - -#ifdef DEBUG_INTERLEAVE - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGComputeInterleaves(%s)\n", name); -#endif - cur = def->content; - while (cur != NULL) { - nbchild++; - cur = cur->next; - } - -#ifdef DEBUG_INTERLEAVE - xmlGenericError(xmlGenericErrorContext, " %d child\n", nbchild); -#endif - groups = (xmlRelaxNGInterleaveGroupPtr *) - xmlMalloc(nbchild * sizeof(xmlRelaxNGInterleaveGroupPtr)); - if (groups == NULL) - goto error; - cur = def->content; - while (cur != NULL) { - groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr) - xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup)); - if (groups[nbgroups] == NULL) - goto error; - if (cur->type == XML_RELAXNG_TEXT) - is_mixed++; - groups[nbgroups]->rule = cur; - groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur, 0); - groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt, cur, 1); - nbgroups++; - cur = cur->next; - } -#ifdef DEBUG_INTERLEAVE - xmlGenericError(xmlGenericErrorContext, " %d groups\n", nbgroups); -#endif - - /* - * Let's check that all rules makes a partitions according to 7.4 - */ - partitions = (xmlRelaxNGPartitionPtr) - xmlMalloc(sizeof(xmlRelaxNGPartition)); - if (partitions == NULL) - goto error; - memset(partitions, 0, sizeof(xmlRelaxNGPartition)); - partitions->nbgroups = nbgroups; - partitions->triage = xmlHashCreate(nbgroups); - for (i = 0; i < nbgroups; i++) { - group = groups[i]; - for (j = i + 1; j < nbgroups; j++) { - if (groups[j] == NULL) - continue; - - ret = xmlRelaxNGCompareElemDefLists(ctxt, group->defs, - groups[j]->defs); - if (ret == 0) { - xmlRngPErr(ctxt, def->node, XML_RNGP_ELEM_TEXT_CONFLICT, - "Element or text conflicts in interleave\n", - NULL, NULL); - } - ret = xmlRelaxNGCompareElemDefLists(ctxt, group->attrs, - groups[j]->attrs); - if (ret == 0) { - xmlRngPErr(ctxt, def->node, XML_RNGP_ATTR_CONFLICT, - "Attributes conflicts in interleave\n", NULL, - NULL); - } - } - tmp = group->defs; - if ((tmp != NULL) && (*tmp != NULL)) { - while (*tmp != NULL) { - if ((*tmp)->type == XML_RELAXNG_TEXT) { - res = xmlHashAddEntry2(partitions->triage, - BAD_CAST "#text", NULL, - (void *) (long) (i + 1)); - if (res != 0) - is_determinist = -1; - } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && - ((*tmp)->name != NULL)) { - if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) - res = xmlHashAddEntry2(partitions->triage, - (*tmp)->name, NULL, - (void *) (long) (i + 1)); - else - res = xmlHashAddEntry2(partitions->triage, - (*tmp)->name, (*tmp)->ns, - (void *) (long) (i + 1)); - if (res != 0) - is_determinist = -1; - } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { - if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) - res = xmlHashAddEntry2(partitions->triage, - BAD_CAST "#any", NULL, - (void *) (long) (i + 1)); - else - res = xmlHashAddEntry2(partitions->triage, - BAD_CAST "#any", (*tmp)->ns, - (void *) (long) (i + 1)); - if ((*tmp)->nameClass != NULL) - is_determinist = 2; - if (res != 0) - is_determinist = -1; - } else { - is_determinist = -1; - } - tmp++; - } - } else { - is_determinist = 0; - } - } - partitions->groups = groups; - - /* - * and save the partition list back in the def - */ - def->data = partitions; - if (is_mixed != 0) - def->dflags |= IS_MIXED; - if (is_determinist == 1) - partitions->flags = IS_DETERMINIST; - if (is_determinist == 2) - partitions->flags = IS_DETERMINIST | IS_NEEDCHECK; - return; - - error: - xmlRngPErrMemory(ctxt, "in interleave computation\n"); - if (groups != NULL) { - for (i = 0; i < nbgroups; i++) - if (groups[i] != NULL) { - if (groups[i]->defs != NULL) - xmlFree(groups[i]->defs); - xmlFree(groups[i]); - } - xmlFree(groups); - } - xmlRelaxNGFreePartition(partitions); -} - -/** - * xmlRelaxNGParseInterleave: - * @ctxt: a Relax-NG parser context - * @node: the data node. - * - * parse the content of a RelaxNG interleave node. - * - * Returns the definition pointer or NULL in case of error - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParseInterleave(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGDefinePtr def = NULL; - xmlRelaxNGDefinePtr last = NULL, cur; - xmlNodePtr child; - - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) { - return (NULL); - } - def->type = XML_RELAXNG_INTERLEAVE; - - if (ctxt->interleaves == NULL) - ctxt->interleaves = xmlHashCreate(10); - if (ctxt->interleaves == NULL) { - xmlRngPErrMemory(ctxt, "create interleaves\n"); - } else { - char name[32]; - - snprintf(name, 32, "interleave%d", ctxt->nbInterleaves++); - if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST name, def) < 0) { - xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_ADD, - "Failed to add %s to hash table\n", - (const xmlChar *) name, NULL); - } - } - child = node->children; - if (child == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_NO_CONTENT, - "Element interleave is empty\n", NULL, NULL); - } - while (child != NULL) { - if (IS_RELAXNG(child, "element")) { - cur = xmlRelaxNGParseElement(ctxt, child); - } else { - cur = xmlRelaxNGParsePattern(ctxt, child); - } - if (cur != NULL) { - cur->parent = def; - if (last == NULL) { - def->content = last = cur; - } else { - last->next = cur; - last = cur; - } - } - child = child->next; - } - - return (def); -} - -/** - * xmlRelaxNGParseInclude: - * @ctxt: a Relax-NG parser context - * @node: the include node - * - * Integrate the content of an include node in the current grammar - * - * Returns 0 in case of success or -1 in case of error - */ -static int -xmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGIncludePtr incl; - xmlNodePtr root; - int ret = 0, tmp; - - incl = node->psvi; - if (incl == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_INCLUDE_EMPTY, - "Include node has no data\n", NULL, NULL); - return (-1); - } - root = xmlDocGetRootElement(incl->doc); - if (root == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, "Include document is empty\n", - NULL, NULL); - return (-1); - } - if (!xmlStrEqual(root->name, BAD_CAST "grammar")) { - xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING, - "Include document root is not a grammar\n", NULL, NULL); - return (-1); - } - - /* - * Merge the definition from both the include and the internal list - */ - if (root->children != NULL) { - tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children); - if (tmp != 0) - ret = -1; - } - if (node->children != NULL) { - tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children); - if (tmp != 0) - ret = -1; - } - return (ret); -} - -/** - * xmlRelaxNGParseDefine: - * @ctxt: a Relax-NG parser context - * @node: the define node - * - * parse the content of a RelaxNG define element node. - * - * Returns 0 in case of success or -1 in case of error - */ -static int -xmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlChar *name; - int ret = 0, tmp; - xmlRelaxNGDefinePtr def; - const xmlChar *olddefine; - - name = xmlGetProp(node, BAD_CAST "name"); - if (name == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_NAME_MISSING, - "define has no name\n", NULL, NULL); - } else { - xmlRelaxNGNormExtSpace(name); - if (xmlValidateNCName(name, 0)) { - xmlRngPErr(ctxt, node, XML_RNGP_INVALID_DEFINE_NAME, - "define name '%s' is not an NCName\n", name, NULL); - } - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) { - xmlFree(name); - return (-1); - } - def->type = XML_RELAXNG_DEF; - def->name = name; - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_EMPTY, - "define has no children\n", NULL, NULL); - } else { - olddefine = ctxt->define; - ctxt->define = name; - def->content = - xmlRelaxNGParsePatterns(ctxt, node->children, 0); - ctxt->define = olddefine; - } - if (ctxt->grammar->defs == NULL) - ctxt->grammar->defs = xmlHashCreate(10); - if (ctxt->grammar->defs == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED, - "Could not create definition hash\n", NULL, NULL); - ret = -1; - } else { - tmp = xmlHashAddEntry(ctxt->grammar->defs, name, def); - if (tmp < 0) { - xmlRelaxNGDefinePtr prev; - - prev = xmlHashLookup(ctxt->grammar->defs, name); - if (prev == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED, - "Internal error on define aggregation of %s\n", - name, NULL); - ret = -1; - } else { - while (prev->nextHash != NULL) - prev = prev->nextHash; - prev->nextHash = def; - } - } - } - } - return (ret); -} - -/** - * xmlRelaxNGProcessExternalRef: - * @ctxt: the parser context - * @node: the externlRef node - * - * Process and compile an externlRef node - * - * Returns the xmlRelaxNGDefinePtr or NULL in case of error - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGDocumentPtr docu; - xmlNodePtr root, tmp; - xmlChar *ns; - int newNs = 0, oldflags; - xmlRelaxNGDefinePtr def; - - docu = node->psvi; - if (docu != NULL) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_EXTERNALREF; - - if (docu->content == NULL) { - /* - * Then do the parsing for good - */ - root = xmlDocGetRootElement(docu->doc); - if (root == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EXTERNALREF_EMTPY, - "xmlRelaxNGParse: %s is empty\n", ctxt->URL, - NULL); - return (NULL); - } - /* - * ns transmission rules - */ - ns = xmlGetProp(root, BAD_CAST "ns"); - if (ns == NULL) { - tmp = node; - while ((tmp != NULL) && (tmp->type == XML_ELEMENT_NODE)) { - ns = xmlGetProp(tmp, BAD_CAST "ns"); - if (ns != NULL) { - break; - } - tmp = tmp->parent; - } - if (ns != NULL) { - xmlSetProp(root, BAD_CAST "ns", ns); - newNs = 1; - xmlFree(ns); - } - } else { - xmlFree(ns); - } - - /* - * Parsing to get a precompiled schemas. - */ - oldflags = ctxt->flags; - ctxt->flags |= XML_RELAXNG_IN_EXTERNALREF; - docu->schema = xmlRelaxNGParseDocument(ctxt, root); - ctxt->flags = oldflags; - if ((docu->schema != NULL) && - (docu->schema->topgrammar != NULL)) { - docu->content = docu->schema->topgrammar->start; - } - - /* - * the externalRef may be reused in a different ns context - */ - if (newNs == 1) { - xmlUnsetProp(root, BAD_CAST "ns"); - } - } - def->content = docu->content; - } else { - def = NULL; - } - return (def); -} - -/** - * xmlRelaxNGParsePattern: - * @ctxt: a Relax-NG parser context - * @node: the pattern node. - * - * parse the content of a RelaxNG pattern node. - * - * Returns the definition pointer or NULL in case of error or if no - * pattern is generated. - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGDefinePtr def = NULL; - - if (node == NULL) { - return (NULL); - } - if (IS_RELAXNG(node, "element")) { - def = xmlRelaxNGParseElement(ctxt, node); - } else if (IS_RELAXNG(node, "attribute")) { - def = xmlRelaxNGParseAttribute(ctxt, node); - } else if (IS_RELAXNG(node, "empty")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_EMPTY; - if (node->children != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_NOT_EMPTY, - "empty: had a child node\n", NULL, NULL); - } - } else if (IS_RELAXNG(node, "text")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_TEXT; - if (node->children != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_TEXT_HAS_CHILD, - "text: had a child node\n", NULL, NULL); - } - } else if (IS_RELAXNG(node, "zeroOrMore")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_ZEROORMORE; - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, - "Element %s is empty\n", node->name, NULL); - } else { - def->content = - xmlRelaxNGParsePatterns(ctxt, node->children, 1); - } - } else if (IS_RELAXNG(node, "oneOrMore")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_ONEORMORE; - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, - "Element %s is empty\n", node->name, NULL); - } else { - def->content = - xmlRelaxNGParsePatterns(ctxt, node->children, 1); - } - } else if (IS_RELAXNG(node, "optional")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_OPTIONAL; - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, - "Element %s is empty\n", node->name, NULL); - } else { - def->content = - xmlRelaxNGParsePatterns(ctxt, node->children, 1); - } - } else if (IS_RELAXNG(node, "choice")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_CHOICE; - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, - "Element %s is empty\n", node->name, NULL); - } else { - def->content = - xmlRelaxNGParsePatterns(ctxt, node->children, 0); - } - } else if (IS_RELAXNG(node, "group")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_GROUP; - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, - "Element %s is empty\n", node->name, NULL); - } else { - def->content = - xmlRelaxNGParsePatterns(ctxt, node->children, 0); - } - } else if (IS_RELAXNG(node, "ref")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_REF; - def->name = xmlGetProp(node, BAD_CAST "name"); - if (def->name == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_REF_NO_NAME, "ref has no name\n", - NULL, NULL); - } else { - xmlRelaxNGNormExtSpace(def->name); - if (xmlValidateNCName(def->name, 0)) { - xmlRngPErr(ctxt, node, XML_RNGP_REF_NAME_INVALID, - "ref name '%s' is not an NCName\n", def->name, - NULL); - } - } - if (node->children != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_REF_NOT_EMPTY, "ref is not empty\n", - NULL, NULL); - } - if (ctxt->grammar->refs == NULL) - ctxt->grammar->refs = xmlHashCreate(10); - if (ctxt->grammar->refs == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, - "Could not create references hash\n", NULL, NULL); - def = NULL; - } else { - int tmp; - - tmp = xmlHashAddEntry(ctxt->grammar->refs, def->name, def); - if (tmp < 0) { - xmlRelaxNGDefinePtr prev; - - prev = (xmlRelaxNGDefinePtr) - xmlHashLookup(ctxt->grammar->refs, def->name); - if (prev == NULL) { - if (def->name != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, - "Error refs definitions '%s'\n", - def->name, NULL); - } else { - xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED, - "Error refs definitions\n", - NULL, NULL); - } - def = NULL; - } else { - def->nextHash = prev->nextHash; - prev->nextHash = def; - } - } - } - } else if (IS_RELAXNG(node, "data")) { - def = xmlRelaxNGParseData(ctxt, node); - } else if (IS_RELAXNG(node, "value")) { - def = xmlRelaxNGParseValue(ctxt, node); - } else if (IS_RELAXNG(node, "list")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_LIST; - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, - "Element %s is empty\n", node->name, NULL); - } else { - def->content = - xmlRelaxNGParsePatterns(ctxt, node->children, 0); - } - } else if (IS_RELAXNG(node, "interleave")) { - def = xmlRelaxNGParseInterleave(ctxt, node); - } else if (IS_RELAXNG(node, "externalRef")) { - def = xmlRelaxNGProcessExternalRef(ctxt, node); - } else if (IS_RELAXNG(node, "notAllowed")) { - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_NOT_ALLOWED; - if (node->children != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_NOTALLOWED_NOT_EMPTY, - "xmlRelaxNGParse: notAllowed element is not empty\n", - NULL, NULL); - } - } else if (IS_RELAXNG(node, "grammar")) { - xmlRelaxNGGrammarPtr grammar, old; - xmlRelaxNGGrammarPtr oldparent; - -#ifdef DEBUG_GRAMMAR - xmlGenericError(xmlGenericErrorContext, - "Found <grammar> pattern\n"); -#endif - - oldparent = ctxt->parentgrammar; - old = ctxt->grammar; - ctxt->parentgrammar = old; - grammar = xmlRelaxNGParseGrammar(ctxt, node->children); - if (old != NULL) { - ctxt->grammar = old; - ctxt->parentgrammar = oldparent; -#if 0 - if (grammar != NULL) { - grammar->next = old->next; - old->next = grammar; - } -#endif - } - if (grammar != NULL) - def = grammar->start; - else - def = NULL; - } else if (IS_RELAXNG(node, "parentRef")) { - if (ctxt->parentgrammar == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_PARENT, - "Use of parentRef without a parent grammar\n", NULL, - NULL); - return (NULL); - } - def = xmlRelaxNGNewDefine(ctxt, node); - if (def == NULL) - return (NULL); - def->type = XML_RELAXNG_PARENTREF; - def->name = xmlGetProp(node, BAD_CAST "name"); - if (def->name == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_NAME, - "parentRef has no name\n", NULL, NULL); - } else { - xmlRelaxNGNormExtSpace(def->name); - if (xmlValidateNCName(def->name, 0)) { - xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NAME_INVALID, - "parentRef name '%s' is not an NCName\n", - def->name, NULL); - } - } - if (node->children != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NOT_EMPTY, - "parentRef is not empty\n", NULL, NULL); - } - if (ctxt->parentgrammar->refs == NULL) - ctxt->parentgrammar->refs = xmlHashCreate(10); - if (ctxt->parentgrammar->refs == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED, - "Could not create references hash\n", NULL, NULL); - def = NULL; - } else if (def->name != NULL) { - int tmp; - - tmp = - xmlHashAddEntry(ctxt->parentgrammar->refs, def->name, def); - if (tmp < 0) { - xmlRelaxNGDefinePtr prev; - - prev = (xmlRelaxNGDefinePtr) - xmlHashLookup(ctxt->parentgrammar->refs, def->name); - if (prev == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED, - "Internal error parentRef definitions '%s'\n", - def->name, NULL); - def = NULL; - } else { - def->nextHash = prev->nextHash; - prev->nextHash = def; - } - } - } - } else if (IS_RELAXNG(node, "mixed")) { - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, "Mixed is empty\n", - NULL, NULL); - def = NULL; - } else { - def = xmlRelaxNGParseInterleave(ctxt, node); - if (def != NULL) { - xmlRelaxNGDefinePtr tmp; - - if ((def->content != NULL) && (def->content->next != NULL)) { - tmp = xmlRelaxNGNewDefine(ctxt, node); - if (tmp != NULL) { - tmp->type = XML_RELAXNG_GROUP; - tmp->content = def->content; - def->content = tmp; - } - } - - tmp = xmlRelaxNGNewDefine(ctxt, node); - if (tmp == NULL) - return (def); - tmp->type = XML_RELAXNG_TEXT; - tmp->next = def->content; - def->content = tmp; - } - } - } else { - xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_CONSTRUCT, - "Unexpected node %s is not a pattern\n", node->name, - NULL); - def = NULL; - } - return (def); -} - -/** - * xmlRelaxNGParseAttribute: - * @ctxt: a Relax-NG parser context - * @node: the element node - * - * parse the content of a RelaxNG attribute node. - * - * Returns the definition pointer or NULL in case of error. - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGDefinePtr ret, cur; - xmlNodePtr child; - int old_flags; - - ret = xmlRelaxNGNewDefine(ctxt, node); - if (ret == NULL) - return (NULL); - ret->type = XML_RELAXNG_ATTRIBUTE; - ret->parent = ctxt->def; - child = node->children; - if (child == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_EMPTY, - "xmlRelaxNGParseattribute: attribute has no children\n", - NULL, NULL); - return (ret); - } - old_flags = ctxt->flags; - ctxt->flags |= XML_RELAXNG_IN_ATTRIBUTE; - cur = xmlRelaxNGParseNameClass(ctxt, child, ret); - if (cur != NULL) - child = child->next; - - if (child != NULL) { - cur = xmlRelaxNGParsePattern(ctxt, child); - if (cur != NULL) { - switch (cur->type) { - case XML_RELAXNG_EMPTY: - case XML_RELAXNG_NOT_ALLOWED: - case XML_RELAXNG_TEXT: - case XML_RELAXNG_ELEMENT: - case XML_RELAXNG_DATATYPE: - case XML_RELAXNG_VALUE: - case XML_RELAXNG_LIST: - case XML_RELAXNG_REF: - case XML_RELAXNG_PARENTREF: - case XML_RELAXNG_EXTERNALREF: - case XML_RELAXNG_DEF: - case XML_RELAXNG_ONEORMORE: - case XML_RELAXNG_ZEROORMORE: - case XML_RELAXNG_OPTIONAL: - case XML_RELAXNG_CHOICE: - case XML_RELAXNG_GROUP: - case XML_RELAXNG_INTERLEAVE: - case XML_RELAXNG_ATTRIBUTE: - ret->content = cur; - cur->parent = ret; - break; - case XML_RELAXNG_START: - case XML_RELAXNG_PARAM: - case XML_RELAXNG_EXCEPT: - xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CONTENT, - "attribute has invalid content\n", NULL, - NULL); - break; - case XML_RELAXNG_NOOP: - xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_NOOP, - "RNG Internal error, noop found in attribute\n", - NULL, NULL); - break; - } - } - child = child->next; - } - if (child != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CHILDREN, - "attribute has multiple children\n", NULL, NULL); - } - ctxt->flags = old_flags; - return (ret); -} - -/** - * xmlRelaxNGParseExceptNameClass: - * @ctxt: a Relax-NG parser context - * @node: the except node - * @attr: 1 if within an attribute, 0 if within an element - * - * parse the content of a RelaxNG nameClass node. - * - * Returns the definition pointer or NULL in case of error. - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParseExceptNameClass(xmlRelaxNGParserCtxtPtr ctxt, - xmlNodePtr node, int attr) -{ - xmlRelaxNGDefinePtr ret, cur, last = NULL; - xmlNodePtr child; - - if (!IS_RELAXNG(node, "except")) { - xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MISSING, - "Expecting an except node\n", NULL, NULL); - return (NULL); - } - if (node->next != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MULTIPLE, - "exceptNameClass allows only a single except node\n", - NULL, NULL); - } - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_EMPTY, "except has no content\n", - NULL, NULL); - return (NULL); - } - - ret = xmlRelaxNGNewDefine(ctxt, node); - if (ret == NULL) - return (NULL); - ret->type = XML_RELAXNG_EXCEPT; - child = node->children; - while (child != NULL) { - cur = xmlRelaxNGNewDefine(ctxt, child); - if (cur == NULL) - break; - if (attr) - cur->type = XML_RELAXNG_ATTRIBUTE; - else - cur->type = XML_RELAXNG_ELEMENT; - - if (xmlRelaxNGParseNameClass(ctxt, child, cur) != NULL) { - if (last == NULL) { - ret->content = cur; - } else { - last->next = cur; - } - last = cur; - } - child = child->next; - } - - return (ret); -} - -/** - * xmlRelaxNGParseNameClass: - * @ctxt: a Relax-NG parser context - * @node: the nameClass node - * @def: the current definition - * - * parse the content of a RelaxNG nameClass node. - * - * Returns the definition pointer or NULL in case of error. - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, - xmlRelaxNGDefinePtr def) -{ - xmlRelaxNGDefinePtr ret, tmp; - xmlChar *val; - - ret = def; - if ((IS_RELAXNG(node, "name")) || (IS_RELAXNG(node, "anyName")) || - (IS_RELAXNG(node, "nsName"))) { - if ((def->type != XML_RELAXNG_ELEMENT) && - (def->type != XML_RELAXNG_ATTRIBUTE)) { - ret = xmlRelaxNGNewDefine(ctxt, node); - if (ret == NULL) - return (NULL); - ret->parent = def; - if (ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) - ret->type = XML_RELAXNG_ATTRIBUTE; - else - ret->type = XML_RELAXNG_ELEMENT; - } - } - if (IS_RELAXNG(node, "name")) { - val = xmlNodeGetContent(node); - xmlRelaxNGNormExtSpace(val); - if (xmlValidateNCName(val, 0)) { - if (node->parent != NULL) - xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME, - "Element %s name '%s' is not an NCName\n", - node->parent->name, val); - else - xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME, - "name '%s' is not an NCName\n", - val, NULL); - } - ret->name = val; - val = xmlGetProp(node, BAD_CAST "ns"); - ret->ns = val; - if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && - (val != NULL) && - (xmlStrEqual(val, BAD_CAST "http://www.w3.org/2000/xmlns"))) { - xmlRngPErr(ctxt, node, XML_RNGP_XML_NS, - "Attribute with namespace '%s' is not allowed\n", - val, NULL); - } - if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && - (val != NULL) && - (val[0] == 0) && (xmlStrEqual(ret->name, BAD_CAST "xmlns"))) { - xmlRngPErr(ctxt, node, XML_RNGP_XMLNS_NAME, - "Attribute with QName 'xmlns' is not allowed\n", - val, NULL); - } - } else if (IS_RELAXNG(node, "anyName")) { - ret->name = NULL; - ret->ns = NULL; - if (node->children != NULL) { - ret->nameClass = - xmlRelaxNGParseExceptNameClass(ctxt, node->children, - (def->type == - XML_RELAXNG_ATTRIBUTE)); - } - } else if (IS_RELAXNG(node, "nsName")) { - ret->name = NULL; - ret->ns = xmlGetProp(node, BAD_CAST "ns"); - if (ret->ns == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_NSNAME_NO_NS, - "nsName has no ns attribute\n", NULL, NULL); - } - if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) && - (ret->ns != NULL) && - (xmlStrEqual - (ret->ns, BAD_CAST "http://www.w3.org/2000/xmlns"))) { - xmlRngPErr(ctxt, node, XML_RNGP_XML_NS, - "Attribute with namespace '%s' is not allowed\n", - ret->ns, NULL); - } - if (node->children != NULL) { - ret->nameClass = - xmlRelaxNGParseExceptNameClass(ctxt, node->children, - (def->type == - XML_RELAXNG_ATTRIBUTE)); - } - } else if (IS_RELAXNG(node, "choice")) { - xmlNodePtr child; - xmlRelaxNGDefinePtr last = NULL; - - ret = xmlRelaxNGNewDefine(ctxt, node); - if (ret == NULL) - return (NULL); - ret->parent = def; - ret->type = XML_RELAXNG_CHOICE; - - if (node->children == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_EMPTY, - "Element choice is empty\n", NULL, NULL); - } else { - - child = node->children; - while (child != NULL) { - tmp = xmlRelaxNGParseNameClass(ctxt, child, ret); - if (tmp != NULL) { - if (last == NULL) { - last = ret->nameClass = tmp; - } else { - last->next = tmp; - last = tmp; - } - } - child = child->next; - } - } - } else { - xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_CONTENT, - "expecting name, anyName, nsName or choice : got %s\n", - node->name, NULL); - return (NULL); - } - if (ret != def) { - if (def->nameClass == NULL) { - def->nameClass = ret; - } else { - tmp = def->nameClass; - while (tmp->next != NULL) { - tmp = tmp->next; - } - tmp->next = ret; - } - } - return (ret); -} - -/** - * xmlRelaxNGParseElement: - * @ctxt: a Relax-NG parser context - * @node: the element node - * - * parse the content of a RelaxNG element node. - * - * Returns the definition pointer or NULL in case of error. - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGDefinePtr ret, cur, last; - xmlNodePtr child; - const xmlChar *olddefine; - - ret = xmlRelaxNGNewDefine(ctxt, node); - if (ret == NULL) - return (NULL); - ret->type = XML_RELAXNG_ELEMENT; - ret->parent = ctxt->def; - child = node->children; - if (child == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_EMPTY, - "xmlRelaxNGParseElement: element has no children\n", - NULL, NULL); - return (ret); - } - cur = xmlRelaxNGParseNameClass(ctxt, child, ret); - if (cur != NULL) - child = child->next; - - if (child == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NO_CONTENT, - "xmlRelaxNGParseElement: element has no content\n", - NULL, NULL); - return (ret); - } - olddefine = ctxt->define; - ctxt->define = NULL; - last = NULL; - while (child != NULL) { - cur = xmlRelaxNGParsePattern(ctxt, child); - if (cur != NULL) { - cur->parent = ret; - switch (cur->type) { - case XML_RELAXNG_EMPTY: - case XML_RELAXNG_NOT_ALLOWED: - case XML_RELAXNG_TEXT: - case XML_RELAXNG_ELEMENT: - case XML_RELAXNG_DATATYPE: - case XML_RELAXNG_VALUE: - case XML_RELAXNG_LIST: - case XML_RELAXNG_REF: - case XML_RELAXNG_PARENTREF: - case XML_RELAXNG_EXTERNALREF: - case XML_RELAXNG_DEF: - case XML_RELAXNG_ZEROORMORE: - case XML_RELAXNG_ONEORMORE: - case XML_RELAXNG_OPTIONAL: - case XML_RELAXNG_CHOICE: - case XML_RELAXNG_GROUP: - case XML_RELAXNG_INTERLEAVE: - if (last == NULL) { - ret->content = last = cur; - } else { - if ((last->type == XML_RELAXNG_ELEMENT) && - (ret->content == last)) { - ret->content = xmlRelaxNGNewDefine(ctxt, node); - if (ret->content != NULL) { - ret->content->type = XML_RELAXNG_GROUP; - ret->content->content = last; - } else { - ret->content = last; - } - } - last->next = cur; - last = cur; - } - break; - case XML_RELAXNG_ATTRIBUTE: - cur->next = ret->attrs; - ret->attrs = cur; - break; - case XML_RELAXNG_START: - xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, - "RNG Internal error, start found in element\n", - NULL, NULL); - break; - case XML_RELAXNG_PARAM: - xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, - "RNG Internal error, param found in element\n", - NULL, NULL); - break; - case XML_RELAXNG_EXCEPT: - xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, - "RNG Internal error, except found in element\n", - NULL, NULL); - break; - case XML_RELAXNG_NOOP: - xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT, - "RNG Internal error, noop found in element\n", - NULL, NULL); - break; - } - } - child = child->next; - } - ctxt->define = olddefine; - return (ret); -} - -/** - * xmlRelaxNGParsePatterns: - * @ctxt: a Relax-NG parser context - * @nodes: list of nodes - * @group: use an implicit <group> for elements - * - * parse the content of a RelaxNG start node. - * - * Returns the definition pointer or NULL in case of error. - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes, - int group) -{ - xmlRelaxNGDefinePtr def = NULL, last = NULL, cur, parent; - - parent = ctxt->def; - while (nodes != NULL) { - if (IS_RELAXNG(nodes, "element")) { - cur = xmlRelaxNGParseElement(ctxt, nodes); - if (def == NULL) { - def = last = cur; - } else { - if ((group == 1) && (def->type == XML_RELAXNG_ELEMENT) && - (def == last)) { - def = xmlRelaxNGNewDefine(ctxt, nodes); - def->type = XML_RELAXNG_GROUP; - def->content = last; - } - last->next = cur; - last = cur; - } - cur->parent = parent; - } else { - cur = xmlRelaxNGParsePattern(ctxt, nodes); - if (cur != NULL) { - if (def == NULL) { - def = last = cur; - } else { - last->next = cur; - last = cur; - } - } - } - nodes = nodes->next; - } - return (def); -} - -/** - * xmlRelaxNGParseStart: - * @ctxt: a Relax-NG parser context - * @nodes: start children nodes - * - * parse the content of a RelaxNG start node. - * - * Returns 0 in case of success, -1 in case of error - */ -static int -xmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) -{ - int ret = 0; - xmlRelaxNGDefinePtr def = NULL, last; - - if (nodes == NULL) { - xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, "start has no children\n", - NULL, NULL); - return (-1); - } - if (IS_RELAXNG(nodes, "empty")) { - def = xmlRelaxNGNewDefine(ctxt, nodes); - if (def == NULL) - return (-1); - def->type = XML_RELAXNG_EMPTY; - if (nodes->children != NULL) { - xmlRngPErr(ctxt, nodes, XML_RNGP_EMPTY_CONTENT, - "element empty is not empty\n", NULL, NULL); - } - } else if (IS_RELAXNG(nodes, "notAllowed")) { - def = xmlRelaxNGNewDefine(ctxt, nodes); - if (def == NULL) - return (-1); - def->type = XML_RELAXNG_NOT_ALLOWED; - if (nodes->children != NULL) { - xmlRngPErr(ctxt, nodes, XML_RNGP_NOTALLOWED_NOT_EMPTY, - "element notAllowed is not empty\n", NULL, NULL); - } - } else { - def = xmlRelaxNGParsePatterns(ctxt, nodes, 1); - } - if (ctxt->grammar->start != NULL) { - last = ctxt->grammar->start; - while (last->next != NULL) - last = last->next; - last->next = def; - } else { - ctxt->grammar->start = def; - } - nodes = nodes->next; - if (nodes != NULL) { - xmlRngPErr(ctxt, nodes, XML_RNGP_START_CONTENT, - "start more than one children\n", NULL, NULL); - return (-1); - } - return (ret); -} - -/** - * xmlRelaxNGParseGrammarContent: - * @ctxt: a Relax-NG parser context - * @nodes: grammar children nodes - * - * parse the content of a RelaxNG grammar node. - * - * Returns 0 in case of success, -1 in case of error - */ -static int -xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, - xmlNodePtr nodes) -{ - int ret = 0, tmp; - - if (nodes == NULL) { - xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_EMPTY, - "grammar has no children\n", NULL, NULL); - return (-1); - } - while (nodes != NULL) { - if (IS_RELAXNG(nodes, "start")) { - if (nodes->children == NULL) { - xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, - "start has no children\n", NULL, NULL); - } else { - tmp = xmlRelaxNGParseStart(ctxt, nodes->children); - if (tmp != 0) - ret = -1; - } - } else if (IS_RELAXNG(nodes, "define")) { - tmp = xmlRelaxNGParseDefine(ctxt, nodes); - if (tmp != 0) - ret = -1; - } else if (IS_RELAXNG(nodes, "include")) { - tmp = xmlRelaxNGParseInclude(ctxt, nodes); - if (tmp != 0) - ret = -1; - } else { - xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, - "grammar has unexpected child %s\n", nodes->name, - NULL); - ret = -1; - } - nodes = nodes->next; - } - return (ret); -} - -/** - * xmlRelaxNGCheckReference: - * @ref: the ref - * @ctxt: a Relax-NG parser context - * @name: the name associated to the defines - * - * Applies the 4.17. combine attribute rule for all the define - * element of a given grammar using the same name. - */ -static void -xmlRelaxNGCheckReference(xmlRelaxNGDefinePtr ref, - xmlRelaxNGParserCtxtPtr ctxt, - const xmlChar * name) -{ - xmlRelaxNGGrammarPtr grammar; - xmlRelaxNGDefinePtr def, cur; - - grammar = ctxt->grammar; - if (grammar == NULL) { - xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR, - "Internal error: no grammar in CheckReference %s\n", - name, NULL); - return; - } - if (ref->content != NULL) { - xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR, - "Internal error: reference has content in CheckReference %s\n", - name, NULL); - return; - } - if (grammar->defs != NULL) { - def = xmlHashLookup(grammar->defs, name); - if (def != NULL) { - cur = ref; - while (cur != NULL) { - cur->content = def; - cur = cur->nextHash; - } - } else { - xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF, - "Reference %s has no matching definition\n", name, - NULL); - } - } else { - xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF, - "Reference %s has no matching definition\n", name, - NULL); - } -} - -/** - * xmlRelaxNGCheckCombine: - * @define: the define(s) list - * @ctxt: a Relax-NG parser context - * @name: the name associated to the defines - * - * Applies the 4.17. combine attribute rule for all the define - * element of a given grammar using the same name. - */ -static void -xmlRelaxNGCheckCombine(xmlRelaxNGDefinePtr define, - xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * name) -{ - xmlChar *combine; - int choiceOrInterleave = -1; - int missing = 0; - xmlRelaxNGDefinePtr cur, last, tmp, tmp2; - - if (define->nextHash == NULL) - return; - cur = define; - while (cur != NULL) { - combine = xmlGetProp(cur->node, BAD_CAST "combine"); - if (combine != NULL) { - if (xmlStrEqual(combine, BAD_CAST "choice")) { - if (choiceOrInterleave == -1) - choiceOrInterleave = 1; - else if (choiceOrInterleave == 0) { - xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, - "Defines for %s use both 'choice' and 'interleave'\n", - name, NULL); - } - } else if (xmlStrEqual(combine, BAD_CAST "interleave")) { - if (choiceOrInterleave == -1) - choiceOrInterleave = 0; - else if (choiceOrInterleave == 1) { - xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, - "Defines for %s use both 'choice' and 'interleave'\n", - name, NULL); - } - } else { - xmlRngPErr(ctxt, define->node, XML_RNGP_UNKNOWN_COMBINE, - "Defines for %s use unknown combine value '%s''\n", - name, combine); - } - xmlFree(combine); - } else { - if (missing == 0) - missing = 1; - else { - xmlRngPErr(ctxt, define->node, XML_RNGP_NEED_COMBINE, - "Some defines for %s needs the combine attribute\n", - name, NULL); - } - } - - cur = cur->nextHash; - } -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGCheckCombine(): merging %s defines: %d\n", - name, choiceOrInterleave); -#endif - if (choiceOrInterleave == -1) - choiceOrInterleave = 0; - cur = xmlRelaxNGNewDefine(ctxt, define->node); - if (cur == NULL) - return; - if (choiceOrInterleave == 0) - cur->type = XML_RELAXNG_INTERLEAVE; - else - cur->type = XML_RELAXNG_CHOICE; - tmp = define; - last = NULL; - while (tmp != NULL) { - if (tmp->content != NULL) { - if (tmp->content->next != NULL) { - /* - * we need first to create a wrapper. - */ - tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node); - if (tmp2 == NULL) - break; - tmp2->type = XML_RELAXNG_GROUP; - tmp2->content = tmp->content; - } else { - tmp2 = tmp->content; - } - if (last == NULL) { - cur->content = tmp2; - } else { - last->next = tmp2; - } - last = tmp2; - } - tmp->content = cur; - tmp = tmp->nextHash; - } - define->content = cur; - if (choiceOrInterleave == 0) { - if (ctxt->interleaves == NULL) - ctxt->interleaves = xmlHashCreate(10); - if (ctxt->interleaves == NULL) { - xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, - "Failed to create interleaves hash table\n", NULL, - NULL); - } else { - char tmpname[32]; - - snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++); - if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < - 0) { - xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, - "Failed to add %s to hash table\n", - (const xmlChar *) tmpname, NULL); - } - } - } -} - -/** - * xmlRelaxNGCombineStart: - * @ctxt: a Relax-NG parser context - * @grammar: the grammar - * - * Applies the 4.17. combine rule for all the start - * element of a given grammar. - */ -static void -xmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGGrammarPtr grammar) -{ - xmlRelaxNGDefinePtr starts; - xmlChar *combine; - int choiceOrInterleave = -1; - int missing = 0; - xmlRelaxNGDefinePtr cur; - - starts = grammar->start; - if ((starts == NULL) || (starts->next == NULL)) - return; - cur = starts; - while (cur != NULL) { - if ((cur->node == NULL) || (cur->node->parent == NULL) || - (!xmlStrEqual(cur->node->parent->name, BAD_CAST "start"))) { - combine = NULL; - xmlRngPErr(ctxt, cur->node, XML_RNGP_START_MISSING, - "Internal error: start element not found\n", NULL, - NULL); - } else { - combine = xmlGetProp(cur->node->parent, BAD_CAST "combine"); - } - - if (combine != NULL) { - if (xmlStrEqual(combine, BAD_CAST "choice")) { - if (choiceOrInterleave == -1) - choiceOrInterleave = 1; - else if (choiceOrInterleave == 0) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE, - "<start> use both 'choice' and 'interleave'\n", - NULL, NULL); - } - } else if (xmlStrEqual(combine, BAD_CAST "interleave")) { - if (choiceOrInterleave == -1) - choiceOrInterleave = 0; - else if (choiceOrInterleave == 1) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE, - "<start> use both 'choice' and 'interleave'\n", - NULL, NULL); - } - } else { - xmlRngPErr(ctxt, cur->node, XML_RNGP_UNKNOWN_COMBINE, - "<start> uses unknown combine value '%s''\n", - combine, NULL); - } - xmlFree(combine); - } else { - if (missing == 0) - missing = 1; - else { - xmlRngPErr(ctxt, cur->node, XML_RNGP_NEED_COMBINE, - "Some <start> element miss the combine attribute\n", - NULL, NULL); - } - } - - cur = cur->next; - } -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGCombineStart(): merging <start>: %d\n", - choiceOrInterleave); -#endif - if (choiceOrInterleave == -1) - choiceOrInterleave = 0; - cur = xmlRelaxNGNewDefine(ctxt, starts->node); - if (cur == NULL) - return; - if (choiceOrInterleave == 0) - cur->type = XML_RELAXNG_INTERLEAVE; - else - cur->type = XML_RELAXNG_CHOICE; - cur->content = grammar->start; - grammar->start = cur; - if (choiceOrInterleave == 0) { - if (ctxt->interleaves == NULL) - ctxt->interleaves = xmlHashCreate(10); - if (ctxt->interleaves == NULL) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, - "Failed to create interleaves hash table\n", NULL, - NULL); - } else { - char tmpname[32]; - - snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++); - if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < - 0) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED, - "Failed to add %s to hash table\n", - (const xmlChar *) tmpname, NULL); - } - } - } -} - -/** - * xmlRelaxNGCheckCycles: - * @ctxt: a Relax-NG parser context - * @nodes: grammar children nodes - * @depth: the counter - * - * Check for cycles. - * - * Returns 0 if check passed, and -1 in case of error - */ -static int -xmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDefinePtr cur, int depth) -{ - int ret = 0; - - while ((ret == 0) && (cur != NULL)) { - if ((cur->type == XML_RELAXNG_REF) || - (cur->type == XML_RELAXNG_PARENTREF)) { - if (cur->depth == -1) { - cur->depth = depth; - ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); - cur->depth = -2; - } else if (depth == cur->depth) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_CYCLE, - "Detected a cycle in %s references\n", - cur->name, NULL); - return (-1); - } - } else if (cur->type == XML_RELAXNG_ELEMENT) { - ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1); - } else { - ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); - } - cur = cur->next; - } - return (ret); -} - -/** - * xmlRelaxNGTryUnlink: - * @ctxt: a Relax-NG parser context - * @cur: the definition to unlink - * @parent: the parent definition - * @prev: the previous sibling definition - * - * Try to unlink a definition. If not possble make it a NOOP - * - * Returns the new prev definition - */ -static xmlRelaxNGDefinePtr -xmlRelaxNGTryUnlink(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlRelaxNGDefinePtr cur, - xmlRelaxNGDefinePtr parent, xmlRelaxNGDefinePtr prev) -{ - if (prev != NULL) { - prev->next = cur->next; - } else { - if (parent != NULL) { - if (parent->content == cur) - parent->content = cur->next; - else if (parent->attrs == cur) - parent->attrs = cur->next; - else if (parent->nameClass == cur) - parent->nameClass = cur->next; - } else { - cur->type = XML_RELAXNG_NOOP; - prev = cur; - } - } - return (prev); -} - -/** - * xmlRelaxNGSimplify: - * @ctxt: a Relax-NG parser context - * @nodes: grammar children nodes - * - * Check for simplification of empty and notAllowed - */ -static void -xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDefinePtr cur, xmlRelaxNGDefinePtr parent) -{ - xmlRelaxNGDefinePtr prev = NULL; - - while (cur != NULL) { - if ((cur->type == XML_RELAXNG_REF) || - (cur->type == XML_RELAXNG_PARENTREF)) { - if (cur->depth != -3) { - cur->depth = -3; - xmlRelaxNGSimplify(ctxt, cur->content, cur); - } - } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { - cur->parent = parent; - if ((parent != NULL) && - ((parent->type == XML_RELAXNG_ATTRIBUTE) || - (parent->type == XML_RELAXNG_LIST) || - (parent->type == XML_RELAXNG_GROUP) || - (parent->type == XML_RELAXNG_INTERLEAVE) || - (parent->type == XML_RELAXNG_ONEORMORE) || - (parent->type == XML_RELAXNG_ZEROORMORE))) { - parent->type = XML_RELAXNG_NOT_ALLOWED; - break; - } - if ((parent != NULL) && (parent->type == XML_RELAXNG_CHOICE)) { - prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); - } else - prev = cur; - } else if (cur->type == XML_RELAXNG_EMPTY) { - cur->parent = parent; - if ((parent != NULL) && - ((parent->type == XML_RELAXNG_ONEORMORE) || - (parent->type == XML_RELAXNG_ZEROORMORE))) { - parent->type = XML_RELAXNG_EMPTY; - break; - } - if ((parent != NULL) && - ((parent->type == XML_RELAXNG_GROUP) || - (parent->type == XML_RELAXNG_INTERLEAVE))) { - prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); - } else - prev = cur; - } else { - cur->parent = parent; - if (cur->content != NULL) - xmlRelaxNGSimplify(ctxt, cur->content, cur); - if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL)) - xmlRelaxNGSimplify(ctxt, cur->attrs, cur); - if (cur->nameClass != NULL) - xmlRelaxNGSimplify(ctxt, cur->nameClass, cur); - /* - * On Elements, try to move attribute only generating rules on - * the attrs rules. - */ - if (cur->type == XML_RELAXNG_ELEMENT) { - int attronly; - xmlRelaxNGDefinePtr tmp, pre; - - while (cur->content != NULL) { - attronly = - xmlRelaxNGGenerateAttributes(ctxt, cur->content); - if (attronly == 1) { - /* - * migrate cur->content to attrs - */ - tmp = cur->content; - cur->content = tmp->next; - tmp->next = cur->attrs; - cur->attrs = tmp; - } else { - /* - * cur->content can generate elements or text - */ - break; - } - } - pre = cur->content; - while ((pre != NULL) && (pre->next != NULL)) { - tmp = pre->next; - attronly = xmlRelaxNGGenerateAttributes(ctxt, tmp); - if (attronly == 1) { - /* - * migrate tmp to attrs - */ - pre->next = tmp->next; - tmp->next = cur->attrs; - cur->attrs = tmp; - } else { - pre = tmp; - } - } - } - /* - * This may result in a simplification - */ - if ((cur->type == XML_RELAXNG_GROUP) || - (cur->type == XML_RELAXNG_INTERLEAVE)) { - if (cur->content == NULL) - cur->type = XML_RELAXNG_EMPTY; - else if (cur->content->next == NULL) { - if ((parent == NULL) && (prev == NULL)) { - cur->type = XML_RELAXNG_NOOP; - } else if (prev == NULL) { - parent->content = cur->content; - cur->content->next = cur->next; - cur = cur->content; - } else { - cur->content->next = cur->next; - prev->next = cur->content; - cur = cur->content; - } - } - } - /* - * the current node may have been transformed back - */ - if ((cur->type == XML_RELAXNG_EXCEPT) && - (cur->content != NULL) && - (cur->content->type == XML_RELAXNG_NOT_ALLOWED)) { - prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); - } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { - if ((parent != NULL) && - ((parent->type == XML_RELAXNG_ATTRIBUTE) || - (parent->type == XML_RELAXNG_LIST) || - (parent->type == XML_RELAXNG_GROUP) || - (parent->type == XML_RELAXNG_INTERLEAVE) || - (parent->type == XML_RELAXNG_ONEORMORE) || - (parent->type == XML_RELAXNG_ZEROORMORE))) { - parent->type = XML_RELAXNG_NOT_ALLOWED; - break; - } - if ((parent != NULL) && - (parent->type == XML_RELAXNG_CHOICE)) { - prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); - } else - prev = cur; - } else if (cur->type == XML_RELAXNG_EMPTY) { - if ((parent != NULL) && - ((parent->type == XML_RELAXNG_ONEORMORE) || - (parent->type == XML_RELAXNG_ZEROORMORE))) { - parent->type = XML_RELAXNG_EMPTY; - break; - } - if ((parent != NULL) && - ((parent->type == XML_RELAXNG_GROUP) || - (parent->type == XML_RELAXNG_INTERLEAVE) || - (parent->type == XML_RELAXNG_CHOICE))) { - prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev); - } else - prev = cur; - } else { - prev = cur; - } - } - cur = cur->next; - } -} - -/** - * xmlRelaxNGGroupContentType: - * @ct1: the first content type - * @ct2: the second content type - * - * Try to group 2 content types - * - * Returns the content type - */ -static xmlRelaxNGContentType -xmlRelaxNGGroupContentType(xmlRelaxNGContentType ct1, - xmlRelaxNGContentType ct2) -{ - if ((ct1 == XML_RELAXNG_CONTENT_ERROR) || - (ct2 == XML_RELAXNG_CONTENT_ERROR)) - return (XML_RELAXNG_CONTENT_ERROR); - if (ct1 == XML_RELAXNG_CONTENT_EMPTY) - return (ct2); - if (ct2 == XML_RELAXNG_CONTENT_EMPTY) - return (ct1); - if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) && - (ct2 == XML_RELAXNG_CONTENT_COMPLEX)) - return (XML_RELAXNG_CONTENT_COMPLEX); - return (XML_RELAXNG_CONTENT_ERROR); -} - -/** - * xmlRelaxNGMaxContentType: - * @ct1: the first content type - * @ct2: the second content type - * - * Compute the max content-type - * - * Returns the content type - */ -static xmlRelaxNGContentType -xmlRelaxNGMaxContentType(xmlRelaxNGContentType ct1, - xmlRelaxNGContentType ct2) -{ - if ((ct1 == XML_RELAXNG_CONTENT_ERROR) || - (ct2 == XML_RELAXNG_CONTENT_ERROR)) - return (XML_RELAXNG_CONTENT_ERROR); - if ((ct1 == XML_RELAXNG_CONTENT_SIMPLE) || - (ct2 == XML_RELAXNG_CONTENT_SIMPLE)) - return (XML_RELAXNG_CONTENT_SIMPLE); - if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) || - (ct2 == XML_RELAXNG_CONTENT_COMPLEX)) - return (XML_RELAXNG_CONTENT_COMPLEX); - return (XML_RELAXNG_CONTENT_EMPTY); -} - -/** - * xmlRelaxNGCheckRules: - * @ctxt: a Relax-NG parser context - * @cur: the current definition - * @flags: some accumulated flags - * @ptype: the parent type - * - * Check for rules in section 7.1 and 7.2 - * - * Returns the content type of @cur - */ -static xmlRelaxNGContentType -xmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGDefinePtr cur, int flags, - xmlRelaxNGType ptype) -{ - int nflags = flags; - xmlRelaxNGContentType ret, tmp, val = XML_RELAXNG_CONTENT_EMPTY; - - while (cur != NULL) { - ret = XML_RELAXNG_CONTENT_EMPTY; - if ((cur->type == XML_RELAXNG_REF) || - (cur->type == XML_RELAXNG_PARENTREF)) { - /* - * This should actually be caught by list//element(ref) at the - * element boundaries, c.f. Bug #159968 local refs are dropped - * in step 4.19. - */ -#if 0 - if (flags & XML_RELAXNG_IN_LIST) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_REF, - "Found forbidden pattern list//ref\n", NULL, - NULL); - } -#endif - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_REF, - "Found forbidden pattern data/except//ref\n", - NULL, NULL); - } - if (cur->depth > -4) { - cur->depth = -4; - ret = xmlRelaxNGCheckRules(ctxt, cur->content, - flags, cur->type); - cur->depth = ret - 15; - } else if (cur->depth == -4) { - ret = XML_RELAXNG_CONTENT_COMPLEX; - } else { - ret = (xmlRelaxNGContentType) (cur->depth + 15); - } - } else if (cur->type == XML_RELAXNG_ELEMENT) { - /* - * The 7.3 Attribute derivation rule for groups is plugged there - */ - xmlRelaxNGCheckGroupAttrs(ctxt, cur); - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ELEM, - "Found forbidden pattern data/except//element(ref)\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_LIST) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ELEM, - "Found forbidden pattern list//element(ref)\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_ATTRIBUTE) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM, - "Found forbidden pattern attribute//element(ref)\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_ATTRIBUTE) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM, - "Found forbidden pattern attribute//element(ref)\n", - NULL, NULL); - } - /* - * reset since in the simple form elements are only child - * of grammar/define - */ - nflags = 0; - ret = - xmlRelaxNGCheckRules(ctxt, cur->attrs, nflags, cur->type); - if (ret != XML_RELAXNG_CONTENT_EMPTY) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_EMPTY, - "Element %s attributes have a content type error\n", - cur->name, NULL); - } - ret = - xmlRelaxNGCheckRules(ctxt, cur->content, nflags, - cur->type); - if (ret == XML_RELAXNG_CONTENT_ERROR) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_ERROR, - "Element %s has a content type error\n", - cur->name, NULL); - } else { - ret = XML_RELAXNG_CONTENT_COMPLEX; - } - } else if (cur->type == XML_RELAXNG_ATTRIBUTE) { - if (flags & XML_RELAXNG_IN_ATTRIBUTE) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ATTR, - "Found forbidden pattern attribute//attribute\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_LIST) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ATTR, - "Found forbidden pattern list//attribute\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_OOMGROUP) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_GROUP_ATTR, - "Found forbidden pattern oneOrMore//group//attribute\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_OOMINTERLEAVE) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR, - "Found forbidden pattern oneOrMore//interleave//attribute\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ATTR, - "Found forbidden pattern data/except//attribute\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ATTR, - "Found forbidden pattern start//attribute\n", - NULL, NULL); - } - if ((!(flags & XML_RELAXNG_IN_ONEORMORE)) - && (cur->name == NULL)) { - if (cur->ns == NULL) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR, - "Found anyName attribute without oneOrMore ancestor\n", - NULL, NULL); - } else { - xmlRngPErr(ctxt, cur->node, XML_RNGP_NSNAME_ATTR_ANCESTOR, - "Found nsName attribute without oneOrMore ancestor\n", - NULL, NULL); - } - } - nflags = flags | XML_RELAXNG_IN_ATTRIBUTE; - xmlRelaxNGCheckRules(ctxt, cur->content, nflags, cur->type); - ret = XML_RELAXNG_CONTENT_EMPTY; - } else if ((cur->type == XML_RELAXNG_ONEORMORE) || - (cur->type == XML_RELAXNG_ZEROORMORE)) { - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ONEMORE, - "Found forbidden pattern data/except//oneOrMore\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ONEMORE, - "Found forbidden pattern start//oneOrMore\n", - NULL, NULL); - } - nflags = flags | XML_RELAXNG_IN_ONEORMORE; - ret = - xmlRelaxNGCheckRules(ctxt, cur->content, nflags, - cur->type); - ret = xmlRelaxNGGroupContentType(ret, ret); - } else if (cur->type == XML_RELAXNG_LIST) { - if (flags & XML_RELAXNG_IN_LIST) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_LIST, - "Found forbidden pattern list//list\n", NULL, - NULL); - } - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_LIST, - "Found forbidden pattern data/except//list\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_LIST, - "Found forbidden pattern start//list\n", NULL, - NULL); - } - nflags = flags | XML_RELAXNG_IN_LIST; - ret = - xmlRelaxNGCheckRules(ctxt, cur->content, nflags, - cur->type); - } else if (cur->type == XML_RELAXNG_GROUP) { - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_GROUP, - "Found forbidden pattern data/except//group\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_GROUP, - "Found forbidden pattern start//group\n", NULL, - NULL); - } - if (flags & XML_RELAXNG_IN_ONEORMORE) - nflags = flags | XML_RELAXNG_IN_OOMGROUP; - else - nflags = flags; - ret = - xmlRelaxNGCheckRules(ctxt, cur->content, nflags, - cur->type); - /* - * The 7.3 Attribute derivation rule for groups is plugged there - */ - xmlRelaxNGCheckGroupAttrs(ctxt, cur); - } else if (cur->type == XML_RELAXNG_INTERLEAVE) { - if (flags & XML_RELAXNG_IN_LIST) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_INTERLEAVE, - "Found forbidden pattern list//interleave\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, - "Found forbidden pattern data/except//interleave\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, - "Found forbidden pattern start//interleave\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_ONEORMORE) - nflags = flags | XML_RELAXNG_IN_OOMINTERLEAVE; - else - nflags = flags; - ret = - xmlRelaxNGCheckRules(ctxt, cur->content, nflags, - cur->type); - } else if (cur->type == XML_RELAXNG_EXCEPT) { - if ((cur->parent != NULL) && - (cur->parent->type == XML_RELAXNG_DATATYPE)) - nflags = flags | XML_RELAXNG_IN_DATAEXCEPT; - else - nflags = flags; - ret = - xmlRelaxNGCheckRules(ctxt, cur->content, nflags, - cur->type); - } else if (cur->type == XML_RELAXNG_DATATYPE) { - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_DATA, - "Found forbidden pattern start//data\n", NULL, - NULL); - } - xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); - ret = XML_RELAXNG_CONTENT_SIMPLE; - } else if (cur->type == XML_RELAXNG_VALUE) { - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_VALUE, - "Found forbidden pattern start//value\n", NULL, - NULL); - } - xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); - ret = XML_RELAXNG_CONTENT_SIMPLE; - } else if (cur->type == XML_RELAXNG_TEXT) { - if (flags & XML_RELAXNG_IN_LIST) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_TEXT, - "Found forbidden pattern list//text\n", NULL, - NULL); - } - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_TEXT, - "Found forbidden pattern data/except//text\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_TEXT, - "Found forbidden pattern start//text\n", NULL, - NULL); - } - ret = XML_RELAXNG_CONTENT_COMPLEX; - } else if (cur->type == XML_RELAXNG_EMPTY) { - if (flags & XML_RELAXNG_IN_DATAEXCEPT) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_EMPTY, - "Found forbidden pattern data/except//empty\n", - NULL, NULL); - } - if (flags & XML_RELAXNG_IN_START) { - xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_EMPTY, - "Found forbidden pattern start//empty\n", NULL, - NULL); - } - ret = XML_RELAXNG_CONTENT_EMPTY; - } else if (cur->type == XML_RELAXNG_CHOICE) { - xmlRelaxNGCheckChoiceDeterminism(ctxt, cur); - ret = - xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); - } else { - ret = - xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type); - } - cur = cur->next; - if (ptype == XML_RELAXNG_GROUP) { - val = xmlRelaxNGGroupContentType(val, ret); - } else if (ptype == XML_RELAXNG_INTERLEAVE) { - tmp = xmlRelaxNGGroupContentType(val, ret); - if (tmp != XML_RELAXNG_CONTENT_ERROR) - tmp = xmlRelaxNGMaxContentType(val, ret); - } else if (ptype == XML_RELAXNG_CHOICE) { - val = xmlRelaxNGMaxContentType(val, ret); - } else if (ptype == XML_RELAXNG_LIST) { - val = XML_RELAXNG_CONTENT_SIMPLE; - } else if (ptype == XML_RELAXNG_EXCEPT) { - if (ret == XML_RELAXNG_CONTENT_ERROR) - val = XML_RELAXNG_CONTENT_ERROR; - else - val = XML_RELAXNG_CONTENT_SIMPLE; - } else { - val = xmlRelaxNGGroupContentType(val, ret); - } - - } - return (val); -} - -/** - * xmlRelaxNGParseGrammar: - * @ctxt: a Relax-NG parser context - * @nodes: grammar children nodes - * - * parse a Relax-NG <grammar> node - * - * Returns the internal xmlRelaxNGGrammarPtr built or - * NULL in case of error - */ -static xmlRelaxNGGrammarPtr -xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) -{ - xmlRelaxNGGrammarPtr ret, tmp, old; - -#ifdef DEBUG_GRAMMAR - xmlGenericError(xmlGenericErrorContext, "Parsing a new grammar\n"); -#endif - - ret = xmlRelaxNGNewGrammar(ctxt); - if (ret == NULL) - return (NULL); - - /* - * Link the new grammar in the tree - */ - ret->parent = ctxt->grammar; - if (ctxt->grammar != NULL) { - tmp = ctxt->grammar->children; - if (tmp == NULL) { - ctxt->grammar->children = ret; - } else { - while (tmp->next != NULL) - tmp = tmp->next; - tmp->next = ret; - } - } - - old = ctxt->grammar; - ctxt->grammar = ret; - xmlRelaxNGParseGrammarContent(ctxt, nodes); - ctxt->grammar = ret; - if (ctxt->grammar == NULL) { - xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT, - "Failed to parse <grammar> content\n", NULL, NULL); - } else if (ctxt->grammar->start == NULL) { - xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_NO_START, - "Element <grammar> has no <start>\n", NULL, NULL); - } - - /* - * Apply 4.17 mergingd rules to defines and starts - */ - xmlRelaxNGCombineStart(ctxt, ret); - if (ret->defs != NULL) { - xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine, - ctxt); - } - - /* - * link together defines and refs in this grammar - */ - if (ret->refs != NULL) { - xmlHashScan(ret->refs, (xmlHashScanner) xmlRelaxNGCheckReference, - ctxt); - } - - ctxt->grammar = old; - return (ret); -} - -/** - * xmlRelaxNGParseDocument: - * @ctxt: a Relax-NG parser context - * @node: the root node of the RelaxNG schema - * - * parse a Relax-NG definition resource and build an internal - * xmlRelaxNG struture which can be used to validate instances. - * - * Returns the internal XML RelaxNG structure built or - * NULL in case of error - */ -static xmlRelaxNGPtr -xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlRelaxNGPtr schema = NULL; - const xmlChar *olddefine; - xmlRelaxNGGrammarPtr old; - - if ((ctxt == NULL) || (node == NULL)) - return (NULL); - - schema = xmlRelaxNGNewRelaxNG(ctxt); - if (schema == NULL) - return (NULL); - - olddefine = ctxt->define; - ctxt->define = NULL; - if (IS_RELAXNG(node, "grammar")) { - schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children); - } else { - xmlRelaxNGGrammarPtr tmp, ret; - - schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt); - if (schema->topgrammar == NULL) { - return (schema); - } - /* - * Link the new grammar in the tree - */ - ret->parent = ctxt->grammar; - if (ctxt->grammar != NULL) { - tmp = ctxt->grammar->children; - if (tmp == NULL) { - ctxt->grammar->children = ret; - } else { - while (tmp->next != NULL) - tmp = tmp->next; - tmp->next = ret; - } - } - old = ctxt->grammar; - ctxt->grammar = ret; - xmlRelaxNGParseStart(ctxt, node); - if (old != NULL) - ctxt->grammar = old; - } - ctxt->define = olddefine; - if (schema->topgrammar->start != NULL) { - xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0); - if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) { - xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL); - while ((schema->topgrammar->start != NULL) && - (schema->topgrammar->start->type == XML_RELAXNG_NOOP) && - (schema->topgrammar->start->next != NULL)) - schema->topgrammar->start = - schema->topgrammar->start->content; - xmlRelaxNGCheckRules(ctxt, schema->topgrammar->start, - XML_RELAXNG_IN_START, XML_RELAXNG_NOOP); - } - } -#ifdef DEBUG - if (schema == NULL) - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGParseDocument() failed\n"); -#endif - - return (schema); -} - -/************************************************************************ - * * - * Reading RelaxNGs * - * * - ************************************************************************/ - -/** - * xmlRelaxNGNewParserCtxt: - * @URL: the location of the schema - * - * Create an XML RelaxNGs parse context for that file/resource expected - * to contain an XML RelaxNGs file. - * - * Returns the parser context or NULL in case of error - */ -xmlRelaxNGParserCtxtPtr -xmlRelaxNGNewParserCtxt(const char *URL) -{ - xmlRelaxNGParserCtxtPtr ret; - - if (URL == NULL) - return (NULL); - - ret = - (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); - if (ret == NULL) { - xmlRngPErrMemory(NULL, "building parser\n"); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); - ret->URL = xmlStrdup((const xmlChar *) URL); - ret->error = xmlGenericError; - ret->userData = xmlGenericErrorContext; - return (ret); -} - -/** - * xmlRelaxNGNewMemParserCtxt: - * @buffer: a pointer to a char array containing the schemas - * @size: the size of the array - * - * Create an XML RelaxNGs parse context for that memory buffer expected - * to contain an XML RelaxNGs file. - * - * Returns the parser context or NULL in case of error - */ -xmlRelaxNGParserCtxtPtr -xmlRelaxNGNewMemParserCtxt(const char *buffer, int size) -{ - xmlRelaxNGParserCtxtPtr ret; - - if ((buffer == NULL) || (size <= 0)) - return (NULL); - - ret = - (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); - if (ret == NULL) { - xmlRngPErrMemory(NULL, "building parser\n"); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); - ret->buffer = buffer; - ret->size = size; - ret->error = xmlGenericError; - ret->userData = xmlGenericErrorContext; - return (ret); -} - -/** - * xmlRelaxNGNewDocParserCtxt: - * @doc: a preparsed document tree - * - * Create an XML RelaxNGs parser context for that document. - * Note: since the process of compiling a RelaxNG schemas modifies the - * document, the @doc parameter is duplicated internally. - * - * Returns the parser context or NULL in case of error - */ -xmlRelaxNGParserCtxtPtr -xmlRelaxNGNewDocParserCtxt(xmlDocPtr doc) -{ - xmlRelaxNGParserCtxtPtr ret; - xmlDocPtr copy; - - if (doc == NULL) - return (NULL); - copy = xmlCopyDoc(doc, 1); - if (copy == NULL) - return (NULL); - - ret = - (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt)); - if (ret == NULL) { - xmlRngPErrMemory(NULL, "building parser\n"); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGParserCtxt)); - ret->document = copy; - ret->freedoc = 1; - ret->userData = xmlGenericErrorContext; - return (ret); -} - -/** - * xmlRelaxNGFreeParserCtxt: - * @ctxt: the schema parser context - * - * Free the resources associated to the schema parser context - */ -void -xmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxtPtr ctxt) -{ - if (ctxt == NULL) - return; - if (ctxt->URL != NULL) - xmlFree(ctxt->URL); - if (ctxt->doc != NULL) - xmlRelaxNGFreeDocument(ctxt->doc); - if (ctxt->interleaves != NULL) - xmlHashFree(ctxt->interleaves, NULL); - if (ctxt->documents != NULL) - xmlRelaxNGFreeDocumentList(ctxt->documents); - if (ctxt->includes != NULL) - xmlRelaxNGFreeIncludeList(ctxt->includes); - if (ctxt->docTab != NULL) - xmlFree(ctxt->docTab); - if (ctxt->incTab != NULL) - xmlFree(ctxt->incTab); - if (ctxt->defTab != NULL) { - int i; - - for (i = 0; i < ctxt->defNr; i++) - xmlRelaxNGFreeDefine(ctxt->defTab[i]); - xmlFree(ctxt->defTab); - } - if ((ctxt->document != NULL) && (ctxt->freedoc)) - xmlFreeDoc(ctxt->document); - xmlFree(ctxt); -} - -/** - * xmlRelaxNGNormExtSpace: - * @value: a value - * - * Removes the leading and ending spaces of the value - * The string is modified "in situ" - */ -static void -xmlRelaxNGNormExtSpace(xmlChar * value) -{ - xmlChar *start = value; - xmlChar *cur = value; - - if (value == NULL) - return; - - while (IS_BLANK_CH(*cur)) - cur++; - if (cur == start) { - do { - while ((*cur != 0) && (!IS_BLANK_CH(*cur))) - cur++; - if (*cur == 0) - return; - start = cur; - while (IS_BLANK_CH(*cur)) - cur++; - if (*cur == 0) { - *start = 0; - return; - } - } while (1); - } else { - do { - while ((*cur != 0) && (!IS_BLANK_CH(*cur))) - *start++ = *cur++; - if (*cur == 0) { - *start = 0; - return; - } - /* don't try to normalize the inner spaces */ - while (IS_BLANK_CH(*cur)) - cur++; - if (*cur == 0) { - *start = 0; - return; - } - *start++ = *cur++; - } while (1); - } -} - -/** - * xmlRelaxNGCleanupAttributes: - * @ctxt: a Relax-NG parser context - * @node: a Relax-NG node - * - * Check all the attributes on the given node - */ -static void -xmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlAttrPtr cur, next; - - cur = node->properties; - while (cur != NULL) { - next = cur->next; - if ((cur->ns == NULL) || - (xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) { - if (xmlStrEqual(cur->name, BAD_CAST "name")) { - if ((!xmlStrEqual(node->name, BAD_CAST "element")) && - (!xmlStrEqual(node->name, BAD_CAST "attribute")) && - (!xmlStrEqual(node->name, BAD_CAST "ref")) && - (!xmlStrEqual(node->name, BAD_CAST "parentRef")) && - (!xmlStrEqual(node->name, BAD_CAST "param")) && - (!xmlStrEqual(node->name, BAD_CAST "define"))) { - xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, - "Attribute %s is not allowed on %s\n", - cur->name, node->name); - } - } else if (xmlStrEqual(cur->name, BAD_CAST "type")) { - if ((!xmlStrEqual(node->name, BAD_CAST "value")) && - (!xmlStrEqual(node->name, BAD_CAST "data"))) { - xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, - "Attribute %s is not allowed on %s\n", - cur->name, node->name); - } - } else if (xmlStrEqual(cur->name, BAD_CAST "href")) { - if ((!xmlStrEqual(node->name, BAD_CAST "externalRef")) && - (!xmlStrEqual(node->name, BAD_CAST "include"))) { - xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, - "Attribute %s is not allowed on %s\n", - cur->name, node->name); - } - } else if (xmlStrEqual(cur->name, BAD_CAST "combine")) { - if ((!xmlStrEqual(node->name, BAD_CAST "start")) && - (!xmlStrEqual(node->name, BAD_CAST "define"))) { - xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE, - "Attribute %s is not allowed on %s\n", - cur->name, node->name); - } - } else if (xmlStrEqual(cur->name, BAD_CAST "datatypeLibrary")) { - xmlChar *val; - xmlURIPtr uri; - - val = xmlNodeListGetString(node->doc, cur->children, 1); - if (val != NULL) { - if (val[0] != 0) { - uri = xmlParseURI((const char *) val); - if (uri == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_INVALID_URI, - "Attribute %s contains invalid URI %s\n", - cur->name, val); - } else { - if (uri->scheme == NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_URI_NOT_ABSOLUTE, - "Attribute %s URI %s is not absolute\n", - cur->name, val); - } - if (uri->fragment != NULL) { - xmlRngPErr(ctxt, node, XML_RNGP_URI_FRAGMENT, - "Attribute %s URI %s has a fragment ID\n", - cur->name, val); - } - xmlFreeURI(uri); - } - } - xmlFree(val); - } - } else if (!xmlStrEqual(cur->name, BAD_CAST "ns")) { - xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_ATTRIBUTE, - "Unknown attribute %s on %s\n", cur->name, - node->name); - } - } - cur = next; - } -} - -/** - * xmlRelaxNGCleanupTree: - * @ctxt: a Relax-NG parser context - * @root: an xmlNodePtr subtree - * - * Cleanup the subtree from unwanted nodes for parsing, resolve - * Include and externalRef lookups. - */ -static void -xmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root) -{ - xmlNodePtr cur, delete; - - delete = NULL; - cur = root; - while (cur != NULL) { - if (delete != NULL) { - xmlUnlinkNode(delete); - xmlFreeNode(delete); - delete = NULL; - } - if (cur->type == XML_ELEMENT_NODE) { - /* - * Simplification 4.1. Annotations - */ - if ((cur->ns == NULL) || - (!xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) { - if ((cur->parent != NULL) && - (cur->parent->type == XML_ELEMENT_NODE) && - ((xmlStrEqual(cur->parent->name, BAD_CAST "name")) || - (xmlStrEqual(cur->parent->name, BAD_CAST "value")) || - (xmlStrEqual(cur->parent->name, BAD_CAST "param")))) { - xmlRngPErr(ctxt, cur, XML_RNGP_FOREIGN_ELEMENT, - "element %s doesn't allow foreign elements\n", - cur->parent->name, NULL); - } - delete = cur; - goto skip_children; - } else { - xmlRelaxNGCleanupAttributes(ctxt, cur); - if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) { - xmlChar *href, *ns, *base, *URL; - xmlRelaxNGDocumentPtr docu; - xmlNodePtr tmp; - xmlURIPtr uri; - - ns = xmlGetProp(cur, BAD_CAST "ns"); - if (ns == NULL) { - tmp = cur->parent; - while ((tmp != NULL) && - (tmp->type == XML_ELEMENT_NODE)) { - ns = xmlGetProp(tmp, BAD_CAST "ns"); - if (ns != NULL) - break; - tmp = tmp->parent; - } - } - href = xmlGetProp(cur, BAD_CAST "href"); - if (href == NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF, - "xmlRelaxNGParse: externalRef has no href attribute\n", - NULL, NULL); - if (ns != NULL) - xmlFree(ns); - delete = cur; - goto skip_children; - } - uri = xmlParseURI((const char *) href); - if (uri == NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, - "Incorrect URI for externalRef %s\n", - href, NULL); - if (ns != NULL) - xmlFree(ns); - if (href != NULL) - xmlFree(href); - delete = cur; - goto skip_children; - } - if (uri->fragment != NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, - "Fragment forbidden in URI for externalRef %s\n", - href, NULL); - if (ns != NULL) - xmlFree(ns); - xmlFreeURI(uri); - if (href != NULL) - xmlFree(href); - delete = cur; - goto skip_children; - } - xmlFreeURI(uri); - base = xmlNodeGetBase(cur->doc, cur); - URL = xmlBuildURI(href, base); - if (URL == NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, - "Failed to compute URL for externalRef %s\n", - href, NULL); - if (ns != NULL) - xmlFree(ns); - if (href != NULL) - xmlFree(href); - if (base != NULL) - xmlFree(base); - delete = cur; - goto skip_children; - } - if (href != NULL) - xmlFree(href); - if (base != NULL) - xmlFree(base); - docu = xmlRelaxNGLoadExternalRef(ctxt, URL, ns); - if (docu == NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_EXTERNAL_REF_FAILURE, - "Failed to load externalRef %s\n", URL, - NULL); - if (ns != NULL) - xmlFree(ns); - xmlFree(URL); - delete = cur; - goto skip_children; - } - if (ns != NULL) - xmlFree(ns); - xmlFree(URL); - cur->psvi = docu; - } else if (xmlStrEqual(cur->name, BAD_CAST "include")) { - xmlChar *href, *ns, *base, *URL; - xmlRelaxNGIncludePtr incl; - xmlNodePtr tmp; - - href = xmlGetProp(cur, BAD_CAST "href"); - if (href == NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF, - "xmlRelaxNGParse: include has no href attribute\n", - NULL, NULL); - delete = cur; - goto skip_children; - } - base = xmlNodeGetBase(cur->doc, cur); - URL = xmlBuildURI(href, base); - if (URL == NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR, - "Failed to compute URL for include %s\n", - href, NULL); - if (href != NULL) - xmlFree(href); - if (base != NULL) - xmlFree(base); - delete = cur; - goto skip_children; - } - if (href != NULL) - xmlFree(href); - if (base != NULL) - xmlFree(base); - ns = xmlGetProp(cur, BAD_CAST "ns"); - if (ns == NULL) { - tmp = cur->parent; - while ((tmp != NULL) && - (tmp->type == XML_ELEMENT_NODE)) { - ns = xmlGetProp(tmp, BAD_CAST "ns"); - if (ns != NULL) - break; - tmp = tmp->parent; - } - } - incl = xmlRelaxNGLoadInclude(ctxt, URL, cur, ns); - if (ns != NULL) - xmlFree(ns); - if (incl == NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_INCLUDE_FAILURE, - "Failed to load include %s\n", URL, - NULL); - xmlFree(URL); - delete = cur; - goto skip_children; - } - xmlFree(URL); - cur->psvi = incl; - } else if ((xmlStrEqual(cur->name, BAD_CAST "element")) || - (xmlStrEqual(cur->name, BAD_CAST "attribute"))) - { - xmlChar *name, *ns; - xmlNodePtr text = NULL; - - /* - * Simplification 4.8. name attribute of element - * and attribute elements - */ - name = xmlGetProp(cur, BAD_CAST "name"); - if (name != NULL) { - if (cur->children == NULL) { - text = - xmlNewChild(cur, cur->ns, BAD_CAST "name", - name); - } else { - xmlNodePtr node; - - node = xmlNewDocNode(cur->doc, cur->ns, - BAD_CAST "name", NULL); - if (node != NULL) { - xmlAddPrevSibling(cur->children, node); - text = xmlNewText(name); - xmlAddChild(node, text); - text = node; - } - } - if (text == NULL) { - xmlRngPErr(ctxt, cur, XML_RNGP_CREATE_FAILURE, - "Failed to create a name %s element\n", - name, NULL); - } - xmlUnsetProp(cur, BAD_CAST "name"); - xmlFree(name); - ns = xmlGetProp(cur, BAD_CAST "ns"); - if (ns != NULL) { - if (text != NULL) { - xmlSetProp(text, BAD_CAST "ns", ns); - /* xmlUnsetProp(cur, BAD_CAST "ns"); */ - } - xmlFree(ns); - } else if (xmlStrEqual(cur->name, - BAD_CAST "attribute")) { - xmlSetProp(text, BAD_CAST "ns", BAD_CAST ""); - } - } - } else if ((xmlStrEqual(cur->name, BAD_CAST "name")) || - (xmlStrEqual(cur->name, BAD_CAST "nsName")) || - (xmlStrEqual(cur->name, BAD_CAST "value"))) { - /* - * Simplification 4.8. name attribute of element - * and attribute elements - */ - if (xmlHasProp(cur, BAD_CAST "ns") == NULL) { - xmlNodePtr node; - xmlChar *ns = NULL; - - node = cur->parent; - while ((node != NULL) && - (node->type == XML_ELEMENT_NODE)) { - ns = xmlGetProp(node, BAD_CAST "ns"); - if (ns != NULL) { - break; - } - node = node->parent; - } - if (ns == NULL) { - xmlSetProp(cur, BAD_CAST "ns", BAD_CAST ""); - } else { - xmlSetProp(cur, BAD_CAST "ns", ns); - xmlFree(ns); - } - } - if (xmlStrEqual(cur->name, BAD_CAST "name")) { - xmlChar *name, *local, *prefix; - - /* - * Simplification: 4.10. QNames - */ - name = xmlNodeGetContent(cur); - if (name != NULL) { - local = xmlSplitQName2(name, &prefix); - if (local != NULL) { - xmlNsPtr ns; - - ns = xmlSearchNs(cur->doc, cur, prefix); - if (ns == NULL) { - xmlRngPErr(ctxt, cur, - XML_RNGP_PREFIX_UNDEFINED, - "xmlRelaxNGParse: no namespace for prefix %s\n", - prefix, NULL); - } else { - xmlSetProp(cur, BAD_CAST "ns", - ns->href); - xmlNodeSetContent(cur, local); - } - xmlFree(local); - xmlFree(prefix); - } - xmlFree(name); - } - } - /* - * 4.16 - */ - if (xmlStrEqual(cur->name, BAD_CAST "nsName")) { - if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { - xmlRngPErr(ctxt, cur, - XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME, - "Found nsName/except//nsName forbidden construct\n", - NULL, NULL); - } - } - } else if ((xmlStrEqual(cur->name, BAD_CAST "except")) && - (cur != root)) { - int oldflags = ctxt->flags; - - /* - * 4.16 - */ - if ((cur->parent != NULL) && - (xmlStrEqual - (cur->parent->name, BAD_CAST "anyName"))) { - ctxt->flags |= XML_RELAXNG_IN_ANYEXCEPT; - xmlRelaxNGCleanupTree(ctxt, cur); - ctxt->flags = oldflags; - goto skip_children; - } else if ((cur->parent != NULL) && - (xmlStrEqual - (cur->parent->name, BAD_CAST "nsName"))) { - ctxt->flags |= XML_RELAXNG_IN_NSEXCEPT; - xmlRelaxNGCleanupTree(ctxt, cur); - ctxt->flags = oldflags; - goto skip_children; - } - } else if (xmlStrEqual(cur->name, BAD_CAST "anyName")) { - /* - * 4.16 - */ - if (ctxt->flags & XML_RELAXNG_IN_ANYEXCEPT) { - xmlRngPErr(ctxt, cur, - XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME, - "Found anyName/except//anyName forbidden construct\n", - NULL, NULL); - } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) { - xmlRngPErr(ctxt, cur, - XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, - "Found nsName/except//anyName forbidden construct\n", - NULL, NULL); - } - } - /* - * Thisd is not an else since "include" is transformed - * into a div - */ - if (xmlStrEqual(cur->name, BAD_CAST "div")) { - xmlChar *ns; - xmlNodePtr child, ins, tmp; - - /* - * implements rule 4.11 - */ - - ns = xmlGetProp(cur, BAD_CAST "ns"); - - child = cur->children; - ins = cur; - while (child != NULL) { - if (ns != NULL) { - if (!xmlHasProp(child, BAD_CAST "ns")) { - xmlSetProp(child, BAD_CAST "ns", ns); - } - } - tmp = child->next; - xmlUnlinkNode(child); - ins = xmlAddNextSibling(ins, child); - child = tmp; - } - if (ns != NULL) - xmlFree(ns); - /* - * Since we are about to delete cur, if it's nsDef is non-NULL we - * need to preserve it (it contains the ns definitions for the - * children we just moved). We'll just stick it on to the end - * of cur->parent's list, since it's never going to be re-serialized - * (bug 143738). - */ - if (cur->nsDef != NULL) { - xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef; - while (parDef->next != NULL) - parDef = parDef->next; - parDef->next = cur->nsDef; - cur->nsDef = NULL; - } - delete = cur; - goto skip_children; - } - } - } - /* - * Simplification 4.2 whitespaces - */ - else if ((cur->type == XML_TEXT_NODE) || - (cur->type == XML_CDATA_SECTION_NODE)) { - if (IS_BLANK_NODE(cur)) { - if (cur->parent->type == XML_ELEMENT_NODE) { - if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value")) - && - (!xmlStrEqual - (cur->parent->name, BAD_CAST "param"))) - delete = cur; - } else { - delete = cur; - goto skip_children; - } - } - } else { - delete = cur; - goto skip_children; - } - - /* - * Skip to next node - */ - 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; - } - } - skip_children: - if (cur->next != NULL) { - cur = cur->next; - continue; - } - - do { - cur = cur->parent; - if (cur == NULL) - break; - if (cur == root) { - cur = NULL; - break; - } - if (cur->next != NULL) { - cur = cur->next; - break; - } - } while (cur != NULL); - } - if (delete != NULL) { - xmlUnlinkNode(delete); - xmlFreeNode(delete); - delete = NULL; - } -} - -/** - * xmlRelaxNGCleanupDoc: - * @ctxt: a Relax-NG parser context - * @doc: an xmldocPtr document pointer - * - * Cleanup the document from unwanted nodes for parsing, resolve - * Include and externalRef lookups. - * - * Returns the cleaned up document or NULL in case of error - */ -static xmlDocPtr -xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc) -{ - xmlNodePtr root; - - /* - * Extract the root - */ - root = xmlDocGetRootElement(doc); - if (root == NULL) { - xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", - ctxt->URL, NULL); - return (NULL); - } - xmlRelaxNGCleanupTree(ctxt, root); - return (doc); -} - -/** - * xmlRelaxNGParse: - * @ctxt: a Relax-NG parser context - * - * parse a schema definition resource and build an internal - * XML Shema struture which can be used to validate instances. - * - * Returns the internal XML RelaxNG structure built from the resource or - * NULL in case of error - */ -xmlRelaxNGPtr -xmlRelaxNGParse(xmlRelaxNGParserCtxtPtr ctxt) -{ - xmlRelaxNGPtr ret = NULL; - xmlDocPtr doc; - xmlNodePtr root; - - xmlRelaxNGInitTypes(); - - if (ctxt == NULL) - return (NULL); - - /* - * First step is to parse the input document into an DOM/Infoset - */ - if (ctxt->URL != NULL) { - doc = xmlReadFile((const char *) ctxt->URL,NULL,0); - if (doc == NULL) { - xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, - "xmlRelaxNGParse: could not load %s\n", ctxt->URL, - NULL); - return (NULL); - } - } else if (ctxt->buffer != NULL) { - doc = xmlReadMemory(ctxt->buffer, ctxt->size,NULL,NULL,0); - if (doc == NULL) { - xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR, - "xmlRelaxNGParse: could not parse schemas\n", NULL, - NULL); - return (NULL); - } - doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); - ctxt->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); - } else if (ctxt->document != NULL) { - doc = ctxt->document; - } else { - xmlRngPErr(ctxt, NULL, XML_RNGP_EMPTY, - "xmlRelaxNGParse: nothing to parse\n", NULL, NULL); - return (NULL); - } - ctxt->document = doc; - - /* - * Some preprocessing of the document content - */ - doc = xmlRelaxNGCleanupDoc(ctxt, doc); - if (doc == NULL) { - xmlFreeDoc(ctxt->document); - ctxt->document = NULL; - return (NULL); - } - - /* - * Then do the parsing for good - */ - root = xmlDocGetRootElement(doc); - if (root == NULL) { - xmlRngPErr(ctxt, (xmlNodePtr) doc, - XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", - (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL); - - xmlFreeDoc(ctxt->document); - ctxt->document = NULL; - return (NULL); - } - ret = xmlRelaxNGParseDocument(ctxt, root); - if (ret == NULL) { - xmlFreeDoc(ctxt->document); - ctxt->document = NULL; - return (NULL); - } - - /* - * Check the ref/defines links - */ - /* - * try to preprocess interleaves - */ - if (ctxt->interleaves != NULL) { - xmlHashScan(ctxt->interleaves, - (xmlHashScanner) xmlRelaxNGComputeInterleaves, ctxt); - } - - /* - * if there was a parsing error return NULL - */ - if (ctxt->nbErrors > 0) { - xmlRelaxNGFree(ret); - ctxt->document = NULL; - xmlFreeDoc(doc); - return (NULL); - } - - /* - * try to compile (parts of) the schemas - */ - if ((ret->topgrammar != NULL) && (ret->topgrammar->start != NULL)) { - if (ret->topgrammar->start->type != XML_RELAXNG_START) { - xmlRelaxNGDefinePtr def; - - def = xmlRelaxNGNewDefine(ctxt, NULL); - if (def != NULL) { - def->type = XML_RELAXNG_START; - def->content = ret->topgrammar->start; - ret->topgrammar->start = def; - } - } - xmlRelaxNGTryCompile(ctxt, ret->topgrammar->start); - } - - /* - * Transfer the pointer for cleanup at the schema level. - */ - ret->doc = doc; - ctxt->document = NULL; - ret->documents = ctxt->documents; - ctxt->documents = NULL; - - ret->includes = ctxt->includes; - ctxt->includes = NULL; - ret->defNr = ctxt->defNr; - ret->defTab = ctxt->defTab; - ctxt->defTab = NULL; - if (ctxt->idref == 1) - ret->idref = 1; - - return (ret); -} - -/** - * xmlRelaxNGSetParserErrors: - * @ctxt: a Relax-NG validation context - * @err: the error callback - * @warn: the warning callback - * @ctx: contextual data for the callbacks - * - * Set the callback functions used to handle errors for a validation context - */ -void -xmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGValidityErrorFunc err, - xmlRelaxNGValidityWarningFunc warn, void *ctx) -{ - if (ctxt == NULL) - return; - ctxt->error = err; - ctxt->warning = warn; - ctxt->serror = NULL; - ctxt->userData = ctx; -} - -/** - * xmlRelaxNGGetParserErrors: - * @ctxt: a Relax-NG validation context - * @err: the error callback result - * @warn: the warning callback result - * @ctx: contextual data for the callbacks result - * - * Get the callback information used to handle errors for a validation context - * - * Returns -1 in case of failure, 0 otherwise. - */ -int -xmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, - xmlRelaxNGValidityErrorFunc * err, - xmlRelaxNGValidityWarningFunc * warn, void **ctx) -{ - if (ctxt == NULL) - return (-1); - if (err != NULL) - *err = ctxt->error; - if (warn != NULL) - *warn = ctxt->warning; - if (ctx != NULL) - *ctx = ctxt->userData; - return (0); -} - -/** - * xmlRelaxNGSetParserStructuredErrors: - * @ctxt: a Relax-NG parser context - * @serror: the error callback - * @ctx: contextual data for the callbacks - * - * Set the callback functions used to handle errors for a parsing context - */ -void -xmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt, - xmlStructuredErrorFunc serror, - void *ctx) -{ - if (ctxt == NULL) - return; - ctxt->serror = serror; - ctxt->error = NULL; - ctxt->warning = NULL; - ctxt->userData = ctx; -} - -#ifdef LIBXML_OUTPUT_ENABLED - -/************************************************************************ - * * - * Dump back a compiled form * - * * - ************************************************************************/ -static void xmlRelaxNGDumpDefine(FILE * output, - xmlRelaxNGDefinePtr define); - -/** - * xmlRelaxNGDumpDefines: - * @output: the file output - * @defines: a list of define structures - * - * Dump a RelaxNG structure back - */ -static void -xmlRelaxNGDumpDefines(FILE * output, xmlRelaxNGDefinePtr defines) -{ - while (defines != NULL) { - xmlRelaxNGDumpDefine(output, defines); - defines = defines->next; - } -} - -/** - * xmlRelaxNGDumpDefine: - * @output: the file output - * @define: a define structure - * - * Dump a RelaxNG structure back - */ -static void -xmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define) -{ - if (define == NULL) - return; - switch (define->type) { - case XML_RELAXNG_EMPTY: - fprintf(output, "<empty/>\n"); - break; - case XML_RELAXNG_NOT_ALLOWED: - fprintf(output, "<notAllowed/>\n"); - break; - case XML_RELAXNG_TEXT: - fprintf(output, "<text/>\n"); - break; - case XML_RELAXNG_ELEMENT: - fprintf(output, "<element>\n"); - if (define->name != NULL) { - fprintf(output, "<name"); - if (define->ns != NULL) - fprintf(output, " ns=\"%s\"", define->ns); - fprintf(output, ">%s</name>\n", define->name); - } - xmlRelaxNGDumpDefines(output, define->attrs); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</element>\n"); - break; - case XML_RELAXNG_LIST: - fprintf(output, "<list>\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</list>\n"); - break; - case XML_RELAXNG_ONEORMORE: - fprintf(output, "<oneOrMore>\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</oneOrMore>\n"); - break; - case XML_RELAXNG_ZEROORMORE: - fprintf(output, "<zeroOrMore>\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</zeroOrMore>\n"); - break; - case XML_RELAXNG_CHOICE: - fprintf(output, "<choice>\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</choice>\n"); - break; - case XML_RELAXNG_GROUP: - fprintf(output, "<group>\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</group>\n"); - break; - case XML_RELAXNG_INTERLEAVE: - fprintf(output, "<interleave>\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</interleave>\n"); - break; - case XML_RELAXNG_OPTIONAL: - fprintf(output, "<optional>\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</optional>\n"); - break; - case XML_RELAXNG_ATTRIBUTE: - fprintf(output, "<attribute>\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</attribute>\n"); - break; - case XML_RELAXNG_DEF: - fprintf(output, "<define"); - if (define->name != NULL) - fprintf(output, " name=\"%s\"", define->name); - fprintf(output, ">\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</define>\n"); - break; - case XML_RELAXNG_REF: - fprintf(output, "<ref"); - if (define->name != NULL) - fprintf(output, " name=\"%s\"", define->name); - fprintf(output, ">\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</ref>\n"); - break; - case XML_RELAXNG_PARENTREF: - fprintf(output, "<parentRef"); - if (define->name != NULL) - fprintf(output, " name=\"%s\"", define->name); - fprintf(output, ">\n"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</parentRef>\n"); - break; - case XML_RELAXNG_EXTERNALREF: - fprintf(output, "<externalRef>"); - xmlRelaxNGDumpDefines(output, define->content); - fprintf(output, "</externalRef>\n"); - break; - case XML_RELAXNG_DATATYPE: - case XML_RELAXNG_VALUE: - TODO break; - case XML_RELAXNG_START: - case XML_RELAXNG_EXCEPT: - case XML_RELAXNG_PARAM: - TODO break; - case XML_RELAXNG_NOOP: - xmlRelaxNGDumpDefines(output, define->content); - break; - } -} - -/** - * xmlRelaxNGDumpGrammar: - * @output: the file output - * @grammar: a grammar structure - * @top: is this a top grammar - * - * Dump a RelaxNG structure back - */ -static void -xmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top) -{ - if (grammar == NULL) - return; - - fprintf(output, "<grammar"); - if (top) - fprintf(output, " xmlns=\"http://relaxng.org/ns/structure/1.0\""); - switch (grammar->combine) { - case XML_RELAXNG_COMBINE_UNDEFINED: - break; - case XML_RELAXNG_COMBINE_CHOICE: - fprintf(output, " combine=\"choice\""); - break; - case XML_RELAXNG_COMBINE_INTERLEAVE: - fprintf(output, " combine=\"interleave\""); - break; - default: - fprintf(output, " <!-- invalid combine value -->"); - } - fprintf(output, ">\n"); - if (grammar->start == NULL) { - fprintf(output, " <!-- grammar had no start -->"); - } else { - fprintf(output, "<start>\n"); - xmlRelaxNGDumpDefine(output, grammar->start); - fprintf(output, "</start>\n"); - } - /* TODO ? Dump the defines ? */ - fprintf(output, "</grammar>\n"); -} - -/** - * xmlRelaxNGDump: - * @output: the file output - * @schema: a schema structure - * - * Dump a RelaxNG structure back - */ -void -xmlRelaxNGDump(FILE * output, xmlRelaxNGPtr schema) -{ - if (output == NULL) - return; - if (schema == NULL) { - fprintf(output, "RelaxNG empty or failed to compile\n"); - return; - } - fprintf(output, "RelaxNG: "); - if (schema->doc == NULL) { - fprintf(output, "no document\n"); - } else if (schema->doc->URL != NULL) { - fprintf(output, "%s\n", schema->doc->URL); - } else { - fprintf(output, "\n"); - } - if (schema->topgrammar == NULL) { - fprintf(output, "RelaxNG has no top grammar\n"); - return; - } - xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1); -} - -/** - * xmlRelaxNGDumpTree: - * @output: the file output - * @schema: a schema structure - * - * Dump the transformed RelaxNG tree. - */ -void -xmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema) -{ - if (output == NULL) - return; - if (schema == NULL) { - fprintf(output, "RelaxNG empty or failed to compile\n"); - return; - } - if (schema->doc == NULL) { - fprintf(output, "no document\n"); - } else { - xmlDocDump(output, schema->doc); - } -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/************************************************************************ - * * - * Validation of compiled content * - * * - ************************************************************************/ -static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define); - -/** - * xmlRelaxNGValidateCompiledCallback: - * @exec: the regular expression instance - * @token: the token which matched - * @transdata: callback data, the define for the subelement if available - @ @inputdata: callback data, the Relax NG validation context - * - * Handle the callback and if needed validate the element children. - */ -static void -xmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED, - const xmlChar * token, - void *transdata, void *inputdata) -{ - xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; - xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; - int ret; - -#ifdef DEBUG_COMPILE - xmlGenericError(xmlGenericErrorContext, - "Compiled callback for: '%s'\n", token); -#endif - if (ctxt == NULL) { - fprintf(stderr, "callback on %s missing context\n", token); - return; - } - if (define == NULL) { - if (token[0] == '#') - return; - fprintf(stderr, "callback on %s missing define\n", token); - if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) - ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; - return; - } - if ((ctxt == NULL) || (define == NULL)) { - fprintf(stderr, "callback on %s missing info\n", token); - if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) - ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; - return; - } else if (define->type != XML_RELAXNG_ELEMENT) { - fprintf(stderr, "callback on %s define is not element\n", token); - if (ctxt->errNo == XML_RELAXNG_OK) - ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; - return; - } - ret = xmlRelaxNGValidateDefinition(ctxt, define); - if (ret != 0) - ctxt->perr = ret; -} - -/** - * xmlRelaxNGValidateCompiledContent: - * @ctxt: the RelaxNG validation context - * @regexp: the regular expression as compiled - * @content: list of children to test against the regexp - * - * Validate the content model of an element or start using the regexp - * - * Returns 0 in case of success, -1 in case of error. - */ -static int -xmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt, - xmlRegexpPtr regexp, xmlNodePtr content) -{ - xmlRegExecCtxtPtr exec; - xmlNodePtr cur; - int ret = 0; - int oldperr; - - if ((ctxt == NULL) || (regexp == NULL)) - return (-1); - oldperr = ctxt->perr; - exec = xmlRegNewExecCtxt(regexp, - xmlRelaxNGValidateCompiledCallback, ctxt); - ctxt->perr = 0; - cur = content; - while (cur != NULL) { - ctxt->state->seq = cur; - switch (cur->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - if (xmlIsBlankNode(cur)) - break; - ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt); - if (ret < 0) { - VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, - cur->parent->name); - } - break; - case XML_ELEMENT_NODE: - if (cur->ns != NULL) { - ret = xmlRegExecPushString2(exec, cur->name, - cur->ns->href, ctxt); - } else { - ret = xmlRegExecPushString(exec, cur->name, ctxt); - } - if (ret < 0) { - VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, cur->name); - } - break; - default: - break; - } - if (ret < 0) - break; - /* - * Switch to next element - */ - cur = cur->next; - } - ret = xmlRegExecPushString(exec, NULL, NULL); - if (ret == 1) { - ret = 0; - ctxt->state->seq = NULL; - } else if (ret == 0) { - /* - * TODO: get some of the names needed to exit the current state of exec - */ - VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); - ret = -1; - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) - xmlRelaxNGDumpValidError(ctxt); - } else { - ret = -1; - } - xmlRegFreeExecCtxt(exec); - /* - * There might be content model errors outside of the pure - * regexp validation, e.g. for attribute values. - */ - if ((ret == 0) && (ctxt->perr != 0)) { - ret = ctxt->perr; - } - ctxt->perr = oldperr; - return (ret); -} - -/************************************************************************ - * * - * Progressive validation of when possible * - * * - ************************************************************************/ -static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr defines); -static int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, - int dolog); -static void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt); - -/** - * xmlRelaxNGElemPush: - * @ctxt: the validation context - * @exec: the regexp runtime for the new content model - * - * Push a new regexp for the current node content model on the stack - * - * Returns 0 in case of success and -1 in case of error. - */ -static int -xmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec) -{ - if (ctxt->elemTab == NULL) { - ctxt->elemMax = 10; - ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax * - sizeof - (xmlRegExecCtxtPtr)); - if (ctxt->elemTab == NULL) { - xmlRngVErrMemory(ctxt, "validating\n"); - return (-1); - } - } - if (ctxt->elemNr >= ctxt->elemMax) { - ctxt->elemMax *= 2; - ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab, - ctxt->elemMax * - sizeof - (xmlRegExecCtxtPtr)); - if (ctxt->elemTab == NULL) { - xmlRngVErrMemory(ctxt, "validating\n"); - return (-1); - } - } - ctxt->elemTab[ctxt->elemNr++] = exec; - ctxt->elem = exec; - return (0); -} - -/** - * xmlRelaxNGElemPop: - * @ctxt: the validation context - * - * Pop the regexp of the current node content model from the stack - * - * Returns the exec or NULL if empty - */ -static xmlRegExecCtxtPtr -xmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt) -{ - xmlRegExecCtxtPtr ret; - - if (ctxt->elemNr <= 0) - return (NULL); - ctxt->elemNr--; - ret = ctxt->elemTab[ctxt->elemNr]; - ctxt->elemTab[ctxt->elemNr] = NULL; - if (ctxt->elemNr > 0) - ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1]; - else - ctxt->elem = NULL; - return (ret); -} - -/** - * xmlRelaxNGValidateProgressiveCallback: - * @exec: the regular expression instance - * @token: the token which matched - * @transdata: callback data, the define for the subelement if available - @ @inputdata: callback data, the Relax NG validation context - * - * Handle the callback and if needed validate the element children. - * some of the in/out informations are passed via the context in @inputdata. - */ -static void -xmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec - ATTRIBUTE_UNUSED, - const xmlChar * token, - void *transdata, void *inputdata) -{ - xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; - xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; - xmlRelaxNGValidStatePtr state, oldstate; - xmlNodePtr node; - int ret = 0, oldflags; - -#ifdef DEBUG_PROGRESSIVE - xmlGenericError(xmlGenericErrorContext, - "Progressive callback for: '%s'\n", token); -#endif - if (ctxt == NULL) { - fprintf(stderr, "callback on %s missing context\n", token); - return; - } - node = ctxt->pnode; - ctxt->pstate = 1; - if (define == NULL) { - if (token[0] == '#') - return; - fprintf(stderr, "callback on %s missing define\n", token); - if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) - ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; - ctxt->pstate = -1; - return; - } - if ((ctxt == NULL) || (define == NULL)) { - fprintf(stderr, "callback on %s missing info\n", token); - if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) - ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; - ctxt->pstate = -1; - return; - } else if (define->type != XML_RELAXNG_ELEMENT) { - fprintf(stderr, "callback on %s define is not element\n", token); - if (ctxt->errNo == XML_RELAXNG_OK) - ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; - ctxt->pstate = -1; - return; - } - if (node->type != XML_ELEMENT_NODE) { - VALID_ERR(XML_RELAXNG_ERR_NOTELEM); - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) - xmlRelaxNGDumpValidError(ctxt); - ctxt->pstate = -1; - return; - } - if (define->contModel == NULL) { - /* - * this node cannot be validated in a streamable fashion - */ -#ifdef DEBUG_PROGRESSIVE - xmlGenericError(xmlGenericErrorContext, - "Element '%s' validation is not streamable\n", - token); -#endif - ctxt->pstate = 0; - ctxt->pdef = define; - return; - } - exec = xmlRegNewExecCtxt(define->contModel, - xmlRelaxNGValidateProgressiveCallback, ctxt); - if (exec == NULL) { - ctxt->pstate = -1; - return; - } - xmlRelaxNGElemPush(ctxt, exec); - - /* - * Validate the attributes part of the content. - */ - state = xmlRelaxNGNewValidState(ctxt, node); - if (state == NULL) { - ctxt->pstate = -1; - return; - } - oldstate = ctxt->state; - ctxt->state = state; - if (define->attrs != NULL) { - ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); - if (ret != 0) { - ctxt->pstate = -1; - VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); - } - } - if (ctxt->state != NULL) { - ctxt->state->seq = NULL; - ret = xmlRelaxNGValidateElementEnd(ctxt, 1); - if (ret != 0) { - ctxt->pstate = -1; - } - xmlRelaxNGFreeValidState(ctxt, ctxt->state); - } else if (ctxt->states != NULL) { - int tmp = -1, i; - - oldflags = ctxt->flags; - - for (i = 0; i < ctxt->states->nbState; i++) { - state = ctxt->states->tabState[i]; - ctxt->state = state; - ctxt->state->seq = NULL; - - if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { - tmp = 0; - break; - } - } - if (tmp != 0) { - /* - * validation error, log the message for the "best" one - */ - ctxt->flags |= FLAGS_IGNORABLE; - xmlRelaxNGLogBestError(ctxt); - } - for (i = 0; i < ctxt->states->nbState; i++) { - xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]); - } - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->states = NULL; - if ((ret == 0) && (tmp == -1)) - ctxt->pstate = -1; - ctxt->flags = oldflags; - } - if (ctxt->pstate == -1) { - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { - xmlRelaxNGDumpValidError(ctxt); - } - } - ctxt->state = oldstate; -} - -/** - * xmlRelaxNGValidatePushElement: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * - * Push a new element start on the RelaxNG validation stack. - * - * returns 1 if no validation problem was found or 0 if validating the - * element requires a full node, and -1 in case of error. - */ -int -xmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt, - xmlDocPtr doc ATTRIBUTE_UNUSED, - xmlNodePtr elem) -{ - int ret = 1; - - if ((ctxt == NULL) || (elem == NULL)) - return (-1); - -#ifdef DEBUG_PROGRESSIVE - xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name); -#endif - if (ctxt->elem == 0) { - xmlRelaxNGPtr schema; - xmlRelaxNGGrammarPtr grammar; - xmlRegExecCtxtPtr exec; - xmlRelaxNGDefinePtr define; - - schema = ctxt->schema; - if (schema == NULL) { - VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); - return (-1); - } - grammar = schema->topgrammar; - if ((grammar == NULL) || (grammar->start == NULL)) { - VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); - return (-1); - } - define = grammar->start; - if (define->contModel == NULL) { - ctxt->pdef = define; - return (0); - } - exec = xmlRegNewExecCtxt(define->contModel, - xmlRelaxNGValidateProgressiveCallback, - ctxt); - if (exec == NULL) { - return (-1); - } - xmlRelaxNGElemPush(ctxt, exec); - } - ctxt->pnode = elem; - ctxt->pstate = 0; - if (elem->ns != NULL) { - ret = - xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href, - ctxt); - } else { - ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt); - } - if (ret < 0) { - VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, elem->name); - } else { - if (ctxt->pstate == 0) - ret = 0; - else if (ctxt->pstate < 0) - ret = -1; - else - ret = 1; - } -#ifdef DEBUG_PROGRESSIVE - if (ret < 0) - xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n", - elem->name); -#endif - return (ret); -} - -/** - * xmlRelaxNGValidatePushCData: - * @ctxt: the RelaxNG validation context - * @data: some character data read - * @len: the length of the data - * - * check the CData parsed for validation in the current stack - * - * returns 1 if no validation problem was found or -1 otherwise - */ -int -xmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt, - const xmlChar * data, int len ATTRIBUTE_UNUSED) -{ - int ret = 1; - - if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL)) - return (-1); - -#ifdef DEBUG_PROGRESSIVE - xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len); -#endif - - while (*data != 0) { - if (!IS_BLANK_CH(*data)) - break; - data++; - } - if (*data == 0) - return (1); - - ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt); - if (ret < 0) { - VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO "); -#ifdef DEBUG_PROGRESSIVE - xmlGenericError(xmlGenericErrorContext, "CDATA failed\n"); -#endif - - return (-1); - } - return (1); -} - -/** - * xmlRelaxNGValidatePopElement: - * @ctxt: the RelaxNG validation context - * @doc: a document instance - * @elem: an element instance - * - * Pop the element end from the RelaxNG validation stack. - * - * returns 1 if no validation problem was found or 0 otherwise - */ -int -xmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt, - xmlDocPtr doc ATTRIBUTE_UNUSED, - xmlNodePtr elem) -{ - int ret; - xmlRegExecCtxtPtr exec; - - if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL)) - return (-1); -#ifdef DEBUG_PROGRESSIVE - xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name); -#endif - /* - * verify that we reached a terminal state of the content model. - */ - exec = xmlRelaxNGElemPop(ctxt); - ret = xmlRegExecPushString(exec, NULL, NULL); - if (ret == 0) { - /* - * TODO: get some of the names needed to exit the current state of exec - */ - VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); - ret = -1; - } else if (ret < 0) { - ret = -1; - } else { - ret = 1; - } - xmlRegFreeExecCtxt(exec); -#ifdef DEBUG_PROGRESSIVE - if (ret < 0) - xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n", - elem->name); -#endif - return (ret); -} - -/** - * xmlRelaxNGValidateFullElement: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * - * Validate a full subtree when xmlRelaxNGValidatePushElement() returned - * 0 and the content of the node has been expanded. - * - * returns 1 if no validation problem was found or -1 in case of error. - */ -int -xmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt, - xmlDocPtr doc ATTRIBUTE_UNUSED, - xmlNodePtr elem) -{ - int ret; - xmlRelaxNGValidStatePtr state; - - if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL)) - return (-1); -#ifdef DEBUG_PROGRESSIVE - xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name); -#endif - state = xmlRelaxNGNewValidState(ctxt, elem->parent); - if (state == NULL) { - return (-1); - } - state->seq = elem; - ctxt->state = state; - ctxt->errNo = XML_RELAXNG_OK; - ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef); - if ((ret != 0) || (ctxt->errNo != XML_RELAXNG_OK)) - ret = -1; - else - ret = 1; - xmlRelaxNGFreeValidState(ctxt, state); - ctxt->state = NULL; -#ifdef DEBUG_PROGRESSIVE - if (ret < 0) - xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n", - elem->name); -#endif - return (ret); -} - -/************************************************************************ - * * - * Generic interpreted validation implementation * - * * - ************************************************************************/ -static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define); - -/** - * xmlRelaxNGSkipIgnored: - * @ctxt: a schema validation context - * @node: the top node. - * - * Skip ignorable nodes in that context - * - * Returns the new sibling or NULL in case of error. - */ -static xmlNodePtr -xmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlNodePtr node) -{ - /* - * TODO complete and handle entities - */ - while ((node != NULL) && - ((node->type == XML_COMMENT_NODE) || - (node->type == XML_PI_NODE) || - (node->type == XML_XINCLUDE_START) || - (node->type == XML_XINCLUDE_END) || - (((node->type == XML_TEXT_NODE) || - (node->type == XML_CDATA_SECTION_NODE)) && - ((ctxt->flags & FLAGS_MIXED_CONTENT) || - (IS_BLANK_NODE(node)))))) { - node = node->next; - } - return (node); -} - -/** - * xmlRelaxNGNormalize: - * @ctxt: a schema validation context - * @str: the string to normalize - * - * Implements the normalizeWhiteSpace( s ) function from - * section 6.2.9 of the spec - * - * Returns the new string or NULL in case of error. - */ -static xmlChar * -xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str) -{ - xmlChar *ret, *p; - const xmlChar *tmp; - int len; - - if (str == NULL) - return (NULL); - tmp = str; - while (*tmp != 0) - tmp++; - len = tmp - str; - - ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlRngVErrMemory(ctxt, "validating\n"); - return (NULL); - } - p = ret; - while (IS_BLANK_CH(*str)) - str++; - while (*str != 0) { - if (IS_BLANK_CH(*str)) { - while (IS_BLANK_CH(*str)) - str++; - if (*str == 0) - break; - *p++ = ' '; - } else - *p++ = *str++; - } - *p = 0; - return (ret); -} - -/** - * xmlRelaxNGValidateDatatype: - * @ctxt: a Relax-NG validation context - * @value: the string value - * @type: the datatype definition - * @node: the node - * - * Validate the given value against the dataype - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt, - const xmlChar * value, - xmlRelaxNGDefinePtr define, xmlNodePtr node) -{ - int ret, tmp; - xmlRelaxNGTypeLibraryPtr lib; - void *result = NULL; - xmlRelaxNGDefinePtr cur; - - if ((define == NULL) || (define->data == NULL)) { - return (-1); - } - lib = (xmlRelaxNGTypeLibraryPtr) define->data; - if (lib->check != NULL) { - if ((define->attrs != NULL) && - (define->attrs->type == XML_RELAXNG_PARAM)) { - ret = - lib->check(lib->data, define->name, value, &result, node); - } else { - ret = lib->check(lib->data, define->name, value, NULL, node); - } - } else - ret = -1; - if (ret < 0) { - VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name); - if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) - lib->freef(lib->data, result); - return (-1); - } else if (ret == 1) { - ret = 0; - } else if (ret == 2) { - VALID_ERR2P(XML_RELAXNG_ERR_DUPID, value); - } else { - VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value); - ret = -1; - } - cur = define->attrs; - while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) { - if (lib->facet != NULL) { - tmp = lib->facet(lib->data, define->name, cur->name, - cur->value, value, result); - if (tmp != 0) - ret = -1; - } - cur = cur->next; - } - if ((ret == 0) && (define->content != NULL)) { - const xmlChar *oldvalue, *oldendvalue; - - oldvalue = ctxt->state->value; - oldendvalue = ctxt->state->endvalue; - ctxt->state->value = (xmlChar *) value; - ctxt->state->endvalue = NULL; - ret = xmlRelaxNGValidateValue(ctxt, define->content); - ctxt->state->value = (xmlChar *) oldvalue; - ctxt->state->endvalue = (xmlChar *) oldendvalue; - } - if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) - lib->freef(lib->data, result); - return (ret); -} - -/** - * xmlRelaxNGNextValue: - * @ctxt: a Relax-NG validation context - * - * Skip to the next value when validating within a list - * - * Returns 0 if the operation succeeded or an error code. - */ -static int -xmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt) -{ - xmlChar *cur; - - cur = ctxt->state->value; - if ((cur == NULL) || (ctxt->state->endvalue == NULL)) { - ctxt->state->value = NULL; - ctxt->state->endvalue = NULL; - return (0); - } - while (*cur != 0) - cur++; - while ((cur != ctxt->state->endvalue) && (*cur == 0)) - cur++; - if (cur == ctxt->state->endvalue) - ctxt->state->value = NULL; - else - ctxt->state->value = cur; - return (0); -} - -/** - * xmlRelaxNGValidateValueList: - * @ctxt: a Relax-NG validation context - * @defines: the list of definitions to verify - * - * Validate the given set of definitions for the current value - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr defines) -{ - int ret = 0; - - while (defines != NULL) { - ret = xmlRelaxNGValidateValue(ctxt, defines); - if (ret != 0) - break; - defines = defines->next; - } - return (ret); -} - -/** - * xmlRelaxNGValidateValue: - * @ctxt: a Relax-NG validation context - * @define: the definition to verify - * - * Validate the given definition for the current value - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define) -{ - int ret = 0, oldflags; - xmlChar *value; - - value = ctxt->state->value; - switch (define->type) { - case XML_RELAXNG_EMPTY:{ - if ((value != NULL) && (value[0] != 0)) { - int idx = 0; - - while (IS_BLANK_CH(value[idx])) - idx++; - if (value[idx] != 0) - ret = -1; - } - break; - } - case XML_RELAXNG_TEXT: - break; - case XML_RELAXNG_VALUE:{ - if (!xmlStrEqual(value, define->value)) { - if (define->name != NULL) { - xmlRelaxNGTypeLibraryPtr lib; - - lib = (xmlRelaxNGTypeLibraryPtr) define->data; - if ((lib != NULL) && (lib->comp != NULL)) { - ret = lib->comp(lib->data, define->name, - define->value, define->node, - (void *) define->attrs, - value, ctxt->state->node); - } else - ret = -1; - if (ret < 0) { - VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, - define->name); - return (-1); - } else if (ret == 1) { - ret = 0; - } else { - ret = -1; - } - } else { - xmlChar *nval, *nvalue; - - /* - * TODO: trivial optimizations are possible by - * computing at compile-time - */ - nval = xmlRelaxNGNormalize(ctxt, define->value); - nvalue = xmlRelaxNGNormalize(ctxt, value); - - if ((nval == NULL) || (nvalue == NULL) || - (!xmlStrEqual(nval, nvalue))) - ret = -1; - if (nval != NULL) - xmlFree(nval); - if (nvalue != NULL) - xmlFree(nvalue); - } - } - if (ret == 0) - xmlRelaxNGNextValue(ctxt); - break; - } - case XML_RELAXNG_DATATYPE:{ - ret = xmlRelaxNGValidateDatatype(ctxt, value, define, - ctxt->state->seq); - if (ret == 0) - xmlRelaxNGNextValue(ctxt); - - break; - } - case XML_RELAXNG_CHOICE:{ - xmlRelaxNGDefinePtr list = define->content; - xmlChar *oldvalue; - - oldflags = ctxt->flags; - ctxt->flags |= FLAGS_IGNORABLE; - - oldvalue = ctxt->state->value; - while (list != NULL) { - ret = xmlRelaxNGValidateValue(ctxt, list); - if (ret == 0) { - break; - } - ctxt->state->value = oldvalue; - list = list->next; - } - ctxt->flags = oldflags; - if (ret != 0) { - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) - xmlRelaxNGDumpValidError(ctxt); - } else { - if (ctxt->errNr > 0) - xmlRelaxNGPopErrors(ctxt, 0); - } - break; - } - case XML_RELAXNG_LIST:{ - xmlRelaxNGDefinePtr list = define->content; - xmlChar *oldvalue, *oldend, *val, *cur; - -#ifdef DEBUG_LIST - int nb_values = 0; -#endif - - oldvalue = ctxt->state->value; - oldend = ctxt->state->endvalue; - - val = xmlStrdup(oldvalue); - if (val == NULL) { - val = xmlStrdup(BAD_CAST ""); - } - if (val == NULL) { - VALID_ERR(XML_RELAXNG_ERR_NOSTATE); - return (-1); - } - cur = val; - while (*cur != 0) { - if (IS_BLANK_CH(*cur)) { - *cur = 0; - cur++; -#ifdef DEBUG_LIST - nb_values++; -#endif - while (IS_BLANK_CH(*cur)) - *cur++ = 0; - } else - cur++; - } -#ifdef DEBUG_LIST - xmlGenericError(xmlGenericErrorContext, - "list value: '%s' found %d items\n", - oldvalue, nb_values); - nb_values = 0; -#endif - ctxt->state->endvalue = cur; - cur = val; - while ((*cur == 0) && (cur != ctxt->state->endvalue)) - cur++; - - ctxt->state->value = cur; - - while (list != NULL) { - if (ctxt->state->value == ctxt->state->endvalue) - ctxt->state->value = NULL; - ret = xmlRelaxNGValidateValue(ctxt, list); - if (ret != 0) { -#ifdef DEBUG_LIST - xmlGenericError(xmlGenericErrorContext, - "Failed to validate value: '%s' with %d rule\n", - ctxt->state->value, nb_values); -#endif - break; - } -#ifdef DEBUG_LIST - nb_values++; -#endif - list = list->next; - } - - if ((ret == 0) && (ctxt->state->value != NULL) && - (ctxt->state->value != ctxt->state->endvalue)) { - VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA, - ctxt->state->value); - ret = -1; - } - xmlFree(val); - ctxt->state->value = oldvalue; - ctxt->state->endvalue = oldend; - break; - } - case XML_RELAXNG_ONEORMORE: - ret = xmlRelaxNGValidateValueList(ctxt, define->content); - if (ret != 0) { - break; - } - /* no break on purpose */ - case XML_RELAXNG_ZEROORMORE:{ - xmlChar *cur, *temp; - - oldflags = ctxt->flags; - ctxt->flags |= FLAGS_IGNORABLE; - cur = ctxt->state->value; - temp = NULL; - while ((cur != NULL) && (cur != ctxt->state->endvalue) && - (temp != cur)) { - temp = cur; - ret = - xmlRelaxNGValidateValueList(ctxt, define->content); - if (ret != 0) { - ctxt->state->value = temp; - ret = 0; - break; - } - cur = ctxt->state->value; - } - ctxt->flags = oldflags; - if (ctxt->errNr > 0) - xmlRelaxNGPopErrors(ctxt, 0); - break; - } - case XML_RELAXNG_EXCEPT:{ - xmlRelaxNGDefinePtr list; - - list = define->content; - while (list != NULL) { - ret = xmlRelaxNGValidateValue(ctxt, list); - if (ret == 0) { - ret = -1; - break; - } else - ret = 0; - list = list->next; - } - break; - } - case XML_RELAXNG_DEF: - case XML_RELAXNG_GROUP:{ - xmlRelaxNGDefinePtr list; - - list = define->content; - while (list != NULL) { - ret = xmlRelaxNGValidateValue(ctxt, list); - if (ret != 0) { - ret = -1; - break; - } else - ret = 0; - list = list->next; - } - break; - } - case XML_RELAXNG_REF: - case XML_RELAXNG_PARENTREF: - ret = xmlRelaxNGValidateValue(ctxt, define->content); - break; - default: - TODO ret = -1; - } - return (ret); -} - -/** - * xmlRelaxNGValidateValueContent: - * @ctxt: a Relax-NG validation context - * @defines: the list of definitions to verify - * - * Validate the given definitions for the current value - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr defines) -{ - int ret = 0; - - while (defines != NULL) { - ret = xmlRelaxNGValidateValue(ctxt, defines); - if (ret != 0) - break; - defines = defines->next; - } - return (ret); -} - -/** - * xmlRelaxNGAttributeMatch: - * @ctxt: a Relax-NG validation context - * @define: the definition to check - * @prop: the attribute - * - * Check if the attribute matches the definition nameClass - * - * Returns 1 if the attribute matches, 0 if no, or -1 in case of error - */ -static int -xmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define, xmlAttrPtr prop) -{ - int ret; - - if (define->name != NULL) { - if (!xmlStrEqual(define->name, prop->name)) - return (0); - } - if (define->ns != NULL) { - if (define->ns[0] == 0) { - if (prop->ns != NULL) - return (0); - } else { - if ((prop->ns == NULL) || - (!xmlStrEqual(define->ns, prop->ns->href))) - return (0); - } - } - if (define->nameClass == NULL) - return (1); - define = define->nameClass; - if (define->type == XML_RELAXNG_EXCEPT) { - xmlRelaxNGDefinePtr list; - - list = define->content; - while (list != NULL) { - ret = xmlRelaxNGAttributeMatch(ctxt, list, prop); - if (ret == 1) - return (0); - if (ret < 0) - return (ret); - list = list->next; - } - } else { - TODO} - return (1); -} - -/** - * xmlRelaxNGValidateAttribute: - * @ctxt: a Relax-NG validation context - * @define: the definition to verify - * - * Validate the given attribute definition for that node - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define) -{ - int ret = 0, i; - xmlChar *value, *oldvalue; - xmlAttrPtr prop = NULL, tmp; - xmlNodePtr oldseq; - - if (ctxt->state->nbAttrLeft <= 0) - return (-1); - if (define->name != NULL) { - for (i = 0; i < ctxt->state->nbAttrs; i++) { - tmp = ctxt->state->attrs[i]; - if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) { - if ((((define->ns == NULL) || (define->ns[0] == 0)) && - (tmp->ns == NULL)) || - ((tmp->ns != NULL) && - (xmlStrEqual(define->ns, tmp->ns->href)))) { - prop = tmp; - break; - } - } - } - if (prop != NULL) { - value = xmlNodeListGetString(prop->doc, prop->children, 1); - oldvalue = ctxt->state->value; - oldseq = ctxt->state->seq; - ctxt->state->seq = (xmlNodePtr) prop; - ctxt->state->value = value; - ctxt->state->endvalue = NULL; - ret = xmlRelaxNGValidateValueContent(ctxt, define->content); - if (ctxt->state->value != NULL) - value = ctxt->state->value; - if (value != NULL) - xmlFree(value); - ctxt->state->value = oldvalue; - ctxt->state->seq = oldseq; - if (ret == 0) { - /* - * flag the attribute as processed - */ - ctxt->state->attrs[i] = NULL; - ctxt->state->nbAttrLeft--; - } - } else { - ret = -1; - } -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGValidateAttribute(%s): %d\n", - define->name, ret); -#endif - } else { - for (i = 0; i < ctxt->state->nbAttrs; i++) { - tmp = ctxt->state->attrs[i]; - if ((tmp != NULL) && - (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) { - prop = tmp; - break; - } - } - if (prop != NULL) { - value = xmlNodeListGetString(prop->doc, prop->children, 1); - oldvalue = ctxt->state->value; - oldseq = ctxt->state->seq; - ctxt->state->seq = (xmlNodePtr) prop; - ctxt->state->value = value; - ret = xmlRelaxNGValidateValueContent(ctxt, define->content); - if (ctxt->state->value != NULL) - value = ctxt->state->value; - if (value != NULL) - xmlFree(value); - ctxt->state->value = oldvalue; - ctxt->state->seq = oldseq; - if (ret == 0) { - /* - * flag the attribute as processed - */ - ctxt->state->attrs[i] = NULL; - ctxt->state->nbAttrLeft--; - } - } else { - ret = -1; - } -#ifdef DEBUG - if (define->ns != NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n", - define->ns, ret); - } else { - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGValidateAttribute(anyName): %d\n", - ret); - } -#endif - } - - return (ret); -} - -/** - * xmlRelaxNGValidateAttributeList: - * @ctxt: a Relax-NG validation context - * @define: the list of definition to verify - * - * Validate the given node against the list of attribute definitions - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr defines) -{ - int ret = 0, res; - int needmore = 0; - xmlRelaxNGDefinePtr cur; - - cur = defines; - while (cur != NULL) { - if (cur->type == XML_RELAXNG_ATTRIBUTE) { - if (xmlRelaxNGValidateAttribute(ctxt, cur) != 0) - ret = -1; - } else - needmore = 1; - cur = cur->next; - } - if (!needmore) - return (ret); - cur = defines; - while (cur != NULL) { - if (cur->type != XML_RELAXNG_ATTRIBUTE) { - if ((ctxt->state != NULL) || (ctxt->states != NULL)) { - res = xmlRelaxNGValidateDefinition(ctxt, cur); - if (res < 0) - ret = -1; - } else { - VALID_ERR(XML_RELAXNG_ERR_NOSTATE); - return (-1); - } - if (res == -1) /* continues on -2 */ - break; - } - cur = cur->next; - } - - return (ret); -} - -/** - * xmlRelaxNGNodeMatchesList: - * @node: the node - * @list: a NULL terminated array of definitions - * - * Check if a node can be matched by one of the definitions - * - * Returns 1 if matches 0 otherwise - */ -static int -xmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list) -{ - xmlRelaxNGDefinePtr cur; - int i = 0, tmp; - - if ((node == NULL) || (list == NULL)) - return (0); - - cur = list[i++]; - while (cur != NULL) { - if ((node->type == XML_ELEMENT_NODE) && - (cur->type == XML_RELAXNG_ELEMENT)) { - tmp = xmlRelaxNGElementMatch(NULL, cur, node); - if (tmp == 1) - return (1); - } else if (((node->type == XML_TEXT_NODE) || - (node->type == XML_CDATA_SECTION_NODE)) && - (cur->type == XML_RELAXNG_TEXT)) { - return (1); - } - cur = list[i++]; - } - return (0); -} - -/** - * xmlRelaxNGValidateInterleave: - * @ctxt: a Relax-NG validation context - * @define: the definition to verify - * - * Validate an interleave definition for a node. - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define) -{ - int ret = 0, i, nbgroups; - int errNr = ctxt->errNr; - int oldflags; - - xmlRelaxNGValidStatePtr oldstate; - xmlRelaxNGPartitionPtr partitions; - xmlRelaxNGInterleaveGroupPtr group = NULL; - xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem; - xmlNodePtr *list = NULL, *lasts = NULL; - - if (define->data != NULL) { - partitions = (xmlRelaxNGPartitionPtr) define->data; - nbgroups = partitions->nbgroups; - } else { - VALID_ERR(XML_RELAXNG_ERR_INTERNODATA); - return (-1); - } - /* - * Optimizations for MIXED - */ - oldflags = ctxt->flags; - if (define->dflags & IS_MIXED) { - ctxt->flags |= FLAGS_MIXED_CONTENT; - if (nbgroups == 2) { - /* - * this is a pure <mixed> case - */ - if (ctxt->state != NULL) - ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, - ctxt->state->seq); - if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT) - ret = xmlRelaxNGValidateDefinition(ctxt, - partitions->groups[1]-> - rule); - else - ret = xmlRelaxNGValidateDefinition(ctxt, - partitions->groups[0]-> - rule); - if (ret == 0) { - if (ctxt->state != NULL) - ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, - ctxt->state-> - seq); - } - ctxt->flags = oldflags; - return (ret); - } - } - - /* - * Build arrays to store the first and last node of the chain - * pertaining to each group - */ - list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); - if (list == NULL) { - xmlRngVErrMemory(ctxt, "validating\n"); - return (-1); - } - memset(list, 0, nbgroups * sizeof(xmlNodePtr)); - lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); - if (lasts == NULL) { - xmlRngVErrMemory(ctxt, "validating\n"); - return (-1); - } - memset(lasts, 0, nbgroups * sizeof(xmlNodePtr)); - - /* - * Walk the sequence of children finding the right group and - * sorting them in sequences. - */ - cur = ctxt->state->seq; - cur = xmlRelaxNGSkipIgnored(ctxt, cur); - start = cur; - while (cur != NULL) { - ctxt->state->seq = cur; - if ((partitions->triage != NULL) && - (partitions->flags & IS_DETERMINIST)) { - void *tmp = NULL; - - if ((cur->type == XML_TEXT_NODE) || - (cur->type == XML_CDATA_SECTION_NODE)) { - tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text", - NULL); - } else if (cur->type == XML_ELEMENT_NODE) { - if (cur->ns != NULL) { - tmp = xmlHashLookup2(partitions->triage, cur->name, - cur->ns->href); - if (tmp == NULL) - tmp = xmlHashLookup2(partitions->triage, - BAD_CAST "#any", - cur->ns->href); - } else - tmp = - xmlHashLookup2(partitions->triage, cur->name, - NULL); - if (tmp == NULL) - tmp = - xmlHashLookup2(partitions->triage, BAD_CAST "#any", - NULL); - } - - if (tmp == NULL) { - i = nbgroups; - } else { - i = ((long) tmp) - 1; - if (partitions->flags & IS_NEEDCHECK) { - group = partitions->groups[i]; - if (!xmlRelaxNGNodeMatchesList(cur, group->defs)) - i = nbgroups; - } - } - } else { - for (i = 0; i < nbgroups; i++) { - group = partitions->groups[i]; - if (group == NULL) - continue; - if (xmlRelaxNGNodeMatchesList(cur, group->defs)) - break; - } - } - /* - * We break as soon as an element not matched is found - */ - if (i >= nbgroups) { - break; - } - if (lasts[i] != NULL) { - lasts[i]->next = cur; - lasts[i] = cur; - } else { - list[i] = cur; - lasts[i] = cur; - } - if (cur->next != NULL) - lastchg = cur->next; - else - lastchg = cur; - cur = xmlRelaxNGSkipIgnored(ctxt, cur->next); - } - if (ret != 0) { - VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); - ret = -1; - goto done; - } - lastelem = cur; - oldstate = ctxt->state; - for (i = 0; i < nbgroups; i++) { - ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate); - group = partitions->groups[i]; - if (lasts[i] != NULL) { - last = lasts[i]->next; - lasts[i]->next = NULL; - } - ctxt->state->seq = list[i]; - ret = xmlRelaxNGValidateDefinition(ctxt, group->rule); - if (ret != 0) - break; - if (ctxt->state != NULL) { - cur = ctxt->state->seq; - cur = xmlRelaxNGSkipIgnored(ctxt, cur); - xmlRelaxNGFreeValidState(ctxt, oldstate); - oldstate = ctxt->state; - ctxt->state = NULL; - if (cur != NULL) { - VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); - ret = -1; - ctxt->state = oldstate; - goto done; - } - } else if (ctxt->states != NULL) { - int j; - int found = 0; - int best = -1; - int lowattr = -1; - - /* - * PBM: what happen if there is attributes checks in the interleaves - */ - - for (j = 0; j < ctxt->states->nbState; j++) { - cur = ctxt->states->tabState[j]->seq; - cur = xmlRelaxNGSkipIgnored(ctxt, cur); - if (cur == NULL) { - if (found == 0) { - lowattr = ctxt->states->tabState[j]->nbAttrLeft; - best = j; - } - found = 1; - if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { - /* try to keep the latest one to mach old heuristic */ - lowattr = ctxt->states->tabState[j]->nbAttrLeft; - best = j; - } - if (lowattr == 0) - break; - } else if (found == 0) { - if (lowattr == -1) { - lowattr = ctxt->states->tabState[j]->nbAttrLeft; - best = j; - } else - if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { - /* try to keep the latest one to mach old heuristic */ - lowattr = ctxt->states->tabState[j]->nbAttrLeft; - best = j; - } - } - } - /* - * BIG PBM: here we pick only one restarting point :-( - */ - if (ctxt->states->nbState > 0) { - xmlRelaxNGFreeValidState(ctxt, oldstate); - if (best != -1) { - oldstate = ctxt->states->tabState[best]; - ctxt->states->tabState[best] = NULL; - } else { - oldstate = - ctxt->states->tabState[ctxt->states->nbState - 1]; - ctxt->states->tabState[ctxt->states->nbState - 1] = NULL; - } - } - for (j = 0; j < ctxt->states->nbState ; j++) { - xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]); - } - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->states = NULL; - if (found == 0) { - VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); - ret = -1; - ctxt->state = oldstate; - goto done; - } - } else { - ret = -1; - break; - } - if (lasts[i] != NULL) { - lasts[i]->next = last; - } - } - if (ctxt->state != NULL) - xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = oldstate; - ctxt->state->seq = lastelem; - if (ret != 0) { - VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); - ret = -1; - goto done; - } - - done: - ctxt->flags = oldflags; - /* - * builds the next links chain from the prev one - */ - cur = lastchg; - while (cur != NULL) { - if ((cur == start) || (cur->prev == NULL)) - break; - cur->prev->next = cur; - cur = cur->prev; - } - if (ret == 0) { - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - } - - xmlFree(list); - xmlFree(lasts); - return (ret); -} - -/** - * xmlRelaxNGValidateDefinitionList: - * @ctxt: a Relax-NG validation context - * @define: the list of definition to verify - * - * Validate the given node content against the (list) of definitions - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr defines) -{ - int ret = 0, res; - - - if (defines == NULL) { - VALID_ERR2(XML_RELAXNG_ERR_INTERNAL, - BAD_CAST "NULL definition list"); - return (-1); - } - while (defines != NULL) { - if ((ctxt->state != NULL) || (ctxt->states != NULL)) { - res = xmlRelaxNGValidateDefinition(ctxt, defines); - if (res < 0) - ret = -1; - } else { - VALID_ERR(XML_RELAXNG_ERR_NOSTATE); - return (-1); - } - if (res == -1) /* continues on -2 */ - break; - defines = defines->next; - } - - return (ret); -} - -/** - * xmlRelaxNGElementMatch: - * @ctxt: a Relax-NG validation context - * @define: the definition to check - * @elem: the element - * - * Check if the element matches the definition nameClass - * - * Returns 1 if the element matches, 0 if no, or -1 in case of error - */ -static int -xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define, xmlNodePtr elem) -{ - int ret = 0, oldflags = 0; - - if (define->name != NULL) { - if (!xmlStrEqual(elem->name, define->name)) { - VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name); - return (0); - } - } - if ((define->ns != NULL) && (define->ns[0] != 0)) { - if (elem->ns == NULL) { - VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS, elem->name); - return (0); - } else if (!xmlStrEqual(elem->ns->href, define->ns)) { - VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS, - elem->name, define->ns); - return (0); - } - } else if ((elem->ns != NULL) && (define->ns != NULL) && - (define->name == NULL)) { - VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name); - return (0); - } else if ((elem->ns != NULL) && (define->name != NULL)) { - VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name); - return (0); - } - - if (define->nameClass == NULL) - return (1); - - define = define->nameClass; - if (define->type == XML_RELAXNG_EXCEPT) { - xmlRelaxNGDefinePtr list; - - if (ctxt != NULL) { - oldflags = ctxt->flags; - ctxt->flags |= FLAGS_IGNORABLE; - } - - list = define->content; - while (list != NULL) { - ret = xmlRelaxNGElementMatch(ctxt, list, elem); - if (ret == 1) { - if (ctxt != NULL) - ctxt->flags = oldflags; - return (0); - } - if (ret < 0) { - if (ctxt != NULL) - ctxt->flags = oldflags; - return (ret); - } - list = list->next; - } - ret = 1; - if (ctxt != NULL) { - ctxt->flags = oldflags; - } - } else if (define->type == XML_RELAXNG_CHOICE) { - xmlRelaxNGDefinePtr list; - - if (ctxt != NULL) { - oldflags = ctxt->flags; - ctxt->flags |= FLAGS_IGNORABLE; - } - - list = define->nameClass; - while (list != NULL) { - ret = xmlRelaxNGElementMatch(ctxt, list, elem); - if (ret == 1) { - if (ctxt != NULL) - ctxt->flags = oldflags; - return (1); - } - if (ret < 0) { - if (ctxt != NULL) - ctxt->flags = oldflags; - return (ret); - } - list = list->next; - } - if (ctxt != NULL) { - if (ret != 0) { - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) - xmlRelaxNGDumpValidError(ctxt); - } else { - if (ctxt->errNr > 0) - xmlRelaxNGPopErrors(ctxt, 0); - } - } - ret = 0; - if (ctxt != NULL) { - ctxt->flags = oldflags; - } - } else { - TODO ret = -1; - } - return (ret); -} - -/** - * xmlRelaxNGBestState: - * @ctxt: a Relax-NG validation context - * - * Find the "best" state in the ctxt->states list of states to report - * errors about. I.e. a state with no element left in the child list - * or the one with the less attributes left. - * This is called only if a falidation error was detected - * - * Returns the index of the "best" state or -1 in case of error - */ -static int -xmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt) -{ - xmlRelaxNGValidStatePtr state; - int i, tmp; - int best = -1; - int value = 1000000; - - if ((ctxt == NULL) || (ctxt->states == NULL) || - (ctxt->states->nbState <= 0)) - return (-1); - - for (i = 0; i < ctxt->states->nbState; i++) { - state = ctxt->states->tabState[i]; - if (state == NULL) - continue; - if (state->seq != NULL) { - if ((best == -1) || (value > 100000)) { - value = 100000; - best = i; - } - } else { - tmp = state->nbAttrLeft; - if ((best == -1) || (value > tmp)) { - value = tmp; - best = i; - } - } - } - return (best); -} - -/** - * xmlRelaxNGLogBestError: - * @ctxt: a Relax-NG validation context - * - * Find the "best" state in the ctxt->states list of states to report - * errors about and log it. - */ -static void -xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt) -{ - int best; - - if ((ctxt == NULL) || (ctxt->states == NULL) || - (ctxt->states->nbState <= 0)) - return; - - best = xmlRelaxNGBestState(ctxt); - if ((best >= 0) && (best < ctxt->states->nbState)) { - ctxt->state = ctxt->states->tabState[best]; - - xmlRelaxNGValidateElementEnd(ctxt, 1); - } -} - -/** - * xmlRelaxNGValidateElementEnd: - * @ctxt: a Relax-NG validation context - * @dolog: indicate that error logging should be done - * - * Validate the end of the element, implements check that - * there is nothing left not consumed in the element content - * or in the attribute list. - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog) -{ - int i; - xmlRelaxNGValidStatePtr state; - - state = ctxt->state; - if (state->seq != NULL) { - state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq); - if (state->seq != NULL) { - if (dolog) { - VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT, - state->node->name, state->seq->name); - } - return (-1); - } - } - for (i = 0; i < state->nbAttrs; i++) { - if (state->attrs[i] != NULL) { - if (dolog) { - VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR, - state->attrs[i]->name, state->node->name); - } - return (-1 - i); - } - } - return (0); -} - -/** - * xmlRelaxNGValidateState: - * @ctxt: a Relax-NG validation context - * @define: the definition to verify - * - * Validate the current state against the definition - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define) -{ - xmlNodePtr node; - int ret = 0, i, tmp, oldflags, errNr; - xmlRelaxNGValidStatePtr oldstate = NULL, state; - - if (define == NULL) { - VALID_ERR(XML_RELAXNG_ERR_NODEFINE); - return (-1); - } - - if (ctxt->state != NULL) { - node = ctxt->state->seq; - } else { - node = NULL; - } -#ifdef DEBUG - for (i = 0; i < ctxt->depth; i++) - xmlGenericError(xmlGenericErrorContext, " "); - xmlGenericError(xmlGenericErrorContext, - "Start validating %s ", xmlRelaxNGDefName(define)); - if (define->name != NULL) - xmlGenericError(xmlGenericErrorContext, "%s ", define->name); - if ((node != NULL) && (node->name != NULL)) - xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name); - else - xmlGenericError(xmlGenericErrorContext, "\n"); -#endif - ctxt->depth++; - switch (define->type) { - case XML_RELAXNG_EMPTY: - node = xmlRelaxNGSkipIgnored(ctxt, node); - ret = 0; - break; - case XML_RELAXNG_NOT_ALLOWED: - ret = -1; - break; - case XML_RELAXNG_TEXT: - while ((node != NULL) && - ((node->type == XML_TEXT_NODE) || - (node->type == XML_COMMENT_NODE) || - (node->type == XML_PI_NODE) || - (node->type == XML_CDATA_SECTION_NODE))) - node = node->next; - ctxt->state->seq = node; - break; - case XML_RELAXNG_ELEMENT: - errNr = ctxt->errNr; - node = xmlRelaxNGSkipIgnored(ctxt, node); - if (node == NULL) { - VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name); - ret = -1; - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) - xmlRelaxNGDumpValidError(ctxt); - break; - } - if (node->type != XML_ELEMENT_NODE) { - VALID_ERR(XML_RELAXNG_ERR_NOTELEM); - ret = -1; - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) - xmlRelaxNGDumpValidError(ctxt); - break; - } - /* - * This node was already validated successfully against - * this definition. - */ - if (node->psvi == define) { - ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - if (ctxt->errNr != 0) { - while ((ctxt->err != NULL) && - (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) - && (xmlStrEqual(ctxt->err->arg2, node->name))) - || - ((ctxt->err->err == - XML_RELAXNG_ERR_ELEMEXTRANS) - && (xmlStrEqual(ctxt->err->arg1, node->name))) - || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) - || (ctxt->err->err == - XML_RELAXNG_ERR_NOTELEM))) - xmlRelaxNGValidErrorPop(ctxt); - } - break; - } - - ret = xmlRelaxNGElementMatch(ctxt, define, node); - if (ret <= 0) { - ret = -1; - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) - xmlRelaxNGDumpValidError(ctxt); - break; - } - ret = 0; - if (ctxt->errNr != 0) { - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - while ((ctxt->err != NULL) && - (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) && - (xmlStrEqual(ctxt->err->arg2, node->name))) || - ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) && - (xmlStrEqual(ctxt->err->arg1, node->name))) || - (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) || - (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM))) - xmlRelaxNGValidErrorPop(ctxt); - } - errNr = ctxt->errNr; - - oldflags = ctxt->flags; - if (ctxt->flags & FLAGS_MIXED_CONTENT) { - ctxt->flags -= FLAGS_MIXED_CONTENT; - } - state = xmlRelaxNGNewValidState(ctxt, node); - if (state == NULL) { - ret = -1; - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) - xmlRelaxNGDumpValidError(ctxt); - break; - } - - oldstate = ctxt->state; - ctxt->state = state; - if (define->attrs != NULL) { - tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); - if (tmp != 0) { - ret = -1; - VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); - } - } - if (define->contModel != NULL) { - xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state; - xmlRelaxNGStatesPtr tmpstates = ctxt->states; - xmlNodePtr nseq; - - nstate = xmlRelaxNGNewValidState(ctxt, node); - ctxt->state = nstate; - ctxt->states = NULL; - - tmp = xmlRelaxNGValidateCompiledContent(ctxt, - define->contModel, - ctxt->state->seq); - nseq = ctxt->state->seq; - ctxt->state = tmpstate; - ctxt->states = tmpstates; - xmlRelaxNGFreeValidState(ctxt, nstate); - -#ifdef DEBUG_COMPILE - xmlGenericError(xmlGenericErrorContext, - "Validating content of '%s' : %d\n", - define->name, tmp); -#endif - if (tmp != 0) - ret = -1; - - if (ctxt->states != NULL) { - tmp = -1; - - for (i = 0; i < ctxt->states->nbState; i++) { - state = ctxt->states->tabState[i]; - ctxt->state = state; - ctxt->state->seq = nseq; - - if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { - tmp = 0; - break; - } - } - if (tmp != 0) { - /* - * validation error, log the message for the "best" one - */ - ctxt->flags |= FLAGS_IGNORABLE; - xmlRelaxNGLogBestError(ctxt); - } - for (i = 0; i < ctxt->states->nbState; i++) { - xmlRelaxNGFreeValidState(ctxt, - ctxt->states-> - tabState[i]); - } - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->flags = oldflags; - ctxt->states = NULL; - if ((ret == 0) && (tmp == -1)) - ret = -1; - } else { - state = ctxt->state; - ctxt->state->seq = nseq; - if (ret == 0) - ret = xmlRelaxNGValidateElementEnd(ctxt, 1); - xmlRelaxNGFreeValidState(ctxt, state); - } - } else { - if (define->content != NULL) { - tmp = xmlRelaxNGValidateDefinitionList(ctxt, - define-> - content); - if (tmp != 0) { - ret = -1; - if (ctxt->state == NULL) { - ctxt->state = oldstate; - VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, - node->name); - ctxt->state = NULL; - } else { - VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, - node->name); - } - - } - } - if (ctxt->states != NULL) { - tmp = -1; - - for (i = 0; i < ctxt->states->nbState; i++) { - state = ctxt->states->tabState[i]; - ctxt->state = state; - - if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { - tmp = 0; - break; - } - } - if (tmp != 0) { - /* - * validation error, log the message for the "best" one - */ - ctxt->flags |= FLAGS_IGNORABLE; - xmlRelaxNGLogBestError(ctxt); - } - for (i = 0; i < ctxt->states->nbState; i++) { - xmlRelaxNGFreeValidState(ctxt, - ctxt->states-> - tabState[i]); - } - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->flags = oldflags; - ctxt->states = NULL; - if ((ret == 0) && (tmp == -1)) - ret = -1; - } else { - state = ctxt->state; - if (ret == 0) - ret = xmlRelaxNGValidateElementEnd(ctxt, 1); - xmlRelaxNGFreeValidState(ctxt, state); - } - } - if (ret == 0) { - node->psvi = define; - } - ctxt->flags = oldflags; - ctxt->state = oldstate; - if (oldstate != NULL) - oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); - if (ret != 0) { - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { - xmlRelaxNGDumpValidError(ctxt); - ret = 0; -#if 0 - } else { - ret = -2; -#endif - } - } else { - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - } - -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "xmlRelaxNGValidateDefinition(): validated %s : %d", - node->name, ret); - if (oldstate == NULL) - xmlGenericError(xmlGenericErrorContext, ": no state\n"); - else if (oldstate->seq == NULL) - xmlGenericError(xmlGenericErrorContext, ": done\n"); - else if (oldstate->seq->type == XML_ELEMENT_NODE) - xmlGenericError(xmlGenericErrorContext, ": next elem %s\n", - oldstate->seq->name); - else - xmlGenericError(xmlGenericErrorContext, ": next %s %d\n", - oldstate->seq->name, oldstate->seq->type); -#endif - break; - case XML_RELAXNG_OPTIONAL:{ - errNr = ctxt->errNr; - oldflags = ctxt->flags; - ctxt->flags |= FLAGS_IGNORABLE; - oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); - ret = - xmlRelaxNGValidateDefinitionList(ctxt, - define->content); - if (ret != 0) { - if (ctxt->state != NULL) - xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = oldstate; - ctxt->flags = oldflags; - ret = 0; - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - break; - } - if (ctxt->states != NULL) { - xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); - } else { - ctxt->states = xmlRelaxNGNewStates(ctxt, 1); - if (ctxt->states == NULL) { - xmlRelaxNGFreeValidState(ctxt, oldstate); - ctxt->flags = oldflags; - ret = -1; - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - break; - } - xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); - xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state); - ctxt->state = NULL; - } - ctxt->flags = oldflags; - ret = 0; - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - break; - } - case XML_RELAXNG_ONEORMORE: - errNr = ctxt->errNr; - ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); - if (ret != 0) { - break; - } - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - /* no break on purpose */ - case XML_RELAXNG_ZEROORMORE:{ - int progress; - xmlRelaxNGStatesPtr states = NULL, res = NULL; - int base, j; - - errNr = ctxt->errNr; - res = xmlRelaxNGNewStates(ctxt, 1); - if (res == NULL) { - ret = -1; - break; - } - /* - * All the input states are also exit states - */ - if (ctxt->state != NULL) { - xmlRelaxNGAddStates(ctxt, res, - xmlRelaxNGCopyValidState(ctxt, - ctxt-> - state)); - } else { - for (j = 0; j < ctxt->states->nbState; j++) { - xmlRelaxNGAddStates(ctxt, res, - xmlRelaxNGCopyValidState(ctxt, - ctxt-> - states-> - tabState - [j])); - } - } - oldflags = ctxt->flags; - ctxt->flags |= FLAGS_IGNORABLE; - do { - progress = 0; - base = res->nbState; - - if (ctxt->states != NULL) { - states = ctxt->states; - for (i = 0; i < states->nbState; i++) { - ctxt->state = states->tabState[i]; - ctxt->states = NULL; - ret = xmlRelaxNGValidateDefinitionList(ctxt, - define-> - content); - if (ret == 0) { - if (ctxt->state != NULL) { - tmp = xmlRelaxNGAddStates(ctxt, res, - ctxt->state); - ctxt->state = NULL; - if (tmp == 1) - progress = 1; - } else if (ctxt->states != NULL) { - for (j = 0; j < ctxt->states->nbState; - j++) { - tmp = - xmlRelaxNGAddStates(ctxt, res, - ctxt-> - states-> - tabState - [j]); - if (tmp == 1) - progress = 1; - } - xmlRelaxNGFreeStates(ctxt, - ctxt->states); - ctxt->states = NULL; - } - } else { - if (ctxt->state != NULL) { - xmlRelaxNGFreeValidState(ctxt, - ctxt->state); - ctxt->state = NULL; - } - } - } - } else { - ret = xmlRelaxNGValidateDefinitionList(ctxt, - define-> - content); - if (ret != 0) { - xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = NULL; - } else { - base = res->nbState; - if (ctxt->state != NULL) { - tmp = xmlRelaxNGAddStates(ctxt, res, - ctxt->state); - ctxt->state = NULL; - if (tmp == 1) - progress = 1; - } else if (ctxt->states != NULL) { - for (j = 0; j < ctxt->states->nbState; j++) { - tmp = xmlRelaxNGAddStates(ctxt, res, - ctxt-> - states-> - tabState[j]); - if (tmp == 1) - progress = 1; - } - if (states == NULL) { - states = ctxt->states; - } else { - xmlRelaxNGFreeStates(ctxt, - ctxt->states); - } - ctxt->states = NULL; - } - } - } - if (progress) { - /* - * Collect all the new nodes added at that step - * and make them the new node set - */ - if (res->nbState - base == 1) { - ctxt->state = xmlRelaxNGCopyValidState(ctxt, - res-> - tabState - [base]); - } else { - if (states == NULL) { - xmlRelaxNGNewStates(ctxt, - res->nbState - base); - states = ctxt->states; - if (states == NULL) { - progress = 0; - break; - } - } - states->nbState = 0; - for (i = base; i < res->nbState; i++) - xmlRelaxNGAddStates(ctxt, states, - xmlRelaxNGCopyValidState - (ctxt, - res->tabState[i])); - ctxt->states = states; - } - } - } while (progress == 1); - if (states != NULL) { - xmlRelaxNGFreeStates(ctxt, states); - } - ctxt->states = res; - ctxt->flags = oldflags; -#if 0 - /* - * errors may have to be propagated back... - */ - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); -#endif - ret = 0; - break; - } - case XML_RELAXNG_CHOICE:{ - xmlRelaxNGDefinePtr list = NULL; - xmlRelaxNGStatesPtr states = NULL; - - node = xmlRelaxNGSkipIgnored(ctxt, node); - - errNr = ctxt->errNr; - if ((define->dflags & IS_TRIABLE) && (define->data != NULL) && - (node != NULL)) { - /* - * node == NULL can't be optimized since IS_TRIABLE - * doesn't account for choice which may lead to - * only attributes. - */ - xmlHashTablePtr triage = - (xmlHashTablePtr) define->data; - - /* - * Something we can optimize cleanly there is only one - * possble branch out ! - */ - if ((node->type == XML_TEXT_NODE) || - (node->type == XML_CDATA_SECTION_NODE)) { - list = - xmlHashLookup2(triage, BAD_CAST "#text", NULL); - } else if (node->type == XML_ELEMENT_NODE) { - if (node->ns != NULL) { - list = xmlHashLookup2(triage, node->name, - node->ns->href); - if (list == NULL) - list = - xmlHashLookup2(triage, BAD_CAST "#any", - node->ns->href); - } else - list = - xmlHashLookup2(triage, node->name, NULL); - if (list == NULL) - list = - xmlHashLookup2(triage, BAD_CAST "#any", - NULL); - } - if (list == NULL) { - ret = -1; - VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, node->name); - break; - } - ret = xmlRelaxNGValidateDefinition(ctxt, list); - if (ret == 0) { - } - break; - } - - list = define->content; - oldflags = ctxt->flags; - ctxt->flags |= FLAGS_IGNORABLE; - - while (list != NULL) { - oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); - ret = xmlRelaxNGValidateDefinition(ctxt, list); - if (ret == 0) { - if (states == NULL) { - states = xmlRelaxNGNewStates(ctxt, 1); - } - if (ctxt->state != NULL) { - xmlRelaxNGAddStates(ctxt, states, ctxt->state); - } else if (ctxt->states != NULL) { - for (i = 0; i < ctxt->states->nbState; i++) { - xmlRelaxNGAddStates(ctxt, states, - ctxt->states-> - tabState[i]); - } - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->states = NULL; - } - } else { - xmlRelaxNGFreeValidState(ctxt, ctxt->state); - } - ctxt->state = oldstate; - list = list->next; - } - if (states != NULL) { - xmlRelaxNGFreeValidState(ctxt, oldstate); - ctxt->states = states; - ctxt->state = NULL; - ret = 0; - } else { - ctxt->states = NULL; - } - ctxt->flags = oldflags; - if (ret != 0) { - if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { - xmlRelaxNGDumpValidError(ctxt); - } - } else { - if (ctxt->errNr > errNr) - xmlRelaxNGPopErrors(ctxt, errNr); - } - break; - } - case XML_RELAXNG_DEF: - case XML_RELAXNG_GROUP: - ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); - break; - case XML_RELAXNG_INTERLEAVE: - ret = xmlRelaxNGValidateInterleave(ctxt, define); - break; - case XML_RELAXNG_ATTRIBUTE: - ret = xmlRelaxNGValidateAttribute(ctxt, define); - break; - case XML_RELAXNG_START: - case XML_RELAXNG_NOOP: - case XML_RELAXNG_REF: - case XML_RELAXNG_EXTERNALREF: - case XML_RELAXNG_PARENTREF: - ret = xmlRelaxNGValidateDefinition(ctxt, define->content); - break; - case XML_RELAXNG_DATATYPE:{ - xmlNodePtr child; - xmlChar *content = NULL; - - child = node; - while (child != NULL) { - if (child->type == XML_ELEMENT_NODE) { - VALID_ERR2(XML_RELAXNG_ERR_DATAELEM, - node->parent->name); - ret = -1; - break; - } else if ((child->type == XML_TEXT_NODE) || - (child->type == XML_CDATA_SECTION_NODE)) { - content = xmlStrcat(content, child->content); - } - /* TODO: handle entities ... */ - child = child->next; - } - if (ret == -1) { - if (content != NULL) - xmlFree(content); - break; - } - if (content == NULL) { - content = xmlStrdup(BAD_CAST ""); - if (content == NULL) { - xmlRngVErrMemory(ctxt, "validating\n"); - ret = -1; - break; - } - } - ret = xmlRelaxNGValidateDatatype(ctxt, content, define, - ctxt->state->seq); - if (ret == -1) { - VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name); - } else if (ret == 0) { - ctxt->state->seq = NULL; - } - if (content != NULL) - xmlFree(content); - break; - } - case XML_RELAXNG_VALUE:{ - xmlChar *content = NULL; - xmlChar *oldvalue; - xmlNodePtr child; - - child = node; - while (child != NULL) { - if (child->type == XML_ELEMENT_NODE) { - VALID_ERR2(XML_RELAXNG_ERR_VALELEM, - node->parent->name); - ret = -1; - break; - } else if ((child->type == XML_TEXT_NODE) || - (child->type == XML_CDATA_SECTION_NODE)) { - content = xmlStrcat(content, child->content); - } - /* TODO: handle entities ... */ - child = child->next; - } - if (ret == -1) { - if (content != NULL) - xmlFree(content); - break; - } - if (content == NULL) { - content = xmlStrdup(BAD_CAST ""); - if (content == NULL) { - xmlRngVErrMemory(ctxt, "validating\n"); - ret = -1; - break; - } - } - oldvalue = ctxt->state->value; - ctxt->state->value = content; - ret = xmlRelaxNGValidateValue(ctxt, define); - ctxt->state->value = oldvalue; - if (ret == -1) { - VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name); - } else if (ret == 0) { - ctxt->state->seq = NULL; - } - if (content != NULL) - xmlFree(content); - break; - } - case XML_RELAXNG_LIST:{ - xmlChar *content; - xmlNodePtr child; - xmlChar *oldvalue, *oldendvalue; - int len; - - /* - * Make sure it's only text nodes - */ - - content = NULL; - child = node; - while (child != NULL) { - if (child->type == XML_ELEMENT_NODE) { - VALID_ERR2(XML_RELAXNG_ERR_LISTELEM, - node->parent->name); - ret = -1; - break; - } else if ((child->type == XML_TEXT_NODE) || - (child->type == XML_CDATA_SECTION_NODE)) { - content = xmlStrcat(content, child->content); - } - /* TODO: handle entities ... */ - child = child->next; - } - if (ret == -1) { - if (content != NULL) - xmlFree(content); - break; - } - if (content == NULL) { - content = xmlStrdup(BAD_CAST ""); - if (content == NULL) { - xmlRngVErrMemory(ctxt, "validating\n"); - ret = -1; - break; - } - } - len = xmlStrlen(content); - oldvalue = ctxt->state->value; - oldendvalue = ctxt->state->endvalue; - ctxt->state->value = content; - ctxt->state->endvalue = content + len; - ret = xmlRelaxNGValidateValue(ctxt, define); - ctxt->state->value = oldvalue; - ctxt->state->endvalue = oldendvalue; - if (ret == -1) { - VALID_ERR(XML_RELAXNG_ERR_LIST); - } else if ((ret == 0) && (node != NULL)) { - ctxt->state->seq = node->next; - } - if (content != NULL) - xmlFree(content); - break; - } - case XML_RELAXNG_EXCEPT: - case XML_RELAXNG_PARAM: - TODO ret = -1; - break; - } - ctxt->depth--; -#ifdef DEBUG - for (i = 0; i < ctxt->depth; i++) - xmlGenericError(xmlGenericErrorContext, " "); - xmlGenericError(xmlGenericErrorContext, - "Validating %s ", xmlRelaxNGDefName(define)); - if (define->name != NULL) - xmlGenericError(xmlGenericErrorContext, "%s ", define->name); - if (ret == 0) - xmlGenericError(xmlGenericErrorContext, "suceeded\n"); - else - xmlGenericError(xmlGenericErrorContext, "failed\n"); -#endif - return (ret); -} - -/** - * xmlRelaxNGValidateDefinition: - * @ctxt: a Relax-NG validation context - * @define: the definition to verify - * - * Validate the current node lists against the definition - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGDefinePtr define) -{ - xmlRelaxNGStatesPtr states, res; - int i, j, k, ret, oldflags; - - /* - * We should NOT have both ctxt->state and ctxt->states - */ - if ((ctxt->state != NULL) && (ctxt->states != NULL)) { - TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = NULL; - } - - if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) { - if (ctxt->states != NULL) { - ctxt->state = ctxt->states->tabState[0]; - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->states = NULL; - } - ret = xmlRelaxNGValidateState(ctxt, define); - if ((ctxt->state != NULL) && (ctxt->states != NULL)) { - TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = NULL; - } - if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) { - ctxt->state = ctxt->states->tabState[0]; - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->states = NULL; - } - return (ret); - } - - states = ctxt->states; - ctxt->states = NULL; - res = NULL; - j = 0; - oldflags = ctxt->flags; - ctxt->flags |= FLAGS_IGNORABLE; - for (i = 0; i < states->nbState; i++) { - ctxt->state = states->tabState[i]; - ctxt->states = NULL; - ret = xmlRelaxNGValidateState(ctxt, define); - /* - * We should NOT have both ctxt->state and ctxt->states - */ - if ((ctxt->state != NULL) && (ctxt->states != NULL)) { - TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = NULL; - } - if (ret == 0) { - if (ctxt->states == NULL) { - if (res != NULL) { - /* add the state to the container */ - xmlRelaxNGAddStates(ctxt, res, ctxt->state); - ctxt->state = NULL; - } else { - /* add the state directly in states */ - states->tabState[j++] = ctxt->state; - ctxt->state = NULL; - } - } else { - if (res == NULL) { - /* make it the new container and copy other results */ - res = ctxt->states; - ctxt->states = NULL; - for (k = 0; k < j; k++) - xmlRelaxNGAddStates(ctxt, res, - states->tabState[k]); - } else { - /* add all the new results to res and reff the container */ - for (k = 0; k < ctxt->states->nbState; k++) - xmlRelaxNGAddStates(ctxt, res, - ctxt->states->tabState[k]); - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->states = NULL; - } - } - } else { - if (ctxt->state != NULL) { - xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = NULL; - } else if (ctxt->states != NULL) { - for (k = 0; k < ctxt->states->nbState; k++) - xmlRelaxNGFreeValidState(ctxt, - ctxt->states->tabState[k]); - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->states = NULL; - } - } - } - ctxt->flags = oldflags; - if (res != NULL) { - xmlRelaxNGFreeStates(ctxt, states); - ctxt->states = res; - ret = 0; - } else if (j > 1) { - states->nbState = j; - ctxt->states = states; - ret = 0; - } else if (j == 1) { - ctxt->state = states->tabState[0]; - xmlRelaxNGFreeStates(ctxt, states); - ret = 0; - } else { - ret = -1; - xmlRelaxNGFreeStates(ctxt, states); - if (ctxt->states != NULL) { - xmlRelaxNGFreeStates(ctxt, ctxt->states); - ctxt->states = NULL; - } - } - if ((ctxt->state != NULL) && (ctxt->states != NULL)) { - TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = NULL; - } - return (ret); -} - -/** - * xmlRelaxNGValidateDocument: - * @ctxt: a Relax-NG validation context - * @doc: the document - * - * Validate the given document - * - * Returns 0 if the validation succeeded or an error code. - */ -static int -xmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) -{ - int ret; - xmlRelaxNGPtr schema; - xmlRelaxNGGrammarPtr grammar; - xmlRelaxNGValidStatePtr state; - xmlNodePtr node; - - if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL)) - return (-1); - - ctxt->errNo = XML_RELAXNG_OK; - schema = ctxt->schema; - grammar = schema->topgrammar; - if (grammar == NULL) { - VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); - return (-1); - } - state = xmlRelaxNGNewValidState(ctxt, NULL); - ctxt->state = state; - ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start); - if ((ctxt->state != NULL) && (state->seq != NULL)) { - state = ctxt->state; - node = state->seq; - node = xmlRelaxNGSkipIgnored(ctxt, node); - if (node != NULL) { - if (ret != -1) { - VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); - ret = -1; - } - } - } else if (ctxt->states != NULL) { - int i; - int tmp = -1; - - for (i = 0; i < ctxt->states->nbState; i++) { - state = ctxt->states->tabState[i]; - node = state->seq; - node = xmlRelaxNGSkipIgnored(ctxt, node); - if (node == NULL) - tmp = 0; - xmlRelaxNGFreeValidState(ctxt, state); - } - if (tmp == -1) { - if (ret != -1) { - VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); - ret = -1; - } - } - } - if (ctxt->state != NULL) { - xmlRelaxNGFreeValidState(ctxt, ctxt->state); - ctxt->state = NULL; - } - if (ret != 0) - xmlRelaxNGDumpValidError(ctxt); -#ifdef DEBUG - else if (ctxt->errNr != 0) { - ctxt->error(ctxt->userData, - "%d Extra error messages left on stack !\n", - ctxt->errNr); - xmlRelaxNGDumpValidError(ctxt); - } -#endif -#ifdef LIBXML_VALID_ENABLED - if (ctxt->idref == 1) { - xmlValidCtxt vctxt; - - memset(&vctxt, 0, sizeof(xmlValidCtxt)); - vctxt.valid = 1; - vctxt.error = ctxt->error; - vctxt.warning = ctxt->warning; - vctxt.userData = ctxt->userData; - - if (xmlValidateDocumentFinal(&vctxt, doc) != 1) - ret = -1; - } -#endif /* LIBXML_VALID_ENABLED */ - if ((ret == 0) && (ctxt->errNo != XML_RELAXNG_OK)) - ret = -1; - - return (ret); -} - -/************************************************************************ - * * - * Validation interfaces * - * * - ************************************************************************/ - -/** - * xmlRelaxNGNewValidCtxt: - * @schema: a precompiled XML RelaxNGs - * - * Create an XML RelaxNGs validation context based on the given schema - * - * Returns the validation context or NULL in case of error - */ -xmlRelaxNGValidCtxtPtr -xmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema) -{ - xmlRelaxNGValidCtxtPtr ret; - - ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt)); - if (ret == NULL) { - xmlRngVErrMemory(NULL, "building context\n"); - return (NULL); - } - memset(ret, 0, sizeof(xmlRelaxNGValidCtxt)); - ret->schema = schema; - ret->error = xmlGenericError; - ret->userData = xmlGenericErrorContext; - ret->errNr = 0; - ret->errMax = 0; - ret->err = NULL; - ret->errTab = NULL; - if (schema != NULL) - ret->idref = schema->idref; - ret->states = NULL; - ret->freeState = NULL; - ret->freeStates = NULL; - ret->errNo = XML_RELAXNG_OK; - return (ret); -} - -/** - * xmlRelaxNGFreeValidCtxt: - * @ctxt: the schema validation context - * - * Free the resources associated to the schema validation context - */ -void -xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt) -{ - int k; - - if (ctxt == NULL) - return; - if (ctxt->states != NULL) - xmlRelaxNGFreeStates(NULL, ctxt->states); - if (ctxt->freeState != NULL) { - for (k = 0; k < ctxt->freeState->nbState; k++) { - xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]); - } - xmlRelaxNGFreeStates(NULL, ctxt->freeState); - } - if (ctxt->freeStates != NULL) { - for (k = 0; k < ctxt->freeStatesNr; k++) { - xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]); - } - xmlFree(ctxt->freeStates); - } - if (ctxt->errTab != NULL) - xmlFree(ctxt->errTab); - if (ctxt->elemTab != NULL) { - xmlRegExecCtxtPtr exec; - - exec = xmlRelaxNGElemPop(ctxt); - while (exec != NULL) { - xmlRegFreeExecCtxt(exec); - exec = xmlRelaxNGElemPop(ctxt); - } - xmlFree(ctxt->elemTab); - } - xmlFree(ctxt); -} - -/** - * xmlRelaxNGSetValidErrors: - * @ctxt: a Relax-NG validation context - * @err: the error function - * @warn: the warning function - * @ctx: the functions context - * - * Set the error and warning callback informations - */ -void -xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidityErrorFunc err, - xmlRelaxNGValidityWarningFunc warn, void *ctx) -{ - if (ctxt == NULL) - return; - ctxt->error = err; - ctxt->warning = warn; - ctxt->userData = ctx; - ctxt->serror = NULL; -} - -/** - * xmlRelaxNGSetValidStructuredErrors: - * @ctxt: a Relax-NG validation context - * @serror: the structured error function - * @ctx: the functions context - * - * Set the structured error callback - */ -void -xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, - xmlStructuredErrorFunc serror, void *ctx) -{ - if (ctxt == NULL) - return; - ctxt->serror = serror; - ctxt->error = NULL; - ctxt->warning = NULL; - ctxt->userData = ctx; -} - -/** - * xmlRelaxNGGetValidErrors: - * @ctxt: a Relax-NG validation context - * @err: the error function result - * @warn: the warning function result - * @ctx: the functions context result - * - * Get the error and warning callback informations - * - * Returns -1 in case of error and 0 otherwise - */ -int -xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, - xmlRelaxNGValidityErrorFunc * err, - xmlRelaxNGValidityWarningFunc * warn, void **ctx) -{ - if (ctxt == NULL) - return (-1); - if (err != NULL) - *err = ctxt->error; - if (warn != NULL) - *warn = ctxt->warning; - if (ctx != NULL) - *ctx = ctxt->userData; - return (0); -} - -/** - * xmlRelaxNGValidateDoc: - * @ctxt: a Relax-NG validation context - * @doc: a parsed document tree - * - * Validate a document tree in memory. - * - * Returns 0 if the document is valid, a positive error code - * number otherwise and -1 in case of internal or API error. - */ -int -xmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) -{ - int ret; - - if ((ctxt == NULL) || (doc == NULL)) - return (-1); - - ctxt->doc = doc; - - ret = xmlRelaxNGValidateDocument(ctxt, doc); - /* - * TODO: build error codes - */ - if (ret == -1) - return (1); - return (ret); -} - -#define bottom_relaxng -#include "elfgcchack.h" -#endif /* LIBXML_SCHEMAS_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/rngparser.c b/ThirdParty/libxml2/vtklibxml2/rngparser.c deleted file mode 100644 index 0d1949a15a6..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/rngparser.c +++ /dev/null @@ -1,1595 +0,0 @@ -/** - * rngparser.c: parser for the Relax-NG compact syntax. - * - * Based on: - * RELAX NG Compact Syntax - * Committee Specification 21 November 2002 - * http://www.oasis-open.org/committees/relax-ng/compact-20021121.html - * - * See Copyright for the status of this software. - * - * Daniel Veillard <veillard@redhat.com> - */ - -#include <string.h> - -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/relaxng.h> -#include <libxml/dict.h> - -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -#define MAX_TOKEN 10 - -typedef enum { - CRNG_NONE = 0, - CRNG_OP = 1, - CRNG_KEYWORD, - CRNG_IDENTIFIER, - CRNG_LITERAL_SEGMENT, - CRNG_CNAME, - CRNG_QNAME, - CRNG_NSNAME, - CRNG_DOCUMENTATION -} xmlCRNGTokType; - -typedef enum { - CRNG_OKAY = 0, - CRNG_MEMORY_ERROR, - CRNG_INVALID_CHAR_ERROR, - CRNG_END_ERROR, - CRNG_ENCODING_ERROR -} xmlCRNGError; - -typedef enum { - XML_CRNG_ERROR = -1, - XML_CRNG_OK = 0, - XML_CRNG_EOF = 1 -} xmlCRelaxNGParserState; - -typedef struct _token _token; -typedef _token *tokenPtr; -struct _token { - xmlCRNGTokType toktype; - int toklen; - const xmlChar *token; - const xmlChar *prefix; -}; - -typedef struct _xmlCRelaxNGParserCtxt xmlCRelaxNGParserCtxt; -typedef xmlCRelaxNGParserCtxt *xmlCRelaxNGParserCtxtPtr; -struct _xmlCRelaxNGParserCtxt { - void *userData; /* user specific data block */ - xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */ - xmlRelaxNGValidityWarningFunc warning;/* the callback in case of warning */ - xmlRelaxNGValidErr err; - - const xmlChar *compact; - const xmlChar *end; - const xmlChar *cur; - int isElem; - int lineno; - const xmlChar *linestart; - const char *filename; - - int nbTokens; - int firstToken; - _token tokens[MAX_TOKEN]; - int totalToken; - - xmlCRelaxNGParserState state; - - int nbErrors; - - xmlDocPtr res; /* the result */ - xmlNodePtr ins; /* the current insertion node */ - - xmlNsPtr nsDef; - tokenPtr token; - - xmlHashTablePtr namespaces; - xmlHashTablePtr datatypes; - - /* - * dictionnary and keywords - */ - xmlDictPtr dict; - const xmlChar *key_attribute; - const xmlChar *key_default; - const xmlChar *key_datatypes; - const xmlChar *key_div; - const xmlChar *key_element; - const xmlChar *key_empty; - const xmlChar *key_external; - const xmlChar *key_grammar; - const xmlChar *key_include; - const xmlChar *key_inherit; - const xmlChar *key_list; - const xmlChar *key_mixed; - const xmlChar *key_namespace; - const xmlChar *key_notAllowed; - const xmlChar *key_parent; - const xmlChar *key_start; - const xmlChar *key_string; - const xmlChar *key_text; - const xmlChar *key_token; - const xmlChar *key_equal; - const xmlChar *key_orequal; - const xmlChar *key_andequal; - const xmlChar *key_combine; - const xmlChar *key_or; - const xmlChar *key_comma; - const xmlChar *key_and; - const xmlChar *key_choice; - const xmlChar *key_group; - const xmlChar *key_interleave; - const xmlChar *key_ref; - const xmlChar *key_define; - - /* results */ - xmlDocPtr doc; /* the resulting doc */ - xmlNodePtr insert; /* the insertion point */ - xmlAttrPtr attrs; /* pending attributes */ -}; - -static const xmlChar *xmlCRelaxNGInherit = BAD_CAST "Inherit string"; -static const xmlChar *xmlCRelaxNGDefault = BAD_CAST "Default string"; - -#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l) -/** - * IS_BLANK: - * @c: an UNICODE value (int) - * - * Macro to check the following production in the XML spec: - * - * [3] S ::= (#x20 | #x9 | #xD | #xA)+ - */ -#ifndef IS_BLANK -#define IS_BLANK(c) (((c) == 0x20) || ((c) == 0x09) || ((c) == 0xA) || \ - ((c) == 0x0D)) -#endif -#define IS_SEPARATOR(c) (((c) == 0x20) || ((c) == 0x09) || ((c) == 0xA) || \ - ((c) == 0x0D) || (c == '#')) - -#define CRNG_ERROR0(X) \ - { xmlCRNGErr(ctxt, X, NULL); return(0); } -#define CRNG_ERROR(X) \ - { xmlCRNGErr(ctxt, X, NULL); } - -#define CRNG_MEM_ERROR0() \ - { xmlCRNGErr(ctxt, CRNG_MEMORY_ERROR, NULL); return(0); } -#define CRNG_MEM_ERROR() \ - { xmlCRNGErr(ctxt, CRNG_MEMORY_ERROR, NULL); } - -#define ERROR(str) xmlCRNGErr(ctxt, 0, str); - -static void -xmlCRNGErr(xmlCRelaxNGParserCtxtPtr ctxt, int err_no, const char *err_msg) { - const xmlChar *cur; - xmlChar buffer[150]; - int i, l; - - if (ctxt != NULL) { - if (ctxt->filename != NULL) - fprintf(stderr, "%s:%d ", ctxt->filename, ctxt->lineno); - } - if (err_msg != NULL) { - fprintf(stderr, "error: %s\n", err_msg); - } else if (err_no != 0) - fprintf(stderr, "error %d\n", err_no); - cur = ctxt->cur; - while ((*cur != '\n') && (*cur != '\r') && (ctxt->cur - cur < 80)) cur--; - l = ctxt->cur - cur; - cur++; - for (i = 0; i < 100;i++) { - if ((*cur == '\n') || (*cur == '\r')) break; - buffer[i] = *cur++; - } - buffer[i] = 0; - fprintf(stderr, "%s\n", buffer); - for (i = 0; i < l;i++) buffer[i] = ' '; - buffer[i++] = '^'; - buffer[i++] = 0; - fprintf(stderr, "%s\n", buffer); -} - -/** - * IS_OP - * @c: an UNICODE value (int) - * - * Macro to check for operator value - */ -#ifndef IS_OP -#define IS_OP(c) (((c) == ',') || ((c) == '&') || ((c) == '|') || \ - ((c) == '?') || ((c) == '-') || ((c) == '*') || \ - ((c) == '{') || ((c) == '}') || ((c) == '(') || \ - ((c) == ')') || ((c) == '+') || ((c) == '=') || \ - ((c) == ':')) -#endif - -static int -xmlCRNGIsKeyword(xmlCRelaxNGParserCtxtPtr ctxt, const xmlChar *str) { - if ((str == ctxt->key_attribute) || - (str == ctxt->key_default) || - (str == ctxt->key_datatypes) || - (str == ctxt->key_div) || - (str == ctxt->key_element) || - (str == ctxt->key_empty) || - (str == ctxt->key_external) || - (str == ctxt->key_grammar) || - (str == ctxt->key_include) || - (str == ctxt->key_inherit) || - (str == ctxt->key_list) || - (str == ctxt->key_mixed) || - (str == ctxt->key_namespace) || - (str == ctxt->key_notAllowed) || - (str == ctxt->key_parent) || - (str == ctxt->key_start) || - (str == ctxt->key_string) || - (str == ctxt->key_text) || - (str == ctxt->key_token)) - return(1); - return(0); - -} - -/* - * xmlCRNGNextToken: - * ctxt: a compact RNG parser context - * - * Scan the schema to get the next token - * - * Return 0 if success and -1 in case of error - */ - -static int -xmlCRNGNextToken(xmlCRelaxNGParserCtxtPtr ctxt) { - const xmlChar *cur; - tokenPtr token; - - if (ctxt == NULL) return(-1); - if (ctxt->nbTokens >= MAX_TOKEN) return(-1); - token = &(ctxt->tokens[(ctxt->firstToken + ctxt->nbTokens) % MAX_TOKEN]); - token->toktype = CRNG_NONE; - - if (ctxt->cur == NULL) { - ctxt->cur = ctxt->compact; - } -retry: - if (ctxt->cur >= ctxt->end) { - ctxt->state = XML_CRNG_EOF; - return(-1); - } - while ((ctxt->cur < ctxt->end) && - (IS_BLANK(*ctxt->cur))) ctxt->cur++; - if (ctxt->cur >= ctxt->end) { - ctxt->state = XML_CRNG_EOF; - return(-1); - } - if (*ctxt->cur == '#') { - cur = ctxt->cur; - cur++; - while ((cur < ctxt->end) && (*cur != '\n') && (*cur != '\r')) - cur++; - ctxt->cur = cur; - goto retry; - } else if (*ctxt->cur == '"') { - /* string, check for '"""' */ - ctxt->cur++; - if (ctxt->cur >= ctxt->end) goto eof; - cur = ctxt->cur; - if ((ctxt->end - ctxt->end > 2) && - (*cur == '"') && (cur[1] == '"')) { - TODO - } else { - while ((cur < ctxt->end) && (*cur != '"')) cur++; - if (cur >= ctxt->end) goto eof; - token->toklen = cur - ctxt->cur; - token->token = xmlDictLookup(ctxt->dict, ctxt->cur, token->toklen); - token->toktype = CRNG_LITERAL_SEGMENT; - token->prefix = NULL; - cur++; - ctxt->cur = cur; - } - } else if (*ctxt->cur == '\'') { - /* string, check for "'''" */ - TODO - } else if ((IS_OP(*ctxt->cur)) || (*ctxt->cur == ':')) { - cur = ctxt->cur; - cur++; - if ((cur < ctxt->end) && - (((*cur == '=') && - ((*ctxt->cur == '|') || (*ctxt->cur == '&'))) || - ((*cur == '*') && (*ctxt->cur == ':')))) { - token->toklen = 2; - } else { - token->toklen = 1; - } - token->token = xmlDictLookup(ctxt->dict, ctxt->cur, token->toklen); - token->toktype = CRNG_OP; - token->prefix = NULL; - ctxt->cur += token->toklen; - } else { - int escape = 0; - - cur = ctxt->cur; - if (*cur == '\\') { - escape = 1; - cur++; - ctxt->cur++; - } - while ((cur < ctxt->end) && - (!(IS_SEPARATOR(*cur))) && (!(IS_OP(*cur)))) cur++; - - token->toklen = cur - ctxt->cur; - token->token = xmlDictLookup(ctxt->dict, ctxt->cur, token->toklen); - token->prefix = NULL; - ctxt->cur = cur; - if ((escape == 0) && (xmlCRNGIsKeyword(ctxt, token->token))) - token->toktype = CRNG_KEYWORD; - else { - token->toktype = CRNG_IDENTIFIER; - } - if (*ctxt->cur == ':') { - ctxt->cur++; - if (*ctxt->cur == '*') { - ctxt->cur++; - token->toktype = CRNG_NSNAME; - } else { - cur = ctxt->cur; - while ((cur < ctxt->end) && - (!(IS_SEPARATOR(*cur))) && (!(IS_OP(*cur)))) cur++; - token->prefix = token->token; - token->toklen = cur - ctxt->cur; - token->token = xmlDictLookup(ctxt->dict, ctxt->cur, - token->toklen); - ctxt->cur = cur; - if (xmlValidateNCName(token->token, 0) == 0) - token->toktype = CRNG_QNAME; - else { - TODO /* sounds like an error ! */ - token->toktype = CRNG_IDENTIFIER; - } - } - } - } - ctxt->nbTokens++; - return(0); -eof: - ctxt->state = XML_CRNG_EOF; - CRNG_ERROR(CRNG_END_ERROR); - return(-1); -} - -/** - * xmlParseCRNGGetToken: - * @ctxt: a compact RNG parser context - * @no: the number of the token from 1 for the first one - * and 2, 3 ... for read-ahead - * - * Token reading interface - * - * returns a pointer to the new token, or NULL in case of error or EOF - */ -static tokenPtr -xmlParseCRNGGetToken(xmlCRelaxNGParserCtxtPtr ctxt, int no) { - tokenPtr ret; - int res; - - if ((no <= 0) || (no >= MAX_TOKEN)) return(NULL); - no--; - while (ctxt->nbTokens <= no) { - res = xmlCRNGNextToken(ctxt); - if (res < 0) - return(NULL); - } - ret = &(ctxt->tokens[(ctxt->firstToken + no) % MAX_TOKEN]); - return(ret); -} - -/** - * xmlParseCRNGDropTokens: - * @ctxt: a compact RNG parser context - * @nr: the number of token marked as read - * - * mark a number of token as read and consumed. - * - * Returns -1 in case of error and 0 otherwise - */ -static int -xmlParseCRNGDropTokens(xmlCRelaxNGParserCtxtPtr ctxt, int nr) { - if ((nr <= 0) || (nr >= MAX_TOKEN)) return(-1); - while ((ctxt->nbTokens >0) && (nr > 0)) { - ctxt->firstToken++; - nr--; - ctxt->nbTokens--; - ctxt->totalToken++; - if (ctxt->totalToken == 384) - fprintf(stderr, "found\n"); - } - ctxt->firstToken = ctxt->firstToken % MAX_TOKEN; - return(0); -} - -static void -xmlParseCRNGTokenize(xmlCRelaxNGParserCtxtPtr ctxt) { - tokenPtr token; - - token = xmlParseCRNGGetToken(ctxt, 1); - while (token != NULL) { - switch (token->toktype) { - case CRNG_NONE: printf("none"); break; - case CRNG_OP: printf("op"); break; - case CRNG_KEYWORD: printf("keyword"); break; - case CRNG_IDENTIFIER: printf("identifier"); break; - case CRNG_LITERAL_SEGMENT: printf("literal"); break; - case CRNG_CNAME: printf("cname"); break; - case CRNG_QNAME: printf("qname"); break; - case CRNG_NSNAME: printf("nsname"); break; - case CRNG_DOCUMENTATION: printf("doc"); break; - } - printf(":%s\n", token->token); - xmlParseCRNGDropTokens(ctxt, 1); - token = xmlParseCRNGGetToken(ctxt, 1); - } -} - -/** - * xmlParseCRNG_attribute: - * @ctxt: a compact RNG parser context - * @name: the attribute name - * @ns: the attribute namespace - * @value: the attribute value - * - * implements attribute of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_attribute(xmlCRelaxNGParserCtxtPtr ctxt, - const xmlChar *name, - xmlNsPtr ns, - const xmlChar *value) -{ - xmlAttrPtr attr; - - attr = xmlNewNsPropEatName(NULL, ns, (xmlChar *) name, value); - if (attr == NULL) CRNG_MEM_ERROR0(); - attr->next = ctxt->attrs; - if (ctxt->attrs != NULL) - ctxt->attrs->prev = attr; - ctxt->attrs = attr; - return(0); -} - -/** - * xmlParseCRNG_bindPrefix: - * @ctxt: a compact RNG parser context - * @prefix: the namespace prefix or NULL - * @namespace: the namespace name - * - * implements bindPrefix of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_bindPrefix(xmlCRelaxNGParserCtxtPtr ctxt, - const xmlChar *prefix, - const xmlChar *namespace) -{ - int ret; - - if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xml")) && - (!xmlStrEqual(namespace, XML_XML_NAMESPACE))) { - ERROR("The \"xml\" prefix must be bound to \"http://www.w3.org/XML/1998/namespace\""); - return(-1); - } else if ((xmlStrEqual(namespace, XML_XML_NAMESPACE)) && - (!xmlStrEqual(prefix, BAD_CAST "xml"))) { - ERROR("The \"http://www.w3.org/XML/1998/namespace\" name must be bound to \"xml\" prefix"); - return(-1); - } - if (ctxt->namespaces == NULL) - ctxt->namespaces = xmlHashCreate(10); - if (ctxt->namespaces == NULL) { - ERROR("Failed to create namespace hash table"); - return(-1); - } - if (prefix == NULL) - ret = xmlHashAddEntry(ctxt->namespaces, xmlCRelaxNGDefault, - (void *) namespace); - else - ret = xmlHashAddEntry(ctxt->namespaces, prefix, - (void *) namespace); - if (ret < 0) { - if (prefix == NULL) { - ERROR("Redefinition of default namespace"); - } else { - ERROR("Redefinition of namespace"); - } - return(-1); - } - - return(0); -} - -/** - * xmlParseCRNG_bindDatatypePrefix: - * @ctxt: a compact RNG parser context - * @prefix: the datatype prefix - * @namespace: the datatype identifier - * - * implements bindDatatypePrefix of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_bindDatatypePrefix(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - const xmlChar *prefix, - const xmlChar *namespace) -{ - int ret; - - if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xsd")) && - (!xmlStrEqual(namespace, - BAD_CAST "http://www.w3.org/2001/XMLSchema-datatypes"))) { - ERROR("The \"xsd\" prefix must be bound to \"http://www.w3.org/2001/XMLSchema-datatypes\""); - return(-1); - } - if (ctxt->datatypes == NULL) - ctxt->datatypes = xmlHashCreate(10); - if (ctxt->datatypes == NULL) { - ERROR("Failed to create namespace hash table"); - return(-1); - } - ret = xmlHashAddEntry(ctxt->datatypes, prefix, - (void *) namespace); - if (ret < 0) { - ERROR("Redefinition of datatype"); - return(-1); - } - return(0); -} - -/** - * xmlParseCRNG_lookupPrefix: - * @ctxt: a compact RNG parser context - * @prefix: the namespace prefix or NULL - * - * implements lookupPrefix of the RELAX NG Compact Syntax Appendix A - * - * Returns the prefix in case of success or NULL in case of error - */ -static const xmlChar * -xmlParseCRNG_lookupPrefix(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - const xmlChar *prefix) -{ - const xmlChar *ret; - - if (prefix == NULL) - ret = xmlHashLookup(ctxt->namespaces, xmlCRelaxNGDefault); - else - ret = xmlHashLookup(ctxt->namespaces, prefix); - return(ret); -} - -/** - * xmlParseCRNG_lookupDatatypePrefix: - * @ctxt: a compact RNG parser context - * @prefix: the namespace prefix or NULL - * - * implements lookupDatatypePrefix of the RELAX NG Compact Syntax Appendix A - * - * Returns the prefix in case of success or NULL in case of error - */ -static const xmlChar * -xmlParseCRNG_lookupDatatypePrefix(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - const xmlChar *prefix) -{ - const xmlChar *ret; - ret = xmlHashLookup(ctxt->datatypes, prefix); - return(ret); -} - -/** - * xmlParseCRNG_datatypeAttributes: - * @ctxt: a compact RNG parser context - * @prefix: the namespace prefix or NULL - * - * implements lookupPrefix of the RELAX NG Compact Syntax Appendix A - * - * Returns the prefix in case of success or NULL in case of error - */ -static xmlAttrPtr -xmlParseCRNG_datatypeAttributes(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - const xmlChar *library, const xmlChar *type) -{ - xmlAttrPtr lib, typ; - - lib = xmlNewNsProp(NULL, NULL, BAD_CAST "datatypeLibrary", library); - if (lib == NULL) { - CRNG_MEM_ERROR(); - return(NULL); - } - typ = xmlNewNsProp(NULL, NULL, BAD_CAST "type", type); - if (typ == NULL) { - CRNG_MEM_ERROR(); - return(lib); - } - lib->next = typ; - - return(lib); -} - -/** - * xmlParseCRNG_XXX: - * @ctxt: a compact RNG parser context - * - * Parse XXX of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_XXX(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - return(0); -} - -static int xmlParseCRNG_pattern(xmlCRelaxNGParserCtxtPtr ctxt); -static int xmlParseCRNG_nameClass(xmlCRelaxNGParserCtxtPtr ctxt); - -/** - * xmlParseCRNG_params: - * @ctxt: a compact RNG parser context - * - * Parse params of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_params(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - TODO - return(0); -} - -/** - * xmlParseCRNG_exceptNameClass: - * @ctxt: a compact RNG parser context - * - * Parse exceptNameClass of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_exceptNameClass(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - tokenPtr token; - xmlNodePtr insert = ctxt->insert, cur; - - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype == CRNG_OP) && - (token->token[0] == '-') && (token->token[1] == 0)) { - xmlParseCRNGDropTokens(ctxt, 1); - cur = xmlNewNode(NULL, BAD_CAST "except"); - if (cur == NULL) CRNG_MEM_ERROR0(); - if (ctxt->insert != NULL) - xmlAddChild(ctxt->insert, cur); - ctxt->insert = cur; - xmlParseCRNG_nameClass(ctxt); - } - ctxt->insert = insert; - return(0); -} - -/** - * xmlParseCRNG_innerNameClass: - * @ctxt: a compact RNG parser context - * - * Parse innerNameClass of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_innerNameClass(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token; - xmlNodePtr cur; - - token = xmlParseCRNGGetToken(ctxt, 1); - if (token->toktype == CRNG_OP) { - if ((token->token[0] == '(') && (token->token[1] == 0)) { - xmlParseCRNGDropTokens(ctxt, 1); - xmlParseCRNG_nameClass(ctxt); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_OP) || - (token->token[0] != ')') || (token->token[1] != 0)) { - ERROR("Expecting \")\" here"); - } - xmlParseCRNGDropTokens(ctxt, 1); - } else if ((token->token[0] == '*') && (token->token[1] == 0)) { - xmlParseCRNGDropTokens(ctxt, 1); - cur = xmlNewNode(NULL, BAD_CAST "anyName"); - if (cur == NULL) CRNG_MEM_ERROR0(); - if (ctxt->insert != NULL) - xmlAddChild(ctxt->insert, cur); - ctxt->insert = cur; - xmlParseCRNG_exceptNameClass(ctxt); - } else { - TODO - } - } else if ((token->toktype == CRNG_IDENTIFIER) || - (token->toktype == CRNG_KEYWORD)) { - cur = xmlNewNode(NULL, BAD_CAST "name"); - if (cur == NULL) CRNG_MEM_ERROR0(); - if (ctxt->isElem) { - xmlSetProp(cur, BAD_CAST "ns", - xmlParseCRNG_lookupPrefix(ctxt, NULL)); - } else { - xmlSetProp(cur, BAD_CAST "ns", BAD_CAST ""); - } - xmlNodeAddContent(cur, token->token); - if (ctxt->insert != NULL) - xmlAddChild(ctxt->insert, cur); - ctxt->insert = cur; - xmlParseCRNGDropTokens(ctxt, 1); - } else if (token->toktype == CRNG_CNAME) { - TODO - } else if (token->toktype == CRNG_NSNAME) { - cur = xmlNewNode(NULL, BAD_CAST "nsName"); - if (cur == NULL) CRNG_MEM_ERROR0(); - xmlSetProp(cur, BAD_CAST "ns", - xmlParseCRNG_lookupPrefix(ctxt, token->token)); - if (ctxt->insert != NULL) - xmlAddChild(ctxt->insert, cur); - ctxt->insert = cur; - xmlParseCRNGDropTokens(ctxt, 1); - xmlParseCRNG_exceptNameClass(ctxt); - } else { - TODO /* probably an error */ - } - - return(0); -} - -/** - * xmlParseCRNG_nameClass: - * @ctxt: a compact RNG parser context - * - * Parse nameClass of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_nameClass(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token; - xmlNodePtr insert = ctxt->insert, last, choice; - - ctxt->insert = NULL; - xmlParseCRNG_innerNameClass(ctxt); - last = ctxt->insert; - token = xmlParseCRNGGetToken(ctxt, 1); - while ((token->toktype == CRNG_OP) && - (token->token[0] == '|') && (token->token[1] == 0)) { - choice = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_choice); - xmlParseCRNGDropTokens(ctxt, 1); - if (choice == NULL) CRNG_MEM_ERROR0(); - ctxt->insert = NULL; - xmlParseCRNG_innerNameClass(ctxt); - xmlAddChild(choice, last); - xmlAddChild(choice, ctxt->insert); - last = choice; - token = xmlParseCRNGGetToken(ctxt, 1); - } - xmlAddChild(insert, last); - - ctxt->insert = insert; - return(0); -} - -/** - * xmlParseCRNG_patternBlock: - * @ctxt: a compact RNG parser context - * - * Parse a pattern block of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_patternBlock(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token; - - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_OP) || - (token->token[0] != '{') || (token->token[1] != 0)) { - ERROR("Expecting \"{\" here"); - } - xmlParseCRNGDropTokens(ctxt, 1); - xmlParseCRNG_pattern(ctxt); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_OP) || - (token->token[0] != '}') || (token->token[1] != 0)) { - ERROR("Expecting \"}\" here"); - } - xmlParseCRNGDropTokens(ctxt, 1); - return(0); -} - -/** - * xmlParseCRNG_datatype: - * @ctxt: a compact RNG parser context - * - * Parse datatype of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_datatype(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - tokenPtr token; - xmlAttrPtr attrs = NULL; - - token = xmlParseCRNGGetToken(ctxt, 1); - if (token->toktype == CRNG_KEYWORD) { - if (token->token == ctxt->key_string) { - attrs = xmlParseCRNG_datatypeAttributes(ctxt, BAD_CAST "", - token->token); - xmlParseCRNGDropTokens(ctxt, 1); - } else if (token->token == ctxt->key_token) { - attrs = xmlParseCRNG_datatypeAttributes(ctxt, BAD_CAST "", - token->token); - xmlParseCRNGDropTokens(ctxt, 1); - } else { - TODO /* probably an error */ - } - } else if (token->toktype == CRNG_LITERAL_SEGMENT) { - ctxt->insert = xmlNewNode(NULL, BAD_CAST "value"); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - xmlNodeAddContent(ctxt->insert, token->token); - } else if (token->toktype == CRNG_QNAME) { - attrs = xmlParseCRNG_datatypeAttributes(ctxt, - xmlParseCRNG_lookupDatatypePrefix(ctxt, token->prefix), - token->token); - } else { - TODO - } - if (attrs != NULL) { - token = xmlParseCRNGGetToken(ctxt, 1); - if (token->toktype == CRNG_LITERAL_SEGMENT) { - ctxt->insert = xmlNewNode(NULL, BAD_CAST "value"); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) { - xmlFreePropList(attrs); - CRNG_MEM_ERROR0(); - } - ctxt->insert->properties = attrs; - xmlNodeAddContent(ctxt->insert, token->token); - } else if ((token->toktype == CRNG_OP) && - (token->token[0] == '{') && (token->token[0] == 0)) { - ctxt->insert = xmlNewNode(NULL, BAD_CAST "data"); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) { - xmlFreePropList(attrs); - CRNG_MEM_ERROR0(); - } - ctxt->insert->properties = attrs; - xmlParseCRNG_params(ctxt); - } else { - ctxt->insert = xmlNewNode(NULL, BAD_CAST "data"); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) { - xmlFreePropList(attrs); - CRNG_MEM_ERROR0(); - } - ctxt->insert->properties = attrs; - xmlNodeAddContent(ctxt->insert, token->token); - } - } - return(0); -} - -/** - * xmlParseCRNG_primary: - * @ctxt: a compact RNG parser context - * - * Parse primary of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_primary(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - tokenPtr token; - - token = xmlParseCRNGGetToken(ctxt, 1); - if (token == NULL) - return(0); - if (token->toktype == CRNG_KEYWORD) { - if (token->token == ctxt->key_element) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - ctxt->isElem = 1; - xmlParseCRNG_nameClass(ctxt); - xmlParseCRNG_patternBlock(ctxt); - } else if (token->token == ctxt->key_attribute) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - ctxt->isElem = 0; - xmlParseCRNG_nameClass(ctxt); - xmlParseCRNG_patternBlock(ctxt); - } else if (token->token == ctxt->key_mixed) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - xmlParseCRNG_patternBlock(ctxt); - } else if (token->token == ctxt->key_list) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - xmlParseCRNG_patternBlock(ctxt); - } else if (token->token == ctxt->key_empty) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - } else if (token->token == ctxt->key_notAllowed) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - } else if (token->token == ctxt->key_text) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - } else if (token->token == ctxt->key_parent) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - TODO - } else if (token->token == ctxt->key_grammar) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - TODO - } else if (token->token == ctxt->key_external) { - ctxt->insert = xmlNewNode(NULL, BAD_CAST "externalRef"); - xmlParseCRNGDropTokens(ctxt, 1); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - TODO - } else { - TODO - } - } else if (token->toktype == CRNG_IDENTIFIER) { - ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_ref); - if (ctxt->insert == NULL) CRNG_MEM_ERROR0(); - xmlSetProp(ctxt->insert, BAD_CAST "name", token->token); - xmlParseCRNGDropTokens(ctxt, 1); - } else if (token->toktype == CRNG_QNAME) { - xmlParseCRNG_datatype(ctxt); - } else if (token->toktype == CRNG_LITERAL_SEGMENT) { - xmlParseCRNG_datatype(ctxt); - } else if ((token->toktype == CRNG_OP) && - (token->token[0] == '(') && (token->token[1] == 0)) { - xmlParseCRNGDropTokens(ctxt, 1); - xmlParseCRNG_pattern(ctxt); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_OP) || - (token->token[0] != ')') || (token->token[1] != 0)) { - ERROR("Expecting \")\" here"); - } - xmlParseCRNGDropTokens(ctxt, 1); - } - return(0); -} - -/** - * xmlParseCRNG_particle: - * @ctxt: a compact RNG parser context - * - * Parse particle of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_particle(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token; - xmlNodePtr insert = ctxt->insert, res, tmp = NULL; - - ctxt->insert = NULL; - xmlParseCRNG_primary(ctxt); - res = ctxt->insert; - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token != NULL) && (token->toktype == CRNG_OP)) { - if ((token->token[0] == '*') && (token->token[1] == 0)) { - tmp = xmlNewNode(NULL, BAD_CAST "zeroOrMore"); - if (tmp == NULL) CRNG_MEM_ERROR0(); - } else if ((token->token[0] == '+') && (token->token[1] == 0)) { - tmp = xmlNewNode(NULL, BAD_CAST "oneOrMore"); - if (tmp == NULL) CRNG_MEM_ERROR0(); - } else if ((token->token[0] == '?') && (token->token[1] == 0)) { - tmp = xmlNewNode(NULL, BAD_CAST "optional"); - if (tmp == NULL) CRNG_MEM_ERROR0(); - } - if (tmp != NULL) { - xmlAddChild(tmp, res); - res = tmp; - xmlParseCRNGDropTokens(ctxt, 1); - } - } - if (insert != NULL) { - xmlAddChild(insert, res); - ctxt->insert = insert; - } else - ctxt->insert = res; - return(0); -} - -/** - * xmlParseCRNG_pattern: - * @ctxt: a compact RNG parser context - * - * Parse pattern of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_pattern(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token; - xmlNodePtr insert = ctxt->insert, prev, grp; - - ctxt->insert = NULL; - xmlParseCRNG_particle(ctxt); - prev = ctxt->insert; - token = xmlParseCRNGGetToken(ctxt, 1); - while ((prev != NULL) && (token != NULL) && (token->toktype == CRNG_OP)) { - if (token->token == ctxt->key_or) { - grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_choice); - if (grp == NULL) CRNG_MEM_ERROR0(); - } else if (token->token == ctxt->key_and) { - grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_interleave); - if (grp == NULL) CRNG_MEM_ERROR0(); - } else if (token->token == ctxt->key_comma) { - grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_group); - if (grp == NULL) CRNG_MEM_ERROR0(); - } else - break; - xmlParseCRNGDropTokens(ctxt, 1); - ctxt->insert = NULL; - xmlParseCRNG_particle(ctxt); - xmlAddChild(grp, prev); - xmlAddChild(grp, ctxt->insert); - prev = grp; - token = xmlParseCRNGGetToken(ctxt, 1); - } - if (insert != NULL) { - xmlAddChild(insert, prev); - ctxt->insert = insert; - } else { - ctxt->insert = prev; - } - - return(0); -} - -/** - * xmlParseCRNG_component: - * @ctxt: a compact RNG parser context - * - * Parse component of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_component(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token, tok2; - xmlNodePtr insert = ctxt->insert; - - token = xmlParseCRNGGetToken(ctxt, 1); - if (token == NULL) - return(0); - if (token->toktype == CRNG_KEYWORD) { - if (token->token == ctxt->key_start) { - xmlNodePtr start; - - start = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_start); - if (start == NULL) CRNG_MEM_ERROR0(); - if (ctxt->insert != NULL) - xmlAddChild(ctxt->insert, start); - ctxt->insert = start; - xmlParseCRNGDropTokens(ctxt, 1); - token = xmlParseCRNGGetToken(ctxt, 1); - - if ((token->toktype == CRNG_OP) && - (token->token == ctxt->key_equal)) { - } else if ((token->toktype == CRNG_OP) && - (token->token == ctxt->key_orequal)) { - xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL, - BAD_CAST "choice"); - } else if ((token->toktype == CRNG_OP) && - (token->token == ctxt->key_andequal)) { - xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL, - BAD_CAST "interleave"); - } else { - ERROR("expecting \"=\" or \"&=\" or \"|=\" here") - return(-1); - } - start->properties = ctxt->attrs; - ctxt->attrs = NULL; - xmlParseCRNGDropTokens(ctxt, 1); - xmlParseCRNG_pattern(ctxt); - - } else if (token->token == ctxt->key_include) { - TODO - } else if (token->token == ctxt->key_div) { - TODO - } else { - return(-1); - } - } else if (token->toktype == CRNG_IDENTIFIER) { - xmlNodePtr define; - const xmlChar *identifier; - - identifier = token->token; - tok2 = xmlParseCRNGGetToken(ctxt, 2); - if ((tok2->toktype == CRNG_OP) && - (tok2->token == ctxt->key_equal)) { - } else if ((tok2->toktype == CRNG_OP) && - (tok2->token == ctxt->key_orequal)) { - xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL, - BAD_CAST "choice"); - } else if ((tok2->toktype == CRNG_OP) && - (tok2->token == ctxt->key_andequal)) { - xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL, - BAD_CAST "interleave"); - } else { - ERROR("expecting \"=\" or \"&=\" or \"|=\" here") - return(-1); - } - xmlParseCRNGDropTokens(ctxt, 2); - - define = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_define); - if (define == NULL) CRNG_MEM_ERROR0(); - define->properties = ctxt->attrs; - ctxt->attrs = NULL; - xmlSetProp(define, BAD_CAST "name", identifier); - if (ctxt->insert != NULL) - xmlAddChild(ctxt->insert, define); - ctxt->insert = define; - xmlParseCRNG_pattern(ctxt); - } else { - return(-1); - } - ctxt->insert = insert; - return(0); -} - -/** - * xmlParseCRNG_grammar: - * @ctxt: a compact RNG parser context - * - * Parse grammar of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_grammar(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED) -{ - tokenPtr token; - int ret; - - token = xmlParseCRNGGetToken(ctxt, 1); - while (token != NULL) { - ret = xmlParseCRNG_component(ctxt); - if (ret != 0) - break; - token = xmlParseCRNGGetToken(ctxt, 1); - } - return(0); -} - -/** - * xmlParseCRNG_topLevelBody: - * @ctxt: a compact RNG parser context - * - * Parse topLevelBody of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_topLevelBody(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token, tok2; - - token = xmlParseCRNGGetToken(ctxt, 1); - if (token->toktype == CRNG_KEYWORD) { - if ((token->token == ctxt->key_start) || - (token->token == ctxt->key_include) || - (token->token == ctxt->key_div)) { - xmlNodePtr grammar; - - grammar = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_grammar); - if (grammar == NULL) CRNG_MEM_ERROR0(); - xmlDocSetRootElement(ctxt->doc, grammar); - ctxt->insert = grammar; - - xmlParseCRNG_grammar(ctxt); - } else { - xmlParseCRNG_pattern(ctxt); - } - } else { - tok2 = xmlParseCRNGGetToken(ctxt, 2); - if ((tok2->toktype == CRNG_OP) && - ((tok2->token == ctxt->key_equal) || - (tok2->token == ctxt->key_orequal) || - (tok2->token == ctxt->key_andequal))) { - xmlNodePtr grammar; - - grammar = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_grammar); - if (grammar == NULL) CRNG_MEM_ERROR0(); - xmlDocSetRootElement(ctxt->doc, grammar); - ctxt->insert = grammar; - - xmlParseCRNG_grammar(ctxt); - } else { - xmlParseCRNG_pattern(ctxt); - } - } - return(0); -} - -/** - * xmlParseCRNG_namespacePrefix: - * @ctxt: a compact RNG parser context - * - * Parse namespacePrefix of the RELAX NG Compact Syntax Appendix A - * - * Returns the prefix or NULL in case of error - */ -static const xmlChar * -xmlParseCRNG_namespacePrefix(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token; - const xmlChar *prefix = NULL; - - token = xmlParseCRNGGetToken(ctxt, 1); - if (token->toktype == CRNG_IDENTIFIER) { - prefix = token->token; - } else if (token->toktype == CRNG_OP) { - if ((token->token[0] == '=') && (token->token[1] == 0)) - return(NULL); - prefix = token->token; - } else { - ERROR("Expecting a namespace prefix"); - return(NULL); - } - xmlParseCRNGDropTokens(ctxt, 1); - - if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { - ERROR("Namespace prefix \"xmlns\" is forbidden"); - } - return(prefix); -} - -/** - * xmlParseCRNG_decl: - * @ctxt: a compact RNG parser context - * - * Parse decl of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_decl(xmlCRelaxNGParserCtxtPtr ctxt) -{ - const xmlChar *prefix = NULL; - const xmlChar *namespace = NULL; - tokenPtr token; - - token = xmlParseCRNGGetToken(ctxt, 1); - if (token->toktype != CRNG_KEYWORD) return(-1); - if (token->token == ctxt->key_default) { - xmlParseCRNGDropTokens(ctxt, 1); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_KEYWORD) || - (token->token != ctxt->key_namespace)) { - ERROR("Expecting keyword \"namespace\" after \"default\""); - } - xmlParseCRNGDropTokens(ctxt, 1); - prefix = xmlParseCRNG_namespacePrefix(ctxt); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_OP) || - (token->token[0] != '=') || (token->token[1] != 0)) { - ERROR("Expecting keyword \"=\" here"); - } - xmlParseCRNGDropTokens(ctxt, 1); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype == CRNG_KEYWORD) && - (token->token == ctxt->key_inherit)) { - namespace = xmlCRelaxNGInherit; - } else if (token->toktype == CRNG_LITERAL_SEGMENT) { - namespace = token->token; - } else { - ERROR("Expecting an URI or \"inherit\" value"); - } - xmlParseCRNGDropTokens(ctxt, 1); - if (namespace != NULL) { - if (prefix != NULL) - xmlParseCRNG_bindPrefix(ctxt, prefix, namespace); - xmlParseCRNG_bindPrefix(ctxt, NULL, namespace); - } - } else if (token->token == ctxt->key_namespace) { - xmlParseCRNGDropTokens(ctxt, 1); - prefix = xmlParseCRNG_namespacePrefix(ctxt); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_OP) || - (token->token[0] != '=') || (token->token[1] != 0)) { - ERROR("Expecting keyword \"=\" here"); - } - xmlParseCRNGDropTokens(ctxt, 1); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype == CRNG_KEYWORD) && - (token->token == ctxt->key_inherit)) { - namespace = xmlCRelaxNGInherit; - } else if (token->toktype == CRNG_LITERAL_SEGMENT) { - namespace = token->token; - } else { - ERROR("Expecting an URI or \"inherit\" value"); - } - xmlParseCRNGDropTokens(ctxt, 1); - if (namespace != NULL) - xmlParseCRNG_bindPrefix(ctxt, prefix, namespace); - } else if (token->token == ctxt->key_datatypes) { - xmlParseCRNGDropTokens(ctxt, 1); - - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_KEYWORD) && - (token->toktype != CRNG_IDENTIFIER)) { - ERROR("Expecting a datatype prefix identifier here"); - } else - prefix = token->token; - xmlParseCRNGDropTokens(ctxt, 1); - token = xmlParseCRNGGetToken(ctxt, 1); - if ((token->toktype != CRNG_OP) || - (token->token[0] != '=') || (token->token[1] != 0)) { - ERROR("Expecting keyword \"=\" here"); - } - xmlParseCRNGDropTokens(ctxt, 1); - token = xmlParseCRNGGetToken(ctxt, 1); - if (token->toktype == CRNG_LITERAL_SEGMENT) { - namespace = token->token; - } else { - ERROR("Expecting a literal value for the datatype identifier"); - } - xmlParseCRNGDropTokens(ctxt, 1); - if ((namespace != NULL) && (prefix != NULL)) - xmlParseCRNG_bindDatatypePrefix(ctxt, prefix, namespace); - } - - return(0); -} - -/** - * xmlParseCRNG_preamble: - * @ctxt: a compact RNG parser context - * - * Parse preamble of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_preamble(xmlCRelaxNGParserCtxtPtr ctxt) -{ - tokenPtr token; - - token = xmlParseCRNGGetToken(ctxt, 1); - while (token != NULL) { - if (token == NULL) return(-1); - if ((token->toktype == CRNG_KEYWORD) && - ((token->token == ctxt->key_default) || - (token->token == ctxt->key_namespace) || - (token->token == ctxt->key_datatypes))) { - xmlParseCRNG_decl(ctxt); - } else - break; - token = xmlParseCRNGGetToken(ctxt, 1); - } - return(0); -} - -/** - * xmlParseCRNG_topLevel: - * @ctxt: a compact RNG parser context - * - * Parse topLevel of the RELAX NG Compact Syntax Appendix A - * - * Returns 0 in case of success and -1 in case of error - */ -static int -xmlParseCRNG_topLevel(xmlCRelaxNGParserCtxtPtr ctxt) -{ - xmlParseCRNG_preamble(ctxt); - xmlParseCRNG_topLevelBody(ctxt); - return(0); -} - -/** - * xmlConvertCRNG: - * @schemas: pointer to the text of the compact schemas - * @len: length of the schemas in bytes (or 0) - * @encoding: encoding indicated by the context or NULL - * - * Compiles the schemas into the equivalent Relax-NG XML structure - * - * Returns the xmlDocPtr resulting from the compilation or - * NULL in case of error - */ -xmlDocPtr -xmlConvertCRNG(const char *schemas, int len, const char *encoding) { - struct _xmlCRelaxNGParserCtxt ctxt; - xmlDocPtr ret = NULL; - - if (schemas == NULL) return(NULL); - if (len <= 5) len = xmlStrlen((const unsigned char *) schemas); - if (len <= 0) return(NULL); - - memset(&ctxt, 0, sizeof(ctxt)); - ctxt.compact = (const unsigned char *) schemas; - ctxt.cur = (const unsigned char *) schemas; - ctxt.end = (const unsigned char *) &schemas[len]; - ctxt.dict = xmlDictCreate(); - if (ctxt.dict == NULL) - return(NULL); - ctxt.doc = xmlNewDoc(NULL); - if (ctxt.doc == NULL) { - xmlDictFree(ctxt.dict); - return(NULL); - } - ctxt.doc->dict = ctxt.dict; - xmlDictReference(ctxt.dict); - - ctxt.nbTokens = 0; - ctxt.firstToken = 0; - ctxt.key_attribute = xmlDictLookup(ctxt.dict, BAD_CAST "attribute", -1); - ctxt.key_default = xmlDictLookup(ctxt.dict, BAD_CAST "default", -1); - ctxt.key_datatypes = xmlDictLookup(ctxt.dict, BAD_CAST "datatypes", -1); - ctxt.key_div = xmlDictLookup(ctxt.dict, BAD_CAST "div", -1); - ctxt.key_element = xmlDictLookup(ctxt.dict, BAD_CAST "element", -1); - ctxt.key_empty = xmlDictLookup(ctxt.dict, BAD_CAST "empty", -1); - ctxt.key_external = xmlDictLookup(ctxt.dict, BAD_CAST "external", -1); - ctxt.key_grammar = xmlDictLookup(ctxt.dict, BAD_CAST "grammar", -1); - ctxt.key_include = xmlDictLookup(ctxt.dict, BAD_CAST "include", -1); - ctxt.key_inherit = xmlDictLookup(ctxt.dict, BAD_CAST "inherit", -1); - ctxt.key_list = xmlDictLookup(ctxt.dict, BAD_CAST "list", -1); - ctxt.key_mixed = xmlDictLookup(ctxt.dict, BAD_CAST "mixed", -1); - ctxt.key_namespace = xmlDictLookup(ctxt.dict, BAD_CAST "namespace", -1); - ctxt.key_notAllowed = xmlDictLookup(ctxt.dict, BAD_CAST "notAllowed", -1); - ctxt.key_parent = xmlDictLookup(ctxt.dict, BAD_CAST "parent", -1); - ctxt.key_start = xmlDictLookup(ctxt.dict, BAD_CAST "start", -1); - ctxt.key_string = xmlDictLookup(ctxt.dict, BAD_CAST "string", -1); - ctxt.key_text = xmlDictLookup(ctxt.dict, BAD_CAST "text", -1); - ctxt.key_token = xmlDictLookup(ctxt.dict, BAD_CAST "token", -1); - ctxt.key_equal = xmlDictLookup(ctxt.dict, BAD_CAST "=", 1); - ctxt.key_orequal = xmlDictLookup(ctxt.dict, BAD_CAST "|=", 2); - ctxt.key_andequal = xmlDictLookup(ctxt.dict, BAD_CAST "&=", 2); - ctxt.key_combine = xmlDictLookup(ctxt.dict, BAD_CAST "&=", 2); - ctxt.key_or = xmlDictLookup(ctxt.dict, BAD_CAST "|", 1); - ctxt.key_comma = xmlDictLookup(ctxt.dict, BAD_CAST ",", 1); - ctxt.key_and = xmlDictLookup(ctxt.dict, BAD_CAST "&", 1); - ctxt.key_choice = xmlDictLookup(ctxt.dict, BAD_CAST "choice", -1); - ctxt.key_group = xmlDictLookup(ctxt.dict, BAD_CAST "group", -1); - ctxt.key_interleave = xmlDictLookup(ctxt.dict, BAD_CAST "interleave", -1); - ctxt.key_ref = xmlDictLookup(ctxt.dict, BAD_CAST "ref", 3); - ctxt.key_define = xmlDictLookup(ctxt.dict, BAD_CAST "define", 6); - - /* xmlConvertCRNGTokenize(&ctxt); */ - xmlConvertCRNG_topLevel(&ctxt); - - xmlDictFree(ctxt.dict); - - ret = ctxt.doc; - return(ret); -} - -/** - * xmlConvertCRNGFile: - * @URL: URL or filename for the resource - * @encoding: encoding indicated by the context or NULL - * - * Compiles the schemas into the equivalent Relax-NG XML structure - * - * Returns the xmlDocPtr resulting from the compilation or - * NULL in case of error - */ -xmlDocPtr -xmlConvertCRNGFile(const char *URL, const char *encoding) { -} - -#ifdef STANDALONE -const xmlChar *schemas = -"# RELAX NG XML syntax specified in compact syntax.\n\ -\n\ -default namespace rng = \"http://relaxng.org/ns/structure/1.0\"\n\ -namespace local = \"\"\n\ -datatypes xsd = \"http://www.w3.org/2001/XMLSchema-datatypes\"\n\ -\n\ -start = pattern\n\ -\n\ -pattern =\n\ - element element { (nameQName | nameClass), (common & pattern+) }\n\ - | element attribute { (nameQName | nameClass), (common & pattern?) }\n\ - | element group|interleave|choice|optional\n\ - |zeroOrMore|oneOrMore|list|mixed { common & pattern+ }\n\ - | element ref|parentRef { nameNCName, common }\n\ - | element empty|notAllowed|text { common }\n\ - | element data { type, param*, (common & exceptPattern?) }\n\ - | element value { commonAttributes, type?, xsd:string }\n\ - | element externalRef { href, common }\n\ - | element grammar { common & grammarContent* }\n\ -\n\ -param = element param { commonAttributes, nameNCName, xsd:string }\n\ -\n\ -exceptPattern = element except { common & pattern+ }\n\ -\n\ -grammarContent =\n\ - definition\n\ - | element div { common & grammarContent* }\n\ - | element include { href, (common & includeContent*) }\n\ -\n\ -includeContent =\n\ - definition\n\ - | element div { common & includeContent* }\n\ -\n\ -definition =\n\ - element start { combine?, (common & pattern+) }\n\ - | element define { nameNCName, combine?, (common & pattern+) }\n\ -\n\ -combine = attribute combine { \"choice\" | \"interleave\" }\n\ -\n\ -nameClass =\n\ - element name { commonAttributes, xsd:QName }\n\ - | element anyName { common & exceptNameClass? }\n\ - | element nsName { common & exceptNameClass? }\n\ - | element choice { common & nameClass+ }\n\ -\n\ -exceptNameClass = element except { common & nameClass+ }\n\ -\n\ -nameQName = attribute name { xsd:QName }\n\ -nameNCName = attribute name { xsd:NCName }\n\ -href = attribute href { xsd:anyURI }\n\ -type = attribute type { xsd:NCName }\n\ -\n\ -common = commonAttributes, foreignElement*\n\ -\n\ -commonAttributes =\n\ - attribute ns { xsd:string }?,\n\ - attribute datatypeLibrary { xsd:anyURI }?,\n\ - foreignAttribute*\n\ -\n\ -foreignElement = element * - rng:* { (anyAttribute | text | anyElement)* }\n\ -foreignAttribute = attribute * - (rng:*|local:*) { text }\n\ -anyElement = element * { (anyAttribute | text | anyElement)* }\n\ -anyAttribute = attribute * { text }\n\ -"; - -int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { - xmlDocPtr res; - - res = xmlConvertCRNG(schemas, -1); - if (res != NULL) { - xmlDocFormatDump(stdout, res, 1); - xmlFreeDoc(res); - } - return(0); -} -#endif -#define bottom_rngparser -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/runsuite.c b/ThirdParty/libxml2/vtklibxml2/runsuite.c deleted file mode 100644 index 3f5a62dcda2..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/runsuite.c +++ /dev/null @@ -1,1184 +0,0 @@ -/* - * runsuite.c: C program to run libxml2 againts published testsuites - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#ifdef HAVE_CONFIG_H -#include "libxml.h" -#else -#include <stdio.h> -#endif - -#if !defined(_WIN32) || defined(__CYGWIN__) -#include <unistd.h> -#endif -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/tree.h> -#include <libxml/uri.h> -#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_XPATH_ENABLED) -#include <libxml/xmlreader.h> - -#include <libxml/xpath.h> -#include <libxml/xpathInternals.h> - -#include <libxml/relaxng.h> -#include <libxml/xmlschemas.h> -#include <libxml/xmlschemastypes.h> - -#define LOGFILE "runsuite.log" -static FILE *logfile = NULL; -static int verbose = 0; - - - -#if defined(_WIN32) && !defined(__CYGWIN__) - -#define vsnprintf _vsnprintf - -#define snprintf _snprintf - -#endif - -/************************************************************************ - * * - * File name and path utilities * - * * - ************************************************************************/ - -static int checkTestFile(const char *filename) { - struct stat buf; - - if (stat(filename, &buf) == -1) - return(0); - -#if defined(_WIN32) && !defined(__CYGWIN__) - if (!(buf.st_mode & _S_IFREG)) - return(0); -#else - if (!S_ISREG(buf.st_mode)) - return(0); -#endif - - return(1); -} - -static xmlChar *composeDir(const xmlChar *dir, const xmlChar *path) { - char buf[500]; - - if (dir == NULL) return(xmlStrdup(path)); - if (path == NULL) return(NULL); - - snprintf(buf, 500, "%s/%s", (const char *) dir, (const char *) path); - return(xmlStrdup((const xmlChar *) buf)); -} - -/************************************************************************ - * * - * Libxml2 specific routines * - * * - ************************************************************************/ - -static int nb_tests = 0; -static int nb_errors = 0; -static int nb_internals = 0; -static int nb_schematas = 0; -static int nb_unimplemented = 0; -static int nb_leaks = 0; -static int extraMemoryFromResolver = 0; - -static int -fatalError(void) { - fprintf(stderr, "Exitting tests on fatal error\n"); - exit(1); -} - -/* - * that's needed to implement <resource> - */ -#define MAX_ENTITIES 20 -static char *testEntitiesName[MAX_ENTITIES]; -static char *testEntitiesValue[MAX_ENTITIES]; -static int nb_entities = 0; -static void resetEntities(void) { - int i; - - for (i = 0;i < nb_entities;i++) { - if (testEntitiesName[i] != NULL) - xmlFree(testEntitiesName[i]); - if (testEntitiesValue[i] != NULL) - xmlFree(testEntitiesValue[i]); - } - nb_entities = 0; -} -static int addEntity(char *name, char *content) { - if (nb_entities >= MAX_ENTITIES) { - fprintf(stderr, "Too many entities defined\n"); - return(-1); - } - testEntitiesName[nb_entities] = name; - testEntitiesValue[nb_entities] = content; - nb_entities++; - return(0); -} - -/* - * We need to trap calls to the resolver to not account memory for the catalog - * which is shared to the current running test. We also don't want to have - * network downloads modifying tests. - */ -static xmlParserInputPtr -testExternalEntityLoader(const char *URL, const char *ID, - xmlParserCtxtPtr ctxt) { - xmlParserInputPtr ret; - int i; - - for (i = 0;i < nb_entities;i++) { - if (!strcmp(testEntitiesName[i], URL)) { - ret = xmlNewStringInputStream(ctxt, - (const xmlChar *) testEntitiesValue[i]); - if (ret != NULL) { - ret->filename = (const char *) - xmlStrdup((xmlChar *)testEntitiesName[i]); - } - return(ret); - } - } - if (checkTestFile(URL)) { - ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); - } else { - int memused = xmlMemUsed(); - ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); - extraMemoryFromResolver += xmlMemUsed() - memused; - } -#if 0 - if (ret == NULL) { - fprintf(stderr, "Failed to find resource %s\n", URL); - } -#endif - - return(ret); -} - -/* - * Trapping the error messages at the generic level to grab the equivalent of - * stderr messages on CLI tools. - */ -static char testErrors[32769]; -static int testErrorsSize = 0; - -static void test_log(const char *msg, ...) { - va_list args; - if (logfile != NULL) { - fprintf(logfile, "\n------------\n"); - va_start(args, msg); - vfprintf(logfile, msg, args); - va_end(args); - fprintf(logfile, "%s", testErrors); - testErrorsSize = 0; testErrors[0] = 0; - } - if (verbose) { - va_start(args, msg); - vfprintf(stderr, msg, args); - va_end(args); - } -} - -static void -testErrorHandler(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) { - va_list args; - int res; - - if (testErrorsSize >= 32768) - return; - va_start(args, msg); - res = vsnprintf(&testErrors[testErrorsSize], - 32768 - testErrorsSize, - msg, args); - va_end(args); - if (testErrorsSize + res >= 32768) { - /* buffer is full */ - testErrorsSize = 32768; - testErrors[testErrorsSize] = 0; - } else { - testErrorsSize += res; - } - testErrors[testErrorsSize] = 0; -} - -static xmlXPathContextPtr ctxtXPath; - -static void -initializeLibxml2(void) { - xmlGetWarningsDefaultValue = 0; - xmlPedanticParserDefault(0); - - xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup); - xmlInitParser(); - xmlSetExternalEntityLoader(testExternalEntityLoader); - ctxtXPath = xmlXPathNewContext(NULL); - /* - * Deactivate the cache if created; otherwise we have to create/free it - * for every test, since it will confuse the memory leak detection. - * Note that normally this need not be done, since the cache is not - * created until set explicitly with xmlXPathContextSetCache(); - * but for test purposes it is sometimes useful to activate the - * cache by default for the whole library. - */ - if (ctxtXPath->cache != NULL) - xmlXPathContextSetCache(ctxtXPath, 0, -1, 0); - /* used as default nanemspace in xstc tests */ - xmlXPathRegisterNs(ctxtXPath, BAD_CAST "ts", BAD_CAST "TestSuite"); - xmlXPathRegisterNs(ctxtXPath, BAD_CAST "xlink", - BAD_CAST "http://www.w3.org/1999/xlink"); - xmlSetGenericErrorFunc(NULL, testErrorHandler); -#ifdef LIBXML_SCHEMAS_ENABLED - xmlSchemaInitTypes(); - xmlRelaxNGInitTypes(); -#endif -} - -static xmlNodePtr -getNext(xmlNodePtr cur, const char *xpath) { - xmlNodePtr ret = NULL; - xmlXPathObjectPtr res; - xmlXPathCompExprPtr comp; - - if ((cur == NULL) || (cur->doc == NULL) || (xpath == NULL)) - return(NULL); - ctxtXPath->doc = cur->doc; - ctxtXPath->node = cur; - comp = xmlXPathCompile(BAD_CAST xpath); - if (comp == NULL) { - fprintf(stderr, "Failed to compile %s\n", xpath); - return(NULL); - } - res = xmlXPathCompiledEval(comp, ctxtXPath); - xmlXPathFreeCompExpr(comp); - if (res == NULL) - return(NULL); - if ((res->type == XPATH_NODESET) && - (res->nodesetval != NULL) && - (res->nodesetval->nodeNr > 0) && - (res->nodesetval->nodeTab != NULL)) - ret = res->nodesetval->nodeTab[0]; - xmlXPathFreeObject(res); - return(ret); -} - -static xmlChar * -getString(xmlNodePtr cur, const char *xpath) { - xmlChar *ret = NULL; - xmlXPathObjectPtr res; - xmlXPathCompExprPtr comp; - - if ((cur == NULL) || (cur->doc == NULL) || (xpath == NULL)) - return(NULL); - ctxtXPath->doc = cur->doc; - ctxtXPath->node = cur; - comp = xmlXPathCompile(BAD_CAST xpath); - if (comp == NULL) { - fprintf(stderr, "Failed to compile %s\n", xpath); - return(NULL); - } - res = xmlXPathCompiledEval(comp, ctxtXPath); - xmlXPathFreeCompExpr(comp); - if (res == NULL) - return(NULL); - if (res->type == XPATH_STRING) { - ret = res->stringval; - res->stringval = NULL; - } - xmlXPathFreeObject(res); - return(ret); -} - -/************************************************************************ - * * - * Test test/xsdtest/xsdtestsuite.xml * - * * - ************************************************************************/ - -static int -xsdIncorectTestCase(xmlNodePtr cur) { - xmlNodePtr test; - xmlBufferPtr buf; - xmlRelaxNGParserCtxtPtr pctxt; - xmlRelaxNGPtr rng = NULL; - int ret = 0, memt; - - cur = getNext(cur, "./incorrect[1]"); - if (cur == NULL) { - return(0); - } - - test = getNext(cur, "./*"); - if (test == NULL) { - test_log("Failed to find test in correct line %ld\n", - xmlGetLineNo(cur)); - return(1); - } - - memt = xmlMemUsed(); - extraMemoryFromResolver = 0; - /* - * dump the schemas to a buffer, then reparse it and compile the schemas - */ - buf = xmlBufferCreate(); - if (buf == NULL) { - fprintf(stderr, "out of memory !\n"); - fatalError(); - } - xmlNodeDump(buf, test->doc, test, 0, 0); - pctxt = xmlRelaxNGNewMemParserCtxt((const char *)buf->content, buf->use); - xmlRelaxNGSetParserErrors(pctxt, - (xmlRelaxNGValidityErrorFunc) testErrorHandler, - (xmlRelaxNGValidityWarningFunc) testErrorHandler, - pctxt); - rng = xmlRelaxNGParse(pctxt); - xmlRelaxNGFreeParserCtxt(pctxt); - if (rng != NULL) { - test_log("Failed to detect incorect RNG line %ld\n", - xmlGetLineNo(test)); - ret = 1; - goto done; - } - -done: - if (buf != NULL) - xmlBufferFree(buf); - if (rng != NULL) - xmlRelaxNGFree(rng); - xmlResetLastError(); - if ((memt != xmlMemUsed()) && (extraMemoryFromResolver == 0)) { - test_log("Validation of tests starting line %ld leaked %d\n", - xmlGetLineNo(cur), xmlMemUsed() - memt); - nb_leaks++; - } - return(ret); -} - -static void -installResources(xmlNodePtr tst, const xmlChar *base) { - xmlNodePtr test; - xmlBufferPtr buf; - xmlChar *name, *content, *res; - - buf = xmlBufferCreate(); - if (buf == NULL) { - fprintf(stderr, "out of memory !\n"); - fatalError(); - } - xmlNodeDump(buf, tst->doc, tst, 0, 0); - - while (tst != NULL) { - test = getNext(tst, "./*"); - if (test != NULL) { - xmlBufferEmpty(buf); - xmlNodeDump(buf, test->doc, test, 0, 0); - name = getString(tst, "string(@name)"); - content = xmlStrdup(buf->content); - if ((name != NULL) && (content != NULL)) { - res = composeDir(base, name); - xmlFree(name); - addEntity((char *) res, (char *) content); - } else { - if (name != NULL) xmlFree(name); - if (content != NULL) xmlFree(content); - } - } - tst = getNext(tst, "following-sibling::resource[1]"); - } - if (buf != NULL) - xmlBufferFree(buf); -} - -static void -installDirs(xmlNodePtr tst, const xmlChar *base) { - xmlNodePtr test; - xmlChar *name, *res; - - name = getString(tst, "string(@name)"); - if (name == NULL) - return; - res = composeDir(base, name); - xmlFree(name); - if (res == NULL) { - return; - } - /* Now process resources and subdir recursively */ - test = getNext(tst, "./resource[1]"); - if (test != NULL) { - installResources(test, res); - } - test = getNext(tst, "./dir[1]"); - while (test != NULL) { - installDirs(test, res); - test = getNext(test, "following-sibling::dir[1]"); - } - xmlFree(res); -} - -static int -xsdTestCase(xmlNodePtr tst) { - xmlNodePtr test, tmp, cur; - xmlBufferPtr buf; - xmlDocPtr doc = NULL; - xmlRelaxNGParserCtxtPtr pctxt; - xmlRelaxNGValidCtxtPtr ctxt; - xmlRelaxNGPtr rng = NULL; - int ret = 0, mem, memt; - xmlChar *dtd; - - resetEntities(); - testErrorsSize = 0; testErrors[0] = 0; - - tmp = getNext(tst, "./dir[1]"); - if (tmp != NULL) { - installDirs(tmp, NULL); - } - tmp = getNext(tst, "./resource[1]"); - if (tmp != NULL) { - installResources(tmp, NULL); - } - - cur = getNext(tst, "./correct[1]"); - if (cur == NULL) { - return(xsdIncorectTestCase(tst)); - } - - test = getNext(cur, "./*"); - if (test == NULL) { - fprintf(stderr, "Failed to find test in correct line %ld\n", - xmlGetLineNo(cur)); - return(1); - } - - memt = xmlMemUsed(); - extraMemoryFromResolver = 0; - /* - * dump the schemas to a buffer, then reparse it and compile the schemas - */ - buf = xmlBufferCreate(); - if (buf == NULL) { - fprintf(stderr, "out of memory !\n"); - fatalError(); - } - xmlNodeDump(buf, test->doc, test, 0, 0); - pctxt = xmlRelaxNGNewMemParserCtxt((const char *)buf->content, buf->use); - xmlRelaxNGSetParserErrors(pctxt, - (xmlRelaxNGValidityErrorFunc) testErrorHandler, - (xmlRelaxNGValidityWarningFunc) testErrorHandler, - pctxt); - rng = xmlRelaxNGParse(pctxt); - xmlRelaxNGFreeParserCtxt(pctxt); - if (extraMemoryFromResolver) - memt = 0; - - if (rng == NULL) { - test_log("Failed to parse RNGtest line %ld\n", - xmlGetLineNo(test)); - nb_errors++; - ret = 1; - goto done; - } - /* - * now scan all the siblings of correct to process the <valid> tests - */ - tmp = getNext(cur, "following-sibling::valid[1]"); - while (tmp != NULL) { - dtd = xmlGetProp(tmp, BAD_CAST "dtd"); - test = getNext(tmp, "./*"); - if (test == NULL) { - fprintf(stderr, "Failed to find test in <valid> line %ld\n", - xmlGetLineNo(tmp)); - - } else { - xmlBufferEmpty(buf); - if (dtd != NULL) - xmlBufferAdd(buf, dtd, -1); - xmlNodeDump(buf, test->doc, test, 0, 0); - - /* - * We are ready to run the test - */ - mem = xmlMemUsed(); - extraMemoryFromResolver = 0; - doc = xmlReadMemory((const char *)buf->content, buf->use, - "test", NULL, 0); - if (doc == NULL) { - test_log("Failed to parse valid instance line %ld\n", - xmlGetLineNo(tmp)); - nb_errors++; - } else { - nb_tests++; - ctxt = xmlRelaxNGNewValidCtxt(rng); - xmlRelaxNGSetValidErrors(ctxt, - (xmlRelaxNGValidityErrorFunc) testErrorHandler, - (xmlRelaxNGValidityWarningFunc) testErrorHandler, - ctxt); - ret = xmlRelaxNGValidateDoc(ctxt, doc); - xmlRelaxNGFreeValidCtxt(ctxt); - if (ret > 0) { - test_log("Failed to validate valid instance line %ld\n", - xmlGetLineNo(tmp)); - nb_errors++; - } else if (ret < 0) { - test_log("Internal error validating instance line %ld\n", - xmlGetLineNo(tmp)); - nb_errors++; - } - xmlFreeDoc(doc); - } - xmlResetLastError(); - if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) { - test_log("Validation of instance line %ld leaked %d\n", - xmlGetLineNo(tmp), xmlMemUsed() - mem); - xmlMemoryDump(); - nb_leaks++; - } - } - if (dtd != NULL) - xmlFree(dtd); - tmp = getNext(tmp, "following-sibling::valid[1]"); - } - /* - * now scan all the siblings of correct to process the <invalid> tests - */ - tmp = getNext(cur, "following-sibling::invalid[1]"); - while (tmp != NULL) { - test = getNext(tmp, "./*"); - if (test == NULL) { - fprintf(stderr, "Failed to find test in <invalid> line %ld\n", - xmlGetLineNo(tmp)); - - } else { - xmlBufferEmpty(buf); - xmlNodeDump(buf, test->doc, test, 0, 0); - - /* - * We are ready to run the test - */ - mem = xmlMemUsed(); - extraMemoryFromResolver = 0; - doc = xmlReadMemory((const char *)buf->content, buf->use, - "test", NULL, 0); - if (doc == NULL) { - test_log("Failed to parse valid instance line %ld\n", - xmlGetLineNo(tmp)); - nb_errors++; - } else { - nb_tests++; - ctxt = xmlRelaxNGNewValidCtxt(rng); - xmlRelaxNGSetValidErrors(ctxt, - (xmlRelaxNGValidityErrorFunc) testErrorHandler, - (xmlRelaxNGValidityWarningFunc) testErrorHandler, - ctxt); - ret = xmlRelaxNGValidateDoc(ctxt, doc); - xmlRelaxNGFreeValidCtxt(ctxt); - if (ret == 0) { - test_log("Failed to detect invalid instance line %ld\n", - xmlGetLineNo(tmp)); - nb_errors++; - } else if (ret < 0) { - test_log("Internal error validating instance line %ld\n", - xmlGetLineNo(tmp)); - nb_errors++; - } - xmlFreeDoc(doc); - } - xmlResetLastError(); - if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) { - test_log("Validation of instance line %ld leaked %d\n", - xmlGetLineNo(tmp), xmlMemUsed() - mem); - xmlMemoryDump(); - nb_leaks++; - } - } - tmp = getNext(tmp, "following-sibling::invalid[1]"); - } - -done: - if (buf != NULL) - xmlBufferFree(buf); - if (rng != NULL) - xmlRelaxNGFree(rng); - xmlResetLastError(); - if ((memt != xmlMemUsed()) && (memt != 0)) { - test_log("Validation of tests starting line %ld leaked %d\n", - xmlGetLineNo(cur), xmlMemUsed() - memt); - nb_leaks++; - } - return(ret); -} - -static int -xsdTestSuite(xmlNodePtr cur) { - if (verbose) { - xmlChar *doc = getString(cur, "string(documentation)"); - - if (doc != NULL) { - printf("Suite %s\n", doc); - xmlFree(doc); - } - } - cur = getNext(cur, "./testCase[1]"); - while (cur != NULL) { - xsdTestCase(cur); - cur = getNext(cur, "following-sibling::testCase[1]"); - } - - return(0); -} - -static int -xsdTest(void) { - xmlDocPtr doc; - xmlNodePtr cur; - const char *filename = "test/xsdtest/xsdtestsuite.xml"; - int ret = 0; - - doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT); - if (doc == NULL) { - fprintf(stderr, "Failed to parse %s\n", filename); - return(-1); - } - printf("## XML Schemas datatypes test suite from James Clark\n"); - - cur = xmlDocGetRootElement(doc); - if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) { - fprintf(stderr, "Unexpected format %s\n", filename); - ret = -1; - goto done; - } - - cur = getNext(cur, "./testSuite[1]"); - if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) { - fprintf(stderr, "Unexpected format %s\n", filename); - ret = -1; - goto done; - } - while (cur != NULL) { - xsdTestSuite(cur); - cur = getNext(cur, "following-sibling::testSuite[1]"); - } - -done: - if (doc != NULL) - xmlFreeDoc(doc); - return(ret); -} - -static int -rngTestSuite(xmlNodePtr cur) { - if (verbose) { - xmlChar *doc = getString(cur, "string(documentation)"); - - if (doc != NULL) { - printf("Suite %s\n", doc); - xmlFree(doc); - } else { - doc = getString(cur, "string(section)"); - if (doc != NULL) { - printf("Section %s\n", doc); - xmlFree(doc); - } - } - } - cur = getNext(cur, "./testSuite[1]"); - while (cur != NULL) { - xsdTestSuite(cur); - cur = getNext(cur, "following-sibling::testSuite[1]"); - } - - return(0); -} - -static int -rngTest1(void) { - xmlDocPtr doc; - xmlNodePtr cur; - const char *filename = "test/relaxng/OASIS/spectest.xml"; - int ret = 0; - - doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT); - if (doc == NULL) { - fprintf(stderr, "Failed to parse %s\n", filename); - return(-1); - } - printf("## Relax NG test suite from James Clark\n"); - - cur = xmlDocGetRootElement(doc); - if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) { - fprintf(stderr, "Unexpected format %s\n", filename); - ret = -1; - goto done; - } - - cur = getNext(cur, "./testSuite[1]"); - if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) { - fprintf(stderr, "Unexpected format %s\n", filename); - ret = -1; - goto done; - } - while (cur != NULL) { - rngTestSuite(cur); - cur = getNext(cur, "following-sibling::testSuite[1]"); - } - -done: - if (doc != NULL) - xmlFreeDoc(doc); - return(ret); -} - -static int -rngTest2(void) { - xmlDocPtr doc; - xmlNodePtr cur; - const char *filename = "test/relaxng/testsuite.xml"; - int ret = 0; - - doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT); - if (doc == NULL) { - fprintf(stderr, "Failed to parse %s\n", filename); - return(-1); - } - printf("## Relax NG test suite for libxml2\n"); - - cur = xmlDocGetRootElement(doc); - if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) { - fprintf(stderr, "Unexpected format %s\n", filename); - ret = -1; - goto done; - } - - cur = getNext(cur, "./testSuite[1]"); - if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) { - fprintf(stderr, "Unexpected format %s\n", filename); - ret = -1; - goto done; - } - while (cur != NULL) { - xsdTestSuite(cur); - cur = getNext(cur, "following-sibling::testSuite[1]"); - } - -done: - if (doc != NULL) - xmlFreeDoc(doc); - return(ret); -} - -/************************************************************************ - * * - * Schemas test suites from W3C/NIST/MS/Sun * - * * - ************************************************************************/ - -static int -xstcTestInstance(xmlNodePtr cur, xmlSchemaPtr schemas, - const xmlChar *spath, const char *base) { - xmlChar *href = NULL; - xmlChar *path = NULL; - xmlChar *validity = NULL; - xmlSchemaValidCtxtPtr ctxt = NULL; - xmlDocPtr doc = NULL; - int ret = 0, mem; - - xmlResetLastError(); - testErrorsSize = 0; testErrors[0] = 0; - mem = xmlMemUsed(); - href = getString(cur, - "string(ts:instanceDocument/@xlink:href)"); - if ((href == NULL) || (href[0] == 0)) { - test_log("testGroup line %ld misses href for schemaDocument\n", - xmlGetLineNo(cur)); - ret = -1; - goto done; - } - path = xmlBuildURI(href, BAD_CAST base); - if (path == NULL) { - fprintf(stderr, - "Failed to build path to schemas testGroup line %ld : %s\n", - xmlGetLineNo(cur), href); - ret = -1; - goto done; - } - if (checkTestFile((const char *) path) <= 0) { - test_log("schemas for testGroup line %ld is missing: %s\n", - xmlGetLineNo(cur), path); - ret = -1; - goto done; - } - validity = getString(cur, - "string(ts:expected/@validity)"); - if (validity == NULL) { - fprintf(stderr, "instanceDocument line %ld misses expected validity\n", - xmlGetLineNo(cur)); - ret = -1; - goto done; - } - nb_tests++; - doc = xmlReadFile((const char *) path, NULL, XML_PARSE_NOENT); - if (doc == NULL) { - fprintf(stderr, "instance %s fails to parse\n", path); - ret = -1; - nb_errors++; - goto done; - } - - ctxt = xmlSchemaNewValidCtxt(schemas); - xmlSchemaSetValidErrors(ctxt, - (xmlSchemaValidityErrorFunc) testErrorHandler, - (xmlSchemaValidityWarningFunc) testErrorHandler, - ctxt); - ret = xmlSchemaValidateDoc(ctxt, doc); - - if (xmlStrEqual(validity, BAD_CAST "valid")) { - if (ret > 0) { - test_log("valid instance %s failed to validate against %s\n", - path, spath); - nb_errors++; - } else if (ret < 0) { - test_log("valid instance %s got internal error validating %s\n", - path, spath); - nb_internals++; - nb_errors++; - } - } else if (xmlStrEqual(validity, BAD_CAST "invalid")) { - if (ret == 0) { - test_log("Failed to detect invalid instance %s against %s\n", - path, spath); - nb_errors++; - } - } else { - test_log("instanceDocument line %ld has unexpected validity value%s\n", - xmlGetLineNo(cur), validity); - ret = -1; - goto done; - } - -done: - if (href != NULL) xmlFree(href); - if (path != NULL) xmlFree(path); - if (validity != NULL) xmlFree(validity); - if (ctxt != NULL) xmlSchemaFreeValidCtxt(ctxt); - if (doc != NULL) xmlFreeDoc(doc); - xmlResetLastError(); - if (mem != xmlMemUsed()) { - test_log("Validation of tests starting line %ld leaked %d\n", - xmlGetLineNo(cur), xmlMemUsed() - mem); - nb_leaks++; - } - return(ret); -} - -static int -xstcTestGroup(xmlNodePtr cur, const char *base) { - xmlChar *href = NULL; - xmlChar *path = NULL; - xmlChar *validity = NULL; - xmlSchemaPtr schemas = NULL; - xmlSchemaParserCtxtPtr ctxt; - xmlNodePtr instance; - int ret = 0, mem; - - xmlResetLastError(); - testErrorsSize = 0; testErrors[0] = 0; - mem = xmlMemUsed(); - href = getString(cur, - "string(ts:schemaTest/ts:schemaDocument/@xlink:href)"); - if ((href == NULL) || (href[0] == 0)) { - test_log("testGroup line %ld misses href for schemaDocument\n", - xmlGetLineNo(cur)); - ret = -1; - goto done; - } - path = xmlBuildURI(href, BAD_CAST base); - if (path == NULL) { - test_log("Failed to build path to schemas testGroup line %ld : %s\n", - xmlGetLineNo(cur), href); - ret = -1; - goto done; - } - if (checkTestFile((const char *) path) <= 0) { - test_log("schemas for testGroup line %ld is missing: %s\n", - xmlGetLineNo(cur), path); - ret = -1; - goto done; - } - validity = getString(cur, - "string(ts:schemaTest/ts:expected/@validity)"); - if (validity == NULL) { - test_log("testGroup line %ld misses expected validity\n", - xmlGetLineNo(cur)); - ret = -1; - goto done; - } - nb_tests++; - if (xmlStrEqual(validity, BAD_CAST "valid")) { - nb_schematas++; - ctxt = xmlSchemaNewParserCtxt((const char *) path); - xmlSchemaSetParserErrors(ctxt, - (xmlSchemaValidityErrorFunc) testErrorHandler, - (xmlSchemaValidityWarningFunc) testErrorHandler, - ctxt); - schemas = xmlSchemaParse(ctxt); - xmlSchemaFreeParserCtxt(ctxt); - if (schemas == NULL) { - test_log("valid schemas %s failed to parse\n", - path); - ret = 1; - nb_errors++; - } - if ((ret == 0) && (strstr(testErrors, "nimplemented") != NULL)) { - test_log("valid schemas %s hit an unimplemented block\n", - path); - ret = 1; - nb_unimplemented++; - nb_errors++; - } - instance = getNext(cur, "./ts:instanceTest[1]"); - while (instance != NULL) { - if (schemas != NULL) { - xstcTestInstance(instance, schemas, path, base); - } else { - /* - * We'll automatically mark the instances as failed - * if the schema was broken. - */ - nb_errors++; - } - instance = getNext(instance, - "following-sibling::ts:instanceTest[1]"); - } - } else if (xmlStrEqual(validity, BAD_CAST "invalid")) { - nb_schematas++; - ctxt = xmlSchemaNewParserCtxt((const char *) path); - xmlSchemaSetParserErrors(ctxt, - (xmlSchemaValidityErrorFunc) testErrorHandler, - (xmlSchemaValidityWarningFunc) testErrorHandler, - ctxt); - schemas = xmlSchemaParse(ctxt); - xmlSchemaFreeParserCtxt(ctxt); - if (schemas != NULL) { - test_log("Failed to detect error in schemas %s\n", - path); - nb_errors++; - ret = 1; - } - if ((ret == 0) && (strstr(testErrors, "nimplemented") != NULL)) { - nb_unimplemented++; - test_log("invalid schemas %s hit an unimplemented block\n", - path); - ret = 1; - nb_errors++; - } - } else { - test_log("testGroup line %ld misses unexpected validity value%s\n", - xmlGetLineNo(cur), validity); - ret = -1; - goto done; - } - -done: - if (href != NULL) xmlFree(href); - if (path != NULL) xmlFree(path); - if (validity != NULL) xmlFree(validity); - if (schemas != NULL) xmlSchemaFree(schemas); - xmlResetLastError(); - if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) { - test_log("Processing test line %ld %s leaked %d\n", - xmlGetLineNo(cur), path, xmlMemUsed() - mem); - nb_leaks++; - } - return(ret); -} - -static int -xstcMetadata(const char *metadata, const char *base) { - xmlDocPtr doc; - xmlNodePtr cur; - xmlChar *contributor; - xmlChar *name; - int ret = 0; - - doc = xmlReadFile(metadata, NULL, XML_PARSE_NOENT); - if (doc == NULL) { - fprintf(stderr, "Failed to parse %s\n", metadata); - return(-1); - } - - cur = xmlDocGetRootElement(doc); - if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSet"))) { - fprintf(stderr, "Unexpected format %s\n", metadata); - return(-1); - } - contributor = xmlGetProp(cur, BAD_CAST "contributor"); - if (contributor == NULL) { - contributor = xmlStrdup(BAD_CAST "Unknown"); - } - name = xmlGetProp(cur, BAD_CAST "name"); - if (name == NULL) { - name = xmlStrdup(BAD_CAST "Unknown"); - } - printf("## %s test suite for Schemas version %s\n", contributor, name); - xmlFree(contributor); - xmlFree(name); - - cur = getNext(cur, "./ts:testGroup[1]"); - if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testGroup"))) { - fprintf(stderr, "Unexpected format %s\n", metadata); - ret = -1; - goto done; - } - while (cur != NULL) { - xstcTestGroup(cur, base); - cur = getNext(cur, "following-sibling::ts:testGroup[1]"); - } - -done: - xmlFreeDoc(doc); - return(ret); -} - -/************************************************************************ - * * - * The driver for the tests * - * * - ************************************************************************/ - -int -main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { - int ret = 0; - int old_errors, old_tests, old_leaks; - - logfile = fopen(LOGFILE, "w"); - if (logfile == NULL) { - fprintf(stderr, - "Could not open the log file, running in verbose mode\n"); - verbose = 1; - } - initializeLibxml2(); - - if ((argc >= 2) && (!strcmp(argv[1], "-v"))) - verbose = 1; - - - old_errors = nb_errors; - old_tests = nb_tests; - old_leaks = nb_leaks; - xsdTest(); - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) - printf("Ran %d tests, no errors\n", nb_tests - old_tests); - else - printf("Ran %d tests, %d errors, %d leaks\n", - nb_tests - old_tests, - nb_errors - old_errors, - nb_leaks - old_leaks); - old_errors = nb_errors; - old_tests = nb_tests; - old_leaks = nb_leaks; - rngTest1(); - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) - printf("Ran %d tests, no errors\n", nb_tests - old_tests); - else - printf("Ran %d tests, %d errors, %d leaks\n", - nb_tests - old_tests, - nb_errors - old_errors, - nb_leaks - old_leaks); - old_errors = nb_errors; - old_tests = nb_tests; - old_leaks = nb_leaks; - rngTest2(); - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) - printf("Ran %d tests, no errors\n", nb_tests - old_tests); - else - printf("Ran %d tests, %d errors, %d leaks\n", - nb_tests - old_tests, - nb_errors - old_errors, - nb_leaks - old_leaks); - old_errors = nb_errors; - old_tests = nb_tests; - old_leaks = nb_leaks; - nb_internals = 0; - nb_schematas = 0; - xstcMetadata("xstc/Tests/Metadata/NISTXMLSchemaDatatypes.testSet", - "xstc/Tests/Metadata/"); - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) - printf("Ran %d tests (%d schemata), no errors\n", - nb_tests - old_tests, nb_schematas); - else - printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n", - nb_tests - old_tests, - nb_schematas, - nb_errors - old_errors, - nb_internals, - nb_leaks - old_leaks); - old_errors = nb_errors; - old_tests = nb_tests; - old_leaks = nb_leaks; - nb_internals = 0; - nb_schematas = 0; - xstcMetadata("xstc/Tests/Metadata/SunXMLSchema1-0-20020116.testSet", - "xstc/Tests/"); - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) - printf("Ran %d tests (%d schemata), no errors\n", - nb_tests - old_tests, nb_schematas); - else - printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n", - nb_tests - old_tests, - nb_schematas, - nb_errors - old_errors, - nb_internals, - nb_leaks - old_leaks); - old_errors = nb_errors; - old_tests = nb_tests; - old_leaks = nb_leaks; - nb_internals = 0; - nb_schematas = 0; - xstcMetadata("xstc/Tests/Metadata/MSXMLSchema1-0-20020116.testSet", - "xstc/Tests/"); - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) - printf("Ran %d tests (%d schemata), no errors\n", - nb_tests - old_tests, nb_schematas); - else - printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n", - nb_tests - old_tests, - nb_schematas, - nb_errors - old_errors, - nb_internals, - nb_leaks - old_leaks); - - if ((nb_errors == 0) && (nb_leaks == 0)) { - ret = 0; - printf("Total %d tests, no errors\n", - nb_tests); - } else { - ret = 1; - printf("Total %d tests, %d errors, %d leaks\n", - nb_tests, nb_errors, nb_leaks); - } - xmlXPathFreeContext(ctxtXPath); - xmlCleanupParser(); - xmlMemoryDump(); - - if (logfile != NULL) - fclose(logfile); - return(ret); -} -#else /* !SCHEMAS */ -int -main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { - fprintf(stderr, "runsuite requires support for schemas and xpath in libxml2\n"); -} -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/runtest.c b/ThirdParty/libxml2/vtklibxml2/runtest.c deleted file mode 100644 index ac6512e9c72..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/runtest.c +++ /dev/null @@ -1,4432 +0,0 @@ -/* - * runtest.c: C program to run libxml2 regression tests without - * requiring make or Python, and reducing platform dependancies - * to a strict minimum. - * - * To compile on Unixes: - * cc -o runtest `xml2-config --cflags` runtest.c `xml2-config --libs` -lpthread - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#ifdef HAVE_CONFIG_H -#include "libxml.h" -#else -#include <stdio.h> -#endif - -#if !defined(_WIN32) || defined(__CYGWIN__) -#include <unistd.h> -#endif -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include <libxml/parser.h> -#include <libxml/tree.h> -#include <libxml/uri.h> - -#ifdef LIBXML_OUTPUT_ENABLED -#ifdef LIBXML_READER_ENABLED -#include <libxml/xmlreader.h> -#endif - -#ifdef LIBXML_XINCLUDE_ENABLED -#include <libxml/xinclude.h> -#endif - -#ifdef LIBXML_XPATH_ENABLED -#include <libxml/xpath.h> -#include <libxml/xpathInternals.h> -#ifdef LIBXML_XPTR_ENABLED -#include <libxml/xpointer.h> -#endif -#endif - -#ifdef LIBXML_SCHEMAS_ENABLED -#include <libxml/relaxng.h> -#include <libxml/xmlschemas.h> -#include <libxml/xmlschemastypes.h> -#endif - -#ifdef LIBXML_PATTERN_ENABLED -#include <libxml/pattern.h> -#endif - -#ifdef LIBXML_C14N_ENABLED -#include <libxml/c14n.h> -#endif - -#ifdef LIBXML_HTML_ENABLED -#include <libxml/HTMLparser.h> -#include <libxml/HTMLtree.h> - -/* - * pseudo flag for the unification of HTML and XML tests - */ -#define XML_PARSE_HTML 1 << 24 -#endif - -#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) -#include <libxml/globals.h> -#include <libxml/threads.h> -#include <libxml/parser.h> -#include <libxml/catalog.h> -#include <string.h> -#endif - -/* - * O_BINARY is just for Windows compatibility - if it isn't defined - * on this system, avoid any compilation error - */ -#ifdef O_BINARY -#define RD_FLAGS O_RDONLY | O_BINARY -#else -#define RD_FLAGS O_RDONLY -#endif - -typedef int (*functest) (const char *filename, const char *result, - const char *error, int options); - -typedef struct testDesc testDesc; -typedef testDesc *testDescPtr; -struct testDesc { - const char *desc; /* descripton of the test */ - functest func; /* function implementing the test */ - const char *in; /* glob to path for input files */ - const char *out; /* output directory */ - const char *suffix;/* suffix for output files */ - const char *err; /* suffix for error output files */ - int options; /* parser options for the test */ -}; - -static int checkTestFile(const char *filename); - -#if defined(_WIN32) && !defined(__CYGWIN__) - -#include <windows.h> -#include <io.h> - -typedef struct -{ - size_t gl_pathc; /* Count of paths matched so far */ - char **gl_pathv; /* List of matched pathnames. */ - size_t gl_offs; /* Slots to reserve in 'gl_pathv'. */ -} glob_t; - -#define GLOB_DOOFFS 0 -static int glob(const char *pattern, int flags, - int errfunc(const char *epath, int eerrno), - glob_t *pglob) { - glob_t *ret; - WIN32_FIND_DATA FindFileData; - HANDLE hFind; - unsigned int nb_paths = 0; - char directory[500]; - int len; - - if ((pattern == NULL) || (pglob == NULL)) return(-1); - - strncpy(directory, pattern, 499); - for (len = strlen(directory);len >= 0;len--) { - if (directory[len] == '/') { - len++; - directory[len] = 0; - break; - } - } - if (len <= 0) - len = 0; - - - ret = pglob; - memset(ret, 0, sizeof(glob_t)); - - hFind = FindFirstFileA(pattern, &FindFileData); - if (hFind == INVALID_HANDLE_VALUE) - return(0); - nb_paths = 20; - ret->gl_pathv = (char **) malloc(nb_paths * sizeof(char *)); - if (ret->gl_pathv == NULL) { - FindClose(hFind); - return(-1); - } - strncpy(directory + len, FindFileData.cFileName, 499 - len); - ret->gl_pathv[ret->gl_pathc] = strdup(directory); - if (ret->gl_pathv[ret->gl_pathc] == NULL) - goto done; - ret->gl_pathc++; - while(FindNextFileA(hFind, &FindFileData)) { - if (FindFileData.cFileName[0] == '.') - continue; - if (ret->gl_pathc + 2 > nb_paths) { - char **tmp = realloc(ret->gl_pathv, nb_paths * 2 * sizeof(char *)); - if (tmp == NULL) - break; - ret->gl_pathv = tmp; - nb_paths *= 2; - } - strncpy(directory + len, FindFileData.cFileName, 499 - len); - ret->gl_pathv[ret->gl_pathc] = strdup(directory); - if (ret->gl_pathv[ret->gl_pathc] == NULL) - break; - ret->gl_pathc++; - } - ret->gl_pathv[ret->gl_pathc] = NULL; - -done: - FindClose(hFind); - return(0); -} - - - -static void globfree(glob_t *pglob) { - unsigned int i; - if (pglob == NULL) - return; - - for (i = 0;i < pglob->gl_pathc;i++) { - if (pglob->gl_pathv[i] != NULL) - free(pglob->gl_pathv[i]); - } -} -#define vsnprintf _vsnprintf -#define snprintf _snprintf -#else -#include <glob.h> -#endif - -/************************************************************************ - * * - * Libxml2 specific routines * - * * - ************************************************************************/ - -static int nb_tests = 0; -static int nb_errors = 0; -static int nb_leaks = 0; -static int extraMemoryFromResolver = 0; - -static int -fatalError(void) { - fprintf(stderr, "Exitting tests on fatal error\n"); - exit(1); -} - -/* - * We need to trap calls to the resolver to not account memory for the catalog - * which is shared to the current running test. We also don't want to have - * network downloads modifying tests. - */ -static xmlParserInputPtr -testExternalEntityLoader(const char *URL, const char *ID, - xmlParserCtxtPtr ctxt) { - xmlParserInputPtr ret; - - if (checkTestFile(URL)) { - ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); - } else { - int memused = xmlMemUsed(); - ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); - extraMemoryFromResolver += xmlMemUsed() - memused; - } - - return(ret); -} - -/* - * Trapping the error messages at the generic level to grab the equivalent of - * stderr messages on CLI tools. - */ -static char testErrors[32769]; -static int testErrorsSize = 0; - -static void XMLCDECL -testErrorHandler(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) { - va_list args; - int res; - - if (testErrorsSize >= 32768) - return; - va_start(args, msg); - res = vsnprintf(&testErrors[testErrorsSize], - 32768 - testErrorsSize, - msg, args); - va_end(args); - if (testErrorsSize + res >= 32768) { - /* buffer is full */ - testErrorsSize = 32768; - testErrors[testErrorsSize] = 0; - } else { - testErrorsSize += res; - } - testErrors[testErrorsSize] = 0; -} - -static void XMLCDECL -channel(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) { - va_list args; - int res; - - if (testErrorsSize >= 32768) - return; - va_start(args, msg); - res = vsnprintf(&testErrors[testErrorsSize], - 32768 - testErrorsSize, - msg, args); - va_end(args); - if (testErrorsSize + res >= 32768) { - /* buffer is full */ - testErrorsSize = 32768; - testErrors[testErrorsSize] = 0; - } else { - testErrorsSize += res; - } - testErrors[testErrorsSize] = 0; -} - -/** - * xmlParserPrintFileContext: - * @input: an xmlParserInputPtr input - * - * Displays current context within the input content for error tracking - */ - -static void -xmlParserPrintFileContextInternal(xmlParserInputPtr input , - xmlGenericErrorFunc chanl, void *data ) { - const xmlChar *cur, *base; - unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */ - xmlChar content[81]; /* space for 80 chars + line terminator */ - xmlChar *ctnt; - - if (input == NULL) return; - cur = input->cur; - base = input->base; - /* skip backwards over any end-of-lines */ - while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) { - cur--; - } - n = 0; - /* search backwards for beginning-of-line (to max buff size) */ - while ((n++ < (sizeof(content)-1)) && (cur > base) && - (*(cur) != '\n') && (*(cur) != '\r')) - cur--; - if ((*(cur) == '\n') || (*(cur) == '\r')) cur++; - /* calculate the error position in terms of the current position */ - col = input->cur - cur; - /* search forward for end-of-line (to max buff size) */ - n = 0; - ctnt = content; - /* copy selected text to our buffer */ - while ((*cur != 0) && (*(cur) != '\n') && - (*(cur) != '\r') && (n < sizeof(content)-1)) { - *ctnt++ = *cur++; - n++; - } - *ctnt = 0; - /* print out the selected text */ - chanl(data ,"%s\n", content); - /* create blank line with problem pointer */ - n = 0; - ctnt = content; - /* (leave buffer space for pointer + line terminator) */ - while ((n<col) && (n++ < sizeof(content)-2) && (*ctnt != 0)) { - if (*(ctnt) != '\t') - *(ctnt) = ' '; - ctnt++; - } - *ctnt++ = '^'; - *ctnt = 0; - chanl(data ,"%s\n", content); -} - -static void -testStructuredErrorHandler(void *ctx ATTRIBUTE_UNUSED, xmlErrorPtr err) { - char *file = NULL; - int line = 0; - int code = -1; - int domain; - void *data = NULL; - const char *str; - const xmlChar *name = NULL; - xmlNodePtr node; - xmlErrorLevel level; - xmlParserInputPtr input = NULL; - xmlParserInputPtr cur = NULL; - xmlParserCtxtPtr ctxt = NULL; - - if (err == NULL) - return; - - file = err->file; - line = err->line; - code = err->code; - domain = err->domain; - level = err->level; - node = err->node; - if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) || - (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) || - (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) { - ctxt = err->ctxt; - } - str = err->message; - - if (code == XML_ERR_OK) - return; - - if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) - name = node->name; - - /* - * Maintain the compatibility with the legacy error handling - */ - if (ctxt != NULL) { - input = ctxt->input; - if ((input != NULL) && (input->filename == NULL) && - (ctxt->inputNr > 1)) { - cur = input; - input = ctxt->inputTab[ctxt->inputNr - 2]; - } - if (input != NULL) { - if (input->filename) - channel(data, "%s:%d: ", input->filename, input->line); - else if ((line != 0) && (domain == XML_FROM_PARSER)) - channel(data, "Entity: line %d: ", input->line); - } - } else { - if (file != NULL) - channel(data, "%s:%d: ", file, line); - else if ((line != 0) && (domain == XML_FROM_PARSER)) - channel(data, "Entity: line %d: ", line); - } - if (name != NULL) { - channel(data, "element %s: ", name); - } - if (code == XML_ERR_OK) - return; - switch (domain) { - case XML_FROM_PARSER: - channel(data, "parser "); - break; - case XML_FROM_NAMESPACE: - channel(data, "namespace "); - break; - case XML_FROM_DTD: - case XML_FROM_VALID: - channel(data, "validity "); - break; - case XML_FROM_HTML: - channel(data, "HTML parser "); - break; - case XML_FROM_MEMORY: - channel(data, "memory "); - break; - case XML_FROM_OUTPUT: - channel(data, "output "); - break; - case XML_FROM_IO: - channel(data, "I/O "); - break; - case XML_FROM_XINCLUDE: - channel(data, "XInclude "); - break; - case XML_FROM_XPATH: - channel(data, "XPath "); - break; - case XML_FROM_XPOINTER: - channel(data, "parser "); - break; - case XML_FROM_REGEXP: - channel(data, "regexp "); - break; - case XML_FROM_MODULE: - channel(data, "module "); - break; - case XML_FROM_SCHEMASV: - channel(data, "Schemas validity "); - break; - case XML_FROM_SCHEMASP: - channel(data, "Schemas parser "); - break; - case XML_FROM_RELAXNGP: - channel(data, "Relax-NG parser "); - break; - case XML_FROM_RELAXNGV: - channel(data, "Relax-NG validity "); - break; - case XML_FROM_CATALOG: - channel(data, "Catalog "); - break; - case XML_FROM_C14N: - channel(data, "C14N "); - break; - case XML_FROM_XSLT: - channel(data, "XSLT "); - break; - default: - break; - } - if (code == XML_ERR_OK) - return; - switch (level) { - case XML_ERR_NONE: - channel(data, ": "); - break; - case XML_ERR_WARNING: - channel(data, "warning : "); - break; - case XML_ERR_ERROR: - channel(data, "error : "); - break; - case XML_ERR_FATAL: - channel(data, "error : "); - break; - } - if (code == XML_ERR_OK) - return; - if (str != NULL) { - int len; - len = xmlStrlen((const xmlChar *)str); - if ((len > 0) && (str[len - 1] != '\n')) - channel(data, "%s\n", str); - else - channel(data, "%s", str); - } else { - channel(data, "%s\n", "out of memory error"); - } - if (code == XML_ERR_OK) - return; - - if (ctxt != NULL) { - xmlParserPrintFileContextInternal(input, channel, data); - if (cur != NULL) { - if (cur->filename) - channel(data, "%s:%d: \n", cur->filename, cur->line); - else if ((line != 0) && (domain == XML_FROM_PARSER)) - channel(data, "Entity: line %d: \n", cur->line); - xmlParserPrintFileContextInternal(cur, channel, data); - } - } - if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) && - (err->int1 < 100) && - (err->int1 < xmlStrlen((const xmlChar *)err->str1))) { - xmlChar buf[150]; - int i; - - channel(data, "%s\n", err->str1); - for (i=0;i < err->int1;i++) - buf[i] = ' '; - buf[i++] = '^'; - buf[i] = 0; - channel(data, "%s\n", buf); - } -} - -static void -initializeLibxml2(void) { - xmlGetWarningsDefaultValue = 0; - xmlPedanticParserDefault(0); - - xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup); - xmlInitParser(); - xmlSetExternalEntityLoader(testExternalEntityLoader); - xmlSetStructuredErrorFunc(NULL, testStructuredErrorHandler); -#ifdef LIBXML_SCHEMAS_ENABLED - xmlSchemaInitTypes(); - xmlRelaxNGInitTypes(); -#endif -} - - -/************************************************************************ - * * - * File name and path utilities * - * * - ************************************************************************/ - -static const char *baseFilename(const char *filename) { - const char *cur; - if (filename == NULL) - return(NULL); - cur = &filename[strlen(filename)]; - while ((cur > filename) && (*cur != '/')) - cur--; - if (*cur == '/') - return(cur + 1); - return(cur); -} - -static char *resultFilename(const char *filename, const char *out, - const char *suffix) { - const char *base; - char res[500]; - char suffixbuff[500]; - -/************* - if ((filename[0] == 't') && (filename[1] == 'e') && - (filename[2] == 's') && (filename[3] == 't') && - (filename[4] == '/')) - filename = &filename[5]; - *************/ - - base = baseFilename(filename); - if (suffix == NULL) - suffix = ".tmp"; - if (out == NULL) - out = ""; - - strncpy(suffixbuff,suffix,499); -#ifdef VMS - if(strstr(base,".") && suffixbuff[0]=='.') - suffixbuff[0]='_'; -#endif - - snprintf(res, 499, "%s%s%s", out, base, suffixbuff); - res[499] = 0; - return(strdup(res)); -} - -static int checkTestFile(const char *filename) { - struct stat buf; - - if (stat(filename, &buf) == -1) - return(0); - -#if defined(_WIN32) && !defined(__CYGWIN__) - if (!(buf.st_mode & _S_IFREG)) - return(0); -#else - if (!S_ISREG(buf.st_mode)) - return(0); -#endif - - return(1); -} - -static int compareFiles(const char *r1, const char *r2) { - int res1, res2; - int fd1, fd2; - char bytes1[4096]; - char bytes2[4096]; - - fd1 = open(r1, RD_FLAGS); - if (fd1 < 0) - return(-1); - fd2 = open(r2, RD_FLAGS); - if (fd2 < 0) { - close(fd1); - return(-1); - } - while (1) { - res1 = read(fd1, bytes1, 4096); - res2 = read(fd2, bytes2, 4096); - if ((res1 != res2) || (res1 < 0)) { - close(fd1); - close(fd2); - return(1); - } - if (res1 == 0) - break; - if (memcmp(bytes1, bytes2, res1) != 0) { - close(fd1); - close(fd2); - return(1); - } - } - close(fd1); - close(fd2); - return(0); -} - -static int compareFileMem(const char *filename, const char *mem, int size) { - int res; - int fd; - char bytes[4096]; - int idx = 0; - struct stat info; - - if (stat(filename, &info) < 0) - return(-1); - if (info.st_size != size) - return(-1); - fd = open(filename, RD_FLAGS); - if (fd < 0) - return(-1); - while (idx < size) { - res = read(fd, bytes, 4096); - if (res <= 0) - break; - if (res + idx > size) - break; - if (memcmp(bytes, &mem[idx], res) != 0) { - int ix; - for (ix=0; ix<res; ix++) - if (bytes[ix] != mem[idx+ix]) - break; - fprintf(stderr,"Compare error at position %d\n", idx+ix); - close(fd); - return(1); - } - idx += res; - } - close(fd); - return(idx != size); -} - -static int loadMem(const char *filename, const char **mem, int *size) { - int fd, res; - struct stat info; - char *base; - int siz = 0; - if (stat(filename, &info) < 0) - return(-1); - base = malloc(info.st_size + 1); - if (base == NULL) - return(-1); - if ((fd = open(filename, RD_FLAGS)) < 0) { - free(base); - return(-1); - } - while ((res = read(fd, &base[siz], info.st_size - siz)) > 0) { - siz += res; - } - close(fd); -#if !defined(_WIN32) - if (siz != info.st_size) { - free(base); - return(-1); - } -#endif - base[siz] = 0; - *mem = base; - *size = siz; - return(0); -} - -static int unloadMem(const char *mem) { - free((char *)mem); - return(0); -} - -/************************************************************************ - * * - * Tests implementations * - * * - ************************************************************************/ - -/************************************************************************ - * * - * Parse to SAX based tests * - * * - ************************************************************************/ - -static FILE *SAXdebug = NULL; - -/* - * empty SAX block - */ -static xmlSAXHandler emptySAXHandlerStruct = { - NULL, /* internalSubset */ - NULL, /* isStandalone */ - NULL, /* hasInternalSubset */ - NULL, /* hasExternalSubset */ - NULL, /* resolveEntity */ - NULL, /* getEntity */ - NULL, /* entityDecl */ - NULL, /* notationDecl */ - NULL, /* attributeDecl */ - NULL, /* elementDecl */ - NULL, /* unparsedEntityDecl */ - NULL, /* setDocumentLocator */ - NULL, /* startDocument */ - NULL, /* endDocument */ - NULL, /* startElement */ - NULL, /* endElement */ - NULL, /* reference */ - NULL, /* characters */ - NULL, /* ignorableWhitespace */ - NULL, /* processingInstruction */ - NULL, /* comment */ - NULL, /* xmlParserWarning */ - NULL, /* xmlParserError */ - NULL, /* xmlParserError */ - NULL, /* getParameterEntity */ - NULL, /* cdataBlock; */ - NULL, /* externalSubset; */ - 1, - NULL, - NULL, /* startElementNs */ - NULL, /* endElementNs */ - NULL /* xmlStructuredErrorFunc */ -}; - -static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct; -static int callbacks = 0; -static int quiet = 0; - -/** - * isStandaloneDebug: - * @ctxt: An XML parser context - * - * Is this document tagged standalone ? - * - * Returns 1 if true - */ -static int -isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (quiet) - return(0); - fprintf(SAXdebug, "SAX.isStandalone()\n"); - return(0); -} - -/** - * hasInternalSubsetDebug: - * @ctxt: An XML parser context - * - * Does this document has an internal subset - * - * Returns 1 if true - */ -static int -hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (quiet) - return(0); - fprintf(SAXdebug, "SAX.hasInternalSubset()\n"); - return(0); -} - -/** - * hasExternalSubsetDebug: - * @ctxt: An XML parser context - * - * Does this document has an external subset - * - * Returns 1 if true - */ -static int -hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (quiet) - return(0); - fprintf(SAXdebug, "SAX.hasExternalSubset()\n"); - return(0); -} - -/** - * internalSubsetDebug: - * @ctxt: An XML parser context - * - * Does this document has an internal subset - */ -static void -internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.internalSubset(%s,", name); - if (ExternalID == NULL) - fprintf(SAXdebug, " ,"); - else - fprintf(SAXdebug, " %s,", ExternalID); - if (SystemID == NULL) - fprintf(SAXdebug, " )\n"); - else - fprintf(SAXdebug, " %s)\n", SystemID); -} - -/** - * externalSubsetDebug: - * @ctxt: An XML parser context - * - * Does this document has an external subset - */ -static void -externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.externalSubset(%s,", name); - if (ExternalID == NULL) - fprintf(SAXdebug, " ,"); - else - fprintf(SAXdebug, " %s,", ExternalID); - if (SystemID == NULL) - fprintf(SAXdebug, " )\n"); - else - fprintf(SAXdebug, " %s)\n", SystemID); -} - -/** - * resolveEntityDebug: - * @ctxt: An XML parser context - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * Special entity resolver, better left to the parser, it has - * more context than the application layer. - * The default behaviour is to NOT resolve the entities, in that case - * the ENTITY_REF nodes are built in the structure (and the parameter - * values). - * - * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. - */ -static xmlParserInputPtr -resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId) -{ - callbacks++; - if (quiet) - return(NULL); - /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ - - - fprintf(SAXdebug, "SAX.resolveEntity("); - if (publicId != NULL) - fprintf(SAXdebug, "%s", (char *)publicId); - else - fprintf(SAXdebug, " "); - if (systemId != NULL) - fprintf(SAXdebug, ", %s)\n", (char *)systemId); - else - fprintf(SAXdebug, ", )\n"); -/********* - if (systemId != NULL) { - return(xmlNewInputFromFile(ctxt, (char *) systemId)); - } - *********/ - return(NULL); -} - -/** - * getEntityDebug: - * @ctxt: An XML parser context - * @name: The entity name - * - * Get an entity by name - * - * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. - */ -static xmlEntityPtr -getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) -{ - callbacks++; - if (quiet) - return(NULL); - fprintf(SAXdebug, "SAX.getEntity(%s)\n", name); - return(NULL); -} - -/** - * getParameterEntityDebug: - * @ctxt: An XML parser context - * @name: The entity name - * - * Get a parameter entity by name - * - * Returns the xmlParserInputPtr - */ -static xmlEntityPtr -getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) -{ - callbacks++; - if (quiet) - return(NULL); - fprintf(SAXdebug, "SAX.getParameterEntity(%s)\n", name); - return(NULL); -} - - -/** - * entityDeclDebug: - * @ctxt: An XML parser context - * @name: the entity name - * @type: the entity type - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @content: the entity value (without processing). - * - * An entity definition has been parsed - */ -static void -entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, - const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) -{ -const xmlChar *nullstr = BAD_CAST "(null)"; - /* not all libraries handle printing null pointers nicely */ - if (publicId == NULL) - publicId = nullstr; - if (systemId == NULL) - systemId = nullstr; - if (content == NULL) - content = (xmlChar *)nullstr; - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.entityDecl(%s, %d, %s, %s, %s)\n", - name, type, publicId, systemId, content); -} - -/** - * attributeDeclDebug: - * @ctxt: An XML parser context - * @name: the attribute name - * @type: the attribute type - * - * An attribute definition has been parsed - */ -static void -attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem, - const xmlChar * name, int type, int def, - const xmlChar * defaultValue, xmlEnumerationPtr tree) -{ - callbacks++; - if (quiet) - return; - if (defaultValue == NULL) - fprintf(SAXdebug, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n", - elem, name, type, def); - else - fprintf(SAXdebug, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n", - elem, name, type, def, defaultValue); - xmlFreeEnumeration(tree); -} - -/** - * elementDeclDebug: - * @ctxt: An XML parser context - * @name: the element name - * @type: the element type - * @content: the element value (without processing). - * - * An element definition has been parsed - */ -static void -elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, - xmlElementContentPtr content ATTRIBUTE_UNUSED) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.elementDecl(%s, %d, ...)\n", - name, type); -} - -/** - * notationDeclDebug: - * @ctxt: An XML parser context - * @name: The name of the notation - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * What to do when a notation declaration has been parsed. - */ -static void -notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, - const xmlChar *publicId, const xmlChar *systemId) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.notationDecl(%s, %s, %s)\n", - (char *) name, (char *) publicId, (char *) systemId); -} - -/** - * unparsedEntityDeclDebug: - * @ctxt: An XML parser context - * @name: The name of the entity - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @notationName: the name of the notation - * - * What to do when an unparsed entity declaration is parsed - */ -static void -unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, - const xmlChar *publicId, const xmlChar *systemId, - const xmlChar *notationName) -{ -const xmlChar *nullstr = BAD_CAST "(null)"; - - if (publicId == NULL) - publicId = nullstr; - if (systemId == NULL) - systemId = nullstr; - if (notationName == NULL) - notationName = nullstr; - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n", - (char *) name, (char *) publicId, (char *) systemId, - (char *) notationName); -} - -/** - * setDocumentLocatorDebug: - * @ctxt: An XML parser context - * @loc: A SAX Locator - * - * Receive the document locator at startup, actually xmlDefaultSAXLocator - * Everything is available on the context, so this is useless in our case. - */ -static void -setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.setDocumentLocator()\n"); -} - -/** - * startDocumentDebug: - * @ctxt: An XML parser context - * - * called when the document start being processed. - */ -static void -startDocumentDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.startDocument()\n"); -} - -/** - * endDocumentDebug: - * @ctxt: An XML parser context - * - * called when the document end has been detected. - */ -static void -endDocumentDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.endDocument()\n"); -} - -/** - * startElementDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when an opening tag has been processed. - */ -static void -startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts) -{ - int i; - - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.startElement(%s", (char *) name); - if (atts != NULL) { - for (i = 0;(atts[i] != NULL);i++) { - fprintf(SAXdebug, ", %s='", atts[i++]); - if (atts[i] != NULL) - fprintf(SAXdebug, "%s'", atts[i]); - } - } - fprintf(SAXdebug, ")\n"); -} - -/** - * endElementDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when the end of an element has been detected. - */ -static void -endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.endElement(%s)\n", (char *) name); -} - -/** - * charactersDebug: - * @ctxt: An XML parser context - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some chars from the parser. - * Question: how much at a time ??? - */ -static void -charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) -{ - char output[40]; - int i; - - callbacks++; - if (quiet) - return; - for (i = 0;(i<len) && (i < 30);i++) - output[i] = ch[i]; - output[i] = 0; - - fprintf(SAXdebug, "SAX.characters(%s, %d)\n", output, len); -} - -/** - * referenceDebug: - * @ctxt: An XML parser context - * @name: The entity name - * - * called when an entity reference is detected. - */ -static void -referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.reference(%s)\n", name); -} - -/** - * ignorableWhitespaceDebug: - * @ctxt: An XML parser context - * @ch: a xmlChar string - * @start: the first char in the string - * @len: the number of xmlChar - * - * receiving some ignorable whitespaces from the parser. - * Question: how much at a time ??? - */ -static void -ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) -{ - char output[40]; - int i; - - callbacks++; - if (quiet) - return; - for (i = 0;(i<len) && (i < 30);i++) - output[i] = ch[i]; - output[i] = 0; - fprintf(SAXdebug, "SAX.ignorableWhitespace(%s, %d)\n", output, len); -} - -/** - * processingInstructionDebug: - * @ctxt: An XML parser context - * @target: the target name - * @data: the PI data's - * @len: the number of xmlChar - * - * A processing instruction has been parsed. - */ -static void -processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target, - const xmlChar *data) -{ - callbacks++; - if (quiet) - return; - if (data != NULL) - fprintf(SAXdebug, "SAX.processingInstruction(%s, %s)\n", - (char *) target, (char *) data); - else - fprintf(SAXdebug, "SAX.processingInstruction(%s, NULL)\n", - (char *) target); -} - -/** - * cdataBlockDebug: - * @ctx: the user data (XML parser context) - * @value: The pcdata content - * @len: the block length - * - * called when a pcdata block has been parsed - */ -static void -cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.pcdata(%.20s, %d)\n", - (char *) value, len); -} - -/** - * commentDebug: - * @ctxt: An XML parser context - * @value: the comment content - * - * A comment has been parsed. - */ -static void -commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.comment(%s)\n", value); -} - -/** - * warningDebug: - * @ctxt: An XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a warning messages, gives file, line, position and - * extra parameters. - */ -static void XMLCDECL -warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) -{ - va_list args; - - callbacks++; - if (quiet) - return; - va_start(args, msg); - fprintf(SAXdebug, "SAX.warning: "); - vfprintf(SAXdebug, msg, args); - va_end(args); -} - -/** - * errorDebug: - * @ctxt: An XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a error messages, gives file, line, position and - * extra parameters. - */ -static void XMLCDECL -errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) -{ - va_list args; - - callbacks++; - if (quiet) - return; - va_start(args, msg); - fprintf(SAXdebug, "SAX.error: "); - vfprintf(SAXdebug, msg, args); - va_end(args); -} - -/** - * fatalErrorDebug: - * @ctxt: An XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a fatalError messages, gives file, line, position and - * extra parameters. - */ -static void XMLCDECL -fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) -{ - va_list args; - - callbacks++; - if (quiet) - return; - va_start(args, msg); - fprintf(SAXdebug, "SAX.fatalError: "); - vfprintf(SAXdebug, msg, args); - va_end(args); -} - -static xmlSAXHandler debugSAXHandlerStruct = { - internalSubsetDebug, - isStandaloneDebug, - hasInternalSubsetDebug, - hasExternalSubsetDebug, - resolveEntityDebug, - getEntityDebug, - entityDeclDebug, - notationDeclDebug, - attributeDeclDebug, - elementDeclDebug, - unparsedEntityDeclDebug, - setDocumentLocatorDebug, - startDocumentDebug, - endDocumentDebug, - startElementDebug, - endElementDebug, - referenceDebug, - charactersDebug, - ignorableWhitespaceDebug, - processingInstructionDebug, - commentDebug, - warningDebug, - errorDebug, - fatalErrorDebug, - getParameterEntityDebug, - cdataBlockDebug, - externalSubsetDebug, - 1, - NULL, - NULL, - NULL, - NULL -}; - -static xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct; - -/* - * SAX2 specific callbacks - */ -/** - * startElementNsDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when an opening tag has been processed. - */ -static void -startElementNsDebug(void *ctx ATTRIBUTE_UNUSED, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI, - int nb_namespaces, - const xmlChar **namespaces, - int nb_attributes, - int nb_defaulted, - const xmlChar **attributes) -{ - int i; - - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.startElementNs(%s", (char *) localname); - if (prefix == NULL) - fprintf(SAXdebug, ", NULL"); - else - fprintf(SAXdebug, ", %s", (char *) prefix); - if (URI == NULL) - fprintf(SAXdebug, ", NULL"); - else - fprintf(SAXdebug, ", '%s'", (char *) URI); - fprintf(SAXdebug, ", %d", nb_namespaces); - - if (namespaces != NULL) { - for (i = 0;i < nb_namespaces * 2;i++) { - fprintf(SAXdebug, ", xmlns"); - if (namespaces[i] != NULL) - fprintf(SAXdebug, ":%s", namespaces[i]); - i++; - fprintf(SAXdebug, "='%s'", namespaces[i]); - } - } - fprintf(SAXdebug, ", %d, %d", nb_attributes, nb_defaulted); - if (attributes != NULL) { - for (i = 0;i < nb_attributes * 5;i += 5) { - if (attributes[i + 1] != NULL) - fprintf(SAXdebug, ", %s:%s='", attributes[i + 1], attributes[i]); - else - fprintf(SAXdebug, ", %s='", attributes[i]); - fprintf(SAXdebug, "%.4s...', %d", attributes[i + 3], - (int)(attributes[i + 4] - attributes[i + 3])); - } - } - fprintf(SAXdebug, ")\n"); -} - -/** - * endElementDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when the end of an element has been detected. - */ -static void -endElementNsDebug(void *ctx ATTRIBUTE_UNUSED, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI) -{ - callbacks++; - if (quiet) - return; - fprintf(SAXdebug, "SAX.endElementNs(%s", (char *) localname); - if (prefix == NULL) - fprintf(SAXdebug, ", NULL"); - else - fprintf(SAXdebug, ", %s", (char *) prefix); - if (URI == NULL) - fprintf(SAXdebug, ", NULL)\n"); - else - fprintf(SAXdebug, ", '%s')\n", (char *) URI); -} - -static xmlSAXHandler debugSAX2HandlerStruct = { - internalSubsetDebug, - isStandaloneDebug, - hasInternalSubsetDebug, - hasExternalSubsetDebug, - resolveEntityDebug, - getEntityDebug, - entityDeclDebug, - notationDeclDebug, - attributeDeclDebug, - elementDeclDebug, - unparsedEntityDeclDebug, - setDocumentLocatorDebug, - startDocumentDebug, - endDocumentDebug, - NULL, - NULL, - referenceDebug, - charactersDebug, - ignorableWhitespaceDebug, - processingInstructionDebug, - commentDebug, - warningDebug, - errorDebug, - fatalErrorDebug, - getParameterEntityDebug, - cdataBlockDebug, - externalSubsetDebug, - XML_SAX2_MAGIC, - NULL, - startElementNsDebug, - endElementNsDebug, - NULL -}; - -static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct; - -#ifdef LIBXML_HTML_ENABLED -/** - * htmlstartElementDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when an opening tag has been processed. - */ -static void -htmlstartElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts) -{ - int i; - - fprintf(SAXdebug, "SAX.startElement(%s", (char *) name); - if (atts != NULL) { - for (i = 0;(atts[i] != NULL);i++) { - fprintf(SAXdebug, ", %s", atts[i++]); - if (atts[i] != NULL) { - unsigned char output[40]; - const unsigned char *att = atts[i]; - int outlen, attlen; - fprintf(SAXdebug, "='"); - while ((attlen = strlen((char*)att)) > 0) { - outlen = sizeof output - 1; - htmlEncodeEntities(output, &outlen, att, &attlen, '\''); - output[outlen] = 0; - fprintf(SAXdebug, "%s", (char *) output); - att += attlen; - } - fprintf(SAXdebug, "'"); - } - } - } - fprintf(SAXdebug, ")\n"); -} - -/** - * htmlcharactersDebug: - * @ctxt: An XML parser context - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some chars from the parser. - * Question: how much at a time ??? - */ -static void -htmlcharactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) -{ - unsigned char output[40]; - int inlen = len, outlen = 30; - - htmlEncodeEntities(output, &outlen, ch, &inlen, 0); - output[outlen] = 0; - - fprintf(SAXdebug, "SAX.characters(%s, %d)\n", output, len); -} - -/** - * htmlcdataDebug: - * @ctxt: An XML parser context - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some cdata chars from the parser. - * Question: how much at a time ??? - */ -static void -htmlcdataDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) -{ - unsigned char output[40]; - int inlen = len, outlen = 30; - - htmlEncodeEntities(output, &outlen, ch, &inlen, 0); - output[outlen] = 0; - - fprintf(SAXdebug, "SAX.cdata(%s, %d)\n", output, len); -} - -static xmlSAXHandler debugHTMLSAXHandlerStruct = { - internalSubsetDebug, - isStandaloneDebug, - hasInternalSubsetDebug, - hasExternalSubsetDebug, - resolveEntityDebug, - getEntityDebug, - entityDeclDebug, - notationDeclDebug, - attributeDeclDebug, - elementDeclDebug, - unparsedEntityDeclDebug, - setDocumentLocatorDebug, - startDocumentDebug, - endDocumentDebug, - htmlstartElementDebug, - endElementDebug, - referenceDebug, - htmlcharactersDebug, - ignorableWhitespaceDebug, - processingInstructionDebug, - commentDebug, - warningDebug, - errorDebug, - fatalErrorDebug, - getParameterEntityDebug, - htmlcdataDebug, - externalSubsetDebug, - 1, - NULL, - NULL, - NULL, - NULL -}; - -static xmlSAXHandlerPtr debugHTMLSAXHandler = &debugHTMLSAXHandlerStruct; -#endif /* LIBXML_HTML_ENABLED */ - -#ifdef LIBXML_SAX1_ENABLED -/** - * saxParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file using the SAX API and check for errors. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -saxParseTest(const char *filename, const char *result, - const char *err ATTRIBUTE_UNUSED, - int options) { - int ret; - char *temp; - - nb_tests++; - temp = resultFilename(filename, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "out of memory\n"); - fatalError(); - } - SAXdebug = fopen(temp, "wb"); - if (SAXdebug == NULL) { - fprintf(stderr, "Failed to write to %s\n", temp); - free(temp); - return(-1); - } - - /* for SAX we really want the callbacks though the context handlers */ - xmlSetStructuredErrorFunc(NULL, NULL); - xmlSetGenericErrorFunc(NULL, testErrorHandler); - -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) { - htmlSAXParseFile(filename, NULL, emptySAXHandler, NULL); - ret = 0; - } else -#endif - ret = xmlSAXUserParseFile(emptySAXHandler, NULL, filename); - if (ret == XML_WAR_UNDECLARED_ENTITY) { - fprintf(SAXdebug, "xmlSAXUserParseFile returned error %d\n", ret); - ret = 0; - } - if (ret != 0) { - fprintf(stderr, "Failed to parse %s\n", filename); - return(1); - } -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) { - htmlSAXParseFile(filename, NULL, debugHTMLSAXHandler, NULL); - ret = 0; - } else -#endif - if (options & XML_PARSE_SAX1) { - ret = xmlSAXUserParseFile(debugSAXHandler, NULL, filename); - } else { - ret = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename); - } - if (ret == XML_WAR_UNDECLARED_ENTITY) { - fprintf(SAXdebug, "xmlSAXUserParseFile returned error %d\n", ret); - ret = 0; - } - fclose(SAXdebug); - if (compareFiles(temp, result)) { - fprintf(stderr, "Got a difference for %s\n", filename); - ret = 1; - } else - unlink(temp); - free(temp); - - /* switch back to structured error handling */ - xmlSetGenericErrorFunc(NULL, NULL); - xmlSetStructuredErrorFunc(NULL, testStructuredErrorHandler); - - return(ret); -} -#endif - -/************************************************************************ - * * - * Parse to tree based tests * - * * - ************************************************************************/ -/** - * oldParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages: unused - * - * Parse a file using the old xmlParseFile API, then serialize back - * reparse the result and serialize again, then check for deviation - * in serialization. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -oldParseTest(const char *filename, const char *result, - const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - xmlDocPtr doc; - char *temp; - int res = 0; - - nb_tests++; - /* - * base of the test, parse with the old API - */ -#ifdef LIBXML_SAX1_ENABLED - doc = xmlParseFile(filename); -#else - doc = xmlReadFile(filename, NULL, 0); -#endif - if (doc == NULL) - return(1); - temp = resultFilename(filename, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "out of memory\n"); - fatalError(); - } - xmlSaveFile(temp, doc); - if (compareFiles(temp, result)) { - res = 1; - } - xmlFreeDoc(doc); - - /* - * Parse the saved result to make sure the round trip is okay - */ -#ifdef LIBXML_SAX1_ENABLED - doc = xmlParseFile(temp); -#else - doc = xmlReadFile(temp, NULL, 0); -#endif - if (doc == NULL) - return(1); - xmlSaveFile(temp, doc); - if (compareFiles(temp, result)) { - res = 1; - } - xmlFreeDoc(doc); - - unlink(temp); - free(temp); - return(res); -} - -#ifdef LIBXML_PUSH_ENABLED -/** - * pushParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages: unused - * - * Parse a file using the Push API, then serialize back - * to check for content. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -pushParseTest(const char *filename, const char *result, - const char *err ATTRIBUTE_UNUSED, - int options) { - xmlParserCtxtPtr ctxt; - xmlDocPtr doc; - const char *base; - int size, res; - int cur = 0; - - nb_tests++; - /* - * load the document in memory and work from there. - */ - if (loadMem(filename, &base, &size) != 0) { - fprintf(stderr, "Failed to load %s\n", filename); - return(-1); - } - -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) - ctxt = htmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename, - XML_CHAR_ENCODING_NONE); - else -#endif - ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename); - xmlCtxtUseOptions(ctxt, options); - cur += 4; - while (cur < size) { - if (cur + 1024 >= size) { -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) - htmlParseChunk(ctxt, base + cur, size - cur, 1); - else -#endif - xmlParseChunk(ctxt, base + cur, size - cur, 1); - break; - } else { -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) - htmlParseChunk(ctxt, base + cur, 1024, 0); - else -#endif - xmlParseChunk(ctxt, base + cur, 1024, 0); - cur += 1024; - } - } - doc = ctxt->myDoc; -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) - res = 1; - else -#endif - res = ctxt->wellFormed; - xmlFreeParserCtxt(ctxt); - free((char *)base); - if (!res) { - xmlFreeDoc(doc); - fprintf(stderr, "Failed to parse %s\n", filename); - return(-1); - } -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) - htmlDocDumpMemory(doc, (xmlChar **) &base, &size); - else -#endif - xmlDocDumpMemory(doc, (xmlChar **) &base, &size); - xmlFreeDoc(doc); - res = compareFileMem(result, base, size); - if ((base == NULL) || (res != 0)) { - if (base != NULL) - xmlFree((char *)base); - fprintf(stderr, "Result for %s failed\n", filename); - return(-1); - } - xmlFree((char *)base); - if (err != NULL) { - res = compareFileMem(err, testErrors, testErrorsSize); - if (res != 0) { - fprintf(stderr, "Error for %s failed\n", filename); - return(-1); - } - } - return(0); -} -#endif - -/** - * memParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages: unused - * - * Parse a file using the old xmlReadMemory API, then serialize back - * reparse the result and serialize again, then check for deviation - * in serialization. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -memParseTest(const char *filename, const char *result, - const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - xmlDocPtr doc; - const char *base; - int size, res; - - nb_tests++; - /* - * load and parse the memory - */ - if (loadMem(filename, &base, &size) != 0) { - fprintf(stderr, "Failed to load %s\n", filename); - return(-1); - } - - doc = xmlReadMemory(base, size, filename, NULL, 0); - unloadMem(base); - if (doc == NULL) { - return(1); - } - xmlDocDumpMemory(doc, (xmlChar **) &base, &size); - xmlFreeDoc(doc); - res = compareFileMem(result, base, size); - if ((base == NULL) || (res != 0)) { - if (base != NULL) - xmlFree((char *)base); - fprintf(stderr, "Result for %s failed\n", filename); - return(-1); - } - xmlFree((char *)base); - return(0); -} - -/** - * noentParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages: unused - * - * Parse a file with entity resolution, then serialize back - * reparse the result and serialize again, then check for deviation - * in serialization. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -noentParseTest(const char *filename, const char *result, - const char *err ATTRIBUTE_UNUSED, - int options) { - xmlDocPtr doc; - char *temp; - int res = 0; - - nb_tests++; - /* - * base of the test, parse with the old API - */ - doc = xmlReadFile(filename, NULL, options); - if (doc == NULL) - return(1); - temp = resultFilename(filename, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "Out of memory\n"); - fatalError(); - } - xmlSaveFile(temp, doc); - if (compareFiles(temp, result)) { - res = 1; - } - xmlFreeDoc(doc); - - /* - * Parse the saved result to make sure the round trip is okay - */ - doc = xmlReadFile(filename, NULL, options); - if (doc == NULL) - return(1); - xmlSaveFile(temp, doc); - if (compareFiles(temp, result)) { - res = 1; - } - xmlFreeDoc(doc); - - unlink(temp); - free(temp); - return(res); -} - -/** - * errParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file using the xmlReadFile API and check for errors. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -errParseTest(const char *filename, const char *result, const char *err, - int options) { - xmlDocPtr doc; - const char *base = NULL; - int size, res = 0; - - nb_tests++; -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) { - doc = htmlReadFile(filename, NULL, options); - } else -#endif -#ifdef LIBXML_XINCLUDE_ENABLED - if (options & XML_PARSE_XINCLUDE) { - doc = xmlReadFile(filename, NULL, options); - xmlXIncludeProcessFlags(doc, options); - } else -#endif - { - xmlGetWarningsDefaultValue = 1; - doc = xmlReadFile(filename, NULL, options); - } - xmlGetWarningsDefaultValue = 0; - if (result) { - if (doc == NULL) { - base = ""; - size = 0; - } else { -#ifdef LIBXML_HTML_ENABLED - if (options & XML_PARSE_HTML) { - htmlDocDumpMemory(doc, (xmlChar **) &base, &size); - } else -#endif - xmlDocDumpMemory(doc, (xmlChar **) &base, &size); - } - res = compareFileMem(result, base, size); - } - if (doc != NULL) { - if (base != NULL) - xmlFree((char *)base); - xmlFreeDoc(doc); - } - if (res != 0) { - fprintf(stderr, "Result for %s failed\n", filename); - return(-1); - } - if (err != NULL) { - res = compareFileMem(err, testErrors, testErrorsSize); - if (res != 0) { - fprintf(stderr, "Error for %s failed\n", filename); - return(-1); - } - } else if (options & XML_PARSE_DTDVALID) { - if (testErrorsSize != 0) - fprintf(stderr, "Validation for %s failed\n", filename); - } - - return(0); -} - -#ifdef LIBXML_READER_ENABLED -/************************************************************************ - * * - * Reader based tests * - * * - ************************************************************************/ - -static void processNode(FILE *out, xmlTextReaderPtr reader) { - const xmlChar *name, *value; - int type, empty; - - type = xmlTextReaderNodeType(reader); - empty = xmlTextReaderIsEmptyElement(reader); - - name = xmlTextReaderConstName(reader); - if (name == NULL) - name = BAD_CAST "--"; - - value = xmlTextReaderConstValue(reader); - - - fprintf(out, "%d %d %s %d %d", - xmlTextReaderDepth(reader), - type, - name, - empty, - xmlTextReaderHasValue(reader)); - if (value == NULL) - fprintf(out, "\n"); - else { - fprintf(out, " %s\n", value); - } -} -static int -streamProcessTest(const char *filename, const char *result, const char *err, - xmlTextReaderPtr reader, const char *rng) { - int ret; - char *temp = NULL; - FILE *t = NULL; - - if (reader == NULL) - return(-1); - - nb_tests++; - if (result != NULL) { - temp = resultFilename(filename, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "Out of memory\n"); - fatalError(); - } - t = fopen(temp, "wb"); - if (t == NULL) { - fprintf(stderr, "Can't open temp file %s\n", temp); - free(temp); - return(-1); - } - } -#ifdef LIBXML_SCHEMAS_ENABLED - if (rng != NULL) { - ret = xmlTextReaderRelaxNGValidate(reader, rng); - if (ret < 0) { - testErrorHandler(NULL, "Relax-NG schema %s failed to compile\n", - rng); - fclose(t); - unlink(temp); - free(temp); - return(0); - } - } -#endif - xmlGetWarningsDefaultValue = 1; - ret = xmlTextReaderRead(reader); - while (ret == 1) { - if ((t != NULL) && (rng == NULL)) - processNode(t, reader); - ret = xmlTextReaderRead(reader); - } - if (ret != 0) { - testErrorHandler(NULL, "%s : failed to parse\n", filename); - } - if (rng != NULL) { - if (xmlTextReaderIsValid(reader) != 1) { - testErrorHandler(NULL, "%s fails to validate\n", filename); - } else { - testErrorHandler(NULL, "%s validates\n", filename); - } - } - xmlGetWarningsDefaultValue = 0; - if (t != NULL) { - fclose(t); - ret = compareFiles(temp, result); - unlink(temp); - free(temp); - if (ret) { - fprintf(stderr, "Result for %s failed\n", filename); - return(-1); - } - } - if (err != NULL) { - ret = compareFileMem(err, testErrors, testErrorsSize); - if (ret != 0) { - fprintf(stderr, "Error for %s failed\n", filename); - printf("%s", testErrors); - return(-1); - } - } - - return(0); -} - -/** - * streamParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file using the reader API and check for errors. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -streamParseTest(const char *filename, const char *result, const char *err, - int options) { - xmlTextReaderPtr reader; - int ret; - - reader = xmlReaderForFile(filename, NULL, options); - ret = streamProcessTest(filename, result, err, reader, NULL); - xmlFreeTextReader(reader); - return(ret); -} - -/** - * walkerParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file using the walker, i.e. a reader built from a atree. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -walkerParseTest(const char *filename, const char *result, const char *err, - int options) { - xmlDocPtr doc; - xmlTextReaderPtr reader; - int ret; - - doc = xmlReadFile(filename, NULL, options); - if (doc == NULL) { - fprintf(stderr, "Failed to parse %s\n", filename); - return(-1); - } - reader = xmlReaderWalker(doc); - ret = streamProcessTest(filename, result, err, reader, NULL); - xmlFreeTextReader(reader); - xmlFreeDoc(doc); - return(ret); -} - -/** - * streamMemParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file using the reader API from memory and check for errors. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -streamMemParseTest(const char *filename, const char *result, const char *err, - int options) { - xmlTextReaderPtr reader; - int ret; - const char *base; - int size; - - /* - * load and parse the memory - */ - if (loadMem(filename, &base, &size) != 0) { - fprintf(stderr, "Failed to load %s\n", filename); - return(-1); - } - reader = xmlReaderForMemory(base, size, filename, NULL, options); - ret = streamProcessTest(filename, result, err, reader, NULL); - free((char *)base); - xmlFreeTextReader(reader); - return(ret); -} -#endif - -#ifdef LIBXML_XPATH_ENABLED -#ifdef LIBXML_DEBUG_ENABLED -/************************************************************************ - * * - * XPath and XPointer based tests * - * * - ************************************************************************/ - -static FILE *xpathOutput; -static xmlDocPtr xpathDocument; - -static void -testXPath(const char *str, int xptr, int expr) { - xmlXPathObjectPtr res; - xmlXPathContextPtr ctxt; - - nb_tests++; -#if defined(LIBXML_XPTR_ENABLED) - if (xptr) { - ctxt = xmlXPtrNewContext(xpathDocument, NULL, NULL); - res = xmlXPtrEval(BAD_CAST str, ctxt); - } else { -#endif - ctxt = xmlXPathNewContext(xpathDocument); - ctxt->node = xmlDocGetRootElement(xpathDocument); - if (expr) - res = xmlXPathEvalExpression(BAD_CAST str, ctxt); - else { - /* res = xmlXPathEval(BAD_CAST str, ctxt); */ - xmlXPathCompExprPtr comp; - - comp = xmlXPathCompile(BAD_CAST str); - if (comp != NULL) { - res = xmlXPathCompiledEval(comp, ctxt); - xmlXPathFreeCompExpr(comp); - } else - res = NULL; - } -#if defined(LIBXML_XPTR_ENABLED) - } -#endif - xmlXPathDebugDumpObject(xpathOutput, res, 0); - xmlXPathFreeObject(res); - xmlXPathFreeContext(ctxt); -} - -/** - * xpathExprTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing XPath standalone expressions and evaluate them - * - * Returns 0 in case of success, an error code otherwise - */ -static int -xpathCommonTest(const char *filename, const char *result, - int xptr, int expr) { - FILE *input; - char expression[5000]; - int len, ret = 0; - char *temp; - - temp = resultFilename(filename, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "Out of memory\n"); - fatalError(); - } - xpathOutput = fopen(temp, "wb"); - if (xpathOutput == NULL) { - fprintf(stderr, "failed to open output file %s\n", temp); - free(temp); - return(-1); - } - - input = fopen(filename, "rb"); - if (input == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Cannot open %s for reading\n", filename); - free(temp); - return(-1); - } - while (fgets(expression, 4500, input) != NULL) { - len = strlen(expression); - len--; - while ((len >= 0) && - ((expression[len] == '\n') || (expression[len] == '\t') || - (expression[len] == '\r') || (expression[len] == ' '))) len--; - expression[len + 1] = 0; - if (len >= 0) { - fprintf(xpathOutput, - "\n========================\nExpression: %s\n", - expression) ; - testXPath(expression, xptr, expr); - } - } - - fclose(input); - fclose(xpathOutput); - if (result != NULL) { - ret = compareFiles(temp, result); - if (ret) { - fprintf(stderr, "Result for %s failed\n", filename); - } - } - - unlink(temp); - free(temp); - return(ret); -} - -/** - * xpathExprTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing XPath standalone expressions and evaluate them - * - * Returns 0 in case of success, an error code otherwise - */ -static int -xpathExprTest(const char *filename, const char *result, - const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - return(xpathCommonTest(filename, result, 0, 1)); -} - -/** - * xpathDocTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing XPath expressions and evaluate them against - * a set of corresponding documents. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -xpathDocTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *err ATTRIBUTE_UNUSED, - int options) { - - char pattern[500]; - char result[500]; - glob_t globbuf; - size_t i; - int ret = 0, res; - - xpathDocument = xmlReadFile(filename, NULL, - options | XML_PARSE_DTDATTR | XML_PARSE_NOENT); - if (xpathDocument == NULL) { - fprintf(stderr, "Failed to load %s\n", filename); - return(-1); - } - - snprintf(pattern, 499, "./test/XPath/tests/%s*", baseFilename(filename)); - pattern[499] = 0; - globbuf.gl_offs = 0; - glob(pattern, GLOB_DOOFFS, NULL, &globbuf); - for (i = 0;i < globbuf.gl_pathc;i++) { - snprintf(result, 499, "result/XPath/tests/%s", - baseFilename(globbuf.gl_pathv[i])); - res = xpathCommonTest(globbuf.gl_pathv[i], &result[0], 0, 0); - if (res != 0) - ret = res; - } - globfree(&globbuf); - - xmlFreeDoc(xpathDocument); - return(ret); -} - -#ifdef LIBXML_XPTR_ENABLED -/** - * xptrDocTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing XPath expressions and evaluate them against - * a set of corresponding documents. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -xptrDocTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *err ATTRIBUTE_UNUSED, - int options) { - - char pattern[500]; - char result[500]; - glob_t globbuf; - size_t i; - int ret = 0, res; - - xpathDocument = xmlReadFile(filename, NULL, - options | XML_PARSE_DTDATTR | XML_PARSE_NOENT); - if (xpathDocument == NULL) { - fprintf(stderr, "Failed to load %s\n", filename); - return(-1); - } - - snprintf(pattern, 499, "./test/XPath/xptr/%s*", baseFilename(filename)); - pattern[499] = 0; - globbuf.gl_offs = 0; - glob(pattern, GLOB_DOOFFS, NULL, &globbuf); - for (i = 0;i < globbuf.gl_pathc;i++) { - snprintf(result, 499, "result/XPath/xptr/%s", - baseFilename(globbuf.gl_pathv[i])); - res = xpathCommonTest(globbuf.gl_pathv[i], &result[0], 1, 0); - if (res != 0) - ret = res; - } - globfree(&globbuf); - - xmlFreeDoc(xpathDocument); - return(ret); -} -#endif /* LIBXML_XPTR_ENABLED */ - -/** - * xmlidDocTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing xml:id and check for errors and verify - * that XPath queries will work on them as expected. - * - * Returns 0 in case of success, an error code otherwise - */ -static int -xmlidDocTest(const char *filename, - const char *result, - const char *err, - int options) { - - int res = 0; - int ret = 0; - char *temp; - - xpathDocument = xmlReadFile(filename, NULL, - options | XML_PARSE_DTDATTR | XML_PARSE_NOENT); - if (xpathDocument == NULL) { - fprintf(stderr, "Failed to load %s\n", filename); - return(-1); - } - - temp = resultFilename(filename, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "Out of memory\n"); - fatalError(); - } - xpathOutput = fopen(temp, "wb"); - if (xpathOutput == NULL) { - fprintf(stderr, "failed to open output file %s\n", temp); - xmlFreeDoc(xpathDocument); - free(temp); - return(-1); - } - - testXPath("id('bar')", 0, 0); - - fclose(xpathOutput); - if (result != NULL) { - ret = compareFiles(temp, result); - if (ret) { - fprintf(stderr, "Result for %s failed\n", filename); - res = 1; - } - } - - unlink(temp); - free(temp); - xmlFreeDoc(xpathDocument); - - if (err != NULL) { - ret = compareFileMem(err, testErrors, testErrorsSize); - if (ret != 0) { - fprintf(stderr, "Error for %s failed\n", filename); - res = 1; - } - } - return(res); -} - -#endif /* LIBXML_DEBUG_ENABLED */ -#endif /* XPATH */ -/************************************************************************ - * * - * URI based tests * - * * - ************************************************************************/ - -static void -handleURI(const char *str, const char *base, FILE *o) { - int ret; - xmlURIPtr uri; - xmlChar *res = NULL; - - uri = xmlCreateURI(); - - if (base == NULL) { - ret = xmlParseURIReference(uri, str); - if (ret != 0) - fprintf(o, "%s : error %d\n", str, ret); - else { - xmlNormalizeURIPath(uri->path); - xmlPrintURI(o, uri); - fprintf(o, "\n"); - } - } else { - res = xmlBuildURI((xmlChar *)str, (xmlChar *) base); - if (res != NULL) { - fprintf(o, "%s\n", (char *) res); - } - else - fprintf(o, "::ERROR::\n"); - } - if (res != NULL) - xmlFree(res); - xmlFreeURI(uri); -} - -/** - * uriCommonTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing URI and check for errors - * - * Returns 0 in case of success, an error code otherwise - */ -static int -uriCommonTest(const char *filename, - const char *result, - const char *err, - const char *base) { - char *temp; - FILE *o, *f; - char str[1024]; - int res = 0, i, ret; - - temp = resultFilename(filename, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "Out of memory\n"); - fatalError(); - } - o = fopen(temp, "wb"); - if (o == NULL) { - fprintf(stderr, "failed to open output file %s\n", temp); - free(temp); - return(-1); - } - f = fopen(filename, "rb"); - if (f == NULL) { - fprintf(stderr, "failed to open input file %s\n", filename); - fclose(o); - unlink(temp); - free(temp); - return(-1); - } - - while (1) { - /* - * read one line in string buffer. - */ - if (fgets (&str[0], sizeof (str) - 1, f) == NULL) - break; - - /* - * remove the ending spaces - */ - i = strlen(str); - while ((i > 0) && - ((str[i - 1] == '\n') || (str[i - 1] == '\r') || - (str[i - 1] == ' ') || (str[i - 1] == '\t'))) { - i--; - str[i] = 0; - } - nb_tests++; - handleURI(str, base, o); - } - - fclose(f); - fclose(o); - - if (result != NULL) { - ret = compareFiles(temp, result); - if (ret) { - fprintf(stderr, "Result for %s failed\n", filename); - res = 1; - } - } - if (err != NULL) { - ret = compareFileMem(err, testErrors, testErrorsSize); - if (ret != 0) { - fprintf(stderr, "Error for %s failed\n", filename); - res = 1; - } - } - - unlink(temp); - free(temp); - return(res); -} - -/** - * uriParseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing URI and check for errors - * - * Returns 0 in case of success, an error code otherwise - */ -static int -uriParseTest(const char *filename, - const char *result, - const char *err, - int options ATTRIBUTE_UNUSED) { - return(uriCommonTest(filename, result, err, NULL)); -} - -/** - * uriBaseTest: - * @filename: the file to parse - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing URI, compose them against a fixed base and - * check for errors - * - * Returns 0 in case of success, an error code otherwise - */ -static int -uriBaseTest(const char *filename, - const char *result, - const char *err, - int options ATTRIBUTE_UNUSED) { - return(uriCommonTest(filename, result, err, - "http://foo.com/path/to/index.html?orig#help")); -} - -static int urip_success = 1; -static int urip_current = 0; -static const char *urip_testURLs[] = { - "urip://example.com/a b.html", - "urip://example.com/a%20b.html", - "file:///path/to/a b.html", - "file:///path/to/a%20b.html", - "/path/to/a b.html", - "/path/to/a%20b.html", - "urip://example.com/résumé.html", - "urip://example.com/test?a=1&b=2%263&c=4#foo", - NULL -}; -static const char *urip_rcvsURLs[] = { - /* it is an URI the strings must be escaped */ - "urip://example.com/a%20b.html", - /* check that % escaping is not broken */ - "urip://example.com/a%20b.html", - /* it's an URI path the strings must be escaped */ - "file:///path/to/a%20b.html", - /* check that % escaping is not broken */ - "file:///path/to/a%20b.html", - /* this is not an URI, this is a path, so this should not be escaped */ - "/path/to/a b.html", - /* check that paths with % are not broken */ - "/path/to/a%20b.html", - /* out of context the encoding can't be guessed byte by byte conversion */ - "urip://example.com/r%E9sum%E9.html", - /* verify we don't destroy URIs especially the query part */ - "urip://example.com/test?a=1&b=2%263&c=4#foo", - NULL -}; -static const char *urip_res = "<list/>"; -static const char *urip_cur = NULL; -static int urip_rlen; - -/** - * uripMatch: - * @URI: an URI to test - * - * Check for an urip: query - * - * Returns 1 if yes and 0 if another Input module should be used - */ -static int -uripMatch(const char * URI) { - if ((URI == NULL) || (!strcmp(URI, "file:///etc/xml/catalog"))) - return(0); - /* Verify we received the escaped URL */ - if (strcmp(urip_rcvsURLs[urip_current], URI)) - urip_success = 0; - return(1); -} - -/** - * uripOpen: - * @URI: an URI to test - * - * Return a pointer to the urip: query handler, in this example simply - * the urip_current pointer... - * - * Returns an Input context or NULL in case or error - */ -static void * -uripOpen(const char * URI) { - if ((URI == NULL) || (!strcmp(URI, "file:///etc/xml/catalog"))) - return(NULL); - /* Verify we received the escaped URL */ - if (strcmp(urip_rcvsURLs[urip_current], URI)) - urip_success = 0; - urip_cur = urip_res; - urip_rlen = strlen(urip_res); - return((void *) urip_cur); -} - -/** - * uripClose: - * @context: the read context - * - * Close the urip: query handler - * - * Returns 0 or -1 in case of error - */ -static int -uripClose(void * context) { - if (context == NULL) return(-1); - urip_cur = NULL; - urip_rlen = 0; - return(0); -} - -/** - * uripRead: - * @context: the read context - * @buffer: where to store data - * @len: number of bytes to read - * - * Implement an urip: query read. - * - * Returns the number of bytes read or -1 in case of error - */ -static int -uripRead(void * context, char * buffer, int len) { - const char *ptr = (const char *) context; - - if ((context == NULL) || (buffer == NULL) || (len < 0)) - return(-1); - - if (len > urip_rlen) len = urip_rlen; - memcpy(buffer, ptr, len); - urip_rlen -= len; - return(len); -} - -static int -urip_checkURL(const char *URL) { - xmlDocPtr doc; - - doc = xmlReadFile(URL, NULL, 0); - if (doc == NULL) - return(-1); - xmlFreeDoc(doc); - return(1); -} - -/** - * uriPathTest: - * @filename: ignored - * @result: ignored - * @err: ignored - * - * Run a set of tests to check how Path and URI are handled before - * being passed to the I/O layer - * - * Returns 0 in case of success, an error code otherwise - */ -static int -uriPathTest(const char *filename ATTRIBUTE_UNUSED, - const char *result ATTRIBUTE_UNUSED, - const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - int parsed; - int failures = 0; - - /* - * register the new I/O handlers - */ - if (xmlRegisterInputCallbacks(uripMatch, uripOpen, uripRead, uripClose) < 0) - { - fprintf(stderr, "failed to register HTTP handler\n"); - return(-1); - } - - for (urip_current = 0;urip_testURLs[urip_current] != NULL;urip_current++) { - urip_success = 1; - parsed = urip_checkURL(urip_testURLs[urip_current]); - if (urip_success != 1) { - fprintf(stderr, "failed the URL passing test for %s", - urip_testURLs[urip_current]); - failures++; - } else if (parsed != 1) { - fprintf(stderr, "failed the parsing test for %s", - urip_testURLs[urip_current]); - failures++; - } - nb_tests++; - } - - xmlPopInputCallbacks(); - return(failures); -} - -#ifdef LIBXML_SCHEMAS_ENABLED -/************************************************************************ - * * - * Schemas tests * - * * - ************************************************************************/ -static int -schemasOneTest(const char *sch, - const char *filename, - const char *result, - const char *err, - int options, - xmlSchemaPtr schemas) { - xmlDocPtr doc; - xmlSchemaValidCtxtPtr ctxt; - int ret = 0; - int validResult = 0; - char *temp; - FILE *schemasOutput; - - doc = xmlReadFile(filename, NULL, options); - if (doc == NULL) { - fprintf(stderr, "failed to parse instance %s for %s\n", filename, sch); - return(-1); - } - - temp = resultFilename(result, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "Out of memory\n"); - fatalError(); - } - schemasOutput = fopen(temp, "wb"); - if (schemasOutput == NULL) { - fprintf(stderr, "failed to open output file %s\n", temp); - xmlFreeDoc(doc); - free(temp); - return(-1); - } - - ctxt = xmlSchemaNewValidCtxt(schemas); - xmlSchemaSetValidErrors(ctxt, - (xmlSchemaValidityErrorFunc) testErrorHandler, - (xmlSchemaValidityWarningFunc) testErrorHandler, - ctxt); - validResult = xmlSchemaValidateDoc(ctxt, doc); - if (validResult == 0) { - fprintf(schemasOutput, "%s validates\n", filename); - } else if (validResult > 0) { - fprintf(schemasOutput, "%s fails to validate\n", filename); - } else { - fprintf(schemasOutput, "%s validation generated an internal error\n", - filename); - } - fclose(schemasOutput); - if (result) { - if (compareFiles(temp, result)) { - fprintf(stderr, "Result for %s on %s failed\n", filename, sch); - ret = 1; - } - } - unlink(temp); - free(temp); - - if ((validResult != 0) && (err != NULL)) { - if (compareFileMem(err, testErrors, testErrorsSize)) { - fprintf(stderr, "Error for %s on %s failed\n", filename, sch); - ret = 1; - } - } - - xmlSchemaFreeValidCtxt(ctxt); - xmlFreeDoc(doc); - return(ret); -} -/** - * schemasTest: - * @filename: the schemas file - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a file containing URI, compose them against a fixed base and - * check for errors - * - * Returns 0 in case of success, an error code otherwise - */ -static int -schemasTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *errr ATTRIBUTE_UNUSED, - int options) { - const char *base = baseFilename(filename); - const char *base2; - const char *instance; - xmlSchemaParserCtxtPtr ctxt; - xmlSchemaPtr schemas; - int res = 0, len, ret; - char pattern[500]; - char prefix[500]; - char result[500]; - char err[500]; - glob_t globbuf; - size_t i; - char count = 0; - - /* first compile the schemas if possible */ - ctxt = xmlSchemaNewParserCtxt(filename); - xmlSchemaSetParserErrors(ctxt, - (xmlSchemaValidityErrorFunc) testErrorHandler, - (xmlSchemaValidityWarningFunc) testErrorHandler, - ctxt); - schemas = xmlSchemaParse(ctxt); - xmlSchemaFreeParserCtxt(ctxt); - - /* - * most of the mess is about the output filenames generated by the Makefile - */ - len = strlen(base); - if ((len > 499) || (len < 5)) { - xmlSchemaFree(schemas); - return(-1); - } - len -= 4; /* remove trailing .xsd */ - if (base[len - 2] == '_') { - len -= 2; /* remove subtest number */ - } - if (base[len - 2] == '_') { - len -= 2; /* remove subtest number */ - } - memcpy(prefix, base, len); - prefix[len] = 0; - - snprintf(pattern, 499, "./test/schemas/%s_?.xml", prefix); - pattern[499] = 0; - - if (base[len] == '_') { - len += 2; - memcpy(prefix, base, len); - prefix[len] = 0; - } - - globbuf.gl_offs = 0; - glob(pattern, GLOB_DOOFFS, NULL, &globbuf); - for (i = 0;i < globbuf.gl_pathc;i++) { - testErrorsSize = 0; - testErrors[0] = 0; - instance = globbuf.gl_pathv[i]; - base2 = baseFilename(instance); - len = strlen(base2); - if ((len > 6) && (base2[len - 6] == '_')) { - count = base2[len - 5]; - snprintf(result, 499, "result/schemas/%s_%c", - prefix, count); - result[499] = 0; - snprintf(err, 499, "result/schemas/%s_%c.err", - prefix, count); - err[499] = 0; - } else { - fprintf(stderr, "don't know how to process %s\n", instance); - continue; - } - if (schemas == NULL) { - } else { - nb_tests++; - ret = schemasOneTest(filename, instance, result, err, - options, schemas); - if (ret != 0) - res = ret; - } - } - globfree(&globbuf); - xmlSchemaFree(schemas); - - return(res); -} - -/************************************************************************ - * * - * Schemas tests * - * * - ************************************************************************/ -static int -rngOneTest(const char *sch, - const char *filename, - const char *result, - const char *err, - int options, - xmlRelaxNGPtr schemas) { - xmlDocPtr doc; - xmlRelaxNGValidCtxtPtr ctxt; - int ret = 0; - char *temp; - FILE *schemasOutput; - - doc = xmlReadFile(filename, NULL, options); - if (doc == NULL) { - fprintf(stderr, "failed to parse instance %s for %s\n", filename, sch); - return(-1); - } - - temp = resultFilename(result, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "Out of memory\n"); - fatalError(); - } - schemasOutput = fopen(temp, "wb"); - if (schemasOutput == NULL) { - fprintf(stderr, "failed to open output file %s\n", temp); - xmlFreeDoc(doc); - free(temp); - return(-1); - } - - ctxt = xmlRelaxNGNewValidCtxt(schemas); - xmlRelaxNGSetValidErrors(ctxt, - (xmlRelaxNGValidityErrorFunc) testErrorHandler, - (xmlRelaxNGValidityWarningFunc) testErrorHandler, - ctxt); - ret = xmlRelaxNGValidateDoc(ctxt, doc); - if (ret == 0) { - testErrorHandler(NULL, "%s validates\n", filename); - } else if (ret > 0) { - testErrorHandler(NULL, "%s fails to validate\n", filename); - } else { - testErrorHandler(NULL, "%s validation generated an internal error\n", - filename); - } - fclose(schemasOutput); - if (result) { - if (compareFiles(temp, result)) { - fprintf(stderr, "Result for %s on %s failed\n", filename, sch); - ret = 1; - } - } - unlink(temp); - free(temp); - - if (err != NULL) { - if (compareFileMem(err, testErrors, testErrorsSize)) { - fprintf(stderr, "Error for %s on %s failed\n", filename, sch); - ret = 1; - printf("%s", testErrors); - } - } - - - xmlRelaxNGFreeValidCtxt(ctxt); - xmlFreeDoc(doc); - return(ret); -} -/** - * rngTest: - * @filename: the schemas file - * @result: the file with expected result - * @err: the file with error messages - * - * Parse an RNG schemas and then apply it to the related .xml - * - * Returns 0 in case of success, an error code otherwise - */ -static int -rngTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *errr ATTRIBUTE_UNUSED, - int options) { - const char *base = baseFilename(filename); - const char *base2; - const char *instance; - xmlRelaxNGParserCtxtPtr ctxt; - xmlRelaxNGPtr schemas; - int res = 0, len, ret; - char pattern[500]; - char prefix[500]; - char result[500]; - char err[500]; - glob_t globbuf; - size_t i; - char count = 0; - - /* first compile the schemas if possible */ - ctxt = xmlRelaxNGNewParserCtxt(filename); - xmlRelaxNGSetParserErrors(ctxt, - (xmlRelaxNGValidityErrorFunc) testErrorHandler, - (xmlRelaxNGValidityWarningFunc) testErrorHandler, - ctxt); - schemas = xmlRelaxNGParse(ctxt); - xmlRelaxNGFreeParserCtxt(ctxt); - - /* - * most of the mess is about the output filenames generated by the Makefile - */ - len = strlen(base); - if ((len > 499) || (len < 5)) { - xmlRelaxNGFree(schemas); - return(-1); - } - len -= 4; /* remove trailing .rng */ - memcpy(prefix, base, len); - prefix[len] = 0; - - snprintf(pattern, 499, "./test/relaxng/%s_?.xml", prefix); - pattern[499] = 0; - - globbuf.gl_offs = 0; - glob(pattern, GLOB_DOOFFS, NULL, &globbuf); - for (i = 0;i < globbuf.gl_pathc;i++) { - testErrorsSize = 0; - testErrors[0] = 0; - instance = globbuf.gl_pathv[i]; - base2 = baseFilename(instance); - len = strlen(base2); - if ((len > 6) && (base2[len - 6] == '_')) { - count = base2[len - 5]; - snprintf(result, 499, "result/relaxng/%s_%c", - prefix, count); - result[499] = 0; - snprintf(err, 499, "result/relaxng/%s_%c.err", - prefix, count); - err[499] = 0; - } else { - fprintf(stderr, "don't know how to process %s\n", instance); - continue; - } - if (schemas == NULL) { - } else { - nb_tests++; - ret = rngOneTest(filename, instance, result, err, - options, schemas); - if (res != 0) - ret = res; - } - } - globfree(&globbuf); - xmlRelaxNGFree(schemas); - - return(res); -} - -#ifdef LIBXML_READER_ENABLED -/** - * rngStreamTest: - * @filename: the schemas file - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a set of files with streaming, applying an RNG schemas - * - * Returns 0 in case of success, an error code otherwise - */ -static int -rngStreamTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *errr ATTRIBUTE_UNUSED, - int options) { - const char *base = baseFilename(filename); - const char *base2; - const char *instance; - int res = 0, len, ret; - char pattern[500]; - char prefix[500]; - char result[500]; - char err[500]; - glob_t globbuf; - size_t i; - char count = 0; - xmlTextReaderPtr reader; - int disable_err = 0; - - /* - * most of the mess is about the output filenames generated by the Makefile - */ - len = strlen(base); - if ((len > 499) || (len < 5)) { - fprintf(stderr, "len(base) == %d !\n", len); - return(-1); - } - len -= 4; /* remove trailing .rng */ - memcpy(prefix, base, len); - prefix[len] = 0; - - /* - * strictly unifying the error messages is nearly impossible this - * hack is also done in the Makefile - */ - if ((!strcmp(prefix, "tutor10_1")) || (!strcmp(prefix, "tutor10_2")) || - (!strcmp(prefix, "tutor3_2")) || (!strcmp(prefix, "307377"))) - disable_err = 1; - - snprintf(pattern, 499, "./test/relaxng/%s_?.xml", prefix); - pattern[499] = 0; - - globbuf.gl_offs = 0; - glob(pattern, GLOB_DOOFFS, NULL, &globbuf); - for (i = 0;i < globbuf.gl_pathc;i++) { - testErrorsSize = 0; - testErrors[0] = 0; - instance = globbuf.gl_pathv[i]; - base2 = baseFilename(instance); - len = strlen(base2); - if ((len > 6) && (base2[len - 6] == '_')) { - count = base2[len - 5]; - snprintf(result, 499, "result/relaxng/%s_%c", - prefix, count); - result[499] = 0; - snprintf(err, 499, "result/relaxng/%s_%c.err", - prefix, count); - err[499] = 0; - } else { - fprintf(stderr, "don't know how to process %s\n", instance); - continue; - } - reader = xmlReaderForFile(instance, NULL, options); - if (reader == NULL) { - fprintf(stderr, "Failed to build reder for %s\n", instance); - } - if (disable_err == 1) - ret = streamProcessTest(instance, result, NULL, reader, filename); - else - ret = streamProcessTest(instance, result, err, reader, filename); - xmlFreeTextReader(reader); - if (ret != 0) { - fprintf(stderr, "instance %s failed\n", instance); - res = ret; - } - } - globfree(&globbuf); - - return(res); -} -#endif /* READER */ - -#endif - -#ifdef LIBXML_PATTERN_ENABLED -#ifdef LIBXML_READER_ENABLED -/************************************************************************ - * * - * Patterns tests * - * * - ************************************************************************/ -static void patternNode(FILE *out, xmlTextReaderPtr reader, - const char *pattern, xmlPatternPtr patternc, - xmlStreamCtxtPtr patstream) { - xmlChar *path = NULL; - int match = -1; - int type, empty; - - type = xmlTextReaderNodeType(reader); - empty = xmlTextReaderIsEmptyElement(reader); - - if (type == XML_READER_TYPE_ELEMENT) { - /* do the check only on element start */ - match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader)); - - if (match) { - path = xmlGetNodePath(xmlTextReaderCurrentNode(reader)); - fprintf(out, "Node %s matches pattern %s\n", path, pattern); - } - } - if (patstream != NULL) { - int ret; - - if (type == XML_READER_TYPE_ELEMENT) { - ret = xmlStreamPush(patstream, - xmlTextReaderConstLocalName(reader), - xmlTextReaderConstNamespaceUri(reader)); - if (ret < 0) { - fprintf(out, "xmlStreamPush() failure\n"); - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } else if (ret != match) { - if (path == NULL) { - path = xmlGetNodePath( - xmlTextReaderCurrentNode(reader)); - } - fprintf(out, - "xmlPatternMatch and xmlStreamPush disagree\n"); - fprintf(out, - " pattern %s node %s\n", - pattern, path); - } - - - } - if ((type == XML_READER_TYPE_END_ELEMENT) || - ((type == XML_READER_TYPE_ELEMENT) && (empty))) { - ret = xmlStreamPop(patstream); - if (ret < 0) { - fprintf(out, "xmlStreamPop() failure\n"); - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } - } - } - if (path != NULL) - xmlFree(path); -} - -/** - * patternTest: - * @filename: the schemas file - * @result: the file with expected result - * @err: the file with error messages - * - * Parse a set of files with streaming, applying an RNG schemas - * - * Returns 0 in case of success, an error code otherwise - */ -static int -patternTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *err ATTRIBUTE_UNUSED, - int options) { - xmlPatternPtr patternc = NULL; - xmlStreamCtxtPtr patstream = NULL; - FILE *o, *f; - char str[1024]; - char xml[500]; - char result[500]; - int len, i; - int ret = 0, res; - char *temp; - xmlTextReaderPtr reader; - xmlDocPtr doc; - - len = strlen(filename); - len -= 4; - memcpy(xml, filename, len); - xml[len] = 0; - snprintf(result, 499, "result/pattern/%s", baseFilename(xml)); - result[499] = 0; - memcpy(xml + len, ".xml", 5); - - if (!checkTestFile(xml)) { - fprintf(stderr, "Missing xml file %s\n", xml); - return(-1); - } - if (!checkTestFile(result)) { - fprintf(stderr, "Missing result file %s\n", result); - return(-1); - } - f = fopen(filename, "rb"); - if (f == NULL) { - fprintf(stderr, "Failed to open %s\n", filename); - return(-1); - } - temp = resultFilename(filename, "", ".res"); - if (temp == NULL) { - fprintf(stderr, "Out of memory\n"); - fatalError(); - } - o = fopen(temp, "wb"); - if (o == NULL) { - fprintf(stderr, "failed to open output file %s\n", temp); - fclose(f); - free(temp); - return(-1); - } - while (1) { - /* - * read one line in string buffer. - */ - if (fgets (&str[0], sizeof (str) - 1, f) == NULL) - break; - - /* - * remove the ending spaces - */ - i = strlen(str); - while ((i > 0) && - ((str[i - 1] == '\n') || (str[i - 1] == '\r') || - (str[i - 1] == ' ') || (str[i - 1] == '\t'))) { - i--; - str[i] = 0; - } - doc = xmlReadFile(xml, NULL, options); - if (doc == NULL) { - fprintf(stderr, "Failed to parse %s\n", xml); - ret = 1; - } else { - xmlNodePtr root; - const xmlChar *namespaces[22]; - int j; - xmlNsPtr ns; - - root = xmlDocGetRootElement(doc); - for (ns = root->nsDef, j = 0;ns != NULL && j < 20;ns=ns->next) { - namespaces[j++] = ns->href; - namespaces[j++] = ns->prefix; - } - namespaces[j++] = NULL; - namespaces[j++] = NULL; - - patternc = xmlPatterncompile((const xmlChar *) str, doc->dict, - 0, &namespaces[0]); - if (patternc == NULL) { - testErrorHandler(NULL, - "Pattern %s failed to compile\n", str); - xmlFreeDoc(doc); - ret = 1; - continue; - } - patstream = xmlPatternGetStreamCtxt(patternc); - if (patstream != NULL) { - ret = xmlStreamPush(patstream, NULL, NULL); - if (ret < 0) { - fprintf(stderr, "xmlStreamPush() failure\n"); - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } - } - nb_tests++; - - reader = xmlReaderWalker(doc); - res = xmlTextReaderRead(reader); - while (res == 1) { - patternNode(o, reader, str, patternc, patstream); - res = xmlTextReaderRead(reader); - } - if (res != 0) { - fprintf(o, "%s : failed to parse\n", filename); - } - xmlFreeTextReader(reader); - xmlFreeDoc(doc); - xmlFreeStreamCtxt(patstream); - patstream = NULL; - xmlFreePattern(patternc); - - } - } - - fclose(f); - fclose(o); - - ret = compareFiles(temp, result); - if (ret) { - fprintf(stderr, "Result for %s failed\n", filename); - ret = 1; - } - unlink(temp); - free(temp); - return(ret); -} -#endif /* READER */ -#endif /* PATTERN */ -#ifdef LIBXML_C14N_ENABLED -/************************************************************************ - * * - * Canonicalization tests * - * * - ************************************************************************/ -static xmlXPathObjectPtr -load_xpath_expr (xmlDocPtr parent_doc, const char* filename) { - xmlXPathObjectPtr xpath; - xmlDocPtr doc; - xmlChar *expr; - xmlXPathContextPtr ctx; - xmlNodePtr node; - xmlNsPtr ns; - - /* - * load XPath expr as a file - */ - xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; - xmlSubstituteEntitiesDefault(1); - - doc = xmlReadFile(filename, NULL, XML_PARSE_DTDATTR | XML_PARSE_NOENT); - if (doc == NULL) { - fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename); - return(NULL); - } - - /* - * Check the document is of the right kind - */ - if(xmlDocGetRootElement(doc) == NULL) { - fprintf(stderr,"Error: empty document for file \"%s\"\n", filename); - xmlFreeDoc(doc); - return(NULL); - } - - node = doc->children; - while(node != NULL && !xmlStrEqual(node->name, (const xmlChar *)"XPath")) { - node = node->next; - } - - if(node == NULL) { - fprintf(stderr,"Error: XPath element expected in the file \"%s\"\n", filename); - xmlFreeDoc(doc); - return(NULL); - } - - expr = xmlNodeGetContent(node); - if(expr == NULL) { - fprintf(stderr,"Error: XPath content element is NULL \"%s\"\n", filename); - xmlFreeDoc(doc); - return(NULL); - } - - ctx = xmlXPathNewContext(parent_doc); - if(ctx == NULL) { - fprintf(stderr,"Error: unable to create new context\n"); - xmlFree(expr); - xmlFreeDoc(doc); - return(NULL); - } - - /* - * Register namespaces - */ - ns = node->nsDef; - while(ns != NULL) { - if(xmlXPathRegisterNs(ctx, ns->prefix, ns->href) != 0) { - fprintf(stderr,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", ns->prefix, ns->href); - xmlFree(expr); - xmlXPathFreeContext(ctx); - xmlFreeDoc(doc); - return(NULL); - } - ns = ns->next; - } - - /* - * Evaluate xpath - */ - xpath = xmlXPathEvalExpression(expr, ctx); - if(xpath == NULL) { - fprintf(stderr,"Error: unable to evaluate xpath expression\n"); - xmlFree(expr); - xmlXPathFreeContext(ctx); - xmlFreeDoc(doc); - return(NULL); - } - - /* print_xpath_nodes(xpath->nodesetval); */ - - xmlFree(expr); - xmlXPathFreeContext(ctx); - xmlFreeDoc(doc); - return(xpath); -} - -/* - * Macro used to grow the current buffer. - */ -#define xxx_growBufferReentrant() { \ - buffer_size *= 2; \ - buffer = (xmlChar **) \ - xmlRealloc(buffer, buffer_size * sizeof(xmlChar*)); \ - if (buffer == NULL) { \ - perror("realloc failed"); \ - return(NULL); \ - } \ -} - -static xmlChar ** -parse_list(xmlChar *str) { - xmlChar **buffer; - xmlChar **out = NULL; - int buffer_size = 0; - int len; - - if(str == NULL) { - return(NULL); - } - - len = xmlStrlen(str); - if((str[0] == '\'') && (str[len - 1] == '\'')) { - str[len - 1] = '\0'; - str++; - len -= 2; - } - /* - * allocate an translation buffer. - */ - buffer_size = 1000; - buffer = (xmlChar **) xmlMalloc(buffer_size * sizeof(xmlChar*)); - if (buffer == NULL) { - perror("malloc failed"); - return(NULL); - } - out = buffer; - - while(*str != '\0') { - if (out - buffer > buffer_size - 10) { - int indx = out - buffer; - - xxx_growBufferReentrant(); - out = &buffer[indx]; - } - (*out++) = str; - while(*str != ',' && *str != '\0') ++str; - if(*str == ',') *(str++) = '\0'; - } - (*out) = NULL; - return buffer; -} - -static int -c14nRunTest(const char* xml_filename, int with_comments, int exclusive, - const char* xpath_filename, const char *ns_filename, - const char* result_file) { - xmlDocPtr doc; - xmlXPathObjectPtr xpath = NULL; - xmlChar *result = NULL; - int ret; - xmlChar **inclusive_namespaces = NULL; - const char *nslist = NULL; - int nssize; - - - /* - * build an XML tree from a the file; we need to add default - * attributes and resolve all character and entities references - */ - xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; - xmlSubstituteEntitiesDefault(1); - - doc = xmlReadFile(xml_filename, NULL, XML_PARSE_DTDATTR | XML_PARSE_NOENT); - if (doc == NULL) { - fprintf(stderr, "Error: unable to parse file \"%s\"\n", xml_filename); - return(-1); - } - - /* - * Check the document is of the right kind - */ - if(xmlDocGetRootElement(doc) == NULL) { - fprintf(stderr,"Error: empty document for file \"%s\"\n", xml_filename); - xmlFreeDoc(doc); - return(-1); - } - - /* - * load xpath file if specified - */ - if(xpath_filename) { - xpath = load_xpath_expr(doc, xpath_filename); - if(xpath == NULL) { - fprintf(stderr,"Error: unable to evaluate xpath expression\n"); - xmlFreeDoc(doc); - return(-1); - } - } - - if (ns_filename != NULL) { - if (loadMem(ns_filename, &nslist, &nssize)) { - fprintf(stderr,"Error: unable to evaluate xpath expression\n"); - if(xpath != NULL) xmlXPathFreeObject(xpath); - xmlFreeDoc(doc); - return(-1); - } - inclusive_namespaces = parse_list((xmlChar *) nslist); - } - - /* - * Canonical form - */ - /* fprintf(stderr,"File \"%s\" loaded: start canonization\n", xml_filename); */ - ret = xmlC14NDocDumpMemory(doc, - (xpath) ? xpath->nodesetval : NULL, - exclusive, inclusive_namespaces, - with_comments, &result); - if (ret >= 0) { - if(result != NULL) { - if (compareFileMem(result_file, (const char *) result, ret)) { - fprintf(stderr, "Result mismatch for %s\n", xml_filename); - ret = -1; - } - } - } else { - fprintf(stderr,"Error: failed to canonicalize XML file \"%s\" (ret=%d)\n", xml_filename, ret); - ret = -1; - } - - /* - * Cleanup - */ - if (result != NULL) xmlFree(result); - if(xpath != NULL) xmlXPathFreeObject(xpath); - if (inclusive_namespaces != NULL) xmlFree(inclusive_namespaces); - if (nslist != NULL) free((char *) nslist); - xmlFreeDoc(doc); - - return(ret); -} - -static int -c14nCommonTest(const char *filename, int with_comments, int exclusive, - const char *subdir) { - char buf[500]; - char prefix[500]; - const char *base; - int len; - char *result = NULL; - char *xpath = NULL; - char *ns = NULL; - int ret = 0; - - base = baseFilename(filename); - len = strlen(base); - len -= 4; - memcpy(prefix, base, len); - prefix[len] = 0; - - snprintf(buf, 499, "result/c14n/%s/%s", subdir,prefix); - if (!checkTestFile(buf)) { - fprintf(stderr, "Missing result file %s", buf); - return(-1); - } - result = strdup(buf); - snprintf(buf, 499, "test/c14n/%s/%s.xpath", subdir,prefix); - if (checkTestFile(buf)) { - xpath = strdup(buf); - } - snprintf(buf, 499, "test/c14n/%s/%s.ns", subdir,prefix); - if (checkTestFile(buf)) { - ns = strdup(buf); - } - - nb_tests++; - if (c14nRunTest(filename, with_comments, exclusive, - xpath, ns, result) < 0) - ret = 1; - - if (result != NULL) free(result); - if (xpath != NULL) free(xpath); - if (ns != NULL) free(ns); - return(ret); -} - -static int -c14nWithCommentTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - return(c14nCommonTest(filename, 1, 0, "with-comments")); -} -static int -c14nWithoutCommentTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - return(c14nCommonTest(filename, 0, 0, "without-comments")); -} -static int -c14nExcWithoutCommentTest(const char *filename, - const char *resul ATTRIBUTE_UNUSED, - const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - return(c14nCommonTest(filename, 0, 1, "exc-without-comments")); -} -#endif -#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined (LIBXML_SAX1_ENABLED) -/************************************************************************ - * * - * Catalog and threads test * - * * - ************************************************************************/ - -/* - * mostly a cut and paste from testThreads.c - */ -#define MAX_ARGC 20 - -static const char *catalog = "test/threads/complex.xml"; -static const char *testfiles[] = { - "test/threads/abc.xml", - "test/threads/acb.xml", - "test/threads/bac.xml", - "test/threads/bca.xml", - "test/threads/cab.xml", - "test/threads/cba.xml", - "test/threads/invalid.xml", -}; - -static const char *Okay = "OK"; -static const char *Failed = "Failed"; - -#ifndef xmlDoValidityCheckingDefaultValue -#error xmlDoValidityCheckingDefaultValue is not a macro -#endif -#ifndef xmlGenericErrorContext -#error xmlGenericErrorContext is not a macro -#endif - -static void * -thread_specific_data(void *private_data) -{ - xmlDocPtr myDoc; - const char *filename = (const char *) private_data; - int okay = 1; - - if (!strcmp(filename, "test/threads/invalid.xml")) { - xmlDoValidityCheckingDefaultValue = 0; - xmlGenericErrorContext = stdout; - } else { - xmlDoValidityCheckingDefaultValue = 1; - xmlGenericErrorContext = stderr; - } - myDoc = xmlParseFile(filename); - if (myDoc) { - xmlFreeDoc(myDoc); - } else { - printf("parse failed\n"); - okay = 0; - } - if (!strcmp(filename, "test/threads/invalid.xml")) { - if (xmlDoValidityCheckingDefaultValue != 0) { - printf("ValidityCheckingDefaultValue override failed\n"); - okay = 0; - } - if (xmlGenericErrorContext != stdout) { - printf("xmlGenericErrorContext override failed\n"); - okay = 0; - } - } else { - if (xmlDoValidityCheckingDefaultValue != 1) { - printf("ValidityCheckingDefaultValue override failed\n"); - okay = 0; - } - if (xmlGenericErrorContext != stderr) { - printf("xmlGenericErrorContext override failed\n"); - okay = 0; - } - } - if (okay == 0) - return ((void *) Failed); - return ((void *) Okay); -} - -#if defined(linux) || defined(solaris) - -#include <pthread.h> - -static pthread_t tid[MAX_ARGC]; - -static int -testThread(void) -{ - unsigned int i, repeat; - unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]); - void *results[MAX_ARGC]; - int ret; - int res = 0; - - xmlInitParser(); - - for (repeat = 0; repeat < 500; repeat++) { - xmlLoadCatalog(catalog); - nb_tests++; - - for (i = 0; i < num_threads; i++) { - results[i] = NULL; - tid[i] = (pthread_t) - 1; - } - - for (i = 0; i < num_threads; i++) { - ret = pthread_create(&tid[i], 0, thread_specific_data, - (void *) testfiles[i]); - if (ret != 0) { - fprintf(stderr, "pthread_create failed\n"); - return (1); - } - } - for (i = 0; i < num_threads; i++) { - ret = pthread_join(tid[i], &results[i]); - if (ret != 0) { - fprintf(stderr, "pthread_join failed\n"); - return (1); - } - } - - xmlCatalogCleanup(); - for (i = 0; i < num_threads; i++) - if (results[i] != (void *) Okay) { - fprintf(stderr, "Thread %d handling %s failed\n", - i, testfiles[i]); - res = 1; - } - } - return (res); -} - -#elif defined WIN32 -#include <windows.h> -#include <string.h> - -#define TEST_REPEAT_COUNT 500 - -static HANDLE tid[MAX_ARGC]; - -static DWORD WINAPI -win32_thread_specific_data(void *private_data) -{ - return((DWORD) thread_specific_data(private_data)); -} - -static int -testThread(void) -{ - unsigned int i, repeat; - unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]); - DWORD results[MAX_ARGC]; - BOOL ret; - int res = 0; - - xmlInitParser(); - for (repeat = 0; repeat < TEST_REPEAT_COUNT; repeat++) { - xmlLoadCatalog(catalog); - nb_tests++; - - for (i = 0; i < num_threads; i++) { - results[i] = 0; - tid[i] = (HANDLE) - 1; - } - - for (i = 0; i < num_threads; i++) { - DWORD useless; - - tid[i] = CreateThread(NULL, 0, - win32_thread_specific_data, - (void *) testfiles[i], 0, - &useless); - if (tid[i] == NULL) { - fprintf(stderr, "CreateThread failed\n"); - return(1); - } - } - - if (WaitForMultipleObjects(num_threads, tid, TRUE, INFINITE) == - WAIT_FAILED) { - fprintf(stderr, "WaitForMultipleObjects failed\n"); - return(1); - } - - for (i = 0; i < num_threads; i++) { - ret = GetExitCodeThread(tid[i], &results[i]); - if (ret == 0) { - fprintf(stderr, "GetExitCodeThread failed\n"); - return(1); - } - CloseHandle(tid[i]); - } - - xmlCatalogCleanup(); - for (i = 0; i < num_threads; i++) { - if (results[i] != (DWORD) Okay) { - fprintf(stderr, "Thread %d handling %s failed\n", - i, testfiles[i]); - res = 1; - } - } - } - - return (res); -} - -#elif defined __BEOS__ -#include <OS.h> - -static thread_id tid[MAX_ARGC]; - -static int -testThread(void) -{ - unsigned int i, repeat; - unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]); - void *results[MAX_ARGC]; - status_t ret; - int res = 0; - - xmlInitParser(); - for (repeat = 0; repeat < 500; repeat++) { - xmlLoadCatalog(catalog); - for (i = 0; i < num_threads; i++) { - results[i] = NULL; - tid[i] = (thread_id) - 1; - } - for (i = 0; i < num_threads; i++) { - tid[i] = - spawn_thread(thread_specific_data, "xmlTestThread", - B_NORMAL_PRIORITY, (void *) testfiles[i]); - if (tid[i] < B_OK) { - fprintf(stderr, "beos_thread_create failed\n"); - return (1); - } - printf("beos_thread_create %d -> %d\n", i, tid[i]); - } - for (i = 0; i < num_threads; i++) { - ret = wait_for_thread(tid[i], &results[i]); - printf("beos_thread_wait %d -> %d\n", i, ret); - if (ret != B_OK) { - fprintf(stderr, "beos_thread_wait failed\n"); - return (1); - } - } - - xmlCatalogCleanup(); - ret = B_OK; - for (i = 0; i < num_threads; i++) - if (results[i] != (void *) Okay) { - printf("Thread %d handling %s failed\n", i, testfiles[i]); - ret = B_ERROR; - } - } - if (ret != B_OK) - return(1); - return (0); -} -#else -static int -testThread(void) -{ - fprintf(stderr, - "Specific platform thread support not detected\n"); - return (-1); -} -#endif -static int -threadsTest(const char *filename ATTRIBUTE_UNUSED, - const char *resul ATTRIBUTE_UNUSED, - const char *err ATTRIBUTE_UNUSED, - int options ATTRIBUTE_UNUSED) { - return(testThread()); -} -#endif -/************************************************************************ - * * - * Tests Descriptions * - * * - ************************************************************************/ - -static -testDesc testDescriptions[] = { - { "XML regression tests" , - oldParseTest, "./test/*", "result/", "", NULL, - 0 }, - { "XML regression tests on memory" , - memParseTest, "./test/*", "result/", "", NULL, - 0 }, - { "XML entity subst regression tests" , - noentParseTest, "./test/*", "result/noent/", "", NULL, - XML_PARSE_NOENT }, - { "XML Namespaces regression tests", - errParseTest, "./test/namespaces/*", "result/namespaces/", "", ".err", - 0 }, - { "Error cases regression tests", - errParseTest, "./test/errors/*.xml", "result/errors/", "", ".err", - 0 }, -#ifdef LIBXML_READER_ENABLED - { "Error cases stream regression tests", - streamParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".str", - 0 }, - { "Reader regression tests", - streamParseTest, "./test/*", "result/", ".rdr", NULL, - 0 }, - { "Reader entities substitution regression tests", - streamParseTest, "./test/*", "result/", ".rde", NULL, - XML_PARSE_NOENT }, - { "Reader on memory regression tests", - streamMemParseTest, "./test/*", "result/", ".rdr", NULL, - 0 }, - { "Walker regression tests", - walkerParseTest, "./test/*", "result/", ".rdr", NULL, - 0 }, -#endif -#ifdef LIBXML_SAX1_ENABLED - { "SAX1 callbacks regression tests" , - saxParseTest, "./test/*", "result/", ".sax", NULL, - XML_PARSE_SAX1 }, - { "SAX2 callbacks regression tests" , - saxParseTest, "./test/*", "result/", ".sax2", NULL, - 0 }, -#endif -#ifdef LIBXML_PUSH_ENABLED - { "XML push regression tests" , - pushParseTest, "./test/*", "result/", "", NULL, - 0 }, -#endif -#ifdef LIBXML_HTML_ENABLED - { "HTML regression tests" , - errParseTest, "./test/HTML/*", "result/HTML/", "", ".err", - XML_PARSE_HTML }, -#ifdef LIBXML_PUSH_ENABLED - { "Push HTML regression tests" , - pushParseTest, "./test/HTML/*", "result/HTML/", "", ".err", - XML_PARSE_HTML }, -#endif -#ifdef LIBXML_SAX1_ENABLED - { "HTML SAX regression tests" , - saxParseTest, "./test/HTML/*", "result/HTML/", ".sax", NULL, - XML_PARSE_HTML }, -#endif -#endif -#ifdef LIBXML_VALID_ENABLED - { "Valid documents regression tests" , - errParseTest, "./test/VCM/*", NULL, NULL, NULL, - XML_PARSE_DTDVALID }, - { "Validity checking regression tests" , - errParseTest, "./test/VC/*", "result/VC/", NULL, "", - XML_PARSE_DTDVALID }, - { "General documents valid regression tests" , - errParseTest, "./test/valid/*", "result/valid/", "", ".err", - XML_PARSE_DTDVALID }, -#endif -#ifdef LIBXML_XINCLUDE_ENABLED - { "XInclude regression tests" , - errParseTest, "./test/XInclude/docs/*", "result/XInclude/", "", NULL, - /* Ignore errors at this point ".err", */ - XML_PARSE_XINCLUDE }, - { "XInclude xmlReader regression tests", - streamParseTest, "./test/XInclude/docs/*", "result/XInclude/", ".rdr", - /* Ignore errors at this point ".err", */ - NULL, XML_PARSE_XINCLUDE }, - { "XInclude regression tests stripping include nodes" , - errParseTest, "./test/XInclude/docs/*", "result/XInclude/", "", NULL, - /* Ignore errors at this point ".err", */ - XML_PARSE_XINCLUDE | XML_PARSE_NOXINCNODE }, - { "XInclude xmlReader regression tests stripping include nodes", - streamParseTest, "./test/XInclude/docs/*", "result/XInclude/", ".rdr", - /* Ignore errors at this point ".err", */ - NULL, XML_PARSE_XINCLUDE | XML_PARSE_NOXINCNODE }, -#endif -#ifdef LIBXML_XPATH_ENABLED -#ifdef LIBXML_DEBUG_ENABLED - { "XPath expressions regression tests" , - xpathExprTest, "./test/XPath/expr/*", "result/XPath/expr/", "", NULL, - 0 }, - { "XPath document queries regression tests" , - xpathDocTest, "./test/XPath/docs/*", NULL, NULL, NULL, - 0 }, -#ifdef LIBXML_XPTR_ENABLED - { "XPointer document queries regression tests" , - xptrDocTest, "./test/XPath/docs/*", NULL, NULL, NULL, - 0 }, -#endif - { "xml:id regression tests" , - xmlidDocTest, "./test/xmlid/*", "result/xmlid/", "", ".err", - 0 }, -#endif -#endif - { "URI parsing tests" , - uriParseTest, "./test/URI/*.uri", "result/URI/", "", NULL, - 0 }, - { "URI base composition tests" , - uriBaseTest, "./test/URI/*.data", "result/URI/", "", NULL, - 0 }, - { "Path URI conversion tests" , - uriPathTest, NULL, NULL, NULL, NULL, - 0 }, -#ifdef LIBXML_SCHEMAS_ENABLED - { "Schemas regression tests" , - schemasTest, "./test/schemas/*_*.xsd", NULL, NULL, NULL, - 0 }, - { "Relax-NG regression tests" , - rngTest, "./test/relaxng/*.rng", NULL, NULL, NULL, - XML_PARSE_DTDATTR | XML_PARSE_NOENT }, -#ifdef LIBXML_READER_ENABLED - { "Relax-NG streaming regression tests" , - rngStreamTest, "./test/relaxng/*.rng", NULL, NULL, NULL, - XML_PARSE_DTDATTR | XML_PARSE_NOENT }, -#endif -#endif -#ifdef LIBXML_PATTERN_ENABLED -#ifdef LIBXML_READER_ENABLED - { "Pattern regression tests" , - patternTest, "./test/pattern/*.pat", "result/pattern/", NULL, NULL, - 0 }, -#endif -#endif -#ifdef LIBXML_C14N_ENABLED - { "C14N with comments regression tests" , - c14nWithCommentTest, "./test/c14n/with-comments/*.xml", NULL, NULL, NULL, - 0 }, - { "C14N without comments regression tests" , - c14nWithoutCommentTest, "./test/c14n/without-comments/*.xml", NULL, NULL, NULL, - 0 }, - { "C14N exclusive without comments regression tests" , - c14nExcWithoutCommentTest, "./test/c14n/exc-without-comments/*.xml", NULL, NULL, NULL, - 0 }, -#endif -#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_SAX1_ENABLED) - { "Catalog and Threads regression tests" , - threadsTest, NULL, NULL, NULL, NULL, - 0 }, -#endif - {NULL, NULL, NULL, NULL, NULL, NULL, 0} -}; - -/************************************************************************ - * * - * The main code driving the tests * - * * - ************************************************************************/ - -static int -launchTests(testDescPtr tst) { - int res = 0, err = 0; - size_t i; - char *result; - char *error; - int mem; - - if (tst == NULL) return(-1); - if (tst->in != NULL) { - glob_t globbuf; - - globbuf.gl_offs = 0; - glob(tst->in, GLOB_DOOFFS, NULL, &globbuf); - for (i = 0;i < globbuf.gl_pathc;i++) { - if (!checkTestFile(globbuf.gl_pathv[i])) - continue; - if (tst->suffix != NULL) { - result = resultFilename(globbuf.gl_pathv[i], tst->out, - tst->suffix); - if (result == NULL) { - fprintf(stderr, "Out of memory !\n"); - fatalError(); - } - } else { - result = NULL; - } - if (tst->err != NULL) { - error = resultFilename(globbuf.gl_pathv[i], tst->out, - tst->err); - if (error == NULL) { - fprintf(stderr, "Out of memory !\n"); - fatalError(); - } - } else { - error = NULL; - } - if ((result) &&(!checkTestFile(result))) { - fprintf(stderr, "Missing result file %s\n", result); - } else if ((error) &&(!checkTestFile(error))) { - fprintf(stderr, "Missing error file %s\n", error); - } else { - mem = xmlMemUsed(); - extraMemoryFromResolver = 0; - testErrorsSize = 0; - testErrors[0] = 0; - res = tst->func(globbuf.gl_pathv[i], result, error, - tst->options | XML_PARSE_COMPACT); - xmlResetLastError(); - if (res != 0) { - fprintf(stderr, "File %s generated an error\n", - globbuf.gl_pathv[i]); - nb_errors++; - err++; - } - else if (xmlMemUsed() != mem) { - if ((xmlMemUsed() != mem) && - (extraMemoryFromResolver == 0)) { - fprintf(stderr, "File %s leaked %d bytes\n", - globbuf.gl_pathv[i], xmlMemUsed() - mem); - nb_leaks++; - err++; - } - } - testErrorsSize = 0; - } - if (result) - free(result); - if (error) - free(error); - } - globfree(&globbuf); - } else { - testErrorsSize = 0; - testErrors[0] = 0; - extraMemoryFromResolver = 0; - res = tst->func(NULL, NULL, NULL, tst->options); - if (res != 0) { - nb_errors++; - err++; - } - } - return(err); -} - -static int verbose = 0; -static int tests_quiet = 0; - -static int -runtest(int i) { - int ret = 0, res; - int old_errors, old_tests, old_leaks; - - old_errors = nb_errors; - old_tests = nb_tests; - old_leaks = nb_leaks; - if ((tests_quiet == 0) && (testDescriptions[i].desc != NULL)) - printf("## %s\n", testDescriptions[i].desc); - res = launchTests(&testDescriptions[i]); - if (res != 0) - ret++; - if (verbose) { - if ((nb_errors == old_errors) && (nb_leaks == old_leaks)) - printf("Ran %d tests, no errors\n", nb_tests - old_tests); - else - printf("Ran %d tests, %d errors, %d leaks\n", - nb_tests - old_tests, - nb_errors - old_errors, - nb_leaks - old_leaks); - } - return(ret); -} - -int -main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { - int i, a, ret = 0; - int subset = 0; - - initializeLibxml2(); - - - for (a = 1; a < argc;a++) { - if (!strcmp(argv[a], "-v")) - verbose = 1; - else if (!strcmp(argv[a], "-quiet")) - tests_quiet = 1; - else { - for (i = 0; testDescriptions[i].func != NULL; i++) { - if (strstr(testDescriptions[i].desc, argv[a])) { - ret += runtest(i); - subset++; - } - } - } - } - if (subset == 0) { - for (i = 0; testDescriptions[i].func != NULL; i++) { - ret += runtest(i); - } - } - if ((nb_errors == 0) && (nb_leaks == 0)) { - ret = 0; - printf("Total %d tests, no errors\n", - nb_tests); - } else { - ret = 1; - printf("Total %d tests, %d errors, %d leaks\n", - nb_tests, nb_errors, nb_leaks); - } - xmlCleanupParser(); - xmlMemoryDump(); - - return(ret); -} - -#else /* ! LIBXML_OUTPUT_ENABLED */ -int -main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { - fprintf(stderr, "runtest requires output to be enabled in libxml2\n"); - return(1); -} -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/schematron.c b/ThirdParty/libxml2/vtklibxml2/schematron.c deleted file mode 100644 index 736d7667ed3..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/schematron.c +++ /dev/null @@ -1,1734 +0,0 @@ -/* - * schematron.c : implementation of the Schematron schema validity checking - * - * See Copyright for the status of this software. - * - * Daniel Veillard <daniel@veillard.com> - */ - -/* - * TODO: - * + double check the semantic, especially - * - multiple rules applying in a single pattern/node - * - the semantic of libxml2 patterns vs. XSLT production referenced - * by the spec. - * + export of results in SVRL - * + full parsing and coverage of the spec, conformance of the input to the - * spec - * + divergences between the draft and the ISO proposed standard :-( - * + hook and test include - * + try and compare with the XSLT version - */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_SCHEMATRON_ENABLED - -#include <string.h> -#include <libxml/parser.h> -#include <libxml/tree.h> -#include <libxml/uri.h> -#include <libxml/xpath.h> -#include <libxml/xpathInternals.h> -#include <libxml/pattern.h> -#include <libxml/schematron.h> - -#define SCHEMATRON_PARSE_OPTIONS XML_PARSE_NOENT - -#define SCT_OLD_NS BAD_CAST "http://www.ascc.net/xml/schematron" - -#define XML_SCHEMATRON_NS BAD_CAST "http://purl.oclc.org/dsdl/schematron" - - -static const xmlChar *xmlSchematronNs = XML_SCHEMATRON_NS; -static const xmlChar *xmlOldSchematronNs = SCT_OLD_NS; - -#define IS_SCHEMATRON(node, elem) \ - ((node != NULL) && (node->type == XML_ELEMENT_NODE ) && \ - (node->ns != NULL) && \ - (xmlStrEqual(node->name, (const xmlChar *) elem)) && \ - ((xmlStrEqual(node->ns->href, xmlSchematronNs)) || \ - (xmlStrEqual(node->ns->href, xmlOldSchematronNs)))) - -#define NEXT_SCHEMATRON(node) \ - while (node != NULL) { \ - if ((node->type == XML_ELEMENT_NODE ) && (node->ns != NULL) && \ - ((xmlStrEqual(node->ns->href, xmlSchematronNs)) || \ - (xmlStrEqual(node->ns->href, xmlOldSchematronNs)))) \ - break; \ - node = node->next; \ - } - -/** - * TODO: - * - * macro to flag unimplemented blocks - */ -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -typedef enum { - XML_SCHEMATRON_ASSERT=1, - XML_SCHEMATRON_REPORT=2 -} xmlSchematronTestType; - -/** - * _xmlSchematronTest: - * - * A Schematrons test, either an assert or a report - */ -typedef struct _xmlSchematronTest xmlSchematronTest; -typedef xmlSchematronTest *xmlSchematronTestPtr; -struct _xmlSchematronTest { - xmlSchematronTestPtr next; /* the next test in the list */ - xmlSchematronTestType type; /* the test type */ - xmlNodePtr node; /* the node in the tree */ - xmlChar *test; /* the expression to test */ - xmlXPathCompExprPtr comp; /* the compiled expression */ - xmlChar *report; /* the message to report */ -}; - -/** - * _xmlSchematronRule: - * - * A Schematrons rule - */ -typedef struct _xmlSchematronRule xmlSchematronRule; -typedef xmlSchematronRule *xmlSchematronRulePtr; -struct _xmlSchematronRule { - xmlSchematronRulePtr next; /* the next rule in the list */ - xmlSchematronRulePtr patnext;/* the next rule in the pattern list */ - xmlNodePtr node; /* the node in the tree */ - xmlChar *context; /* the context evaluation rule */ - xmlSchematronTestPtr tests; /* the list of tests */ - xmlPatternPtr pattern; /* the compiled pattern associated */ - xmlChar *report; /* the message to report */ -}; - -/** - * _xmlSchematronPattern: - * - * A Schematrons pattern - */ -typedef struct _xmlSchematronPattern xmlSchematronPattern; -typedef xmlSchematronPattern *xmlSchematronPatternPtr; -struct _xmlSchematronPattern { - xmlSchematronPatternPtr next;/* the next pattern in the list */ - xmlSchematronRulePtr rules; /* the list of rules */ - xmlChar *name; /* the name of the pattern */ -}; - -/** - * _xmlSchematron: - * - * A Schematrons definition - */ -struct _xmlSchematron { - const xmlChar *name; /* schema name */ - int preserve; /* was the document passed by the user */ - xmlDocPtr doc; /* pointer to the parsed document */ - int flags; /* specific to this schematron */ - - void *_private; /* unused by the library */ - xmlDictPtr dict; /* the dictionnary used internally */ - - const xmlChar *title; /* the title if any */ - - int nbNs; /* the number of namespaces */ - - int nbPattern; /* the number of patterns */ - xmlSchematronPatternPtr patterns;/* the patterns found */ - xmlSchematronRulePtr rules; /* the rules gathered */ - int nbNamespaces; /* number of namespaces in the array */ - int maxNamespaces; /* size of the array */ - const xmlChar **namespaces; /* the array of namespaces */ -}; - -/** - * xmlSchematronValidCtxt: - * - * A Schematrons validation context - */ -struct _xmlSchematronValidCtxt { - int type; - int flags; /* an or of xmlSchematronValidOptions */ - - xmlDictPtr dict; - int nberrors; - int err; - - xmlSchematronPtr schema; - xmlXPathContextPtr xctxt; - - FILE *outputFile; /* if using XML_SCHEMATRON_OUT_FILE */ - xmlBufferPtr outputBuffer; /* if using XML_SCHEMATRON_OUT_BUFFER */ - xmlOutputWriteCallback iowrite; /* if using XML_SCHEMATRON_OUT_IO */ - xmlOutputCloseCallback ioclose; - void *ioctx; -}; - -struct _xmlSchematronParserCtxt { - int type; - const xmlChar *URL; - xmlDocPtr doc; - int preserve; /* Whether the doc should be freed */ - const char *buffer; - int size; - - xmlDictPtr dict; /* dictionnary for interned string names */ - - int nberrors; - int err; - xmlXPathContextPtr xctxt; /* the XPath context used for compilation */ - xmlSchematronPtr schema; - - int nbNamespaces; /* number of namespaces in the array */ - int maxNamespaces; /* size of the array */ - const xmlChar **namespaces; /* the array of namespaces */ - - int nbIncludes; /* number of includes in the array */ - int maxIncludes; /* size of the array */ - xmlNodePtr *includes; /* the array of includes */ - - /* error rreporting data */ - void *userData; /* user specific data block */ - xmlSchematronValidityErrorFunc error;/* the callback in case of errors */ - xmlSchematronValidityWarningFunc warning;/* callback in case of warning */ - xmlStructuredErrorFunc serror; /* the structured function */ - -}; - -#define XML_STRON_CTXT_PARSER 1 -#define XML_STRON_CTXT_VALIDATOR 2 - -/************************************************************************ - * * - * Error reporting * - * * - ************************************************************************/ - -/** - * xmlSchematronPErrMemory: - * @node: a context node - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlSchematronPErrMemory(xmlSchematronParserCtxtPtr ctxt, - const char *extra, xmlNodePtr node) -{ - if (ctxt != NULL) - ctxt->nberrors++; - __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL, - extra); -} - -/** - * xmlSchematronPErr: - * @ctxt: the parsing context - * @node: the context node - * @error: the error code - * @msg: the error message - * @str1: extra data - * @str2: extra data - * - * Handle a parser error - */ -static void -xmlSchematronPErr(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr node, int error, - const char *msg, const xmlChar * str1, const xmlChar * str2) -{ - xmlGenericErrorFunc channel = NULL; - xmlStructuredErrorFunc schannel = NULL; - void *data = NULL; - - if (ctxt != NULL) { - ctxt->nberrors++; - channel = ctxt->error; - data = ctxt->userData; - schannel = ctxt->serror; - } - __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, - error, XML_ERR_ERROR, NULL, 0, - (const char *) str1, (const char *) str2, NULL, 0, 0, - msg, str1, str2); -} - -/** - * xmlSchematronVTypeErrMemory: - * @node: a context node - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlSchematronVErrMemory(xmlSchematronValidCtxtPtr ctxt, - const char *extra, xmlNodePtr node) -{ - if (ctxt != NULL) { - ctxt->nberrors++; - ctxt->err = XML_SCHEMAV_INTERNAL; - } - __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL, - extra); -} - -/************************************************************************ - * * - * Parsing and compilation of the Schematrontrons * - * * - ************************************************************************/ - -/** - * xmlSchematronAddTest: - * @ctxt: the schema parsing context - * @type: the type of test - * @rule: the parent rule - * @node: the node hosting the test - * @test: the associated test - * @report: the associated report string - * - * Add a test to a schematron - * - * Returns the new pointer or NULL in case of error - */ -static xmlSchematronTestPtr -xmlSchematronAddTest(xmlSchematronParserCtxtPtr ctxt, - xmlSchematronTestType type, - xmlSchematronRulePtr rule, - xmlNodePtr node, xmlChar *test, xmlChar *report) -{ - xmlSchematronTestPtr ret; - xmlXPathCompExprPtr comp; - - if ((ctxt == NULL) || (rule == NULL) || (node == NULL) || - (test == NULL)) - return(NULL); - - /* - * try first to compile the test expression - */ - comp = xmlXPathCtxtCompile(ctxt->xctxt, test); - if (comp == NULL) { - xmlSchematronPErr(ctxt, node, - XML_SCHEMAP_NOROOT, - "Failed to compile test expression %s", - test, NULL); - return(NULL); - } - - ret = (xmlSchematronTestPtr) xmlMalloc(sizeof(xmlSchematronTest)); - if (ret == NULL) { - xmlSchematronPErrMemory(ctxt, "allocating schema test", node); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchematronTest)); - ret->type = type; - ret->node = node; - ret->test = test; - ret->comp = comp; - ret->report = report; - ret->next = NULL; - if (rule->tests == NULL) { - rule->tests = ret; - } else { - xmlSchematronTestPtr prev = rule->tests; - - while (prev->next != NULL) - prev = prev->next; - prev->next = ret; - } - return (ret); -} - -/** - * xmlSchematronFreeTests: - * @tests: a list of tests - * - * Free a list of tests. - */ -static void -xmlSchematronFreeTests(xmlSchematronTestPtr tests) { - xmlSchematronTestPtr next; - - while (tests != NULL) { - next = tests->next; - if (tests->test != NULL) - xmlFree(tests->test); - if (tests->comp != NULL) - xmlXPathFreeCompExpr(tests->comp); - if (tests->report != NULL) - xmlFree(tests->report); - xmlFree(tests); - tests = next; - } -} - -/** - * xmlSchematronAddRule: - * @ctxt: the schema parsing context - * @schema: a schema structure - * @node: the node hosting the rule - * @context: the associated context string - * @report: the associated report string - * - * Add a rule to a schematron - * - * Returns the new pointer or NULL in case of error - */ -static xmlSchematronRulePtr -xmlSchematronAddRule(xmlSchematronParserCtxtPtr ctxt, xmlSchematronPtr schema, - xmlSchematronPatternPtr pat, xmlNodePtr node, - xmlChar *context, xmlChar *report) -{ - xmlSchematronRulePtr ret; - xmlPatternPtr pattern; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || - (context == NULL)) - return(NULL); - - /* - * Try first to compile the pattern - */ - pattern = xmlPatterncompile(context, ctxt->dict, XML_PATTERN_XPATH, - ctxt->namespaces); - if (pattern == NULL) { - xmlSchematronPErr(ctxt, node, - XML_SCHEMAP_NOROOT, - "Failed to compile context expression %s", - context, NULL); - } - - ret = (xmlSchematronRulePtr) xmlMalloc(sizeof(xmlSchematronRule)); - if (ret == NULL) { - xmlSchematronPErrMemory(ctxt, "allocating schema rule", node); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchematronRule)); - ret->node = node; - ret->context = context; - ret->pattern = pattern; - ret->report = report; - ret->next = NULL; - if (schema->rules == NULL) { - schema->rules = ret; - } else { - xmlSchematronRulePtr prev = schema->rules; - - while (prev->next != NULL) - prev = prev->next; - prev->next = ret; - } - ret->patnext = NULL; - if (pat->rules == NULL) { - pat->rules = ret; - } else { - xmlSchematronRulePtr prev = pat->rules; - - while (prev->patnext != NULL) - prev = prev->patnext; - prev->patnext = ret; - } - return (ret); -} - -/** - * xmlSchematronFreeRules: - * @rules: a list of rules - * - * Free a list of rules. - */ -static void -xmlSchematronFreeRules(xmlSchematronRulePtr rules) { - xmlSchematronRulePtr next; - - while (rules != NULL) { - next = rules->next; - if (rules->tests) - xmlSchematronFreeTests(rules->tests); - if (rules->context != NULL) - xmlFree(rules->context); - if (rules->pattern) - xmlFreePattern(rules->pattern); - if (rules->report != NULL) - xmlFree(rules->report); - xmlFree(rules); - rules = next; - } -} - -/** - * xmlSchematronAddPattern: - * @ctxt: the schema parsing context - * @schema: a schema structure - * @node: the node hosting the pattern - * @id: the id or name of the pattern - * - * Add a pattern to a schematron - * - * Returns the new pointer or NULL in case of error - */ -static xmlSchematronPatternPtr -xmlSchematronAddPattern(xmlSchematronParserCtxtPtr ctxt, - xmlSchematronPtr schema, xmlNodePtr node, xmlChar *name) -{ - xmlSchematronPatternPtr ret; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || (name == NULL)) - return(NULL); - - ret = (xmlSchematronPatternPtr) xmlMalloc(sizeof(xmlSchematronPattern)); - if (ret == NULL) { - xmlSchematronPErrMemory(ctxt, "allocating schema pattern", node); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchematronPattern)); - ret->name = name; - ret->next = NULL; - if (schema->patterns == NULL) { - schema->patterns = ret; - } else { - xmlSchematronPatternPtr prev = schema->patterns; - - while (prev->next != NULL) - prev = prev->next; - prev->next = ret; - } - return (ret); -} - -/** - * xmlSchematronFreePatterns: - * @patterns: a list of patterns - * - * Free a list of patterns. - */ -static void -xmlSchematronFreePatterns(xmlSchematronPatternPtr patterns) { - xmlSchematronPatternPtr next; - - while (patterns != NULL) { - next = patterns->next; - if (patterns->name != NULL) - xmlFree(patterns->name); - xmlFree(patterns); - patterns = next; - } -} - -/** - * xmlSchematronNewSchematron: - * @ctxt: a schema validation context - * - * Allocate a new Schematron structure. - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlSchematronPtr -xmlSchematronNewSchematron(xmlSchematronParserCtxtPtr ctxt) -{ - xmlSchematronPtr ret; - - ret = (xmlSchematronPtr) xmlMalloc(sizeof(xmlSchematron)); - if (ret == NULL) { - xmlSchematronPErrMemory(ctxt, "allocating schema", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchematron)); - ret->dict = ctxt->dict; - xmlDictReference(ret->dict); - - return (ret); -} - -/** - * xmlSchematronFree: - * @schema: a schema structure - * - * Deallocate a Schematron structure. - */ -void -xmlSchematronFree(xmlSchematronPtr schema) -{ - if (schema == NULL) - return; - - if ((schema->doc != NULL) && (!(schema->preserve))) - xmlFreeDoc(schema->doc); - - if (schema->namespaces != NULL) - xmlFree((char **) schema->namespaces); - - xmlSchematronFreeRules(schema->rules); - xmlSchematronFreePatterns(schema->patterns); - xmlDictFree(schema->dict); - xmlFree(schema); -} - -/** - * xmlSchematronNewParserCtxt: - * @URL: the location of the schema - * - * Create an XML Schematrons parse context for that file/resource expected - * to contain an XML Schematrons file. - * - * Returns the parser context or NULL in case of error - */ -xmlSchematronParserCtxtPtr -xmlSchematronNewParserCtxt(const char *URL) -{ - xmlSchematronParserCtxtPtr ret; - - if (URL == NULL) - return (NULL); - - ret = - (xmlSchematronParserCtxtPtr) - xmlMalloc(sizeof(xmlSchematronParserCtxt)); - if (ret == NULL) { - xmlSchematronPErrMemory(NULL, "allocating schema parser context", - NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchematronParserCtxt)); - ret->type = XML_STRON_CTXT_PARSER; - ret->dict = xmlDictCreate(); - ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1); - ret->includes = NULL; - ret->xctxt = xmlXPathNewContext(NULL); - if (ret->xctxt == NULL) { - xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", - NULL); - xmlSchematronFreeParserCtxt(ret); - return (NULL); - } - ret->xctxt->flags = XML_XPATH_CHECKNS; - return (ret); -} - -/** - * xmlSchematronNewMemParserCtxt: - * @buffer: a pointer to a char array containing the schemas - * @size: the size of the array - * - * Create an XML Schematrons parse context for that memory buffer expected - * to contain an XML Schematrons file. - * - * Returns the parser context or NULL in case of error - */ -xmlSchematronParserCtxtPtr -xmlSchematronNewMemParserCtxt(const char *buffer, int size) -{ - xmlSchematronParserCtxtPtr ret; - - if ((buffer == NULL) || (size <= 0)) - return (NULL); - - ret = - (xmlSchematronParserCtxtPtr) - xmlMalloc(sizeof(xmlSchematronParserCtxt)); - if (ret == NULL) { - xmlSchematronPErrMemory(NULL, "allocating schema parser context", - NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchematronParserCtxt)); - ret->buffer = buffer; - ret->size = size; - ret->dict = xmlDictCreate(); - ret->xctxt = xmlXPathNewContext(NULL); - if (ret->xctxt == NULL) { - xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", - NULL); - xmlSchematronFreeParserCtxt(ret); - return (NULL); - } - return (ret); -} - -/** - * xmlSchematronNewDocParserCtxt: - * @doc: a preparsed document tree - * - * Create an XML Schematrons parse context for that document. - * NB. The document may be modified during the parsing process. - * - * Returns the parser context or NULL in case of error - */ -xmlSchematronParserCtxtPtr -xmlSchematronNewDocParserCtxt(xmlDocPtr doc) -{ - xmlSchematronParserCtxtPtr ret; - - if (doc == NULL) - return (NULL); - - ret = - (xmlSchematronParserCtxtPtr) - xmlMalloc(sizeof(xmlSchematronParserCtxt)); - if (ret == NULL) { - xmlSchematronPErrMemory(NULL, "allocating schema parser context", - NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchematronParserCtxt)); - ret->doc = doc; - ret->dict = xmlDictCreate(); - /* The application has responsibility for the document */ - ret->preserve = 1; - ret->xctxt = xmlXPathNewContext(doc); - if (ret->xctxt == NULL) { - xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", - NULL); - xmlSchematronFreeParserCtxt(ret); - return (NULL); - } - - return (ret); -} - -/** - * xmlSchematronFreeParserCtxt: - * @ctxt: the schema parser context - * - * Free the resources associated to the schema parser context - */ -void -xmlSchematronFreeParserCtxt(xmlSchematronParserCtxtPtr ctxt) -{ - if (ctxt == NULL) - return; - if (ctxt->doc != NULL && !ctxt->preserve) - xmlFreeDoc(ctxt->doc); - if (ctxt->xctxt != NULL) { - xmlXPathFreeContext(ctxt->xctxt); - } - if (ctxt->namespaces != NULL) - xmlFree((char **) ctxt->namespaces); - xmlDictFree(ctxt->dict); - xmlFree(ctxt); -} - -#if 0 -/** - * xmlSchematronPushInclude: - * @ctxt: the schema parser context - * @doc: the included document - * @cur: the current include node - * - * Add an included document - */ -static void -xmlSchematronPushInclude(xmlSchematronParserCtxtPtr ctxt, - xmlDocPtr doc, xmlNodePtr cur) -{ - if (ctxt->includes == NULL) { - ctxt->maxIncludes = 10; - ctxt->includes = (xmlNodePtr *) - xmlMalloc(ctxt->maxIncludes * 2 * sizeof(xmlNodePtr)); - if (ctxt->includes == NULL) { - xmlSchematronPErrMemory(NULL, "allocating parser includes", - NULL); - return; - } - ctxt->nbIncludes = 0; - } else if (ctxt->nbIncludes + 2 >= ctxt->maxIncludes) { - xmlNodePtr *tmp; - - tmp = (xmlNodePtr *) - xmlRealloc(ctxt->includes, ctxt->maxIncludes * 4 * - sizeof(xmlNodePtr)); - if (tmp == NULL) { - xmlSchematronPErrMemory(NULL, "allocating parser includes", - NULL); - return; - } - ctxt->includes = tmp; - ctxt->maxIncludes *= 2; - } - ctxt->includes[2 * ctxt->nbIncludes] = cur; - ctxt->includes[2 * ctxt->nbIncludes + 1] = (xmlNodePtr) doc; - ctxt->nbIncludes++; -} -#endif - -/** - * xmlSchematronPopInclude: - * @ctxt: the schema parser context - * - * Pop an include level. The included document is being freed - * - * Returns the node immediately following the include or NULL if the - * include list was empty. - */ -static xmlNodePtr -xmlSchematronPopInclude(xmlSchematronParserCtxtPtr ctxt) -{ - xmlDocPtr doc; - xmlNodePtr ret; - - if (ctxt->nbIncludes <= 0) - return(NULL); - ctxt->nbIncludes--; - doc = (xmlDocPtr) ctxt->includes[2 * ctxt->nbIncludes + 1]; - ret = ctxt->includes[2 * ctxt->nbIncludes]; - xmlFreeDoc(doc); - if (ret != NULL) - ret = ret->next; - if (ret == NULL) - return(xmlSchematronPopInclude(ctxt)); - return(ret); -} - -/** - * xmlSchematronAddNamespace: - * @ctxt: the schema parser context - * @prefix: the namespace prefix - * @ns: the namespace name - * - * Add a namespace definition in the context - */ -static void -xmlSchematronAddNamespace(xmlSchematronParserCtxtPtr ctxt, - const xmlChar *prefix, const xmlChar *ns) -{ - if (ctxt->namespaces == NULL) { - ctxt->maxNamespaces = 10; - ctxt->namespaces = (const xmlChar **) - xmlMalloc(ctxt->maxNamespaces * 2 * sizeof(const xmlChar *)); - if (ctxt->namespaces == NULL) { - xmlSchematronPErrMemory(NULL, "allocating parser namespaces", - NULL); - return; - } - ctxt->nbNamespaces = 0; - } else if (ctxt->nbNamespaces + 2 >= ctxt->maxNamespaces) { - const xmlChar **tmp; - - tmp = (const xmlChar **) - xmlRealloc((xmlChar **) ctxt->namespaces, ctxt->maxNamespaces * 4 * - sizeof(const xmlChar *)); - if (tmp == NULL) { - xmlSchematronPErrMemory(NULL, "allocating parser namespaces", - NULL); - return; - } - ctxt->namespaces = tmp; - ctxt->maxNamespaces *= 2; - } - ctxt->namespaces[2 * ctxt->nbNamespaces] = - xmlDictLookup(ctxt->dict, ns, -1); - ctxt->namespaces[2 * ctxt->nbNamespaces + 1] = - xmlDictLookup(ctxt->dict, prefix, -1); - ctxt->nbNamespaces++; - ctxt->namespaces[2 * ctxt->nbNamespaces] = NULL; - ctxt->namespaces[2 * ctxt->nbNamespaces + 1] = NULL; - -} - -/** - * xmlSchematronParseRule: - * @ctxt: a schema validation context - * @rule: the rule node - * - * parse a rule element - */ -static void -xmlSchematronParseRule(xmlSchematronParserCtxtPtr ctxt, - xmlSchematronPatternPtr pattern, - xmlNodePtr rule) -{ - xmlNodePtr cur; - int nbChecks = 0; - xmlChar *test; - xmlChar *context; - xmlChar *report; - xmlSchematronRulePtr ruleptr; - xmlSchematronTestPtr testptr; - - if ((ctxt == NULL) || (rule == NULL)) return; - - context = xmlGetNoNsProp(rule, BAD_CAST "context"); - if (context == NULL) { - xmlSchematronPErr(ctxt, rule, - XML_SCHEMAP_NOROOT, - "rule has no context attribute", - NULL, NULL); - return; - } else if (context[0] == 0) { - xmlSchematronPErr(ctxt, rule, - XML_SCHEMAP_NOROOT, - "rule has an empty context attribute", - NULL, NULL); - xmlFree(context); - return; - } else { - ruleptr = xmlSchematronAddRule(ctxt, ctxt->schema, pattern, - rule, context, NULL); - if (ruleptr == NULL) { - xmlFree(context); - return; - } - } - - cur = rule->children; - NEXT_SCHEMATRON(cur); - while (cur != NULL) { - if (IS_SCHEMATRON(cur, "assert")) { - nbChecks++; - test = xmlGetNoNsProp(cur, BAD_CAST "test"); - if (test == NULL) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "assert has no test attribute", - NULL, NULL); - } else if (test[0] == 0) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "assert has an empty test attribute", - NULL, NULL); - xmlFree(test); - } else { - /* TODO will need dynamic processing instead */ - report = xmlNodeGetContent(cur); - - testptr = xmlSchematronAddTest(ctxt, XML_SCHEMATRON_ASSERT, - ruleptr, cur, test, report); - if (testptr == NULL) - xmlFree(test); - } - } else if (IS_SCHEMATRON(cur, "report")) { - nbChecks++; - test = xmlGetNoNsProp(cur, BAD_CAST "test"); - if (test == NULL) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "assert has no test attribute", - NULL, NULL); - } else if (test[0] == 0) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "assert has an empty test attribute", - NULL, NULL); - xmlFree(test); - } else { - /* TODO will need dynamic processing instead */ - report = xmlNodeGetContent(cur); - - testptr = xmlSchematronAddTest(ctxt, XML_SCHEMATRON_REPORT, - ruleptr, cur, test, report); - if (testptr == NULL) - xmlFree(test); - } - } else { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "Expecting an assert or a report element instead of %s", - cur->name, NULL); - } - cur = cur->next; - NEXT_SCHEMATRON(cur); - } - if (nbChecks == 0) { - xmlSchematronPErr(ctxt, rule, - XML_SCHEMAP_NOROOT, - "rule has no assert nor report element", NULL, NULL); - } -} - -/** - * xmlSchematronParsePattern: - * @ctxt: a schema validation context - * @pat: the pattern node - * - * parse a pattern element - */ -static void -xmlSchematronParsePattern(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr pat) -{ - xmlNodePtr cur; - xmlSchematronPatternPtr pattern; - int nbRules = 0; - xmlChar *id; - - if ((ctxt == NULL) || (pat == NULL)) return; - - id = xmlGetNoNsProp(pat, BAD_CAST "id"); - if (id == NULL) { - id = xmlGetNoNsProp(pat, BAD_CAST "name"); - } - pattern = xmlSchematronAddPattern(ctxt, ctxt->schema, pat, id); - if (pattern == NULL) { - if (id != NULL) - xmlFree(id); - return; - } - cur = pat->children; - NEXT_SCHEMATRON(cur); - while (cur != NULL) { - if (IS_SCHEMATRON(cur, "rule")) { - xmlSchematronParseRule(ctxt, pattern, cur); - nbRules++; - } else { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "Expecting a rule element instead of %s", cur->name, NULL); - } - cur = cur->next; - NEXT_SCHEMATRON(cur); - } - if (nbRules == 0) { - xmlSchematronPErr(ctxt, pat, - XML_SCHEMAP_NOROOT, - "Pattern has no rule element", NULL, NULL); - } -} - -#if 0 -/** - * xmlSchematronLoadInclude: - * @ctxt: a schema validation context - * @cur: the include element - * - * Load the include document, Push the current pointer - * - * Returns the updated node pointer - */ -static xmlNodePtr -xmlSchematronLoadInclude(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr cur) -{ - xmlNodePtr ret = NULL; - xmlDocPtr doc = NULL; - xmlChar *href = NULL; - xmlChar *base = NULL; - xmlChar *URI = NULL; - - if ((ctxt == NULL) || (cur == NULL)) - return(NULL); - - href = xmlGetNoNsProp(cur, BAD_CAST "href"); - if (href == NULL) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "Include has no href attribute", NULL, NULL); - return(cur->next); - } - - /* do the URI base composition, load and find the root */ - base = xmlNodeGetBase(cur->doc, cur); - URI = xmlBuildURI(href, base); - doc = xmlReadFile((const char *) URI, NULL, SCHEMATRON_PARSE_OPTIONS); - if (doc == NULL) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_FAILED_LOAD, - "could not load include '%s'.\n", - URI, NULL); - goto done; - } - ret = xmlDocGetRootElement(doc); - if (ret == NULL) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_FAILED_LOAD, - "could not find root from include '%s'.\n", - URI, NULL); - goto done; - } - - /* Success, push the include for rollback on exit */ - xmlSchematronPushInclude(ctxt, doc, cur); - -done: - if (ret == NULL) { - if (doc != NULL) - xmlFreeDoc(doc); - } - xmlFree(href); - if (base != NULL) - xmlFree(base); - if (URI != NULL) - xmlFree(URI); - return(ret); -} -#endif - -/** - * xmlSchematronParse: - * @ctxt: a schema validation context - * - * parse a schema definition resource and build an internal - * XML Shema struture which can be used to validate instances. - * - * Returns the internal XML Schematron structure built from the resource or - * NULL in case of error - */ -xmlSchematronPtr -xmlSchematronParse(xmlSchematronParserCtxtPtr ctxt) -{ - xmlSchematronPtr ret = NULL; - xmlDocPtr doc; - xmlNodePtr root, cur; - int preserve = 0; - - if (ctxt == NULL) - return (NULL); - - ctxt->nberrors = 0; - - /* - * First step is to parse the input document into an DOM/Infoset - */ - if (ctxt->URL != NULL) { - doc = xmlReadFile((const char *) ctxt->URL, NULL, - SCHEMATRON_PARSE_OPTIONS); - if (doc == NULL) { - xmlSchematronPErr(ctxt, NULL, - XML_SCHEMAP_FAILED_LOAD, - "xmlSchematronParse: could not load '%s'.\n", - ctxt->URL, NULL); - return (NULL); - } - ctxt->preserve = 0; - } else if (ctxt->buffer != NULL) { - doc = xmlReadMemory(ctxt->buffer, ctxt->size, NULL, NULL, - SCHEMATRON_PARSE_OPTIONS); - if (doc == NULL) { - xmlSchematronPErr(ctxt, NULL, - XML_SCHEMAP_FAILED_PARSE, - "xmlSchematronParse: could not parse.\n", - NULL, NULL); - return (NULL); - } - doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); - ctxt->URL = xmlDictLookup(ctxt->dict, BAD_CAST "in_memory_buffer", -1); - ctxt->preserve = 0; - } else if (ctxt->doc != NULL) { - doc = ctxt->doc; - preserve = 1; - ctxt->preserve = 1; - } else { - xmlSchematronPErr(ctxt, NULL, - XML_SCHEMAP_NOTHING_TO_PARSE, - "xmlSchematronParse: could not parse.\n", - NULL, NULL); - return (NULL); - } - - /* - * Then extract the root and Schematron parse it - */ - root = xmlDocGetRootElement(doc); - if (root == NULL) { - xmlSchematronPErr(ctxt, (xmlNodePtr) doc, - XML_SCHEMAP_NOROOT, - "The schema has no document element.\n", NULL, NULL); - if (!preserve) { - xmlFreeDoc(doc); - } - return (NULL); - } - - if (!IS_SCHEMATRON(root, "schema")) { - xmlSchematronPErr(ctxt, root, - XML_SCHEMAP_NOROOT, - "The XML document '%s' is not a XML schematron document", - ctxt->URL, NULL); - goto exit; - } - ret = xmlSchematronNewSchematron(ctxt); - if (ret == NULL) - goto exit; - ctxt->schema = ret; - - /* - * scan the schema elements - */ - cur = root->children; - NEXT_SCHEMATRON(cur); - if (IS_SCHEMATRON(cur, "title")) { - xmlChar *title = xmlNodeGetContent(cur); - if (title != NULL) { - ret->title = xmlDictLookup(ret->dict, title, -1); - xmlFree(title); - } - cur = cur->next; - NEXT_SCHEMATRON(cur); - } - while (IS_SCHEMATRON(cur, "ns")) { - xmlChar *prefix = xmlGetNoNsProp(cur, BAD_CAST "prefix"); - xmlChar *uri = xmlGetNoNsProp(cur, BAD_CAST "uri"); - if ((uri == NULL) || (uri[0] == 0)) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "ns element has no uri", NULL, NULL); - } - if ((prefix == NULL) || (prefix[0] == 0)) { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "ns element has no prefix", NULL, NULL); - } - if ((prefix) && (uri)) { - xmlXPathRegisterNs(ctxt->xctxt, prefix, uri); - xmlSchematronAddNamespace(ctxt, prefix, uri); - ret->nbNs++; - } - if (uri) - xmlFree(uri); - if (prefix) - xmlFree(prefix); - cur = cur->next; - NEXT_SCHEMATRON(cur); - } - while (cur != NULL) { - if (IS_SCHEMATRON(cur, "pattern")) { - xmlSchematronParsePattern(ctxt, cur); - ret->nbPattern++; - } else { - xmlSchematronPErr(ctxt, cur, - XML_SCHEMAP_NOROOT, - "Expecting a pattern element instead of %s", cur->name, NULL); - } - cur = cur->next; - NEXT_SCHEMATRON(cur); - } - if (ret->nbPattern == 0) { - xmlSchematronPErr(ctxt, root, - XML_SCHEMAP_NOROOT, - "The schematron document '%s' has no pattern", - ctxt->URL, NULL); - goto exit; - } - /* the original document must be kept for reporting */ - ret->doc = doc; - preserve = 1; - -exit: - if (!preserve) { - xmlFreeDoc(doc); - } - if (ret != NULL) { - if (ctxt->nberrors != 0) { - xmlSchematronFree(ret); - ret = NULL; - } else { - ret->namespaces = ctxt->namespaces; - ret->nbNamespaces = ctxt->nbNamespaces; - ctxt->namespaces = NULL; - } - } - return (ret); -} - -/************************************************************************ - * * - * Schematrontron Reports handler * - * * - ************************************************************************/ - -static xmlNodePtr -xmlSchematronGetNode(xmlSchematronValidCtxtPtr ctxt, - xmlNodePtr cur, const xmlChar *xpath) { - xmlNodePtr node = NULL; - xmlXPathObjectPtr ret; - - if ((ctxt == NULL) || (cur == NULL) || (xpath == NULL)) - return(NULL); - - ctxt->xctxt->doc = cur->doc; - ctxt->xctxt->node = cur; - ret = xmlXPathEval(xpath, ctxt->xctxt); - if (ret == NULL) - return(NULL); - - if ((ret->type == XPATH_NODESET) && - (ret->nodesetval != NULL) && (ret->nodesetval->nodeNr > 0)) - node = ret->nodesetval->nodeTab[0]; - - xmlXPathFreeObject(ret); - return(node); -} - -/** - * xmlSchematronReportOutput: - * @ctxt: the validation context - * @cur: the current node tested - * @msg: the message output - * - * Output part of the report to whatever channel the user selected - */ -static void -xmlSchematronReportOutput(xmlSchematronValidCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlNodePtr cur ATTRIBUTE_UNUSED, - const char *msg) { - /* TODO */ - fprintf(stderr, "%s", msg); -} - -/** - * xmlSchematronFormatReport: - * @ctxt: the validation context - * @test: the test node - * @cur: the current node tested - * - * Build the string being reported to the user. - * - * Returns a report string or NULL in case of error. The string needs - * to be deallocated by the caller - */ -static xmlChar * -xmlSchematronFormatReport(xmlSchematronValidCtxtPtr ctxt, - xmlNodePtr test, xmlNodePtr cur) { - xmlChar *ret = NULL; - xmlNodePtr child, node; - - if ((test == NULL) || (cur == NULL)) - return(ret); - - child = test->children; - while (child != NULL) { - if ((child->type == XML_TEXT_NODE) || - (child->type == XML_CDATA_SECTION_NODE)) - ret = xmlStrcat(ret, child->content); - else if (IS_SCHEMATRON(child, "name")) { - xmlChar *path; - - path = xmlGetNoNsProp(child, BAD_CAST "path"); - - node = cur; - if (path != NULL) { - node = xmlSchematronGetNode(ctxt, cur, path); - if (node == NULL) - node = cur; - xmlFree(path); - } - - if ((node->ns == NULL) || (node->ns->prefix == NULL)) - ret = xmlStrcat(ret, node->name); - else { - ret = xmlStrcat(ret, node->ns->prefix); - ret = xmlStrcat(ret, BAD_CAST ":"); - ret = xmlStrcat(ret, node->name); - } - } else { - child = child->next; - continue; - } - - /* - * remove superfluous \n - */ - if (ret != NULL) { - int len = xmlStrlen(ret); - xmlChar c; - - if (len > 0) { - c = ret[len - 1]; - if ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) { - while ((c == ' ') || (c == '\n') || - (c == '\r') || (c == '\t')) { - len--; - if (len == 0) - break; - c = ret[len - 1]; - } - ret[len] = ' '; - ret[len + 1] = 0; - } - } - } - - child = child->next; - } - return(ret); -} - -/** - * xmlSchematronReportSuccess: - * @ctxt: the validation context - * @test: the compiled test - * @cur: the current node tested - * @success: boolean value for the result - * - * called from the validation engine when an assert or report test have - * been done. - */ -static void -xmlSchematronReportSuccess(xmlSchematronValidCtxtPtr ctxt, - xmlSchematronTestPtr test, xmlNodePtr cur, int success) { - if ((ctxt == NULL) || (cur == NULL) || (test == NULL)) - return; - /* if quiet and not SVRL report only failures */ - if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) && - ((ctxt->flags & XML_SCHEMATRON_OUT_XML) == 0) && - (test->type == XML_SCHEMATRON_REPORT)) - return; - if (ctxt->flags & XML_SCHEMATRON_OUT_XML) { - TODO - } else { - xmlChar *path; - char msg[1000]; - long line; - const xmlChar *report = NULL; - - if (((test->type == XML_SCHEMATRON_REPORT) & (!success)) || - ((test->type == XML_SCHEMATRON_ASSERT) & (success))) - return; - line = xmlGetLineNo(cur); - path = xmlGetNodePath(cur); - if (path == NULL) - path = (xmlChar *) cur->name; -#if 0 - if ((test->report != NULL) && (test->report[0] != 0)) - report = test->report; -#endif - if (test->node != NULL) - report = xmlSchematronFormatReport(ctxt, test->node, cur); - if (report == NULL) { - if (test->type == XML_SCHEMATRON_ASSERT) { - snprintf(msg, 999, "%s line %ld: node failed assert\n", - (const char *) path, line); - } else { - snprintf(msg, 999, "%s line %ld: node failed report\n", - (const char *) path, line); - } - } else { - snprintf(msg, 999, "%s line %ld: %s\n", (const char *) path, - line, (const char *) report); - xmlFree((char *) report); - } - xmlSchematronReportOutput(ctxt, cur, &msg[0]); - if ((path != NULL) && (path != (xmlChar *) cur->name)) - xmlFree(path); - } -} - -/** - * xmlSchematronReportPattern: - * @ctxt: the validation context - * @pattern: the current pattern - * - * called from the validation engine when starting to check a pattern - */ -static void -xmlSchematronReportPattern(xmlSchematronValidCtxtPtr ctxt, - xmlSchematronPatternPtr pattern) { - if ((ctxt == NULL) || (pattern == NULL)) - return; - if (ctxt->flags & XML_SCHEMATRON_OUT_QUIET) - return; - if (ctxt->flags & XML_SCHEMATRON_OUT_XML) { - TODO - } else { - char msg[1000]; - - if (pattern->name == NULL) - return; - snprintf(msg, 999, "Pattern: %s\n", (const char *) pattern->name); - xmlSchematronReportOutput(ctxt, NULL, &msg[0]); - } -} - - -/************************************************************************ - * * - * Validation against a Schematrontron * - * * - ************************************************************************/ - -/** - * xmlSchematronNewValidCtxt: - * @schema: a precompiled XML Schematrons - * @options: a set of xmlSchematronValidOptions - * - * Create an XML Schematrons validation context based on the given schema. - * - * Returns the validation context or NULL in case of error - */ -xmlSchematronValidCtxtPtr -xmlSchematronNewValidCtxt(xmlSchematronPtr schema, int options) -{ - int i; - xmlSchematronValidCtxtPtr ret; - - ret = (xmlSchematronValidCtxtPtr) xmlMalloc(sizeof(xmlSchematronValidCtxt)); - if (ret == NULL) { - xmlSchematronVErrMemory(NULL, "allocating validation context", - NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchematronValidCtxt)); - ret->type = XML_STRON_CTXT_VALIDATOR; - ret->schema = schema; - ret->xctxt = xmlXPathNewContext(NULL); - ret->flags = options; - if (ret->xctxt == NULL) { - xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", - NULL); - xmlSchematronFreeValidCtxt(ret); - return (NULL); - } - for (i = 0;i < schema->nbNamespaces;i++) { - if ((schema->namespaces[2 * i] == NULL) || - (schema->namespaces[2 * i + 1] == NULL)) - break; - xmlXPathRegisterNs(ret->xctxt, schema->namespaces[2 * i + 1], - schema->namespaces[2 * i]); - } - return (ret); -} - -/** - * xmlSchematronFreeValidCtxt: - * @ctxt: the schema validation context - * - * Free the resources associated to the schema validation context - */ -void -xmlSchematronFreeValidCtxt(xmlSchematronValidCtxtPtr ctxt) -{ - if (ctxt == NULL) - return; - if (ctxt->xctxt != NULL) - xmlXPathFreeContext(ctxt->xctxt); - if (ctxt->dict != NULL) - xmlDictFree(ctxt->dict); - xmlFree(ctxt); -} - -static xmlNodePtr -xmlSchematronNextNode(xmlNodePtr cur) { - if (cur->children != NULL) { - /* - * Do not descend on entities declarations - */ - if (cur->children->type != XML_ENTITY_DECL) { - cur = cur->children; - /* - * Skip DTDs - */ - if (cur->type != XML_DTD_NODE) - return(cur); - } - } - - while (cur->next != NULL) { - cur = cur->next; - if ((cur->type != XML_ENTITY_DECL) && - (cur->type != XML_DTD_NODE)) - return(cur); - } - - do { - cur = cur->parent; - if (cur == NULL) break; - if (cur->type == XML_DOCUMENT_NODE) return(NULL); - if (cur->next != NULL) { - cur = cur->next; - return(cur); - } - } while (cur != NULL); - return(cur); -} - -/** - * xmlSchematronRunTest: - * @ctxt: the schema validation context - * @test: the current test - * @instance: the document instace tree - * @cur: the current node in the instance - * - * Validate a rule against a tree instance at a given position - * - * Returns 1 in case of success, 0 if error and -1 in case of internal error - */ -static int -xmlSchematronRunTest(xmlSchematronValidCtxtPtr ctxt, - xmlSchematronTestPtr test, xmlDocPtr instance, xmlNodePtr cur) -{ - xmlXPathObjectPtr ret; - int failed; - - failed = 0; - ctxt->xctxt->doc = instance; - ctxt->xctxt->node = cur; - ret = xmlXPathCompiledEval(test->comp, ctxt->xctxt); - if (ret == NULL) { - failed = 1; - } else { - switch (ret->type) { - case XPATH_XSLT_TREE: - case XPATH_NODESET: - if ((ret->nodesetval == NULL) || - (ret->nodesetval->nodeNr == 0)) - failed = 1; - break; - case XPATH_BOOLEAN: - failed = !ret->boolval; - break; - case XPATH_NUMBER: - if ((xmlXPathIsNaN(ret->floatval)) || - (ret->floatval == 0.0)) - failed = 1; - break; - case XPATH_STRING: - if ((ret->stringval == NULL) || - (ret->stringval[0] == 0)) - failed = 1; - break; - case XPATH_UNDEFINED: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - case XPATH_USERS: - failed = 1; - break; - } - xmlXPathFreeObject(ret); - } - if ((failed) && (test->type == XML_SCHEMATRON_ASSERT)) - ctxt->nberrors++; - else if ((!failed) && (test->type == XML_SCHEMATRON_REPORT)) - ctxt->nberrors++; - - xmlSchematronReportSuccess(ctxt, test, cur, !failed); - - return(!failed); -} - -/** - * xmlSchematronValidateDoc: - * @ctxt: the schema validation context - * @instance: the document instace tree - * - * Validate a tree instance against the schematron - * - * Returns 0 in case of success, -1 in case of internal error - * and an error count otherwise. - */ -int -xmlSchematronValidateDoc(xmlSchematronValidCtxtPtr ctxt, xmlDocPtr instance) -{ - xmlNodePtr cur, root; - xmlSchematronPatternPtr pattern; - xmlSchematronRulePtr rule; - xmlSchematronTestPtr test; - - if ((ctxt == NULL) || (ctxt->schema == NULL) || - (ctxt->schema->rules == NULL) || (instance == NULL)) - return(-1); - ctxt->nberrors = 0; - root = xmlDocGetRootElement(instance); - if (root == NULL) { - TODO - ctxt->nberrors++; - return(1); - } - if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) || - (ctxt->flags == 0)) { - /* - * we are just trying to assert the validity of the document, - * speed primes over the output, run in a single pass - */ - cur = root; - while (cur != NULL) { - rule = ctxt->schema->rules; - while (rule != NULL) { - if (xmlPatternMatch(rule->pattern, cur) == 1) { - test = rule->tests; - while (test != NULL) { - xmlSchematronRunTest(ctxt, test, instance, cur); - test = test->next; - } - } - rule = rule->next; - } - - cur = xmlSchematronNextNode(cur); - } - } else { - /* - * Process all contexts one at a time - */ - pattern = ctxt->schema->patterns; - - while (pattern != NULL) { - xmlSchematronReportPattern(ctxt, pattern); - - /* - * TODO convert the pattern rule to a direct XPath and - * compute directly instead of using the pattern matching - * over the full document... - * Check the exact semantic - */ - cur = root; - while (cur != NULL) { - rule = pattern->rules; - while (rule != NULL) { - if (xmlPatternMatch(rule->pattern, cur) == 1) { - test = rule->tests; - while (test != NULL) { - xmlSchematronRunTest(ctxt, test, instance, cur); - test = test->next; - } - } - rule = rule->patnext; - } - - cur = xmlSchematronNextNode(cur); - } - pattern = pattern->next; - } - } - return(ctxt->nberrors); -} - -#ifdef STANDALONE -int -main(void) -{ - int ret; - xmlDocPtr instance; - xmlSchematronParserCtxtPtr pctxt; - xmlSchematronValidCtxtPtr vctxt; - xmlSchematronPtr schema = NULL; - - pctxt = xmlSchematronNewParserCtxt("tst.sct"); - if (pctxt == NULL) { - fprintf(stderr, "failed to build schematron parser\n"); - } else { - schema = xmlSchematronParse(pctxt); - if (schema == NULL) { - fprintf(stderr, "failed to compile schematron\n"); - } - xmlSchematronFreeParserCtxt(pctxt); - } - instance = xmlReadFile("tst.sct", NULL, - XML_PARSE_NOENT | XML_PARSE_NOCDATA); - if (instance == NULL) { - fprintf(stderr, "failed to parse instance\n"); - } - if ((schema != NULL) && (instance != NULL)) { - vctxt = xmlSchematronNewValidCtxt(schema); - if (vctxt == NULL) { - fprintf(stderr, "failed to build schematron validator\n"); - } else { - ret = xmlSchematronValidateDoc(vctxt, instance); - xmlSchematronFreeValidCtxt(vctxt); - } - } - xmlSchematronFree(schema); - xmlFreeDoc(instance); - - xmlCleanupParser(); - xmlMemoryDump(); - - return (0); -} -#endif -#define bottom_schematron -#include "elfgcchack.h" -#endif /* LIBXML_SCHEMATRON_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/threads.c b/ThirdParty/libxml2/vtklibxml2/threads.c deleted file mode 100644 index ca4d936a6c6..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/threads.c +++ /dev/null @@ -1,867 +0,0 @@ -/** - * threads.c: set of generic threading related routines - * - * See Copyright for the status of this software. - * - * Gary Pennington <Gary.Pennington@uk.sun.com> - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> - -#include <libxml/threads.h> -#include <libxml/globals.h> - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_PTHREAD_H -#include <pthread.h> -#endif - -#ifdef HAVE_WIN32_THREADS -#include <windows.h> -#ifndef HAVE_COMPILER_TLS -#include <process.h> -#endif -#endif - -#ifdef HAVE_BEOS_THREADS -#include <OS.h> -#include <TLS.h> -#endif - -#if defined(SOLARIS) -#include <note.h> -#endif - -/* #define DEBUG_THREADS */ - -#ifdef HAVE_PTHREAD_H - -static int libxml_is_threaded = -1; -#ifdef __GNUC__ -#ifdef linux -#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) -extern int pthread_once (pthread_once_t *__once_control, - void (*__init_routine) (void)) - __attribute((weak)); -extern void *pthread_getspecific (pthread_key_t __key) - __attribute((weak)); -extern int pthread_setspecific (pthread_key_t __key, - __const void *__pointer) - __attribute((weak)); -extern int pthread_key_create (pthread_key_t *__key, - void (*__destr_function) (void *)) - __attribute((weak)); -extern int pthread_mutex_init () - __attribute((weak)); -extern int pthread_mutex_destroy () - __attribute((weak)); -extern int pthread_mutex_lock () - __attribute((weak)); -extern int pthread_mutex_unlock () - __attribute((weak)); -extern int pthread_cond_init () - __attribute((weak)); -extern int pthread_equal () - __attribute((weak)); -extern pthread_t pthread_self () - __attribute((weak)); -extern int pthread_key_create () - __attribute((weak)); -extern int pthread_cond_signal () - __attribute((weak)); -#endif -#endif /* linux */ -#endif /* __GNUC__ */ -#endif /* HAVE_PTHREAD_H */ - -/* - * TODO: this module still uses malloc/free and not xmlMalloc/xmlFree - * to avoid some crazyness since xmlMalloc/xmlFree may actually - * be hosted on allocated blocks needing them for the allocation ... - */ - -/* - * xmlMutex are a simple mutual exception locks - */ -struct _xmlMutex { -#ifdef HAVE_PTHREAD_H - pthread_mutex_t lock; -#elif defined HAVE_WIN32_THREADS - HANDLE mutex; -#elif defined HAVE_BEOS_THREADS - sem_id sem; - thread_id tid; -#else - int empty; -#endif -}; - -/* - * xmlRMutex are reentrant mutual exception locks - */ -struct _xmlRMutex { -#ifdef HAVE_PTHREAD_H - pthread_mutex_t lock; - unsigned int held; - unsigned int waiters; - pthread_t tid; - pthread_cond_t cv; -#elif defined HAVE_WIN32_THREADS - CRITICAL_SECTION cs; - unsigned int count; -#elif defined HAVE_BEOS_THREADS - xmlMutexPtr lock; - thread_id tid; - int32 count; -#else - int empty; -#endif -}; -/* - * This module still has some internal static data. - * - xmlLibraryLock a global lock - * - globalkey used for per-thread data - */ - -#ifdef HAVE_PTHREAD_H -static pthread_key_t globalkey; -static pthread_t mainthread; -static pthread_once_t once_control = PTHREAD_ONCE_INIT; -#elif defined HAVE_WIN32_THREADS -#if defined(HAVE_COMPILER_TLS) -static __declspec(thread) xmlGlobalState tlstate; -static __declspec(thread) int tlstate_inited = 0; -#else /* HAVE_COMPILER_TLS */ -static DWORD globalkey = TLS_OUT_OF_INDEXES; -#endif /* HAVE_COMPILER_TLS */ -static DWORD mainthread; -static struct -{ - DWORD done; - DWORD control; -} run_once = { 0, 0 }; -/* endif HAVE_WIN32_THREADS */ -#elif defined HAVE_BEOS_THREADS -int32 globalkey = 0; -thread_id mainthread = 0; -int32 run_once_init = 0; -#endif - -static xmlRMutexPtr xmlLibraryLock = NULL; -#ifdef LIBXML_THREAD_ENABLED -static void xmlOnceInit(void); -#endif - -/** - * xmlNewMutex: - * - * xmlNewMutex() is used to allocate a libxml2 token struct for use in - * synchronizing access to data. - * - * Returns a new simple mutex pointer or NULL in case of error - */ -xmlMutexPtr -xmlNewMutex(void) -{ - xmlMutexPtr tok; - - if ((tok = malloc(sizeof(xmlMutex))) == NULL) - return (NULL); -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded != 0) - pthread_mutex_init(&tok->lock, NULL); -#elif defined HAVE_WIN32_THREADS - tok->mutex = CreateMutex(NULL, FALSE, NULL); -#elif defined HAVE_BEOS_THREADS - if ((tok->sem = create_sem(1, "xmlMutex")) < B_OK) { - free(tok); - return NULL; - } - tok->tid = -1; -#endif - return (tok); -} - -/** - * xmlFreeMutex: - * @tok: the simple mutex - * - * xmlFreeMutex() is used to reclaim resources associated with a libxml2 token - * struct. - */ -void -xmlFreeMutex(xmlMutexPtr tok) -{ - if (tok == NULL) return; - -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded != 0) - pthread_mutex_destroy(&tok->lock); -#elif defined HAVE_WIN32_THREADS - CloseHandle(tok->mutex); -#elif defined HAVE_BEOS_THREADS - delete_sem(tok->sem); -#endif - free(tok); -} - -/** - * xmlMutexLock: - * @tok: the simple mutex - * - * xmlMutexLock() is used to lock a libxml2 token. - */ -void -xmlMutexLock(xmlMutexPtr tok) -{ - if (tok == NULL) - return; -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded != 0) - pthread_mutex_lock(&tok->lock); -#elif defined HAVE_WIN32_THREADS - WaitForSingleObject(tok->mutex, INFINITE); -#elif defined HAVE_BEOS_THREADS - if (acquire_sem(tok->sem) != B_NO_ERROR) { -#ifdef DEBUG_THREADS - xmlGenericError(xmlGenericErrorContext, "xmlMutexLock():BeOS:Couldn't aquire semaphore\n"); - exit(); -#endif - } - tok->tid = find_thread(NULL); -#endif - -} - -/** - * xmlMutexUnlock: - * @tok: the simple mutex - * - * xmlMutexUnlock() is used to unlock a libxml2 token. - */ -void -xmlMutexUnlock(xmlMutexPtr tok) -{ - if (tok == NULL) - return; -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded != 0) - pthread_mutex_unlock(&tok->lock); -#elif defined HAVE_WIN32_THREADS - ReleaseMutex(tok->mutex); -#elif defined HAVE_BEOS_THREADS - if (tok->tid == find_thread(NULL)) { - tok->tid = -1; - release_sem(tok->sem); - } -#endif -} - -/** - * xmlNewRMutex: - * - * xmlRNewMutex() is used to allocate a reentrant mutex for use in - * synchronizing access to data. token_r is a re-entrant lock and thus useful - * for synchronizing access to data structures that may be manipulated in a - * recursive fashion. - * - * Returns the new reentrant mutex pointer or NULL in case of error - */ -xmlRMutexPtr -xmlNewRMutex(void) -{ - xmlRMutexPtr tok; - - if ((tok = malloc(sizeof(xmlRMutex))) == NULL) - return (NULL); -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded != 0) { - pthread_mutex_init(&tok->lock, NULL); - tok->held = 0; - tok->waiters = 0; - pthread_cond_init(&tok->cv, NULL); - } -#elif defined HAVE_WIN32_THREADS - InitializeCriticalSection(&tok->cs); - tok->count = 0; -#elif defined HAVE_BEOS_THREADS - if ((tok->lock = xmlNewMutex()) == NULL) { - free(tok); - return NULL; - } - tok->count = 0; -#endif - return (tok); -} - -/** - * xmlFreeRMutex: - * @tok: the reentrant mutex - * - * xmlRFreeMutex() is used to reclaim resources associated with a - * reentrant mutex. - */ -void -xmlFreeRMutex(xmlRMutexPtr tok ATTRIBUTE_UNUSED) -{ - if (tok == NULL) - return; -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded != 0) { - pthread_mutex_destroy(&tok->lock); - pthread_cond_destroy(&tok->cv); - } -#elif defined HAVE_WIN32_THREADS - DeleteCriticalSection(&tok->cs); -#elif defined HAVE_BEOS_THREADS - xmlFreeMutex(tok->lock); -#endif - free(tok); -} - -/** - * xmlRMutexLock: - * @tok: the reentrant mutex - * - * xmlRMutexLock() is used to lock a libxml2 token_r. - */ -void -xmlRMutexLock(xmlRMutexPtr tok) -{ - if (tok == NULL) - return; -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded == 0) - return; - - pthread_mutex_lock(&tok->lock); - if (tok->held) { - if (pthread_equal(tok->tid, pthread_self())) { - tok->held++; - pthread_mutex_unlock(&tok->lock); - return; - } else { - tok->waiters++; - while (tok->held) - pthread_cond_wait(&tok->cv, &tok->lock); - tok->waiters--; - } - } - tok->tid = pthread_self(); - tok->held = 1; - pthread_mutex_unlock(&tok->lock); -#elif defined HAVE_WIN32_THREADS - EnterCriticalSection(&tok->cs); - ++tok->count; -#elif defined HAVE_BEOS_THREADS - if (tok->lock->tid == find_thread(NULL)) { - tok->count++; - return; - } else { - xmlMutexLock(tok->lock); - tok->count = 1; - } -#endif -} - -/** - * xmlRMutexUnlock: - * @tok: the reentrant mutex - * - * xmlRMutexUnlock() is used to unlock a libxml2 token_r. - */ -void -xmlRMutexUnlock(xmlRMutexPtr tok ATTRIBUTE_UNUSED) -{ - if (tok == NULL) - return; -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded == 0) - return; - - pthread_mutex_lock(&tok->lock); - tok->held--; - if (tok->held == 0) { - if (tok->waiters) - pthread_cond_signal(&tok->cv); - tok->tid = 0; - } - pthread_mutex_unlock(&tok->lock); -#elif defined HAVE_WIN32_THREADS - if (!--tok->count) - LeaveCriticalSection(&tok->cs); -#elif defined HAVE_BEOS_THREADS - if (tok->lock->tid == find_thread(NULL)) { - tok->count--; - if (tok->count == 0) { - xmlMutexUnlock(tok->lock); - } - return; - } -#endif -} - -/************************************************************************ - * * - * Per thread global state handling * - * * - ************************************************************************/ - -#ifdef LIBXML_THREAD_ENABLED -#ifdef xmlLastError -#undef xmlLastError -#endif -/** - * xmlFreeGlobalState: - * @state: a thread global state - * - * xmlFreeGlobalState() is called when a thread terminates with a non-NULL - * global state. It is is used here to reclaim memory resources. - */ -static void -xmlFreeGlobalState(void *state) -{ - xmlGlobalState *gs = (xmlGlobalState *) state; - - /* free any memory allocated in the thread's xmlLastError */ - xmlResetError(&(gs->xmlLastError)); - free(state); -} - -/** - * xmlNewGlobalState: - * - * xmlNewGlobalState() allocates a global state. This structure is used to - * hold all data for use by a thread when supporting backwards compatibility - * of libxml2 to pre-thread-safe behaviour. - * - * Returns the newly allocated xmlGlobalStatePtr or NULL in case of error - */ -static xmlGlobalStatePtr -xmlNewGlobalState(void) -{ - xmlGlobalState *gs; - - gs = malloc(sizeof(xmlGlobalState)); - if (gs == NULL) - return(NULL); - - memset(gs, 0, sizeof(xmlGlobalState)); - xmlInitializeGlobalState(gs); - return (gs); -} -#endif /* LIBXML_THREAD_ENABLED */ - - -#ifdef HAVE_WIN32_THREADS -#if !defined(HAVE_COMPILER_TLS) -#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) -typedef struct _xmlGlobalStateCleanupHelperParams -{ - HANDLE thread; - void *memory; -} xmlGlobalStateCleanupHelperParams; - -static void XMLCDECL xmlGlobalStateCleanupHelper (void *p) -{ - xmlGlobalStateCleanupHelperParams *params = (xmlGlobalStateCleanupHelperParams *) p; - WaitForSingleObject(params->thread, INFINITE); - CloseHandle(params->thread); - xmlFreeGlobalState(params->memory); - free(params); - _endthread(); -} -#else /* LIBXML_STATIC && !LIBXML_STATIC_FOR_DLL */ - -typedef struct _xmlGlobalStateCleanupHelperParams -{ - void *memory; - struct _xmlGlobalStateCleanupHelperParams * prev; - struct _xmlGlobalStateCleanupHelperParams * next; -} xmlGlobalStateCleanupHelperParams; - -static xmlGlobalStateCleanupHelperParams * cleanup_helpers_head = NULL; -static CRITICAL_SECTION cleanup_helpers_cs; - -#endif /* LIBXMLSTATIC && !LIBXML_STATIC_FOR_DLL */ -#endif /* HAVE_COMPILER_TLS */ -#endif /* HAVE_WIN32_THREADS */ - -#if defined HAVE_BEOS_THREADS -/** - * xmlGlobalStateCleanup: - * @data: unused parameter - * - * Used for Beos only - */ -void xmlGlobalStateCleanup(void *data) -{ - void *globalval = tls_get(globalkey); - if (globalval != NULL) - xmlFreeGlobalState(globalval); -} -#endif - -/** - * xmlGetGlobalState: - * - * xmlGetGlobalState() is called to retrieve the global state for a thread. - * - * Returns the thread global state or NULL in case of error - */ -xmlGlobalStatePtr -xmlGetGlobalState(void) -{ -#ifdef HAVE_PTHREAD_H - xmlGlobalState *globalval; - - if (libxml_is_threaded == 0) - return(NULL); - - pthread_once(&once_control, xmlOnceInit); - - if ((globalval = (xmlGlobalState *) - pthread_getspecific(globalkey)) == NULL) { - xmlGlobalState *tsd = xmlNewGlobalState(); - - pthread_setspecific(globalkey, tsd); - return (tsd); - } - return (globalval); -#elif defined HAVE_WIN32_THREADS -#if defined(HAVE_COMPILER_TLS) - if (!tlstate_inited) { - tlstate_inited = 1; - xmlInitializeGlobalState(&tlstate); - } - return &tlstate; -#else /* HAVE_COMPILER_TLS */ - xmlGlobalState *globalval; - xmlGlobalStateCleanupHelperParams * p; - - xmlOnceInit(); -#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) - globalval = (xmlGlobalState *)TlsGetValue(globalkey); -#else - p = (xmlGlobalStateCleanupHelperParams*)TlsGetValue(globalkey); - globalval = (xmlGlobalState *)(p ? p->memory : NULL); -#endif - if (globalval == NULL) { - xmlGlobalState *tsd = xmlNewGlobalState(); - p = (xmlGlobalStateCleanupHelperParams *) malloc(sizeof(xmlGlobalStateCleanupHelperParams)); - p->memory = tsd; -#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) - DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), - GetCurrentProcess(), &p->thread, 0, TRUE, DUPLICATE_SAME_ACCESS); - TlsSetValue(globalkey, tsd); - _beginthread(xmlGlobalStateCleanupHelper, 0, p); -#else - EnterCriticalSection(&cleanup_helpers_cs); - if (cleanup_helpers_head != NULL) { - cleanup_helpers_head->prev = p; - } - p->next = cleanup_helpers_head; - p->prev = NULL; - cleanup_helpers_head = p; - TlsSetValue(globalkey, p); - LeaveCriticalSection(&cleanup_helpers_cs); -#endif - - return (tsd); - } - return (globalval); -#endif /* HAVE_COMPILER_TLS */ -#elif defined HAVE_BEOS_THREADS - xmlGlobalState *globalval; - - xmlOnceInit(); - - if ((globalval = (xmlGlobalState *) - tls_get(globalkey)) == NULL) { - xmlGlobalState *tsd = xmlNewGlobalState(); - - tls_set(globalkey, tsd); - on_exit_thread(xmlGlobalStateCleanup, NULL); - return (tsd); - } - return (globalval); -#else - return(NULL); -#endif -} - -/************************************************************************ - * * - * Library wide thread interfaces * - * * - ************************************************************************/ - -/** - * xmlGetThreadId: - * - * xmlGetThreadId() find the current thread ID number - * - * Returns the current thread ID number - */ -int -xmlGetThreadId(void) -{ -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded == 0) - return(0); - return((int) pthread_self()); -#elif defined HAVE_WIN32_THREADS - return GetCurrentThreadId(); -#elif defined HAVE_BEOS_THREADS - return find_thread(NULL); -#else - return((int) 0); -#endif -} - -/** - * xmlIsMainThread: - * - * xmlIsMainThread() check whether the current thread is the main thread. - * - * Returns 1 if the current thread is the main thread, 0 otherwise - */ -int -xmlIsMainThread(void) -{ -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded == -1) - xmlInitThreads(); - if (libxml_is_threaded == 0) - return(1); - pthread_once(&once_control, xmlOnceInit); -#elif defined HAVE_WIN32_THREADS - xmlOnceInit (); -#elif defined HAVE_BEOS_THREADS - xmlOnceInit(); -#endif - -#ifdef DEBUG_THREADS - xmlGenericError(xmlGenericErrorContext, "xmlIsMainThread()\n"); -#endif -#ifdef HAVE_PTHREAD_H - return(mainthread == pthread_self()); -#elif defined HAVE_WIN32_THREADS - return(mainthread == GetCurrentThreadId ()); -#elif defined HAVE_BEOS_THREADS - return(mainthread == find_thread(NULL)); -#else - return(1); -#endif -} - -/** - * xmlLockLibrary: - * - * xmlLockLibrary() is used to take out a re-entrant lock on the libxml2 - * library. - */ -void -xmlLockLibrary(void) -{ -#ifdef DEBUG_THREADS - xmlGenericError(xmlGenericErrorContext, "xmlLockLibrary()\n"); -#endif - xmlRMutexLock(xmlLibraryLock); -} - -/** - * xmlUnlockLibrary: - * - * xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 - * library. - */ -void -xmlUnlockLibrary(void) -{ -#ifdef DEBUG_THREADS - xmlGenericError(xmlGenericErrorContext, "xmlUnlockLibrary()\n"); -#endif - xmlRMutexUnlock(xmlLibraryLock); -} - -/** - * xmlInitThreads: - * - * xmlInitThreads() is used to to initialize all the thread related - * data of the libxml2 library. - */ -void -xmlInitThreads(void) -{ -#ifdef DEBUG_THREADS - xmlGenericError(xmlGenericErrorContext, "xmlInitThreads()\n"); -#endif -#if defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) - InitializeCriticalSection(&cleanup_helpers_cs); -#endif -#ifdef HAVE_PTHREAD_H - if (libxml_is_threaded == -1) { - if ((pthread_once != NULL) && - (pthread_getspecific != NULL) && - (pthread_setspecific != NULL) && - (pthread_key_create != NULL) && - (pthread_mutex_init != NULL) && - (pthread_mutex_destroy != NULL) && - (pthread_mutex_lock != NULL) && - (pthread_mutex_unlock != NULL) && - (pthread_cond_init != NULL) && - (pthread_equal != NULL) && - (pthread_self != NULL) && - (pthread_key_create != NULL) && - (pthread_cond_signal != NULL)) { - libxml_is_threaded = 1; -/* fprintf(stderr, "Running multithreaded\n"); */ - } else { -/* fprintf(stderr, "Running without multithread\n"); */ - libxml_is_threaded = 0; - } - } -#endif -} - -/** - * xmlCleanupThreads: - * - * xmlCleanupThreads() is used to to cleanup all the thread related - * data of the libxml2 library once processing has ended. - */ -void -xmlCleanupThreads(void) -{ -#ifdef DEBUG_THREADS - xmlGenericError(xmlGenericErrorContext, "xmlCleanupThreads()\n"); -#endif -#if defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) - if (globalkey != TLS_OUT_OF_INDEXES) { - xmlGlobalStateCleanupHelperParams * p; - EnterCriticalSection(&cleanup_helpers_cs); - p = cleanup_helpers_head; - while (p != NULL) { - xmlGlobalStateCleanupHelperParams * temp = p; - p = p->next; - xmlFreeGlobalState(temp->memory); - free(temp); - } - cleanup_helpers_head = 0; - LeaveCriticalSection(&cleanup_helpers_cs); - TlsFree(globalkey); - globalkey = TLS_OUT_OF_INDEXES; - } - DeleteCriticalSection(&cleanup_helpers_cs); -#endif -} - -#ifdef LIBXML_THREAD_ENABLED -/** - * xmlOnceInit - * - * xmlOnceInit() is used to initialize the value of mainthread for use - * in other routines. This function should only be called using - * pthread_once() in association with the once_control variable to ensure - * that the function is only called once. See man pthread_once for more - * details. - */ -static void -xmlOnceInit(void) { -#ifdef HAVE_PTHREAD_H - (void) pthread_key_create(&globalkey, xmlFreeGlobalState); - mainthread = pthread_self(); -#endif - -#if defined(HAVE_WIN32_THREADS) - if (!run_once.done) { - if (InterlockedIncrement(&run_once.control) == 1) - { -#if !defined(HAVE_COMPILER_TLS) - globalkey = TlsAlloc(); -#endif - mainthread = GetCurrentThreadId(); - run_once.done = 1; - } - else { - /* Another thread is working; give up our slice and - * wait until they're done. */ - while (!run_once.done) - Sleep(0); - } - } -#endif - -#ifdef HAVE_BEOS_THREADS - if (atomic_add(&run_once_init, 1) == 0) { - globalkey = tls_allocate(); - tls_set(globalkey, NULL); - mainthread = find_thread(NULL); - } else - atomic_add(&run_once_init, -1); -#endif -} -#endif - -/** - * DllMain: - * @hinstDLL: handle to DLL instance - * @fdwReason: Reason code for entry - * @lpvReserved: generic pointer (depends upon reason code) - * - * Entry point for Windows library. It is being used to free thread-specific - * storage. - * - * Returns TRUE always - */ -#if defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) -#if defined(LIBXML_STATIC_FOR_DLL) -BOOL WINAPI xmlDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -#else -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -#endif -{ - switch(fdwReason) { - case DLL_THREAD_DETACH: - if (globalkey != TLS_OUT_OF_INDEXES) { - xmlGlobalState *globalval = NULL; - xmlGlobalStateCleanupHelperParams * p = - (xmlGlobalStateCleanupHelperParams*)TlsGetValue(globalkey); - globalval = (xmlGlobalState *)(p ? p->memory : NULL); - if (globalval) { - xmlFreeGlobalState(globalval); - TlsSetValue(globalkey,NULL); - } - if (p) - { - EnterCriticalSection(&cleanup_helpers_cs); - if (p == cleanup_helpers_head) - cleanup_helpers_head = p->next; - else - p->prev->next = p->next; - if (p->next != NULL) - p->next->prev = p->prev; - LeaveCriticalSection(&cleanup_helpers_cs); - free(p); - } - } - break; - } - return TRUE; -} -#endif -#define bottom_threads -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/tree.c b/ThirdParty/libxml2/vtklibxml2/tree.c deleted file mode 100644 index 7e0cb93959e..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/tree.c +++ /dev/null @@ -1,9535 +0,0 @@ -/* - * tree.c : implementation of access function for an XML tree. - * - * References: - * XHTML 1.0 W3C REC: http://www.w3.org/TR/2002/REC-xhtml1-20020801/ - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - * - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> /* for memset() only ! */ - -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#include "vtk_libxml2_zlib.h" - -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/uri.h> -#include <libxml/entities.h> -#include <libxml/valid.h> -#include <libxml/xmlerror.h> -#include <libxml/parserInternals.h> -#include <libxml/globals.h> -#ifdef LIBXML_HTML_ENABLED -#include <libxml/HTMLtree.h> -#endif -#ifdef LIBXML_DEBUG_ENABLED -#include <libxml/debugXML.h> -#endif - -int __xmlRegisterCallbacks = 0; - -/************************************************************************ - * * - * Forward declarations * - * * - ************************************************************************/ - -xmlNsPtr xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns); - -static xmlChar* xmlGetPropNodeValueInternal(xmlAttrPtr prop); - -/************************************************************************ - * * - * Tree memory error handler * - * * - ************************************************************************/ -/** - * xmlTreeErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlTreeErrMemory(const char *extra) -{ - __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra); -} - -/** - * xmlTreeErr: - * @code: the error number - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlTreeErr(int code, xmlNodePtr node, const char *extra) -{ - const char *msg = NULL; - - switch(code) { - case XML_TREE_INVALID_HEX: - msg = "invalid hexadecimal character value\n"; - break; - case XML_TREE_INVALID_DEC: - msg = "invalid decimal character value\n"; - break; - case XML_TREE_UNTERMINATED_ENTITY: - msg = "unterminated entity reference %15s\n"; - break; - default: - msg = "unexpected error number\n"; - } - __xmlSimpleError(XML_FROM_TREE, code, node, msg, extra); -} - -/************************************************************************ - * * - * A few static variables and macros * - * * - ************************************************************************/ -/* #undef xmlStringText */ -const xmlChar xmlStringText[] = { 't', 'e', 'x', 't', 0 }; -/* #undef xmlStringTextNoenc */ -const xmlChar xmlStringTextNoenc[] = - { 't', 'e', 'x', 't', 'n', 'o', 'e', 'n', 'c', 0 }; -/* #undef xmlStringComment */ -const xmlChar xmlStringComment[] = { 'c', 'o', 'm', 'm', 'e', 'n', 't', 0 }; - -static int xmlCompressMode = 0; -static int xmlCheckDTD = 1; - -#define UPDATE_LAST_CHILD_AND_PARENT(n) if ((n) != NULL) { \ - xmlNodePtr ulccur = (n)->children; \ - if (ulccur == NULL) { \ - (n)->last = NULL; \ - } else { \ - while (ulccur->next != NULL) { \ - ulccur->parent = (n); \ - ulccur = ulccur->next; \ - } \ - ulccur->parent = (n); \ - (n)->last = ulccur; \ -}} - -#define IS_STR_XML(str) ((str != NULL) && (str[0] == 'x') && \ - (str[1] == 'm') && (str[2] == 'l') && (str[3] == 0)) - -/* #define DEBUG_BUFFER */ -/* #define DEBUG_TREE */ - -/************************************************************************ - * * - * Functions to move to entities.c once the * - * API freeze is smoothen and they can be made public. * - * * - ************************************************************************/ -#include <libxml/hash.h> - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlGetEntityFromDtd: - * @dtd: A pointer to the DTD to search - * @name: The entity name - * - * Do an entity lookup in the DTD entity hash table and - * return the corresponding entity, if found. - * - * Returns A pointer to the entity structure or NULL if not found. - */ -static xmlEntityPtr -xmlGetEntityFromDtd(xmlDtdPtr dtd, const xmlChar *name) { - xmlEntitiesTablePtr table; - - if((dtd != NULL) && (dtd->entities != NULL)) { - table = (xmlEntitiesTablePtr) dtd->entities; - return((xmlEntityPtr) xmlHashLookup(table, name)); - /* return(xmlGetEntityFromTable(table, name)); */ - } - return(NULL); -} -/** - * xmlGetParameterEntityFromDtd: - * @dtd: A pointer to the DTD to search - * @name: The entity name - * - * Do an entity lookup in the DTD pararmeter entity hash table and - * return the corresponding entity, if found. - * - * Returns A pointer to the entity structure or NULL if not found. - */ -static xmlEntityPtr -xmlGetParameterEntityFromDtd(xmlDtdPtr dtd, const xmlChar *name) { - xmlEntitiesTablePtr table; - - if ((dtd != NULL) && (dtd->pentities != NULL)) { - table = (xmlEntitiesTablePtr) dtd->pentities; - return((xmlEntityPtr) xmlHashLookup(table, name)); - /* return(xmlGetEntityFromTable(table, name)); */ - } - return(NULL); -} -#endif /* LIBXML_TREE_ENABLED */ - -/************************************************************************ - * * - * QName handling helper * - * * - ************************************************************************/ - -/** - * xmlBuildQName: - * @ncname: the Name - * @prefix: the prefix - * @memory: preallocated memory - * @len: preallocated memory length - * - * Builds the QName @prefix:@ncname in @memory if there is enough space - * and prefix is not NULL nor empty, otherwise allocate a new string. - * If prefix is NULL or empty it returns ncname. - * - * Returns the new string which must be freed by the caller if different from - * @memory and @ncname or NULL in case of error - */ -xmlChar * -xmlBuildQName(const xmlChar *ncname, const xmlChar *prefix, - xmlChar *memory, int len) { - int lenn, lenp; - xmlChar *ret; - - if (ncname == NULL) return(NULL); - if (prefix == NULL) return((xmlChar *) ncname); - - lenn = strlen((char *) ncname); - lenp = strlen((char *) prefix); - - if ((memory == NULL) || (len < lenn + lenp + 2)) { - ret = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); - if (ret == NULL) { - xmlTreeErrMemory("building QName"); - return(NULL); - } - } else { - ret = memory; - } - memcpy(&ret[0], prefix, lenp); - ret[lenp] = ':'; - memcpy(&ret[lenp + 1], ncname, lenn); - ret[lenn + lenp + 1] = 0; - return(ret); -} - -/** - * xmlSplitQName2: - * @name: the full QName - * @prefix: a xmlChar ** - * - * parse an XML qualified name string - * - * [NS 5] QName ::= (Prefix ':')? LocalPart - * - * [NS 6] Prefix ::= NCName - * - * [NS 7] LocalPart ::= NCName - * - * Returns NULL if not a QName, otherwise the local part, and prefix - * is updated to get the Prefix if any. - */ - -xmlChar * -xmlSplitQName2(const xmlChar *name, xmlChar **prefix) { - int len = 0; - xmlChar *ret = NULL; - - if (prefix == NULL) return(NULL); - *prefix = NULL; - if (name == NULL) return(NULL); - -#ifndef XML_XML_NAMESPACE - /* xml: prefix is not really a namespace */ - if ((name[0] == 'x') && (name[1] == 'm') && - (name[2] == 'l') && (name[3] == ':')) - return(NULL); -#endif - - /* nasty but valid */ - if (name[0] == ':') - return(NULL); - - /* - * we are not trying to validate but just to cut, and yes it will - * work even if this is as set of UTF-8 encoded chars - */ - while ((name[len] != 0) && (name[len] != ':')) - len++; - - if (name[len] == 0) - return(NULL); - - *prefix = xmlStrndup(name, len); - if (*prefix == NULL) { - xmlTreeErrMemory("QName split"); - return(NULL); - } - ret = xmlStrdup(&name[len + 1]); - if (ret == NULL) { - xmlTreeErrMemory("QName split"); - if (*prefix != NULL) { - xmlFree(*prefix); - *prefix = NULL; - } - return(NULL); - } - - return(ret); -} - -/** - * xmlSplitQName3: - * @name: the full QName - * @len: an int * - * - * parse an XML qualified name string,i - * - * returns NULL if it is not a Qualified Name, otherwise, update len - * with the length in byte of the prefix and return a pointer - * to the start of the name without the prefix - */ - -const xmlChar * -xmlSplitQName3(const xmlChar *name, int *len) { - int l = 0; - - if (name == NULL) return(NULL); - if (len == NULL) return(NULL); - - /* nasty but valid */ - if (name[0] == ':') - return(NULL); - - /* - * we are not trying to validate but just to cut, and yes it will - * work even if this is as set of UTF-8 encoded chars - */ - while ((name[l] != 0) && (name[l] != ':')) - l++; - - if (name[l] == 0) - return(NULL); - - *len = l; - - return(&name[l+1]); -} - -/************************************************************************ - * * - * Check Name, NCName and QName strings * - * * - ************************************************************************/ - -#define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l) - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) -/** - * xmlValidateNCName: - * @value: the value to check - * @space: allow spaces in front and end of the string - * - * Check that a value conforms to the lexical space of NCName - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlValidateNCName(const xmlChar *value, int space) { - const xmlChar *cur = value; - int c,l; - - if (value == NULL) - return(-1); - - /* - * First quick algorithm for ASCII range - */ - if (space) - while (IS_BLANK_CH(*cur)) cur++; - if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) || - (*cur == '_')) - cur++; - else - goto try_complex; - while (((*cur >= 'a') && (*cur <= 'z')) || - ((*cur >= 'A') && (*cur <= 'Z')) || - ((*cur >= '0') && (*cur <= '9')) || - (*cur == '_') || (*cur == '-') || (*cur == '.')) - cur++; - if (space) - while (IS_BLANK_CH(*cur)) cur++; - if (*cur == 0) - return(0); - -try_complex: - /* - * Second check for chars outside the ASCII range - */ - cur = value; - c = CUR_SCHAR(cur, l); - if (space) { - while (IS_BLANK(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if ((!IS_LETTER(c)) && (c != '_')) - return(1); - cur += l; - c = CUR_SCHAR(cur, l); - while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || - (c == '-') || (c == '_') || IS_COMBINING(c) || - IS_EXTENDER(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - if (space) { - while (IS_BLANK(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if (c != 0) - return(1); - - return(0); -} -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlValidateQName: - * @value: the value to check - * @space: allow spaces in front and end of the string - * - * Check that a value conforms to the lexical space of QName - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlValidateQName(const xmlChar *value, int space) { - const xmlChar *cur = value; - int c,l; - - if (value == NULL) - return(-1); - /* - * First quick algorithm for ASCII range - */ - if (space) - while (IS_BLANK_CH(*cur)) cur++; - if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) || - (*cur == '_')) - cur++; - else - goto try_complex; - while (((*cur >= 'a') && (*cur <= 'z')) || - ((*cur >= 'A') && (*cur <= 'Z')) || - ((*cur >= '0') && (*cur <= '9')) || - (*cur == '_') || (*cur == '-') || (*cur == '.')) - cur++; - if (*cur == ':') { - cur++; - if (((*cur >= 'a') && (*cur <= 'z')) || - ((*cur >= 'A') && (*cur <= 'Z')) || - (*cur == '_')) - cur++; - else - goto try_complex; - while (((*cur >= 'a') && (*cur <= 'z')) || - ((*cur >= 'A') && (*cur <= 'Z')) || - ((*cur >= '0') && (*cur <= '9')) || - (*cur == '_') || (*cur == '-') || (*cur == '.')) - cur++; - } - if (space) - while (IS_BLANK_CH(*cur)) cur++; - if (*cur == 0) - return(0); - -try_complex: - /* - * Second check for chars outside the ASCII range - */ - cur = value; - c = CUR_SCHAR(cur, l); - if (space) { - while (IS_BLANK(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if ((!IS_LETTER(c)) && (c != '_')) - return(1); - cur += l; - c = CUR_SCHAR(cur, l); - while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || - (c == '-') || (c == '_') || IS_COMBINING(c) || - IS_EXTENDER(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - if (c == ':') { - cur += l; - c = CUR_SCHAR(cur, l); - if ((!IS_LETTER(c)) && (c != '_')) - return(1); - cur += l; - c = CUR_SCHAR(cur, l); - while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || - (c == '-') || (c == '_') || IS_COMBINING(c) || - IS_EXTENDER(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if (space) { - while (IS_BLANK(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if (c != 0) - return(1); - return(0); -} - -/** - * xmlValidateName: - * @value: the value to check - * @space: allow spaces in front and end of the string - * - * Check that a value conforms to the lexical space of Name - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlValidateName(const xmlChar *value, int space) { - const xmlChar *cur = value; - int c,l; - - if (value == NULL) - return(-1); - /* - * First quick algorithm for ASCII range - */ - if (space) - while (IS_BLANK_CH(*cur)) cur++; - if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) || - (*cur == '_') || (*cur == ':')) - cur++; - else - goto try_complex; - while (((*cur >= 'a') && (*cur <= 'z')) || - ((*cur >= 'A') && (*cur <= 'Z')) || - ((*cur >= '0') && (*cur <= '9')) || - (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':')) - cur++; - if (space) - while (IS_BLANK_CH(*cur)) cur++; - if (*cur == 0) - return(0); - -try_complex: - /* - * Second check for chars outside the ASCII range - */ - cur = value; - c = CUR_SCHAR(cur, l); - if (space) { - while (IS_BLANK(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if ((!IS_LETTER(c)) && (c != '_') && (c != ':')) - return(1); - cur += l; - c = CUR_SCHAR(cur, l); - while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') || - (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - if (space) { - while (IS_BLANK(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if (c != 0) - return(1); - return(0); -} - -/** - * xmlValidateNMToken: - * @value: the value to check - * @space: allow spaces in front and end of the string - * - * Check that a value conforms to the lexical space of NMToken - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlValidateNMToken(const xmlChar *value, int space) { - const xmlChar *cur = value; - int c,l; - - if (value == NULL) - return(-1); - /* - * First quick algorithm for ASCII range - */ - if (space) - while (IS_BLANK_CH(*cur)) cur++; - if (((*cur >= 'a') && (*cur <= 'z')) || - ((*cur >= 'A') && (*cur <= 'Z')) || - ((*cur >= '0') && (*cur <= '9')) || - (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':')) - cur++; - else - goto try_complex; - while (((*cur >= 'a') && (*cur <= 'z')) || - ((*cur >= 'A') && (*cur <= 'Z')) || - ((*cur >= '0') && (*cur <= '9')) || - (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':')) - cur++; - if (space) - while (IS_BLANK_CH(*cur)) cur++; - if (*cur == 0) - return(0); - -try_complex: - /* - * Second check for chars outside the ASCII range - */ - cur = value; - c = CUR_SCHAR(cur, l); - if (space) { - while (IS_BLANK(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if (!(IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') || - (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c))) - return(1); - cur += l; - c = CUR_SCHAR(cur, l); - while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') || - (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - if (space) { - while (IS_BLANK(c)) { - cur += l; - c = CUR_SCHAR(cur, l); - } - } - if (c != 0) - return(1); - return(0); -} -#endif /* LIBXML_TREE_ENABLED */ - -/************************************************************************ - * * - * Allocation and deallocation of basic structures * - * * - ************************************************************************/ - -/** - * xmlSetBufferAllocationScheme: - * @scheme: allocation method to use - * - * Set the buffer allocation method. Types are - * XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down - * XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, - * improves performance - */ -void -xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme) { - xmlBufferAllocScheme = scheme; -} - -/** - * xmlGetBufferAllocationScheme: - * - * Types are - * XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down - * XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, - * improves performance - * - * Returns the current allocation scheme - */ -xmlBufferAllocationScheme -xmlGetBufferAllocationScheme(void) { - return(xmlBufferAllocScheme); -} - -/** - * xmlNewNs: - * @node: the element carrying the namespace - * @href: the URI associated - * @prefix: the prefix for the namespace - * - * Creation of a new Namespace. This function will refuse to create - * a namespace with a similar prefix than an existing one present on this - * node. - * We use href==NULL in the case of an element creation where the namespace - * was not defined. - * Returns a new namespace pointer or NULL - */ -xmlNsPtr -xmlNewNs(xmlNodePtr node, const xmlChar *href, const xmlChar *prefix) { - xmlNsPtr cur; - - if ((node != NULL) && (node->type != XML_ELEMENT_NODE)) - return(NULL); - - if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) - return(NULL); - - /* - * Allocate a new Namespace and fill the fields. - */ - cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); - if (cur == NULL) { - xmlTreeErrMemory("building namespace"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNs)); - cur->type = XML_LOCAL_NAMESPACE; - - if (href != NULL) - cur->href = xmlStrdup(href); - if (prefix != NULL) - cur->prefix = xmlStrdup(prefix); - - /* - * Add it at the end to preserve parsing order ... - * and checks for existing use of the prefix - */ - if (node != NULL) { - if (node->nsDef == NULL) { - node->nsDef = cur; - } else { - xmlNsPtr prev = node->nsDef; - - if (((prev->prefix == NULL) && (cur->prefix == NULL)) || - (xmlStrEqual(prev->prefix, cur->prefix))) { - xmlFreeNs(cur); - return(NULL); - } - while (prev->next != NULL) { - prev = prev->next; - if (((prev->prefix == NULL) && (cur->prefix == NULL)) || - (xmlStrEqual(prev->prefix, cur->prefix))) { - xmlFreeNs(cur); - return(NULL); - } - } - prev->next = cur; - } - } - return(cur); -} - -/** - * xmlSetNs: - * @node: a node in the document - * @ns: a namespace pointer - * - * Associate a namespace to a node, a posteriori. - */ -void -xmlSetNs(xmlNodePtr node, xmlNsPtr ns) { - if (node == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlSetNs: node == NULL\n"); -#endif - return; - } - node->ns = ns; -} - -/** - * xmlFreeNs: - * @cur: the namespace pointer - * - * Free up the structures associated to a namespace - */ -void -xmlFreeNs(xmlNsPtr cur) { - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlFreeNs : ns == NULL\n"); -#endif - return; - } - if (cur->href != NULL) xmlFree((char *) cur->href); - if (cur->prefix != NULL) xmlFree((char *) cur->prefix); - xmlFree(cur); -} - -/** - * xmlFreeNsList: - * @cur: the first namespace pointer - * - * Free up all the structures associated to the chained namespaces. - */ -void -xmlFreeNsList(xmlNsPtr cur) { - xmlNsPtr next; - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlFreeNsList : ns == NULL\n"); -#endif - return; - } - while (cur != NULL) { - next = cur->next; - xmlFreeNs(cur); - cur = next; - } -} - -/** - * xmlNewDtd: - * @doc: the document pointer - * @name: the DTD name - * @ExternalID: the external ID - * @SystemID: the system ID - * - * Creation of a new DTD for the external subset. To create an - * internal subset, use xmlCreateIntSubset(). - * - * Returns a pointer to the new DTD structure - */ -xmlDtdPtr -xmlNewDtd(xmlDocPtr doc, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) { - xmlDtdPtr cur; - - if ((doc != NULL) && (doc->extSubset != NULL)) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewDtd(%s): document %s already have a DTD %s\n", - /* !!! */ (char *) name, doc->name, - /* !!! */ (char *)doc->extSubset->name); -#endif - return(NULL); - } - - /* - * Allocate a new DTD and fill the fields. - */ - cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd)); - if (cur == NULL) { - xmlTreeErrMemory("building DTD"); - return(NULL); - } - memset(cur, 0 , sizeof(xmlDtd)); - cur->type = XML_DTD_NODE; - - if (name != NULL) - cur->name = xmlStrdup(name); - if (ExternalID != NULL) - cur->ExternalID = xmlStrdup(ExternalID); - if (SystemID != NULL) - cur->SystemID = xmlStrdup(SystemID); - if (doc != NULL) - doc->extSubset = cur; - cur->doc = doc; - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr)cur); - return(cur); -} - -/** - * xmlGetIntSubset: - * @doc: the document pointer - * - * Get the internal subset of a document - * Returns a pointer to the DTD structure or NULL if not found - */ - -xmlDtdPtr -xmlGetIntSubset(xmlDocPtr doc) { - xmlNodePtr cur; - - if (doc == NULL) - return(NULL); - cur = doc->children; - while (cur != NULL) { - if (cur->type == XML_DTD_NODE) - return((xmlDtdPtr) cur); - cur = cur->next; - } - return((xmlDtdPtr) doc->intSubset); -} - -/** - * xmlCreateIntSubset: - * @doc: the document pointer - * @name: the DTD name - * @ExternalID: the external (PUBLIC) ID - * @SystemID: the system ID - * - * Create the internal subset of a document - * Returns a pointer to the new DTD structure - */ -xmlDtdPtr -xmlCreateIntSubset(xmlDocPtr doc, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) { - xmlDtdPtr cur; - - if ((doc != NULL) && (xmlGetIntSubset(doc) != NULL)) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - - "xmlCreateIntSubset(): document %s already have an internal subset\n", - doc->name); -#endif - return(NULL); - } - - /* - * Allocate a new DTD and fill the fields. - */ - cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd)); - if (cur == NULL) { - xmlTreeErrMemory("building internal subset"); - return(NULL); - } - memset(cur, 0, sizeof(xmlDtd)); - cur->type = XML_DTD_NODE; - - if (name != NULL) { - cur->name = xmlStrdup(name); - if (cur->name == NULL) { - xmlTreeErrMemory("building internal subset"); - xmlFree(cur); - return(NULL); - } - } - if (ExternalID != NULL) { - cur->ExternalID = xmlStrdup(ExternalID); - if (cur->ExternalID == NULL) { - xmlTreeErrMemory("building internal subset"); - if (cur->name != NULL) - xmlFree((char *)cur->name); - xmlFree(cur); - return(NULL); - } - } - if (SystemID != NULL) { - cur->SystemID = xmlStrdup(SystemID); - if (cur->SystemID == NULL) { - xmlTreeErrMemory("building internal subset"); - if (cur->name != NULL) - xmlFree((char *)cur->name); - if (cur->ExternalID != NULL) - xmlFree((char *)cur->ExternalID); - xmlFree(cur); - return(NULL); - } - } - if (doc != NULL) { - doc->intSubset = cur; - cur->parent = doc; - cur->doc = doc; - if (doc->children == NULL) { - doc->children = (xmlNodePtr) cur; - doc->last = (xmlNodePtr) cur; - } else { - if (doc->type == XML_HTML_DOCUMENT_NODE) { - xmlNodePtr prev; - - prev = doc->children; - prev->prev = (xmlNodePtr) cur; - cur->next = prev; - doc->children = (xmlNodePtr) cur; - } else { - xmlNodePtr next; - - next = doc->children; - while ((next != NULL) && (next->type != XML_ELEMENT_NODE)) - next = next->next; - if (next == NULL) { - cur->prev = doc->last; - cur->prev->next = (xmlNodePtr) cur; - cur->next = NULL; - doc->last = (xmlNodePtr) cur; - } else { - cur->next = next; - cur->prev = next->prev; - if (cur->prev == NULL) - doc->children = (xmlNodePtr) cur; - else - cur->prev->next = (xmlNodePtr) cur; - next->prev = (xmlNodePtr) cur; - } - } - } - } - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr)cur); - return(cur); -} - -/** - * DICT_FREE: - * @str: a string - * - * Free a string if it is not owned by the "dict" dictionnary in the - * current scope - */ -#define DICT_FREE(str) \ - if ((str) && ((!dict) || \ - (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ - xmlFree((char *)(str)); - - -/** - * DICT_COPY: - * @str: a string - * - * Copy a string using a "dict" dictionnary in the current scope, - * if availabe. - */ -#define DICT_COPY(str, cpy) \ - if (str) { \ - if (dict) { \ - if (xmlDictOwns(dict, (const xmlChar *)(str))) \ - cpy = (xmlChar *) (str); \ - else \ - cpy = (xmlChar *) xmlDictLookup((dict), (const xmlChar *)(str), -1); \ - } else \ - cpy = xmlStrdup((const xmlChar *)(str)); } - -/** - * DICT_CONST_COPY: - * @str: a string - * - * Copy a string using a "dict" dictionnary in the current scope, - * if availabe. - */ -#define DICT_CONST_COPY(str, cpy) \ - if (str) { \ - if (dict) { \ - if (xmlDictOwns(dict, (const xmlChar *)(str))) \ - cpy = (const xmlChar *) (str); \ - else \ - cpy = xmlDictLookup((dict), (const xmlChar *)(str), -1); \ - } else \ - cpy = (const xmlChar *) xmlStrdup((const xmlChar *)(str)); } - - -/** - * xmlFreeDtd: - * @cur: the DTD structure to free up - * - * Free a DTD structure. - */ -void -xmlFreeDtd(xmlDtdPtr cur) { - xmlDictPtr dict = NULL; - - if (cur == NULL) { - return; - } - if (cur->doc != NULL) dict = cur->doc->dict; - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue((xmlNodePtr)cur); - - if (cur->children != NULL) { - xmlNodePtr next, c = cur->children; - - /* - * Cleanup all nodes which are not part of the specific lists - * of notations, elements, attributes and entities. - */ - while (c != NULL) { - next = c->next; - if ((c->type != XML_NOTATION_NODE) && - (c->type != XML_ELEMENT_DECL) && - (c->type != XML_ATTRIBUTE_DECL) && - (c->type != XML_ENTITY_DECL)) { - xmlUnlinkNode(c); - xmlFreeNode(c); - } - c = next; - } - } - DICT_FREE(cur->name) - DICT_FREE(cur->SystemID) - DICT_FREE(cur->ExternalID) - /* TODO !!! */ - if (cur->notations != NULL) - xmlFreeNotationTable((xmlNotationTablePtr) cur->notations); - - if (cur->elements != NULL) - xmlFreeElementTable((xmlElementTablePtr) cur->elements); - if (cur->attributes != NULL) - xmlFreeAttributeTable((xmlAttributeTablePtr) cur->attributes); - if (cur->entities != NULL) - xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->entities); - if (cur->pentities != NULL) - xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->pentities); - - xmlFree(cur); -} - -/** - * xmlNewDoc: - * @version: xmlChar string giving the version of XML "1.0" - * - * Creates a new XML document - * - * Returns a new document - */ -xmlDocPtr -xmlNewDoc(const xmlChar *version) { - xmlDocPtr cur; - - if (version == NULL) - version = (const xmlChar *) "1.0"; - - /* - * Allocate a new document and fill the fields. - */ - cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc)); - if (cur == NULL) { - xmlTreeErrMemory("building doc"); - return(NULL); - } - memset(cur, 0, sizeof(xmlDoc)); - cur->type = XML_DOCUMENT_NODE; - - cur->version = xmlStrdup(version); - if (cur->version == NULL) { - xmlTreeErrMemory("building doc"); - xmlFree(cur); - return(NULL); - } - cur->standalone = -1; - cur->compression = -1; /* not initialized */ - cur->doc = cur; - /* - * The in memory encoding is always UTF8 - * This field will never change and would - * be obsolete if not for binary compatibility. - */ - cur->charset = XML_CHAR_ENCODING_UTF8; - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr)cur); - return(cur); -} - -/** - * xmlFreeDoc: - * @cur: pointer to the document - * - * Free up all the structures used by a document, tree included. - */ -void -xmlFreeDoc(xmlDocPtr cur) { - xmlDtdPtr extSubset, intSubset; - xmlDictPtr dict = NULL; - - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlFreeDoc : document == NULL\n"); -#endif - return; - } -#ifdef LIBXML_DEBUG_RUNTIME -#ifdef LIBXML_DEBUG_ENABLED - xmlDebugCheckDocument(stderr, cur); -#endif -#endif - - if (cur != NULL) dict = cur->dict; - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue((xmlNodePtr)cur); - - /* - * Do this before freeing the children list to avoid ID lookups - */ - if (cur->ids != NULL) xmlFreeIDTable((xmlIDTablePtr) cur->ids); - cur->ids = NULL; - if (cur->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) cur->refs); - cur->refs = NULL; - extSubset = cur->extSubset; - intSubset = cur->intSubset; - if (intSubset == extSubset) - extSubset = NULL; - if (extSubset != NULL) { - xmlUnlinkNode((xmlNodePtr) cur->extSubset); - cur->extSubset = NULL; - xmlFreeDtd(extSubset); - } - if (intSubset != NULL) { - xmlUnlinkNode((xmlNodePtr) cur->intSubset); - cur->intSubset = NULL; - xmlFreeDtd(intSubset); - } - - if (cur->children != NULL) xmlFreeNodeList(cur->children); - if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs); - - DICT_FREE(cur->version) - DICT_FREE(cur->name) - DICT_FREE(cur->encoding) - DICT_FREE(cur->URL) - xmlFree(cur); - if (dict) xmlDictFree(dict); -} - -/** - * xmlStringLenGetNodeList: - * @doc: the document - * @value: the value of the text - * @len: the length of the string value - * - * Parse the value string and build the node list associated. Should - * produce a flat tree with only TEXTs and ENTITY_REFs. - * Returns a pointer to the first child - */ -xmlNodePtr -xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) { - xmlNodePtr ret = NULL, last = NULL; - xmlNodePtr node; - xmlChar *val; - const xmlChar *cur = value, *end = cur + len; - const xmlChar *q; - xmlEntityPtr ent; - - if (value == NULL) return(NULL); - - q = cur; - while ((cur < end) && (*cur != 0)) { - if (cur[0] == '&') { - int charval = 0; - xmlChar tmp; - - /* - * Save the current text. - */ - if (cur != q) { - if ((last != NULL) && (last->type == XML_TEXT_NODE)) { - xmlNodeAddContentLen(last, q, cur - q); - } else { - node = xmlNewDocTextLen(doc, q, cur - q); - if (node == NULL) return(ret); - if (last == NULL) - last = ret = node; - else { - last->next = node; - node->prev = last; - last = node; - } - } - } - q = cur; - if ((cur + 2 < end) && (cur[1] == '#') && (cur[2] == 'x')) { - cur += 3; - if (cur < end) - tmp = *cur; - else - tmp = 0; - while (tmp != ';') { /* Non input consuming loop */ - if ((tmp >= '0') && (tmp <= '9')) - charval = charval * 16 + (tmp - '0'); - else if ((tmp >= 'a') && (tmp <= 'f')) - charval = charval * 16 + (tmp - 'a') + 10; - else if ((tmp >= 'A') && (tmp <= 'F')) - charval = charval * 16 + (tmp - 'A') + 10; - else { - xmlTreeErr(XML_TREE_INVALID_HEX, (xmlNodePtr) doc, - NULL); - charval = 0; - break; - } - cur++; - if (cur < end) - tmp = *cur; - else - tmp = 0; - } - if (tmp == ';') - cur++; - q = cur; - } else if ((cur + 1 < end) && (cur[1] == '#')) { - cur += 2; - if (cur < end) - tmp = *cur; - else - tmp = 0; - while (tmp != ';') { /* Non input consuming loops */ - if ((tmp >= '0') && (tmp <= '9')) - charval = charval * 10 + (tmp - '0'); - else { - xmlTreeErr(XML_TREE_INVALID_DEC, (xmlNodePtr) doc, - NULL); - charval = 0; - break; - } - cur++; - if (cur < end) - tmp = *cur; - else - tmp = 0; - } - if (tmp == ';') - cur++; - q = cur; - } else { - /* - * Read the entity string - */ - cur++; - q = cur; - while ((cur < end) && (*cur != 0) && (*cur != ';')) cur++; - if ((cur >= end) || (*cur == 0)) { - xmlTreeErr(XML_TREE_UNTERMINATED_ENTITY, (xmlNodePtr) doc, - (const char *) q); - return(ret); - } - if (cur != q) { - /* - * Predefined entities don't generate nodes - */ - val = xmlStrndup(q, cur - q); - ent = xmlGetDocEntity(doc, val); - if ((ent != NULL) && - (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { - if (last == NULL) { - node = xmlNewDocText(doc, ent->content); - last = ret = node; - } else if (last->type != XML_TEXT_NODE) { - node = xmlNewDocText(doc, ent->content); - last = xmlAddNextSibling(last, node); - } else - xmlNodeAddContent(last, ent->content); - - } else { - /* - * Create a new REFERENCE_REF node - */ - node = xmlNewReference(doc, val); - if (node == NULL) { - if (val != NULL) xmlFree(val); - return(ret); - } - else if ((ent != NULL) && (ent->children == NULL)) { - xmlNodePtr temp; - - ent->children = xmlStringGetNodeList(doc, - (const xmlChar*)node->content); - ent->owner = 1; - temp = ent->children; - while (temp) { - temp->parent = (xmlNodePtr)ent; - ent->last = temp; - temp = temp->next; - } - } - if (last == NULL) { - last = ret = node; - } else { - last = xmlAddNextSibling(last, node); - } - } - xmlFree(val); - } - cur++; - q = cur; - } - if (charval != 0) { - xmlChar buf[10]; - int l; - - l = xmlCopyCharMultiByte(buf, charval); - buf[l] = 0; - node = xmlNewDocText(doc, buf); - if (node != NULL) { - if (last == NULL) { - last = ret = node; - } else { - last = xmlAddNextSibling(last, node); - } - } - charval = 0; - } - } else - cur++; - } - if ((cur != q) || (ret == NULL)) { - /* - * Handle the last piece of text. - */ - if ((last != NULL) && (last->type == XML_TEXT_NODE)) { - xmlNodeAddContentLen(last, q, cur - q); - } else { - node = xmlNewDocTextLen(doc, q, cur - q); - if (node == NULL) return(ret); - if (last == NULL) { - last = ret = node; - } else { - last = xmlAddNextSibling(last, node); - } - } - } - return(ret); -} - -/** - * xmlStringGetNodeList: - * @doc: the document - * @value: the value of the attribute - * - * Parse the value string and build the node list associated. Should - * produce a flat tree with only TEXTs and ENTITY_REFs. - * Returns a pointer to the first child - */ -xmlNodePtr -xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) { - xmlNodePtr ret = NULL, last = NULL; - xmlNodePtr node; - xmlChar *val; - const xmlChar *cur = value; - const xmlChar *q; - xmlEntityPtr ent; - - if (value == NULL) return(NULL); - - q = cur; - while (*cur != 0) { - if (cur[0] == '&') { - int charval = 0; - xmlChar tmp; - - /* - * Save the current text. - */ - if (cur != q) { - if ((last != NULL) && (last->type == XML_TEXT_NODE)) { - xmlNodeAddContentLen(last, q, cur - q); - } else { - node = xmlNewDocTextLen(doc, q, cur - q); - if (node == NULL) return(ret); - if (last == NULL) - last = ret = node; - else { - last->next = node; - node->prev = last; - last = node; - } - } - } - q = cur; - if ((cur[1] == '#') && (cur[2] == 'x')) { - cur += 3; - tmp = *cur; - while (tmp != ';') { /* Non input consuming loop */ - if ((tmp >= '0') && (tmp <= '9')) - charval = charval * 16 + (tmp - '0'); - else if ((tmp >= 'a') && (tmp <= 'f')) - charval = charval * 16 + (tmp - 'a') + 10; - else if ((tmp >= 'A') && (tmp <= 'F')) - charval = charval * 16 + (tmp - 'A') + 10; - else { - xmlTreeErr(XML_TREE_INVALID_HEX, (xmlNodePtr) doc, - NULL); - charval = 0; - break; - } - cur++; - tmp = *cur; - } - if (tmp == ';') - cur++; - q = cur; - } else if (cur[1] == '#') { - cur += 2; - tmp = *cur; - while (tmp != ';') { /* Non input consuming loops */ - if ((tmp >= '0') && (tmp <= '9')) - charval = charval * 10 + (tmp - '0'); - else { - xmlTreeErr(XML_TREE_INVALID_DEC, (xmlNodePtr) doc, - NULL); - charval = 0; - break; - } - cur++; - tmp = *cur; - } - if (tmp == ';') - cur++; - q = cur; - } else { - /* - * Read the entity string - */ - cur++; - q = cur; - while ((*cur != 0) && (*cur != ';')) cur++; - if (*cur == 0) { - xmlTreeErr(XML_TREE_UNTERMINATED_ENTITY, - (xmlNodePtr) doc, (const char *) q); - return(ret); - } - if (cur != q) { - /* - * Predefined entities don't generate nodes - */ - val = xmlStrndup(q, cur - q); - ent = xmlGetDocEntity(doc, val); - if ((ent != NULL) && - (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { - if (last == NULL) { - node = xmlNewDocText(doc, ent->content); - last = ret = node; - } else if (last->type != XML_TEXT_NODE) { - node = xmlNewDocText(doc, ent->content); - last = xmlAddNextSibling(last, node); - } else - xmlNodeAddContent(last, ent->content); - - } else { - /* - * Create a new REFERENCE_REF node - */ - node = xmlNewReference(doc, val); - if (node == NULL) { - if (val != NULL) xmlFree(val); - return(ret); - } - else if ((ent != NULL) && (ent->children == NULL)) { - xmlNodePtr temp; - - ent->children = xmlStringGetNodeList(doc, - (const xmlChar*)node->content); - ent->owner = 1; - temp = ent->children; - while (temp) { - temp->parent = (xmlNodePtr)ent; - temp = temp->next; - } - } - if (last == NULL) { - last = ret = node; - } else { - last = xmlAddNextSibling(last, node); - } - } - xmlFree(val); - } - cur++; - q = cur; - } - if (charval != 0) { - xmlChar buf[10]; - int len; - - len = xmlCopyCharMultiByte(buf, charval); - buf[len] = 0; - node = xmlNewDocText(doc, buf); - if (node != NULL) { - if (last == NULL) { - last = ret = node; - } else { - last = xmlAddNextSibling(last, node); - } - } - - charval = 0; - } - } else - cur++; - } - if ((cur != q) || (ret == NULL)) { - /* - * Handle the last piece of text. - */ - if ((last != NULL) && (last->type == XML_TEXT_NODE)) { - xmlNodeAddContentLen(last, q, cur - q); - } else { - node = xmlNewDocTextLen(doc, q, cur - q); - if (node == NULL) return(ret); - if (last == NULL) { - last = ret = node; - } else { - last = xmlAddNextSibling(last, node); - } - } - } - return(ret); -} - -/** - * xmlNodeListGetString: - * @doc: the document - * @list: a Node list - * @inLine: should we replace entity contents or show their external form - * - * Build the string equivalent to the text contained in the Node list - * made of TEXTs and ENTITY_REFs - * - * Returns a pointer to the string copy, the caller must free it with xmlFree(). - */ -xmlChar * -xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr list, int inLine) -{ - xmlNodePtr node = list; - xmlChar *ret = NULL; - xmlEntityPtr ent; - - if (list == NULL) - return (NULL); - - while (node != NULL) { - if ((node->type == XML_TEXT_NODE) || - (node->type == XML_CDATA_SECTION_NODE)) { - if (inLine) { - ret = xmlStrcat(ret, node->content); - } else { - xmlChar *buffer; - - buffer = xmlEncodeEntitiesReentrant(doc, node->content); - if (buffer != NULL) { - ret = xmlStrcat(ret, buffer); - xmlFree(buffer); - } - } - } else if (node->type == XML_ENTITY_REF_NODE) { - if (inLine) { - ent = xmlGetDocEntity(doc, node->name); - if (ent != NULL) { - xmlChar *buffer; - - /* an entity content can be any "well balanced chunk", - * i.e. the result of the content [43] production: - * http://www.w3.org/TR/REC-xml#NT-content. - * So it can contain text, CDATA section or nested - * entity reference nodes (among others). - * -> we recursive call xmlNodeListGetString() - * which handles these types */ - buffer = xmlNodeListGetString(doc, ent->children, 1); - if (buffer != NULL) { - ret = xmlStrcat(ret, buffer); - xmlFree(buffer); - } - } else { - ret = xmlStrcat(ret, node->content); - } - } else { - xmlChar buf[2]; - - buf[0] = '&'; - buf[1] = 0; - ret = xmlStrncat(ret, buf, 1); - ret = xmlStrcat(ret, node->name); - buf[0] = ';'; - buf[1] = 0; - ret = xmlStrncat(ret, buf, 1); - } - } -#if 0 - else { - xmlGenericError(xmlGenericErrorContext, - "xmlGetNodeListString : invalid node type %d\n", - node->type); - } -#endif - node = node->next; - } - return (ret); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlNodeListGetRawString: - * @doc: the document - * @list: a Node list - * @inLine: should we replace entity contents or show their external form - * - * Builds the string equivalent to the text contained in the Node list - * made of TEXTs and ENTITY_REFs, contrary to xmlNodeListGetString() - * this function doesn't do any character encoding handling. - * - * Returns a pointer to the string copy, the caller must free it with xmlFree(). - */ -xmlChar * -xmlNodeListGetRawString(xmlDocPtr doc, xmlNodePtr list, int inLine) -{ - xmlNodePtr node = list; - xmlChar *ret = NULL; - xmlEntityPtr ent; - - if (list == NULL) - return (NULL); - - while (node != NULL) { - if ((node->type == XML_TEXT_NODE) || - (node->type == XML_CDATA_SECTION_NODE)) { - if (inLine) { - ret = xmlStrcat(ret, node->content); - } else { - xmlChar *buffer; - - buffer = xmlEncodeSpecialChars(doc, node->content); - if (buffer != NULL) { - ret = xmlStrcat(ret, buffer); - xmlFree(buffer); - } - } - } else if (node->type == XML_ENTITY_REF_NODE) { - if (inLine) { - ent = xmlGetDocEntity(doc, node->name); - if (ent != NULL) { - xmlChar *buffer; - - /* an entity content can be any "well balanced chunk", - * i.e. the result of the content [43] production: - * http://www.w3.org/TR/REC-xml#NT-content. - * So it can contain text, CDATA section or nested - * entity reference nodes (among others). - * -> we recursive call xmlNodeListGetRawString() - * which handles these types */ - buffer = - xmlNodeListGetRawString(doc, ent->children, 1); - if (buffer != NULL) { - ret = xmlStrcat(ret, buffer); - xmlFree(buffer); - } - } else { - ret = xmlStrcat(ret, node->content); - } - } else { - xmlChar buf[2]; - - buf[0] = '&'; - buf[1] = 0; - ret = xmlStrncat(ret, buf, 1); - ret = xmlStrcat(ret, node->name); - buf[0] = ';'; - buf[1] = 0; - ret = xmlStrncat(ret, buf, 1); - } - } -#if 0 - else { - xmlGenericError(xmlGenericErrorContext, - "xmlGetNodeListString : invalid node type %d\n", - node->type); - } -#endif - node = node->next; - } - return (ret); -} -#endif /* LIBXML_TREE_ENABLED */ - -static xmlAttrPtr -xmlNewPropInternal(xmlNodePtr node, xmlNsPtr ns, - const xmlChar * name, const xmlChar * value, - int eatname) -{ - xmlAttrPtr cur; - xmlDocPtr doc = NULL; - - if ((node != NULL) && (node->type != XML_ELEMENT_NODE)) { - if (eatname == 1) - xmlFree((xmlChar *) name); - return (NULL); - } - - /* - * Allocate a new property and fill the fields. - */ - cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr)); - if (cur == NULL) { - if (eatname == 1) - xmlFree((xmlChar *) name); - xmlTreeErrMemory("building attribute"); - return (NULL); - } - memset(cur, 0, sizeof(xmlAttr)); - cur->type = XML_ATTRIBUTE_NODE; - - cur->parent = node; - if (node != NULL) { - doc = node->doc; - cur->doc = doc; - } - cur->ns = ns; - - if (eatname == 0) { - if ((doc != NULL) && (doc->dict != NULL)) - cur->name = (xmlChar *) xmlDictLookup(doc->dict, name, -1); - else - cur->name = xmlStrdup(name); - } else - cur->name = name; - - if (value != NULL) { - xmlChar *buffer; - xmlNodePtr tmp; - - buffer = xmlEncodeEntitiesReentrant(doc, value); - cur->children = xmlStringGetNodeList(doc, buffer); - cur->last = NULL; - tmp = cur->children; - while (tmp != NULL) { - tmp->parent = (xmlNodePtr) cur; - if (tmp->next == NULL) - cur->last = tmp; - tmp = tmp->next; - } - xmlFree(buffer); - } - - /* - * Add it at the end to preserve parsing order ... - */ - if (node != NULL) { - if (node->properties == NULL) { - node->properties = cur; - } else { - xmlAttrPtr prev = node->properties; - - while (prev->next != NULL) - prev = prev->next; - prev->next = cur; - cur->prev = prev; - } - } - - if (xmlIsID((node == NULL) ? NULL : node->doc, node, cur) == 1) - xmlAddID(NULL, node->doc, value, cur); - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr) cur); - return (cur); -} - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ - defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlNewProp: - * @node: the holding node - * @name: the name of the attribute - * @value: the value of the attribute - * - * Create a new property carried by a node. - * Returns a pointer to the attribute - */ -xmlAttrPtr -xmlNewProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) { - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewProp : name == NULL\n"); -#endif - return(NULL); - } - - return xmlNewPropInternal(node, NULL, name, value, 0); -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlNewNsProp: - * @node: the holding node - * @ns: the namespace - * @name: the name of the attribute - * @value: the value of the attribute - * - * Create a new property tagged with a namespace and carried by a node. - * Returns a pointer to the attribute - */ -xmlAttrPtr -xmlNewNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, - const xmlChar *value) { - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewNsProp : name == NULL\n"); -#endif - return(NULL); - } - - return xmlNewPropInternal(node, ns, name, value, 0); -} - -/** - * xmlNewNsPropEatName: - * @node: the holding node - * @ns: the namespace - * @name: the name of the attribute - * @value: the value of the attribute - * - * Create a new property tagged with a namespace and carried by a node. - * Returns a pointer to the attribute - */ -xmlAttrPtr -xmlNewNsPropEatName(xmlNodePtr node, xmlNsPtr ns, xmlChar *name, - const xmlChar *value) { - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewNsPropEatName : name == NULL\n"); -#endif - return(NULL); - } - - return xmlNewPropInternal(node, ns, name, value, 1); -} - -/** - * xmlNewDocProp: - * @doc: the document - * @name: the name of the attribute - * @value: the value of the attribute - * - * Create a new property carried by a document. - * Returns a pointer to the attribute - */ -xmlAttrPtr -xmlNewDocProp(xmlDocPtr doc, const xmlChar *name, const xmlChar *value) { - xmlAttrPtr cur; - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewDocProp : name == NULL\n"); -#endif - return(NULL); - } - - /* - * Allocate a new property and fill the fields. - */ - cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr)); - if (cur == NULL) { - xmlTreeErrMemory("building attribute"); - return(NULL); - } - memset(cur, 0, sizeof(xmlAttr)); - cur->type = XML_ATTRIBUTE_NODE; - - if ((doc != NULL) && (doc->dict != NULL)) - cur->name = xmlDictLookup(doc->dict, name, -1); - else - cur->name = xmlStrdup(name); - cur->doc = doc; - if (value != NULL) { - xmlNodePtr tmp; - - cur->children = xmlStringGetNodeList(doc, value); - cur->last = NULL; - - tmp = cur->children; - while (tmp != NULL) { - tmp->parent = (xmlNodePtr) cur; - if (tmp->next == NULL) - cur->last = tmp; - tmp = tmp->next; - } - } - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr)cur); - return(cur); -} - -/** - * xmlFreePropList: - * @cur: the first property in the list - * - * Free a property and all its siblings, all the children are freed too. - */ -void -xmlFreePropList(xmlAttrPtr cur) { - xmlAttrPtr next; - if (cur == NULL) return; - while (cur != NULL) { - next = cur->next; - xmlFreeProp(cur); - cur = next; - } -} - -/** - * xmlFreeProp: - * @cur: an attribute - * - * Free one attribute, all the content is freed too - */ -void -xmlFreeProp(xmlAttrPtr cur) { - xmlDictPtr dict = NULL; - if (cur == NULL) return; - - if (cur->doc != NULL) dict = cur->doc->dict; - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue((xmlNodePtr)cur); - - /* Check for ID removal -> leading to invalid references ! */ - if ((cur->doc != NULL) && (cur->atype == XML_ATTRIBUTE_ID)) { - xmlRemoveID(cur->doc, cur); - } - if (cur->children != NULL) xmlFreeNodeList(cur->children); - DICT_FREE(cur->name) - xmlFree(cur); -} - -/** - * xmlRemoveProp: - * @cur: an attribute - * - * Unlink and free one attribute, all the content is freed too - * Note this doesn't work for namespace definition attributes - * - * Returns 0 if success and -1 in case of error. - */ -int -xmlRemoveProp(xmlAttrPtr cur) { - xmlAttrPtr tmp; - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlRemoveProp : cur == NULL\n"); -#endif - return(-1); - } - if (cur->parent == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlRemoveProp : cur->parent == NULL\n"); -#endif - return(-1); - } - tmp = cur->parent->properties; - if (tmp == cur) { - cur->parent->properties = cur->next; - if (cur->next != NULL) - cur->next->prev = NULL; - xmlFreeProp(cur); - return(0); - } - while (tmp != NULL) { - if (tmp->next == cur) { - tmp->next = cur->next; - if (tmp->next != NULL) - tmp->next->prev = tmp; - xmlFreeProp(cur); - return(0); - } - tmp = tmp->next; - } -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlRemoveProp : attribute not owned by its node\n"); -#endif - return(-1); -} - -/** - * xmlNewDocPI: - * @doc: the target document - * @name: the processing instruction name - * @content: the PI content - * - * Creation of a processing instruction element. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewDocPI(xmlDocPtr doc, const xmlChar *name, const xmlChar *content) { - xmlNodePtr cur; - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewPI : name == NULL\n"); -#endif - return(NULL); - } - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building PI"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_PI_NODE; - - if ((doc != NULL) && (doc->dict != NULL)) - cur->name = xmlDictLookup(doc->dict, name, -1); - else - cur->name = xmlStrdup(name); - if (content != NULL) { - cur->content = xmlStrdup(content); - } - cur->doc = doc; - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr)cur); - return(cur); -} - -/** - * xmlNewPI: - * @name: the processing instruction name - * @content: the PI content - * - * Creation of a processing instruction element. - * Use xmlDocNewPI preferably to get string interning - * - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewPI(const xmlChar *name, const xmlChar *content) { - return(xmlNewDocPI(NULL, name, content)); -} - -/** - * xmlNewNode: - * @ns: namespace if any - * @name: the node name - * - * Creation of a new node element. @ns is optional (NULL). - * - * Returns a pointer to the new node object. Uses xmlStrdup() to make - * copy of @name. - */ -xmlNodePtr -xmlNewNode(xmlNsPtr ns, const xmlChar *name) { - xmlNodePtr cur; - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewNode : name == NULL\n"); -#endif - return(NULL); - } - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building node"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_ELEMENT_NODE; - - cur->name = xmlStrdup(name); - cur->ns = ns; - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(cur); - return(cur); -} - -/** - * xmlNewNodeEatName: - * @ns: namespace if any - * @name: the node name - * - * Creation of a new node element. @ns is optional (NULL). - * - * Returns a pointer to the new node object, with pointer @name as - * new node's name. Use xmlNewNode() if a copy of @name string is - * is needed as new node's name. - */ -xmlNodePtr -xmlNewNodeEatName(xmlNsPtr ns, xmlChar *name) { - xmlNodePtr cur; - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewNode : name == NULL\n"); -#endif - return(NULL); - } - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlFree(name); - xmlTreeErrMemory("building node"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_ELEMENT_NODE; - - cur->name = name; - cur->ns = ns; - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr)cur); - return(cur); -} - -/** - * xmlNewDocNode: - * @doc: the document - * @ns: namespace if any - * @name: the node name - * @content: the XML text content if any - * - * Creation of a new node element within a document. @ns and @content - * are optional (NULL). - * NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities - * references, but XML special chars need to be escaped first by using - * xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't - * need entities support. - * - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewDocNode(xmlDocPtr doc, xmlNsPtr ns, - const xmlChar *name, const xmlChar *content) { - xmlNodePtr cur; - - if ((doc != NULL) && (doc->dict != NULL)) - cur = xmlNewNodeEatName(ns, (xmlChar *) - xmlDictLookup(doc->dict, name, -1)); - else - cur = xmlNewNode(ns, name); - if (cur != NULL) { - cur->doc = doc; - if (content != NULL) { - cur->children = xmlStringGetNodeList(doc, content); - UPDATE_LAST_CHILD_AND_PARENT(cur) - } - } - - return(cur); -} - -/** - * xmlNewDocNodeEatName: - * @doc: the document - * @ns: namespace if any - * @name: the node name - * @content: the XML text content if any - * - * Creation of a new node element within a document. @ns and @content - * are optional (NULL). - * NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities - * references, but XML special chars need to be escaped first by using - * xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't - * need entities support. - * - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewDocNodeEatName(xmlDocPtr doc, xmlNsPtr ns, - xmlChar *name, const xmlChar *content) { - xmlNodePtr cur; - - cur = xmlNewNodeEatName(ns, name); - if (cur != NULL) { - cur->doc = doc; - if (content != NULL) { - cur->children = xmlStringGetNodeList(doc, content); - UPDATE_LAST_CHILD_AND_PARENT(cur) - } - } - return(cur); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlNewDocRawNode: - * @doc: the document - * @ns: namespace if any - * @name: the node name - * @content: the text content if any - * - * Creation of a new node element within a document. @ns and @content - * are optional (NULL). - * - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewDocRawNode(xmlDocPtr doc, xmlNsPtr ns, - const xmlChar *name, const xmlChar *content) { - xmlNodePtr cur; - - cur = xmlNewDocNode(doc, ns, name, NULL); - if (cur != NULL) { - cur->doc = doc; - if (content != NULL) { - cur->children = xmlNewDocText(doc, content); - UPDATE_LAST_CHILD_AND_PARENT(cur) - } - } - return(cur); -} - -/** - * xmlNewDocFragment: - * @doc: the document owning the fragment - * - * Creation of a new Fragment node. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewDocFragment(xmlDocPtr doc) { - xmlNodePtr cur; - - /* - * Allocate a new DocumentFragment node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building fragment"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_DOCUMENT_FRAG_NODE; - - cur->doc = doc; - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(cur); - return(cur); -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlNewText: - * @content: the text content - * - * Creation of a new text node. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewText(const xmlChar *content) { - xmlNodePtr cur; - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building text"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_TEXT_NODE; - - cur->name = xmlStringText; - if (content != NULL) { - cur->content = xmlStrdup(content); - } - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(cur); - return(cur); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlNewTextChild: - * @parent: the parent node - * @ns: a namespace if any - * @name: the name of the child - * @content: the text content of the child if any. - * - * Creation of a new child element, added at the end of @parent children list. - * @ns and @content parameters are optional (NULL). If @ns is NULL, the newly - * created element inherits the namespace of @parent. If @content is non NULL, - * a child TEXT node will be created containing the string @content. - * NOTE: Use xmlNewChild() if @content will contain entities that need to be - * preserved. Use this function, xmlNewTextChild(), if you need to ensure that - * reserved XML chars that might appear in @content, such as the ampersand, - * greater-than or less-than signs, are automatically replaced by their XML - * escaped entity representations. - * - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewTextChild(xmlNodePtr parent, xmlNsPtr ns, - const xmlChar *name, const xmlChar *content) { - xmlNodePtr cur, prev; - - if (parent == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewTextChild : parent == NULL\n"); -#endif - return(NULL); - } - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewTextChild : name == NULL\n"); -#endif - return(NULL); - } - - /* - * Allocate a new node - */ - if (parent->type == XML_ELEMENT_NODE) { - if (ns == NULL) - cur = xmlNewDocRawNode(parent->doc, parent->ns, name, content); - else - cur = xmlNewDocRawNode(parent->doc, ns, name, content); - } else if ((parent->type == XML_DOCUMENT_NODE) || - (parent->type == XML_HTML_DOCUMENT_NODE)) { - if (ns == NULL) - cur = xmlNewDocRawNode((xmlDocPtr) parent, NULL, name, content); - else - cur = xmlNewDocRawNode((xmlDocPtr) parent, ns, name, content); - } else if (parent->type == XML_DOCUMENT_FRAG_NODE) { - cur = xmlNewDocRawNode( parent->doc, ns, name, content); - } else { - return(NULL); - } - if (cur == NULL) return(NULL); - - /* - * add the new element at the end of the children list. - */ - cur->type = XML_ELEMENT_NODE; - cur->parent = parent; - cur->doc = parent->doc; - if (parent->children == NULL) { - parent->children = cur; - parent->last = cur; - } else { - prev = parent->last; - prev->next = cur; - cur->prev = prev; - parent->last = cur; - } - - return(cur); -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlNewCharRef: - * @doc: the document - * @name: the char ref string, starting with # or "&# ... ;" - * - * Creation of a new character reference node. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewCharRef(xmlDocPtr doc, const xmlChar *name) { - xmlNodePtr cur; - - if (name == NULL) - return(NULL); - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building character reference"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_ENTITY_REF_NODE; - - cur->doc = doc; - if (name[0] == '&') { - int len; - name++; - len = xmlStrlen(name); - if (name[len - 1] == ';') - cur->name = xmlStrndup(name, len - 1); - else - cur->name = xmlStrndup(name, len); - } else - cur->name = xmlStrdup(name); - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(cur); - return(cur); -} - -/** - * xmlNewReference: - * @doc: the document - * @name: the reference name, or the reference string with & and ; - * - * Creation of a new reference node. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewReference(xmlDocPtr doc, const xmlChar *name) { - xmlNodePtr cur; - xmlEntityPtr ent; - - if (name == NULL) - return(NULL); - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building reference"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_ENTITY_REF_NODE; - - cur->doc = doc; - if (name[0] == '&') { - int len; - name++; - len = xmlStrlen(name); - if (name[len - 1] == ';') - cur->name = xmlStrndup(name, len - 1); - else - cur->name = xmlStrndup(name, len); - } else - cur->name = xmlStrdup(name); - - ent = xmlGetDocEntity(doc, cur->name); - if (ent != NULL) { - cur->content = ent->content; - /* - * The parent pointer in entity is a DTD pointer and thus is NOT - * updated. Not sure if this is 100% correct. - * -George - */ - cur->children = (xmlNodePtr) ent; - cur->last = (xmlNodePtr) ent; - } - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(cur); - return(cur); -} - -/** - * xmlNewDocText: - * @doc: the document - * @content: the text content - * - * Creation of a new text node within a document. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewDocText(xmlDocPtr doc, const xmlChar *content) { - xmlNodePtr cur; - - cur = xmlNewText(content); - if (cur != NULL) cur->doc = doc; - return(cur); -} - -/** - * xmlNewTextLen: - * @content: the text content - * @len: the text len. - * - * Creation of a new text node with an extra parameter for the content's length - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewTextLen(const xmlChar *content, int len) { - xmlNodePtr cur; - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building text"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_TEXT_NODE; - - cur->name = xmlStringText; - if (content != NULL) { - cur->content = xmlStrndup(content, len); - } - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(cur); - return(cur); -} - -/** - * xmlNewDocTextLen: - * @doc: the document - * @content: the text content - * @len: the text len. - * - * Creation of a new text node with an extra content length parameter. The - * text node pertain to a given document. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewDocTextLen(xmlDocPtr doc, const xmlChar *content, int len) { - xmlNodePtr cur; - - cur = xmlNewTextLen(content, len); - if (cur != NULL) cur->doc = doc; - return(cur); -} - -/** - * xmlNewComment: - * @content: the comment content - * - * Creation of a new node containing a comment. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewComment(const xmlChar *content) { - xmlNodePtr cur; - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building comment"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_COMMENT_NODE; - - cur->name = xmlStringComment; - if (content != NULL) { - cur->content = xmlStrdup(content); - } - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(cur); - return(cur); -} - -/** - * xmlNewCDataBlock: - * @doc: the document - * @content: the CDATA block content content - * @len: the length of the block - * - * Creation of a new node containing a CDATA block. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewCDataBlock(xmlDocPtr doc, const xmlChar *content, int len) { - xmlNodePtr cur; - - /* - * Allocate a new node and fill the fields. - */ - cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (cur == NULL) { - xmlTreeErrMemory("building CDATA"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNode)); - cur->type = XML_CDATA_SECTION_NODE; - cur->doc = doc; - - if (content != NULL) { - cur->content = xmlStrndup(content, len); - } - - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue(cur); - return(cur); -} - -/** - * xmlNewDocComment: - * @doc: the document - * @content: the comment content - * - * Creation of a new node containing a comment within a document. - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewDocComment(xmlDocPtr doc, const xmlChar *content) { - xmlNodePtr cur; - - cur = xmlNewComment(content); - if (cur != NULL) cur->doc = doc; - return(cur); -} - -/** - * xmlSetTreeDoc: - * @tree: the top element - * @doc: the document - * - * update all nodes under the tree to point to the right document - */ -void -xmlSetTreeDoc(xmlNodePtr tree, xmlDocPtr doc) { - xmlAttrPtr prop; - - if (tree == NULL) - return; - if (tree->doc != doc) { - if(tree->type == XML_ELEMENT_NODE) { - prop = tree->properties; - while (prop != NULL) { - prop->doc = doc; - xmlSetListDoc(prop->children, doc); - prop = prop->next; - } - } - if (tree->children != NULL) - xmlSetListDoc(tree->children, doc); - tree->doc = doc; - } -} - -/** - * xmlSetListDoc: - * @list: the first element - * @doc: the document - * - * update all nodes in the list to point to the right document - */ -void -xmlSetListDoc(xmlNodePtr list, xmlDocPtr doc) { - xmlNodePtr cur; - - if (list == NULL) - return; - cur = list; - while (cur != NULL) { - if (cur->doc != doc) - xmlSetTreeDoc(cur, doc); - cur = cur->next; - } -} - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlNewChild: - * @parent: the parent node - * @ns: a namespace if any - * @name: the name of the child - * @content: the XML content of the child if any. - * - * Creation of a new child element, added at the end of @parent children list. - * @ns and @content parameters are optional (NULL). If @ns is NULL, the newly - * created element inherits the namespace of @parent. If @content is non NULL, - * a child list containing the TEXTs and ENTITY_REFs node will be created. - * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity - * references. XML special chars must be escaped first by using - * xmlEncodeEntitiesReentrant(), or xmlNewTextChild() should be used. - * - * Returns a pointer to the new node object. - */ -xmlNodePtr -xmlNewChild(xmlNodePtr parent, xmlNsPtr ns, - const xmlChar *name, const xmlChar *content) { - xmlNodePtr cur, prev; - - if (parent == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewChild : parent == NULL\n"); -#endif - return(NULL); - } - - if (name == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewChild : name == NULL\n"); -#endif - return(NULL); - } - - /* - * Allocate a new node - */ - if (parent->type == XML_ELEMENT_NODE) { - if (ns == NULL) - cur = xmlNewDocNode(parent->doc, parent->ns, name, content); - else - cur = xmlNewDocNode(parent->doc, ns, name, content); - } else if ((parent->type == XML_DOCUMENT_NODE) || - (parent->type == XML_HTML_DOCUMENT_NODE)) { - if (ns == NULL) - cur = xmlNewDocNode((xmlDocPtr) parent, NULL, name, content); - else - cur = xmlNewDocNode((xmlDocPtr) parent, ns, name, content); - } else if (parent->type == XML_DOCUMENT_FRAG_NODE) { - cur = xmlNewDocNode( parent->doc, ns, name, content); - } else { - return(NULL); - } - if (cur == NULL) return(NULL); - - /* - * add the new element at the end of the children list. - */ - cur->type = XML_ELEMENT_NODE; - cur->parent = parent; - cur->doc = parent->doc; - if (parent->children == NULL) { - parent->children = cur; - parent->last = cur; - } else { - prev = parent->last; - prev->next = cur; - cur->prev = prev; - parent->last = cur; - } - - return(cur); -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlAddPropSibling: - * @prev: the attribute to which @prop is added after - * @cur: the base attribute passed to calling function - * @prop: the new attribute - * - * Add a new attribute after @prev using @cur as base attribute. - * When inserting before @cur, @prev is passed as @cur->prev. - * When inserting after @cur, @prev is passed as @cur. - * If an existing attribute is found it is detroyed prior to adding @prop. - * - * Returns the attribute being inserted or NULL in case of error. - */ -static xmlNodePtr -xmlAddPropSibling(xmlNodePtr prev, xmlNodePtr cur, xmlNodePtr prop) { - xmlAttrPtr attr; - - if (cur->type != XML_ATTRIBUTE_NODE) - return(NULL); - - /* check if an attribute with the same name exists */ - if (prop->ns == NULL) - attr = xmlHasNsProp(cur->parent, prop->name, NULL); - else - attr = xmlHasNsProp(cur->parent, prop->name, prop->ns->href); - - if (prop->doc != cur->doc) { - xmlSetTreeDoc(prop, cur->doc); - } - prop->parent = cur->parent; - prop->prev = prev; - if (prev != NULL) { - prop->next = prev->next; - prev->next = prop; - if (prop->next) - prop->next->prev = prop; - } else { - prop->next = cur; - cur->prev = prop; - } - if (prop->prev == NULL && prop->parent != NULL) - prop->parent->properties = (xmlAttrPtr) prop; - if ((attr != NULL) && (attr->type != XML_ATTRIBUTE_DECL)) { - /* different instance, destroy it (attributes must be unique) */ - xmlRemoveProp((xmlAttrPtr) attr); - } - return prop; -} - -/** - * xmlAddNextSibling: - * @cur: the child node - * @elem: the new node - * - * Add a new node @elem as the next sibling of @cur - * If the new node was already inserted in a document it is - * first unlinked from its existing context. - * As a result of text merging @elem may be freed. - * If the new node is ATTRIBUTE, it is added into properties instead of children. - * If there is an attribute with equal name, it is first destroyed. - * - * Returns the new node or NULL in case of error. - */ -xmlNodePtr -xmlAddNextSibling(xmlNodePtr cur, xmlNodePtr elem) { - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddNextSibling : cur == NULL\n"); -#endif - return(NULL); - } - if (elem == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddNextSibling : elem == NULL\n"); -#endif - return(NULL); - } - - if (cur == elem) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddNextSibling : cur == elem\n"); -#endif - return(NULL); - } - - xmlUnlinkNode(elem); - - if (elem->type == XML_TEXT_NODE) { - if (cur->type == XML_TEXT_NODE) { - xmlNodeAddContent(cur, elem->content); - xmlFreeNode(elem); - return(cur); - } - if ((cur->next != NULL) && (cur->next->type == XML_TEXT_NODE) && - (cur->name == cur->next->name)) { - xmlChar *tmp; - - tmp = xmlStrdup(elem->content); - tmp = xmlStrcat(tmp, cur->next->content); - xmlNodeSetContent(cur->next, tmp); - xmlFree(tmp); - xmlFreeNode(elem); - return(cur->next); - } - } else if (elem->type == XML_ATTRIBUTE_NODE) { - return xmlAddPropSibling(cur, cur, elem); - } - - if (elem->doc != cur->doc) { - xmlSetTreeDoc(elem, cur->doc); - } - elem->parent = cur->parent; - elem->prev = cur; - elem->next = cur->next; - cur->next = elem; - if (elem->next != NULL) - elem->next->prev = elem; - if ((elem->parent != NULL) && (elem->parent->last == cur)) - elem->parent->last = elem; - return(elem); -} - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ - defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlAddPrevSibling: - * @cur: the child node - * @elem: the new node - * - * Add a new node @elem as the previous sibling of @cur - * merging adjacent TEXT nodes (@elem may be freed) - * If the new node was already inserted in a document it is - * first unlinked from its existing context. - * If the new node is ATTRIBUTE, it is added into properties instead of children. - * If there is an attribute with equal name, it is first destroyed. - * - * Returns the new node or NULL in case of error. - */ -xmlNodePtr -xmlAddPrevSibling(xmlNodePtr cur, xmlNodePtr elem) { - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddPrevSibling : cur == NULL\n"); -#endif - return(NULL); - } - if (elem == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddPrevSibling : elem == NULL\n"); -#endif - return(NULL); - } - - if (cur == elem) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddPrevSibling : cur == elem\n"); -#endif - return(NULL); - } - - xmlUnlinkNode(elem); - - if (elem->type == XML_TEXT_NODE) { - if (cur->type == XML_TEXT_NODE) { - xmlChar *tmp; - - tmp = xmlStrdup(elem->content); - tmp = xmlStrcat(tmp, cur->content); - xmlNodeSetContent(cur, tmp); - xmlFree(tmp); - xmlFreeNode(elem); - return(cur); - } - if ((cur->prev != NULL) && (cur->prev->type == XML_TEXT_NODE) && - (cur->name == cur->prev->name)) { - xmlNodeAddContent(cur->prev, elem->content); - xmlFreeNode(elem); - return(cur->prev); - } - } else if (elem->type == XML_ATTRIBUTE_NODE) { - return xmlAddPropSibling(cur->prev, cur, elem); - } - - if (elem->doc != cur->doc) { - xmlSetTreeDoc(elem, cur->doc); - } - elem->parent = cur->parent; - elem->next = cur; - elem->prev = cur->prev; - cur->prev = elem; - if (elem->prev != NULL) - elem->prev->next = elem; - if ((elem->parent != NULL) && (elem->parent->children == cur)) { - elem->parent->children = elem; - } - return(elem); -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlAddSibling: - * @cur: the child node - * @elem: the new node - * - * Add a new element @elem to the list of siblings of @cur - * merging adjacent TEXT nodes (@elem may be freed) - * If the new element was already inserted in a document it is - * first unlinked from its existing context. - * - * Returns the new element or NULL in case of error. - */ -xmlNodePtr -xmlAddSibling(xmlNodePtr cur, xmlNodePtr elem) { - xmlNodePtr parent; - - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddSibling : cur == NULL\n"); -#endif - return(NULL); - } - - if (elem == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddSibling : elem == NULL\n"); -#endif - return(NULL); - } - - /* - * Constant time is we can rely on the ->parent->last to find - * the last sibling. - */ - if ((cur->type != XML_ATTRIBUTE_NODE) && (cur->parent != NULL) && - (cur->parent->children != NULL) && - (cur->parent->last != NULL) && - (cur->parent->last->next == NULL)) { - cur = cur->parent->last; - } else { - while (cur->next != NULL) cur = cur->next; - } - - xmlUnlinkNode(elem); - - if ((cur->type == XML_TEXT_NODE) && (elem->type == XML_TEXT_NODE) && - (cur->name == elem->name)) { - xmlNodeAddContent(cur, elem->content); - xmlFreeNode(elem); - return(cur); - } else if (elem->type == XML_ATTRIBUTE_NODE) { - return xmlAddPropSibling(cur, cur, elem); - } - - if (elem->doc != cur->doc) { - xmlSetTreeDoc(elem, cur->doc); - } - parent = cur->parent; - elem->prev = cur; - elem->next = NULL; - elem->parent = parent; - cur->next = elem; - if (parent != NULL) - parent->last = elem; - - return(elem); -} - -/** - * xmlAddChildList: - * @parent: the parent node - * @cur: the first node in the list - * - * Add a list of node at the end of the child list of the parent - * merging adjacent TEXT nodes (@cur may be freed) - * - * Returns the last child or NULL in case of error. - */ -xmlNodePtr -xmlAddChildList(xmlNodePtr parent, xmlNodePtr cur) { - xmlNodePtr prev; - - if (parent == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddChildList : parent == NULL\n"); -#endif - return(NULL); - } - - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddChildList : child == NULL\n"); -#endif - return(NULL); - } - - if ((cur->doc != NULL) && (parent->doc != NULL) && - (cur->doc != parent->doc)) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "Elements moved to a different document\n"); -#endif - } - - /* - * add the first element at the end of the children list. - */ - - if (parent->children == NULL) { - parent->children = cur; - } else { - /* - * If cur and parent->last both are TEXT nodes, then merge them. - */ - if ((cur->type == XML_TEXT_NODE) && - (parent->last->type == XML_TEXT_NODE) && - (cur->name == parent->last->name)) { - xmlNodeAddContent(parent->last, cur->content); - /* - * if it's the only child, nothing more to be done. - */ - if (cur->next == NULL) { - xmlFreeNode(cur); - return(parent->last); - } - prev = cur; - cur = cur->next; - xmlFreeNode(prev); - } - prev = parent->last; - prev->next = cur; - cur->prev = prev; - } - while (cur->next != NULL) { - cur->parent = parent; - if (cur->doc != parent->doc) { - xmlSetTreeDoc(cur, parent->doc); - } - cur = cur->next; - } - cur->parent = parent; - cur->doc = parent->doc; /* the parent may not be linked to a doc ! */ - parent->last = cur; - - return(cur); -} - -/** - * xmlAddChild: - * @parent: the parent node - * @cur: the child node - * - * Add a new node to @parent, at the end of the child (or property) list - * merging adjacent TEXT nodes (in which case @cur is freed) - * If the new node is ATTRIBUTE, it is added into properties instead of children. - * If there is an attribute with equal name, it is first destroyed. - * - * Returns the child or NULL in case of error. - */ -xmlNodePtr -xmlAddChild(xmlNodePtr parent, xmlNodePtr cur) { - xmlNodePtr prev; - - if (parent == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddChild : parent == NULL\n"); -#endif - return(NULL); - } - - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddChild : child == NULL\n"); -#endif - return(NULL); - } - - if (parent == cur) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlAddChild : parent == cur\n"); -#endif - return(NULL); - } - /* - * If cur is a TEXT node, merge its content with adjacent TEXT nodes - * cur is then freed. - */ - if (cur->type == XML_TEXT_NODE) { - if ((parent->type == XML_TEXT_NODE) && - (parent->content != NULL) && - (parent->name == cur->name)) { - xmlNodeAddContent(parent, cur->content); - xmlFreeNode(cur); - return(parent); - } - if ((parent->last != NULL) && (parent->last->type == XML_TEXT_NODE) && - (parent->last->name == cur->name) && - (parent->last != cur)) { - xmlNodeAddContent(parent->last, cur->content); - xmlFreeNode(cur); - return(parent->last); - } - } - - /* - * add the new element at the end of the children list. - */ - prev = cur->parent; - cur->parent = parent; - if (cur->doc != parent->doc) { - xmlSetTreeDoc(cur, parent->doc); - } - /* this check prevents a loop on tree-traversions if a developer - * tries to add a node to its parent multiple times - */ - if (prev == parent) - return(cur); - - /* - * Coalescing - */ - if ((parent->type == XML_TEXT_NODE) && - (parent->content != NULL) && - (parent != cur)) { - xmlNodeAddContent(parent, cur->content); - xmlFreeNode(cur); - return(parent); - } - if (cur->type == XML_ATTRIBUTE_NODE) { - if (parent->type != XML_ELEMENT_NODE) - return(NULL); - if (parent->properties == NULL) { - parent->properties = (xmlAttrPtr) cur; - } else { - /* check if an attribute with the same name exists */ - xmlAttrPtr lastattr; - - if (cur->ns == NULL) - lastattr = xmlHasNsProp(parent, cur->name, NULL); - else - lastattr = xmlHasNsProp(parent, cur->name, cur->ns->href); - if ((lastattr != NULL) && (lastattr != (xmlAttrPtr) cur) && (lastattr->type != XML_ATTRIBUTE_DECL)) { - /* different instance, destroy it (attributes must be unique) */ - xmlUnlinkNode((xmlNodePtr) lastattr); - xmlFreeProp(lastattr); - } - if (lastattr == (xmlAttrPtr) cur) - return(cur); - /* find the end */ - lastattr = parent->properties; - while (lastattr->next != NULL) { - lastattr = lastattr->next; - } - lastattr->next = (xmlAttrPtr) cur; - ((xmlAttrPtr) cur)->prev = lastattr; - } - } else { - if (parent->children == NULL) { - parent->children = cur; - parent->last = cur; - } else { - prev = parent->last; - prev->next = cur; - cur->prev = prev; - parent->last = cur; - } - } - return(cur); -} - -/** - * xmlGetLastChild: - * @parent: the parent node - * - * Search the last child of a node. - * Returns the last child or NULL if none. - */ -xmlNodePtr -xmlGetLastChild(xmlNodePtr parent) { - if (parent == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlGetLastChild : parent == NULL\n"); -#endif - return(NULL); - } - return(parent->last); -} - -/** - * xmlFreeNodeList: - * @cur: the first node in the list - * - * Free a node and all its siblings, this is a recursive behaviour, all - * the children are freed too. - */ -void -xmlFreeNodeList(xmlNodePtr cur) { - xmlNodePtr next; - xmlDictPtr dict = NULL; - - if (cur == NULL) return; - if (cur->type == XML_NAMESPACE_DECL) { - xmlFreeNsList((xmlNsPtr) cur); - return; - } - if ((cur->type == XML_DOCUMENT_NODE) || -#ifdef LIBXML_DOCB_ENABLED - (cur->type == XML_DOCB_DOCUMENT_NODE) || -#endif - (cur->type == XML_HTML_DOCUMENT_NODE)) { - xmlFreeDoc((xmlDocPtr) cur); - return; - } - if (cur->doc != NULL) dict = cur->doc->dict; - while (cur != NULL) { - next = cur->next; - if (cur->type != XML_DTD_NODE) { - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue(cur); - - if ((cur->children != NULL) && - (cur->type != XML_ENTITY_REF_NODE)) - xmlFreeNodeList(cur->children); - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) && - (cur->properties != NULL)) - xmlFreePropList(cur->properties); - if ((cur->type != XML_ELEMENT_NODE) && - (cur->type != XML_XINCLUDE_START) && - (cur->type != XML_XINCLUDE_END) && - (cur->type != XML_ENTITY_REF_NODE) && - (cur->content != (xmlChar *) &(cur->properties))) { - DICT_FREE(cur->content) - } - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) && - (cur->nsDef != NULL)) - xmlFreeNsList(cur->nsDef); - - /* - * When a node is a text node or a comment, it uses a global static - * variable for the name of the node. - * Otherwise the node name might come from the document's - * dictionnary - */ - if ((cur->name != NULL) && - (cur->type != XML_TEXT_NODE) && - (cur->type != XML_COMMENT_NODE)) - DICT_FREE(cur->name) - xmlFree(cur); - } - cur = next; - } -} - -/** - * xmlFreeNode: - * @cur: the node - * - * Free a node, this is a recursive behaviour, all the children are freed too. - * This doesn't unlink the child from the list, use xmlUnlinkNode() first. - */ -void -xmlFreeNode(xmlNodePtr cur) { - xmlDictPtr dict = NULL; - - if (cur == NULL) return; - - /* use xmlFreeDtd for DTD nodes */ - if (cur->type == XML_DTD_NODE) { - xmlFreeDtd((xmlDtdPtr) cur); - return; - } - if (cur->type == XML_NAMESPACE_DECL) { - xmlFreeNs((xmlNsPtr) cur); - return; - } - if (cur->type == XML_ATTRIBUTE_NODE) { - xmlFreeProp((xmlAttrPtr) cur); - return; - } - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue(cur); - - if (cur->doc != NULL) dict = cur->doc->dict; - - if ((cur->children != NULL) && - (cur->type != XML_ENTITY_REF_NODE)) - xmlFreeNodeList(cur->children); - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) && - (cur->properties != NULL)) - xmlFreePropList(cur->properties); - if ((cur->type != XML_ELEMENT_NODE) && - (cur->content != NULL) && - (cur->type != XML_ENTITY_REF_NODE) && - (cur->type != XML_XINCLUDE_END) && - (cur->type != XML_XINCLUDE_START) && - (cur->content != (xmlChar *) &(cur->properties))) { - DICT_FREE(cur->content) - } - - /* - * When a node is a text node or a comment, it uses a global static - * variable for the name of the node. - * Otherwise the node name might come from the document's dictionnary - */ - if ((cur->name != NULL) && - (cur->type != XML_TEXT_NODE) && - (cur->type != XML_COMMENT_NODE)) - DICT_FREE(cur->name) - - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) && - (cur->nsDef != NULL)) - xmlFreeNsList(cur->nsDef); - xmlFree(cur); -} - -/** - * xmlUnlinkNode: - * @cur: the node - * - * Unlink a node from it's current context, the node is not freed - */ -void -xmlUnlinkNode(xmlNodePtr cur) { - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlUnlinkNode : node == NULL\n"); -#endif - return; - } - if (cur->type == XML_DTD_NODE) { - xmlDocPtr doc; - doc = cur->doc; - if (doc != NULL) { - if (doc->intSubset == (xmlDtdPtr) cur) - doc->intSubset = NULL; - if (doc->extSubset == (xmlDtdPtr) cur) - doc->extSubset = NULL; - } - } - if (cur->parent != NULL) { - xmlNodePtr parent; - parent = cur->parent; - if (cur->type == XML_ATTRIBUTE_NODE) { - if (parent->properties == (xmlAttrPtr) cur) - parent->properties = ((xmlAttrPtr) cur)->next; - } else { - if (parent->children == cur) - parent->children = cur->next; - if (parent->last == cur) - parent->last = cur->prev; - } - cur->parent = NULL; - } - if (cur->next != NULL) - cur->next->prev = cur->prev; - if (cur->prev != NULL) - cur->prev->next = cur->next; - cur->next = cur->prev = NULL; -} - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) -/** - * xmlReplaceNode: - * @old: the old node - * @cur: the node - * - * Unlink the old node from its current context, prune the new one - * at the same place. If @cur was already inserted in a document it is - * first unlinked from its existing context. - * - * Returns the @old node - */ -xmlNodePtr -xmlReplaceNode(xmlNodePtr old, xmlNodePtr cur) { - if (old == cur) return(NULL); - if ((old == NULL) || (old->parent == NULL)) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlReplaceNode : old == NULL or without parent\n"); -#endif - return(NULL); - } - if (cur == NULL) { - xmlUnlinkNode(old); - return(old); - } - if (cur == old) { - return(old); - } - if ((old->type==XML_ATTRIBUTE_NODE) && (cur->type!=XML_ATTRIBUTE_NODE)) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlReplaceNode : Trying to replace attribute node with other node type\n"); -#endif - return(old); - } - if ((cur->type==XML_ATTRIBUTE_NODE) && (old->type!=XML_ATTRIBUTE_NODE)) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlReplaceNode : Trying to replace a non-attribute node with attribute node\n"); -#endif - return(old); - } - xmlUnlinkNode(cur); - xmlSetTreeDoc(cur, old->doc); - cur->parent = old->parent; - cur->next = old->next; - if (cur->next != NULL) - cur->next->prev = cur; - cur->prev = old->prev; - if (cur->prev != NULL) - cur->prev->next = cur; - if (cur->parent != NULL) { - if (cur->type == XML_ATTRIBUTE_NODE) { - if (cur->parent->properties == (xmlAttrPtr)old) - cur->parent->properties = ((xmlAttrPtr) cur); - } else { - if (cur->parent->children == old) - cur->parent->children = cur; - if (cur->parent->last == old) - cur->parent->last = cur; - } - } - old->next = old->prev = NULL; - old->parent = NULL; - return(old); -} -#endif /* LIBXML_TREE_ENABLED */ - -/************************************************************************ - * * - * Copy operations * - * * - ************************************************************************/ - -/** - * xmlCopyNamespace: - * @cur: the namespace - * - * Do a copy of the namespace. - * - * Returns: a new #xmlNsPtr, or NULL in case of error. - */ -xmlNsPtr -xmlCopyNamespace(xmlNsPtr cur) { - xmlNsPtr ret; - - if (cur == NULL) return(NULL); - switch (cur->type) { - case XML_LOCAL_NAMESPACE: - ret = xmlNewNs(NULL, cur->href, cur->prefix); - break; - default: -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlCopyNamespace: invalid type %d\n", cur->type); -#endif - return(NULL); - } - return(ret); -} - -/** - * xmlCopyNamespaceList: - * @cur: the first namespace - * - * Do a copy of an namespace list. - * - * Returns: a new #xmlNsPtr, or NULL in case of error. - */ -xmlNsPtr -xmlCopyNamespaceList(xmlNsPtr cur) { - xmlNsPtr ret = NULL; - xmlNsPtr p = NULL,q; - - while (cur != NULL) { - q = xmlCopyNamespace(cur); - if (p == NULL) { - ret = p = q; - } else { - p->next = q; - p = q; - } - cur = cur->next; - } - return(ret); -} - -static xmlNodePtr -xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent); - -static xmlAttrPtr -xmlCopyPropInternal(xmlDocPtr doc, xmlNodePtr target, xmlAttrPtr cur) { - xmlAttrPtr ret; - - if (cur == NULL) return(NULL); - if (target != NULL) - ret = xmlNewDocProp(target->doc, cur->name, NULL); - else if (doc != NULL) - ret = xmlNewDocProp(doc, cur->name, NULL); - else if (cur->parent != NULL) - ret = xmlNewDocProp(cur->parent->doc, cur->name, NULL); - else if (cur->children != NULL) - ret = xmlNewDocProp(cur->children->doc, cur->name, NULL); - else - ret = xmlNewDocProp(NULL, cur->name, NULL); - if (ret == NULL) return(NULL); - ret->parent = target; - - if ((cur->ns != NULL) && (target != NULL)) { - xmlNsPtr ns; - - ns = xmlSearchNs(target->doc, target, cur->ns->prefix); - if (ns == NULL) { - /* - * Humm, we are copying an element whose namespace is defined - * out of the new tree scope. Search it in the original tree - * and add it at the top of the new tree - */ - ns = xmlSearchNs(cur->doc, cur->parent, cur->ns->prefix); - if (ns != NULL) { - xmlNodePtr root = target; - xmlNodePtr pred = NULL; - - while (root->parent != NULL) { - pred = root; - root = root->parent; - } - if (root == (xmlNodePtr) target->doc) { - /* correct possibly cycling above the document elt */ - root = pred; - } - ret->ns = xmlNewNs(root, ns->href, ns->prefix); - } - } else { - /* - * we have to find something appropriate here since - * we cant be sure, that the namespce we found is identified - * by the prefix - */ - if (xmlStrEqual(ns->href, cur->ns->href)) { - /* this is the nice case */ - ret->ns = ns; - } else { - /* - * we are in trouble: we need a new reconcilied namespace. - * This is expensive - */ - ret->ns = xmlNewReconciliedNs(target->doc, target, cur->ns); - } - } - - } else - ret->ns = NULL; - - if (cur->children != NULL) { - xmlNodePtr tmp; - - ret->children = xmlStaticCopyNodeList(cur->children, ret->doc, (xmlNodePtr) ret); - ret->last = NULL; - tmp = ret->children; - while (tmp != NULL) { - /* tmp->parent = (xmlNodePtr)ret; */ - if (tmp->next == NULL) - ret->last = tmp; - tmp = tmp->next; - } - } - /* - * Try to handle IDs - */ - if ((target!= NULL) && (cur!= NULL) && - (target->doc != NULL) && (cur->doc != NULL) && - (cur->doc->ids != NULL) && (cur->parent != NULL)) { - if (xmlIsID(cur->doc, cur->parent, cur)) { - xmlChar *id; - - id = xmlNodeListGetString(cur->doc, cur->children, 1); - if (id != NULL) { - xmlAddID(NULL, target->doc, id, ret); - xmlFree(id); - } - } - } - return(ret); -} - -/** - * xmlCopyProp: - * @target: the element where the attribute will be grafted - * @cur: the attribute - * - * Do a copy of the attribute. - * - * Returns: a new #xmlAttrPtr, or NULL in case of error. - */ -xmlAttrPtr -xmlCopyProp(xmlNodePtr target, xmlAttrPtr cur) { - return xmlCopyPropInternal(NULL, target, cur); -} - -/** - * xmlCopyPropList: - * @target: the element where the attributes will be grafted - * @cur: the first attribute - * - * Do a copy of an attribute list. - * - * Returns: a new #xmlAttrPtr, or NULL in case of error. - */ -xmlAttrPtr -xmlCopyPropList(xmlNodePtr target, xmlAttrPtr cur) { - xmlAttrPtr ret = NULL; - xmlAttrPtr p = NULL,q; - - while (cur != NULL) { - q = xmlCopyProp(target, cur); - if (q == NULL) - return(NULL); - if (p == NULL) { - ret = p = q; - } else { - p->next = q; - q->prev = p; - p = q; - } - cur = cur->next; - } - return(ret); -} - -/* - * NOTE about the CopyNode operations ! - * - * They are split into external and internal parts for one - * tricky reason: namespaces. Doing a direct copy of a node - * say RPM:Copyright without changing the namespace pointer to - * something else can produce stale links. One way to do it is - * to keep a reference counter but this doesn't work as soon - * as one move the element or the subtree out of the scope of - * the existing namespace. The actual solution seems to add - * a copy of the namespace at the top of the copied tree if - * not available in the subtree. - * Hence two functions, the public front-end call the inner ones - * The argument "recursive" normally indicates a recursive copy - * of the node with values 0 (no) and 1 (yes). For XInclude, - * however, we allow a value of 2 to indicate copy properties and - * namespace info, but don't recurse on children. - */ - -static xmlNodePtr -xmlStaticCopyNode(const xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent, - int extended) { - xmlNodePtr ret; - - if (node == NULL) return(NULL); - switch (node->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ELEMENT_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - break; - case XML_ATTRIBUTE_NODE: - return((xmlNodePtr) xmlCopyPropInternal(doc, parent, (xmlAttrPtr) node)); - case XML_NAMESPACE_DECL: - return((xmlNodePtr) xmlCopyNamespaceList((xmlNsPtr) node)); - - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif -#ifdef LIBXML_TREE_ENABLED - return((xmlNodePtr) xmlCopyDoc((xmlDocPtr) node, extended)); -#endif /* LIBXML_TREE_ENABLED */ - case XML_DOCUMENT_TYPE_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - return(NULL); - } - - /* - * Allocate a new node and fill the fields. - */ - ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (ret == NULL) { - xmlTreeErrMemory("copying node"); - return(NULL); - } - memset(ret, 0, sizeof(xmlNode)); - ret->type = node->type; - - ret->doc = doc; - ret->parent = parent; - if (node->name == xmlStringText) - ret->name = xmlStringText; - else if (node->name == xmlStringTextNoenc) - ret->name = xmlStringTextNoenc; - else if (node->name == xmlStringComment) - ret->name = xmlStringComment; - else if (node->name != NULL) { - if ((doc != NULL) && (doc->dict != NULL)) - ret->name = xmlDictLookup(doc->dict, node->name, -1); - else - ret->name = xmlStrdup(node->name); - } - if ((node->type != XML_ELEMENT_NODE) && - (node->content != NULL) && - (node->type != XML_ENTITY_REF_NODE) && - (node->type != XML_XINCLUDE_END) && - (node->type != XML_XINCLUDE_START)) { - ret->content = xmlStrdup(node->content); - }else{ - if (node->type == XML_ELEMENT_NODE) - ret->line = node->line; - } - if (parent != NULL) { - xmlNodePtr tmp; - - /* - * this is a tricky part for the node register thing: - * in case ret does get coalesced in xmlAddChild - * the deregister-node callback is called; so we register ret now already - */ - if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) - xmlRegisterNodeDefaultValue((xmlNodePtr)ret); - - tmp = xmlAddChild(parent, ret); - /* node could have coalesced */ - if (tmp != ret) - return(tmp); - } - - if (!extended) - goto out; - if ((node->type == XML_ELEMENT_NODE) && (node->nsDef != NULL)) - ret->nsDef = xmlCopyNamespaceList(node->nsDef); - - if (node->ns != NULL) { - xmlNsPtr ns; - - ns = xmlSearchNs(doc, ret, node->ns->prefix); - if (ns == NULL) { - /* - * Humm, we are copying an element whose namespace is defined - * out of the new tree scope. Search it in the original tree - * and add it at the top of the new tree - */ - ns = xmlSearchNs(node->doc, node, node->ns->prefix); - if (ns != NULL) { - xmlNodePtr root = ret; - - while (root->parent != NULL) root = root->parent; - ret->ns = xmlNewNs(root, ns->href, ns->prefix); - } - } else { - /* - * reference the existing namespace definition in our own tree. - */ - ret->ns = ns; - } - } - if ((node->type == XML_ELEMENT_NODE) && (node->properties != NULL)) - ret->properties = xmlCopyPropList(ret, node->properties); - if (node->type == XML_ENTITY_REF_NODE) { - if ((doc == NULL) || (node->doc != doc)) { - /* - * The copied node will go into a separate document, so - * to avoid dangling references to the ENTITY_DECL node - * we cannot keep the reference. Try to find it in the - * target document. - */ - ret->children = (xmlNodePtr) xmlGetDocEntity(doc, ret->name); - } else { - ret->children = node->children; - } - ret->last = ret->children; - } else if ((node->children != NULL) && (extended != 2)) { - ret->children = xmlStaticCopyNodeList(node->children, doc, ret); - UPDATE_LAST_CHILD_AND_PARENT(ret) - } - -out: - /* if parent != NULL we already registered the node above */ - if ((parent == NULL) && - ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))) - xmlRegisterNodeDefaultValue((xmlNodePtr)ret); - return(ret); -} - -static xmlNodePtr -xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent) { - xmlNodePtr ret = NULL; - xmlNodePtr p = NULL,q; - - while (node != NULL) { -#ifdef LIBXML_TREE_ENABLED - if (node->type == XML_DTD_NODE ) { - if (doc == NULL) { - node = node->next; - continue; - } - if (doc->intSubset == NULL) { - q = (xmlNodePtr) xmlCopyDtd( (xmlDtdPtr) node ); - q->doc = doc; - q->parent = parent; - doc->intSubset = (xmlDtdPtr) q; - xmlAddChild(parent, q); - } else { - q = (xmlNodePtr) doc->intSubset; - xmlAddChild(parent, q); - } - } else -#endif /* LIBXML_TREE_ENABLED */ - q = xmlStaticCopyNode(node, doc, parent, 1); - if (ret == NULL) { - q->prev = NULL; - ret = p = q; - } else if (p != q) { - /* the test is required if xmlStaticCopyNode coalesced 2 text nodes */ - p->next = q; - q->prev = p; - p = q; - } - node = node->next; - } - return(ret); -} - -/** - * xmlCopyNode: - * @node: the node - * @extended: if 1 do a recursive copy (properties, namespaces and children - * when applicable) - * if 2 copy properties and namespaces (when applicable) - * - * Do a copy of the node. - * - * Returns: a new #xmlNodePtr, or NULL in case of error. - */ -xmlNodePtr -xmlCopyNode(const xmlNodePtr node, int extended) { - xmlNodePtr ret; - - ret = xmlStaticCopyNode(node, NULL, NULL, extended); - return(ret); -} - -/** - * xmlDocCopyNode: - * @node: the node - * @doc: the document - * @extended: if 1 do a recursive copy (properties, namespaces and children - * when applicable) - * if 2 copy properties and namespaces (when applicable) - * - * Do a copy of the node to a given document. - * - * Returns: a new #xmlNodePtr, or NULL in case of error. - */ -xmlNodePtr -xmlDocCopyNode(const xmlNodePtr node, xmlDocPtr doc, int extended) { - xmlNodePtr ret; - - ret = xmlStaticCopyNode(node, doc, NULL, extended); - return(ret); -} - -/** - * xmlDocCopyNodeList: - * @doc: the target document - * @node: the first node in the list. - * - * Do a recursive copy of the node list. - * - * Returns: a new #xmlNodePtr, or NULL in case of error. - */ -xmlNodePtr xmlDocCopyNodeList(xmlDocPtr doc, const xmlNodePtr node) { - xmlNodePtr ret = xmlStaticCopyNodeList(node, doc, NULL); - return(ret); -} - -/** - * xmlCopyNodeList: - * @node: the first node in the list. - * - * Do a recursive copy of the node list. - * Use xmlDocCopyNodeList() if possible to ensure string interning. - * - * Returns: a new #xmlNodePtr, or NULL in case of error. - */ -xmlNodePtr xmlCopyNodeList(const xmlNodePtr node) { - xmlNodePtr ret = xmlStaticCopyNodeList(node, NULL, NULL); - return(ret); -} - -#if defined(LIBXML_TREE_ENABLED) -/** - * xmlCopyDtd: - * @dtd: the dtd - * - * Do a copy of the dtd. - * - * Returns: a new #xmlDtdPtr, or NULL in case of error. - */ -xmlDtdPtr -xmlCopyDtd(xmlDtdPtr dtd) { - xmlDtdPtr ret; - xmlNodePtr cur, p = NULL, q; - - if (dtd == NULL) return(NULL); - ret = xmlNewDtd(NULL, dtd->name, dtd->ExternalID, dtd->SystemID); - if (ret == NULL) return(NULL); - if (dtd->entities != NULL) - ret->entities = (void *) xmlCopyEntitiesTable( - (xmlEntitiesTablePtr) dtd->entities); - if (dtd->notations != NULL) - ret->notations = (void *) xmlCopyNotationTable( - (xmlNotationTablePtr) dtd->notations); - if (dtd->elements != NULL) - ret->elements = (void *) xmlCopyElementTable( - (xmlElementTablePtr) dtd->elements); - if (dtd->attributes != NULL) - ret->attributes = (void *) xmlCopyAttributeTable( - (xmlAttributeTablePtr) dtd->attributes); - if (dtd->pentities != NULL) - ret->pentities = (void *) xmlCopyEntitiesTable( - (xmlEntitiesTablePtr) dtd->pentities); - - cur = dtd->children; - while (cur != NULL) { - q = NULL; - - if (cur->type == XML_ENTITY_DECL) { - xmlEntityPtr tmp = (xmlEntityPtr) cur; - switch (tmp->etype) { - case XML_INTERNAL_GENERAL_ENTITY: - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - q = (xmlNodePtr) xmlGetEntityFromDtd(ret, tmp->name); - break; - case XML_INTERNAL_PARAMETER_ENTITY: - case XML_EXTERNAL_PARAMETER_ENTITY: - q = (xmlNodePtr) - xmlGetParameterEntityFromDtd(ret, tmp->name); - break; - case XML_INTERNAL_PREDEFINED_ENTITY: - break; - } - } else if (cur->type == XML_ELEMENT_DECL) { - xmlElementPtr tmp = (xmlElementPtr) cur; - q = (xmlNodePtr) - xmlGetDtdQElementDesc(ret, tmp->name, tmp->prefix); - } else if (cur->type == XML_ATTRIBUTE_DECL) { - xmlAttributePtr tmp = (xmlAttributePtr) cur; - q = (xmlNodePtr) - xmlGetDtdQAttrDesc(ret, tmp->elem, tmp->name, tmp->prefix); - } else if (cur->type == XML_COMMENT_NODE) { - q = xmlCopyNode(cur, 0); - } - - if (q == NULL) { - cur = cur->next; - continue; - } - - if (p == NULL) - ret->children = q; - else - p->next = q; - - q->prev = p; - q->parent = (xmlNodePtr) ret; - q->next = NULL; - ret->last = q; - p = q; - cur = cur->next; - } - - return(ret); -} -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlCopyDoc: - * @doc: the document - * @recursive: if not zero do a recursive copy. - * - * Do a copy of the document info. If recursive, the content tree will - * be copied too as well as DTD, namespaces and entities. - * - * Returns: a new #xmlDocPtr, or NULL in case of error. - */ -xmlDocPtr -xmlCopyDoc(xmlDocPtr doc, int recursive) { - xmlDocPtr ret; - - if (doc == NULL) return(NULL); - ret = xmlNewDoc(doc->version); - if (ret == NULL) return(NULL); - if (doc->name != NULL) - ret->name = xmlMemStrdup(doc->name); - if (doc->encoding != NULL) - ret->encoding = xmlStrdup(doc->encoding); - if (doc->URL != NULL) - ret->URL = xmlStrdup(doc->URL); - ret->charset = doc->charset; - ret->compression = doc->compression; - ret->standalone = doc->standalone; - if (!recursive) return(ret); - - ret->last = NULL; - ret->children = NULL; -#ifdef LIBXML_TREE_ENABLED - if (doc->intSubset != NULL) { - ret->intSubset = xmlCopyDtd(doc->intSubset); - xmlSetTreeDoc((xmlNodePtr)ret->intSubset, ret); - ret->intSubset->parent = ret; - } -#endif - if (doc->oldNs != NULL) - ret->oldNs = xmlCopyNamespaceList(doc->oldNs); - if (doc->children != NULL) { - xmlNodePtr tmp; - - ret->children = xmlStaticCopyNodeList(doc->children, ret, - (xmlNodePtr)ret); - ret->last = NULL; - tmp = ret->children; - while (tmp != NULL) { - if (tmp->next == NULL) - ret->last = tmp; - tmp = tmp->next; - } - } - return(ret); -} -#endif /* LIBXML_TREE_ENABLED */ - -/************************************************************************ - * * - * Content access functions * - * * - ************************************************************************/ - -/** - * xmlGetLineNo: - * @node: valid node - * - * Get line number of @node. This requires activation of this option - * before invoking the parser by calling xmlLineNumbersDefault(1) - * - * Returns the line number if successful, -1 otherwise - */ -long -xmlGetLineNo(xmlNodePtr node) -{ - long result = -1; - - if (!node) - return result; - if ((node->type == XML_ELEMENT_NODE) || - (node->type == XML_TEXT_NODE) || - (node->type == XML_COMMENT_NODE) || - (node->type == XML_PI_NODE)) - result = (long) node->line; - else if ((node->prev != NULL) && - ((node->prev->type == XML_ELEMENT_NODE) || - (node->prev->type == XML_TEXT_NODE) || - (node->prev->type == XML_COMMENT_NODE) || - (node->prev->type == XML_PI_NODE))) - result = xmlGetLineNo(node->prev); - else if ((node->parent != NULL) && - (node->parent->type == XML_ELEMENT_NODE)) - result = xmlGetLineNo(node->parent); - - return result; -} - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) -/** - * xmlGetNodePath: - * @node: a node - * - * Build a structure based Path for the given node - * - * Returns the new path or NULL in case of error. The caller must free - * the returned string - */ -xmlChar * -xmlGetNodePath(xmlNodePtr node) -{ - xmlNodePtr cur, tmp, next; - xmlChar *buffer = NULL, *temp; - size_t buf_len; - xmlChar *buf; - const char *sep; - const char *name; - char nametemp[100]; - int occur = 0, generic; - - if (node == NULL) - return (NULL); - - buf_len = 500; - buffer = (xmlChar *) xmlMallocAtomic(buf_len * sizeof(xmlChar)); - if (buffer == NULL) { - xmlTreeErrMemory("getting node path"); - return (NULL); - } - buf = (xmlChar *) xmlMallocAtomic(buf_len * sizeof(xmlChar)); - if (buf == NULL) { - xmlTreeErrMemory("getting node path"); - xmlFree(buffer); - return (NULL); - } - - buffer[0] = 0; - cur = node; - do { - name = ""; - sep = "?"; - occur = 0; - if ((cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - if (buffer[0] == '/') - break; - sep = "/"; - next = NULL; - } else if (cur->type == XML_ELEMENT_NODE) { - generic = 0; - sep = "/"; - name = (const char *) cur->name; - if (cur->ns) { - if (cur->ns->prefix != NULL) { - snprintf(nametemp, sizeof(nametemp) - 1, "%s:%s", - (char *)cur->ns->prefix, (char *)cur->name); - nametemp[sizeof(nametemp) - 1] = 0; - name = nametemp; - } else { - /* - * We cannot express named elements in the default - * namespace, so use "*". - */ - generic = 1; - name = "*"; - } - } - next = cur->parent; - - /* - * Thumbler index computation - * TODO: the ocurence test seems bogus for namespaced names - */ - tmp = cur->prev; - while (tmp != NULL) { - if ((tmp->type == XML_ELEMENT_NODE) && - (generic || - (xmlStrEqual(cur->name, tmp->name) && - ((tmp->ns == cur->ns) || - ((tmp->ns != NULL) && (cur->ns != NULL) && - (xmlStrEqual(cur->ns->prefix, tmp->ns->prefix))))))) - occur++; - tmp = tmp->prev; - } - if (occur == 0) { - tmp = cur->next; - while (tmp != NULL && occur == 0) { - if ((tmp->type == XML_ELEMENT_NODE) && - (generic || - (xmlStrEqual(cur->name, tmp->name) && - ((tmp->ns == cur->ns) || - ((tmp->ns != NULL) && (cur->ns != NULL) && - (xmlStrEqual(cur->ns->prefix, tmp->ns->prefix))))))) - occur++; - tmp = tmp->next; - } - if (occur != 0) - occur = 1; - } else - occur++; - } else if (cur->type == XML_COMMENT_NODE) { - sep = "/"; - name = "comment()"; - next = cur->parent; - - /* - * Thumbler index computation - */ - tmp = cur->prev; - while (tmp != NULL) { - if (tmp->type == XML_COMMENT_NODE) - occur++; - tmp = tmp->prev; - } - if (occur == 0) { - tmp = cur->next; - while (tmp != NULL && occur == 0) { - if (tmp->type == XML_COMMENT_NODE) - occur++; - tmp = tmp->next; - } - if (occur != 0) - occur = 1; - } else - occur++; - } else if ((cur->type == XML_TEXT_NODE) || - (cur->type == XML_CDATA_SECTION_NODE)) { - sep = "/"; - name = "text()"; - next = cur->parent; - - /* - * Thumbler index computation - */ - tmp = cur->prev; - while (tmp != NULL) { - if ((tmp->type == XML_TEXT_NODE) || - (tmp->type == XML_CDATA_SECTION_NODE)) - occur++; - tmp = tmp->prev; - } - /* - * Evaluate if this is the only text- or CDATA-section-node; - * if yes, then we'll get "text()", otherwise "text()[1]". - */ - if (occur == 0) { - tmp = cur->next; - while (tmp != NULL) { - if ((tmp->type == XML_TEXT_NODE) || - (tmp->type == XML_CDATA_SECTION_NODE)) - { - occur = 1; - break; - } - tmp = tmp->next; - } - } else - occur++; - } else if (cur->type == XML_PI_NODE) { - sep = "/"; - snprintf(nametemp, sizeof(nametemp) - 1, - "processing-instruction('%s')", (char *)cur->name); - nametemp[sizeof(nametemp) - 1] = 0; - name = nametemp; - - next = cur->parent; - - /* - * Thumbler index computation - */ - tmp = cur->prev; - while (tmp != NULL) { - if ((tmp->type == XML_PI_NODE) && - (xmlStrEqual(cur->name, tmp->name))) - occur++; - tmp = tmp->prev; - } - if (occur == 0) { - tmp = cur->next; - while (tmp != NULL && occur == 0) { - if ((tmp->type == XML_PI_NODE) && - (xmlStrEqual(cur->name, tmp->name))) - occur++; - tmp = tmp->next; - } - if (occur != 0) - occur = 1; - } else - occur++; - - } else if (cur->type == XML_ATTRIBUTE_NODE) { - sep = "/@"; - name = (const char *) (((xmlAttrPtr) cur)->name); - if (cur->ns) { - if (cur->ns->prefix != NULL) - snprintf(nametemp, sizeof(nametemp) - 1, "%s:%s", - (char *)cur->ns->prefix, (char *)cur->name); - else - snprintf(nametemp, sizeof(nametemp) - 1, "%s", - (char *)cur->name); - nametemp[sizeof(nametemp) - 1] = 0; - name = nametemp; - } - next = ((xmlAttrPtr) cur)->parent; - } else { - next = cur->parent; - } - - /* - * Make sure there is enough room - */ - if (xmlStrlen(buffer) + sizeof(nametemp) + 20 > buf_len) { - buf_len = - 2 * buf_len + xmlStrlen(buffer) + sizeof(nametemp) + 20; - temp = (xmlChar *) xmlRealloc(buffer, buf_len); - if (temp == NULL) { - xmlTreeErrMemory("getting node path"); - xmlFree(buf); - xmlFree(buffer); - return (NULL); - } - buffer = temp; - temp = (xmlChar *) xmlRealloc(buf, buf_len); - if (temp == NULL) { - xmlTreeErrMemory("getting node path"); - xmlFree(buf); - xmlFree(buffer); - return (NULL); - } - buf = temp; - } - if (occur == 0) - snprintf((char *) buf, buf_len, "%s%s%s", - sep, name, (char *) buffer); - else - snprintf((char *) buf, buf_len, "%s%s[%d]%s", - sep, name, occur, (char *) buffer); - snprintf((char *) buffer, buf_len, "%s", (char *)buf); - cur = next; - } while (cur != NULL); - xmlFree(buf); - return (buffer); -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlDocGetRootElement: - * @doc: the document - * - * Get the root element of the document (doc->children is a list - * containing possibly comments, PIs, etc ...). - * - * Returns the #xmlNodePtr for the root or NULL - */ -xmlNodePtr -xmlDocGetRootElement(xmlDocPtr doc) { - xmlNodePtr ret; - - if (doc == NULL) return(NULL); - ret = doc->children; - while (ret != NULL) { - if (ret->type == XML_ELEMENT_NODE) - return(ret); - ret = ret->next; - } - return(ret); -} - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) -/** - * xmlDocSetRootElement: - * @doc: the document - * @root: the new document root element, if root is NULL no action is taken, - * to remove a node from a document use xmlUnlinkNode(root) instead. - * - * Set the root element of the document (doc->children is a list - * containing possibly comments, PIs, etc ...). - * - * Returns the old root element if any was found, NULL if root was NULL - */ -xmlNodePtr -xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root) { - xmlNodePtr old = NULL; - - if (doc == NULL) return(NULL); - if (root == NULL) - return(NULL); - xmlUnlinkNode(root); - xmlSetTreeDoc(root, doc); - root->parent = (xmlNodePtr) doc; - old = doc->children; - while (old != NULL) { - if (old->type == XML_ELEMENT_NODE) - break; - old = old->next; - } - if (old == NULL) { - if (doc->children == NULL) { - doc->children = root; - doc->last = root; - } else { - xmlAddSibling(doc->children, root); - } - } else { - xmlReplaceNode(old, root); - } - return(old); -} -#endif - -#if defined(LIBXML_TREE_ENABLED) -/** - * xmlNodeSetLang: - * @cur: the node being changed - * @lang: the language description - * - * Set the language of a node, i.e. the values of the xml:lang - * attribute. - */ -void -xmlNodeSetLang(xmlNodePtr cur, const xmlChar *lang) { - xmlNsPtr ns; - - if (cur == NULL) return; - switch(cur->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_HTML_DOCUMENT_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_PI_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_NAMESPACE_DECL: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - return; - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - break; - } - ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE); - if (ns == NULL) - return; - xmlSetNsProp(cur, ns, BAD_CAST "lang", lang); -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlNodeGetLang: - * @cur: the node being checked - * - * Searches the language of a node, i.e. the values of the xml:lang - * attribute or the one carried by the nearest ancestor. - * - * Returns a pointer to the lang value, or NULL if not found - * It's up to the caller to free the memory with xmlFree(). - */ -xmlChar * -xmlNodeGetLang(xmlNodePtr cur) { - xmlChar *lang; - - while (cur != NULL) { - lang = xmlGetNsProp(cur, BAD_CAST "lang", XML_XML_NAMESPACE); - if (lang != NULL) - return(lang); - cur = cur->parent; - } - return(NULL); -} - - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlNodeSetSpacePreserve: - * @cur: the node being changed - * @val: the xml:space value ("0": default, 1: "preserve") - * - * Set (or reset) the space preserving behaviour of a node, i.e. the - * value of the xml:space attribute. - */ -void -xmlNodeSetSpacePreserve(xmlNodePtr cur, int val) { - xmlNsPtr ns; - - if (cur == NULL) return; - switch(cur->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_HTML_DOCUMENT_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_PI_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return; - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - break; - } - ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE); - if (ns == NULL) - return; - switch (val) { - case 0: - xmlSetNsProp(cur, ns, BAD_CAST "space", BAD_CAST "default"); - break; - case 1: - xmlSetNsProp(cur, ns, BAD_CAST "space", BAD_CAST "preserve"); - break; - } -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlNodeGetSpacePreserve: - * @cur: the node being checked - * - * Searches the space preserving behaviour of a node, i.e. the values - * of the xml:space attribute or the one carried by the nearest - * ancestor. - * - * Returns -1 if xml:space is not inherited, 0 if "default", 1 if "preserve" - */ -int -xmlNodeGetSpacePreserve(xmlNodePtr cur) { - xmlChar *space; - - while (cur != NULL) { - space = xmlGetNsProp(cur, BAD_CAST "space", XML_XML_NAMESPACE); - if (space != NULL) { - if (xmlStrEqual(space, BAD_CAST "preserve")) { - xmlFree(space); - return(1); - } - if (xmlStrEqual(space, BAD_CAST "default")) { - xmlFree(space); - return(0); - } - xmlFree(space); - } - cur = cur->parent; - } - return(-1); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlNodeSetName: - * @cur: the node being changed - * @name: the new tag name - * - * Set (or reset) the name of a node. - */ -void -xmlNodeSetName(xmlNodePtr cur, const xmlChar *name) { - xmlDocPtr doc; - xmlDictPtr dict; - - if (cur == NULL) return; - if (name == NULL) return; - switch(cur->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_HTML_DOCUMENT_NODE: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return; - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - case XML_PI_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_DTD_NODE: - case XML_DOCUMENT_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - break; - } - doc = cur->doc; - if (doc != NULL) - dict = doc->dict; - else - dict = NULL; - if (dict != NULL) { - if ((cur->name != NULL) && (!xmlDictOwns(dict, cur->name))) - xmlFree((xmlChar *) cur->name); - cur->name = xmlDictLookup(dict, name, -1); - } else { - if (cur->name != NULL) xmlFree((xmlChar *) cur->name); - cur->name = xmlStrdup(name); - } -} -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) -/** - * xmlNodeSetBase: - * @cur: the node being changed - * @uri: the new base URI - * - * Set (or reset) the base URI of a node, i.e. the value of the - * xml:base attribute. - */ -void -xmlNodeSetBase(xmlNodePtr cur, const xmlChar* uri) { - xmlNsPtr ns; - const xmlChar* fixed; - - if (cur == NULL) return; - switch(cur->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_PI_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - return; - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - break; - case XML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_HTML_DOCUMENT_NODE: { - xmlDocPtr doc = (xmlDocPtr) cur; - - if (doc->URL != NULL) - xmlFree((xmlChar *) doc->URL); - if (uri == NULL) - doc->URL = NULL; - else - doc->URL = xmlPathToURI(uri); - return; - } - } - - ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE); - if (ns == NULL) - return; - fixed = xmlPathToURI(uri); - if (fixed != NULL) { - xmlSetNsProp(cur, ns, BAD_CAST "base", fixed); - xmlFree((xmlChar*)fixed); - } else { - xmlSetNsProp(cur, ns, BAD_CAST "base", uri); - } -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlNodeGetBase: - * @doc: the document the node pertains to - * @cur: the node being checked - * - * Searches for the BASE URL. The code should work on both XML - * and HTML document even if base mechanisms are completely different. - * It returns the base as defined in RFC 2396 sections - * 5.1.1. Base URI within Document Content - * and - * 5.1.2. Base URI from the Encapsulating Entity - * However it does not return the document base (5.1.3), use - * xmlDocumentGetBase() for this - * - * Returns a pointer to the base URL, or NULL if not found - * It's up to the caller to free the memory with xmlFree(). - */ -xmlChar * -xmlNodeGetBase(xmlDocPtr doc, xmlNodePtr cur) { - xmlChar *oldbase = NULL; - xmlChar *base, *newbase; - - if ((cur == NULL) && (doc == NULL)) - return(NULL); - if (doc == NULL) doc = cur->doc; - if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) { - cur = doc->children; - while ((cur != NULL) && (cur->name != NULL)) { - if (cur->type != XML_ELEMENT_NODE) { - cur = cur->next; - continue; - } - if (!xmlStrcasecmp(cur->name, BAD_CAST "html")) { - cur = cur->children; - continue; - } - if (!xmlStrcasecmp(cur->name, BAD_CAST "head")) { - cur = cur->children; - continue; - } - if (!xmlStrcasecmp(cur->name, BAD_CAST "base")) { - return(xmlGetProp(cur, BAD_CAST "href")); - } - cur = cur->next; - } - return(NULL); - } - while (cur != NULL) { - if (cur->type == XML_ENTITY_DECL) { - xmlEntityPtr ent = (xmlEntityPtr) cur; - return(xmlStrdup(ent->URI)); - } - if (cur->type == XML_ELEMENT_NODE) { - base = xmlGetNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE); - if (base != NULL) { - if (oldbase != NULL) { - newbase = xmlBuildURI(oldbase, base); - if (newbase != NULL) { - xmlFree(oldbase); - xmlFree(base); - oldbase = newbase; - } else { - xmlFree(oldbase); - xmlFree(base); - return(NULL); - } - } else { - oldbase = base; - } - if ((!xmlStrncmp(oldbase, BAD_CAST "http://", 7)) || - (!xmlStrncmp(oldbase, BAD_CAST "ftp://", 6)) || - (!xmlStrncmp(oldbase, BAD_CAST "urn:", 4))) - return(oldbase); - } - } - cur = cur->parent; - } - if ((doc != NULL) && (doc->URL != NULL)) { - if (oldbase == NULL) - return(xmlStrdup(doc->URL)); - newbase = xmlBuildURI(oldbase, doc->URL); - xmlFree(oldbase); - return(newbase); - } - return(oldbase); -} - -/** - * xmlNodeBufGetContent: - * @buffer: a buffer - * @cur: the node being read - * - * Read the value of a node @cur, this can be either the text carried - * directly by this node if it's a TEXT node or the aggregate string - * of the values carried by this node child's (TEXT and ENTITY_REF). - * Entity references are substituted. - * Fills up the buffer @buffer with this value - * - * Returns 0 in case of success and -1 in case of error. - */ -int -xmlNodeBufGetContent(xmlBufferPtr buffer, xmlNodePtr cur) -{ - if ((cur == NULL) || (buffer == NULL)) return(-1); - switch (cur->type) { - case XML_CDATA_SECTION_NODE: - case XML_TEXT_NODE: - xmlBufferCat(buffer, cur->content); - break; - case XML_DOCUMENT_FRAG_NODE: - case XML_ELEMENT_NODE:{ - xmlNodePtr tmp = cur; - - while (tmp != NULL) { - switch (tmp->type) { - case XML_CDATA_SECTION_NODE: - case XML_TEXT_NODE: - if (tmp->content != NULL) - xmlBufferCat(buffer, tmp->content); - break; - case XML_ENTITY_REF_NODE: - xmlNodeBufGetContent(buffer, tmp); - break; - default: - break; - } - /* - * Skip to next node - */ - if (tmp->children != NULL) { - if (tmp->children->type != XML_ENTITY_DECL) { - tmp = tmp->children; - continue; - } - } - if (tmp == cur) - break; - - if (tmp->next != NULL) { - tmp = tmp->next; - continue; - } - - do { - tmp = tmp->parent; - if (tmp == NULL) - break; - if (tmp == cur) { - tmp = NULL; - break; - } - if (tmp->next != NULL) { - tmp = tmp->next; - break; - } - } while (tmp != NULL); - } - break; - } - case XML_ATTRIBUTE_NODE:{ - xmlAttrPtr attr = (xmlAttrPtr) cur; - xmlNodePtr tmp = attr->children; - - while (tmp != NULL) { - if (tmp->type == XML_TEXT_NODE) - xmlBufferCat(buffer, tmp->content); - else - xmlNodeBufGetContent(buffer, tmp); - tmp = tmp->next; - } - break; - } - case XML_COMMENT_NODE: - case XML_PI_NODE: - xmlBufferCat(buffer, cur->content); - break; - case XML_ENTITY_REF_NODE:{ - xmlEntityPtr ent; - xmlNodePtr tmp; - - /* lookup entity declaration */ - ent = xmlGetDocEntity(cur->doc, cur->name); - if (ent == NULL) - return(-1); - - /* an entity content can be any "well balanced chunk", - * i.e. the result of the content [43] production: - * http://www.w3.org/TR/REC-xml#NT-content - * -> we iterate through child nodes and recursive call - * xmlNodeGetContent() which handles all possible node types */ - tmp = ent->children; - while (tmp) { - xmlNodeBufGetContent(buffer, tmp); - tmp = tmp->next; - } - break; - } - case XML_ENTITY_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - break; - case XML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_HTML_DOCUMENT_NODE: - cur = cur->children; - while (cur!= NULL) { - if ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_TEXT_NODE) || - (cur->type == XML_CDATA_SECTION_NODE)) { - xmlNodeBufGetContent(buffer, cur); - } - cur = cur->next; - } - break; - case XML_NAMESPACE_DECL: - xmlBufferCat(buffer, ((xmlNsPtr) cur)->href); - break; - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - break; - } - return(0); -} -/** - * xmlNodeGetContent: - * @cur: the node being read - * - * Read the value of a node, this can be either the text carried - * directly by this node if it's a TEXT node or the aggregate string - * of the values carried by this node child's (TEXT and ENTITY_REF). - * Entity references are substituted. - * Returns a new #xmlChar * or NULL if no content is available. - * It's up to the caller to free the memory with xmlFree(). - */ -xmlChar * -xmlNodeGetContent(xmlNodePtr cur) -{ - if (cur == NULL) - return (NULL); - switch (cur->type) { - case XML_DOCUMENT_FRAG_NODE: - case XML_ELEMENT_NODE:{ - xmlBufferPtr buffer; - xmlChar *ret; - - buffer = xmlBufferCreateSize(64); - if (buffer == NULL) - return (NULL); - xmlNodeBufGetContent(buffer, cur); - ret = buffer->content; - buffer->content = NULL; - xmlBufferFree(buffer); - return (ret); - } - case XML_ATTRIBUTE_NODE: - return(xmlGetPropNodeValueInternal((xmlAttrPtr) cur)); - case XML_COMMENT_NODE: - case XML_PI_NODE: - if (cur->content != NULL) - return (xmlStrdup(cur->content)); - return (NULL); - case XML_ENTITY_REF_NODE:{ - xmlEntityPtr ent; - xmlBufferPtr buffer; - xmlChar *ret; - - /* lookup entity declaration */ - ent = xmlGetDocEntity(cur->doc, cur->name); - if (ent == NULL) - return (NULL); - - buffer = xmlBufferCreate(); - if (buffer == NULL) - return (NULL); - - xmlNodeBufGetContent(buffer, cur); - - ret = buffer->content; - buffer->content = NULL; - xmlBufferFree(buffer); - return (ret); - } - case XML_ENTITY_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - return (NULL); - case XML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_HTML_DOCUMENT_NODE: { - xmlBufferPtr buffer; - xmlChar *ret; - - buffer = xmlBufferCreate(); - if (buffer == NULL) - return (NULL); - - xmlNodeBufGetContent(buffer, (xmlNodePtr) cur); - - ret = buffer->content; - buffer->content = NULL; - xmlBufferFree(buffer); - return (ret); - } - case XML_NAMESPACE_DECL: { - xmlChar *tmp; - - tmp = xmlStrdup(((xmlNsPtr) cur)->href); - return (tmp); - } - case XML_ELEMENT_DECL: - /* TODO !!! */ - return (NULL); - case XML_ATTRIBUTE_DECL: - /* TODO !!! */ - return (NULL); - case XML_ENTITY_DECL: - /* TODO !!! */ - return (NULL); - case XML_CDATA_SECTION_NODE: - case XML_TEXT_NODE: - if (cur->content != NULL) - return (xmlStrdup(cur->content)); - return (NULL); - } - return (NULL); -} - -/** - * xmlNodeSetContent: - * @cur: the node being modified - * @content: the new value of the content - * - * Replace the content of a node. - */ -void -xmlNodeSetContent(xmlNodePtr cur, const xmlChar *content) { - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNodeSetContent : node == NULL\n"); -#endif - return; - } - switch (cur->type) { - case XML_DOCUMENT_FRAG_NODE: - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - if (cur->children != NULL) xmlFreeNodeList(cur->children); - cur->children = xmlStringGetNodeList(cur->doc, content); - UPDATE_LAST_CHILD_AND_PARENT(cur) - break; - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - if ((cur->content != NULL) && - (cur->content != (xmlChar *) &(cur->properties))) { - if (!((cur->doc != NULL) && (cur->doc->dict != NULL) && - (xmlDictOwns(cur->doc->dict, cur->content)))) - xmlFree(cur->content); - } - if (cur->children != NULL) xmlFreeNodeList(cur->children); - cur->last = cur->children = NULL; - if (content != NULL) { - cur->content = xmlStrdup(content); - } else - cur->content = NULL; - cur->properties = NULL; - cur->nsDef = NULL; - break; - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - break; - case XML_NOTATION_NODE: - break; - case XML_DTD_NODE: - break; - case XML_NAMESPACE_DECL: - break; - case XML_ELEMENT_DECL: - /* TODO !!! */ - break; - case XML_ATTRIBUTE_DECL: - /* TODO !!! */ - break; - case XML_ENTITY_DECL: - /* TODO !!! */ - break; - } -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlNodeSetContentLen: - * @cur: the node being modified - * @content: the new value of the content - * @len: the size of @content - * - * Replace the content of a node. - */ -void -xmlNodeSetContentLen(xmlNodePtr cur, const xmlChar *content, int len) { - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNodeSetContentLen : node == NULL\n"); -#endif - return; - } - switch (cur->type) { - case XML_DOCUMENT_FRAG_NODE: - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - if (cur->children != NULL) xmlFreeNodeList(cur->children); - cur->children = xmlStringLenGetNodeList(cur->doc, content, len); - UPDATE_LAST_CHILD_AND_PARENT(cur) - break; - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_NOTATION_NODE: - if ((cur->content != NULL) && - (cur->content != (xmlChar *) &(cur->properties))) { - if (!((cur->doc != NULL) && (cur->doc->dict != NULL) && - (xmlDictOwns(cur->doc->dict, cur->content)))) - xmlFree(cur->content); - } - if (cur->children != NULL) xmlFreeNodeList(cur->children); - cur->children = cur->last = NULL; - if (content != NULL) { - cur->content = xmlStrndup(content, len); - } else - cur->content = NULL; - cur->properties = NULL; - cur->nsDef = NULL; - break; - case XML_DOCUMENT_NODE: - case XML_DTD_NODE: - case XML_HTML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - break; - case XML_ELEMENT_DECL: - /* TODO !!! */ - break; - case XML_ATTRIBUTE_DECL: - /* TODO !!! */ - break; - case XML_ENTITY_DECL: - /* TODO !!! */ - break; - } -} -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlNodeAddContentLen: - * @cur: the node being modified - * @content: extra content - * @len: the size of @content - * - * Append the extra substring to the node content. - */ -void -xmlNodeAddContentLen(xmlNodePtr cur, const xmlChar *content, int len) { - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNodeAddContentLen : node == NULL\n"); -#endif - return; - } - if (len <= 0) return; - switch (cur->type) { - case XML_DOCUMENT_FRAG_NODE: - case XML_ELEMENT_NODE: { - xmlNodePtr last, newNode, tmp; - - last = cur->last; - newNode = xmlNewTextLen(content, len); - if (newNode != NULL) { - tmp = xmlAddChild(cur, newNode); - if (tmp != newNode) - return; - if ((last != NULL) && (last->next == newNode)) { - xmlTextMerge(last, newNode); - } - } - break; - } - case XML_ATTRIBUTE_NODE: - break; - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_NOTATION_NODE: - if (content != NULL) { - if ((cur->content == (xmlChar *) &(cur->properties)) || - ((cur->doc != NULL) && (cur->doc->dict != NULL) && - xmlDictOwns(cur->doc->dict, cur->content))) { - cur->content = xmlStrncatNew(cur->content, content, len); - cur->properties = NULL; - cur->nsDef = NULL; - break; - } - cur->content = xmlStrncat(cur->content, content, len); - } - case XML_DOCUMENT_NODE: - case XML_DTD_NODE: - case XML_HTML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - break; - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - break; - } -} - -/** - * xmlNodeAddContent: - * @cur: the node being modified - * @content: extra content - * - * Append the extra substring to the node content. - */ -void -xmlNodeAddContent(xmlNodePtr cur, const xmlChar *content) { - int len; - - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNodeAddContent : node == NULL\n"); -#endif - return; - } - if (content == NULL) return; - len = xmlStrlen(content); - xmlNodeAddContentLen(cur, content, len); -} - -/** - * xmlTextMerge: - * @first: the first text node - * @second: the second text node being merged - * - * Merge two text nodes into one - * Returns the first text node augmented - */ -xmlNodePtr -xmlTextMerge(xmlNodePtr first, xmlNodePtr second) { - if (first == NULL) return(second); - if (second == NULL) return(first); - if (first->type != XML_TEXT_NODE) return(first); - if (second->type != XML_TEXT_NODE) return(first); - if (second->name != first->name) - return(first); - xmlNodeAddContent(first, second->content); - xmlUnlinkNode(second); - xmlFreeNode(second); - return(first); -} - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlGetNsList: - * @doc: the document - * @node: the current node - * - * Search all the namespace applying to a given element. - * Returns an NULL terminated array of all the #xmlNsPtr found - * that need to be freed by the caller or NULL if no - * namespace if defined - */ -xmlNsPtr * -xmlGetNsList(xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr node) -{ - xmlNsPtr cur; - xmlNsPtr *ret = NULL; - int nbns = 0; - int maxns = 10; - int i; - - while (node != NULL) { - if (node->type == XML_ELEMENT_NODE) { - cur = node->nsDef; - while (cur != NULL) { - if (ret == NULL) { - ret = - (xmlNsPtr *) xmlMalloc((maxns + 1) * - sizeof(xmlNsPtr)); - if (ret == NULL) { - xmlTreeErrMemory("getting namespace list"); - return (NULL); - } - ret[nbns] = NULL; - } - for (i = 0; i < nbns; i++) { - if ((cur->prefix == ret[i]->prefix) || - (xmlStrEqual(cur->prefix, ret[i]->prefix))) - break; - } - if (i >= nbns) { - if (nbns >= maxns) { - maxns *= 2; - ret = (xmlNsPtr *) xmlRealloc(ret, - (maxns + - 1) * - sizeof(xmlNsPtr)); - if (ret == NULL) { - xmlTreeErrMemory("getting namespace list"); - return (NULL); - } - } - ret[nbns++] = cur; - ret[nbns] = NULL; - } - - cur = cur->next; - } - } - node = node->parent; - } - return (ret); -} -#endif /* LIBXML_TREE_ENABLED */ - -/* -* xmlTreeEnsureXMLDecl: -* @doc: the doc -* -* Ensures that there is an XML namespace declaration on the doc. -* -* Returns the XML ns-struct or NULL on API and internal errors. -*/ -static xmlNsPtr -xmlTreeEnsureXMLDecl(xmlDocPtr doc) -{ - if (doc == NULL) - return (NULL); - if (doc->oldNs != NULL) - return (doc->oldNs); - { - xmlNsPtr ns; - ns = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); - if (ns == NULL) { - xmlTreeErrMemory( - "allocating the XML namespace"); - return (NULL); - } - memset(ns, 0, sizeof(xmlNs)); - ns->type = XML_LOCAL_NAMESPACE; - ns->href = xmlStrdup(XML_XML_NAMESPACE); - ns->prefix = xmlStrdup((const xmlChar *)"xml"); - doc->oldNs = ns; - return (ns); - } -} - -/** - * xmlSearchNs: - * @doc: the document - * @node: the current node - * @nameSpace: the namespace prefix - * - * Search a Ns registered under a given name space for a document. - * recurse on the parents until it finds the defined namespace - * or return NULL otherwise. - * @nameSpace can be NULL, this is a search for the default namespace. - * We don't allow to cross entities boundaries. If you don't declare - * the namespace within those you will be in troubles !!! A warning - * is generated to cover this case. - * - * Returns the namespace pointer or NULL. - */ -xmlNsPtr -xmlSearchNs(xmlDocPtr doc, xmlNodePtr node, const xmlChar *nameSpace) { - - xmlNsPtr cur; - xmlNodePtr orig = node; - - if (node == NULL) return(NULL); - if ((nameSpace != NULL) && - (xmlStrEqual(nameSpace, (const xmlChar *)"xml"))) { - if ((doc == NULL) && (node->type == XML_ELEMENT_NODE)) { - /* - * The XML-1.0 namespace is normally held on the root - * element. In this case exceptionally create it on the - * node element. - */ - cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); - if (cur == NULL) { - xmlTreeErrMemory("searching namespace"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNs)); - cur->type = XML_LOCAL_NAMESPACE; - cur->href = xmlStrdup(XML_XML_NAMESPACE); - cur->prefix = xmlStrdup((const xmlChar *)"xml"); - cur->next = node->nsDef; - node->nsDef = cur; - return(cur); - } - if (doc == NULL) { - doc = node->doc; - if (doc == NULL) - return(NULL); - } - /* - * Return the XML namespace declaration held by the doc. - */ - if (doc->oldNs == NULL) - return(xmlTreeEnsureXMLDecl(doc)); - else - return(doc->oldNs); - } - while (node != NULL) { - if ((node->type == XML_ENTITY_REF_NODE) || - (node->type == XML_ENTITY_NODE) || - (node->type == XML_ENTITY_DECL)) - return(NULL); - if (node->type == XML_ELEMENT_NODE) { - cur = node->nsDef; - while (cur != NULL) { - if ((cur->prefix == NULL) && (nameSpace == NULL) && - (cur->href != NULL)) - return(cur); - if ((cur->prefix != NULL) && (nameSpace != NULL) && - (cur->href != NULL) && - (xmlStrEqual(cur->prefix, nameSpace))) - return(cur); - cur = cur->next; - } - if (orig != node) { - cur = node->ns; - if (cur != NULL) { - if ((cur->prefix == NULL) && (nameSpace == NULL) && - (cur->href != NULL)) - return(cur); - if ((cur->prefix != NULL) && (nameSpace != NULL) && - (cur->href != NULL) && - (xmlStrEqual(cur->prefix, nameSpace))) - return(cur); - } - } - } - node = node->parent; - } - return(NULL); -} - -/** - * xmlNsInScope: - * @doc: the document - * @node: the current node - * @ancestor: the ancestor carrying the namespace - * @prefix: the namespace prefix - * - * Verify that the given namespace held on @ancestor is still in scope - * on node. - * - * Returns 1 if true, 0 if false and -1 in case of error. - */ -static int -xmlNsInScope(xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr node, - xmlNodePtr ancestor, const xmlChar * prefix) -{ - xmlNsPtr tst; - - while ((node != NULL) && (node != ancestor)) { - if ((node->type == XML_ENTITY_REF_NODE) || - (node->type == XML_ENTITY_NODE) || - (node->type == XML_ENTITY_DECL)) - return (-1); - if (node->type == XML_ELEMENT_NODE) { - tst = node->nsDef; - while (tst != NULL) { - if ((tst->prefix == NULL) - && (prefix == NULL)) - return (0); - if ((tst->prefix != NULL) - && (prefix != NULL) - && (xmlStrEqual(tst->prefix, prefix))) - return (0); - tst = tst->next; - } - } - node = node->parent; - } - if (node != ancestor) - return (-1); - return (1); -} - -/** - * xmlSearchNsByHref: - * @doc: the document - * @node: the current node - * @href: the namespace value - * - * Search a Ns aliasing a given URI. Recurse on the parents until it finds - * the defined namespace or return NULL otherwise. - * Returns the namespace pointer or NULL. - */ -xmlNsPtr -xmlSearchNsByHref(xmlDocPtr doc, xmlNodePtr node, const xmlChar * href) -{ - xmlNsPtr cur; - xmlNodePtr orig = node; - int is_attr; - - if ((node == NULL) || (href == NULL)) - return (NULL); - if (xmlStrEqual(href, XML_XML_NAMESPACE)) { - /* - * Only the document can hold the XML spec namespace. - */ - if ((doc == NULL) && (node->type == XML_ELEMENT_NODE)) { - /* - * The XML-1.0 namespace is normally held on the root - * element. In this case exceptionally create it on the - * node element. - */ - cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); - if (cur == NULL) { - xmlTreeErrMemory("searching namespace"); - return (NULL); - } - memset(cur, 0, sizeof(xmlNs)); - cur->type = XML_LOCAL_NAMESPACE; - cur->href = xmlStrdup(XML_XML_NAMESPACE); - cur->prefix = xmlStrdup((const xmlChar *) "xml"); - cur->next = node->nsDef; - node->nsDef = cur; - return (cur); - } - if (doc == NULL) { - doc = node->doc; - if (doc == NULL) - return(NULL); - } - /* - * Return the XML namespace declaration held by the doc. - */ - if (doc->oldNs == NULL) - return(xmlTreeEnsureXMLDecl(doc)); - else - return(doc->oldNs); - } - is_attr = (node->type == XML_ATTRIBUTE_NODE); - while (node != NULL) { - if ((node->type == XML_ENTITY_REF_NODE) || - (node->type == XML_ENTITY_NODE) || - (node->type == XML_ENTITY_DECL)) - return (NULL); - if (node->type == XML_ELEMENT_NODE) { - cur = node->nsDef; - while (cur != NULL) { - if ((cur->href != NULL) && (href != NULL) && - (xmlStrEqual(cur->href, href))) { - if (((!is_attr) || (cur->prefix != NULL)) && - (xmlNsInScope(doc, orig, node, cur->prefix) == 1)) - return (cur); - } - cur = cur->next; - } - if (orig != node) { - cur = node->ns; - if (cur != NULL) { - if ((cur->href != NULL) && (href != NULL) && - (xmlStrEqual(cur->href, href))) { - if (((!is_attr) || (cur->prefix != NULL)) && - (xmlNsInScope(doc, orig, node, cur->prefix) == 1)) - return (cur); - } - } - } - } - node = node->parent; - } - return (NULL); -} - -/** - * xmlNewReconciliedNs: - * @doc: the document - * @tree: a node expected to hold the new namespace - * @ns: the original namespace - * - * This function tries to locate a namespace definition in a tree - * ancestors, or create a new namespace definition node similar to - * @ns trying to reuse the same prefix. However if the given prefix is - * null (default namespace) or reused within the subtree defined by - * @tree or on one of its ancestors then a new prefix is generated. - * Returns the (new) namespace definition or NULL in case of error - */ -xmlNsPtr -xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns) { - xmlNsPtr def; - xmlChar prefix[50]; - int counter = 1; - - if (tree == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewReconciliedNs : tree == NULL\n"); -#endif - return(NULL); - } - if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNewReconciliedNs : ns == NULL\n"); -#endif - return(NULL); - } - /* - * Search an existing namespace definition inherited. - */ - def = xmlSearchNsByHref(doc, tree, ns->href); - if (def != NULL) - return(def); - - /* - * Find a close prefix which is not already in use. - * Let's strip namespace prefixes longer than 20 chars ! - */ - if (ns->prefix == NULL) - snprintf((char *) prefix, sizeof(prefix), "default"); - else - snprintf((char *) prefix, sizeof(prefix), "%.20s", (char *)ns->prefix); - - def = xmlSearchNs(doc, tree, prefix); - while (def != NULL) { - if (counter > 1000) return(NULL); - if (ns->prefix == NULL) - snprintf((char *) prefix, sizeof(prefix), "default%d", counter++); - else - snprintf((char *) prefix, sizeof(prefix), "%.20s%d", - (char *)ns->prefix, counter++); - def = xmlSearchNs(doc, tree, prefix); - } - - /* - * OK, now we are ready to create a new one. - */ - def = xmlNewNs(tree, ns->href, prefix); - return(def); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlReconciliateNs: - * @doc: the document - * @tree: a node defining the subtree to reconciliate - * - * This function checks that all the namespaces declared within the given - * tree are properly declared. This is needed for example after Copy or Cut - * and then paste operations. The subtree may still hold pointers to - * namespace declarations outside the subtree or invalid/masked. As much - * as possible the function try to reuse the existing namespaces found in - * the new environment. If not possible the new namespaces are redeclared - * on @tree at the top of the given subtree. - * Returns the number of namespace declarations created or -1 in case of error. - */ -int -xmlReconciliateNs(xmlDocPtr doc, xmlNodePtr tree) { - xmlNsPtr *oldNs = NULL; - xmlNsPtr *newNs = NULL; - int sizeCache = 0; - int nbCache = 0; - - xmlNsPtr n; - xmlNodePtr node = tree; - xmlAttrPtr attr; - int ret = 0, i; - - if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) return(-1); - if ((doc == NULL) || (doc->type != XML_DOCUMENT_NODE)) return(-1); - if (node->doc != doc) return(-1); - while (node != NULL) { - /* - * Reconciliate the node namespace - */ - if (node->ns != NULL) { - /* - * initialize the cache if needed - */ - if (sizeCache == 0) { - sizeCache = 10; - oldNs = (xmlNsPtr *) xmlMalloc(sizeCache * - sizeof(xmlNsPtr)); - if (oldNs == NULL) { - xmlTreeErrMemory("fixing namespaces"); - return(-1); - } - newNs = (xmlNsPtr *) xmlMalloc(sizeCache * - sizeof(xmlNsPtr)); - if (newNs == NULL) { - xmlTreeErrMemory("fixing namespaces"); - xmlFree(oldNs); - return(-1); - } - } - for (i = 0;i < nbCache;i++) { - if (oldNs[i] == node->ns) { - node->ns = newNs[i]; - break; - } - } - if (i == nbCache) { - /* - * OK we need to recreate a new namespace definition - */ - n = xmlNewReconciliedNs(doc, tree, node->ns); - if (n != NULL) { /* :-( what if else ??? */ - /* - * check if we need to grow the cache buffers. - */ - if (sizeCache <= nbCache) { - sizeCache *= 2; - oldNs = (xmlNsPtr *) xmlRealloc(oldNs, sizeCache * - sizeof(xmlNsPtr)); - if (oldNs == NULL) { - xmlTreeErrMemory("fixing namespaces"); - xmlFree(newNs); - return(-1); - } - newNs = (xmlNsPtr *) xmlRealloc(newNs, sizeCache * - sizeof(xmlNsPtr)); - if (newNs == NULL) { - xmlTreeErrMemory("fixing namespaces"); - xmlFree(oldNs); - return(-1); - } - } - newNs[nbCache] = n; - oldNs[nbCache++] = node->ns; - node->ns = n; - } - } - } - /* - * now check for namespace hold by attributes on the node. - */ - if (node->type == XML_ELEMENT_NODE) { - attr = node->properties; - while (attr != NULL) { - if (attr->ns != NULL) { - /* - * initialize the cache if needed - */ - if (sizeCache == 0) { - sizeCache = 10; - oldNs = (xmlNsPtr *) xmlMalloc(sizeCache * - sizeof(xmlNsPtr)); - if (oldNs == NULL) { - xmlTreeErrMemory("fixing namespaces"); - return(-1); - } - newNs = (xmlNsPtr *) xmlMalloc(sizeCache * - sizeof(xmlNsPtr)); - if (newNs == NULL) { - xmlTreeErrMemory("fixing namespaces"); - xmlFree(oldNs); - return(-1); - } - } - for (i = 0;i < nbCache;i++) { - if (oldNs[i] == attr->ns) { - attr->ns = newNs[i]; - break; - } - } - if (i == nbCache) { - /* - * OK we need to recreate a new namespace definition - */ - n = xmlNewReconciliedNs(doc, tree, attr->ns); - if (n != NULL) { /* :-( what if else ??? */ - /* - * check if we need to grow the cache buffers. - */ - if (sizeCache <= nbCache) { - sizeCache *= 2; - oldNs = (xmlNsPtr *) xmlRealloc(oldNs, - sizeCache * sizeof(xmlNsPtr)); - if (oldNs == NULL) { - xmlTreeErrMemory("fixing namespaces"); - xmlFree(newNs); - return(-1); - } - newNs = (xmlNsPtr *) xmlRealloc(newNs, - sizeCache * sizeof(xmlNsPtr)); - if (newNs == NULL) { - xmlTreeErrMemory("fixing namespaces"); - xmlFree(oldNs); - return(-1); - } - } - newNs[nbCache] = n; - oldNs[nbCache++] = attr->ns; - attr->ns = n; - } - } - } - attr = attr->next; - } - } - - /* - * Browse the full subtree, deep first - */ - if ((node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) { - /* deep first */ - node = node->children; - } else if ((node != tree) && (node->next != NULL)) { - /* then siblings */ - node = node->next; - } else if (node != tree) { - /* go up to parents->next if needed */ - while (node != tree) { - if (node->parent != NULL) - node = node->parent; - if ((node != tree) && (node->next != NULL)) { - node = node->next; - break; - } - if (node->parent == NULL) { - node = NULL; - break; - } - } - /* exit condition */ - if (node == tree) - node = NULL; - } else - break; - } - if (oldNs != NULL) - xmlFree(oldNs); - if (newNs != NULL) - xmlFree(newNs); - return(ret); -} -#endif /* LIBXML_TREE_ENABLED */ - -static xmlAttrPtr -xmlGetPropNodeInternal(xmlNodePtr node, const xmlChar *name, - const xmlChar *nsName, int useDTD) -{ - xmlAttrPtr prop; - - if ((node == NULL) || (node->type != XML_ELEMENT_NODE) || (name == NULL)) - return(NULL); - - if (node->properties != NULL) { - prop = node->properties; - if (nsName == NULL) { - /* - * We want the attr to be in no namespace. - */ - do { - if ((prop->ns == NULL) && xmlStrEqual(prop->name, name)) { - return(prop); - } - prop = prop->next; - } while (prop != NULL); - } else { - /* - * We want the attr to be in the specified namespace. - */ - do { - if ((prop->ns != NULL) && xmlStrEqual(prop->name, name) && - ((prop->ns->href == nsName) || - xmlStrEqual(prop->ns->href, nsName))) - { - return(prop); - } - prop = prop->next; - } while (prop != NULL); - } - } - -#ifdef LIBXML_TREE_ENABLED - if (! useDTD) - return(NULL); - /* - * Check if there is a default/fixed attribute declaration in - * the internal or external subset. - */ - if ((node->doc != NULL) && (node->doc->intSubset != NULL)) { - xmlDocPtr doc = node->doc; - xmlAttributePtr attrDecl = NULL; - xmlChar *elemQName, *tmpstr = NULL; - - /* - * We need the QName of the element for the DTD-lookup. - */ - if ((node->ns != NULL) && (node->ns->prefix != NULL)) { - tmpstr = xmlStrdup(node->ns->prefix); - tmpstr = xmlStrcat(tmpstr, BAD_CAST ":"); - tmpstr = xmlStrcat(tmpstr, node->name); - if (tmpstr == NULL) - return(NULL); - elemQName = tmpstr; - } else - elemQName = (xmlChar *) node->name; - if (nsName == NULL) { - /* - * The common and nice case: Attr in no namespace. - */ - attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, - elemQName, name, NULL); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) { - attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, - elemQName, name, NULL); - } - } else { - xmlNsPtr *nsList, *cur; - - /* - * The ugly case: Search using the prefixes of in-scope - * ns-decls corresponding to @nsName. - */ - nsList = xmlGetNsList(node->doc, node); - if (nsList == NULL) { - if (tmpstr != NULL) - xmlFree(tmpstr); - return(NULL); - } - cur = nsList; - while (*cur != NULL) { - if (xmlStrEqual((*cur)->href, nsName)) { - attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elemQName, - name, (*cur)->prefix); - if (attrDecl) - break; - if (doc->extSubset != NULL) { - attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elemQName, - name, (*cur)->prefix); - if (attrDecl) - break; - } - } - cur++; - } - xmlFree(nsList); - } - if (tmpstr != NULL) - xmlFree(tmpstr); - /* - * Only default/fixed attrs are relevant. - */ - if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL)) - return((xmlAttrPtr) attrDecl); - } -#endif /* LIBXML_TREE_ENABLED */ - return(NULL); -} - -static xmlChar* -xmlGetPropNodeValueInternal(xmlAttrPtr prop) -{ - if (prop == NULL) - return(NULL); - if (prop->type == XML_ATTRIBUTE_NODE) { - /* - * Note that we return at least the empty string. - * TODO: Do we really always want that? - */ - if (prop->children != NULL) { - if ((prop->children->next == NULL) && - ((prop->children->type == XML_TEXT_NODE) || - (prop->children->type == XML_CDATA_SECTION_NODE))) - { - /* - * Optimization for the common case: only 1 text node. - */ - return(xmlStrdup(prop->children->content)); - } else { - xmlChar *ret; - - ret = xmlNodeListGetString(prop->doc, prop->children, 1); - if (ret != NULL) - return(ret); - } - } - return(xmlStrdup((xmlChar *)"")); - } else if (prop->type == XML_ATTRIBUTE_DECL) { - return(xmlStrdup(((xmlAttributePtr)prop)->defaultValue)); - } - return(NULL); -} - -/** - * xmlHasProp: - * @node: the node - * @name: the attribute name - * - * Search an attribute associated to a node - * This function also looks in DTD attribute declaration for #FIXED or - * default declaration values unless DTD use has been turned off. - * - * Returns the attribute or the attribute declaration or NULL if - * neither was found. - */ -xmlAttrPtr -xmlHasProp(xmlNodePtr node, const xmlChar *name) { - xmlAttrPtr prop; - xmlDocPtr doc; - - if ((node == NULL) || (node->type != XML_ELEMENT_NODE) || (name == NULL)) - return(NULL); - /* - * Check on the properties attached to the node - */ - prop = node->properties; - while (prop != NULL) { - if (xmlStrEqual(prop->name, name)) { - return(prop); - } - prop = prop->next; - } - if (!xmlCheckDTD) return(NULL); - - /* - * Check if there is a default declaration in the internal - * or external subsets - */ - doc = node->doc; - if (doc != NULL) { - xmlAttributePtr attrDecl; - if (doc->intSubset != NULL) { - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, node->name, name); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, node->name, name); - if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL)) - /* return attribute declaration only if a default value is given - (that includes #FIXED declarations) */ - return((xmlAttrPtr) attrDecl); - } - } - return(NULL); -} - -/** - * xmlHasNsProp: - * @node: the node - * @name: the attribute name - * @nameSpace: the URI of the namespace - * - * Search for an attribute associated to a node - * This attribute has to be anchored in the namespace specified. - * This does the entity substitution. - * This function looks in DTD attribute declaration for #FIXED or - * default declaration values unless DTD use has been turned off. - * Note that a namespace of NULL indicates to use the default namespace. - * - * Returns the attribute or the attribute declaration or NULL - * if neither was found. - */ -xmlAttrPtr -xmlHasNsProp(xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace) { - - return(xmlGetPropNodeInternal(node, name, nameSpace, xmlCheckDTD)); -} - -/** - * xmlGetProp: - * @node: the node - * @name: the attribute name - * - * Search and get the value of an attribute associated to a node - * This does the entity substitution. - * This function looks in DTD attribute declaration for #FIXED or - * default declaration values unless DTD use has been turned off. - * NOTE: this function acts independently of namespaces associated - * to the attribute. Use xmlGetNsProp() or xmlGetNoNsProp() - * for namespace aware processing. - * - * Returns the attribute value or NULL if not found. - * It's up to the caller to free the memory with xmlFree(). - */ -xmlChar * -xmlGetProp(xmlNodePtr node, const xmlChar *name) { - xmlAttrPtr prop; - - prop = xmlHasProp(node, name); - if (prop == NULL) - return(NULL); - return(xmlGetPropNodeValueInternal(prop)); -} - -/** - * xmlGetNoNsProp: - * @node: the node - * @name: the attribute name - * - * Search and get the value of an attribute associated to a node - * This does the entity substitution. - * This function looks in DTD attribute declaration for #FIXED or - * default declaration values unless DTD use has been turned off. - * This function is similar to xmlGetProp except it will accept only - * an attribute in no namespace. - * - * Returns the attribute value or NULL if not found. - * It's up to the caller to free the memory with xmlFree(). - */ -xmlChar * -xmlGetNoNsProp(xmlNodePtr node, const xmlChar *name) { - xmlAttrPtr prop; - - prop = xmlGetPropNodeInternal(node, name, NULL, xmlCheckDTD); - if (prop == NULL) - return(NULL); - return(xmlGetPropNodeValueInternal(prop)); -} - -/** - * xmlGetNsProp: - * @node: the node - * @name: the attribute name - * @nameSpace: the URI of the namespace - * - * Search and get the value of an attribute associated to a node - * This attribute has to be anchored in the namespace specified. - * This does the entity substitution. - * This function looks in DTD attribute declaration for #FIXED or - * default declaration values unless DTD use has been turned off. - * - * Returns the attribute value or NULL if not found. - * It's up to the caller to free the memory with xmlFree(). - */ -xmlChar * -xmlGetNsProp(xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace) { - xmlAttrPtr prop; - - prop = xmlGetPropNodeInternal(node, name, nameSpace, xmlCheckDTD); - if (prop == NULL) - return(NULL); - return(xmlGetPropNodeValueInternal(prop)); -} - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlUnsetProp: - * @node: the node - * @name: the attribute name - * - * Remove an attribute carried by a node. - * This handles only attributes in no namespace. - * Returns 0 if successful, -1 if not found - */ -int -xmlUnsetProp(xmlNodePtr node, const xmlChar *name) { - xmlAttrPtr prop; - - prop = xmlGetPropNodeInternal(node, name, NULL, 0); - if (prop == NULL) - return(-1); - xmlUnlinkNode((xmlNodePtr) prop); - xmlFreeProp(prop); - return(0); -} - -/** - * xmlUnsetNsProp: - * @node: the node - * @ns: the namespace definition - * @name: the attribute name - * - * Remove an attribute carried by a node. - * Returns 0 if successful, -1 if not found - */ -int -xmlUnsetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name) { - xmlAttrPtr prop; - - prop = xmlGetPropNodeInternal(node, name, (ns != NULL) ? ns->href : NULL, 0); - if (prop == NULL) - return(-1); - xmlUnlinkNode((xmlNodePtr) prop); - xmlFreeProp(prop); - return(0); -} -#endif - -#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) -/** - * xmlSetProp: - * @node: the node - * @name: the attribute name (a QName) - * @value: the attribute value - * - * Set (or reset) an attribute carried by a node. - * If @name has a prefix, then the corresponding - * namespace-binding will be used, if in scope; it is an - * error it there's no such ns-binding for the prefix in - * scope. - * Returns the attribute pointer. - * - */ -xmlAttrPtr -xmlSetProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) { - int len; - const xmlChar *nqname; - - if ((node == NULL) || (name == NULL) || (node->type != XML_ELEMENT_NODE)) - return(NULL); - - /* - * handle QNames - */ - nqname = xmlSplitQName3(name, &len); - if (nqname != NULL) { - xmlNsPtr ns; - xmlChar *prefix = xmlStrndup(name, len); - ns = xmlSearchNs(node->doc, node, prefix); - if (prefix != NULL) - xmlFree(prefix); - if (ns != NULL) - return(xmlSetNsProp(node, ns, nqname, value)); - } - return(xmlSetNsProp(node, NULL, name, value)); -} - -/** - * xmlSetNsProp: - * @node: the node - * @ns: the namespace definition - * @name: the attribute name - * @value: the attribute value - * - * Set (or reset) an attribute carried by a node. - * The ns structure must be in scope, this is not checked - * - * Returns the attribute pointer. - */ -xmlAttrPtr -xmlSetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, - const xmlChar *value) -{ - xmlAttrPtr prop; - - if (ns && (ns->href == NULL)) - return(NULL); - prop = xmlGetPropNodeInternal(node, name, (ns != NULL) ? ns->href : NULL, 0); - if (prop != NULL) { - /* - * Modify the attribute's value. - */ - if (prop->atype == XML_ATTRIBUTE_ID) { - xmlRemoveID(node->doc, prop); - prop->atype = XML_ATTRIBUTE_ID; - } - if (prop->children != NULL) - xmlFreeNodeList(prop->children); - prop->children = NULL; - prop->last = NULL; - prop->ns = ns; - if (value != NULL) { - xmlChar *buffer; - xmlNodePtr tmp; - - buffer = xmlEncodeEntitiesReentrant(node->doc, value); - prop->children = xmlStringGetNodeList(node->doc, buffer); - prop->last = NULL; - tmp = prop->children; - while (tmp != NULL) { - tmp->parent = (xmlNodePtr) prop; - if (tmp->next == NULL) - prop->last = tmp; - tmp = tmp->next; - } - xmlFree(buffer); - } - if (prop->atype == XML_ATTRIBUTE_ID) - xmlAddID(NULL, node->doc, value, prop); - return(prop); - } - /* - * No equal attr found; create a new one. - */ - return(xmlNewPropInternal(node, ns, name, value, 0)); -} - -#endif /* LIBXML_TREE_ENABLED */ - -/** - * xmlNodeIsText: - * @node: the node - * - * Is this node a Text node ? - * Returns 1 yes, 0 no - */ -int -xmlNodeIsText(xmlNodePtr node) { - if (node == NULL) return(0); - - if (node->type == XML_TEXT_NODE) return(1); - return(0); -} - -/** - * xmlIsBlankNode: - * @node: the node - * - * Checks whether this node is an empty or whitespace only - * (and possibly ignorable) text-node. - * - * Returns 1 yes, 0 no - */ -int -xmlIsBlankNode(xmlNodePtr node) { - const xmlChar *cur; - if (node == NULL) return(0); - - if ((node->type != XML_TEXT_NODE) && - (node->type != XML_CDATA_SECTION_NODE)) - return(0); - if (node->content == NULL) return(1); - cur = node->content; - while (*cur != 0) { - if (!IS_BLANK_CH(*cur)) return(0); - cur++; - } - - return(1); -} - -/** - * xmlTextConcat: - * @node: the node - * @content: the content - * @len: @content length - * - * Concat the given string at the end of the existing node content - * - * Returns -1 in case of error, 0 otherwise - */ - -int -xmlTextConcat(xmlNodePtr node, const xmlChar *content, int len) { - if (node == NULL) return(-1); - - if ((node->type != XML_TEXT_NODE) && - (node->type != XML_CDATA_SECTION_NODE) && - (node->type != XML_COMMENT_NODE) && - (node->type != XML_PI_NODE)) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlTextConcat: node is not text nor CDATA\n"); -#endif - return(-1); - } - /* need to check if content is currently in the dictionary */ - if ((node->content == (xmlChar *) &(node->properties)) || - ((node->doc != NULL) && (node->doc->dict != NULL) && - xmlDictOwns(node->doc->dict, node->content))) { - node->content = xmlStrncatNew(node->content, content, len); - } else { - node->content = xmlStrncat(node->content, content, len); - } - node->properties = NULL; - if (node->content == NULL) - return(-1); - return(0); -} - -/************************************************************************ - * * - * Output : to a FILE or in memory * - * * - ************************************************************************/ - -/** - * xmlBufferCreate: - * - * routine to create an XML buffer. - * returns the new structure. - */ -xmlBufferPtr -xmlBufferCreate(void) { - xmlBufferPtr ret; - - ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer)); - if (ret == NULL) { - xmlTreeErrMemory("creating buffer"); - return(NULL); - } - ret->use = 0; - ret->size = xmlDefaultBufferSize; - ret->alloc = xmlBufferAllocScheme; - ret->content = (xmlChar *) xmlMallocAtomic(ret->size * sizeof(xmlChar)); - if (ret->content == NULL) { - xmlTreeErrMemory("creating buffer"); - xmlFree(ret); - return(NULL); - } - ret->content[0] = 0; - return(ret); -} - -/** - * xmlBufferCreateSize: - * @size: initial size of buffer - * - * routine to create an XML buffer. - * returns the new structure. - */ -xmlBufferPtr -xmlBufferCreateSize(size_t size) { - xmlBufferPtr ret; - - ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer)); - if (ret == NULL) { - xmlTreeErrMemory("creating buffer"); - return(NULL); - } - ret->use = 0; - ret->alloc = xmlBufferAllocScheme; - ret->size = (size ? size+2 : 0); /* +1 for ending null */ - if (ret->size){ - ret->content = (xmlChar *) xmlMallocAtomic(ret->size * sizeof(xmlChar)); - if (ret->content == NULL) { - xmlTreeErrMemory("creating buffer"); - xmlFree(ret); - return(NULL); - } - ret->content[0] = 0; - } else - ret->content = NULL; - return(ret); -} - -/** - * xmlBufferCreateStatic: - * @mem: the memory area - * @size: the size in byte - * - * routine to create an XML buffer from an immutable memory area. - * The area won't be modified nor copied, and is expected to be - * present until the end of the buffer lifetime. - * - * returns the new structure. - */ -xmlBufferPtr -xmlBufferCreateStatic(void *mem, size_t size) { - xmlBufferPtr ret; - - if ((mem == NULL) || (size == 0)) - return(NULL); - - ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer)); - if (ret == NULL) { - xmlTreeErrMemory("creating buffer"); - return(NULL); - } - ret->use = size; - ret->size = size; - ret->alloc = XML_BUFFER_ALLOC_IMMUTABLE; - ret->content = (xmlChar *) mem; - return(ret); -} - -/** - * xmlBufferSetAllocationScheme: - * @buf: the buffer to tune - * @scheme: allocation scheme to use - * - * Sets the allocation scheme for this buffer - */ -void -xmlBufferSetAllocationScheme(xmlBufferPtr buf, - xmlBufferAllocationScheme scheme) { - if (buf == NULL) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferSetAllocationScheme: buf == NULL\n"); -#endif - return; - } - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; - - buf->alloc = scheme; -} - -/** - * xmlBufferFree: - * @buf: the buffer to free - * - * Frees an XML buffer. It frees both the content and the structure which - * encapsulate it. - */ -void -xmlBufferFree(xmlBufferPtr buf) { - if (buf == NULL) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferFree: buf == NULL\n"); -#endif - return; - } - - if ((buf->content != NULL) && - (buf->alloc != XML_BUFFER_ALLOC_IMMUTABLE)) { - xmlFree(buf->content); - } - xmlFree(buf); -} - -/** - * xmlBufferEmpty: - * @buf: the buffer - * - * empty a buffer. - */ -void -xmlBufferEmpty(xmlBufferPtr buf) { - if (buf == NULL) return; - if (buf->content == NULL) return; - buf->use = 0; - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) { - buf->content = BAD_CAST ""; - } else { - memset(buf->content, 0, buf->size); - } -} - -/** - * xmlBufferShrink: - * @buf: the buffer to dump - * @len: the number of xmlChar to remove - * - * Remove the beginning of an XML buffer. - * - * Returns the number of #xmlChar removed, or -1 in case of failure. - */ -int -xmlBufferShrink(xmlBufferPtr buf, unsigned int len) { - if (buf == NULL) return(-1); - if (len == 0) return(0); - if (len > buf->use) return(-1); - - buf->use -= len; - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) { - buf->content += len; - } else { - memmove(buf->content, &buf->content[len], buf->use * sizeof(xmlChar)); - buf->content[buf->use] = 0; - } - return(len); -} - -/** - * xmlBufferGrow: - * @buf: the buffer - * @len: the minimum free size to allocate - * - * Grow the available space of an XML buffer. - * - * Returns the new available space or -1 in case of error - */ -int -xmlBufferGrow(xmlBufferPtr buf, unsigned int len) { - int size; - xmlChar *newbuf; - - if (buf == NULL) return(-1); - - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0); - if (len + buf->use < buf->size) return(0); - -/* - * Windows has a BIG problem on realloc timing, so we try to double - * the buffer size (if that's enough) (bug 146697) - */ -#ifdef WIN32 - if (buf->size > len) - size = buf->size * 2; - else - size = buf->use + len + 100; -#else - size = buf->use + len + 100; -#endif - - newbuf = (xmlChar *) xmlRealloc(buf->content, size); - if (newbuf == NULL) { - xmlTreeErrMemory("growing buffer"); - return(-1); - } - buf->content = newbuf; - buf->size = size; - return(buf->size - buf->use); -} - -/** - * xmlBufferDump: - * @file: the file output - * @buf: the buffer to dump - * - * Dumps an XML buffer to a FILE *. - * Returns the number of #xmlChar written - */ -int -xmlBufferDump(FILE *file, xmlBufferPtr buf) { - int ret; - - if (buf == NULL) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferDump: buf == NULL\n"); -#endif - return(0); - } - if (buf->content == NULL) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferDump: buf->content == NULL\n"); -#endif - return(0); - } - if (file == NULL) - file = stdout; - ret = fwrite(buf->content, sizeof(xmlChar), buf->use, file); - return(ret); -} - -/** - * xmlBufferContent: - * @buf: the buffer - * - * Function to extract the content of a buffer - * - * Returns the internal content - */ - -const xmlChar * -xmlBufferContent(const xmlBufferPtr buf) -{ - if(!buf) - return NULL; - - return buf->content; -} - -/** - * xmlBufferLength: - * @buf: the buffer - * - * Function to get the length of a buffer - * - * Returns the length of data in the internal content - */ - -int -xmlBufferLength(const xmlBufferPtr buf) -{ - if(!buf) - return 0; - - return buf->use; -} - -/** - * xmlBufferResize: - * @buf: the buffer to resize - * @size: the desired size - * - * Resize a buffer to accommodate minimum size of @size. - * - * Returns 0 in case of problems, 1 otherwise - */ -int -xmlBufferResize(xmlBufferPtr buf, unsigned int size) -{ - unsigned int newSize; - xmlChar* rebuf = NULL; - - if (buf == NULL) - return(0); - - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0); - - /* Don't resize if we don't have to */ - if (size < buf->size) - return 1; - - /* figure out new size */ - switch (buf->alloc){ - case XML_BUFFER_ALLOC_DOUBLEIT: - /*take care of empty case*/ - newSize = (buf->size ? buf->size*2 : size + 10); - while (size > newSize) newSize *= 2; - break; - case XML_BUFFER_ALLOC_EXACT: - newSize = size+10; - break; - default: - newSize = size+10; - break; - } - - if (buf->content == NULL) - rebuf = (xmlChar *) xmlMallocAtomic(newSize * sizeof(xmlChar)); - else if (buf->size - buf->use < 100) { - rebuf = (xmlChar *) xmlRealloc(buf->content, - newSize * sizeof(xmlChar)); - } else { - /* - * if we are reallocating a buffer far from being full, it's - * better to make a new allocation and copy only the used range - * and free the old one. - */ - rebuf = (xmlChar *) xmlMallocAtomic(newSize * sizeof(xmlChar)); - if (rebuf != NULL) { - memcpy(rebuf, buf->content, buf->use); - xmlFree(buf->content); - rebuf[buf->use] = 0; - } - } - if (rebuf == NULL) { - xmlTreeErrMemory("growing buffer"); - return 0; - } - buf->content = rebuf; - buf->size = newSize; - - return 1; -} - -/** - * xmlBufferAdd: - * @buf: the buffer to dump - * @str: the #xmlChar string - * @len: the number of #xmlChar to add - * - * Add a string range to an XML buffer. if len == -1, the length of - * str is recomputed. - * - * Returns 0 successful, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlBufferAdd(xmlBufferPtr buf, const xmlChar *str, int len) { - unsigned int needSize; - - if ((str == NULL) || (buf == NULL)) { - return -1; - } - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; - if (len < -1) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferAdd: len < 0\n"); -#endif - return -1; - } - if (len == 0) return 0; - - if (len < 0) - len = xmlStrlen(str); - - if (len <= 0) return -1; - - needSize = buf->use + len + 2; - if (needSize > buf->size){ - if (!xmlBufferResize(buf, needSize)){ - xmlTreeErrMemory("growing buffer"); - return XML_ERR_NO_MEMORY; - } - } - - memmove(&buf->content[buf->use], str, len*sizeof(xmlChar)); - buf->use += len; - buf->content[buf->use] = 0; - return 0; -} - -/** - * xmlBufferAddHead: - * @buf: the buffer - * @str: the #xmlChar string - * @len: the number of #xmlChar to add - * - * Add a string range to the beginning of an XML buffer. - * if len == -1, the length of @str is recomputed. - * - * Returns 0 successful, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlBufferAddHead(xmlBufferPtr buf, const xmlChar *str, int len) { - unsigned int needSize; - - if (buf == NULL) - return(-1); - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; - if (str == NULL) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferAddHead: str == NULL\n"); -#endif - return -1; - } - if (len < -1) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferAddHead: len < 0\n"); -#endif - return -1; - } - if (len == 0) return 0; - - if (len < 0) - len = xmlStrlen(str); - - if (len <= 0) return -1; - - needSize = buf->use + len + 2; - if (needSize > buf->size){ - if (!xmlBufferResize(buf, needSize)){ - xmlTreeErrMemory("growing buffer"); - return XML_ERR_NO_MEMORY; - } - } - - memmove(&buf->content[len], &buf->content[0], buf->use * sizeof(xmlChar)); - memmove(&buf->content[0], str, len * sizeof(xmlChar)); - buf->use += len; - buf->content[buf->use] = 0; - return 0; -} - -/** - * xmlBufferCat: - * @buf: the buffer to add to - * @str: the #xmlChar string - * - * Append a zero terminated string to an XML buffer. - * - * Returns 0 successful, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlBufferCat(xmlBufferPtr buf, const xmlChar *str) { - if (buf == NULL) - return(-1); - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; - if (str == NULL) return -1; - return xmlBufferAdd(buf, str, -1); -} - -/** - * xmlBufferCCat: - * @buf: the buffer to dump - * @str: the C char string - * - * Append a zero terminated C string to an XML buffer. - * - * Returns 0 successful, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlBufferCCat(xmlBufferPtr buf, const char *str) { - const char *cur; - - if (buf == NULL) - return(-1); - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; - if (str == NULL) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferCCat: str == NULL\n"); -#endif - return -1; - } - for (cur = str;*cur != 0;cur++) { - if (buf->use + 10 >= buf->size) { - if (!xmlBufferResize(buf, buf->use+10)){ - xmlTreeErrMemory("growing buffer"); - return XML_ERR_NO_MEMORY; - } - } - buf->content[buf->use++] = *cur; - } - buf->content[buf->use] = 0; - return 0; -} - -/** - * xmlBufferWriteCHAR: - * @buf: the XML buffer - * @string: the string to add - * - * routine which manages and grows an output buffer. This one adds - * xmlChars at the end of the buffer. - */ -void -xmlBufferWriteCHAR(xmlBufferPtr buf, const xmlChar *string) { - if (buf == NULL) - return; - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; - xmlBufferCat(buf, string); -} - -/** - * xmlBufferWriteChar: - * @buf: the XML buffer output - * @string: the string to add - * - * routine which manage and grows an output buffer. This one add - * C chars at the end of the array. - */ -void -xmlBufferWriteChar(xmlBufferPtr buf, const char *string) { - if (buf == NULL) - return; - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; - xmlBufferCCat(buf, string); -} - - -/** - * xmlBufferWriteQuotedString: - * @buf: the XML buffer output - * @string: the string to add - * - * routine which manage and grows an output buffer. This one writes - * a quoted or double quoted #xmlChar string, checking first if it holds - * quote or double-quotes internally - */ -void -xmlBufferWriteQuotedString(xmlBufferPtr buf, const xmlChar *string) { - const xmlChar *cur, *base; - if (buf == NULL) - return; - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; - if (xmlStrchr(string, '\"')) { - if (xmlStrchr(string, '\'')) { -#ifdef DEBUG_BUFFER - xmlGenericError(xmlGenericErrorContext, - "xmlBufferWriteQuotedString: string contains quote and double-quotes !\n"); -#endif - xmlBufferCCat(buf, "\""); - base = cur = string; - while(*cur != 0){ - if(*cur == '"'){ - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST """, 6); - cur++; - base = cur; - } - else { - cur++; - } - } - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferCCat(buf, "\""); - } - else{ - xmlBufferCCat(buf, "\'"); - xmlBufferCat(buf, string); - xmlBufferCCat(buf, "\'"); - } - } else { - xmlBufferCCat(buf, "\""); - xmlBufferCat(buf, string); - xmlBufferCCat(buf, "\""); - } -} - - -/** - * xmlGetDocCompressMode: - * @doc: the document - * - * get the compression ratio for a document, ZLIB based - * Returns 0 (uncompressed) to 9 (max compression) - */ -int -xmlGetDocCompressMode (xmlDocPtr doc) { - if (doc == NULL) return(-1); - return(doc->compression); -} - -/** - * xmlSetDocCompressMode: - * @doc: the document - * @mode: the compression ratio - * - * set the compression ratio for a document, ZLIB based - * Correct values: 0 (uncompressed) to 9 (max compression) - */ -void -xmlSetDocCompressMode (xmlDocPtr doc, int mode) { - if (doc == NULL) return; - if (mode < 0) doc->compression = 0; - else if (mode > 9) doc->compression = 9; - else doc->compression = mode; -} - -/** - * xmlGetCompressMode: - * - * get the default compression mode used, ZLIB based. - * Returns 0 (uncompressed) to 9 (max compression) - */ -int -xmlGetCompressMode(void) -{ - return (xmlCompressMode); -} - -/** - * xmlSetCompressMode: - * @mode: the compression ratio - * - * set the default compression mode used, ZLIB based - * Correct values: 0 (uncompressed) to 9 (max compression) - */ -void -xmlSetCompressMode(int mode) { - if (mode < 0) xmlCompressMode = 0; - else if (mode > 9) xmlCompressMode = 9; - else xmlCompressMode = mode; -} - -#define XML_TREE_NSMAP_PARENT -1 -#define XML_TREE_NSMAP_XML -2 -#define XML_TREE_NSMAP_DOC -3 -#define XML_TREE_NSMAP_CUSTOM -4 - -typedef struct xmlNsMapItem *xmlNsMapItemPtr; -struct xmlNsMapItem { - xmlNsMapItemPtr next; - xmlNsMapItemPtr prev; - xmlNsPtr oldNs; /* old ns decl reference */ - xmlNsPtr newNs; /* new ns decl reference */ - int shadowDepth; /* Shadowed at this depth */ - /* - * depth: - * >= 0 == @node's ns-decls - * -1 == @parent's ns-decls - * -2 == the doc->oldNs XML ns-decl - * -3 == the doc->oldNs storage ns-decls - * -4 == ns-decls provided via custom ns-handling - */ - int depth; -}; - -typedef struct xmlNsMap *xmlNsMapPtr; -struct xmlNsMap { - xmlNsMapItemPtr first; - xmlNsMapItemPtr last; - xmlNsMapItemPtr pool; -}; - -#define XML_NSMAP_NOTEMPTY(m) (((m) != NULL) && ((m)->first != NULL)) -#define XML_NSMAP_FOREACH(m, i) for (i = (m)->first; i != NULL; i = (i)->next) -#define XML_NSMAP_POP(m, i) \ - i = (m)->last; \ - (m)->last = (i)->prev; \ - if ((m)->last == NULL) \ - (m)->first = NULL; \ - else \ - (m)->last->next = NULL; \ - (i)->next = (m)->pool; \ - (m)->pool = i; - -/* -* xmlDOMWrapNsMapFree: -* @map: the ns-map -* -* Frees the ns-map -*/ -static void -xmlDOMWrapNsMapFree(xmlNsMapPtr nsmap) -{ - xmlNsMapItemPtr cur, tmp; - - if (nsmap == NULL) - return; - cur = nsmap->pool; - while (cur != NULL) { - tmp = cur; - cur = cur->next; - xmlFree(tmp); - } - cur = nsmap->first; - while (cur != NULL) { - tmp = cur; - cur = cur->next; - xmlFree(tmp); - } - xmlFree(nsmap); -} - -/* -* xmlDOMWrapNsMapAddItem: -* @map: the ns-map -* @oldNs: the old ns-struct -* @newNs: the new ns-struct -* @depth: depth and ns-kind information -* -* Adds an ns-mapping item. -*/ -static xmlNsMapItemPtr -xmlDOMWrapNsMapAddItem(xmlNsMapPtr *nsmap, int position, - xmlNsPtr oldNs, xmlNsPtr newNs, int depth) -{ - xmlNsMapItemPtr ret; - xmlNsMapPtr map; - - if (nsmap == NULL) - return(NULL); - if ((position != -1) && (position != 0)) - return(NULL); - map = *nsmap; - - if (map == NULL) { - /* - * Create the ns-map. - */ - map = (xmlNsMapPtr) xmlMalloc(sizeof(struct xmlNsMap)); - if (map == NULL) { - xmlTreeErrMemory("allocating namespace map"); - return (NULL); - } - memset(map, 0, sizeof(struct xmlNsMap)); - *nsmap = map; - } - - if (map->pool != NULL) { - /* - * Reuse an item from the pool. - */ - ret = map->pool; - map->pool = ret->next; - memset(ret, 0, sizeof(struct xmlNsMapItem)); - } else { - /* - * Create a new item. - */ - ret = (xmlNsMapItemPtr) xmlMalloc(sizeof(struct xmlNsMapItem)); - if (ret == NULL) { - xmlTreeErrMemory("allocating namespace map item"); - return (NULL); - } - memset(ret, 0, sizeof(struct xmlNsMapItem)); - } - - if (map->first == NULL) { - /* - * First ever. - */ - map->first = ret; - map->last = ret; - } else if (position == -1) { - /* - * Append. - */ - ret->prev = map->last; - map->last->next = ret; - map->last = ret; - } else if (position == 0) { - /* - * Set on first position. - */ - map->first->prev = ret; - ret->next = map->first; - map->first = ret; - } else - return(NULL); - - ret->oldNs = oldNs; - ret->newNs = newNs; - ret->shadowDepth = -1; - ret->depth = depth; - return (ret); -} - -/* -* xmlDOMWrapStoreNs: -* @doc: the doc -* @nsName: the namespace name -* @prefix: the prefix -* -* Creates or reuses an xmlNs struct on doc->oldNs with -* the given prefix and namespace name. -* -* Returns the aquired ns struct or NULL in case of an API -* or internal error. -*/ -static xmlNsPtr -xmlDOMWrapStoreNs(xmlDocPtr doc, - const xmlChar *nsName, - const xmlChar *prefix) -{ - xmlNsPtr ns; - - if (doc == NULL) - return (NULL); - ns = xmlTreeEnsureXMLDecl(doc); - if (ns == NULL) - return (NULL); - if (ns->next != NULL) { - /* Reuse. */ - ns = ns->next; - while (ns != NULL) { - if (((ns->prefix == prefix) || - xmlStrEqual(ns->prefix, prefix)) && - xmlStrEqual(ns->href, nsName)) { - return (ns); - } - if (ns->next == NULL) - break; - ns = ns->next; - } - } - /* Create. */ - ns->next = xmlNewNs(NULL, nsName, prefix); - return (ns->next); -} - -/* -* xmlDOMWrapNewCtxt: -* -* Allocates and initializes a new DOM-wrapper context. -* -* Returns the xmlDOMWrapCtxtPtr or NULL in case of an internal errror. -*/ -xmlDOMWrapCtxtPtr -xmlDOMWrapNewCtxt(void) -{ - xmlDOMWrapCtxtPtr ret; - - ret = xmlMalloc(sizeof(xmlDOMWrapCtxt)); - if (ret == NULL) { - xmlTreeErrMemory("allocating DOM-wrapper context"); - return (NULL); - } - memset(ret, 0, sizeof(xmlDOMWrapCtxt)); - return (ret); -} - -/* -* xmlDOMWrapFreeCtxt: -* @ctxt: the DOM-wrapper context -* -* Frees the DOM-wrapper context. -*/ -void -xmlDOMWrapFreeCtxt(xmlDOMWrapCtxtPtr ctxt) -{ - if (ctxt == NULL) - return; - if (ctxt->namespaceMap != NULL) - xmlDOMWrapNsMapFree((xmlNsMapPtr) ctxt->namespaceMap); - /* - * TODO: Store the namespace map in the context. - */ - xmlFree(ctxt); -} - -/* -* xmlTreeLookupNsListByPrefix: -* @nsList: a list of ns-structs -* @prefix: the searched prefix -* -* Searches for a ns-decl with the given prefix in @nsList. -* -* Returns the ns-decl if found, NULL if not found and on -* API errors. -*/ -static xmlNsPtr -xmlTreeNSListLookupByPrefix(xmlNsPtr nsList, const xmlChar *prefix) -{ - if (nsList == NULL) - return (NULL); - { - xmlNsPtr ns; - ns = nsList; - do { - if ((prefix == ns->prefix) || - xmlStrEqual(prefix, ns->prefix)) { - return (ns); - } - ns = ns->next; - } while (ns != NULL); - } - return (NULL); -} - -/* -* -* xmlDOMWrapNSNormGatherInScopeNs: -* @map: the namespace map -* @node: the node to start with -* -* Puts in-scope namespaces into the ns-map. -* -* Returns 0 on success, -1 on API or internal errors. -*/ -static int -xmlDOMWrapNSNormGatherInScopeNs(xmlNsMapPtr *map, - xmlNodePtr node) -{ - xmlNodePtr cur; - xmlNsPtr ns; - xmlNsMapItemPtr mi; - int shadowed; - - if ((map == NULL) || (*map != NULL)) - return (-1); - /* - * Get in-scope ns-decls of @parent. - */ - cur = node; - while ((cur != NULL) && (cur != (xmlNodePtr) cur->doc)) { - if (cur->type == XML_ELEMENT_NODE) { - if (cur->nsDef != NULL) { - ns = cur->nsDef; - do { - shadowed = 0; - if (XML_NSMAP_NOTEMPTY(*map)) { - /* - * Skip shadowed prefixes. - */ - XML_NSMAP_FOREACH(*map, mi) { - if ((ns->prefix == mi->newNs->prefix) || - xmlStrEqual(ns->prefix, mi->newNs->prefix)) { - shadowed = 1; - break; - } - } - } - /* - * Insert mapping. - */ - mi = xmlDOMWrapNsMapAddItem(map, 0, NULL, - ns, XML_TREE_NSMAP_PARENT); - if (mi == NULL) - return (-1); - if (shadowed) - mi->shadowDepth = 0; - ns = ns->next; - } while (ns != NULL); - } - } - cur = cur->parent; - } - return (0); -} - -/* -* XML_TREE_ADOPT_STR: If we have a dest-dict, put @str in the dict; -* otherwise copy it, when it was in the source-dict. -*/ -#define XML_TREE_ADOPT_STR(str) \ - if (adoptStr && (str != NULL)) { \ - if (destDoc->dict) { \ - const xmlChar *old = str; \ - str = xmlDictLookup(destDoc->dict, str, -1); \ - if ((sourceDoc == NULL) || (sourceDoc->dict == NULL) || \ - (!xmlDictOwns(sourceDoc->dict, old))) \ - xmlFree((char *)old); \ - } else if ((sourceDoc) && (sourceDoc->dict) && \ - xmlDictOwns(sourceDoc->dict, str)) { \ - str = BAD_CAST xmlStrdup(str); \ - } \ - } - -/* -* XML_TREE_ADOPT_STR_2: If @str was in the source-dict, then -* put it in dest-dict or copy it. -*/ -#define XML_TREE_ADOPT_STR_2(str) \ - if (adoptStr && (str != NULL) && (sourceDoc != NULL) && \ - (sourceDoc->dict != NULL) && \ - xmlDictOwns(sourceDoc->dict, cur->content)) { \ - if (destDoc->dict) \ - cur->content = (xmlChar *) \ - xmlDictLookup(destDoc->dict, cur->content, -1); \ - else \ - cur->content = xmlStrdup(BAD_CAST cur->content); \ - } - -/* -* xmlDOMWrapNSNormAddNsMapItem2: -* -* For internal use. Adds a ns-decl mapping. -* -* Returns 0 on success, -1 on internal errors. -*/ -static int -xmlDOMWrapNSNormAddNsMapItem2(xmlNsPtr **list, int *size, int *number, - xmlNsPtr oldNs, xmlNsPtr newNs) -{ - if (*list == NULL) { - *list = (xmlNsPtr *) xmlMalloc(6 * sizeof(xmlNsPtr)); - if (*list == NULL) { - xmlTreeErrMemory("alloc ns map item"); - return(-1); - } - *size = 3; - *number = 0; - } else if ((*number) >= (*size)) { - *size *= 2; - *list = (xmlNsPtr *) xmlRealloc(*list, - (*size) * 2 * sizeof(xmlNsPtr)); - if (*list == NULL) { - xmlTreeErrMemory("realloc ns map item"); - return(-1); - } - } - (*list)[2 * (*number)] = oldNs; - (*list)[2 * (*number) +1] = newNs; - (*number)++; - return (0); -} - -/* -* xmlDOMWrapRemoveNode: -* @ctxt: a DOM wrapper context -* @doc: the doc -* @node: the node to be removed. -* @options: set of options, unused at the moment -* -* Unlinks the given node from its owner. -* This will substitute ns-references to node->nsDef for -* ns-references to doc->oldNs, thus ensuring the removed -* branch to be autark wrt ns-references. -* -* NOTE: This function was not intensively tested. -* -* Returns 0 on success, 1 if the node is not supported, -* -1 on API and internal errors. -*/ -int -xmlDOMWrapRemoveNode(xmlDOMWrapCtxtPtr ctxt, xmlDocPtr doc, - xmlNodePtr node, int options ATTRIBUTE_UNUSED) -{ - xmlNsPtr *list = NULL; - int sizeList, nbList, i, j; - xmlNsPtr ns; - - if ((node == NULL) || (doc == NULL) || (node->doc != doc)) - return (-1); - - /* TODO: 0 or -1 ? */ - if (node->parent == NULL) - return (0); - - switch (node->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - xmlUnlinkNode(node); - return (0); - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - break; - default: - return (1); - } - xmlUnlinkNode(node); - /* - * Save out-of-scope ns-references in doc->oldNs. - */ - do { - switch (node->type) { - case XML_ELEMENT_NODE: - if ((ctxt == NULL) && (node->nsDef != NULL)) { - ns = node->nsDef; - do { - if (xmlDOMWrapNSNormAddNsMapItem2(&list, &sizeList, - &nbList, ns, ns) == -1) - goto internal_error; - ns = ns->next; - } while (ns != NULL); - } - /* No break on purpose. */ - case XML_ATTRIBUTE_NODE: - if (node->ns != NULL) { - /* - * Find a mapping. - */ - if (list != NULL) { - for (i = 0, j = 0; i < nbList; i++, j += 2) { - if (node->ns == list[j]) { - node->ns = list[++j]; - goto next_node; - } - } - } - ns = NULL; - if (ctxt != NULL) { - /* - * User defined. - */ - } else { - /* - * Add to doc's oldNs. - */ - ns = xmlDOMWrapStoreNs(doc, node->ns->href, - node->ns->prefix); - if (ns == NULL) - goto internal_error; - } - if (ns != NULL) { - /* - * Add mapping. - */ - if (xmlDOMWrapNSNormAddNsMapItem2(&list, &sizeList, - &nbList, node->ns, ns) == -1) - goto internal_error; - } - node->ns = ns; - } - if ((node->type == XML_ELEMENT_NODE) && - (node->properties != NULL)) { - node = (xmlNodePtr) node->properties; - continue; - } - break; - default: - goto next_sibling; - } -next_node: - if ((node->type == XML_ELEMENT_NODE) && - (node->children != NULL)) { - node = node->children; - continue; - } -next_sibling: - if (node == NULL) - break; - if (node->next != NULL) - node = node->next; - else { - node = node->parent; - goto next_sibling; - } - } while (node != NULL); - - if (list != NULL) - xmlFree(list); - return (0); - -internal_error: - if (list != NULL) - xmlFree(list); - return (-1); -} - -/* -* xmlSearchNsByNamespaceStrict: -* @doc: the document -* @node: the start node -* @nsName: the searched namespace name -* @retNs: the resulting ns-decl -* @prefixed: if the found ns-decl must have a prefix (for attributes) -* -* Dynamically searches for a ns-declaration which matches -* the given @nsName in the ancestor-or-self axis of @node. -* -* Returns 1 if a ns-decl was found, 0 if not and -1 on API -* and internal errors. -*/ -static int -xmlSearchNsByNamespaceStrict(xmlDocPtr doc, xmlNodePtr node, - const xmlChar* nsName, - xmlNsPtr *retNs, int prefixed) -{ - xmlNodePtr cur, prev = NULL, out = NULL; - xmlNsPtr ns, prevns; - - if ((doc == NULL) || (nsName == NULL) || (retNs == NULL)) - return (-1); - - *retNs = NULL; - if (xmlStrEqual(nsName, XML_XML_NAMESPACE)) { - *retNs = xmlTreeEnsureXMLDecl(doc); - if (*retNs == NULL) - return (-1); - return (1); - } - cur = node; - do { - if (cur->type == XML_ELEMENT_NODE) { - if (cur->nsDef != NULL) { - for (ns = cur->nsDef; ns != NULL; ns = ns->next) { - if (prefixed && (ns->prefix == NULL)) - continue; - if (prev != NULL) { - /* - * Check the last level of ns-decls for a - * shadowing prefix. - */ - prevns = prev->nsDef; - do { - if ((prevns->prefix == ns->prefix) || - ((prevns->prefix != NULL) && - (ns->prefix != NULL) && - xmlStrEqual(prevns->prefix, ns->prefix))) { - /* - * Shadowed. - */ - break; - } - prevns = prevns->next; - } while (prevns != NULL); - if (prevns != NULL) - continue; - } - /* - * Ns-name comparison. - */ - if ((nsName == ns->href) || - xmlStrEqual(nsName, ns->href)) { - /* - * At this point the prefix can only be shadowed, - * if we are the the (at least) 3rd level of - * ns-decls. - */ - if (out) { - int ret; - - ret = xmlNsInScope(doc, node, prev, ns->prefix); - if (ret < 0) - return (-1); - /* - * TODO: Should we try to find a matching ns-name - * only once? This here keeps on searching. - * I think we should try further since, there might - * be an other matching ns-decl with an unshadowed - * prefix. - */ - if (! ret) - continue; - } - *retNs = ns; - return (1); - } - } - out = prev; - prev = cur; - } - } else if ((cur->type == XML_ENTITY_NODE) || - (cur->type == XML_ENTITY_DECL)) - return (0); - cur = cur->parent; - } while ((cur != NULL) && (cur->doc != (xmlDocPtr) cur)); - return (0); -} - -/* -* xmlSearchNsByPrefixStrict: -* @doc: the document -* @node: the start node -* @prefix: the searched namespace prefix -* @retNs: the resulting ns-decl -* -* Dynamically searches for a ns-declaration which matches -* the given @nsName in the ancestor-or-self axis of @node. -* -* Returns 1 if a ns-decl was found, 0 if not and -1 on API -* and internal errors. -*/ -static int -xmlSearchNsByPrefixStrict(xmlDocPtr doc, xmlNodePtr node, - const xmlChar* prefix, - xmlNsPtr *retNs) -{ - xmlNodePtr cur; - xmlNsPtr ns; - - if ((doc == NULL) || (node == NULL)) - return (-1); - - if (retNs) - *retNs = NULL; - if (IS_STR_XML(prefix)) { - if (retNs) { - *retNs = xmlTreeEnsureXMLDecl(doc); - if (*retNs == NULL) - return (-1); - } - return (1); - } - cur = node; - do { - if (cur->type == XML_ELEMENT_NODE) { - if (cur->nsDef != NULL) { - ns = cur->nsDef; - do { - if ((prefix == ns->prefix) || - xmlStrEqual(prefix, ns->prefix)) - { - /* - * Disabled namespaces, e.g. xmlns:abc="". - */ - if (ns->href == NULL) - return(0); - if (retNs) - *retNs = ns; - return (1); - } - ns = ns->next; - } while (ns != NULL); - } - } else if ((cur->type == XML_ENTITY_NODE) || - (cur->type == XML_ENTITY_DECL)) - return (0); - cur = cur->parent; - } while ((cur != NULL) && (cur->doc != (xmlDocPtr) cur)); - return (0); -} - -/* -* xmlDOMWrapNSNormDeclareNsForced: -* @doc: the doc -* @elem: the element-node to declare on -* @nsName: the namespace-name of the ns-decl -* @prefix: the preferred prefix of the ns-decl -* @checkShadow: ensure that the new ns-decl doesn't shadow ancestor ns-decls -* -* Declares a new namespace on @elem. It tries to use the -* given @prefix; if a ns-decl with the given prefix is already existent -* on @elem, it will generate an other prefix. -* -* Returns 1 if a ns-decl was found, 0 if not and -1 on API -* and internal errors. -*/ -static xmlNsPtr -xmlDOMWrapNSNormDeclareNsForced(xmlDocPtr doc, - xmlNodePtr elem, - const xmlChar *nsName, - const xmlChar *prefix, - int checkShadow) -{ - - xmlNsPtr ret; - char buf[50]; - const xmlChar *pref; - int counter = 0; - /* - * Create a ns-decl on @anchor. - */ - pref = prefix; - while (1) { - /* - * Lookup whether the prefix is unused in elem's ns-decls. - */ - if ((elem->nsDef != NULL) && - (xmlTreeNSListLookupByPrefix(elem->nsDef, pref) != NULL)) - goto ns_next_prefix; - if (checkShadow && elem->parent && - ((xmlNodePtr) elem->parent->doc != elem->parent)) { - /* - * Does it shadow ancestor ns-decls? - */ - if (xmlSearchNsByPrefixStrict(doc, elem->parent, pref, NULL) == 1) - goto ns_next_prefix; - } - ret = xmlNewNs(NULL, nsName, pref); - if (ret == NULL) - return (NULL); - if (elem->nsDef == NULL) - elem->nsDef = ret; - else { - xmlNsPtr ns2 = elem->nsDef; - while (ns2->next != NULL) - ns2 = ns2->next; - ns2->next = ret; - } - return (ret); -ns_next_prefix: - counter++; - if (counter > 1000) - return (NULL); - if (prefix == NULL) { - snprintf((char *) buf, sizeof(buf), - "ns_%d", counter); - } else - snprintf((char *) buf, sizeof(buf), - "%.30s_%d", (char *)prefix, counter); - pref = BAD_CAST buf; - } -} - -/* -* xmlDOMWrapNSNormAquireNormalizedNs: -* @doc: the doc -* @elem: the element-node to declare namespaces on -* @ns: the ns-struct to use for the search -* @retNs: the found/created ns-struct -* @nsMap: the ns-map -* @depth: the current tree depth -* @ancestorsOnly: search in ancestor ns-decls only -* @prefixed: if the searched ns-decl must have a prefix (for attributes) -* -* Searches for a matching ns-name in the ns-decls of @nsMap, if not -* found it will either declare it on @elem, or store it in doc->oldNs. -* If a new ns-decl needs to be declared on @elem, it tries to use the -* @ns->prefix for it, if this prefix is already in use on @elem, it will -* change the prefix or the new ns-decl. -* -* Returns 0 if succeeded, -1 otherwise and on API/internal errors. -*/ -static int -xmlDOMWrapNSNormAquireNormalizedNs(xmlDocPtr doc, - xmlNodePtr elem, - xmlNsPtr ns, - xmlNsPtr *retNs, - xmlNsMapPtr *nsMap, - - int depth, - int ancestorsOnly, - int prefixed) -{ - xmlNsMapItemPtr mi; - - if ((doc == NULL) || (ns == NULL) || (retNs == NULL) || - (nsMap == NULL)) - return (-1); - - *retNs = NULL; - /* - * Handle XML namespace. - */ - if (IS_STR_XML(ns->prefix)) { - /* - * Insert XML namespace mapping. - */ - *retNs = xmlTreeEnsureXMLDecl(doc); - if (*retNs == NULL) - return (-1); - return (0); - } - /* - * If the search should be done in ancestors only and no - * @elem (the first ancestor) was specified, then skip the search. - */ - if ((XML_NSMAP_NOTEMPTY(*nsMap)) && - (! (ancestorsOnly && (elem == NULL)))) - { - /* - * Try to find an equal ns-name in in-scope ns-decls. - */ - XML_NSMAP_FOREACH(*nsMap, mi) { - if ((mi->depth >= XML_TREE_NSMAP_PARENT) && - /* - * ancestorsOnly: This should be turned on to gain speed, - * if one knows that the branch itself was already - * ns-wellformed and no stale references existed. - * I.e. it searches in the ancestor axis only. - */ - ((! ancestorsOnly) || (mi->depth == XML_TREE_NSMAP_PARENT)) && - /* Skip shadowed prefixes. */ - (mi->shadowDepth == -1) && - /* Skip xmlns="" or xmlns:foo="". */ - ((mi->newNs->href != NULL) && - (mi->newNs->href[0] != 0)) && - /* Ensure a prefix if wanted. */ - ((! prefixed) || (mi->newNs->prefix != NULL)) && - /* Equal ns name */ - ((mi->newNs->href == ns->href) || - xmlStrEqual(mi->newNs->href, ns->href))) { - /* Set the mapping. */ - mi->oldNs = ns; - *retNs = mi->newNs; - return (0); - } - } - } - /* - * No luck, the namespace is out of scope or shadowed. - */ - if (elem == NULL) { - xmlNsPtr tmpns; - - /* - * Store ns-decls in "oldNs" of the document-node. - */ - tmpns = xmlDOMWrapStoreNs(doc, ns->href, ns->prefix); - if (tmpns == NULL) - return (-1); - /* - * Insert mapping. - */ - if (xmlDOMWrapNsMapAddItem(nsMap, -1, ns, - tmpns, XML_TREE_NSMAP_DOC) == NULL) { - xmlFreeNs(tmpns); - return (-1); - } - *retNs = tmpns; - } else { - xmlNsPtr tmpns; - - tmpns = xmlDOMWrapNSNormDeclareNsForced(doc, elem, ns->href, - ns->prefix, 0); - if (tmpns == NULL) - return (-1); - - if (*nsMap != NULL) { - /* - * Does it shadow ancestor ns-decls? - */ - XML_NSMAP_FOREACH(*nsMap, mi) { - if ((mi->depth < depth) && - (mi->shadowDepth == -1) && - ((ns->prefix == mi->newNs->prefix) || - xmlStrEqual(ns->prefix, mi->newNs->prefix))) { - /* - * Shadows. - */ - mi->shadowDepth = depth; - break; - } - } - } - if (xmlDOMWrapNsMapAddItem(nsMap, -1, ns, tmpns, depth) == NULL) { - xmlFreeNs(tmpns); - return (-1); - } - *retNs = tmpns; - } - return (0); -} - -typedef enum { - XML_DOM_RECONNS_REMOVEREDUND = 1<<0 -} xmlDOMReconcileNSOptions; - -/* -* xmlDOMWrapReconcileNamespaces: -* @ctxt: DOM wrapper context, unused at the moment -* @elem: the element-node -* @options: option flags -* -* Ensures that ns-references point to ns-decls hold on element-nodes. -* Ensures that the tree is namespace wellformed by creating additional -* ns-decls where needed. Note that, since prefixes of already existent -* ns-decls can be shadowed by this process, it could break QNames in -* attribute values or element content. -* -* NOTE: This function was not intensively tested. -* -* Returns 0 if succeeded, -1 otherwise and on API/internal errors. -*/ - -int -xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlNodePtr elem, - int options) -{ - int depth = -1, adoptns = 0, parnsdone = 0; - xmlNsPtr ns, prevns; - xmlDocPtr doc; - xmlNodePtr cur, curElem = NULL; - xmlNsMapPtr nsMap = NULL; - xmlNsMapItemPtr /* topmi = NULL, */ mi; - /* @ancestorsOnly should be set by an option flag. */ - int ancestorsOnly = 0; - int optRemoveRedundantNS = - ((xmlDOMReconcileNSOptions) options & XML_DOM_RECONNS_REMOVEREDUND) ? 1 : 0; - xmlNsPtr *listRedund = NULL; - int sizeRedund = 0, nbRedund = 0, ret, i, j; - - if ((elem == NULL) || (elem->doc == NULL) || - (elem->type != XML_ELEMENT_NODE)) - return (-1); - - doc = elem->doc; - cur = elem; - do { - switch (cur->type) { - case XML_ELEMENT_NODE: - adoptns = 1; - curElem = cur; - depth++; - /* - * Namespace declarations. - */ - if (cur->nsDef != NULL) { - prevns = NULL; - ns = cur->nsDef; - while (ns != NULL) { - if (! parnsdone) { - if ((elem->parent) && - ((xmlNodePtr) elem->parent->doc != elem->parent)) { - /* - * Gather ancestor in-scope ns-decls. - */ - if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, - elem->parent) == -1) - goto internal_error; - } - parnsdone = 1; - } - - /* - * Lookup the ns ancestor-axis for equal ns-decls in scope. - */ - if (optRemoveRedundantNS && XML_NSMAP_NOTEMPTY(nsMap)) { - XML_NSMAP_FOREACH(nsMap, mi) { - if ((mi->depth >= XML_TREE_NSMAP_PARENT) && - (mi->shadowDepth == -1) && - ((ns->prefix == mi->newNs->prefix) || - xmlStrEqual(ns->prefix, mi->newNs->prefix)) && - ((ns->href == mi->newNs->href) || - xmlStrEqual(ns->href, mi->newNs->href))) - { - /* - * A redundant ns-decl was found. - * Add it to the list of redundant ns-decls. - */ - if (xmlDOMWrapNSNormAddNsMapItem2(&listRedund, - &sizeRedund, &nbRedund, ns, mi->newNs) == -1) - goto internal_error; - /* - * Remove the ns-decl from the element-node. - */ - if (prevns) - prevns->next = ns->next; - else - cur->nsDef = ns->next; - goto next_ns_decl; - } - } - } - - /* - * Skip ns-references handling if the referenced - * ns-decl is declared on the same element. - */ - if ((cur->ns != NULL) && adoptns && (cur->ns == ns)) - adoptns = 0; - /* - * Does it shadow any ns-decl? - */ - if (XML_NSMAP_NOTEMPTY(nsMap)) { - XML_NSMAP_FOREACH(nsMap, mi) { - if ((mi->depth >= XML_TREE_NSMAP_PARENT) && - (mi->shadowDepth == -1) && - ((ns->prefix == mi->newNs->prefix) || - xmlStrEqual(ns->prefix, mi->newNs->prefix))) { - - mi->shadowDepth = depth; - } - } - } - /* - * Push mapping. - */ - if (xmlDOMWrapNsMapAddItem(&nsMap, -1, ns, ns, - depth) == NULL) - goto internal_error; - - prevns = ns; -next_ns_decl: - ns = ns->next; - } - } - if (! adoptns) - goto ns_end; - /* No break on purpose. */ - case XML_ATTRIBUTE_NODE: - /* No ns, no fun. */ - if (cur->ns == NULL) - goto ns_end; - - if (! parnsdone) { - if ((elem->parent) && - ((xmlNodePtr) elem->parent->doc != elem->parent)) { - if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, - elem->parent) == -1) - goto internal_error; - } - parnsdone = 1; - } - /* - * Adjust the reference if this was a redundant ns-decl. - */ - if (listRedund) { - for (i = 0, j = 0; i < nbRedund; i++, j += 2) { - if (cur->ns == listRedund[j]) { - cur->ns = listRedund[++j]; - break; - } - } - } - /* - * Adopt ns-references. - */ - if (XML_NSMAP_NOTEMPTY(nsMap)) { - /* - * Search for a mapping. - */ - XML_NSMAP_FOREACH(nsMap, mi) { - if ((mi->shadowDepth == -1) && - (cur->ns == mi->oldNs)) { - - cur->ns = mi->newNs; - goto ns_end; - } - } - } - /* - * Aquire a normalized ns-decl and add it to the map. - */ - if (xmlDOMWrapNSNormAquireNormalizedNs(doc, curElem, - cur->ns, &ns, - &nsMap, depth, - ancestorsOnly, - (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1) - goto internal_error; - cur->ns = ns; - -ns_end: - if ((cur->type == XML_ELEMENT_NODE) && - (cur->properties != NULL)) { - /* - * Process attributes. - */ - cur = (xmlNodePtr) cur->properties; - continue; - } - break; - default: - goto next_sibling; - } -into_content: - if ((cur->type == XML_ELEMENT_NODE) && - (cur->children != NULL)) { - /* - * Process content of element-nodes only. - */ - cur = cur->children; - continue; - } -next_sibling: - if (cur == elem) - break; - if (cur->type == XML_ELEMENT_NODE) { - if (XML_NSMAP_NOTEMPTY(nsMap)) { - /* - * Pop mappings. - */ - while ((nsMap->last != NULL) && - (nsMap->last->depth >= depth)) - { - XML_NSMAP_POP(nsMap, mi) - } - /* - * Unshadow. - */ - XML_NSMAP_FOREACH(nsMap, mi) { - if (mi->shadowDepth >= depth) - mi->shadowDepth = -1; - } - } - depth--; - } - if (cur->next != NULL) - cur = cur->next; - else { - if (cur->type == XML_ATTRIBUTE_NODE) { - cur = cur->parent; - goto into_content; - } - cur = cur->parent; - goto next_sibling; - } - } while (cur != NULL); - - ret = 0; - goto exit; -internal_error: - ret = -1; -exit: - if (listRedund) { - for (i = 0, j = 0; i < nbRedund; i++, j += 2) { - xmlFreeNs(listRedund[j]); - } - xmlFree(listRedund); - } - if (nsMap != NULL) - xmlDOMWrapNsMapFree(nsMap); - return (ret); -} - -/* -* xmlDOMWrapAdoptBranch: -* @ctxt: the optional context for custom processing -* @sourceDoc: the optional sourceDoc -* @node: the element-node to start with -* @destDoc: the destination doc for adoption -* @destParent: the optional new parent of @node in @destDoc -* @options: option flags -* -* Ensures that ns-references point to @destDoc: either to -* elements->nsDef entries if @destParent is given, or to -* @destDoc->oldNs otherwise. -* If @destParent is given, it ensures that the tree is namespace -* wellformed by creating additional ns-decls where needed. -* Note that, since prefixes of already existent ns-decls can be -* shadowed by this process, it could break QNames in attribute -* values or element content. -* -* NOTE: This function was not intensively tested. -* -* Returns 0 if succeeded, -1 otherwise and on API/internal errors. -*/ -static int -xmlDOMWrapAdoptBranch(xmlDOMWrapCtxtPtr ctxt, - xmlDocPtr sourceDoc, - xmlNodePtr node, - xmlDocPtr destDoc, - xmlNodePtr destParent, - int options ATTRIBUTE_UNUSED) -{ - int ret = 0; - xmlNodePtr cur, curElem = NULL; - xmlNsMapPtr nsMap = NULL; - xmlNsMapItemPtr mi; - xmlNsPtr ns = NULL; - int depth = -1, adoptStr = 1; - /* gather @parent's ns-decls. */ - int parnsdone; - /* @ancestorsOnly should be set per option. */ - int ancestorsOnly = 0; - - /* - * Optimize string adoption for equal or none dicts. - */ - if ((sourceDoc != NULL) && - (sourceDoc->dict == destDoc->dict)) - adoptStr = 0; - else - adoptStr = 1; - - /* - * Get the ns-map from the context if available. - */ - if (ctxt) - nsMap = (xmlNsMapPtr) ctxt->namespaceMap; - /* - * Disable search for ns-decls in the parent-axis of the - * desination element, if: - * 1) there's no destination parent - * 2) custom ns-reference handling is used - */ - if ((destParent == NULL) || - (ctxt && ctxt->getNsForNodeFunc)) - { - parnsdone = 1; - } else - parnsdone = 0; - - cur = node; - while (cur != NULL) { - /* - * Paranoid source-doc sanity check. - */ - if (cur->doc != sourceDoc) { - /* - * We'll assume XIncluded nodes if the doc differs. - * TODO: Do we need to reconciliate XIncluded nodes? - * This here skips XIncluded nodes and tries to handle - * broken sequences. - */ - if (cur->next == NULL) - goto leave_node; - do { - cur = cur->next; - if ((cur->type == XML_XINCLUDE_END) || - (cur->doc == node->doc)) - break; - } while (cur->next != NULL); - - if (cur->doc != node->doc) - goto leave_node; - } - cur->doc = destDoc; - switch (cur->type) { - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - /* - * TODO - */ - return (-1); - case XML_ELEMENT_NODE: - curElem = cur; - depth++; - /* - * Namespace declarations. - * - ns->href and ns->prefix are never in the dict, so - * we need not move the values over to the destination dict. - * - Note that for custom handling of ns-references, - * the ns-decls need not be stored in the ns-map, - * since they won't be referenced by node->ns. - */ - if ((cur->nsDef) && - ((ctxt == NULL) || (ctxt->getNsForNodeFunc == NULL))) - { - if (! parnsdone) { - /* - * Gather @parent's in-scope ns-decls. - */ - if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, - destParent) == -1) - goto internal_error; - parnsdone = 1; - } - for (ns = cur->nsDef; ns != NULL; ns = ns->next) { - /* - * NOTE: ns->prefix and ns->href are never in the dict. - * XML_TREE_ADOPT_STR(ns->prefix) - * XML_TREE_ADOPT_STR(ns->href) - */ - /* - * Does it shadow any ns-decl? - */ - if (XML_NSMAP_NOTEMPTY(nsMap)) { - XML_NSMAP_FOREACH(nsMap, mi) { - if ((mi->depth >= XML_TREE_NSMAP_PARENT) && - (mi->shadowDepth == -1) && - ((ns->prefix == mi->newNs->prefix) || - xmlStrEqual(ns->prefix, - mi->newNs->prefix))) { - - mi->shadowDepth = depth; - } - } - } - /* - * Push mapping. - */ - if (xmlDOMWrapNsMapAddItem(&nsMap, -1, - ns, ns, depth) == NULL) - goto internal_error; - } - } - /* No break on purpose. */ - case XML_ATTRIBUTE_NODE: - /* No namespace, no fun. */ - if (cur->ns == NULL) - goto ns_end; - - if (! parnsdone) { - if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, - destParent) == -1) - goto internal_error; - parnsdone = 1; - } - /* - * Adopt ns-references. - */ - if (XML_NSMAP_NOTEMPTY(nsMap)) { - /* - * Search for a mapping. - */ - XML_NSMAP_FOREACH(nsMap, mi) { - if ((mi->shadowDepth == -1) && - (cur->ns == mi->oldNs)) { - - cur->ns = mi->newNs; - goto ns_end; - } - } - } - /* - * No matching namespace in scope. We need a new one. - */ - if ((ctxt) && (ctxt->getNsForNodeFunc)) { - /* - * User-defined behaviour. - */ - ns = ctxt->getNsForNodeFunc(ctxt, cur, - cur->ns->href, cur->ns->prefix); - /* - * Insert mapping if ns is available; it's the users fault - * if not. - */ - if (xmlDOMWrapNsMapAddItem(&nsMap, -1, - cur->ns, ns, XML_TREE_NSMAP_CUSTOM) == NULL) - goto internal_error; - cur->ns = ns; - } else { - /* - * Aquire a normalized ns-decl and add it to the map. - */ - if (xmlDOMWrapNSNormAquireNormalizedNs(destDoc, - /* ns-decls on curElem or on destDoc->oldNs */ - destParent ? curElem : NULL, - cur->ns, &ns, - &nsMap, depth, - ancestorsOnly, - /* ns-decls must be prefixed for attributes. */ - (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1) - goto internal_error; - cur->ns = ns; - } -ns_end: - /* - * Further node properties. - * TODO: Is this all? - */ - XML_TREE_ADOPT_STR(cur->name) - if (cur->type == XML_ELEMENT_NODE) { - cur->psvi = NULL; - cur->line = 0; - cur->extra = 0; - /* - * Walk attributes. - */ - if (cur->properties != NULL) { - /* - * Process first attribute node. - */ - cur = (xmlNodePtr) cur->properties; - continue; - } - } else { - /* - * Attributes. - */ - if ((sourceDoc != NULL) && - (((xmlAttrPtr) cur)->atype == XML_ATTRIBUTE_ID)) - { - xmlRemoveID(sourceDoc, (xmlAttrPtr) cur); - } - ((xmlAttrPtr) cur)->atype = 0; - ((xmlAttrPtr) cur)->psvi = NULL; - } - break; - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - /* - * This puts the content in the dest dict, only if - * it was previously in the source dict. - */ - XML_TREE_ADOPT_STR_2(cur->content) - goto leave_node; - case XML_ENTITY_REF_NODE: - /* - * Remove reference to the entitity-node. - */ - cur->content = NULL; - cur->children = NULL; - cur->last = NULL; - if ((destDoc->intSubset) || (destDoc->extSubset)) { - xmlEntityPtr ent; - /* - * Assign new entity-node if available. - */ - ent = xmlGetDocEntity(destDoc, cur->name); - if (ent != NULL) { - cur->content = ent->content; - cur->children = (xmlNodePtr) ent; - cur->last = (xmlNodePtr) ent; - } - } - goto leave_node; - case XML_PI_NODE: - XML_TREE_ADOPT_STR(cur->name) - XML_TREE_ADOPT_STR_2(cur->content) - break; - case XML_COMMENT_NODE: - break; - default: - goto internal_error; - } - /* - * Walk the tree. - */ - if (cur->children != NULL) { - cur = cur->children; - continue; - } - -leave_node: - if (cur == node) - break; - if ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) - { - /* - * TODO: Do we expect nsDefs on XML_XINCLUDE_START? - */ - if (XML_NSMAP_NOTEMPTY(nsMap)) { - /* - * Pop mappings. - */ - while ((nsMap->last != NULL) && - (nsMap->last->depth >= depth)) - { - XML_NSMAP_POP(nsMap, mi) - } - /* - * Unshadow. - */ - XML_NSMAP_FOREACH(nsMap, mi) { - if (mi->shadowDepth >= depth) - mi->shadowDepth = -1; - } - } - depth--; - } - if (cur->next != NULL) - cur = cur->next; - else if ((cur->type == XML_ATTRIBUTE_NODE) && - (cur->parent->children != NULL)) - { - cur = cur->parent->children; - } else { - cur = cur->parent; - goto leave_node; - } - } - - goto exit; - -internal_error: - ret = -1; - -exit: - /* - * Cleanup. - */ - if (nsMap != NULL) { - if ((ctxt) && (ctxt->namespaceMap == nsMap)) { - /* - * Just cleanup the map but don't free. - */ - if (nsMap->first) { - if (nsMap->pool) - nsMap->last->next = nsMap->pool; - nsMap->pool = nsMap->first; - nsMap->first = NULL; - } - } else - xmlDOMWrapNsMapFree(nsMap); - } - return(ret); -} - -/* -* xmlDOMWrapCloneNode: -* @ctxt: the optional context for custom processing -* @sourceDoc: the optional sourceDoc -* @node: the node to start with -* @resNode: the clone of the given @node -* @destDoc: the destination doc -* @destParent: the optional new parent of @node in @destDoc -* @deep: descend into child if set -* @options: option flags -* -* References of out-of scope ns-decls are remapped to point to @destDoc: -* 1) If @destParent is given, then nsDef entries on element-nodes are used -* 2) If *no* @destParent is given, then @destDoc->oldNs entries are used. -* This is the case when you don't know already where the cloned branch -* will be added to. -* -* If @destParent is given, it ensures that the tree is namespace -* wellformed by creating additional ns-decls where needed. -* Note that, since prefixes of already existent ns-decls can be -* shadowed by this process, it could break QNames in attribute -* values or element content. -* TODO: -* 1) What to do with XInclude? Currently this returns an error for XInclude. -* -* Returns 0 if the operation succeeded, -* 1 if a node of unsupported (or not yet supported) type was given, -* -1 on API/internal errors. -*/ - -int -xmlDOMWrapCloneNode(xmlDOMWrapCtxtPtr ctxt, - xmlDocPtr sourceDoc, - xmlNodePtr node, - xmlNodePtr *resNode, - xmlDocPtr destDoc, - xmlNodePtr destParent, - int deep, - int options ATTRIBUTE_UNUSED) -{ - int ret = 0; - xmlNodePtr cur, curElem = NULL; - xmlNsMapPtr nsMap = NULL; - xmlNsMapItemPtr mi; - xmlNsPtr ns; - int depth = -1; - /* int adoptStr = 1; */ - /* gather @parent's ns-decls. */ - int parnsdone = 0; - /* - * @ancestorsOnly: - * TODO: @ancestorsOnly should be set per option. - * - */ - int ancestorsOnly = 0; - xmlNodePtr resultClone = NULL, clone = NULL, parentClone = NULL, prevClone = NULL; - xmlNsPtr cloneNs = NULL, *cloneNsDefSlot = NULL; - xmlDictPtr dict; /* The destination dict */ - - if ((node == NULL) || (resNode == NULL) || (destDoc == NULL)) - return(-1); - /* - * TODO: Initially we support only element-nodes. - */ - if (node->type != XML_ELEMENT_NODE) - return(1); - /* - * Check node->doc sanity. - */ - if ((node->doc != NULL) && (sourceDoc != NULL) && - (node->doc != sourceDoc)) { - /* - * Might be an XIncluded node. - */ - return (-1); - } - if (sourceDoc == NULL) - sourceDoc = node->doc; - if (sourceDoc == NULL) - return (-1); - - dict = destDoc->dict; - /* - * Reuse the namespace map of the context. - */ - if (ctxt) - nsMap = (xmlNsMapPtr) ctxt->namespaceMap; - - *resNode = NULL; - - cur = node; - while (cur != NULL) { - if (cur->doc != sourceDoc) { - /* - * We'll assume XIncluded nodes if the doc differs. - * TODO: Do we need to reconciliate XIncluded nodes? - * TODO: This here returns -1 in this case. - */ - goto internal_error; - } - /* - * Create a new node. - */ - switch (cur->type) { - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - /* - * TODO: What to do with XInclude? - */ - goto internal_error; - break; - case XML_ELEMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_COMMENT_NODE: - case XML_PI_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - /* - * Nodes of xmlNode structure. - */ - clone = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (clone == NULL) { - xmlTreeErrMemory("xmlDOMWrapCloneNode(): allocating a node"); - goto internal_error; - } - memset(clone, 0, sizeof(xmlNode)); - /* - * Set hierarchical links. - */ - if (resultClone != NULL) { - clone->parent = parentClone; - if (prevClone) { - prevClone->next = clone; - clone->prev = prevClone; - } else - parentClone->children = clone; - } else - resultClone = clone; - - break; - case XML_ATTRIBUTE_NODE: - /* - * Attributes (xmlAttr). - */ - clone = (xmlNodePtr) xmlMalloc(sizeof(xmlAttr)); - if (clone == NULL) { - xmlTreeErrMemory("xmlDOMWrapCloneNode(): allocating an attr-node"); - goto internal_error; - } - memset(clone, 0, sizeof(xmlAttr)); - /* - * Set hierarchical links. - * TODO: Change this to add to the end of attributes. - */ - if (resultClone != NULL) { - clone->parent = parentClone; - if (prevClone) { - prevClone->next = clone; - clone->prev = prevClone; - } else - parentClone->properties = (xmlAttrPtr) clone; - } else - resultClone = clone; - break; - default: - /* - * TODO QUESTION: Any other nodes expected? - */ - goto internal_error; - } - - clone->type = cur->type; - clone->doc = destDoc; - - /* - * Clone the name of the node if any. - */ - if (cur->name == xmlStringText) - clone->name = xmlStringText; - else if (cur->name == xmlStringTextNoenc) - /* - * NOTE: Although xmlStringTextNoenc is never assigned to a node - * in tree.c, it might be set in Libxslt via - * "xsl:disable-output-escaping". - */ - clone->name = xmlStringTextNoenc; - else if (cur->name == xmlStringComment) - clone->name = xmlStringComment; - else if (cur->name != NULL) { - DICT_CONST_COPY(cur->name, clone->name); - } - - switch (cur->type) { - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - /* - * TODO - */ - return (-1); - case XML_ELEMENT_NODE: - curElem = cur; - depth++; - /* - * Namespace declarations. - */ - if (cur->nsDef != NULL) { - if (! parnsdone) { - if (destParent && (ctxt == NULL)) { - /* - * Gather @parent's in-scope ns-decls. - */ - if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, - destParent) == -1) - goto internal_error; - } - parnsdone = 1; - } - /* - * Clone namespace declarations. - */ - cloneNsDefSlot = &(clone->nsDef); - for (ns = cur->nsDef; ns != NULL; ns = ns->next) { - /* - * Create a new xmlNs. - */ - cloneNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); - if (cloneNs == NULL) { - xmlTreeErrMemory("xmlDOMWrapCloneNode(): " - "allocating namespace"); - return(-1); - } - memset(cloneNs, 0, sizeof(xmlNs)); - cloneNs->type = XML_LOCAL_NAMESPACE; - - if (ns->href != NULL) - cloneNs->href = xmlStrdup(ns->href); - if (ns->prefix != NULL) - cloneNs->prefix = xmlStrdup(ns->prefix); - - *cloneNsDefSlot = cloneNs; - cloneNsDefSlot = &(cloneNs->next); - - /* - * Note that for custom handling of ns-references, - * the ns-decls need not be stored in the ns-map, - * since they won't be referenced by node->ns. - */ - if ((ctxt == NULL) || - (ctxt->getNsForNodeFunc == NULL)) - { - /* - * Does it shadow any ns-decl? - */ - if (XML_NSMAP_NOTEMPTY(nsMap)) { - XML_NSMAP_FOREACH(nsMap, mi) { - if ((mi->depth >= XML_TREE_NSMAP_PARENT) && - (mi->shadowDepth == -1) && - ((ns->prefix == mi->newNs->prefix) || - xmlStrEqual(ns->prefix, - mi->newNs->prefix))) { - /* - * Mark as shadowed at the current - * depth. - */ - mi->shadowDepth = depth; - } - } - } - /* - * Push mapping. - */ - if (xmlDOMWrapNsMapAddItem(&nsMap, -1, - ns, cloneNs, depth) == NULL) - goto internal_error; - } - } - } - /* cur->ns will be processed further down. */ - break; - case XML_ATTRIBUTE_NODE: - /* IDs will be processed further down. */ - /* cur->ns will be processed further down. */ - break; - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - /* - * Note that this will also cover the values of attributes. - */ - DICT_COPY(cur->content, clone->content); - goto leave_node; - case XML_ENTITY_NODE: - /* TODO: What to do here? */ - goto leave_node; - case XML_ENTITY_REF_NODE: - if (sourceDoc != destDoc) { - if ((destDoc->intSubset) || (destDoc->extSubset)) { - xmlEntityPtr ent; - /* - * Different doc: Assign new entity-node if available. - */ - ent = xmlGetDocEntity(destDoc, cur->name); - if (ent != NULL) { - clone->content = ent->content; - clone->children = (xmlNodePtr) ent; - clone->last = (xmlNodePtr) ent; - } - } - } else { - /* - * Same doc: Use the current node's entity declaration - * and value. - */ - clone->content = cur->content; - clone->children = cur->children; - clone->last = cur->last; - } - goto leave_node; - case XML_PI_NODE: - DICT_COPY(cur->content, clone->content); - goto leave_node; - case XML_COMMENT_NODE: - DICT_COPY(cur->content, clone->content); - goto leave_node; - default: - goto internal_error; - } - - if (cur->ns == NULL) - goto end_ns_reference; - -/* handle_ns_reference: */ - /* - ** The following will take care of references to ns-decls ******** - ** and is intended only for element- and attribute-nodes. - ** - */ - if (! parnsdone) { - if (destParent && (ctxt == NULL)) { - if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, destParent) == -1) - goto internal_error; - } - parnsdone = 1; - } - /* - * Adopt ns-references. - */ - if (XML_NSMAP_NOTEMPTY(nsMap)) { - /* - * Search for a mapping. - */ - XML_NSMAP_FOREACH(nsMap, mi) { - if ((mi->shadowDepth == -1) && - (cur->ns == mi->oldNs)) { - /* - * This is the nice case: a mapping was found. - */ - clone->ns = mi->newNs; - goto end_ns_reference; - } - } - } - /* - * No matching namespace in scope. We need a new one. - */ - if ((ctxt != NULL) && (ctxt->getNsForNodeFunc != NULL)) { - /* - * User-defined behaviour. - */ - ns = ctxt->getNsForNodeFunc(ctxt, cur, - cur->ns->href, cur->ns->prefix); - /* - * Add user's mapping. - */ - if (xmlDOMWrapNsMapAddItem(&nsMap, -1, - cur->ns, ns, XML_TREE_NSMAP_CUSTOM) == NULL) - goto internal_error; - clone->ns = ns; - } else { - /* - * Aquire a normalized ns-decl and add it to the map. - */ - if (xmlDOMWrapNSNormAquireNormalizedNs(destDoc, - /* ns-decls on curElem or on destDoc->oldNs */ - destParent ? curElem : NULL, - cur->ns, &ns, - &nsMap, depth, - /* if we need to search only in the ancestor-axis */ - ancestorsOnly, - /* ns-decls must be prefixed for attributes. */ - (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1) - goto internal_error; - clone->ns = ns; - } - -end_ns_reference: - - /* - * Some post-processing. - * - * Handle ID attributes. - */ - if ((clone->type == XML_ATTRIBUTE_NODE) && - (clone->parent != NULL)) - { - if (xmlIsID(destDoc, clone->parent, (xmlAttrPtr) clone)) { - - xmlChar *idVal; - - idVal = xmlNodeListGetString(cur->doc, cur->children, 1); - if (idVal != NULL) { - if (xmlAddID(NULL, destDoc, idVal, (xmlAttrPtr) cur) == NULL) { - /* TODO: error message. */ - xmlFree(idVal); - goto internal_error; - } - xmlFree(idVal); - } - } - } - /* - ** - ** The following will traverse the tree ************************** - ** - * - * Walk the element's attributes before descending into child-nodes. - */ - if ((cur->type == XML_ELEMENT_NODE) && (cur->properties != NULL)) { - prevClone = NULL; - parentClone = clone; - cur = (xmlNodePtr) cur->properties; - continue; - } -into_content: - /* - * Descend into child-nodes. - */ - if (cur->children != NULL) { - if (deep || (cur->type == XML_ATTRIBUTE_NODE)) { - prevClone = NULL; - parentClone = clone; - cur = cur->children; - continue; - } - } - -leave_node: - /* - * At this point we are done with the node, its content - * and an element-nodes's attribute-nodes. - */ - if (cur == node) - break; - if ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) { - /* - * TODO: Do we expect nsDefs on XML_XINCLUDE_START? - */ - if (XML_NSMAP_NOTEMPTY(nsMap)) { - /* - * Pop mappings. - */ - while ((nsMap->last != NULL) && - (nsMap->last->depth >= depth)) - { - XML_NSMAP_POP(nsMap, mi) - } - /* - * Unshadow. - */ - XML_NSMAP_FOREACH(nsMap, mi) { - if (mi->shadowDepth >= depth) - mi->shadowDepth = -1; - } - } - depth--; - } - if (cur->next != NULL) { - prevClone = clone; - cur = cur->next; - } else if (cur->type != XML_ATTRIBUTE_NODE) { - /* - * Set clone->last. - */ - if (clone->parent != NULL) - clone->parent->last = clone; - clone = clone->parent; - parentClone = clone->parent; - /* - * Process parent --> next; - */ - cur = cur->parent; - goto leave_node; - } else { - /* This is for attributes only. */ - clone = clone->parent; - parentClone = clone->parent; - /* - * Process parent-element --> children. - */ - cur = cur->parent; - goto into_content; - } - } - goto exit; - -internal_error: - ret = -1; - -exit: - /* - * Cleanup. - */ - if (nsMap != NULL) { - if ((ctxt) && (ctxt->namespaceMap == nsMap)) { - /* - * Just cleanup the map but don't free. - */ - if (nsMap->first) { - if (nsMap->pool) - nsMap->last->next = nsMap->pool; - nsMap->pool = nsMap->first; - nsMap->first = NULL; - } - } else - xmlDOMWrapNsMapFree(nsMap); - } - /* - * TODO: Should we try a cleanup of the cloned node in case of a - * fatal error? - */ - *resNode = resultClone; - return (ret); -} - -/* -* xmlDOMWrapAdoptAttr: -* @ctxt: the optional context for custom processing -* @sourceDoc: the optional source document of attr -* @attr: the attribute-node to be adopted -* @destDoc: the destination doc for adoption -* @destParent: the optional new parent of @attr in @destDoc -* @options: option flags -* -* @attr is adopted by @destDoc. -* Ensures that ns-references point to @destDoc: either to -* elements->nsDef entries if @destParent is given, or to -* @destDoc->oldNs otherwise. -* -* Returns 0 if succeeded, -1 otherwise and on API/internal errors. -*/ -static int -xmlDOMWrapAdoptAttr(xmlDOMWrapCtxtPtr ctxt, - xmlDocPtr sourceDoc, - xmlAttrPtr attr, - xmlDocPtr destDoc, - xmlNodePtr destParent, - int options ATTRIBUTE_UNUSED) -{ - xmlNodePtr cur; - int adoptStr = 1; - - if ((attr == NULL) || (destDoc == NULL)) - return (-1); - - attr->doc = destDoc; - if (attr->ns != NULL) { - xmlNsPtr ns = NULL; - - if (ctxt != NULL) { - /* TODO: User defined. */ - } - /* XML Namespace. */ - if (IS_STR_XML(attr->ns->prefix)) { - ns = xmlTreeEnsureXMLDecl(destDoc); - } else if (destParent == NULL) { - /* - * Store in @destDoc->oldNs. - */ - ns = xmlDOMWrapStoreNs(destDoc, attr->ns->href, attr->ns->prefix); - } else { - /* - * Declare on @destParent. - */ - if (xmlSearchNsByNamespaceStrict(destDoc, destParent, attr->ns->href, - &ns, 1) == -1) - goto internal_error; - if (ns == NULL) { - ns = xmlDOMWrapNSNormDeclareNsForced(destDoc, destParent, - attr->ns->href, attr->ns->prefix, 1); - } - } - if (ns == NULL) - goto internal_error; - attr->ns = ns; - } - - XML_TREE_ADOPT_STR(attr->name); - attr->atype = 0; - attr->psvi = NULL; - /* - * Walk content. - */ - if (attr->children == NULL) - return (0); - cur = attr->children; - while (cur != NULL) { - cur->doc = destDoc; - switch (cur->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - XML_TREE_ADOPT_STR_2(cur->content) - break; - case XML_ENTITY_REF_NODE: - /* - * Remove reference to the entitity-node. - */ - cur->content = NULL; - cur->children = NULL; - cur->last = NULL; - if ((destDoc->intSubset) || (destDoc->extSubset)) { - xmlEntityPtr ent; - /* - * Assign new entity-node if available. - */ - ent = xmlGetDocEntity(destDoc, cur->name); - if (ent != NULL) { - cur->content = ent->content; - cur->children = (xmlNodePtr) ent; - cur->last = (xmlNodePtr) ent; - } - } - break; - default: - break; - } - if (cur->children != NULL) { - cur = cur->children; - continue; - } -next_sibling: - if (cur == (xmlNodePtr) attr) - break; - if (cur->next != NULL) - cur = cur->next; - else { - cur = cur->parent; - goto next_sibling; - } - } - return (0); -internal_error: - return (-1); -} - -/* -* xmlDOMWrapAdoptNode: -* @ctxt: the optional context for custom processing -* @sourceDoc: the optional sourceDoc -* @node: the node to start with -* @destDoc: the destination doc -* @destParent: the optional new parent of @node in @destDoc -* @options: option flags -* -* References of out-of scope ns-decls are remapped to point to @destDoc: -* 1) If @destParent is given, then nsDef entries on element-nodes are used -* 2) If *no* @destParent is given, then @destDoc->oldNs entries are used -* This is the case when you have an unliked node and just want to move it -* to the context of -* -* If @destParent is given, it ensures that the tree is namespace -* wellformed by creating additional ns-decls where needed. -* Note that, since prefixes of already existent ns-decls can be -* shadowed by this process, it could break QNames in attribute -* values or element content. -* NOTE: This function was not intensively tested. -* -* Returns 0 if the operation succeeded, -* 1 if a node of unsupported type was given, -* 2 if a node of not yet supported type was given and -* -1 on API/internal errors. -*/ -int -xmlDOMWrapAdoptNode(xmlDOMWrapCtxtPtr ctxt, - xmlDocPtr sourceDoc, - xmlNodePtr node, - xmlDocPtr destDoc, - xmlNodePtr destParent, - int options) -{ - if ((node == NULL) || (destDoc == NULL) || - ((destParent != NULL) && (destParent->doc != destDoc))) - return(-1); - /* - * Check node->doc sanity. - */ - if ((node->doc != NULL) && (sourceDoc != NULL) && - (node->doc != sourceDoc)) { - /* - * Might be an XIncluded node. - */ - return (-1); - } - if (sourceDoc == NULL) - sourceDoc = node->doc; - if (sourceDoc == destDoc) - return (-1); - switch (node->type) { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - break; - case XML_DOCUMENT_FRAG_NODE: - /* TODO: Support document-fragment-nodes. */ - return (2); - default: - return (1); - } - /* - * Unlink only if @node was not already added to @destParent. - */ - if ((node->parent != NULL) && (destParent != node->parent)) - xmlUnlinkNode(node); - - if (node->type == XML_ELEMENT_NODE) { - return (xmlDOMWrapAdoptBranch(ctxt, sourceDoc, node, - destDoc, destParent, options)); - } else if (node->type == XML_ATTRIBUTE_NODE) { - return (xmlDOMWrapAdoptAttr(ctxt, sourceDoc, - (xmlAttrPtr) node, destDoc, destParent, options)); - } else { - xmlNodePtr cur = node; - int adoptStr = 1; - - cur->doc = destDoc; - /* - * Optimize string adoption. - */ - if ((sourceDoc != NULL) && - (sourceDoc->dict == destDoc->dict)) - adoptStr = 0; - switch (node->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - XML_TREE_ADOPT_STR_2(node->content) - break; - case XML_ENTITY_REF_NODE: - /* - * Remove reference to the entitity-node. - */ - node->content = NULL; - node->children = NULL; - node->last = NULL; - if ((destDoc->intSubset) || (destDoc->extSubset)) { - xmlEntityPtr ent; - /* - * Assign new entity-node if available. - */ - ent = xmlGetDocEntity(destDoc, node->name); - if (ent != NULL) { - node->content = ent->content; - node->children = (xmlNodePtr) ent; - node->last = (xmlNodePtr) ent; - } - } - XML_TREE_ADOPT_STR(node->name) - break; - case XML_PI_NODE: { - XML_TREE_ADOPT_STR(node->name) - XML_TREE_ADOPT_STR_2(node->content) - break; - } - default: - break; - } - } - return (0); -} - -#define bottom_tree -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/trio.c b/ThirdParty/libxml2/vtklibxml2/trio.c deleted file mode 100644 index 8936bf10dad..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/trio.c +++ /dev/null @@ -1,6855 +0,0 @@ -/************************************************************************* - * - * Id - * - * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************* - * - * A note to trio contributors: - * - * Avoid heap allocation at all costs to ensure that the trio functions - * are async-safe. The exceptions are the printf/fprintf functions, which - * uses fputc, and the asprintf functions and the <alloc> modifier, which - * by design are required to allocate form the heap. - * - ************************************************************************/ - -/* - * TODO: - * - Scan is probably too permissive about its modifiers. - * - C escapes in %#[] ? - * - Multibyte characters (done for format parsing, except scan groups) - * - Complex numbers? (C99 _Complex) - * - Boolean values? (C99 _Bool) - * - C99 NaN(n-char-sequence) missing. The n-char-sequence can be used - * to print the mantissa, e.g. NaN(0xc000000000000000) - * - Should we support the GNU %a alloc modifier? GNU has an ugly hack - * for %a, because C99 used %a for other purposes. If specified as - * %as or %a[ it is interpreted as the alloc modifier, otherwise as - * the C99 hex-float. This means that you cannot scan %as as a hex-float - * immediately followed by an 's'. - * - Scanning of collating symbols. - */ - -/************************************************************************* - * Trio include files - */ -#include "triodef.h" -#include "trio.h" -#include "triop.h" -#include "trionan.h" -#if !defined(TRIO_MINIMAL) -# include "triostr.h" -#endif - -/************************************************************************** - * - * Definitions - * - *************************************************************************/ - -#include <math.h> -#include <limits.h> -#include <float.h> - -#if defined(__STDC_ISO_10646__) || defined(MB_LEN_MAX) || defined(USE_MULTIBYTE) || TRIO_WIDECHAR -# define TRIO_COMPILER_SUPPORTS_MULTIBYTE -# if !defined(MB_LEN_MAX) -# define MB_LEN_MAX 6 -# endif -#endif - -#if (defined(TRIO_COMPILER_MSVC) && (_MSC_VER >= 1100)) || defined(TRIO_COMPILER_BCB) -# define TRIO_COMPILER_SUPPORTS_MSVC_INT -#endif - -/************************************************************************* - * Generic definitions - */ - -#if !(defined(DEBUG) || defined(NDEBUG)) -# define NDEBUG -#endif - -#include <assert.h> -#include <ctype.h> -#if !defined(TRIO_COMPILER_SUPPORTS_C99) -# define isblank(x) (((x)==32) || ((x)==9)) -#endif -#if defined(TRIO_COMPILER_ANCIENT) -# include <varargs.h> -#else -# include <stdarg.h> -#endif -#include <stddef.h> -#include <errno.h> - -#ifndef NULL -# define NULL 0 -#endif -#define NIL ((char)0) -#ifndef FALSE -# define FALSE (1 == 0) -# define TRUE (! FALSE) -#endif -#define BOOLEAN_T int - -/* mincore() can be used for debugging purposes */ -#define VALID(x) (NULL != (x)) - -#if TRIO_ERRORS - /* - * Encode the error code and the position. This is decoded - * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION. - */ -# define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8))) -#else -# define TRIO_ERROR_RETURN(x,y) (-1) -#endif - -typedef unsigned long trio_flags_t; - - -/************************************************************************* - * Platform specific definitions - */ -#if defined(TRIO_PLATFORM_UNIX) -# include <unistd.h> -# include <signal.h> -# include <locale.h> -# define USE_LOCALE -#endif /* TRIO_PLATFORM_UNIX */ -#if defined(TRIO_PLATFORM_VMS) -# include <unistd.h> -#endif -#if defined(TRIO_PLATFORM_WIN32) -# include <io.h> -# define read _read -# define write _write -#endif /* TRIO_PLATFORM_WIN32 */ - -#if TRIO_WIDECHAR -# if defined(TRIO_COMPILER_SUPPORTS_ISO94) -# include <wchar.h> -# include <wctype.h> -typedef wchar_t trio_wchar_t; -typedef wint_t trio_wint_t; -# else -typedef char trio_wchar_t; -typedef int trio_wint_t; -# define WCONST(x) L ## x -# define WEOF EOF -# define iswalnum(x) isalnum(x) -# define iswalpha(x) isalpha(x) -# define iswblank(x) isblank(x) -# define iswcntrl(x) iscntrl(x) -# define iswdigit(x) isdigit(x) -# define iswgraph(x) isgraph(x) -# define iswlower(x) islower(x) -# define iswprint(x) isprint(x) -# define iswpunct(x) ispunct(x) -# define iswspace(x) isspace(x) -# define iswupper(x) isupper(x) -# define iswxdigit(x) isxdigit(x) -# endif -#endif - - -/************************************************************************* - * Compiler dependent definitions - */ - -/* Support for long long */ -#ifndef __cplusplus -# if !defined(USE_LONGLONG) -# if defined(TRIO_COMPILER_GCC) && !defined(__STRICT_ANSI__) -# define USE_LONGLONG -# elif defined(TRIO_COMPILER_SUNPRO) -# define USE_LONGLONG -# elif defined(_LONG_LONG) || defined(_LONGLONG) -# define USE_LONGLONG -# endif -# endif -#endif - -/* The extra long numbers */ -#if defined(USE_LONGLONG) -typedef signed long long int trio_longlong_t; -typedef unsigned long long int trio_ulonglong_t; -#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT) -typedef signed __int64 trio_longlong_t; -typedef unsigned __int64 trio_ulonglong_t; -#else -typedef TRIO_SIGNED long int trio_longlong_t; -typedef unsigned long int trio_ulonglong_t; -#endif - -/* Maximal and fixed integer types */ -#if defined(TRIO_COMPILER_SUPPORTS_C99) -# include <stdint.h> -typedef intmax_t trio_intmax_t; -typedef uintmax_t trio_uintmax_t; -typedef int8_t trio_int8_t; -typedef int16_t trio_int16_t; -typedef int32_t trio_int32_t; -typedef int64_t trio_int64_t; -#elif defined(TRIO_COMPILER_SUPPORTS_UNIX98) -# include <inttypes.h> -typedef intmax_t trio_intmax_t; -typedef uintmax_t trio_uintmax_t; -typedef int8_t trio_int8_t; -typedef int16_t trio_int16_t; -typedef int32_t trio_int32_t; -typedef int64_t trio_int64_t; -#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT) -typedef trio_longlong_t trio_intmax_t; -typedef trio_ulonglong_t trio_uintmax_t; -typedef __int8 trio_int8_t; -typedef __int16 trio_int16_t; -typedef __int32 trio_int32_t; -typedef __int64 trio_int64_t; -#else -typedef trio_longlong_t trio_intmax_t; -typedef trio_ulonglong_t trio_uintmax_t; -# if defined(TRIO_INT8_T) -typedef TRIO_INT8_T trio_int8_t; -# else -typedef TRIO_SIGNED char trio_int8_t; -# endif -# if defined(TRIO_INT16_T) -typedef TRIO_INT16_T trio_int16_t; -# else -typedef TRIO_SIGNED short trio_int16_t; -# endif -# if defined(TRIO_INT32_T) -typedef TRIO_INT32_T trio_int32_t; -# else -typedef TRIO_SIGNED int trio_int32_t; -# endif -# if defined(TRIO_INT64_T) -typedef TRIO_INT64_T trio_int64_t; -# else -typedef trio_longlong_t trio_int64_t; -# endif -#endif - -#if !(defined(TRIO_COMPILER_SUPPORTS_C99) \ - || defined(TRIO_COMPILER_SUPPORTS_UNIX01)) -# define floorl(x) floor((double)(x)) -# define fmodl(x,y) fmod((double)(x),(double)(y)) -# define powl(x,y) pow((double)(x),(double)(y)) -#endif - -#define TRIO_FABS(x) (((x) < 0.0) ? -(x) : (x)) - -/************************************************************************* - * Internal Definitions - */ - -#ifndef DECIMAL_DIG -# define DECIMAL_DIG DBL_DIG -#endif - -/* Long double sizes */ -#ifdef LDBL_DIG -# define MAX_MANTISSA_DIGITS LDBL_DIG -# define MAX_EXPONENT_DIGITS 4 -# define MAX_DOUBLE_DIGITS LDBL_MAX_10_EXP -#else -# define MAX_MANTISSA_DIGITS DECIMAL_DIG -# define MAX_EXPONENT_DIGITS 3 -# define MAX_DOUBLE_DIGITS DBL_MAX_10_EXP -#endif - -#if defined(TRIO_COMPILER_ANCIENT) || !defined(LDBL_DIG) -# undef LDBL_DIG -# undef LDBL_MANT_DIG -# undef LDBL_EPSILON -# define LDBL_DIG DBL_DIG -# define LDBL_MANT_DIG DBL_MANT_DIG -# define LDBL_EPSILON DBL_EPSILON -#endif - -/* The maximal number of digits is for base 2 */ -#define MAX_CHARS_IN(x) (sizeof(x) * CHAR_BIT) -/* The width of a pointer. The number of bits in a hex digit is 4 */ -#define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4) - -/* Infinite and Not-A-Number for floating-point */ -#define INFINITE_LOWER "inf" -#define INFINITE_UPPER "INF" -#define LONG_INFINITE_LOWER "infinite" -#define LONG_INFINITE_UPPER "INFINITE" -#define NAN_LOWER "nan" -#define NAN_UPPER "NAN" - -/* Various constants */ -enum { - TYPE_PRINT = 1, - TYPE_SCAN = 2, - - /* Flags. FLAGS_LAST must be less than ULONG_MAX */ - FLAGS_NEW = 0, - FLAGS_STICKY = 1, - FLAGS_SPACE = 2 * FLAGS_STICKY, - FLAGS_SHOWSIGN = 2 * FLAGS_SPACE, - FLAGS_LEFTADJUST = 2 * FLAGS_SHOWSIGN, - FLAGS_ALTERNATIVE = 2 * FLAGS_LEFTADJUST, - FLAGS_SHORT = 2 * FLAGS_ALTERNATIVE, - FLAGS_SHORTSHORT = 2 * FLAGS_SHORT, - FLAGS_LONG = 2 * FLAGS_SHORTSHORT, - FLAGS_QUAD = 2 * FLAGS_LONG, - FLAGS_LONGDOUBLE = 2 * FLAGS_QUAD, - FLAGS_SIZE_T = 2 * FLAGS_LONGDOUBLE, - FLAGS_PTRDIFF_T = 2 * FLAGS_SIZE_T, - FLAGS_INTMAX_T = 2 * FLAGS_PTRDIFF_T, - FLAGS_NILPADDING = 2 * FLAGS_INTMAX_T, - FLAGS_UNSIGNED = 2 * FLAGS_NILPADDING, - FLAGS_UPPER = 2 * FLAGS_UNSIGNED, - FLAGS_WIDTH = 2 * FLAGS_UPPER, - FLAGS_WIDTH_PARAMETER = 2 * FLAGS_WIDTH, - FLAGS_PRECISION = 2 * FLAGS_WIDTH_PARAMETER, - FLAGS_PRECISION_PARAMETER = 2 * FLAGS_PRECISION, - FLAGS_BASE = 2 * FLAGS_PRECISION_PARAMETER, - FLAGS_BASE_PARAMETER = 2 * FLAGS_BASE, - FLAGS_FLOAT_E = 2 * FLAGS_BASE_PARAMETER, - FLAGS_FLOAT_G = 2 * FLAGS_FLOAT_E, - FLAGS_QUOTE = 2 * FLAGS_FLOAT_G, - FLAGS_WIDECHAR = 2 * FLAGS_QUOTE, - FLAGS_ALLOC = 2 * FLAGS_WIDECHAR, - FLAGS_IGNORE = 2 * FLAGS_ALLOC, - FLAGS_IGNORE_PARAMETER = 2 * FLAGS_IGNORE, - FLAGS_VARSIZE_PARAMETER = 2 * FLAGS_IGNORE_PARAMETER, - FLAGS_FIXED_SIZE = 2 * FLAGS_VARSIZE_PARAMETER, - FLAGS_LAST = FLAGS_FIXED_SIZE, - /* Reused flags */ - FLAGS_EXCLUDE = FLAGS_SHORT, - FLAGS_USER_DEFINED = FLAGS_IGNORE, - FLAGS_ROUNDING = FLAGS_INTMAX_T, - /* Compounded flags */ - FLAGS_ALL_VARSIZES = FLAGS_LONG | FLAGS_QUAD | FLAGS_INTMAX_T | FLAGS_PTRDIFF_T | FLAGS_SIZE_T, - FLAGS_ALL_SIZES = FLAGS_ALL_VARSIZES | FLAGS_SHORTSHORT | FLAGS_SHORT, - - NO_POSITION = -1, - NO_WIDTH = 0, - NO_PRECISION = -1, - NO_SIZE = -1, - - /* Do not change these */ - NO_BASE = -1, - MIN_BASE = 2, - MAX_BASE = 36, - BASE_BINARY = 2, - BASE_OCTAL = 8, - BASE_DECIMAL = 10, - BASE_HEX = 16, - - /* Maximal number of allowed parameters */ - MAX_PARAMETERS = 64, - /* Maximal number of characters in class */ - MAX_CHARACTER_CLASS = UCHAR_MAX + 1, - - /* Maximal string lengths for user-defined specifiers */ - MAX_USER_NAME = 64, - MAX_USER_DATA = 256, - - /* Maximal length of locale separator strings */ - MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX, - /* Maximal number of integers in grouping */ - MAX_LOCALE_GROUPS = 64, - - /* Initial size of asprintf buffer */ - DYNAMIC_START_SIZE = 32 -}; - -#define NO_GROUPING ((int)CHAR_MAX) - -/* Fundamental formatting parameter types */ -#define FORMAT_UNKNOWN 0 -#define FORMAT_INT 1 -#define FORMAT_DOUBLE 2 -#define FORMAT_CHAR 3 -#define FORMAT_STRING 4 -#define FORMAT_POINTER 5 -#define FORMAT_COUNT 6 -#define FORMAT_PARAMETER 7 -#define FORMAT_GROUP 8 -#if TRIO_GNU -# define FORMAT_ERRNO 9 -#endif -#if TRIO_EXTENSION -# define FORMAT_USER_DEFINED 10 -#endif - -/* Character constants */ -#define CHAR_IDENTIFIER '%' -#define CHAR_BACKSLASH '\\' -#define CHAR_QUOTE '\"' -#define CHAR_ADJUST ' ' - -/* Character class expressions */ -#define CLASS_ALNUM "[:alnum:]" -#define CLASS_ALPHA "[:alpha:]" -#define CLASS_BLANK "[:blank:]" -#define CLASS_CNTRL "[:cntrl:]" -#define CLASS_DIGIT "[:digit:]" -#define CLASS_GRAPH "[:graph:]" -#define CLASS_LOWER "[:lower:]" -#define CLASS_PRINT "[:print:]" -#define CLASS_PUNCT "[:punct:]" -#define CLASS_SPACE "[:space:]" -#define CLASS_UPPER "[:upper:]" -#define CLASS_XDIGIT "[:xdigit:]" - -/* - * SPECIFIERS: - * - * - * a Hex-float - * A Hex-float - * c Character - * C Widechar character (wint_t) - * d Decimal - * e Float - * E Float - * F Float - * F Float - * g Float - * G Float - * i Integer - * m Error message - * n Count - * o Octal - * p Pointer - * s String - * S Widechar string (wchar_t *) - * u Unsigned - * x Hex - * X Hex - * [] Group - * <> User-defined - * - * Reserved: - * - * D Binary Coded Decimal %D(length,precision) (OS/390) - */ -#define SPECIFIER_CHAR 'c' -#define SPECIFIER_STRING 's' -#define SPECIFIER_DECIMAL 'd' -#define SPECIFIER_INTEGER 'i' -#define SPECIFIER_UNSIGNED 'u' -#define SPECIFIER_OCTAL 'o' -#define SPECIFIER_HEX 'x' -#define SPECIFIER_HEX_UPPER 'X' -#define SPECIFIER_FLOAT_E 'e' -#define SPECIFIER_FLOAT_E_UPPER 'E' -#define SPECIFIER_FLOAT_F 'f' -#define SPECIFIER_FLOAT_F_UPPER 'F' -#define SPECIFIER_FLOAT_G 'g' -#define SPECIFIER_FLOAT_G_UPPER 'G' -#define SPECIFIER_POINTER 'p' -#define SPECIFIER_GROUP '[' -#define SPECIFIER_UNGROUP ']' -#define SPECIFIER_COUNT 'n' -#if TRIO_UNIX98 -# define SPECIFIER_CHAR_UPPER 'C' -# define SPECIFIER_STRING_UPPER 'S' -#endif -#if TRIO_C99 -# define SPECIFIER_HEXFLOAT 'a' -# define SPECIFIER_HEXFLOAT_UPPER 'A' -#endif -#if TRIO_GNU -# define SPECIFIER_ERRNO 'm' -#endif -#if TRIO_EXTENSION -# define SPECIFIER_BINARY 'b' -# define SPECIFIER_BINARY_UPPER 'B' -# define SPECIFIER_USER_DEFINED_BEGIN '<' -# define SPECIFIER_USER_DEFINED_END '>' -# define SPECIFIER_USER_DEFINED_SEPARATOR ':' -#endif - -/* - * QUALIFIERS: - * - * - * Numbers = d,i,o,u,x,X - * Float = a,A,e,E,f,F,g,G - * String = s - * Char = c - * - * - * 9$ Position - * Use the 9th parameter. 9 can be any number between 1 and - * the maximal argument - * - * 9 Width - * Set width to 9. 9 can be any number, but must not be postfixed - * by '$' - * - * h Short - * Numbers: - * (unsigned) short int - * - * hh Short short - * Numbers: - * (unsigned) char - * - * l Long - * Numbers: - * (unsigned) long int - * String: - * as the S specifier - * Char: - * as the C specifier - * - * ll Long Long - * Numbers: - * (unsigned) long long int - * - * L Long Double - * Float - * long double - * - * # Alternative - * Float: - * Decimal-point is always present - * String: - * non-printable characters are handled as \number - * - * Spacing - * - * + Sign - * - * - Alignment - * - * . Precision - * - * * Parameter - * print: use parameter - * scan: no parameter (ignore) - * - * q Quad - * - * Z size_t - * - * w Widechar - * - * ' Thousands/quote - * Numbers: - * Integer part grouped in thousands - * Binary numbers: - * Number grouped in nibbles (4 bits) - * String: - * Quoted string - * - * j intmax_t - * t prtdiff_t - * z size_t - * - * ! Sticky - * @ Parameter (for both print and scan) - * - * I n-bit Integer - * Numbers: - * The following options exists - * I8 = 8-bit integer - * I16 = 16-bit integer - * I32 = 32-bit integer - * I64 = 64-bit integer - */ -#define QUALIFIER_POSITION '$' -#define QUALIFIER_SHORT 'h' -#define QUALIFIER_LONG 'l' -#define QUALIFIER_LONG_UPPER 'L' -#define QUALIFIER_ALTERNATIVE '#' -#define QUALIFIER_SPACE ' ' -#define QUALIFIER_PLUS '+' -#define QUALIFIER_MINUS '-' -#define QUALIFIER_DOT '.' -#define QUALIFIER_STAR '*' -#define QUALIFIER_CIRCUMFLEX '^' /* For scanlists */ -#if TRIO_C99 -# define QUALIFIER_SIZE_T 'z' -# define QUALIFIER_PTRDIFF_T 't' -# define QUALIFIER_INTMAX_T 'j' -#endif -#if TRIO_BSD || TRIO_GNU -# define QUALIFIER_QUAD 'q' -#endif -#if TRIO_GNU -# define QUALIFIER_SIZE_T_UPPER 'Z' -#endif -#if TRIO_MISC -# define QUALIFIER_WIDECHAR 'w' -#endif -#if TRIO_MICROSOFT -# define QUALIFIER_FIXED_SIZE 'I' -#endif -#if TRIO_EXTENSION -# define QUALIFIER_QUOTE '\'' -# define QUALIFIER_STICKY '!' -# define QUALIFIER_VARSIZE '&' /* This should remain undocumented */ -# define QUALIFIER_PARAM '@' /* Experimental */ -# define QUALIFIER_COLON ':' /* For scanlists */ -# define QUALIFIER_EQUAL '=' /* For scanlists */ -# define QUALIFIER_ROUNDING_UPPER 'R' -#endif - - -/************************************************************************* - * - * Internal Structures - * - *************************************************************************/ - -/* Parameters */ -typedef struct { - /* An indication of which entry in the data union is used */ - int type; - /* The flags */ - trio_flags_t flags; - /* The width qualifier */ - int width; - /* The precision qualifier */ - int precision; - /* The base qualifier */ - int base; - /* The size for the variable size qualifier */ - int varsize; - /* The marker of the end of the specifier */ - int indexAfterSpecifier; - /* The data from the argument list */ - union { - char *string; -#if TRIO_WIDECHAR - trio_wchar_t *wstring; -#endif - trio_pointer_t pointer; - union { - trio_intmax_t as_signed; - trio_uintmax_t as_unsigned; - } number; - double doubleNumber; - double *doublePointer; - trio_long_double_t longdoubleNumber; - trio_long_double_t *longdoublePointer; - int errorNumber; - } data; - /* For the user-defined specifier */ - char user_name[MAX_USER_NAME]; - char user_data[MAX_USER_DATA]; -} trio_parameter_t; - -/* Container for customized functions */ -typedef struct { - union { - trio_outstream_t out; - trio_instream_t in; - } stream; - trio_pointer_t closure; -} trio_custom_t; - -/* General trio "class" */ -typedef struct _trio_class_t { - /* - * The function to write characters to a stream. - */ - void (*OutStream) TRIO_PROTO((struct _trio_class_t *, int)); - /* - * The function to read characters from a stream. - */ - void (*InStream) TRIO_PROTO((struct _trio_class_t *, int *)); - /* - * The current location in the stream. - */ - trio_pointer_t location; - /* - * The character currently being processed. - */ - int current; - /* - * The number of characters that would have been written/read - * if there had been sufficient space. - */ - int processed; - /* - * The number of characters that are actually written/read. - * Processed and committed will only differ for the *nprintf - * and *nscanf functions. - */ - int committed; - /* - * The upper limit of characters that may be written/read. - */ - int max; - /* - * The last output error that was detected. - */ - int error; -} trio_class_t; - -/* References (for user-defined callbacks) */ -typedef struct _trio_reference_t { - trio_class_t *data; - trio_parameter_t *parameter; -} trio_reference_t; - -/* Registered entries (for user-defined callbacks) */ -typedef struct _trio_userdef_t { - struct _trio_userdef_t *next; - trio_callback_t callback; - char *name; -} trio_userdef_t; - -/************************************************************************* - * - * Internal Variables - * - *************************************************************************/ - -static TRIO_CONST char rcsid[] = "@(#)Id"; - -/* - * Need this to workaround a parser bug in HP C/iX compiler that fails - * to resolves macro definitions that includes type 'long double', - * e.g: va_arg(arg_ptr, long double) - */ -#if defined(TRIO_PLATFORM_MPEIX) -static TRIO_CONST trio_long_double_t ___dummy_long_double = 0; -#endif - -static TRIO_CONST char internalNullString[] = "(nil)"; - -#if defined(USE_LOCALE) -static struct lconv *internalLocaleValues = NULL; -#endif - -/* - * UNIX98 says "in a locale where the radix character is not defined, - * the radix character defaults to a period (.)" - */ -static int internalDecimalPointLength = 1; -static int internalThousandSeparatorLength = 1; -static char internalDecimalPoint = '.'; -static char internalDecimalPointString[MAX_LOCALE_SEPARATOR_LENGTH + 1] = "."; -static char internalThousandSeparator[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ","; -static char internalGrouping[MAX_LOCALE_GROUPS] = { (char)NO_GROUPING }; - -static TRIO_CONST char internalDigitsLower[] = "0123456789abcdefghijklmnopqrstuvwxyz"; -static TRIO_CONST char internalDigitsUpper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -static BOOLEAN_T internalDigitsUnconverted = TRUE; -static int internalDigitArray[128]; -#if TRIO_EXTENSION -static BOOLEAN_T internalCollationUnconverted = TRUE; -static char internalCollationArray[MAX_CHARACTER_CLASS][MAX_CHARACTER_CLASS]; -#endif - -#if TRIO_EXTENSION -static TRIO_VOLATILE trio_callback_t internalEnterCriticalRegion = NULL; -static TRIO_VOLATILE trio_callback_t internalLeaveCriticalRegion = NULL; -static trio_userdef_t *internalUserDef = NULL; -#endif - - -/************************************************************************* - * - * Internal Functions - * - ************************************************************************/ - -#if defined(TRIO_MINIMAL) -# define TRIO_STRING_PUBLIC static -# include "triostr.c" -#endif /* defined(TRIO_MINIMAL) */ - -/************************************************************************* - * TrioIsQualifier - * - * Description: - * Remember to add all new qualifiers to this function. - * QUALIFIER_POSITION must not be added. - */ -TRIO_PRIVATE BOOLEAN_T -TrioIsQualifier -TRIO_ARGS1((character), - TRIO_CONST char character) -{ - /* QUALIFIER_POSITION is not included */ - switch (character) - { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case QUALIFIER_PLUS: - case QUALIFIER_MINUS: - case QUALIFIER_SPACE: - case QUALIFIER_DOT: - case QUALIFIER_STAR: - case QUALIFIER_ALTERNATIVE: - case QUALIFIER_SHORT: - case QUALIFIER_LONG: - case QUALIFIER_LONG_UPPER: - case QUALIFIER_CIRCUMFLEX: -#if defined(QUALIFIER_SIZE_T) - case QUALIFIER_SIZE_T: -#endif -#if defined(QUALIFIER_PTRDIFF_T) - case QUALIFIER_PTRDIFF_T: -#endif -#if defined(QUALIFIER_INTMAX_T) - case QUALIFIER_INTMAX_T: -#endif -#if defined(QUALIFIER_QUAD) - case QUALIFIER_QUAD: -#endif -#if defined(QUALIFIER_SIZE_T_UPPER) - case QUALIFIER_SIZE_T_UPPER: -#endif -#if defined(QUALIFIER_WIDECHAR) - case QUALIFIER_WIDECHAR: -#endif -#if defined(QUALIFIER_QUOTE) - case QUALIFIER_QUOTE: -#endif -#if defined(QUALIFIER_STICKY) - case QUALIFIER_STICKY: -#endif -#if defined(QUALIFIER_VARSIZE) - case QUALIFIER_VARSIZE: -#endif -#if defined(QUALIFIER_PARAM) - case QUALIFIER_PARAM: -#endif -#if defined(QUALIFIER_FIXED_SIZE) - case QUALIFIER_FIXED_SIZE: -#endif -#if defined(QUALIFIER_ROUNDING_UPPER) - case QUALIFIER_ROUNDING_UPPER: -#endif - return TRUE; - default: - return FALSE; - } -} - -/************************************************************************* - * TrioSetLocale - */ -#if defined(USE_LOCALE) -TRIO_PRIVATE void -TrioSetLocale(TRIO_NOARGS) -{ - internalLocaleValues = (struct lconv *)localeconv(); - if (internalLocaleValues) - { - if ((internalLocaleValues->decimal_point) && - (internalLocaleValues->decimal_point[0] != NIL)) - { - internalDecimalPointLength = trio_length(internalLocaleValues->decimal_point); - if (internalDecimalPointLength == 1) - { - internalDecimalPoint = internalLocaleValues->decimal_point[0]; - } - else - { - internalDecimalPoint = NIL; - trio_copy_max(internalDecimalPointString, - sizeof(internalDecimalPointString), - internalLocaleValues->decimal_point); - } - } - if ((internalLocaleValues->thousands_sep) && - (internalLocaleValues->thousands_sep[0] != NIL)) - { - trio_copy_max(internalThousandSeparator, - sizeof(internalThousandSeparator), - internalLocaleValues->thousands_sep); - internalThousandSeparatorLength = trio_length(internalThousandSeparator); - } - if ((internalLocaleValues->grouping) && - (internalLocaleValues->grouping[0] != NIL)) - { - trio_copy_max(internalGrouping, - sizeof(internalGrouping), - internalLocaleValues->grouping); - } - } -} -#endif /* defined(USE_LOCALE) */ - -TRIO_PRIVATE int -TrioCalcThousandSeparatorLength -TRIO_ARGS1((digits), - int digits) -{ -#if TRIO_EXTENSION - int count = 0; - int step = NO_GROUPING; - char *groupingPointer = internalGrouping; - - while (digits > 0) - { - if (*groupingPointer == CHAR_MAX) - { - /* Disable grouping */ - break; /* while */ - } - else if (*groupingPointer == 0) - { - /* Repeat last group */ - if (step == NO_GROUPING) - { - /* Error in locale */ - break; /* while */ - } - } - else - { - step = *groupingPointer++; - } - if (digits > step) - count += internalThousandSeparatorLength; - digits -= step; - } - return count; -#else - return 0; -#endif -} - -TRIO_PRIVATE BOOLEAN_T -TrioFollowedBySeparator -TRIO_ARGS1((position), - int position) -{ -#if TRIO_EXTENSION - int step = 0; - char *groupingPointer = internalGrouping; - - position--; - if (position == 0) - return FALSE; - while (position > 0) - { - if (*groupingPointer == CHAR_MAX) - { - /* Disable grouping */ - break; /* while */ - } - else if (*groupingPointer != 0) - { - step = *groupingPointer++; - } - if (step == 0) - break; - position -= step; - } - return (position == 0); -#else - return FALSE; -#endif -} - -/************************************************************************* - * TrioGetPosition - * - * Get the %n$ position. - */ -TRIO_PRIVATE int -TrioGetPosition -TRIO_ARGS2((format, indexPointer), - TRIO_CONST char *format, - int *indexPointer) -{ -#if TRIO_UNIX98 - char *tmpformat; - int number = 0; - int index = *indexPointer; - - number = (int)trio_to_long(&format[index], &tmpformat, BASE_DECIMAL); - index = (int)(tmpformat - format); - if ((number != 0) && (QUALIFIER_POSITION == format[index++])) - { - *indexPointer = index; - /* - * number is decreased by 1, because n$ starts from 1, whereas - * the array it is indexing starts from 0. - */ - return number - 1; - } -#endif - return NO_POSITION; -} - -#if TRIO_EXTENSION -/************************************************************************* - * TrioFindNamespace - * - * Find registered user-defined specifier. - * The prev argument is used for optimization only. - */ -TRIO_PRIVATE trio_userdef_t * -TrioFindNamespace -TRIO_ARGS2((name, prev), - TRIO_CONST char *name, - trio_userdef_t **prev) -{ - trio_userdef_t *def; - - if (internalEnterCriticalRegion) - (void)internalEnterCriticalRegion(NULL); - - for (def = internalUserDef; def; def = def->next) - { - /* Case-sensitive string comparison */ - if (trio_equal_case(def->name, name)) - break; - - if (prev) - *prev = def; - } - - if (internalLeaveCriticalRegion) - (void)internalLeaveCriticalRegion(NULL); - - return def; -} -#endif - -/************************************************************************* - * TrioPower - * - * Description: - * Calculate pow(base, exponent), where number and exponent are integers. - */ -TRIO_PRIVATE trio_long_double_t -TrioPower -TRIO_ARGS2((number, exponent), - int number, - int exponent) -{ - trio_long_double_t result; - - if (number == 10) - { - switch (exponent) - { - /* Speed up calculation of common cases */ - case 0: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E-1); - break; - case 1: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+0); - break; - case 2: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+1); - break; - case 3: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+2); - break; - case 4: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+3); - break; - case 5: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+4); - break; - case 6: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+5); - break; - case 7: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+6); - break; - case 8: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+7); - break; - case 9: - result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+8); - break; - default: - result = powl((trio_long_double_t)number, - (trio_long_double_t)exponent); - break; - } - } - else - { - return powl((trio_long_double_t)number, (trio_long_double_t)exponent); - } - return result; -} - -/************************************************************************* - * TrioLogarithm - */ -TRIO_PRIVATE double -TrioLogarithm -TRIO_ARGS2((number, base), - double number, - int base) -{ - double result; - - if (number <= 0.0) - { - /* xlC crashes on log(0) */ - result = (number == 0.0) ? trio_ninf() : trio_nan(); - } - else - { - if (base == 10) - { - result = log10(number); - } - else - { - result = log10(number) / log10((double)base); - } - } - return result; -} - -/************************************************************************* - * TrioLogarithmBase - */ -TRIO_PRIVATE double -TrioLogarithmBase -TRIO_ARGS1((base), - int base) -{ - switch (base) - { - case BASE_BINARY : return 1.0; - case BASE_OCTAL : return 3.0; - case BASE_DECIMAL: return 3.321928094887362345; - case BASE_HEX : return 4.0; - default : return TrioLogarithm((double)base, 2); - } -} - -/************************************************************************* - * TrioParse - * - * Description: - * Parse the format string - */ -TRIO_PRIVATE int -TrioParse -TRIO_ARGS5((type, format, parameters, arglist, argarray), - int type, - TRIO_CONST char *format, - trio_parameter_t *parameters, - va_list *arglist, - trio_pointer_t *argarray) -{ - /* Count the number of times a parameter is referenced */ - unsigned short usedEntries[MAX_PARAMETERS]; - /* Parameter counters */ - int parameterPosition; - int currentParam; - int maxParam = -1; - /* Utility variables */ - trio_flags_t flags; - int width; - int precision; - int varsize; - int base; - int index; /* Index into formatting string */ - int dots; /* Count number of dots in modifier part */ - BOOLEAN_T positional; /* Does the specifier have a positional? */ - BOOLEAN_T gotSticky = FALSE; /* Are there any sticky modifiers at all? */ - /* - * indices specifies the order in which the parameters must be - * read from the va_args (this is necessary to handle positionals) - */ - int indices[MAX_PARAMETERS]; - int pos = 0; - /* Various variables */ - char ch; -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - int charlen; -#endif - int save_errno; - int i = -1; - int num; - char *tmpformat; - - /* One and only one of arglist and argarray must be used */ - assert((arglist != NULL) ^ (argarray != NULL)); - - /* - * The 'parameters' array is not initialized, but we need to - * know which entries we have used. - */ - memset(usedEntries, 0, sizeof(usedEntries)); - - save_errno = errno; - index = 0; - parameterPosition = 0; -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - (void)mblen(NULL, 0); -#endif - - while (format[index]) - { -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - if (! isascii(format[index])) - { - /* - * Multibyte characters cannot be legal specifiers or - * modifiers, so we skip over them. - */ - charlen = mblen(&format[index], MB_LEN_MAX); - index += (charlen > 0) ? charlen : 1; - continue; /* while */ - } -#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ - if (CHAR_IDENTIFIER == format[index++]) - { - if (CHAR_IDENTIFIER == format[index]) - { - index++; - continue; /* while */ - } - - flags = FLAGS_NEW; - dots = 0; - currentParam = TrioGetPosition(format, &index); - positional = (NO_POSITION != currentParam); - if (!positional) - { - /* We have no positional, get the next counter */ - currentParam = parameterPosition; - } - if(currentParam >= MAX_PARAMETERS) - { - /* Bail out completely to make the error more obvious */ - return TRIO_ERROR_RETURN(TRIO_ETOOMANY, index); - } - - if (currentParam > maxParam) - maxParam = currentParam; - - /* Default values */ - width = NO_WIDTH; - precision = NO_PRECISION; - base = NO_BASE; - varsize = NO_SIZE; - - while (TrioIsQualifier(format[index])) - { - ch = format[index++]; - - switch (ch) - { - case QUALIFIER_SPACE: - flags |= FLAGS_SPACE; - break; - - case QUALIFIER_PLUS: - flags |= FLAGS_SHOWSIGN; - break; - - case QUALIFIER_MINUS: - flags |= FLAGS_LEFTADJUST; - flags &= ~FLAGS_NILPADDING; - break; - - case QUALIFIER_ALTERNATIVE: - flags |= FLAGS_ALTERNATIVE; - break; - - case QUALIFIER_DOT: - if (dots == 0) /* Precision */ - { - dots++; - - /* Skip if no precision */ - if (QUALIFIER_DOT == format[index]) - break; - - /* After the first dot we have the precision */ - flags |= FLAGS_PRECISION; - if ((QUALIFIER_STAR == format[index]) -#if defined(QUALIFIER_PARAM) - || (QUALIFIER_PARAM == format[index]) -#endif - ) - { - index++; - flags |= FLAGS_PRECISION_PARAMETER; - - precision = TrioGetPosition(format, &index); - if (precision == NO_POSITION) - { - parameterPosition++; - if (positional) - precision = parameterPosition; - else - { - precision = currentParam; - currentParam = precision + 1; - } - } - else - { - if (! positional) - currentParam = precision + 1; - if (width > maxParam) - maxParam = precision; - } - if (currentParam > maxParam) - maxParam = currentParam; - } - else - { - precision = trio_to_long(&format[index], - &tmpformat, - BASE_DECIMAL); - index = (int)(tmpformat - format); - } - } - else if (dots == 1) /* Base */ - { - dots++; - - /* After the second dot we have the base */ - flags |= FLAGS_BASE; - if ((QUALIFIER_STAR == format[index]) -#if defined(QUALIFIER_PARAM) - || (QUALIFIER_PARAM == format[index]) -#endif - ) - { - index++; - flags |= FLAGS_BASE_PARAMETER; - base = TrioGetPosition(format, &index); - if (base == NO_POSITION) - { - parameterPosition++; - if (positional) - base = parameterPosition; - else - { - base = currentParam; - currentParam = base + 1; - } - } - else - { - if (! positional) - currentParam = base + 1; - if (base > maxParam) - maxParam = base; - } - if (currentParam > maxParam) - maxParam = currentParam; - } - else - { - base = trio_to_long(&format[index], - &tmpformat, - BASE_DECIMAL); - if (base > MAX_BASE) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - index = (int)(tmpformat - format); - } - } - else - { - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - break; /* QUALIFIER_DOT */ - -#if defined(QUALIFIER_PARAM) - case QUALIFIER_PARAM: - type = TYPE_PRINT; - /* FALLTHROUGH */ -#endif - case QUALIFIER_STAR: - /* This has different meanings for print and scan */ - if (TYPE_PRINT == type) - { - /* Read with from parameter */ - flags |= (FLAGS_WIDTH | FLAGS_WIDTH_PARAMETER); - width = TrioGetPosition(format, &index); - if (width == NO_POSITION) - { - parameterPosition++; - if (positional) - width = parameterPosition; - else - { - width = currentParam; - currentParam = width + 1; - } - } - else - { - if (! positional) - currentParam = width + 1; - if (width > maxParam) - maxParam = width; - } - if (currentParam > maxParam) - maxParam = currentParam; - } - else - { - /* Scan, but do not store result */ - flags |= FLAGS_IGNORE; - } - - break; /* QUALIFIER_STAR */ - - case '0': - if (! (flags & FLAGS_LEFTADJUST)) - flags |= FLAGS_NILPADDING; - /* FALLTHROUGH */ - case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - flags |= FLAGS_WIDTH; - /* &format[index - 1] is used to "rewind" the read - * character from format - */ - width = trio_to_long(&format[index - 1], - &tmpformat, - BASE_DECIMAL); - index = (int)(tmpformat - format); - break; - - case QUALIFIER_SHORT: - if (flags & FLAGS_SHORTSHORT) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - else if (flags & FLAGS_SHORT) - flags |= FLAGS_SHORTSHORT; - else - flags |= FLAGS_SHORT; - break; - - case QUALIFIER_LONG: - if (flags & FLAGS_QUAD) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - else if (flags & FLAGS_LONG) - flags |= FLAGS_QUAD; - else - flags |= FLAGS_LONG; - break; - - case QUALIFIER_LONG_UPPER: - flags |= FLAGS_LONGDOUBLE; - break; - -#if defined(QUALIFIER_SIZE_T) - case QUALIFIER_SIZE_T: - flags |= FLAGS_SIZE_T; - /* Modify flags for later truncation of number */ - if (sizeof(size_t) == sizeof(trio_ulonglong_t)) - flags |= FLAGS_QUAD; - else if (sizeof(size_t) == sizeof(long)) - flags |= FLAGS_LONG; - break; -#endif - -#if defined(QUALIFIER_PTRDIFF_T) - case QUALIFIER_PTRDIFF_T: - flags |= FLAGS_PTRDIFF_T; - if (sizeof(ptrdiff_t) == sizeof(trio_ulonglong_t)) - flags |= FLAGS_QUAD; - else if (sizeof(ptrdiff_t) == sizeof(long)) - flags |= FLAGS_LONG; - break; -#endif - -#if defined(QUALIFIER_INTMAX_T) - case QUALIFIER_INTMAX_T: - flags |= FLAGS_INTMAX_T; - if (sizeof(trio_intmax_t) == sizeof(trio_ulonglong_t)) - flags |= FLAGS_QUAD; - else if (sizeof(trio_intmax_t) == sizeof(long)) - flags |= FLAGS_LONG; - break; -#endif - -#if defined(QUALIFIER_QUAD) - case QUALIFIER_QUAD: - flags |= FLAGS_QUAD; - break; -#endif - -#if defined(QUALIFIER_FIXED_SIZE) - case QUALIFIER_FIXED_SIZE: - if (flags & FLAGS_FIXED_SIZE) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - - if (flags & (FLAGS_ALL_SIZES | FLAGS_LONGDOUBLE | - FLAGS_WIDECHAR | FLAGS_VARSIZE_PARAMETER)) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - - if ((format[index] == '6') && - (format[index + 1] == '4')) - { - varsize = sizeof(trio_int64_t); - index += 2; - } - else if ((format[index] == '3') && - (format[index + 1] == '2')) - { - varsize = sizeof(trio_int32_t); - index += 2; - } - else if ((format[index] == '1') && - (format[index + 1] == '6')) - { - varsize = sizeof(trio_int16_t); - index += 2; - } - else if (format[index] == '8') - { - varsize = sizeof(trio_int8_t); - index++; - } - else - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - - flags |= FLAGS_FIXED_SIZE; - break; -#endif - -#if defined(QUALIFIER_WIDECHAR) - case QUALIFIER_WIDECHAR: - flags |= FLAGS_WIDECHAR; - break; -#endif - -#if defined(QUALIFIER_SIZE_T_UPPER) - case QUALIFIER_SIZE_T_UPPER: - break; -#endif - -#if defined(QUALIFIER_QUOTE) - case QUALIFIER_QUOTE: - flags |= FLAGS_QUOTE; - break; -#endif - -#if defined(QUALIFIER_STICKY) - case QUALIFIER_STICKY: - flags |= FLAGS_STICKY; - gotSticky = TRUE; - break; -#endif - -#if defined(QUALIFIER_VARSIZE) - case QUALIFIER_VARSIZE: - flags |= FLAGS_VARSIZE_PARAMETER; - parameterPosition++; - if (positional) - varsize = parameterPosition; - else - { - varsize = currentParam; - currentParam = varsize + 1; - } - if (currentParam > maxParam) - maxParam = currentParam; - break; -#endif - -#if defined(QUALIFIER_ROUNDING_UPPER) - case QUALIFIER_ROUNDING_UPPER: - flags |= FLAGS_ROUNDING; - break; -#endif - - default: - /* Bail out completely to make the error more obvious */ - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - } /* while qualifier */ - - /* - * Parameters only need the type and value. The value is - * read later. - */ - if (flags & FLAGS_WIDTH_PARAMETER) - { - usedEntries[width] += 1; - parameters[pos].type = FORMAT_PARAMETER; - parameters[pos].flags = 0; - indices[width] = pos; - width = pos++; - } - if (flags & FLAGS_PRECISION_PARAMETER) - { - usedEntries[precision] += 1; - parameters[pos].type = FORMAT_PARAMETER; - parameters[pos].flags = 0; - indices[precision] = pos; - precision = pos++; - } - if (flags & FLAGS_BASE_PARAMETER) - { - usedEntries[base] += 1; - parameters[pos].type = FORMAT_PARAMETER; - parameters[pos].flags = 0; - indices[base] = pos; - base = pos++; - } - if (flags & FLAGS_VARSIZE_PARAMETER) - { - usedEntries[varsize] += 1; - parameters[pos].type = FORMAT_PARAMETER; - parameters[pos].flags = 0; - indices[varsize] = pos; - varsize = pos++; - } - - indices[currentParam] = pos; - - switch (format[index++]) - { -#if defined(SPECIFIER_CHAR_UPPER) - case SPECIFIER_CHAR_UPPER: - flags |= FLAGS_WIDECHAR; - /* FALLTHROUGH */ -#endif - case SPECIFIER_CHAR: - if (flags & FLAGS_LONG) - flags |= FLAGS_WIDECHAR; - else if (flags & FLAGS_SHORT) - flags &= ~FLAGS_WIDECHAR; - parameters[pos].type = FORMAT_CHAR; - break; - -#if defined(SPECIFIER_STRING_UPPER) - case SPECIFIER_STRING_UPPER: - flags |= FLAGS_WIDECHAR; - /* FALLTHROUGH */ -#endif - case SPECIFIER_STRING: - if (flags & FLAGS_LONG) - flags |= FLAGS_WIDECHAR; - else if (flags & FLAGS_SHORT) - flags &= ~FLAGS_WIDECHAR; - parameters[pos].type = FORMAT_STRING; - break; - - case SPECIFIER_GROUP: - if (TYPE_SCAN == type) - { - int depth = 1; - parameters[pos].type = FORMAT_GROUP; - if (format[index] == QUALIFIER_CIRCUMFLEX) - index++; - if (format[index] == SPECIFIER_UNGROUP) - index++; - if (format[index] == QUALIFIER_MINUS) - index++; - /* Skip nested brackets */ - while (format[index] != NIL) - { - if (format[index] == SPECIFIER_GROUP) - { - depth++; - } - else if (format[index] == SPECIFIER_UNGROUP) - { - if (--depth <= 0) - { - index++; - break; - } - } - index++; - } - } - break; - - case SPECIFIER_INTEGER: - parameters[pos].type = FORMAT_INT; - break; - - case SPECIFIER_UNSIGNED: - flags |= FLAGS_UNSIGNED; - parameters[pos].type = FORMAT_INT; - break; - - case SPECIFIER_DECIMAL: - /* Disable base modifier */ - flags &= ~FLAGS_BASE_PARAMETER; - base = BASE_DECIMAL; - parameters[pos].type = FORMAT_INT; - break; - - case SPECIFIER_OCTAL: - flags |= FLAGS_UNSIGNED; - flags &= ~FLAGS_BASE_PARAMETER; - base = BASE_OCTAL; - parameters[pos].type = FORMAT_INT; - break; - -#if defined(SPECIFIER_BINARY) - case SPECIFIER_BINARY_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_BINARY: - flags |= FLAGS_NILPADDING; - flags &= ~FLAGS_BASE_PARAMETER; - base = BASE_BINARY; - parameters[pos].type = FORMAT_INT; - break; -#endif - - case SPECIFIER_HEX_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_HEX: - flags |= FLAGS_UNSIGNED; - flags &= ~FLAGS_BASE_PARAMETER; - base = BASE_HEX; - parameters[pos].type = FORMAT_INT; - break; - - case SPECIFIER_FLOAT_E_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_FLOAT_E: - flags |= FLAGS_FLOAT_E; - parameters[pos].type = FORMAT_DOUBLE; - break; - - case SPECIFIER_FLOAT_G_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_FLOAT_G: - flags |= FLAGS_FLOAT_G; - parameters[pos].type = FORMAT_DOUBLE; - break; - - case SPECIFIER_FLOAT_F_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ - case SPECIFIER_FLOAT_F: - parameters[pos].type = FORMAT_DOUBLE; - break; - - case SPECIFIER_POINTER: - if (sizeof(trio_pointer_t) == sizeof(trio_ulonglong_t)) - flags |= FLAGS_QUAD; - else if (sizeof(trio_pointer_t) == sizeof(long)) - flags |= FLAGS_LONG; - parameters[pos].type = FORMAT_POINTER; - break; - - case SPECIFIER_COUNT: - parameters[pos].type = FORMAT_COUNT; - break; - -#if defined(SPECIFIER_HEXFLOAT) -# if defined(SPECIFIER_HEXFLOAT_UPPER) - case SPECIFIER_HEXFLOAT_UPPER: - flags |= FLAGS_UPPER; - /* FALLTHROUGH */ -# endif - case SPECIFIER_HEXFLOAT: - base = BASE_HEX; - parameters[pos].type = FORMAT_DOUBLE; - break; -#endif - -#if defined(FORMAT_ERRNO) - case SPECIFIER_ERRNO: - parameters[pos].type = FORMAT_ERRNO; - break; -#endif - -#if defined(SPECIFIER_USER_DEFINED_BEGIN) - case SPECIFIER_USER_DEFINED_BEGIN: - { - unsigned int max; - int without_namespace = TRUE; - - parameters[pos].type = FORMAT_USER_DEFINED; - parameters[pos].user_name[0] = NIL; - tmpformat = (char *)&format[index]; - - while ((ch = format[index])) - { - index++; - if (ch == SPECIFIER_USER_DEFINED_END) - { - if (without_namespace) - { - /* We must get the handle first */ - parameters[pos].type = FORMAT_PARAMETER; - parameters[pos].indexAfterSpecifier = index; - parameters[pos].flags = FLAGS_USER_DEFINED; - /* Adjust parameters for insertion of new one */ - pos++; - usedEntries[currentParam] += 1; - parameters[pos].type = FORMAT_USER_DEFINED; - currentParam++; - indices[currentParam] = pos; - if (currentParam > maxParam) - maxParam = currentParam; - } - /* Copy the user data */ - max = (unsigned int)(&format[index] - tmpformat); - if (max > MAX_USER_DATA) - max = MAX_USER_DATA; - trio_copy_max(parameters[pos].user_data, - max, - tmpformat); - break; /* while */ - } - if (ch == SPECIFIER_USER_DEFINED_SEPARATOR) - { - without_namespace = FALSE; - /* Copy the namespace for later looking-up */ - max = (int)(&format[index] - tmpformat); - if (max > MAX_USER_NAME) - max = MAX_USER_NAME; - trio_copy_max(parameters[pos].user_name, - max, - tmpformat); - tmpformat = (char *)&format[index]; - } - } - if (ch != SPECIFIER_USER_DEFINED_END) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - break; -#endif /* defined(SPECIFIER_USER_DEFINED_BEGIN) */ - - default: - /* Bail out completely to make the error more obvious */ - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - - /* Count the number of times this entry has been used */ - usedEntries[currentParam] += 1; - - /* Find last sticky parameters */ - if (gotSticky && !(flags & FLAGS_STICKY)) - { - for (i = pos - 1; i >= 0; i--) - { - if (parameters[i].type == FORMAT_PARAMETER) - continue; - if ((parameters[i].flags & FLAGS_STICKY) && - (parameters[i].type == parameters[pos].type)) - { - /* Do not overwrite current qualifiers */ - flags |= (parameters[i].flags & (unsigned long)~FLAGS_STICKY); - if (width == NO_WIDTH) - width = parameters[i].width; - if (precision == NO_PRECISION) - precision = parameters[i].precision; - if (base == NO_BASE) - base = parameters[i].base; - break; - } - } - } - - parameters[pos].indexAfterSpecifier = index; - parameters[pos].flags = flags; - parameters[pos].width = width; - parameters[pos].precision = precision; - parameters[pos].base = (base == NO_BASE) ? BASE_DECIMAL : base; - parameters[pos].varsize = varsize; - pos++; - - if (! positional) - parameterPosition++; - - } /* if identifier */ - - } /* while format characters left */ - - for (num = 0; num <= maxParam; num++) - { - if (usedEntries[num] != 1) - { - if (usedEntries[num] == 0) /* gap detected */ - return TRIO_ERROR_RETURN(TRIO_EGAP, num); - else /* double references detected */ - return TRIO_ERROR_RETURN(TRIO_EDBLREF, num); - } - - i = indices[num]; - - /* - * FORMAT_PARAMETERS are only present if they must be read, - * so it makes no sense to check the ignore flag (besides, - * the flags variable is not set for that particular type) - */ - if ((parameters[i].type != FORMAT_PARAMETER) && - (parameters[i].flags & FLAGS_IGNORE)) - continue; /* for all arguments */ - - /* - * The stack arguments are read according to ANSI C89 - * default argument promotions: - * - * char = int - * short = int - * unsigned char = unsigned int - * unsigned short = unsigned int - * float = double - * - * In addition to the ANSI C89 these types are read (the - * default argument promotions of C99 has not been - * considered yet) - * - * long long - * long double - * size_t - * ptrdiff_t - * intmax_t - */ - switch (parameters[i].type) - { - case FORMAT_GROUP: - case FORMAT_STRING: -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - parameters[i].data.wstring = (argarray == NULL) - ? va_arg(*arglist, trio_wchar_t *) - : (trio_wchar_t *)(argarray[num]); - } - else -#endif - { - parameters[i].data.string = (argarray == NULL) - ? va_arg(*arglist, char *) - : (char *)(argarray[num]); - } - break; - -#if defined(FORMAT_USER_DEFINED) - case FORMAT_USER_DEFINED: -#endif - case FORMAT_POINTER: - case FORMAT_COUNT: - case FORMAT_UNKNOWN: - parameters[i].data.pointer = (argarray == NULL) - ? va_arg(*arglist, trio_pointer_t ) - : argarray[num]; - break; - - case FORMAT_CHAR: - case FORMAT_INT: - if (TYPE_SCAN == type) - { - if (argarray == NULL) - parameters[i].data.pointer = - (trio_pointer_t)va_arg(*arglist, trio_pointer_t); - else - { - if (parameters[i].type == FORMAT_CHAR) - parameters[i].data.pointer = - (trio_pointer_t)((char *)argarray[num]); - else if (parameters[i].flags & FLAGS_SHORT) - parameters[i].data.pointer = - (trio_pointer_t)((short *)argarray[num]); - else - parameters[i].data.pointer = - (trio_pointer_t)((int *)argarray[num]); - } - } - else - { -#if defined(QUALIFIER_VARSIZE) || defined(QUALIFIER_FIXED_SIZE) - if (parameters[i].flags - & (FLAGS_VARSIZE_PARAMETER | FLAGS_FIXED_SIZE)) - { - if (parameters[i].flags & FLAGS_VARSIZE_PARAMETER) - { - /* - * Variable sizes are mapped onto the fixed sizes, in - * accordance with integer promotion. - * - * Please note that this may not be portable, as we - * only guess the size, not the layout of the numbers. - * For example, if int is little-endian, and long is - * big-endian, then this will fail. - */ - varsize = (int)parameters[parameters[i].varsize].data.number.as_unsigned; - } - else - { - /* Used for the I<bits> modifiers */ - varsize = parameters[i].varsize; - } - parameters[i].flags &= ~FLAGS_ALL_VARSIZES; - - if (varsize <= (int)sizeof(int)) - ; - else if (varsize <= (int)sizeof(long)) - parameters[i].flags |= FLAGS_LONG; -#if defined(QUALIFIER_INTMAX_T) - else if (varsize <= (int)sizeof(trio_longlong_t)) - parameters[i].flags |= FLAGS_QUAD; - else - parameters[i].flags |= FLAGS_INTMAX_T; -#else - else - parameters[i].flags |= FLAGS_QUAD; -#endif - } -#endif /* defined(QUALIFIER_VARSIZE) */ -#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) - if (parameters[i].flags & FLAGS_SIZE_T) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(*arglist, size_t) - : (trio_uintmax_t)(*((size_t *)argarray[num])); - else -#endif -#if defined(QUALIFIER_PTRDIFF_T) - if (parameters[i].flags & FLAGS_PTRDIFF_T) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(*arglist, ptrdiff_t) - : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num])); - else -#endif -#if defined(QUALIFIER_INTMAX_T) - if (parameters[i].flags & FLAGS_INTMAX_T) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(*arglist, trio_intmax_t) - : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num])); - else -#endif - if (parameters[i].flags & FLAGS_QUAD) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(*arglist, trio_ulonglong_t) - : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num])); - else if (parameters[i].flags & FLAGS_LONG) - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(*arglist, long) - : (trio_uintmax_t)(*((long *)argarray[num])); - else - { - if (argarray == NULL) - parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(*arglist, int); - else - { - if (parameters[i].type == FORMAT_CHAR) - parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((char *)argarray[num])); - else if (parameters[i].flags & FLAGS_SHORT) - parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((short *)argarray[num])); - else - parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((int *)argarray[num])); - } - } - } - break; - - case FORMAT_PARAMETER: - /* - * The parameter for the user-defined specifier is a pointer, - * whereas the rest (width, precision, base) uses an integer. - */ - if (parameters[i].flags & FLAGS_USER_DEFINED) - parameters[i].data.pointer = (argarray == NULL) - ? va_arg(*arglist, trio_pointer_t ) - : argarray[num]; - else - parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(*arglist, int) - : (trio_uintmax_t)(*((int *)argarray[num])); - break; - - case FORMAT_DOUBLE: - if (TYPE_SCAN == type) - { - if (parameters[i].flags & FLAGS_LONGDOUBLE) - parameters[i].data.longdoublePointer = (argarray == NULL) - ? va_arg(*arglist, trio_long_double_t *) - : (trio_long_double_t *)argarray[num]; - else - { - if (parameters[i].flags & FLAGS_LONG) - parameters[i].data.doublePointer = (argarray == NULL) - ? va_arg(*arglist, double *) - : (double *)argarray[num]; - else - parameters[i].data.doublePointer = (argarray == NULL) - ? (double *)va_arg(*arglist, float *) - : (double *)((float *)argarray[num]); - } - } - else - { - if (parameters[i].flags & FLAGS_LONGDOUBLE) - parameters[i].data.longdoubleNumber = (argarray == NULL) - ? va_arg(*arglist, trio_long_double_t) - : (trio_long_double_t)(*((trio_long_double_t *)argarray[num])); - else - { - if (argarray == NULL) - parameters[i].data.longdoubleNumber = - (trio_long_double_t)va_arg(*arglist, double); - else - { - if (parameters[i].flags & FLAGS_SHORT) - parameters[i].data.longdoubleNumber = - (trio_long_double_t)(*((float *)argarray[num])); - else - parameters[i].data.longdoubleNumber = - (trio_long_double_t)(*((double *)argarray[num])); - } - } - } - break; - -#if defined(FORMAT_ERRNO) - case FORMAT_ERRNO: - parameters[i].data.errorNumber = save_errno; - break; -#endif - - default: - break; - } - } /* for all specifiers */ - return num; -} - - -/************************************************************************* - * - * FORMATTING - * - ************************************************************************/ - - -/************************************************************************* - * TrioWriteNumber - * - * Description: - * Output a number. - * The complexity of this function is a result of the complexity - * of the dependencies of the flags. - */ -TRIO_PRIVATE void -TrioWriteNumber -TRIO_ARGS6((self, number, flags, width, precision, base), - trio_class_t *self, - trio_uintmax_t number, - trio_flags_t flags, - int width, - int precision, - int base) -{ - BOOLEAN_T isNegative; - BOOLEAN_T isNumberZero; - BOOLEAN_T isPrecisionZero; - BOOLEAN_T ignoreNumber; - char buffer[MAX_CHARS_IN(trio_uintmax_t) * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1]; - char *bufferend; - char *pointer; - TRIO_CONST char *digits; - int i; - int length; - char *p; - int count; - - assert(VALID(self)); - assert(VALID(self->OutStream)); - assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE)); - - digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower; - if (base == NO_BASE) - base = BASE_DECIMAL; - - isNumberZero = (number == 0); - isPrecisionZero = (precision == 0); - ignoreNumber = (isNumberZero - && isPrecisionZero - && !((flags & FLAGS_ALTERNATIVE) && (base == BASE_OCTAL))); - - if (flags & FLAGS_UNSIGNED) - { - isNegative = FALSE; - flags &= ~FLAGS_SHOWSIGN; - } - else - { - isNegative = ((trio_intmax_t)number < 0); - if (isNegative) - number = -((trio_intmax_t)number); - } - - if (flags & FLAGS_QUAD) - number &= (trio_ulonglong_t)-1; - else if (flags & FLAGS_LONG) - number &= (unsigned long)-1; - else - number &= (unsigned int)-1; - - /* Build number */ - pointer = bufferend = &buffer[sizeof(buffer) - 1]; - *pointer-- = NIL; - for (i = 1; i < (int)sizeof(buffer); i++) - { - *pointer-- = digits[number % base]; - number /= base; - if (number == 0) - break; - - if ((flags & FLAGS_QUOTE) && TrioFollowedBySeparator(i + 1)) - { - /* - * We are building the number from the least significant - * to the most significant digit, so we have to copy the - * thousand separator backwards - */ - length = internalThousandSeparatorLength; - if (((int)(pointer - buffer) - length) > 0) - { - p = &internalThousandSeparator[length - 1]; - while (length-- > 0) - *pointer-- = *p--; - } - } - } - - if (! ignoreNumber) - { - /* Adjust width */ - width -= (bufferend - pointer) - 1; - } - - /* Adjust precision */ - if (NO_PRECISION != precision) - { - precision -= (bufferend - pointer) - 1; - if (precision < 0) - precision = 0; - flags |= FLAGS_NILPADDING; - } - - /* Calculate padding */ - count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION))) - ? precision - : 0; - - /* Adjust width further */ - if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) - width--; - if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero) - { - switch (base) - { - case BASE_BINARY: - case BASE_HEX: - width -= 2; - break; - case BASE_OCTAL: - if (!(flags & FLAGS_NILPADDING) || (count == 0)) - width--; - break; - default: - break; - } - } - - /* Output prefixes spaces if needed */ - if (! ((flags & FLAGS_LEFTADJUST) || - ((flags & FLAGS_NILPADDING) && (precision == NO_PRECISION)))) - { - while (width-- > count) - self->OutStream(self, CHAR_ADJUST); - } - - /* width has been adjusted for signs and alternatives */ - if (isNegative) - self->OutStream(self, '-'); - else if (flags & FLAGS_SHOWSIGN) - self->OutStream(self, '+'); - else if (flags & FLAGS_SPACE) - self->OutStream(self, ' '); - - /* Prefix is not written when the value is zero */ - if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero) - { - switch (base) - { - case BASE_BINARY: - self->OutStream(self, '0'); - self->OutStream(self, (flags & FLAGS_UPPER) ? 'B' : 'b'); - break; - - case BASE_OCTAL: - if (!(flags & FLAGS_NILPADDING) || (count == 0)) - self->OutStream(self, '0'); - break; - - case BASE_HEX: - self->OutStream(self, '0'); - self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); - break; - - default: - break; - } /* switch base */ - } - - /* Output prefixed zero padding if needed */ - if (flags & FLAGS_NILPADDING) - { - if (precision == NO_PRECISION) - precision = width; - while (precision-- > 0) - { - self->OutStream(self, '0'); - width--; - } - } - - if (! ignoreNumber) - { - /* Output the number itself */ - while (*(++pointer)) - { - self->OutStream(self, *pointer); - } - } - - /* Output trailing spaces if needed */ - if (flags & FLAGS_LEFTADJUST) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } -} - -/************************************************************************* - * TrioWriteStringCharacter - * - * Description: - * Output a single character of a string - */ -TRIO_PRIVATE void -TrioWriteStringCharacter -TRIO_ARGS3((self, ch, flags), - trio_class_t *self, - int ch, - trio_flags_t flags) -{ - if (flags & FLAGS_ALTERNATIVE) - { - if (! isprint(ch)) - { - /* - * Non-printable characters are converted to C escapes or - * \number, if no C escape exists. - */ - self->OutStream(self, CHAR_BACKSLASH); - switch (ch) - { - case '\007': self->OutStream(self, 'a'); break; - case '\b': self->OutStream(self, 'b'); break; - case '\f': self->OutStream(self, 'f'); break; - case '\n': self->OutStream(self, 'n'); break; - case '\r': self->OutStream(self, 'r'); break; - case '\t': self->OutStream(self, 't'); break; - case '\v': self->OutStream(self, 'v'); break; - case '\\': self->OutStream(self, '\\'); break; - default: - self->OutStream(self, 'x'); - TrioWriteNumber(self, (trio_uintmax_t)ch, - FLAGS_UNSIGNED | FLAGS_NILPADDING, - 2, 2, BASE_HEX); - break; - } - } - else if (ch == CHAR_BACKSLASH) - { - self->OutStream(self, CHAR_BACKSLASH); - self->OutStream(self, CHAR_BACKSLASH); - } - else - { - self->OutStream(self, ch); - } - } - else - { - self->OutStream(self, ch); - } -} - -/************************************************************************* - * TrioWriteString - * - * Description: - * Output a string - */ -TRIO_PRIVATE void -TrioWriteString -TRIO_ARGS5((self, string, flags, width, precision), - trio_class_t *self, - TRIO_CONST char *string, - trio_flags_t flags, - int width, - int precision) -{ - int length; - int ch; - - assert(VALID(self)); - assert(VALID(self->OutStream)); - - if (string == NULL) - { - string = internalNullString; - length = sizeof(internalNullString) - 1; - /* Disable quoting for the null pointer */ - flags &= (~FLAGS_QUOTE); - width = 0; - } - else - { - length = trio_length(string); - } - if ((NO_PRECISION != precision) && - (precision < length)) - { - length = precision; - } - width -= length; - - if (flags & FLAGS_QUOTE) - self->OutStream(self, CHAR_QUOTE); - - if (! (flags & FLAGS_LEFTADJUST)) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } - - while (length-- > 0) - { - /* The ctype parameters must be an unsigned char (or EOF) */ - ch = (int)((unsigned char)(*string++)); - TrioWriteStringCharacter(self, ch, flags); - } - - if (flags & FLAGS_LEFTADJUST) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } - if (flags & FLAGS_QUOTE) - self->OutStream(self, CHAR_QUOTE); -} - -/************************************************************************* - * TrioWriteWideStringCharacter - * - * Description: - * Output a wide string as a multi-byte sequence - */ -#if TRIO_WIDECHAR -TRIO_PRIVATE int -TrioWriteWideStringCharacter -TRIO_ARGS4((self, wch, flags, width), - trio_class_t *self, - trio_wchar_t wch, - trio_flags_t flags, - int width) -{ - int size; - int i; - int ch; - char *string; - char buffer[MB_LEN_MAX + 1]; - - if (width == NO_WIDTH) - width = sizeof(buffer); - - size = wctomb(buffer, wch); - if ((size <= 0) || (size > width) || (buffer[0] == NIL)) - return 0; - - string = buffer; - i = size; - while ((width >= i) && (width-- > 0) && (i-- > 0)) - { - /* The ctype parameters must be an unsigned char (or EOF) */ - ch = (int)((unsigned char)(*string++)); - TrioWriteStringCharacter(self, ch, flags); - } - return size; -} -#endif /* TRIO_WIDECHAR */ - -/************************************************************************* - * TrioWriteWideString - * - * Description: - * Output a wide character string as a multi-byte string - */ -#if TRIO_WIDECHAR -TRIO_PRIVATE void -TrioWriteWideString -TRIO_ARGS5((self, wstring, flags, width, precision), - trio_class_t *self, - TRIO_CONST trio_wchar_t *wstring, - trio_flags_t flags, - int width, - int precision) -{ - int length; - int size; - - assert(VALID(self)); - assert(VALID(self->OutStream)); - -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - (void)mblen(NULL, 0); -#endif - - if (wstring == NULL) - { - TrioWriteString(self, NULL, flags, width, precision); - return; - } - - if (NO_PRECISION == precision) - { - length = INT_MAX; - } - else - { - length = precision; - width -= length; - } - - if (flags & FLAGS_QUOTE) - self->OutStream(self, CHAR_QUOTE); - - if (! (flags & FLAGS_LEFTADJUST)) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } - - while (length > 0) - { - size = TrioWriteWideStringCharacter(self, *wstring++, flags, length); - if (size == 0) - break; /* while */ - length -= size; - } - - if (flags & FLAGS_LEFTADJUST) - { - while (width-- > 0) - self->OutStream(self, CHAR_ADJUST); - } - if (flags & FLAGS_QUOTE) - self->OutStream(self, CHAR_QUOTE); -} -#endif /* TRIO_WIDECHAR */ - -/************************************************************************* - * TrioWriteDouble - * - * http://wwwold.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_211.htm - * - * "5.2.4.2.2 paragraph #4 - * - * The accuracy [...] is implementation defined, as is the accuracy - * of the conversion between floating-point internal representations - * and string representations performed by the libray routine in - * <stdio.h>" - */ -/* FIXME: handle all instances of constant long-double number (L) - * and *l() math functions. - */ -TRIO_PRIVATE void -TrioWriteDouble -TRIO_ARGS6((self, number, flags, width, precision, base), - trio_class_t *self, - trio_long_double_t number, - trio_flags_t flags, - int width, - int precision, - int base) -{ - trio_long_double_t integerNumber; - trio_long_double_t fractionNumber; - trio_long_double_t workNumber; - int integerDigits; - int fractionDigits; - int exponentDigits; - int baseDigits; - int integerThreshold; - int fractionThreshold; - int expectedWidth; - int exponent = 0; - unsigned int uExponent = 0; - int exponentBase; - trio_long_double_t dblBase; - trio_long_double_t dblIntegerBase; - trio_long_double_t dblFractionBase; - trio_long_double_t integerAdjust; - trio_long_double_t fractionAdjust; - BOOLEAN_T isNegative; - BOOLEAN_T isExponentNegative = FALSE; - BOOLEAN_T requireTwoDigitExponent; - BOOLEAN_T isHex; - TRIO_CONST char *digits; - char *groupingPointer; - int i; - int index; - BOOLEAN_T hasOnlyZeroes; - int zeroes = 0; - register int trailingZeroes; - BOOLEAN_T keepTrailingZeroes; - BOOLEAN_T keepDecimalPoint; - trio_long_double_t epsilon; - - assert(VALID(self)); - assert(VALID(self->OutStream)); - assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE)); - - /* Determine sign and look for special quantities */ - switch (trio_fpclassify_and_signbit(number, &isNegative)) - { - case TRIO_FP_NAN: - TrioWriteString(self, - (flags & FLAGS_UPPER) - ? NAN_UPPER - : NAN_LOWER, - flags, width, precision); - return; - - case TRIO_FP_INFINITE: - if (isNegative) - { - /* Negative infinity */ - TrioWriteString(self, - (flags & FLAGS_UPPER) - ? "-" INFINITE_UPPER - : "-" INFINITE_LOWER, - flags, width, precision); - return; - } - else - { - /* Positive infinity */ - TrioWriteString(self, - (flags & FLAGS_UPPER) - ? INFINITE_UPPER - : INFINITE_LOWER, - flags, width, precision); - return; - } - - default: - /* Finitude */ - break; - } - - /* Normal numbers */ - if (flags & FLAGS_LONGDOUBLE) - { - baseDigits = (base == 10) - ? LDBL_DIG - : (int)floor(LDBL_MANT_DIG / TrioLogarithmBase(base)); - epsilon = LDBL_EPSILON; - } - else if (flags & FLAGS_SHORT) - { - baseDigits = (base == BASE_DECIMAL) - ? FLT_DIG - : (int)floor(FLT_MANT_DIG / TrioLogarithmBase(base)); - epsilon = FLT_EPSILON; - } - else - { - baseDigits = (base == BASE_DECIMAL) - ? DBL_DIG - : (int)floor(DBL_MANT_DIG / TrioLogarithmBase(base)); - epsilon = DBL_EPSILON; - } - - digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower; - isHex = (base == BASE_HEX); - if (base == NO_BASE) - base = BASE_DECIMAL; - dblBase = (trio_long_double_t)base; - keepTrailingZeroes = !( (flags & FLAGS_ROUNDING) || - ( (flags & FLAGS_FLOAT_G) && - !(flags & FLAGS_ALTERNATIVE) ) ); - - if (flags & FLAGS_ROUNDING) - precision = baseDigits; - - if (precision == NO_PRECISION) - { - if (isHex) - { - keepTrailingZeroes = FALSE; - precision = FLT_MANT_DIG; - } - else - { - precision = FLT_DIG; - } - } - - if (isNegative) - number = -number; - - if (isHex) - flags |= FLAGS_FLOAT_E; - - if (flags & FLAGS_FLOAT_G) - { - if (precision == 0) - precision = 1; - - if ((number < 1.0E-4) || (number > powl(base, - (trio_long_double_t)precision))) - { - /* Use scientific notation */ - flags |= FLAGS_FLOAT_E; - } - else if (number < 1.0) - { - /* - * Use normal notation. If the integer part of the number is - * zero, then adjust the precision to include leading fractional - * zeros. - */ - workNumber = TrioLogarithm(number, base); - workNumber = TRIO_FABS(workNumber); - if (workNumber - floorl(workNumber) < 0.001) - workNumber--; - zeroes = (int)floorl(workNumber); - } - } - - if (flags & FLAGS_FLOAT_E) - { - /* Scale the number */ - workNumber = TrioLogarithm(number, base); - if (trio_isinf(workNumber) == -1) - { - exponent = 0; - /* Undo setting */ - if (flags & FLAGS_FLOAT_G) - flags &= ~FLAGS_FLOAT_E; - } - else - { - exponent = (int)floorl(workNumber); - number /= powl(dblBase, (trio_long_double_t)exponent); - isExponentNegative = (exponent < 0); - uExponent = (isExponentNegative) ? -exponent : exponent; - if (isHex) - uExponent *= 4; /* log16(2) */ - /* No thousand separators */ - flags &= ~FLAGS_QUOTE; - } - } - - integerNumber = floorl(number); - fractionNumber = number - integerNumber; - - /* - * Truncated number. - * - * Precision is number of significant digits for FLOAT_G - * and number of fractional digits for others. - */ - integerDigits = (integerNumber > epsilon) - ? 1 + (int)TrioLogarithm(integerNumber, base) - : 1; - fractionDigits = ((flags & FLAGS_FLOAT_G) && (zeroes == 0)) - ? precision - integerDigits - : zeroes + precision; - - dblFractionBase = TrioPower(base, fractionDigits); - - workNumber = number + 0.5 / dblFractionBase; - if (floorl(number) != floorl(workNumber)) - { - if (flags & FLAGS_FLOAT_E) - { - /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */ - exponent++; - isExponentNegative = (exponent < 0); - uExponent = (isExponentNegative) ? -exponent : exponent; - if (isHex) - uExponent *= 4; /* log16(2) */ - workNumber = (number + 0.5 / dblFractionBase) / dblBase; - integerNumber = floorl(workNumber); - fractionNumber = workNumber - integerNumber; - } - else - { - /* Adjust if number was rounded up one digit (ie. 99 to 100) */ - integerNumber = floorl(number + 0.5); - fractionNumber = 0.0; - integerDigits = (integerNumber > epsilon) - ? 1 + (int)TrioLogarithm(integerNumber, base) - : 1; - } - } - - /* Estimate accuracy */ - integerAdjust = fractionAdjust = 0.5; - if (flags & FLAGS_ROUNDING) - { - if (integerDigits > baseDigits) - { - integerThreshold = baseDigits; - fractionDigits = 0; - dblFractionBase = 1.0; - fractionThreshold = 0; - precision = 0; /* Disable decimal-point */ - integerAdjust = TrioPower(base, integerDigits - integerThreshold - 1); - fractionAdjust = 0.0; - } - else - { - integerThreshold = integerDigits; - fractionThreshold = fractionDigits - integerThreshold; - fractionAdjust = 1.0; - } - } - else - { - integerThreshold = INT_MAX; - fractionThreshold = INT_MAX; - } - - /* - * Calculate expected width. - * sign + integer part + thousands separators + decimal point - * + fraction + exponent - */ - fractionAdjust /= dblFractionBase; - hasOnlyZeroes = (floorl((fractionNumber + fractionAdjust) * dblFractionBase) < epsilon); - keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) || - !((precision == 0) || - (!keepTrailingZeroes && hasOnlyZeroes)) ); - if (flags & FLAGS_FLOAT_E) - { - exponentDigits = (uExponent == 0) - ? 1 - : (int)ceil(TrioLogarithm((double)(uExponent + 1), - (isHex) ? 10.0 : base)); - } - else - exponentDigits = 0; - requireTwoDigitExponent = ((base == BASE_DECIMAL) && (exponentDigits == 1)); - - expectedWidth = integerDigits + fractionDigits - + (keepDecimalPoint - ? internalDecimalPointLength - : 0) - + ((flags & FLAGS_QUOTE) - ? TrioCalcThousandSeparatorLength(integerDigits) - : 0); - if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) - expectedWidth += sizeof("-") - 1; - if (exponentDigits > 0) - expectedWidth += exponentDigits + - ((requireTwoDigitExponent ? sizeof("E+0") : sizeof("E+")) - 1); - if (isHex) - expectedWidth += sizeof("0X") - 1; - - /* Output prefixing */ - if (flags & FLAGS_NILPADDING) - { - /* Leading zeros must be after sign */ - if (isNegative) - self->OutStream(self, '-'); - else if (flags & FLAGS_SHOWSIGN) - self->OutStream(self, '+'); - else if (flags & FLAGS_SPACE) - self->OutStream(self, ' '); - if (isHex) - { - self->OutStream(self, '0'); - self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); - } - if (!(flags & FLAGS_LEFTADJUST)) - { - for (i = expectedWidth; i < width; i++) - { - self->OutStream(self, '0'); - } - } - } - else - { - /* Leading spaces must be before sign */ - if (!(flags & FLAGS_LEFTADJUST)) - { - for (i = expectedWidth; i < width; i++) - { - self->OutStream(self, CHAR_ADJUST); - } - } - if (isNegative) - self->OutStream(self, '-'); - else if (flags & FLAGS_SHOWSIGN) - self->OutStream(self, '+'); - else if (flags & FLAGS_SPACE) - self->OutStream(self, ' '); - if (isHex) - { - self->OutStream(self, '0'); - self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); - } - } - - /* Output the integer part and thousand separators */ - dblIntegerBase = 1.0 / TrioPower(base, integerDigits - 1); - for (i = 0; i < integerDigits; i++) - { - workNumber = floorl(((integerNumber + integerAdjust) * dblIntegerBase)); - if (i > integerThreshold) - { - /* Beyond accuracy */ - self->OutStream(self, digits[0]); - } - else - { - self->OutStream(self, digits[(int)fmodl(workNumber, dblBase)]); - } - dblIntegerBase *= dblBase; - - if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE) - && TrioFollowedBySeparator(integerDigits - i)) - { - for (groupingPointer = internalThousandSeparator; - *groupingPointer != NIL; - groupingPointer++) - { - self->OutStream(self, *groupingPointer); - } - } - } - - /* Insert decimal point and build the fraction part */ - trailingZeroes = 0; - - if (keepDecimalPoint) - { - if (internalDecimalPoint) - { - self->OutStream(self, internalDecimalPoint); - } - else - { - for (i = 0; i < internalDecimalPointLength; i++) - { - self->OutStream(self, internalDecimalPointString[i]); - } - } - } - - for (i = 0; i < fractionDigits; i++) - { - if ((integerDigits > integerThreshold) || (i > fractionThreshold)) - { - /* Beyond accuracy */ - trailingZeroes++; - } - else - { - fractionNumber *= dblBase; - fractionAdjust *= dblBase; - workNumber = floorl(fractionNumber + fractionAdjust); - fractionNumber -= workNumber; - index = (int)fmodl(workNumber, dblBase); - if (index == 0) - { - trailingZeroes++; - } - else - { - while (trailingZeroes > 0) - { - /* Not trailing zeroes after all */ - self->OutStream(self, digits[0]); - trailingZeroes--; - } - self->OutStream(self, digits[index]); - } - } - } - - if (keepTrailingZeroes) - { - while (trailingZeroes > 0) - { - self->OutStream(self, digits[0]); - trailingZeroes--; - } - } - - /* Output exponent */ - if (exponentDigits > 0) - { - self->OutStream(self, - isHex - ? ((flags & FLAGS_UPPER) ? 'P' : 'p') - : ((flags & FLAGS_UPPER) ? 'E' : 'e')); - self->OutStream(self, (isExponentNegative) ? '-' : '+'); - - /* The exponent must contain at least two digits */ - if (requireTwoDigitExponent) - self->OutStream(self, '0'); - - if (isHex) - base = 10.0; - exponentBase = (int)TrioPower(base, exponentDigits - 1); - for (i = 0; i < exponentDigits; i++) - { - self->OutStream(self, digits[(uExponent / exponentBase) % base]); - exponentBase /= base; - } - } - /* Output trailing spaces */ - if (flags & FLAGS_LEFTADJUST) - { - for (i = expectedWidth; i < width; i++) - { - self->OutStream(self, CHAR_ADJUST); - } - } -} - -/************************************************************************* - * TrioFormatProcess - * - * Description: - * This is the main engine for formatting output - */ -TRIO_PRIVATE int -TrioFormatProcess -TRIO_ARGS3((data, format, parameters), - trio_class_t *data, - TRIO_CONST char *format, - trio_parameter_t *parameters) -{ -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - int charlen; -#endif - int i; - TRIO_CONST char *string; - trio_pointer_t pointer; - trio_flags_t flags; - int width; - int precision; - int base; - int index; - - index = 0; - i = 0; -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - (void)mblen(NULL, 0); -#endif - - while (format[index]) - { -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - if (! isascii(format[index])) - { - charlen = mblen(&format[index], MB_LEN_MAX); - /* - * Only valid multibyte characters are handled here. Invalid - * multibyte characters (charlen == -1) are handled as normal - * characters. - */ - if (charlen != -1) - { - while (charlen-- > 0) - { - data->OutStream(data, format[index++]); - } - continue; /* while characters left in formatting string */ - } - } -#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ - if (CHAR_IDENTIFIER == format[index]) - { - if (CHAR_IDENTIFIER == format[index + 1]) - { - data->OutStream(data, CHAR_IDENTIFIER); - index += 2; - } - else - { - /* Skip the parameter entries */ - while (parameters[i].type == FORMAT_PARAMETER) - i++; - - flags = parameters[i].flags; - - /* Find width */ - width = parameters[i].width; - if (flags & FLAGS_WIDTH_PARAMETER) - { - /* Get width from parameter list */ - width = (int)parameters[width].data.number.as_signed; - if (width < 0) - { - /* - * A negative width is the same as the - flag and - * a positive width. - */ - flags |= FLAGS_LEFTADJUST; - flags &= ~FLAGS_NILPADDING; - width = -width; - } - } - - /* Find precision */ - if (flags & FLAGS_PRECISION) - { - precision = parameters[i].precision; - if (flags & FLAGS_PRECISION_PARAMETER) - { - /* Get precision from parameter list */ - precision = (int)parameters[precision].data.number.as_signed; - if (precision < 0) - { - /* - * A negative precision is the same as no - * precision - */ - precision = NO_PRECISION; - } - } - } - else - { - precision = NO_PRECISION; - } - - /* Find base */ - base = parameters[i].base; - if (flags & FLAGS_BASE_PARAMETER) - { - /* Get base from parameter list */ - base = (int)parameters[base].data.number.as_signed; - } - - switch (parameters[i].type) - { - case FORMAT_CHAR: - if (flags & FLAGS_QUOTE) - data->OutStream(data, CHAR_QUOTE); - if (! (flags & FLAGS_LEFTADJUST)) - { - while (--width > 0) - data->OutStream(data, CHAR_ADJUST); - } -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - TrioWriteWideStringCharacter(data, - (trio_wchar_t)parameters[i].data.number.as_signed, - flags, - NO_WIDTH); - } - else -#endif - { - TrioWriteStringCharacter(data, - (int)parameters[i].data.number.as_signed, - flags); - } - - if (flags & FLAGS_LEFTADJUST) - { - while(--width > 0) - data->OutStream(data, CHAR_ADJUST); - } - if (flags & FLAGS_QUOTE) - data->OutStream(data, CHAR_QUOTE); - - break; /* FORMAT_CHAR */ - - case FORMAT_INT: - TrioWriteNumber(data, - parameters[i].data.number.as_unsigned, - flags, - width, - precision, - base); - - break; /* FORMAT_INT */ - - case FORMAT_DOUBLE: - TrioWriteDouble(data, - parameters[i].data.longdoubleNumber, - flags, - width, - precision, - base); - break; /* FORMAT_DOUBLE */ - - case FORMAT_STRING: -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - TrioWriteWideString(data, - parameters[i].data.wstring, - flags, - width, - precision); - } - else -#endif - { - TrioWriteString(data, - parameters[i].data.string, - flags, - width, - precision); - } - break; /* FORMAT_STRING */ - - case FORMAT_POINTER: - { - trio_reference_t reference; - - reference.data = data; - reference.parameter = ¶meters[i]; - trio_print_pointer(&reference, parameters[i].data.pointer); - } - break; /* FORMAT_POINTER */ - - case FORMAT_COUNT: - pointer = parameters[i].data.pointer; - if (NULL != pointer) - { - /* - * C99 paragraph 7.19.6.1.8 says "the number of - * characters written to the output stream so far by - * this call", which is data->committed - */ -#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) - if (flags & FLAGS_SIZE_T) - *(size_t *)pointer = (size_t)data->committed; - else -#endif -#if defined(QUALIFIER_PTRDIFF_T) - if (flags & FLAGS_PTRDIFF_T) - *(ptrdiff_t *)pointer = (ptrdiff_t)data->committed; - else -#endif -#if defined(QUALIFIER_INTMAX_T) - if (flags & FLAGS_INTMAX_T) - *(trio_intmax_t *)pointer = (trio_intmax_t)data->committed; - else -#endif - if (flags & FLAGS_QUAD) - { - *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->committed; - } - else if (flags & FLAGS_LONG) - { - *(long int *)pointer = (long int)data->committed; - } - else if (flags & FLAGS_SHORT) - { - *(short int *)pointer = (short int)data->committed; - } - else - { - *(int *)pointer = (int)data->committed; - } - } - break; /* FORMAT_COUNT */ - - case FORMAT_PARAMETER: - break; /* FORMAT_PARAMETER */ - -#if defined(FORMAT_ERRNO) - case FORMAT_ERRNO: - string = trio_error(parameters[i].data.errorNumber); - if (string) - { - TrioWriteString(data, - string, - flags, - width, - precision); - } - else - { - data->OutStream(data, '#'); - TrioWriteNumber(data, - (trio_uintmax_t)parameters[i].data.errorNumber, - flags, - width, - precision, - BASE_DECIMAL); - } - break; /* FORMAT_ERRNO */ -#endif /* defined(FORMAT_ERRNO) */ - -#if defined(FORMAT_USER_DEFINED) - case FORMAT_USER_DEFINED: - { - trio_reference_t reference; - trio_userdef_t *def = NULL; - - if (parameters[i].user_name[0] == NIL) - { - /* Use handle */ - if ((i > 0) || - (parameters[i - 1].type == FORMAT_PARAMETER)) - def = (trio_userdef_t *)parameters[i - 1].data.pointer; - } - else - { - /* Look up namespace */ - def = TrioFindNamespace(parameters[i].user_name, NULL); - } - if (def) { - reference.data = data; - reference.parameter = ¶meters[i]; - def->callback(&reference); - } - } - break; -#endif /* defined(FORMAT_USER_DEFINED) */ - - default: - break; - } /* switch parameter type */ - - /* Prepare for next */ - index = parameters[i].indexAfterSpecifier; - i++; - } - } - else /* not identifier */ - { - data->OutStream(data, format[index++]); - } - } - return data->processed; -} - -/************************************************************************* - * TrioFormatRef - */ -TRIO_PRIVATE int -TrioFormatRef -TRIO_ARGS4((reference, format, arglist, argarray), - trio_reference_t *reference, - TRIO_CONST char *format, - va_list *arglist, - trio_pointer_t *argarray) -{ - int status; - trio_parameter_t parameters[MAX_PARAMETERS]; - - status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray); - if (status < 0) - return status; - - status = TrioFormatProcess(reference->data, format, parameters); - if (reference->data->error != 0) - { - status = reference->data->error; - } - return status; -} - -/************************************************************************* - * TrioFormat - */ -TRIO_PRIVATE int -TrioFormat -TRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray), - trio_pointer_t destination, - size_t destinationSize, - void (*OutStream) TRIO_PROTO((trio_class_t *, int)), - TRIO_CONST char *format, - va_list *arglist, - trio_pointer_t *argarray) -{ - int status; - trio_class_t data; - trio_parameter_t parameters[MAX_PARAMETERS]; - - assert(VALID(OutStream)); - assert(VALID(format)); - - memset(&data, 0, sizeof(data)); - data.OutStream = OutStream; - data.location = destination; - data.max = destinationSize; - data.error = 0; - -#if defined(USE_LOCALE) - if (NULL == internalLocaleValues) - { - TrioSetLocale(); - } -#endif - - status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray); - if (status < 0) - return status; - - status = TrioFormatProcess(&data, format, parameters); - if (data.error != 0) - { - status = data.error; - } - return status; -} - -/************************************************************************* - * TrioOutStreamFile - */ -TRIO_PRIVATE void -TrioOutStreamFile -TRIO_ARGS2((self, output), - trio_class_t *self, - int output) -{ - FILE *file; - - assert(VALID(self)); - assert(VALID(self->location)); - - file = (FILE *)self->location; - self->processed++; - if (fputc(output, file) == EOF) - { - self->error = TRIO_ERROR_RETURN(TRIO_EOF, 0); - } - else - { - self->committed++; - } -} - -/************************************************************************* - * TrioOutStreamFileDescriptor - */ -TRIO_PRIVATE void -TrioOutStreamFileDescriptor -TRIO_ARGS2((self, output), - trio_class_t *self, - int output) -{ - int fd; - char ch; - - assert(VALID(self)); - - fd = *((int *)self->location); - ch = (char)output; - self->processed++; - if (write(fd, &ch, sizeof(char)) == -1) - { - self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0); - } - else - { - self->committed++; - } -} - -/************************************************************************* - * TrioOutStreamCustom - */ -TRIO_PRIVATE void -TrioOutStreamCustom -TRIO_ARGS2((self, output), - trio_class_t *self, - int output) -{ - int status; - trio_custom_t *data; - - assert(VALID(self)); - assert(VALID(self->location)); - - data = (trio_custom_t *)self->location; - if (data->stream.out) - { - status = (data->stream.out)(data->closure, output); - if (status >= 0) - { - self->committed++; - } - else - { - if (self->error == 0) - { - self->error = TRIO_ERROR_RETURN(TRIO_ECUSTOM, -status); - } - } - } - self->processed++; -} - -/************************************************************************* - * TrioOutStreamString - */ -TRIO_PRIVATE void -TrioOutStreamString -TRIO_ARGS2((self, output), - trio_class_t *self, - int output) -{ - char **buffer; - - assert(VALID(self)); - assert(VALID(self->location)); - - buffer = (char **)self->location; - **buffer = (char)output; - (*buffer)++; - self->processed++; - self->committed++; -} - -/************************************************************************* - * TrioOutStreamStringMax - */ -TRIO_PRIVATE void -TrioOutStreamStringMax -TRIO_ARGS2((self, output), - trio_class_t *self, - int output) -{ - char **buffer; - - assert(VALID(self)); - assert(VALID(self->location)); - - buffer = (char **)self->location; - - if (self->processed < self->max) - { - **buffer = (char)output; - (*buffer)++; - self->committed++; - } - self->processed++; -} - -/************************************************************************* - * TrioOutStreamStringDynamic - */ -TRIO_PRIVATE void -TrioOutStreamStringDynamic -TRIO_ARGS2((self, output), - trio_class_t *self, - int output) -{ - assert(VALID(self)); - assert(VALID(self->location)); - - if (self->error == 0) - { - trio_xstring_append_char((trio_string_t *)self->location, - (char)output); - self->committed++; - } - /* The processed variable must always be increased */ - self->processed++; -} - -/************************************************************************* - * - * Formatted printing functions - * - ************************************************************************/ - -#if defined(TRIO_DOCUMENTATION) -# include "doc/doc_printf.h" -#endif -/** @addtogroup Printf - @{ -*/ - -/************************************************************************* - * printf - */ - -/** - Print to standard output stream. - - @param format Formatting string. - @param ... Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_printf -TRIO_VARGS2((format, va_alist), - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -/** - Print to standard output stream. - - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_vprintf -TRIO_ARGS2((format, args), - TRIO_CONST char *format, - va_list args) -{ - assert(VALID(format)); - - return TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); -} - -/** - Print to standard output stream. - - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_printfv -TRIO_ARGS2((format, args), - TRIO_CONST char *format, - trio_pointer_t * args) -{ - assert(VALID(format)); - - return TrioFormat(stdout, 0, TrioOutStreamFile, format, NULL, args); -} - -/************************************************************************* - * fprintf - */ - -/** - Print to file. - - @param file File pointer. - @param format Formatting string. - @param ... Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_fprintf -TRIO_VARGS3((file, format, va_alist), - FILE *file, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(file)); - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -/** - Print to file. - - @param file File pointer. - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_vfprintf -TRIO_ARGS3((file, format, args), - FILE *file, - TRIO_CONST char *format, - va_list args) -{ - assert(VALID(file)); - assert(VALID(format)); - - return TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); -} - -/** - Print to file. - - @param file File pointer. - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_fprintfv -TRIO_ARGS3((file, format, args), - FILE *file, - TRIO_CONST char *format, - trio_pointer_t * args) -{ - assert(VALID(file)); - assert(VALID(format)); - - return TrioFormat(file, 0, TrioOutStreamFile, format, NULL, args); -} - -/************************************************************************* - * dprintf - */ - -/** - Print to file descriptor. - - @param fd File descriptor. - @param format Formatting string. - @param ... Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_dprintf -TRIO_VARGS3((fd, format, va_alist), - int fd, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -/** - Print to file descriptor. - - @param fd File descriptor. - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_vdprintf -TRIO_ARGS3((fd, format, args), - int fd, - TRIO_CONST char *format, - va_list args) -{ - assert(VALID(format)); - - return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); -} - -/** - Print to file descriptor. - - @param fd File descriptor. - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_dprintfv -TRIO_ARGS3((fd, format, args), - int fd, - TRIO_CONST char *format, - trio_pointer_t *args) -{ - assert(VALID(format)); - - return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, NULL, args); -} - -/************************************************************************* - * cprintf - */ -TRIO_PUBLIC int -trio_cprintf -TRIO_VARGS4((stream, closure, format, va_alist), - trio_outstream_t stream, - trio_pointer_t closure, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - trio_custom_t data; - - assert(VALID(stream)); - assert(VALID(format)); - - TRIO_VA_START(args, format); - data.stream.out = stream; - data.closure = closure; - status = TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -TRIO_PUBLIC int -trio_vcprintf -TRIO_ARGS4((stream, closure, format, args), - trio_outstream_t stream, - trio_pointer_t closure, - TRIO_CONST char *format, - va_list args) -{ - trio_custom_t data; - - assert(VALID(stream)); - assert(VALID(format)); - - data.stream.out = stream; - data.closure = closure; - return TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); -} - -TRIO_PUBLIC int -trio_cprintfv -TRIO_ARGS4((stream, closure, format, args), - trio_outstream_t stream, - trio_pointer_t closure, - TRIO_CONST char *format, - void **args) -{ - trio_custom_t data; - - assert(VALID(stream)); - assert(VALID(format)); - - data.stream.out = stream; - data.closure = closure; - return TrioFormat(&data, 0, TrioOutStreamCustom, format, NULL, args); -} - -/************************************************************************* - * sprintf - */ - -/** - Print to string. - - @param buffer Output string. - @param format Formatting string. - @param ... Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_sprintf -TRIO_VARGS3((buffer, format, va_alist), - char *buffer, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(buffer)); - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); - *buffer = NIL; /* Terminate with NIL character */ - TRIO_VA_END(args); - return status; -} - -/** - Print to string. - - @param buffer Output string. - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_vsprintf -TRIO_ARGS3((buffer, format, args), - char *buffer, - TRIO_CONST char *format, - va_list args) -{ - int status; - - assert(VALID(buffer)); - assert(VALID(format)); - - status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); - *buffer = NIL; - return status; -} - -/** - Print to string. - - @param buffer Output string. - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_sprintfv -TRIO_ARGS3((buffer, format, args), - char *buffer, - TRIO_CONST char *format, - trio_pointer_t *args) -{ - int status; - - assert(VALID(buffer)); - assert(VALID(format)); - - status = TrioFormat(&buffer, 0, TrioOutStreamString, format, NULL, args); - *buffer = NIL; - return status; -} - -/************************************************************************* - * snprintf - */ - -/** - Print at most @p max characters to string. - - @param buffer Output string. - @param max Maximum number of characters to print. - @param format Formatting string. - @param ... Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_snprintf -TRIO_VARGS4((buffer, max, format, va_alist), - char *buffer, - size_t max, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(buffer)); - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, - TrioOutStreamStringMax, format, &args, NULL); - if (max > 0) - *buffer = NIL; - TRIO_VA_END(args); - return status; -} - -/** - Print at most @p max characters to string. - - @param buffer Output string. - @param max Maximum number of characters to print. - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_vsnprintf -TRIO_ARGS4((buffer, max, format, args), - char *buffer, - size_t max, - TRIO_CONST char *format, - va_list args) -{ - int status; - - assert(VALID(buffer)); - assert(VALID(format)); - - status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, - TrioOutStreamStringMax, format, &args, NULL); - if (max > 0) - *buffer = NIL; - return status; -} - -/** - Print at most @p max characters to string. - - @param buffer Output string. - @param max Maximum number of characters to print. - @param format Formatting string. - @param args Arguments. - @return Number of printed characters. - */ -TRIO_PUBLIC int -trio_snprintfv -TRIO_ARGS4((buffer, max, format, args), - char *buffer, - size_t max, - TRIO_CONST char *format, - trio_pointer_t *args) -{ - int status; - - assert(VALID(buffer)); - assert(VALID(format)); - - status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, - TrioOutStreamStringMax, format, NULL, args); - if (max > 0) - *buffer = NIL; - return status; -} - -/************************************************************************* - * snprintfcat - * Appends the new string to the buffer string overwriting the '\0' - * character at the end of buffer. - */ -TRIO_PUBLIC int -trio_snprintfcat -TRIO_VARGS4((buffer, max, format, va_alist), - char *buffer, - size_t max, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - size_t buf_len; - - TRIO_VA_START(args, format); - - assert(VALID(buffer)); - assert(VALID(format)); - - buf_len = trio_length(buffer); - buffer = &buffer[buf_len]; - - status = TrioFormat(&buffer, max - 1 - buf_len, - TrioOutStreamStringMax, format, &args, NULL); - TRIO_VA_END(args); - *buffer = NIL; - return status; -} - -TRIO_PUBLIC int -trio_vsnprintfcat -TRIO_ARGS4((buffer, max, format, args), - char *buffer, - size_t max, - TRIO_CONST char *format, - va_list args) -{ - int status; - size_t buf_len; - - assert(VALID(buffer)); - assert(VALID(format)); - - buf_len = trio_length(buffer); - buffer = &buffer[buf_len]; - status = TrioFormat(&buffer, max - 1 - buf_len, - TrioOutStreamStringMax, format, &args, NULL); - *buffer = NIL; - return status; -} - -/************************************************************************* - * trio_aprintf - */ - -/* Deprecated */ -TRIO_PUBLIC char * -trio_aprintf -TRIO_VARGS2((format, va_alist), - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - va_list args; - trio_string_t *info; - char *result = NULL; - - assert(VALID(format)); - - info = trio_xstring_duplicate(""); - if (info) - { - TRIO_VA_START(args, format); - (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, - format, &args, NULL); - TRIO_VA_END(args); - - trio_string_terminate(info); - result = trio_string_extract(info); - trio_string_destroy(info); - } - return result; -} - -/* Deprecated */ -TRIO_PUBLIC char * -trio_vaprintf -TRIO_ARGS2((format, args), - TRIO_CONST char *format, - va_list args) -{ - trio_string_t *info; - char *result = NULL; - - assert(VALID(format)); - - info = trio_xstring_duplicate(""); - if (info) - { - (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, - format, &args, NULL); - trio_string_terminate(info); - result = trio_string_extract(info); - trio_string_destroy(info); - } - return result; -} - -TRIO_PUBLIC int -trio_asprintf -TRIO_VARGS3((result, format, va_alist), - char **result, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - va_list args; - int status; - trio_string_t *info; - - assert(VALID(format)); - - *result = NULL; - - info = trio_xstring_duplicate(""); - if (info == NULL) - { - status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); - } - else - { - TRIO_VA_START(args, format); - status = TrioFormat(info, 0, TrioOutStreamStringDynamic, - format, &args, NULL); - TRIO_VA_END(args); - if (status >= 0) - { - trio_string_terminate(info); - *result = trio_string_extract(info); - } - trio_string_destroy(info); - } - return status; -} - -TRIO_PUBLIC int -trio_vasprintf -TRIO_ARGS3((result, format, args), - char **result, - TRIO_CONST char *format, - va_list args) -{ - int status; - trio_string_t *info; - - assert(VALID(format)); - - *result = NULL; - - info = trio_xstring_duplicate(""); - if (info == NULL) - { - status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); - } - else - { - status = TrioFormat(info, 0, TrioOutStreamStringDynamic, - format, &args, NULL); - if (status >= 0) - { - trio_string_terminate(info); - *result = trio_string_extract(info); - } - trio_string_destroy(info); - } - return status; -} - -/** @} End of Printf documentation module */ - -/************************************************************************* - * - * CALLBACK - * - ************************************************************************/ - -#if defined(TRIO_DOCUMENTATION) -# include "doc/doc_register.h" -#endif -/** - @addtogroup UserDefined - @{ -*/ - -#if TRIO_EXTENSION - -/************************************************************************* - * trio_register - */ - -/** - Register new user-defined specifier. - - @param callback - @param name - @return Handle. - */ -TRIO_PUBLIC trio_pointer_t -trio_register -TRIO_ARGS2((callback, name), - trio_callback_t callback, - TRIO_CONST char *name) -{ - trio_userdef_t *def; - trio_userdef_t *prev = NULL; - - if (callback == NULL) - return NULL; - - if (name) - { - /* Handle built-in namespaces */ - if (name[0] == ':') - { - if (trio_equal(name, ":enter")) - { - internalEnterCriticalRegion = callback; - } - else if (trio_equal(name, ":leave")) - { - internalLeaveCriticalRegion = callback; - } - return NULL; - } - - /* Bail out if namespace is too long */ - if (trio_length(name) >= MAX_USER_NAME) - return NULL; - - /* Bail out if namespace already is registered */ - def = TrioFindNamespace(name, &prev); - if (def) - return NULL; - } - - def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t)); - if (def) - { - if (internalEnterCriticalRegion) - (void)internalEnterCriticalRegion(NULL); - - if (name) - { - /* Link into internal list */ - if (prev == NULL) - internalUserDef = def; - else - prev->next = def; - } - /* Initialize */ - def->callback = callback; - def->name = (name == NULL) - ? NULL - : trio_duplicate(name); - def->next = NULL; - - if (internalLeaveCriticalRegion) - (void)internalLeaveCriticalRegion(NULL); - } - return (trio_pointer_t)def; -} - -/** - Unregister an existing user-defined specifier. - - @param handle - */ -void -trio_unregister -TRIO_ARGS1((handle), - trio_pointer_t handle) -{ - trio_userdef_t *self = (trio_userdef_t *)handle; - trio_userdef_t *def; - trio_userdef_t *prev = NULL; - - assert(VALID(self)); - - if (self->name) - { - def = TrioFindNamespace(self->name, &prev); - if (def) - { - if (internalEnterCriticalRegion) - (void)internalEnterCriticalRegion(NULL); - - if (prev == NULL) - internalUserDef = NULL; - else - prev->next = def->next; - - if (internalLeaveCriticalRegion) - (void)internalLeaveCriticalRegion(NULL); - } - trio_destroy(self->name); - } - TRIO_FREE(self); -} - -/************************************************************************* - * trio_get_format [public] - */ -TRIO_CONST char * -trio_get_format -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ -#if defined(FORMAT_USER_DEFINED) - assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED); -#endif - - return (((trio_reference_t *)ref)->parameter->user_data); -} - -/************************************************************************* - * trio_get_argument [public] - */ -trio_pointer_t -trio_get_argument -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ -#if defined(FORMAT_USER_DEFINED) - assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED); -#endif - - return ((trio_reference_t *)ref)->parameter->data.pointer; -} - -/************************************************************************* - * trio_get_width / trio_set_width [public] - */ -int -trio_get_width -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return ((trio_reference_t *)ref)->parameter->width; -} - -void -trio_set_width -TRIO_ARGS2((ref, width), - trio_pointer_t ref, - int width) -{ - ((trio_reference_t *)ref)->parameter->width = width; -} - -/************************************************************************* - * trio_get_precision / trio_set_precision [public] - */ -int -trio_get_precision -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->precision); -} - -void -trio_set_precision -TRIO_ARGS2((ref, precision), - trio_pointer_t ref, - int precision) -{ - ((trio_reference_t *)ref)->parameter->precision = precision; -} - -/************************************************************************* - * trio_get_base / trio_set_base [public] - */ -int -trio_get_base -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->base); -} - -void -trio_set_base -TRIO_ARGS2((ref, base), - trio_pointer_t ref, - int base) -{ - ((trio_reference_t *)ref)->parameter->base = base; -} - -/************************************************************************* - * trio_get_long / trio_set_long [public] - */ -int -trio_get_long -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONG) - ? TRUE - : FALSE; -} - -void -trio_set_long -TRIO_ARGS2((ref, is_long), - trio_pointer_t ref, - int is_long) -{ - if (is_long) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONG; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONG; -} - -/************************************************************************* - * trio_get_longlong / trio_set_longlong [public] - */ -int -trio_get_longlong -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUAD) - ? TRUE - : FALSE; -} - -void -trio_set_longlong -TRIO_ARGS2((ref, is_longlong), - trio_pointer_t ref, - int is_longlong) -{ - if (is_longlong) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUAD; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUAD; -} - -/************************************************************************* - * trio_get_longdouble / trio_set_longdouble [public] - */ -int -trio_get_longdouble -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONGDOUBLE) - ? TRUE - : FALSE; -} - -void -trio_set_longdouble -TRIO_ARGS2((ref, is_longdouble), - trio_pointer_t ref, - int is_longdouble) -{ - if (is_longdouble) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONGDOUBLE; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONGDOUBLE; -} - -/************************************************************************* - * trio_get_short / trio_set_short [public] - */ -int -trio_get_short -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORT) - ? TRUE - : FALSE; -} - -void -trio_set_short -TRIO_ARGS2((ref, is_short), - trio_pointer_t ref, - int is_short) -{ - if (is_short) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORT; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORT; -} - -/************************************************************************* - * trio_get_shortshort / trio_set_shortshort [public] - */ -int -trio_get_shortshort -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORTSHORT) - ? TRUE - : FALSE; -} - -void -trio_set_shortshort -TRIO_ARGS2((ref, is_shortshort), - trio_pointer_t ref, - int is_shortshort) -{ - if (is_shortshort) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORTSHORT; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORTSHORT; -} - -/************************************************************************* - * trio_get_alternative / trio_set_alternative [public] - */ -int -trio_get_alternative -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_ALTERNATIVE) - ? TRUE - : FALSE; -} - -void -trio_set_alternative -TRIO_ARGS2((ref, is_alternative), - trio_pointer_t ref, - int is_alternative) -{ - if (is_alternative) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_ALTERNATIVE; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_ALTERNATIVE; -} - -/************************************************************************* - * trio_get_alignment / trio_set_alignment [public] - */ -int -trio_get_alignment -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LEFTADJUST) - ? TRUE - : FALSE; -} - -void -trio_set_alignment -TRIO_ARGS2((ref, is_leftaligned), - trio_pointer_t ref, - int is_leftaligned) -{ - if (is_leftaligned) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LEFTADJUST; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LEFTADJUST; -} - -/************************************************************************* - * trio_get_spacing /trio_set_spacing [public] - */ -int -trio_get_spacing -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SPACE) - ? TRUE - : FALSE; -} - -void -trio_set_spacing -TRIO_ARGS2((ref, is_space), - trio_pointer_t ref, - int is_space) -{ - if (is_space) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SPACE; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SPACE; -} - -/************************************************************************* - * trio_get_sign / trio_set_sign [public] - */ -int -trio_get_sign -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHOWSIGN) - ? TRUE - : FALSE; -} - -void -trio_set_sign -TRIO_ARGS2((ref, is_sign), - trio_pointer_t ref, - int is_sign) -{ - if (is_sign) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHOWSIGN; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHOWSIGN; -} - -/************************************************************************* - * trio_get_padding / trio_set_padding [public] - */ -int -trio_get_padding -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_NILPADDING) - ? TRUE - : FALSE; -} - -void -trio_set_padding -TRIO_ARGS2((ref, is_padding), - trio_pointer_t ref, - int is_padding) -{ - if (is_padding) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_NILPADDING; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_NILPADDING; -} - -/************************************************************************* - * trio_get_quote / trio_set_quote [public] - */ -int -trio_get_quote -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUOTE) - ? TRUE - : FALSE; -} - -void -trio_set_quote -TRIO_ARGS2((ref, is_quote), - trio_pointer_t ref, - int is_quote) -{ - if (is_quote) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUOTE; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUOTE; -} - -/************************************************************************* - * trio_get_upper / trio_set_upper [public] - */ -int -trio_get_upper -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_UPPER) - ? TRUE - : FALSE; -} - -void -trio_set_upper -TRIO_ARGS2((ref, is_upper), - trio_pointer_t ref, - int is_upper) -{ - if (is_upper) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_UPPER; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_UPPER; -} - -/************************************************************************* - * trio_get_largest / trio_set_largest [public] - */ -#if TRIO_C99 -int -trio_get_largest -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_INTMAX_T) - ? TRUE - : FALSE; -} - -void -trio_set_largest -TRIO_ARGS2((ref, is_largest), - trio_pointer_t ref, - int is_largest) -{ - if (is_largest) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_INTMAX_T; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_INTMAX_T; -} -#endif - -/************************************************************************* - * trio_get_ptrdiff / trio_set_ptrdiff [public] - */ -int -trio_get_ptrdiff -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_PTRDIFF_T) - ? TRUE - : FALSE; -} - -void -trio_set_ptrdiff -TRIO_ARGS2((ref, is_ptrdiff), - trio_pointer_t ref, - int is_ptrdiff) -{ - if (is_ptrdiff) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_PTRDIFF_T; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_PTRDIFF_T; -} - -/************************************************************************* - * trio_get_size / trio_set_size [public] - */ -#if TRIO_C99 -int -trio_get_size -TRIO_ARGS1((ref), - trio_pointer_t ref) -{ - return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SIZE_T) - ? TRUE - : FALSE; -} - -void -trio_set_size -TRIO_ARGS2((ref, is_size), - trio_pointer_t ref, - int is_size) -{ - if (is_size) - ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SIZE_T; - else - ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SIZE_T; -} -#endif - -/************************************************************************* - * trio_print_int [public] - */ -void -trio_print_int -TRIO_ARGS2((ref, number), - trio_pointer_t ref, - int number) -{ - trio_reference_t *self = (trio_reference_t *)ref; - - TrioWriteNumber(self->data, - (trio_uintmax_t)number, - self->parameter->flags, - self->parameter->width, - self->parameter->precision, - self->parameter->base); -} - -/************************************************************************* - * trio_print_uint [public] - */ -void -trio_print_uint -TRIO_ARGS2((ref, number), - trio_pointer_t ref, - unsigned int number) -{ - trio_reference_t *self = (trio_reference_t *)ref; - - TrioWriteNumber(self->data, - (trio_uintmax_t)number, - self->parameter->flags | FLAGS_UNSIGNED, - self->parameter->width, - self->parameter->precision, - self->parameter->base); -} - -/************************************************************************* - * trio_print_double [public] - */ -void -trio_print_double -TRIO_ARGS2((ref, number), - trio_pointer_t ref, - double number) -{ - trio_reference_t *self = (trio_reference_t *)ref; - - TrioWriteDouble(self->data, - number, - self->parameter->flags, - self->parameter->width, - self->parameter->precision, - self->parameter->base); -} - -/************************************************************************* - * trio_print_string [public] - */ -void -trio_print_string -TRIO_ARGS2((ref, string), - trio_pointer_t ref, - char *string) -{ - trio_reference_t *self = (trio_reference_t *)ref; - - TrioWriteString(self->data, - string, - self->parameter->flags, - self->parameter->width, - self->parameter->precision); -} - -/************************************************************************* - * trio_print_ref [public] - */ -int -trio_print_ref -TRIO_VARGS3((ref, format, va_alist), - trio_pointer_t ref, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list arglist; - - assert(VALID(format)); - - TRIO_VA_START(arglist, format); - status = TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); - TRIO_VA_END(arglist); - return status; -} - -/************************************************************************* - * trio_vprint_ref [public] - */ -int -trio_vprint_ref -TRIO_ARGS3((ref, format, arglist), - trio_pointer_t ref, - TRIO_CONST char *format, - va_list arglist) -{ - assert(VALID(format)); - - return TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); -} - -/************************************************************************* - * trio_printv_ref [public] - */ -int -trio_printv_ref -TRIO_ARGS3((ref, format, argarray), - trio_pointer_t ref, - TRIO_CONST char *format, - trio_pointer_t *argarray) -{ - assert(VALID(format)); - - return TrioFormatRef((trio_reference_t *)ref, format, NULL, argarray); -} - -#endif /* TRIO_EXTENSION */ - -/************************************************************************* - * trio_print_pointer [public] - */ -void -trio_print_pointer -TRIO_ARGS2((ref, pointer), - trio_pointer_t ref, - trio_pointer_t pointer) -{ - trio_reference_t *self = (trio_reference_t *)ref; - trio_flags_t flags; - trio_uintmax_t number; - - if (NULL == pointer) - { - TRIO_CONST char *string = internalNullString; - while (*string) - self->data->OutStream(self->data, *string++); - } - else - { - /* - * The subtraction of the null pointer is a workaround - * to avoid a compiler warning. The performance overhead - * is negligible (and likely to be removed by an - * optimizing compiler). The (char *) casting is done - * to please ANSI C++. - */ - number = (trio_uintmax_t)((char *)pointer - (char *)0); - /* Shrink to size of pointer */ - number &= (trio_uintmax_t)-1; - flags = self->parameter->flags; - flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | - FLAGS_NILPADDING); - TrioWriteNumber(self->data, - number, - flags, - POINTER_WIDTH, - NO_PRECISION, - BASE_HEX); - } -} - -/** @} End of UserDefined documentation module */ - -/************************************************************************* - * - * LOCALES - * - ************************************************************************/ - -/************************************************************************* - * trio_locale_set_decimal_point - * - * Decimal point can only be one character. The input argument is a - * string to enable multibyte characters. At most MB_LEN_MAX characters - * will be used. - */ -TRIO_PUBLIC void -trio_locale_set_decimal_point -TRIO_ARGS1((decimalPoint), - char *decimalPoint) -{ -#if defined(USE_LOCALE) - if (NULL == internalLocaleValues) - { - TrioSetLocale(); - } -#endif - internalDecimalPointLength = trio_length(decimalPoint); - if (internalDecimalPointLength == 1) - { - internalDecimalPoint = *decimalPoint; - } - else - { - internalDecimalPoint = NIL; - trio_copy_max(internalDecimalPointString, - sizeof(internalDecimalPointString), - decimalPoint); - } -} - -/************************************************************************* - * trio_locale_set_thousand_separator - * - * See trio_locale_set_decimal_point - */ -TRIO_PUBLIC void -trio_locale_set_thousand_separator -TRIO_ARGS1((thousandSeparator), - char *thousandSeparator) -{ -#if defined(USE_LOCALE) - if (NULL == internalLocaleValues) - { - TrioSetLocale(); - } -#endif - trio_copy_max(internalThousandSeparator, - sizeof(internalThousandSeparator), - thousandSeparator); - internalThousandSeparatorLength = trio_length(internalThousandSeparator); -} - -/************************************************************************* - * trio_locale_set_grouping - * - * Array of bytes. Reversed order. - * - * CHAR_MAX : No further grouping - * 0 : Repeat last group for the remaining digits (not necessary - * as C strings are zero-terminated) - * n : Set current group to n - * - * Same order as the grouping attribute in LC_NUMERIC. - */ -TRIO_PUBLIC void -trio_locale_set_grouping -TRIO_ARGS1((grouping), - char *grouping) -{ -#if defined(USE_LOCALE) - if (NULL == internalLocaleValues) - { - TrioSetLocale(); - } -#endif - trio_copy_max(internalGrouping, - sizeof(internalGrouping), - grouping); -} - - -/************************************************************************* - * - * SCANNING - * - ************************************************************************/ - -/************************************************************************* - * TrioSkipWhitespaces - */ -TRIO_PRIVATE int -TrioSkipWhitespaces -TRIO_ARGS1((self), - trio_class_t *self) -{ - int ch; - - ch = self->current; - while (isspace(ch)) - { - self->InStream(self, &ch); - } - return ch; -} - -/************************************************************************* - * TrioGetCollation - */ -#if TRIO_EXTENSION -TRIO_PRIVATE void -TrioGetCollation(TRIO_NOARGS) -{ - int i; - int j; - int k; - char first[2]; - char second[2]; - - /* This is computationally expensive */ - first[1] = NIL; - second[1] = NIL; - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - { - k = 0; - first[0] = (char)i; - for (j = 0; j < MAX_CHARACTER_CLASS; j++) - { - second[0] = (char)j; - if (trio_equal_locale(first, second)) - internalCollationArray[i][k++] = (char)j; - } - internalCollationArray[i][k] = NIL; - } -} -#endif - -/************************************************************************* - * TrioGetCharacterClass - * - * FIXME: - * multibyte - */ -TRIO_PRIVATE int -TrioGetCharacterClass -TRIO_ARGS4((format, indexPointer, flagsPointer, characterclass), - TRIO_CONST char *format, - int *indexPointer, - trio_flags_t *flagsPointer, - int *characterclass) -{ - int index = *indexPointer; - int i; - char ch; - char range_begin; - char range_end; - - *flagsPointer &= ~FLAGS_EXCLUDE; - - if (format[index] == QUALIFIER_CIRCUMFLEX) - { - *flagsPointer |= FLAGS_EXCLUDE; - index++; - } - /* - * If the ungroup character is at the beginning of the scanlist, - * it will be part of the class, and a second ungroup character - * must follow to end the group. - */ - if (format[index] == SPECIFIER_UNGROUP) - { - characterclass[(int)SPECIFIER_UNGROUP]++; - index++; - } - /* - * Minus is used to specify ranges. To include minus in the class, - * it must be at the beginning of the list - */ - if (format[index] == QUALIFIER_MINUS) - { - characterclass[(int)QUALIFIER_MINUS]++; - index++; - } - /* Collect characters */ - for (ch = format[index]; - (ch != SPECIFIER_UNGROUP) && (ch != NIL); - ch = format[++index]) - { - switch (ch) - { - case QUALIFIER_MINUS: /* Scanlist ranges */ - - /* - * Both C99 and UNIX98 describes ranges as implementation- - * defined. - * - * We support the following behaviour (although this may - * change as we become wiser) - * - only increasing ranges, ie. [a-b] but not [b-a] - * - transitive ranges, ie. [a-b-c] == [a-c] - * - trailing minus, ie. [a-] is interpreted as an 'a' - * and a '-' - * - duplicates (although we can easily convert these - * into errors) - */ - range_begin = format[index - 1]; - range_end = format[++index]; - if (range_end == SPECIFIER_UNGROUP) - { - /* Trailing minus is included */ - characterclass[(int)ch]++; - ch = range_end; - break; /* for */ - } - if (range_end == NIL) - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - if (range_begin > range_end) - return TRIO_ERROR_RETURN(TRIO_ERANGE, index); - - for (i = (int)range_begin; i <= (int)range_end; i++) - characterclass[i]++; - - ch = range_end; - break; - -#if TRIO_EXTENSION - - case SPECIFIER_GROUP: - - switch (format[index + 1]) - { - case QUALIFIER_DOT: /* Collating symbol */ - /* - * FIXME: This will be easier to implement when multibyte - * characters have been implemented. Until now, we ignore - * this feature. - */ - for (i = index + 2; ; i++) - { - if (format[i] == NIL) - /* Error in syntax */ - return -1; - else if (format[i] == QUALIFIER_DOT) - break; /* for */ - } - if (format[++i] != SPECIFIER_UNGROUP) - return -1; - - index = i; - break; - - case QUALIFIER_EQUAL: /* Equivalence class expressions */ - { - unsigned int j; - unsigned int k; - - if (internalCollationUnconverted) - { - /* Lazy evaluation of collation array */ - TrioGetCollation(); - internalCollationUnconverted = FALSE; - } - for (i = index + 2; ; i++) - { - if (format[i] == NIL) - /* Error in syntax */ - return -1; - else if (format[i] == QUALIFIER_EQUAL) - break; /* for */ - else - { - /* Mark any equivalent character */ - k = (unsigned int)format[i]; - for (j = 0; internalCollationArray[k][j] != NIL; j++) - characterclass[(int)internalCollationArray[k][j]]++; - } - } - if (format[++i] != SPECIFIER_UNGROUP) - return -1; - - index = i; - } - break; - - case QUALIFIER_COLON: /* Character class expressions */ - - if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isalnum(i)) - characterclass[i]++; - index += sizeof(CLASS_ALNUM) - 1; - } - else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isalpha(i)) - characterclass[i]++; - index += sizeof(CLASS_ALPHA) - 1; - } - else if (trio_equal_max(CLASS_CNTRL, sizeof(CLASS_CNTRL) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (iscntrl(i)) - characterclass[i]++; - index += sizeof(CLASS_CNTRL) - 1; - } - else if (trio_equal_max(CLASS_DIGIT, sizeof(CLASS_DIGIT) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isdigit(i)) - characterclass[i]++; - index += sizeof(CLASS_DIGIT) - 1; - } - else if (trio_equal_max(CLASS_GRAPH, sizeof(CLASS_GRAPH) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isgraph(i)) - characterclass[i]++; - index += sizeof(CLASS_GRAPH) - 1; - } - else if (trio_equal_max(CLASS_LOWER, sizeof(CLASS_LOWER) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (islower(i)) - characterclass[i]++; - index += sizeof(CLASS_LOWER) - 1; - } - else if (trio_equal_max(CLASS_PRINT, sizeof(CLASS_PRINT) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isprint(i)) - characterclass[i]++; - index += sizeof(CLASS_PRINT) - 1; - } - else if (trio_equal_max(CLASS_PUNCT, sizeof(CLASS_PUNCT) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (ispunct(i)) - characterclass[i]++; - index += sizeof(CLASS_PUNCT) - 1; - } - else if (trio_equal_max(CLASS_SPACE, sizeof(CLASS_SPACE) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isspace(i)) - characterclass[i]++; - index += sizeof(CLASS_SPACE) - 1; - } - else if (trio_equal_max(CLASS_UPPER, sizeof(CLASS_UPPER) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isupper(i)) - characterclass[i]++; - index += sizeof(CLASS_UPPER) - 1; - } - else if (trio_equal_max(CLASS_XDIGIT, sizeof(CLASS_XDIGIT) - 1, - &format[index])) - { - for (i = 0; i < MAX_CHARACTER_CLASS; i++) - if (isxdigit(i)) - characterclass[i]++; - index += sizeof(CLASS_XDIGIT) - 1; - } - else - { - characterclass[(int)ch]++; - } - break; - - default: - characterclass[(int)ch]++; - break; - } - break; - -#endif /* TRIO_EXTENSION */ - - default: - characterclass[(int)ch]++; - break; - } - } - return 0; -} - -/************************************************************************* - * TrioReadNumber - * - * We implement our own number conversion in preference of strtol and - * strtoul, because we must handle 'long long' and thousand separators. - */ -TRIO_PRIVATE BOOLEAN_T -TrioReadNumber -TRIO_ARGS5((self, target, flags, width, base), - trio_class_t *self, - trio_uintmax_t *target, - trio_flags_t flags, - int width, - int base) -{ - trio_uintmax_t number = 0; - int digit; - int count; - BOOLEAN_T isNegative = FALSE; - BOOLEAN_T gotNumber = FALSE; - int j; - - assert(VALID(self)); - assert(VALID(self->InStream)); - assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE)); - - if (internalDigitsUnconverted) - { - /* Lazy evaluation of digits array */ - memset(internalDigitArray, -1, sizeof(internalDigitArray)); - for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++) - { - internalDigitArray[(int)internalDigitsLower[j]] = j; - internalDigitArray[(int)internalDigitsUpper[j]] = j; - } - internalDigitsUnconverted = FALSE; - } - - TrioSkipWhitespaces(self); - - if (!(flags & FLAGS_UNSIGNED)) - { - /* Leading sign */ - if (self->current == '+') - { - self->InStream(self, NULL); - } - else if (self->current == '-') - { - self->InStream(self, NULL); - isNegative = TRUE; - } - } - - count = self->processed; - - if (flags & FLAGS_ALTERNATIVE) - { - switch (base) - { - case NO_BASE: - case BASE_OCTAL: - case BASE_HEX: - case BASE_BINARY: - if (self->current == '0') - { - self->InStream(self, NULL); - if (self->current) - { - if ((base == BASE_HEX) && - (trio_to_upper(self->current) == 'X')) - { - self->InStream(self, NULL); - } - else if ((base == BASE_BINARY) && - (trio_to_upper(self->current) == 'B')) - { - self->InStream(self, NULL); - } - } - } - else - return FALSE; - break; - default: - break; - } - } - - while (((width == NO_WIDTH) || (self->processed - count < width)) && - (! ((self->current == EOF) || isspace(self->current)))) - { - if (isascii(self->current)) - { - digit = internalDigitArray[self->current]; - /* Abort if digit is not allowed in the specified base */ - if ((digit == -1) || (digit >= base)) - break; - } - else if (flags & FLAGS_QUOTE) - { - /* Compare with thousands separator */ - for (j = 0; internalThousandSeparator[j] && self->current; j++) - { - if (internalThousandSeparator[j] != self->current) - break; - - self->InStream(self, NULL); - } - if (internalThousandSeparator[j]) - break; /* Mismatch */ - else - continue; /* Match */ - } - else - break; - - number *= base; - number += digit; - gotNumber = TRUE; /* we need at least one digit */ - - self->InStream(self, NULL); - } - - /* Was anything read at all? */ - if (!gotNumber) - return FALSE; - - if (target) - *target = (isNegative) ? -((trio_intmax_t)number) : number; - return TRUE; -} - -/************************************************************************* - * TrioReadChar - */ -TRIO_PRIVATE int -TrioReadChar -TRIO_ARGS4((self, target, flags, width), - trio_class_t *self, - char *target, - trio_flags_t flags, - int width) -{ - int i; - char ch; - trio_uintmax_t number; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - for (i = 0; - (self->current != EOF) && (i < width); - i++) - { - ch = (char)self->current; - self->InStream(self, NULL); - if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH)) - { - switch (self->current) - { - case '\\': ch = '\\'; break; - case 'a': ch = '\007'; break; - case 'b': ch = '\b'; break; - case 'f': ch = '\f'; break; - case 'n': ch = '\n'; break; - case 'r': ch = '\r'; break; - case 't': ch = '\t'; break; - case 'v': ch = '\v'; break; - default: - if (isdigit(self->current)) - { - /* Read octal number */ - if (!TrioReadNumber(self, &number, 0, 3, BASE_OCTAL)) - return 0; - ch = (char)number; - } - else if (trio_to_upper(self->current) == 'X') - { - /* Read hexadecimal number */ - self->InStream(self, NULL); - if (!TrioReadNumber(self, &number, 0, 2, BASE_HEX)) - return 0; - ch = (char)number; - } - else - { - ch = (char)self->current; - } - break; - } - } - - if (target) - target[i] = ch; - } - return i + 1; -} - -/************************************************************************* - * TrioReadString - */ -TRIO_PRIVATE BOOLEAN_T -TrioReadString -TRIO_ARGS4((self, target, flags, width), - trio_class_t *self, - char *target, - trio_flags_t flags, - int width) -{ - int i; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - TrioSkipWhitespaces(self); - - /* - * Continue until end of string is reached, a whitespace is encountered, - * or width is exceeded - */ - for (i = 0; - ((width == NO_WIDTH) || (i < width)) && - (! ((self->current == EOF) || isspace(self->current))); - i++) - { - if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0) - break; /* for */ - } - if (target) - target[i] = NIL; - return TRUE; -} - -/************************************************************************* - * TrioReadWideChar - */ -#if TRIO_WIDECHAR -TRIO_PRIVATE int -TrioReadWideChar -TRIO_ARGS4((self, target, flags, width), - trio_class_t *self, - trio_wchar_t *target, - trio_flags_t flags, - int width) -{ - int i; - int j; - int size; - int amount = 0; - trio_wchar_t wch; - char buffer[MB_LEN_MAX + 1]; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - for (i = 0; - (self->current != EOF) && (i < width); - i++) - { - if (isascii(self->current)) - { - if (TrioReadChar(self, buffer, flags, 1) == 0) - return 0; - buffer[1] = NIL; - } - else - { - /* - * Collect a multibyte character, by enlarging buffer until - * it contains a fully legal multibyte character, or the - * buffer is full. - */ - j = 0; - do - { - buffer[j++] = (char)self->current; - buffer[j] = NIL; - self->InStream(self, NULL); - } - while ((j < (int)sizeof(buffer)) && (mblen(buffer, (size_t)j) != j)); - } - if (target) - { - size = mbtowc(&wch, buffer, sizeof(buffer)); - if (size > 0) - target[i] = wch; - } - amount += size; - self->InStream(self, NULL); - } - return amount; -} -#endif /* TRIO_WIDECHAR */ - -/************************************************************************* - * TrioReadWideString - */ -#if TRIO_WIDECHAR -TRIO_PRIVATE BOOLEAN_T -TrioReadWideString -TRIO_ARGS4((self, target, flags, width), - trio_class_t *self, - trio_wchar_t *target, - trio_flags_t flags, - int width) -{ - int i; - int size; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - TrioSkipWhitespaces(self); - -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - (void)mblen(NULL, 0); -#endif - - /* - * Continue until end of string is reached, a whitespace is encountered, - * or width is exceeded - */ - for (i = 0; - ((width == NO_WIDTH) || (i < width)) && - (! ((self->current == EOF) || isspace(self->current))); - ) - { - size = TrioReadWideChar(self, &target[i], flags, 1); - if (size == 0) - break; /* for */ - - i += size; - } - if (target) - target[i] = WCONST('\0'); - return TRUE; -} -#endif /* TRIO_WIDECHAR */ - -/************************************************************************* - * TrioReadGroup - * - * FIXME: characterclass does not work with multibyte characters - */ -TRIO_PRIVATE BOOLEAN_T -TrioReadGroup -TRIO_ARGS5((self, target, characterclass, flags, width), - trio_class_t *self, - char *target, - int *characterclass, - trio_flags_t flags, - int width) -{ - int ch; - int i; - - assert(VALID(self)); - assert(VALID(self->InStream)); - - ch = self->current; - for (i = 0; - ((width == NO_WIDTH) || (i < width)) && - (! ((ch == EOF) || - (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0)))); - i++) - { - if (target) - target[i] = (char)ch; - self->InStream(self, &ch); - } - - if (target) - target[i] = NIL; - return TRUE; -} - -/************************************************************************* - * TrioReadDouble - * - * FIXME: - * add long double - * handle base - */ -TRIO_PRIVATE BOOLEAN_T -TrioReadDouble -TRIO_ARGS4((self, target, flags, width), - trio_class_t *self, - trio_pointer_t target, - trio_flags_t flags, - int width) -{ - int ch; - char doubleString[512]; - int index = 0; - int start; - int j; - BOOLEAN_T isHex = FALSE; - - doubleString[0] = 0; - - if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1)) - width = sizeof(doubleString) - 1; - - TrioSkipWhitespaces(self); - - /* - * Read entire double number from stream. trio_to_double requires - * a string as input, but InStream can be anything, so we have to - * collect all characters. - */ - ch = self->current; - if ((ch == '+') || (ch == '-')) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - width--; - } - - start = index; - switch (ch) - { - case 'n': - case 'N': - /* Not-a-number */ - if (index != 0) - break; - /* FALLTHROUGH */ - case 'i': - case 'I': - /* Infinity */ - while (isalpha(ch) && (index - start < width)) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - doubleString[index] = NIL; - - /* Case insensitive string comparison */ - if (trio_equal(&doubleString[start], INFINITE_UPPER) || - trio_equal(&doubleString[start], LONG_INFINITE_UPPER)) - { - if (flags & FLAGS_LONGDOUBLE) - { - if ((start == 1) && (doubleString[0] == '-')) - { - *((trio_long_double_t *)target) = trio_ninf(); - } - else - { - *((trio_long_double_t *)target) = trio_pinf(); - } - } - else - { - if ((start == 1) && (doubleString[0] == '-')) - { - *((double *)target) = trio_ninf(); - } - else - { - *((double *)target) = trio_pinf(); - } - } - return TRUE; - } - if (trio_equal(doubleString, NAN_UPPER)) - { - /* NaN must not have a preceeding + nor - */ - if (flags & FLAGS_LONGDOUBLE) - { - *((trio_long_double_t *)target) = trio_nan(); - } - else - { - *((double *)target) = trio_nan(); - } - return TRUE; - } - return FALSE; - - case '0': - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - if (trio_to_upper(ch) == 'X') - { - isHex = TRUE; - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - break; - - default: - break; - } - - while ((ch != EOF) && (index - start < width)) - { - /* Integer part */ - if (isHex ? isxdigit(ch) : isdigit(ch)) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - else if (flags & FLAGS_QUOTE) - { - /* Compare with thousands separator */ - for (j = 0; internalThousandSeparator[j] && self->current; j++) - { - if (internalThousandSeparator[j] != self->current) - break; - - self->InStream(self, &ch); - } - if (internalThousandSeparator[j]) - break; /* Mismatch */ - else - continue; /* Match */ - } - else - break; /* while */ - } - if (ch == '.') - { - /* Decimal part */ - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - while ((isHex ? isxdigit(ch) : isdigit(ch)) && - (index - start < width)) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - if (isHex ? (trio_to_upper(ch) == 'P') : (trio_to_upper(ch) == 'E')) - { - /* Exponent */ - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - if ((ch == '+') || (ch == '-')) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - while (isdigit(ch) && (index - start < width)) - { - doubleString[index++] = (char)ch; - self->InStream(self, &ch); - } - } - } - - if ((index == start) || (*doubleString == NIL)) - return FALSE; - - doubleString[index] = 0; - - if (flags & FLAGS_LONGDOUBLE) - { - *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL); - } - else - { - *((double *)target) = trio_to_double(doubleString, NULL); - } - return TRUE; -} - -/************************************************************************* - * TrioReadPointer - */ -TRIO_PRIVATE BOOLEAN_T -TrioReadPointer -TRIO_ARGS3((self, target, flags), - trio_class_t *self, - trio_pointer_t *target, - trio_flags_t flags) -{ - trio_uintmax_t number; - char buffer[sizeof(internalNullString)]; - - flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING); - - if (TrioReadNumber(self, - &number, - flags, - POINTER_WIDTH, - BASE_HEX)) - { - /* - * The strange assignment of number is a workaround for a compiler - * warning - */ - if (target) - *target = (char *)0 + number; - return TRUE; - } - else if (TrioReadString(self, - (flags & FLAGS_IGNORE) - ? NULL - : buffer, - 0, - sizeof(internalNullString) - 1)) - { - if (trio_equal_case(buffer, internalNullString)) - { - if (target) - *target = NULL; - return TRUE; - } - } - return FALSE; -} - -/************************************************************************* - * TrioScanProcess - */ -TRIO_PRIVATE int -TrioScanProcess -TRIO_ARGS3((data, format, parameters), - trio_class_t *data, - TRIO_CONST char *format, - trio_parameter_t *parameters) -{ -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - int charlen; - int cnt; -#endif - int assignment; - int ch; - int index; /* Index of format string */ - int i; /* Index of current parameter */ - trio_flags_t flags; - int width; - int base; - trio_pointer_t pointer; - - assignment = 0; - i = 0; - index = 0; - data->InStream(data, &ch); - -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - (void)mblen(NULL, 0); -#endif - - while (format[index]) - { -#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) - if (! isascii(format[index])) - { - charlen = mblen(&format[index], MB_LEN_MAX); - if (charlen != -1) - { - /* Compare multibyte characters in format string */ - for (cnt = 0; cnt < charlen - 1; cnt++) - { - if (ch != format[index + cnt]) - { - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - data->InStream(data, &ch); - } - continue; /* while characters left in formatting string */ - } - } -#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ - - if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT)) - { - return (assignment > 0) ? assignment : EOF; - } - - if (CHAR_IDENTIFIER == format[index]) - { - if (CHAR_IDENTIFIER == format[index + 1]) - { - /* Two % in format matches one % in input stream */ - if (CHAR_IDENTIFIER == ch) - { - data->InStream(data, &ch); - index += 2; - continue; /* while format chars left */ - } - else - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - - /* Skip the parameter entries */ - while (parameters[i].type == FORMAT_PARAMETER) - i++; - - flags = parameters[i].flags; - /* Find width */ - width = parameters[i].width; - if (flags & FLAGS_WIDTH_PARAMETER) - { - /* Get width from parameter list */ - width = (int)parameters[width].data.number.as_signed; - } - /* Find base */ - base = parameters[i].base; - if (flags & FLAGS_BASE_PARAMETER) - { - /* Get base from parameter list */ - base = (int)parameters[base].data.number.as_signed; - } - - switch (parameters[i].type) - { - case FORMAT_INT: - { - trio_uintmax_t number; - - if (0 == base) - base = BASE_DECIMAL; - - if (!TrioReadNumber(data, - &number, - flags, - width, - base)) - return assignment; - - if (!(flags & FLAGS_IGNORE)) - { - assignment++; - - pointer = parameters[i].data.pointer; -#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) - if (flags & FLAGS_SIZE_T) - *(size_t *)pointer = (size_t)number; - else -#endif -#if defined(QUALIFIER_PTRDIFF_T) - if (flags & FLAGS_PTRDIFF_T) - *(ptrdiff_t *)pointer = (ptrdiff_t)number; - else -#endif -#if defined(QUALIFIER_INTMAX_T) - if (flags & FLAGS_INTMAX_T) - *(trio_intmax_t *)pointer = (trio_intmax_t)number; - else -#endif - if (flags & FLAGS_QUAD) - *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number; - else if (flags & FLAGS_LONG) - *(long int *)pointer = (long int)number; - else if (flags & FLAGS_SHORT) - *(short int *)pointer = (short int)number; - else - *(int *)pointer = (int)number; - } - } - break; /* FORMAT_INT */ - - case FORMAT_STRING: -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - if (!TrioReadWideString(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.wstring, - flags, - width)) - return assignment; - } - else -#endif - { - if (!TrioReadString(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.string, - flags, - width)) - return assignment; - } - if (!(flags & FLAGS_IGNORE)) - assignment++; - break; /* FORMAT_STRING */ - - case FORMAT_DOUBLE: - { - trio_pointer_t pointer; - - if (flags & FLAGS_IGNORE) - { - pointer = NULL; - } - else - { - pointer = (flags & FLAGS_LONGDOUBLE) - ? (trio_pointer_t)parameters[i].data.longdoublePointer - : (trio_pointer_t)parameters[i].data.doublePointer; - } - if (!TrioReadDouble(data, pointer, flags, width)) - { - return assignment; - } - if (!(flags & FLAGS_IGNORE)) - { - assignment++; - } - break; /* FORMAT_DOUBLE */ - } - case FORMAT_GROUP: - { - int characterclass[MAX_CHARACTER_CLASS + 1]; - int rc; - - /* Skip over modifiers */ - while (format[index] != SPECIFIER_GROUP) - { - index++; - } - /* Skip over group specifier */ - index++; - - memset(characterclass, 0, sizeof(characterclass)); - rc = TrioGetCharacterClass(format, - &index, - &flags, - characterclass); - if (rc < 0) - return rc; - - if (!TrioReadGroup(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.string, - characterclass, - flags, - parameters[i].width)) - return assignment; - if (!(flags & FLAGS_IGNORE)) - assignment++; - } - break; /* FORMAT_GROUP */ - - case FORMAT_COUNT: - pointer = parameters[i].data.pointer; - if (NULL != pointer) - { - int count = data->committed; - if (ch != EOF) - count--; /* a character is read, but is not consumed yet */ -#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) - if (flags & FLAGS_SIZE_T) - *(size_t *)pointer = (size_t)count; - else -#endif -#if defined(QUALIFIER_PTRDIFF_T) - if (flags & FLAGS_PTRDIFF_T) - *(ptrdiff_t *)pointer = (ptrdiff_t)count; - else -#endif -#if defined(QUALIFIER_INTMAX_T) - if (flags & FLAGS_INTMAX_T) - *(trio_intmax_t *)pointer = (trio_intmax_t)count; - else -#endif - if (flags & FLAGS_QUAD) - { - *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)count; - } - else if (flags & FLAGS_LONG) - { - *(long int *)pointer = (long int)count; - } - else if (flags & FLAGS_SHORT) - { - *(short int *)pointer = (short int)count; - } - else - { - *(int *)pointer = (int)count; - } - } - break; /* FORMAT_COUNT */ - - case FORMAT_CHAR: -#if TRIO_WIDECHAR - if (flags & FLAGS_WIDECHAR) - { - if (TrioReadWideChar(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.wstring, - flags, - (width == NO_WIDTH) ? 1 : width) == 0) - return assignment; - } - else -#endif - { - if (TrioReadChar(data, - (flags & FLAGS_IGNORE) - ? NULL - : parameters[i].data.string, - flags, - (width == NO_WIDTH) ? 1 : width) == 0) - return assignment; - } - if (!(flags & FLAGS_IGNORE)) - assignment++; - break; /* FORMAT_CHAR */ - - case FORMAT_POINTER: - if (!TrioReadPointer(data, - (flags & FLAGS_IGNORE) - ? NULL - : (trio_pointer_t *)parameters[i].data.pointer, - flags)) - return assignment; - if (!(flags & FLAGS_IGNORE)) - assignment++; - break; /* FORMAT_POINTER */ - - case FORMAT_PARAMETER: - break; /* FORMAT_PARAMETER */ - - default: - return TRIO_ERROR_RETURN(TRIO_EINVAL, index); - } - ch = data->current; - index = parameters[i].indexAfterSpecifier; - i++; - } - else /* Not an % identifier */ - { - if (isspace((int)format[index])) - { - /* Whitespaces may match any amount of whitespaces */ - ch = TrioSkipWhitespaces(data); - } - else if (ch == format[index]) - { - data->InStream(data, &ch); - } - else - return assignment; - - index++; - } - } - return assignment; -} - -/************************************************************************* - * TrioScan - */ -TRIO_PRIVATE int -TrioScan -TRIO_ARGS6((source, sourceSize, InStream, format, arglist, argarray), - trio_pointer_t source, - size_t sourceSize, - void (*InStream) TRIO_PROTO((trio_class_t *, int *)), - TRIO_CONST char *format, - va_list *arglist, - trio_pointer_t *argarray) -{ - int status; - trio_parameter_t parameters[MAX_PARAMETERS]; - trio_class_t data; - - assert(VALID(InStream)); - assert(VALID(format)); - - memset(&data, 0, sizeof(data)); - data.InStream = InStream; - data.location = (trio_pointer_t)source; - data.max = sourceSize; - data.error = 0; - -#if defined(USE_LOCALE) - if (NULL == internalLocaleValues) - { - TrioSetLocale(); - } -#endif - - status = TrioParse(TYPE_SCAN, format, parameters, arglist, argarray); - if (status < 0) - return status; - - status = TrioScanProcess(&data, format, parameters); - if (data.error != 0) - { - status = data.error; - } - return status; -} - -/************************************************************************* - * TrioInStreamFile - */ -TRIO_PRIVATE void -TrioInStreamFile -TRIO_ARGS2((self, intPointer), - trio_class_t *self, - int *intPointer) -{ - FILE *file = (FILE *)self->location; - - assert(VALID(self)); - assert(VALID(file)); - - self->current = fgetc(file); - if (self->current == EOF) - { - self->error = (ferror(file)) - ? TRIO_ERROR_RETURN(TRIO_ERRNO, 0) - : TRIO_ERROR_RETURN(TRIO_EOF, 0); - } - else - { - self->processed++; - self->committed++; - } - - if (VALID(intPointer)) - { - *intPointer = self->current; - } -} - -/************************************************************************* - * TrioInStreamFileDescriptor - */ -TRIO_PRIVATE void -TrioInStreamFileDescriptor -TRIO_ARGS2((self, intPointer), - trio_class_t *self, - int *intPointer) -{ - int fd = *((int *)self->location); - int size; - unsigned char input; - - assert(VALID(self)); - - size = read(fd, &input, sizeof(char)); - if (size == -1) - { - self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0); - self->current = EOF; - } - else - { - self->current = (size == 0) ? EOF : input; - } - if (self->current != EOF) - { - self->committed++; - self->processed++; - } - - if (VALID(intPointer)) - { - *intPointer = self->current; - } -} - -/************************************************************************* - * TrioInStreamCustom - */ -TRIO_PRIVATE void -TrioInStreamCustom -TRIO_ARGS2((self, intPointer), - trio_class_t *self, - int *intPointer) -{ - trio_custom_t *data; - - assert(VALID(self)); - assert(VALID(self->location)); - - data = (trio_custom_t *)self->location; - - self->current = (data->stream.in == NULL) - ? NIL - : (data->stream.in)(data->closure); - - if (self->current == NIL) - { - self->current = EOF; - } - else - { - self->processed++; - self->committed++; - } - - if (VALID(intPointer)) - { - *intPointer = self->current; - } -} - -/************************************************************************* - * TrioInStreamString - */ -TRIO_PRIVATE void -TrioInStreamString -TRIO_ARGS2((self, intPointer), - trio_class_t *self, - int *intPointer) -{ - unsigned char **buffer; - - assert(VALID(self)); - assert(VALID(self->location)); - - buffer = (unsigned char **)self->location; - self->current = (*buffer)[0]; - if (self->current == NIL) - { - self->current = EOF; - } - else - { - (*buffer)++; - self->processed++; - self->committed++; - } - - if (VALID(intPointer)) - { - *intPointer = self->current; - } -} - -/************************************************************************* - * - * Formatted scanning functions - * - ************************************************************************/ - -#if defined(TRIO_DOCUMENTATION) -# include "doc/doc_scanf.h" -#endif -/** @addtogroup Scanf - @{ -*/ - -/************************************************************************* - * scanf - */ - -/** - Scan characters from standard input stream. - - @param format Formatting string. - @param ... Arguments. - @return Number of scanned characters. - */ -TRIO_PUBLIC int -trio_scanf -TRIO_VARGS2((format, va_alist), - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioScan((trio_pointer_t)stdin, 0, - TrioInStreamFile, - format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -TRIO_PUBLIC int -trio_vscanf -TRIO_ARGS2((format, args), - TRIO_CONST char *format, - va_list args) -{ - assert(VALID(format)); - - return TrioScan((trio_pointer_t)stdin, 0, - TrioInStreamFile, - format, &args, NULL); -} - -TRIO_PUBLIC int -trio_scanfv -TRIO_ARGS2((format, args), - TRIO_CONST char *format, - trio_pointer_t *args) -{ - assert(VALID(format)); - - return TrioScan((trio_pointer_t)stdin, 0, - TrioInStreamFile, - format, NULL, args); -} - -/************************************************************************* - * fscanf - */ -TRIO_PUBLIC int -trio_fscanf -TRIO_VARGS3((file, format, va_alist), - FILE *file, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(file)); - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioScan((trio_pointer_t)file, 0, - TrioInStreamFile, - format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -TRIO_PUBLIC int -trio_vfscanf -TRIO_ARGS3((file, format, args), - FILE *file, - TRIO_CONST char *format, - va_list args) -{ - assert(VALID(file)); - assert(VALID(format)); - - return TrioScan((trio_pointer_t)file, 0, - TrioInStreamFile, - format, &args, NULL); -} - -TRIO_PUBLIC int -trio_fscanfv -TRIO_ARGS3((file, format, args), - FILE *file, - TRIO_CONST char *format, - trio_pointer_t *args) -{ - assert(VALID(file)); - assert(VALID(format)); - - return TrioScan((trio_pointer_t)file, 0, - TrioInStreamFile, - format, NULL, args); -} - -/************************************************************************* - * dscanf - */ -TRIO_PUBLIC int -trio_dscanf -TRIO_VARGS3((fd, format, va_alist), - int fd, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioScan((trio_pointer_t)&fd, 0, - TrioInStreamFileDescriptor, - format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -TRIO_PUBLIC int -trio_vdscanf -TRIO_ARGS3((fd, format, args), - int fd, - TRIO_CONST char *format, - va_list args) -{ - assert(VALID(format)); - - return TrioScan((trio_pointer_t)&fd, 0, - TrioInStreamFileDescriptor, - format, &args, NULL); -} - -TRIO_PUBLIC int -trio_dscanfv -TRIO_ARGS3((fd, format, args), - int fd, - TRIO_CONST char *format, - trio_pointer_t *args) -{ - assert(VALID(format)); - - return TrioScan((trio_pointer_t)&fd, 0, - TrioInStreamFileDescriptor, - format, NULL, args); -} - -/************************************************************************* - * cscanf - */ -TRIO_PUBLIC int -trio_cscanf -TRIO_VARGS4((stream, closure, format, va_alist), - trio_instream_t stream, - trio_pointer_t closure, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - trio_custom_t data; - - assert(VALID(stream)); - assert(VALID(format)); - - TRIO_VA_START(args, format); - data.stream.in = stream; - data.closure = closure; - status = TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -TRIO_PUBLIC int -trio_vcscanf -TRIO_ARGS4((stream, closure, format, args), - trio_instream_t stream, - trio_pointer_t closure, - TRIO_CONST char *format, - va_list args) -{ - trio_custom_t data; - - assert(VALID(stream)); - assert(VALID(format)); - - data.stream.in = stream; - data.closure = closure; - return TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); -} - -TRIO_PUBLIC int -trio_cscanfv -TRIO_ARGS4((stream, closure, format, args), - trio_instream_t stream, - trio_pointer_t closure, - TRIO_CONST char *format, - trio_pointer_t *args) -{ - trio_custom_t data; - - assert(VALID(stream)); - assert(VALID(format)); - - data.stream.in = stream; - data.closure = closure; - return TrioScan(&data, 0, TrioInStreamCustom, format, NULL, args); -} - -/************************************************************************* - * sscanf - */ -TRIO_PUBLIC int -trio_sscanf -TRIO_VARGS3((buffer, format, va_alist), - TRIO_CONST char *buffer, - TRIO_CONST char *format, - TRIO_VA_DECL) -{ - int status; - va_list args; - - assert(VALID(buffer)); - assert(VALID(format)); - - TRIO_VA_START(args, format); - status = TrioScan((trio_pointer_t)&buffer, 0, - TrioInStreamString, - format, &args, NULL); - TRIO_VA_END(args); - return status; -} - -TRIO_PUBLIC int -trio_vsscanf -TRIO_ARGS3((buffer, format, args), - TRIO_CONST char *buffer, - TRIO_CONST char *format, - va_list args) -{ - assert(VALID(buffer)); - assert(VALID(format)); - - return TrioScan((trio_pointer_t)&buffer, 0, - TrioInStreamString, - format, &args, NULL); -} - -TRIO_PUBLIC int -trio_sscanfv -TRIO_ARGS3((buffer, format, args), - TRIO_CONST char *buffer, - TRIO_CONST char *format, - trio_pointer_t *args) -{ - assert(VALID(buffer)); - assert(VALID(format)); - - return TrioScan((trio_pointer_t)&buffer, 0, - TrioInStreamString, - format, NULL, args); -} - -/** @} End of Scanf documentation module */ - -/************************************************************************* - * trio_strerror - */ -TRIO_PUBLIC TRIO_CONST char * -trio_strerror -TRIO_ARGS1((errorcode), - int errorcode) -{ - /* Textual versions of the error codes */ - switch (TRIO_ERROR_CODE(errorcode)) - { - case TRIO_EOF: - return "End of file"; - case TRIO_EINVAL: - return "Invalid argument"; - case TRIO_ETOOMANY: - return "Too many arguments"; - case TRIO_EDBLREF: - return "Double reference"; - case TRIO_EGAP: - return "Reference gap"; - case TRIO_ENOMEM: - return "Out of memory"; - case TRIO_ERANGE: - return "Invalid range"; - case TRIO_ECUSTOM: - return "Custom error"; - default: - return "Unknown"; - } -} diff --git a/ThirdParty/libxml2/vtklibxml2/trio.h b/ThirdParty/libxml2/vtklibxml2/trio.h deleted file mode 100644 index bcbd0aac338..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/trio.h +++ /dev/null @@ -1,216 +0,0 @@ -/************************************************************************* - * - * Id: trio.h 1886 2003-04-03 15:28:28Z veillard - * - * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************* - * - * http://ctrio.sourceforge.net/ - * - ************************************************************************/ - -#ifndef TRIO_TRIO_H -#define TRIO_TRIO_H - -#if !defined(WITHOUT_TRIO) - -/* - * Use autoconf defines if present. Packages using trio must define - * HAVE_CONFIG_H as a compiler option themselves. - */ -#if defined(HAVE_CONFIG_H) -# include <config.h> -#endif - -#include "triodef.h" - -#include <stdio.h> -#include <stdlib.h> -#if defined(TRIO_COMPILER_ANCIENT) -# include <varargs.h> -#else -# include <stdarg.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Error codes. - * - * Remember to add a textual description to trio_strerror. - */ -enum { - TRIO_EOF = 1, - TRIO_EINVAL = 2, - TRIO_ETOOMANY = 3, - TRIO_EDBLREF = 4, - TRIO_EGAP = 5, - TRIO_ENOMEM = 6, - TRIO_ERANGE = 7, - TRIO_ERRNO = 8, - TRIO_ECUSTOM = 9 -}; - -/* Error macros */ -#define TRIO_ERROR_CODE(x) ((-(x)) & 0x00FF) -#define TRIO_ERROR_POSITION(x) ((-(x)) >> 8) -#define TRIO_ERROR_NAME(x) trio_strerror(x) - -typedef int (*trio_outstream_t) TRIO_PROTO((trio_pointer_t, int)); -typedef int (*trio_instream_t) TRIO_PROTO((trio_pointer_t)); - -TRIO_CONST char *trio_strerror TRIO_PROTO((int)); - -/************************************************************************* - * Print Functions - */ - -int trio_printf TRIO_PROTO((TRIO_CONST char *format, ...)); -int trio_vprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); -int trio_printfv TRIO_PROTO((TRIO_CONST char *format, void **args)); - -int trio_fprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); -int trio_vfprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); -int trio_fprintfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); - -int trio_dprintf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); -int trio_vdprintf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); -int trio_dprintfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); - -int trio_cprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, - TRIO_CONST char *format, ...)); -int trio_vcprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, - TRIO_CONST char *format, va_list args)); -int trio_cprintfv TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, - TRIO_CONST char *format, void **args)); - -int trio_sprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, ...)); -int trio_vsprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, va_list args)); -int trio_sprintfv TRIO_PROTO((char *buffer, TRIO_CONST char *format, void **args)); - -int trio_snprintf TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); -int trio_vsnprintf TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, - va_list args)); -int trio_snprintfv TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, - void **args)); - -int trio_snprintfcat TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); -int trio_vsnprintfcat TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, - va_list args)); - -char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...)); -char *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); - -int trio_asprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, ...)); -int trio_vasprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, va_list args)); - -/************************************************************************* - * Scan Functions - */ -int trio_scanf TRIO_PROTO((TRIO_CONST char *format, ...)); -int trio_vscanf TRIO_PROTO((TRIO_CONST char *format, va_list args)); -int trio_scanfv TRIO_PROTO((TRIO_CONST char *format, void **args)); - -int trio_fscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); -int trio_vfscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); -int trio_fscanfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); - -int trio_dscanf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); -int trio_vdscanf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); -int trio_dscanfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); - -int trio_cscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, - TRIO_CONST char *format, ...)); -int trio_vcscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, - TRIO_CONST char *format, va_list args)); -int trio_cscanfv TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, - TRIO_CONST char *format, void **args)); - -int trio_sscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, ...)); -int trio_vsscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, va_list args)); -int trio_sscanfv TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, void **args)); - -/************************************************************************* - * Locale Functions - */ -void trio_locale_set_decimal_point TRIO_PROTO((char *decimalPoint)); -void trio_locale_set_thousand_separator TRIO_PROTO((char *thousandSeparator)); -void trio_locale_set_grouping TRIO_PROTO((char *grouping)); - -/************************************************************************* - * Renaming - */ -#ifdef TRIO_REPLACE_STDIO -/* Replace the <stdio.h> functions */ -#ifndef HAVE_PRINTF -# define printf trio_printf -#endif -#ifndef HAVE_VPRINTF -# define vprintf trio_vprintf -#endif -#ifndef HAVE_FPRINTF -# define fprintf trio_fprintf -#endif -#ifndef HAVE_VFPRINTF -# define vfprintf trio_vfprintf -#endif -#ifndef HAVE_SPRINTF -# define sprintf trio_sprintf -#endif -#ifndef HAVE_VSPRINTF -# define vsprintf trio_vsprintf -#endif -#ifndef HAVE_SNPRINTF -# define snprintf trio_snprintf -#endif -#ifndef HAVE_VSNPRINTF -# define vsnprintf trio_vsnprintf -#endif -#ifndef HAVE_SCANF -# define scanf trio_scanf -#endif -#ifndef HAVE_VSCANF -# define vscanf trio_vscanf -#endif -#ifndef HAVE_FSCANF -# define fscanf trio_fscanf -#endif -#ifndef HAVE_VFSCANF -# define vfscanf trio_vfscanf -#endif -#ifndef HAVE_SSCANF -# define sscanf trio_sscanf -#endif -#ifndef HAVE_VSSCANF -# define vsscanf trio_vsscanf -#endif -/* These aren't stdio functions, but we make them look similar */ -#define dprintf trio_dprintf -#define vdprintf trio_vdprintf -#define aprintf trio_aprintf -#define vaprintf trio_vaprintf -#define asprintf trio_asprintf -#define vasprintf trio_vasprintf -#define dscanf trio_dscanf -#define vdscanf trio_vdscanf -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* WITHOUT_TRIO */ - -#endif /* TRIO_TRIO_H */ diff --git a/ThirdParty/libxml2/vtklibxml2/triodef.h b/ThirdParty/libxml2/vtklibxml2/triodef.h deleted file mode 100644 index 0f39e7b257b..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/triodef.h +++ /dev/null @@ -1,222 +0,0 @@ -/************************************************************************* - * - * Id: triodef.h 3473 2006-05-31 13:35:28Z veillard - * - * Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************/ - -#ifndef TRIO_TRIODEF_H -#define TRIO_TRIODEF_H - -/************************************************************************* - * Platform and compiler support detection - */ -#if defined(__GNUC__) -# define TRIO_COMPILER_GCC -#elif defined(__SUNPRO_C) -# define TRIO_COMPILER_SUNPRO -#elif defined(__SUNPRO_CC) -# define TRIO_COMPILER_SUNPRO -# define __SUNPRO_C __SUNPRO_CC -#elif defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__) -# define TRIO_COMPILER_XLC -#elif defined(_AIX) && !defined(__GNUC__) -# define TRIO_COMPILER_XLC /* Workaround for old xlc */ -#elif defined(__DECC) || defined(__DECCXX) -# define TRIO_COMPILER_DECC -#elif defined(__osf__) && defined(__LANGUAGE_C__) -# define TRIO_COMPILER_DECC /* Workaround for old DEC C compilers */ -#elif defined(_MSC_VER) -# define TRIO_COMPILER_MSVC -#elif defined(__BORLANDC__) -# define TRIO_COMPILER_BCB -#endif - -#if defined(VMS) || defined(__VMS) -/* - * VMS is placed first to avoid identifying the platform as Unix - * based on the DECC compiler later on. - */ -# define TRIO_PLATFORM_VMS -#elif defined(unix) || defined(__unix) || defined(__unix__) -# define TRIO_PLATFORM_UNIX -#elif defined(TRIO_COMPILER_XLC) || defined(_AIX) -# define TRIO_PLATFORM_UNIX -#elif defined(TRIO_COMPILER_DECC) || defined(__osf___) -# define TRIO_PLATFORM_UNIX -#elif defined(__NetBSD__) -# define TRIO_PLATFORM_UNIX -#elif defined(__Lynx__) -# define TRIO_PLATFORM_UNIX -#elif defined(__QNX__) -# define TRIO_PLATFORM_UNIX -# define TRIO_PLATFORM_QNX -#elif defined(__CYGWIN__) -# define TRIO_PLATFORM_UNIX -#elif defined(AMIGA) && defined(TRIO_COMPILER_GCC) -# define TRIO_PLATFORM_UNIX -#elif defined(TRIO_COMPILER_MSVC) || defined(WIN32) || defined(_WIN32) -# define TRIO_PLATFORM_WIN32 -#elif defined(mpeix) || defined(__mpexl) -# define TRIO_PLATFORM_MPEIX -#endif - -#if defined(_AIX) -# define TRIO_PLATFORM_AIX -#elif defined(__hpux) -# define TRIO_PLATFORM_HPUX -#elif defined(sun) || defined(__sun__) -# if defined(__SVR4) || defined(__svr4__) -# define TRIO_PLATFORM_SOLARIS -# else -# define TRIO_PLATFORM_SUNOS -# endif -#endif - -#if defined(__STDC__) || defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) -# define TRIO_COMPILER_SUPPORTS_C89 -# if defined(__STDC_VERSION__) -# define TRIO_COMPILER_SUPPORTS_C90 -# if (__STDC_VERSION__ >= 199409L) -# define TRIO_COMPILER_SUPPORTS_C94 -# endif -# if (__STDC_VERSION__ >= 199901L) -# define TRIO_COMPILER_SUPPORTS_C99 -# endif -# elif defined(TRIO_COMPILER_SUNPRO) -# if (__SUNPRO_C >= 0x420) -# define TRIO_COMPILER_SUPPORTS_C94 -# endif -# endif -#endif - -#if defined(_XOPEN_SOURCE) -# if defined(_XOPEN_SOURCE_EXTENDED) -# define TRIO_COMPILER_SUPPORTS_UNIX95 -# endif -# if (_XOPEN_VERSION >= 500) -# define TRIO_COMPILER_SUPPORTS_UNIX98 -# endif -# if (_XOPEN_VERSION >= 600) -# define TRIO_COMPILER_SUPPORTS_UNIX01 -# endif -#endif - -/************************************************************************* - * Generic defines - */ - -#if !defined(TRIO_PUBLIC) -# define TRIO_PUBLIC -#endif -#if !defined(TRIO_PRIVATE) -# define TRIO_PRIVATE static -#endif - -#if !(defined(TRIO_COMPILER_SUPPORTS_C89) || defined(__cplusplus)) -# define TRIO_COMPILER_ANCIENT -#endif - -#if defined(TRIO_COMPILER_ANCIENT) -# define TRIO_CONST -# define TRIO_VOLATILE -# define TRIO_SIGNED -typedef double trio_long_double_t; -typedef char * trio_pointer_t; -# define TRIO_SUFFIX_LONG(x) x -# define TRIO_PROTO(x) () -# define TRIO_NOARGS -# define TRIO_ARGS1(list,a1) list a1; -# define TRIO_ARGS2(list,a1,a2) list a1; a2; -# define TRIO_ARGS3(list,a1,a2,a3) list a1; a2; a3; -# define TRIO_ARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4; -# define TRIO_ARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5; -# define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) list a1; a2; a3; a4; a5; a6; -# define TRIO_VARGS2(list,a1,a2) list a1; a2 -# define TRIO_VARGS3(list,a1,a2,a3) list a1; a2; a3 -# define TRIO_VARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4 -# define TRIO_VARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5 -# define TRIO_VA_DECL va_dcl -# define TRIO_VA_START(x,y) va_start(x) -# define TRIO_VA_END(x) va_end(x) -#else /* ANSI C */ -# define TRIO_CONST const -# define TRIO_VOLATILE volatile -# define TRIO_SIGNED signed -typedef long double trio_long_double_t; -typedef void * trio_pointer_t; -# define TRIO_SUFFIX_LONG(x) x ## L -# define TRIO_PROTO(x) x -# define TRIO_NOARGS void -# define TRIO_ARGS1(list,a1) (a1) -# define TRIO_ARGS2(list,a1,a2) (a1,a2) -# define TRIO_ARGS3(list,a1,a2,a3) (a1,a2,a3) -# define TRIO_ARGS4(list,a1,a2,a3,a4) (a1,a2,a3,a4) -# define TRIO_ARGS5(list,a1,a2,a3,a4,a5) (a1,a2,a3,a4,a5) -# define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) (a1,a2,a3,a4,a5,a6) -# define TRIO_VARGS2 TRIO_ARGS2 -# define TRIO_VARGS3 TRIO_ARGS3 -# define TRIO_VARGS4 TRIO_ARGS4 -# define TRIO_VARGS5 TRIO_ARGS5 -# define TRIO_VA_DECL ... -# define TRIO_VA_START(x,y) va_start(x,y) -# define TRIO_VA_END(x) va_end(x) -#endif - -#if defined(TRIO_COMPILER_SUPPORTS_C99) || defined(__cplusplus) -# define TRIO_INLINE inline -#elif defined(TRIO_COMPILER_GCC) -# define TRIO_INLINE __inline__ -#elif defined(TRIO_COMPILER_MSVC) -# define TRIO_INLINE _inline -#elif defined(TRIO_COMPILER_BCB) -# define TRIO_INLINE __inline -#else -# define TRIO_INLINE -#endif - -/************************************************************************* - * Workarounds - */ - -#if defined(TRIO_PLATFORM_VMS) -/* - * Computations done with constants at compile time can trigger these - * even when compiling with IEEE enabled. - */ -# pragma message disable (UNDERFLOW, FLOATOVERFL) - -# if (__CRTL_VER < 80000000) -/* - * Although the compiler supports C99 language constructs, the C - * run-time library does not contain all C99 functions. - * - * This was the case for 70300022. Update the 80000000 value when - * it has been accurately determined what version of the library - * supports C99. - */ -# if defined(TRIO_COMPILER_SUPPORTS_C99) -# undef TRIO_COMPILER_SUPPORTS_C99 -# endif -# endif -#endif - -/* - * Not all preprocessors supports the LL token. - */ -#if defined(TRIO_COMPILER_BCB) -#else -# define TRIO_COMPILER_SUPPORTS_LL -#endif - -#endif /* TRIO_TRIODEF_H */ diff --git a/ThirdParty/libxml2/vtklibxml2/trionan.c b/ThirdParty/libxml2/vtklibxml2/trionan.c deleted file mode 100644 index 9f0a6064606..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/trionan.c +++ /dev/null @@ -1,915 +0,0 @@ -/************************************************************************* - * - * Id - * - * Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************ - * - * Functions to handle special quantities in floating-point numbers - * (that is, NaNs and infinity). They provide the capability to detect - * and fabricate special quantities. - * - * Although written to be as portable as possible, it can never be - * guaranteed to work on all platforms, as not all hardware supports - * special quantities. - * - * The approach used here (approximately) is to: - * - * 1. Use C99 functionality when available. - * 2. Use IEEE 754 bit-patterns if possible. - * 3. Use platform-specific techniques. - * - ************************************************************************/ - -/* - * TODO: - * o Put all the magic into trio_fpclassify_and_signbit(), and use this from - * trio_isnan() etc. - */ - -/************************************************************************* - * Include files - */ -#include "triodef.h" -#include "trionan.h" - -#include <math.h> -#include <string.h> -#include <limits.h> -#include <float.h> -#if defined(TRIO_PLATFORM_UNIX) -# include <signal.h> -#endif -#if defined(TRIO_COMPILER_DECC) -# if defined(__linux__) -# include <cpml.h> -# else -# include <fp_class.h> -# endif -#endif -#include <assert.h> - -#if defined(TRIO_DOCUMENTATION) -# include "doc/doc_nan.h" -#endif -/** @addtogroup SpecialQuantities - @{ -*/ - -/************************************************************************* - * Definitions - */ - -#define TRIO_TRUE (1 == 1) -#define TRIO_FALSE (0 == 1) - -/* - * We must enable IEEE floating-point on Alpha - */ -#if defined(__alpha) && !defined(_IEEE_FP) -# if defined(TRIO_COMPILER_DECC) -# if defined(TRIO_PLATFORM_VMS) -# error "Must be compiled with option /IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE" -# else -# if !defined(_CFE) -# error "Must be compiled with option -ieee" -# endif -# endif -# elif defined(TRIO_COMPILER_GCC) && (defined(__osf__) || defined(__linux__)) -# error "Must be compiled with option -mieee" -# endif -#endif /* __alpha && ! _IEEE_FP */ - -/* - * In ANSI/IEEE 754-1985 64-bits double format numbers have the - * following properties (amoungst others) - * - * o FLT_RADIX == 2: binary encoding - * o DBL_MAX_EXP == 1024: 11 bits exponent, where one bit is used - * to indicate special numbers (e.g. NaN and Infinity), so the - * maximum exponent is 10 bits wide (2^10 == 1024). - * o DBL_MANT_DIG == 53: The mantissa is 52 bits wide, but because - * numbers are normalized the initial binary 1 is represented - * implicitly (the so-called "hidden bit"), which leaves us with - * the ability to represent 53 bits wide mantissa. - */ -#if (FLT_RADIX == 2) && (DBL_MAX_EXP == 1024) && (DBL_MANT_DIG == 53) -# define USE_IEEE_754 -#endif - - -/************************************************************************* - * Constants - */ - -static TRIO_CONST char rcsid[] = "@(#)Id"; - -#if defined(USE_IEEE_754) - -/* - * Endian-agnostic indexing macro. - * - * The value of internalEndianMagic, when converted into a 64-bit - * integer, becomes 0x0706050403020100 (we could have used a 64-bit - * integer value instead of a double, but not all platforms supports - * that type). The value is automatically encoded with the correct - * endianess by the compiler, which means that we can support any - * kind of endianess. The individual bytes are then used as an index - * for the IEEE 754 bit-patterns and masks. - */ -#define TRIO_DOUBLE_INDEX(x) (((unsigned char *)&internalEndianMagic)[7-(x)]) - -static TRIO_CONST double internalEndianMagic = 7.949928895127363e-275; - -/* Mask for the exponent */ -static TRIO_CONST unsigned char ieee_754_exponent_mask[] = { - 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -/* Mask for the mantissa */ -static TRIO_CONST unsigned char ieee_754_mantissa_mask[] = { - 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -/* Mask for the sign bit */ -static TRIO_CONST unsigned char ieee_754_sign_mask[] = { - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -/* Bit-pattern for negative zero */ -static TRIO_CONST unsigned char ieee_754_negzero_array[] = { - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -/* Bit-pattern for infinity */ -static TRIO_CONST unsigned char ieee_754_infinity_array[] = { - 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -/* Bit-pattern for quiet NaN */ -static TRIO_CONST unsigned char ieee_754_qnan_array[] = { - 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - - -/************************************************************************* - * Functions - */ - -/* - * trio_make_double - */ -TRIO_PRIVATE double -trio_make_double -TRIO_ARGS1((values), - TRIO_CONST unsigned char *values) -{ - TRIO_VOLATILE double result; - int i; - - for (i = 0; i < (int)sizeof(double); i++) { - ((TRIO_VOLATILE unsigned char *)&result)[TRIO_DOUBLE_INDEX(i)] = values[i]; - } - return result; -} - -/* - * trio_is_special_quantity - */ -TRIO_PRIVATE int -trio_is_special_quantity -TRIO_ARGS2((number, has_mantissa), - double number, - int *has_mantissa) -{ - unsigned int i; - unsigned char current; - int is_special_quantity = TRIO_TRUE; - - *has_mantissa = 0; - - for (i = 0; i < (unsigned int)sizeof(double); i++) { - current = ((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)]; - is_special_quantity - &= ((current & ieee_754_exponent_mask[i]) == ieee_754_exponent_mask[i]); - *has_mantissa |= (current & ieee_754_mantissa_mask[i]); - } - return is_special_quantity; -} - -/* - * trio_is_negative - */ -TRIO_PRIVATE int -trio_is_negative -TRIO_ARGS1((number), - double number) -{ - unsigned int i; - int is_negative = TRIO_FALSE; - - for (i = 0; i < (unsigned int)sizeof(double); i++) { - is_negative |= (((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)] - & ieee_754_sign_mask[i]); - } - return is_negative; -} - -#endif /* USE_IEEE_754 */ - - -/** - Generate negative zero. - - @return Floating-point representation of negative zero. -*/ -TRIO_PUBLIC double -trio_nzero(TRIO_NOARGS) -{ -#if defined(USE_IEEE_754) - return trio_make_double(ieee_754_negzero_array); -#else - TRIO_VOLATILE double zero = 0.0; - - return -zero; -#endif -} - -/** - Generate positive infinity. - - @return Floating-point representation of positive infinity. -*/ -TRIO_PUBLIC double -trio_pinf(TRIO_NOARGS) -{ - /* Cache the result */ - static double result = 0.0; - - if (result == 0.0) { - -#if defined(INFINITY) && defined(__STDC_IEC_559__) - result = (double)INFINITY; - -#elif defined(USE_IEEE_754) - result = trio_make_double(ieee_754_infinity_array); - -#else - /* - * If HUGE_VAL is different from DBL_MAX, then HUGE_VAL is used - * as infinity. Otherwise we have to resort to an overflow - * operation to generate infinity. - */ -# if defined(TRIO_PLATFORM_UNIX) - void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); -# endif - - result = HUGE_VAL; - if (HUGE_VAL == DBL_MAX) { - /* Force overflow */ - result += HUGE_VAL; - } - -# if defined(TRIO_PLATFORM_UNIX) - signal(SIGFPE, signal_handler); -# endif - -#endif - } - return result; -} - -/** - Generate negative infinity. - - @return Floating-point value of negative infinity. -*/ -TRIO_PUBLIC double -trio_ninf(TRIO_NOARGS) -{ - static double result = 0.0; - - if (result == 0.0) { - /* - * Negative infinity is calculated by negating positive infinity, - * which can be done because it is legal to do calculations on - * infinity (for example, 1 / infinity == 0). - */ - result = -trio_pinf(); - } - return result; -} - -/** - Generate NaN. - - @return Floating-point representation of NaN. -*/ -TRIO_PUBLIC double -trio_nan(TRIO_NOARGS) -{ - /* Cache the result */ - static double result = 0.0; - - if (result == 0.0) { - -#if defined(TRIO_COMPILER_SUPPORTS_C99) - result = nan(""); - -#elif defined(NAN) && defined(__STDC_IEC_559__) - result = (double)NAN; - -#elif defined(USE_IEEE_754) - result = trio_make_double(ieee_754_qnan_array); - -#else - /* - * There are several ways to generate NaN. The one used here is - * to divide infinity by infinity. I would have preferred to add - * negative infinity to positive infinity, but that yields wrong - * result (infinity) on FreeBSD. - * - * This may fail if the hardware does not support NaN, or if - * the Invalid Operation floating-point exception is unmasked. - */ -# if defined(TRIO_PLATFORM_UNIX) - void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); -# endif - - result = trio_pinf() / trio_pinf(); - -# if defined(TRIO_PLATFORM_UNIX) - signal(SIGFPE, signal_handler); -# endif - -#endif - } - return result; -} - -/** - Check for NaN. - - @param number An arbitrary floating-point number. - @return Boolean value indicating whether or not the number is a NaN. -*/ -TRIO_PUBLIC int -trio_isnan -TRIO_ARGS1((number), - double number) -{ -#if (defined(TRIO_COMPILER_SUPPORTS_C99) && defined(isnan)) \ - || defined(TRIO_COMPILER_SUPPORTS_UNIX95) - /* - * C99 defines isnan() as a macro. UNIX95 defines isnan() as a - * function. This function was already present in XPG4, but this - * is a bit tricky to detect with compiler defines, so we choose - * the conservative approach and only use it for UNIX95. - */ - return isnan(number); - -#elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) - /* - * Microsoft Visual C++ and Borland C++ Builder have an _isnan() - * function. - */ - return _isnan(number) ? TRIO_TRUE : TRIO_FALSE; - -#elif defined(USE_IEEE_754) - /* - * Examine IEEE 754 bit-pattern. A NaN must have a special exponent - * pattern, and a non-empty mantissa. - */ - int has_mantissa; - int is_special_quantity; - - is_special_quantity = trio_is_special_quantity(number, &has_mantissa); - - return (is_special_quantity && has_mantissa); - -#else - /* - * Fallback solution - */ - int status; - double integral, fraction; - -# if defined(TRIO_PLATFORM_UNIX) - void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); -# endif - - status = (/* - * NaN is the only number which does not compare to itself - */ - ((TRIO_VOLATILE double)number != (TRIO_VOLATILE double)number) || - /* - * Fallback solution if NaN compares to NaN - */ - ((number != 0.0) && - (fraction = modf(number, &integral), - integral == fraction))); - -# if defined(TRIO_PLATFORM_UNIX) - signal(SIGFPE, signal_handler); -# endif - - return status; - -#endif -} - -/** - Check for infinity. - - @param number An arbitrary floating-point number. - @return 1 if positive infinity, -1 if negative infinity, 0 otherwise. -*/ -TRIO_PUBLIC int -trio_isinf -TRIO_ARGS1((number), - double number) -{ -#if defined(TRIO_COMPILER_DECC) && !defined(__linux__) - /* - * DECC has an isinf() macro, but it works differently than that - * of C99, so we use the fp_class() function instead. - */ - return ((fp_class(number) == FP_POS_INF) - ? 1 - : ((fp_class(number) == FP_NEG_INF) ? -1 : 0)); - -#elif defined(isinf) - /* - * C99 defines isinf() as a macro. - */ - return isinf(number) - ? ((number > 0.0) ? 1 : -1) - : 0; - -#elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) - /* - * Microsoft Visual C++ and Borland C++ Builder have an _fpclass() - * function that can be used to detect infinity. - */ - return ((_fpclass(number) == _FPCLASS_PINF) - ? 1 - : ((_fpclass(number) == _FPCLASS_NINF) ? -1 : 0)); - -#elif defined(USE_IEEE_754) - /* - * Examine IEEE 754 bit-pattern. Infinity must have a special exponent - * pattern, and an empty mantissa. - */ - int has_mantissa; - int is_special_quantity; - - is_special_quantity = trio_is_special_quantity(number, &has_mantissa); - - return (is_special_quantity && !has_mantissa) - ? ((number < 0.0) ? -1 : 1) - : 0; - -#else - /* - * Fallback solution. - */ - int status; - -# if defined(TRIO_PLATFORM_UNIX) - void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); -# endif - - double infinity = trio_pinf(); - - status = ((number == infinity) - ? 1 - : ((number == -infinity) ? -1 : 0)); - -# if defined(TRIO_PLATFORM_UNIX) - signal(SIGFPE, signal_handler); -# endif - - return status; - -#endif -} - -#if 0 - /* Temporary fix - this routine is not used anywhere */ -/** - Check for finity. - - @param number An arbitrary floating-point number. - @return Boolean value indicating whether or not the number is a finite. -*/ -TRIO_PUBLIC int -trio_isfinite -TRIO_ARGS1((number), - double number) -{ -#if defined(TRIO_COMPILER_SUPPORTS_C99) && defined(isfinite) - /* - * C99 defines isfinite() as a macro. - */ - return isfinite(number); - -#elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) - /* - * Microsoft Visual C++ and Borland C++ Builder use _finite(). - */ - return _finite(number); - -#elif defined(USE_IEEE_754) - /* - * Examine IEEE 754 bit-pattern. For finity we do not care about the - * mantissa. - */ - int dummy; - - return (! trio_is_special_quantity(number, &dummy)); - -#else - /* - * Fallback solution. - */ - return ((trio_isinf(number) == 0) && (trio_isnan(number) == 0)); - -#endif -} - -#endif - -/* - * The sign of NaN is always false - */ -TRIO_PUBLIC int -trio_fpclassify_and_signbit -TRIO_ARGS2((number, is_negative), - double number, - int *is_negative) -{ - /* avoid static function not used not used warning */ - (void)trio_is_negative; - (void)trio_is_special_quantity; -{ -#if defined(fpclassify) && defined(signbit) - /* - * C99 defines fpclassify() and signbit() as a macros - */ - *is_negative = signbit(number); - switch (fpclassify(number)) { - case FP_NAN: - return TRIO_FP_NAN; - case FP_INFINITE: - return TRIO_FP_INFINITE; - case FP_SUBNORMAL: - return TRIO_FP_SUBNORMAL; - case FP_ZERO: - return TRIO_FP_ZERO; - default: - return TRIO_FP_NORMAL; - } - -#else -# if defined(TRIO_COMPILER_DECC) - /* - * DECC has an fp_class() function. - */ -# define TRIO_FPCLASSIFY(n) fp_class(n) -# define TRIO_QUIET_NAN FP_QNAN -# define TRIO_SIGNALLING_NAN FP_SNAN -# define TRIO_POSITIVE_INFINITY FP_POS_INF -# define TRIO_NEGATIVE_INFINITY FP_NEG_INF -# define TRIO_POSITIVE_SUBNORMAL FP_POS_DENORM -# define TRIO_NEGATIVE_SUBNORMAL FP_NEG_DENORM -# define TRIO_POSITIVE_ZERO FP_POS_ZERO -# define TRIO_NEGATIVE_ZERO FP_NEG_ZERO -# define TRIO_POSITIVE_NORMAL FP_POS_NORM -# define TRIO_NEGATIVE_NORMAL FP_NEG_NORM - -# elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) - /* - * Microsoft Visual C++ and Borland C++ Builder have an _fpclass() - * function. - */ -# define TRIO_FPCLASSIFY(n) _fpclass(n) -# define TRIO_QUIET_NAN _FPCLASS_QNAN -# define TRIO_SIGNALLING_NAN _FPCLASS_SNAN -# define TRIO_POSITIVE_INFINITY _FPCLASS_PINF -# define TRIO_NEGATIVE_INFINITY _FPCLASS_NINF -# define TRIO_POSITIVE_SUBNORMAL _FPCLASS_PD -# define TRIO_NEGATIVE_SUBNORMAL _FPCLASS_ND -# define TRIO_POSITIVE_ZERO _FPCLASS_PZ -# define TRIO_NEGATIVE_ZERO _FPCLASS_NZ -# define TRIO_POSITIVE_NORMAL _FPCLASS_PN -# define TRIO_NEGATIVE_NORMAL _FPCLASS_NN - -# elif defined(FP_PLUS_NORM) - /* - * HP-UX 9.x and 10.x have an fpclassify() function, that is different - * from the C99 fpclassify() macro supported on HP-UX 11.x. - * - * AIX has class() for C, and _class() for C++, which returns the - * same values as the HP-UX fpclassify() function. - */ -# if defined(TRIO_PLATFORM_AIX) -# if defined(__cplusplus) -# define TRIO_FPCLASSIFY(n) _class(n) -# else -# define TRIO_FPCLASSIFY(n) class(n) -# endif -# else -# define TRIO_FPCLASSIFY(n) fpclassify(n) -# endif -# define TRIO_QUIET_NAN FP_QNAN -# define TRIO_SIGNALLING_NAN FP_SNAN -# define TRIO_POSITIVE_INFINITY FP_PLUS_INF -# define TRIO_NEGATIVE_INFINITY FP_MINUS_INF -# define TRIO_POSITIVE_SUBNORMAL FP_PLUS_DENORM -# define TRIO_NEGATIVE_SUBNORMAL FP_MINUS_DENORM -# define TRIO_POSITIVE_ZERO FP_PLUS_ZERO -# define TRIO_NEGATIVE_ZERO FP_MINUS_ZERO -# define TRIO_POSITIVE_NORMAL FP_PLUS_NORM -# define TRIO_NEGATIVE_NORMAL FP_MINUS_NORM -# endif - -# if defined(TRIO_FPCLASSIFY) - switch (TRIO_FPCLASSIFY(number)) { - case TRIO_QUIET_NAN: - case TRIO_SIGNALLING_NAN: - *is_negative = TRIO_FALSE; /* NaN has no sign */ - return TRIO_FP_NAN; - case TRIO_POSITIVE_INFINITY: - *is_negative = TRIO_FALSE; - return TRIO_FP_INFINITE; - case TRIO_NEGATIVE_INFINITY: - *is_negative = TRIO_TRUE; - return TRIO_FP_INFINITE; - case TRIO_POSITIVE_SUBNORMAL: - *is_negative = TRIO_FALSE; - return TRIO_FP_SUBNORMAL; - case TRIO_NEGATIVE_SUBNORMAL: - *is_negative = TRIO_TRUE; - return TRIO_FP_SUBNORMAL; - case TRIO_POSITIVE_ZERO: - *is_negative = TRIO_FALSE; - return TRIO_FP_ZERO; - case TRIO_NEGATIVE_ZERO: - *is_negative = TRIO_TRUE; - return TRIO_FP_ZERO; - case TRIO_POSITIVE_NORMAL: - *is_negative = TRIO_FALSE; - return TRIO_FP_NORMAL; - case TRIO_NEGATIVE_NORMAL: - *is_negative = TRIO_TRUE; - return TRIO_FP_NORMAL; - default: - /* Just in case... */ - *is_negative = (number < 0.0); - return TRIO_FP_NORMAL; - } - -# else - /* - * Fallback solution. - */ - int rc; - - if (number == 0.0) { - /* - * In IEEE 754 the sign of zero is ignored in comparisons, so we - * have to handle this as a special case by examining the sign bit - * directly. - */ -# if defined(USE_IEEE_754) - *is_negative = trio_is_negative(number); -# else - *is_negative = TRIO_FALSE; /* FIXME */ -# endif - return TRIO_FP_ZERO; - } - if (trio_isnan(number)) { - *is_negative = TRIO_FALSE; - return TRIO_FP_NAN; - } - if ((rc = trio_isinf(number))) { - *is_negative = (rc == -1); - return TRIO_FP_INFINITE; - } - if ((number > 0.0) && (number < DBL_MIN)) { - *is_negative = TRIO_FALSE; - return TRIO_FP_SUBNORMAL; - } - if ((number < 0.0) && (number > -DBL_MIN)) { - *is_negative = TRIO_TRUE; - return TRIO_FP_SUBNORMAL; - } - *is_negative = (number < 0.0); - return TRIO_FP_NORMAL; - -# endif -#endif -} -} - -/** - Examine the sign of a number. - - @param number An arbitrary floating-point number. - @return Boolean value indicating whether or not the number has the - sign bit set (i.e. is negative). -*/ -TRIO_PUBLIC int -trio_signbit -TRIO_ARGS1((number), - double number) -{ - int is_negative; - - (void)trio_fpclassify_and_signbit(number, &is_negative); - return is_negative; -} - -#if 0 - /* Temporary fix - this routine is not used in libxml */ -/** - Examine the class of a number. - - @param number An arbitrary floating-point number. - @return Enumerable value indicating the class of @p number -*/ -TRIO_PUBLIC int -trio_fpclassify -TRIO_ARGS1((number), - double number) -{ - int dummy; - - return trio_fpclassify_and_signbit(number, &dummy); -} - -#endif - -/** @} SpecialQuantities */ - -/************************************************************************* - * For test purposes. - * - * Add the following compiler option to include this test code. - * - * Unix : -DSTANDALONE - * VMS : /DEFINE=(STANDALONE) - */ -#if defined(STANDALONE) -# include <stdio.h> - -static TRIO_CONST char * -getClassification -TRIO_ARGS1((type), - int type) -{ - switch (type) { - case TRIO_FP_INFINITE: - return "FP_INFINITE"; - case TRIO_FP_NAN: - return "FP_NAN"; - case TRIO_FP_NORMAL: - return "FP_NORMAL"; - case TRIO_FP_SUBNORMAL: - return "FP_SUBNORMAL"; - case TRIO_FP_ZERO: - return "FP_ZERO"; - default: - return "FP_UNKNOWN"; - } -} - -static void -print_class -TRIO_ARGS2((prefix, number), - TRIO_CONST char *prefix, - double number) -{ - printf("%-6s: %s %-15s %g\n", - prefix, - trio_signbit(number) ? "-" : "+", - getClassification(TRIO_FPCLASSIFY(number)), - number); -} - -int main(TRIO_NOARGS) -{ - double my_nan; - double my_pinf; - double my_ninf; -# if defined(TRIO_PLATFORM_UNIX) - void (*signal_handler) TRIO_PROTO((int)); -# endif - - my_nan = trio_nan(); - my_pinf = trio_pinf(); - my_ninf = trio_ninf(); - - print_class("Nan", my_nan); - print_class("PInf", my_pinf); - print_class("NInf", my_ninf); - print_class("PZero", 0.0); - print_class("NZero", -0.0); - print_class("PNorm", 1.0); - print_class("NNorm", -1.0); - print_class("PSub", 1.01e-307 - 1.00e-307); - print_class("NSub", 1.00e-307 - 1.01e-307); - - printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", - my_nan, - ((unsigned char *)&my_nan)[0], - ((unsigned char *)&my_nan)[1], - ((unsigned char *)&my_nan)[2], - ((unsigned char *)&my_nan)[3], - ((unsigned char *)&my_nan)[4], - ((unsigned char *)&my_nan)[5], - ((unsigned char *)&my_nan)[6], - ((unsigned char *)&my_nan)[7], - trio_isnan(my_nan), trio_isinf(my_nan)); - printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", - my_pinf, - ((unsigned char *)&my_pinf)[0], - ((unsigned char *)&my_pinf)[1], - ((unsigned char *)&my_pinf)[2], - ((unsigned char *)&my_pinf)[3], - ((unsigned char *)&my_pinf)[4], - ((unsigned char *)&my_pinf)[5], - ((unsigned char *)&my_pinf)[6], - ((unsigned char *)&my_pinf)[7], - trio_isnan(my_pinf), trio_isinf(my_pinf)); - printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", - my_ninf, - ((unsigned char *)&my_ninf)[0], - ((unsigned char *)&my_ninf)[1], - ((unsigned char *)&my_ninf)[2], - ((unsigned char *)&my_ninf)[3], - ((unsigned char *)&my_ninf)[4], - ((unsigned char *)&my_ninf)[5], - ((unsigned char *)&my_ninf)[6], - ((unsigned char *)&my_ninf)[7], - trio_isnan(my_ninf), trio_isinf(my_ninf)); - -# if defined(TRIO_PLATFORM_UNIX) - signal_handler = signal(SIGFPE, SIG_IGN); -# endif - - my_pinf = DBL_MAX + DBL_MAX; - my_ninf = -my_pinf; - my_nan = my_pinf / my_pinf; - -# if defined(TRIO_PLATFORM_UNIX) - signal(SIGFPE, signal_handler); -# endif - - printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", - my_nan, - ((unsigned char *)&my_nan)[0], - ((unsigned char *)&my_nan)[1], - ((unsigned char *)&my_nan)[2], - ((unsigned char *)&my_nan)[3], - ((unsigned char *)&my_nan)[4], - ((unsigned char *)&my_nan)[5], - ((unsigned char *)&my_nan)[6], - ((unsigned char *)&my_nan)[7], - trio_isnan(my_nan), trio_isinf(my_nan)); - printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", - my_pinf, - ((unsigned char *)&my_pinf)[0], - ((unsigned char *)&my_pinf)[1], - ((unsigned char *)&my_pinf)[2], - ((unsigned char *)&my_pinf)[3], - ((unsigned char *)&my_pinf)[4], - ((unsigned char *)&my_pinf)[5], - ((unsigned char *)&my_pinf)[6], - ((unsigned char *)&my_pinf)[7], - trio_isnan(my_pinf), trio_isinf(my_pinf)); - printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", - my_ninf, - ((unsigned char *)&my_ninf)[0], - ((unsigned char *)&my_ninf)[1], - ((unsigned char *)&my_ninf)[2], - ((unsigned char *)&my_ninf)[3], - ((unsigned char *)&my_ninf)[4], - ((unsigned char *)&my_ninf)[5], - ((unsigned char *)&my_ninf)[6], - ((unsigned char *)&my_ninf)[7], - trio_isnan(my_ninf), trio_isinf(my_ninf)); - - return 0; -} -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/trionan.h b/ThirdParty/libxml2/vtklibxml2/trionan.h deleted file mode 100644 index e37835892de..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/trionan.h +++ /dev/null @@ -1,84 +0,0 @@ -/************************************************************************* - * - * Id: trionan.h 2026 2003-08-06 04:43:55Z wbrack - * - * Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************/ - -#ifndef TRIO_NAN_H -#define TRIO_NAN_H - -#include "triodef.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - TRIO_FP_INFINITE, - TRIO_FP_NAN, - TRIO_FP_NORMAL, - TRIO_FP_SUBNORMAL, - TRIO_FP_ZERO -}; - -/* - * Return NaN (Not-a-Number). - */ -TRIO_PUBLIC double trio_nan TRIO_PROTO((void)); - -/* - * Return positive infinity. - */ -TRIO_PUBLIC double trio_pinf TRIO_PROTO((void)); - -/* - * Return negative infinity. - */ -TRIO_PUBLIC double trio_ninf TRIO_PROTO((void)); - -/* - * Return negative zero. - */ -TRIO_PUBLIC double trio_nzero TRIO_PROTO((TRIO_NOARGS)); - -/* - * If number is a NaN return non-zero, otherwise return zero. - */ -TRIO_PUBLIC int trio_isnan TRIO_PROTO((double number)); - -/* - * If number is positive infinity return 1, if number is negative - * infinity return -1, otherwise return 0. - */ -TRIO_PUBLIC int trio_isinf TRIO_PROTO((double number)); - -/* - * If number is finite return non-zero, otherwise return zero. - */ -#if 0 - /* Temporary fix - these 2 routines not used in libxml */ -TRIO_PUBLIC int trio_isfinite TRIO_PROTO((double number)); - -TRIO_PUBLIC int trio_fpclassify TRIO_PROTO((double number)); -#endif - -TRIO_PUBLIC int trio_signbit TRIO_PROTO((double number)); - -TRIO_PUBLIC int trio_fpclassify_and_signbit TRIO_PROTO((double number, int *is_negative)); - -#ifdef __cplusplus -} -#endif - -#endif /* TRIO_NAN_H */ diff --git a/ThirdParty/libxml2/vtklibxml2/triop.h b/ThirdParty/libxml2/vtklibxml2/triop.h deleted file mode 100644 index ab3481b641e..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/triop.h +++ /dev/null @@ -1,150 +0,0 @@ -/************************************************************************* - * - * Id: triop.h 1886 2003-04-03 15:28:28Z veillard - * - * Copyright (C) 2000 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************ - * - * Private functions, types, etc. used for callback functions. - * - * The ref pointer is an opaque type and should remain as such. - * Private data must only be accessible through the getter and - * setter functions. - * - ************************************************************************/ - -#ifndef TRIO_TRIOP_H -#define TRIO_TRIOP_H - -#include "triodef.h" - -#include <stdlib.h> -#if defined(TRIO_COMPILER_ANCIENT) -# include <varargs.h> -#else -# include <stdarg.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef TRIO_C99 -# define TRIO_C99 1 -#endif -#ifndef TRIO_BSD -# define TRIO_BSD 1 -#endif -#ifndef TRIO_GNU -# define TRIO_GNU 1 -#endif -#ifndef TRIO_MISC -# define TRIO_MISC 1 -#endif -#ifndef TRIO_UNIX98 -# define TRIO_UNIX98 1 -#endif -#ifndef TRIO_MICROSOFT -# define TRIO_MICROSOFT 1 -#endif -#ifndef TRIO_EXTENSION -# define TRIO_EXTENSION 1 -#endif -#ifndef TRIO_WIDECHAR /* Does not work yet. Do not enable */ -# define TRIO_WIDECHAR 0 -#endif -#ifndef TRIO_ERRORS -# define TRIO_ERRORS 1 -#endif - -#ifndef TRIO_MALLOC -# define TRIO_MALLOC(n) malloc(n) -#endif -#ifndef TRIO_REALLOC -# define TRIO_REALLOC(x,n) realloc((x),(n)) -#endif -#ifndef TRIO_FREE -# define TRIO_FREE(x) free(x) -#endif - - -/************************************************************************* - * User-defined specifiers - */ - -typedef int (*trio_callback_t) TRIO_PROTO((trio_pointer_t)); - -trio_pointer_t trio_register TRIO_PROTO((trio_callback_t callback, const char *name)); -void trio_unregister TRIO_PROTO((trio_pointer_t handle)); - -TRIO_CONST char *trio_get_format TRIO_PROTO((trio_pointer_t ref)); -trio_pointer_t trio_get_argument TRIO_PROTO((trio_pointer_t ref)); - -/* Modifiers */ -int trio_get_width TRIO_PROTO((trio_pointer_t ref)); -void trio_set_width TRIO_PROTO((trio_pointer_t ref, int width)); -int trio_get_precision TRIO_PROTO((trio_pointer_t ref)); -void trio_set_precision TRIO_PROTO((trio_pointer_t ref, int precision)); -int trio_get_base TRIO_PROTO((trio_pointer_t ref)); -void trio_set_base TRIO_PROTO((trio_pointer_t ref, int base)); -int trio_get_padding TRIO_PROTO((trio_pointer_t ref)); -void trio_set_padding TRIO_PROTO((trio_pointer_t ref, int is_padding)); -int trio_get_short TRIO_PROTO((trio_pointer_t ref)); /* h */ -void trio_set_shortshort TRIO_PROTO((trio_pointer_t ref, int is_shortshort)); -int trio_get_shortshort TRIO_PROTO((trio_pointer_t ref)); /* hh */ -void trio_set_short TRIO_PROTO((trio_pointer_t ref, int is_short)); -int trio_get_long TRIO_PROTO((trio_pointer_t ref)); /* l */ -void trio_set_long TRIO_PROTO((trio_pointer_t ref, int is_long)); -int trio_get_longlong TRIO_PROTO((trio_pointer_t ref)); /* ll */ -void trio_set_longlong TRIO_PROTO((trio_pointer_t ref, int is_longlong)); -int trio_get_longdouble TRIO_PROTO((trio_pointer_t ref)); /* L */ -void trio_set_longdouble TRIO_PROTO((trio_pointer_t ref, int is_longdouble)); -int trio_get_alternative TRIO_PROTO((trio_pointer_t ref)); /* # */ -void trio_set_alternative TRIO_PROTO((trio_pointer_t ref, int is_alternative)); -int trio_get_alignment TRIO_PROTO((trio_pointer_t ref)); /* - */ -void trio_set_alignment TRIO_PROTO((trio_pointer_t ref, int is_leftaligned)); -int trio_get_spacing TRIO_PROTO((trio_pointer_t ref)); /* TRIO_PROTO((space) */ -void trio_set_spacing TRIO_PROTO((trio_pointer_t ref, int is_space)); -int trio_get_sign TRIO_PROTO((trio_pointer_t ref)); /* + */ -void trio_set_sign TRIO_PROTO((trio_pointer_t ref, int is_showsign)); -int trio_get_quote TRIO_PROTO((trio_pointer_t ref)); /* ' */ -void trio_set_quote TRIO_PROTO((trio_pointer_t ref, int is_quote)); -int trio_get_upper TRIO_PROTO((trio_pointer_t ref)); -void trio_set_upper TRIO_PROTO((trio_pointer_t ref, int is_upper)); -#if TRIO_C99 -int trio_get_largest TRIO_PROTO((trio_pointer_t ref)); /* j */ -void trio_set_largest TRIO_PROTO((trio_pointer_t ref, int is_largest)); -int trio_get_ptrdiff TRIO_PROTO((trio_pointer_t ref)); /* t */ -void trio_set_ptrdiff TRIO_PROTO((trio_pointer_t ref, int is_ptrdiff)); -int trio_get_size TRIO_PROTO((trio_pointer_t ref)); /* z / Z */ -void trio_set_size TRIO_PROTO((trio_pointer_t ref, int is_size)); -#endif - -/* Printing */ -int trio_print_ref TRIO_PROTO((trio_pointer_t ref, const char *format, ...)); -int trio_vprint_ref TRIO_PROTO((trio_pointer_t ref, const char *format, va_list args)); -int trio_printv_ref TRIO_PROTO((trio_pointer_t ref, const char *format, trio_pointer_t *args)); - -void trio_print_int TRIO_PROTO((trio_pointer_t ref, int number)); -void trio_print_uint TRIO_PROTO((trio_pointer_t ref, unsigned int number)); -/* void trio_print_long TRIO_PROTO((trio_pointer_t ref, long number)); */ -/* void trio_print_ulong TRIO_PROTO((trio_pointer_t ref, unsigned long number)); */ -void trio_print_double TRIO_PROTO((trio_pointer_t ref, double number)); -void trio_print_string TRIO_PROTO((trio_pointer_t ref, char *string)); -void trio_print_pointer TRIO_PROTO((trio_pointer_t ref, trio_pointer_t pointer)); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* TRIO_TRIOP_H */ diff --git a/ThirdParty/libxml2/vtklibxml2/triostr.c b/ThirdParty/libxml2/vtklibxml2/triostr.c deleted file mode 100644 index 9f9a89aa8c5..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/triostr.c +++ /dev/null @@ -1,2102 +0,0 @@ -/************************************************************************* - * - * Id - * - * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************/ - -/************************************************************************* - * Include files - */ - -#include <assert.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <math.h> -#include "triodef.h" -#include "triostr.h" - -/************************************************************************* - * Definitions - */ - -#if !defined(TRIO_STRING_PUBLIC) -# define TRIO_STRING_PUBLIC TRIO_PUBLIC -#endif -#if !defined(TRIO_STRING_PRIVATE) -# define TRIO_STRING_PRIVATE TRIO_PRIVATE -#endif - -#if !defined(NULL) -# define NULL 0 -#endif -#if !defined(NIL) -# define NIL ((char)0) -#endif -#if !defined(FALSE) -# define FALSE (1 == 0) -# define TRUE (! FALSE) -#endif -#if !defined(BOOLEAN_T) -# define BOOLEAN_T int -#endif - -#if defined(TRIO_COMPILER_SUPPORTS_C99) -# define USE_STRTOD -# define USE_STRTOF -#elif defined(TRIO_COMPILER_MSVC) -# define USE_STRTOD -#endif - -#if defined(TRIO_PLATFORM_UNIX) -# define USE_STRCASECMP -# define USE_STRNCASECMP -# if defined(TRIO_PLATFORM_SUNOS) -# define USE_SYS_ERRLIST -# else -# define USE_STRERROR -# endif -# if defined(TRIO_PLATFORM_QNX) -# define strcasecmp(x,y) stricmp(x,y) -# define strncasecmp(x,y,n) strnicmp(x,y,n) -# endif -#elif defined(TRIO_PLATFORM_WIN32) -# define USE_STRCASECMP -# define strcasecmp(x,y) strcmpi(x,y) -#endif - -#if !(defined(TRIO_PLATFORM_SUNOS)) -# define USE_TOLOWER -# define USE_TOUPPER -#endif - -/************************************************************************* - * Structures - */ - -struct _trio_string_t -{ - char *content; - size_t length; - size_t allocated; -}; - -/************************************************************************* - * Constants - */ - -#if !defined(TRIO_MINIMAL) -static TRIO_CONST char rcsid[] = "@(#)Id"; -#endif - -/************************************************************************* - * Static String Functions - */ - -#if defined(TRIO_DOCUMENTATION) -# include "doc/doc_static.h" -#endif -/** @addtogroup StaticStrings - @{ -*/ - -/** - Create new string. - - @param size Size of new string. - @return Pointer to string, or NULL if allocation failed. -*/ -TRIO_STRING_PUBLIC char * -trio_create -TRIO_ARGS1((size), - size_t size) -{ - return (char *)TRIO_MALLOC(size); -} - - -/** - Destroy string. - - @param string String to be freed. -*/ -TRIO_STRING_PUBLIC void -trio_destroy -TRIO_ARGS1((string), - char *string) -{ - if (string) - { - TRIO_FREE(string); - } -} - - -/** - Count the number of characters in a string. - - @param string String to measure. - @return Number of characters in @string. -*/ -TRIO_STRING_PUBLIC size_t -trio_length -TRIO_ARGS1((string), - TRIO_CONST char *string) -{ - return strlen(string); -} - - -#if !defined(TRIO_MINIMAL) -/** - Append @p source at the end of @p target. - - @param target Target string. - @param source Source string. - @return Boolean value indicating success or failure. - - @pre @p target must point to a memory chunk with sufficient room to - contain the @p target string and @p source string. - @pre No boundary checking is performed, so insufficient memory will - result in a buffer overrun. - @post @p target will be zero terminated. -*/ -TRIO_STRING_PUBLIC int -trio_append -TRIO_ARGS2((target, source), - char *target, - TRIO_CONST char *source) -{ - assert(target); - assert(source); - - return (strcat(target, source) != NULL); -} -#endif /* !defined(TRIO_MINIMAL) */ - -#if !defined(TRIO_MINIMAL) -/** - Append at most @p max characters from @p source to @p target. - - @param target Target string. - @param max Maximum number of characters to append. - @param source Source string. - @return Boolean value indicating success or failure. - - @pre @p target must point to a memory chuck with sufficient room to - contain the @p target string and the @p source string (at most @p max - characters). - @pre No boundary checking is performed, so insufficient memory will - result in a buffer overrun. - @post @p target will be zero terminated. -*/ -TRIO_STRING_PUBLIC int -trio_append_max -TRIO_ARGS3((target, max, source), - char *target, - size_t max, - TRIO_CONST char *source) -{ - size_t length; - - assert(target); - assert(source); - - length = trio_length(target); - - if (max > length) - { - strncat(target, source, max - length - 1); - } - return TRUE; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Determine if a string contains a substring. - - @param string String to be searched. - @param substring String to be found. - @return Boolean value indicating success or failure. -*/ -TRIO_STRING_PUBLIC int -trio_contains -TRIO_ARGS2((string, substring), - TRIO_CONST char *string, - TRIO_CONST char *substring) -{ - assert(string); - assert(substring); - - return (0 != strstr(string, substring)); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Copy @p source to @p target. - - @param target Target string. - @param source Source string. - @return Boolean value indicating success or failure. - - @pre @p target must point to a memory chunk with sufficient room to - contain the @p source string. - @pre No boundary checking is performed, so insufficient memory will - result in a buffer overrun. - @post @p target will be zero terminated. -*/ -TRIO_STRING_PUBLIC int -trio_copy -TRIO_ARGS2((target, source), - char *target, - TRIO_CONST char *source) -{ - assert(target); - assert(source); - - (void)strcpy(target, source); - return TRUE; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** - Copy at most @p max characters from @p source to @p target. - - @param target Target string. - @param max Maximum number of characters to append. - @param source Source string. - @return Boolean value indicating success or failure. - - @pre @p target must point to a memory chunk with sufficient room to - contain the @p source string (at most @p max characters). - @pre No boundary checking is performed, so insufficient memory will - result in a buffer overrun. - @post @p target will be zero terminated. -*/ -TRIO_STRING_PUBLIC int -trio_copy_max -TRIO_ARGS3((target, max, source), - char *target, - size_t max, - TRIO_CONST char *source) -{ - assert(target); - assert(source); - assert(max > 0); /* Includes != 0 */ - - (void)strncpy(target, source, max - 1); - target[max - 1] = (char)0; - return TRUE; -} - - -/* - * TrioDuplicateMax - */ -TRIO_STRING_PRIVATE char * -TrioDuplicateMax -TRIO_ARGS2((source, size), - TRIO_CONST char *source, - size_t size) -{ - char *target; - - assert(source); - - /* Make room for string plus a terminating zero */ - size++; - target = trio_create(size); - if (target) - { - trio_copy_max(target, size, source); - } - return target; -} - - -/** - Duplicate @p source. - - @param source Source string. - @return A copy of the @p source string. - - @post @p target will be zero terminated. -*/ -TRIO_STRING_PUBLIC char * -trio_duplicate -TRIO_ARGS1((source), - TRIO_CONST char *source) -{ - return TrioDuplicateMax(source, trio_length(source)); -} - - -#if !defined(TRIO_MINIMAL) -/** - Duplicate at most @p max characters of @p source. - - @param source Source string. - @param max Maximum number of characters to duplicate. - @return A copy of the @p source string. - - @post @p target will be zero terminated. -*/ -TRIO_STRING_PUBLIC char * -trio_duplicate_max TRIO_ARGS2((source, max), - TRIO_CONST char *source, - size_t max) -{ - size_t length; - - assert(source); - assert(max > 0); - - length = trio_length(source); - if (length > max) - { - length = max; - } - return TrioDuplicateMax(source, length); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** - Compare if two strings are equal. - - @param first First string. - @param second Second string. - @return Boolean indicating whether the two strings are equal or not. - - Case-insensitive comparison. -*/ -TRIO_STRING_PUBLIC int -trio_equal -TRIO_ARGS2((first, second), - TRIO_CONST char *first, - TRIO_CONST char *second) -{ - assert(first); - assert(second); - - if ((first != NULL) && (second != NULL)) - { -#if defined(USE_STRCASECMP) - return (0 == strcasecmp(first, second)); -#else - while ((*first != NIL) && (*second != NIL)) - { - if (trio_to_upper(*first) != trio_to_upper(*second)) - { - break; - } - first++; - second++; - } - return ((*first == NIL) && (*second == NIL)); -#endif - } - return FALSE; -} - - -/** - Compare if two strings are equal. - - @param first First string. - @param second Second string. - @return Boolean indicating whether the two strings are equal or not. - - Case-sensitive comparison. -*/ -TRIO_STRING_PUBLIC int -trio_equal_case -TRIO_ARGS2((first, second), - TRIO_CONST char *first, - TRIO_CONST char *second) -{ - assert(first); - assert(second); - - if ((first != NULL) && (second != NULL)) - { - return (0 == strcmp(first, second)); - } - return FALSE; -} - - -#if !defined(TRIO_MINIMAL) -/** - Compare if two strings up until the first @p max characters are equal. - - @param first First string. - @param max Maximum number of characters to compare. - @param second Second string. - @return Boolean indicating whether the two strings are equal or not. - - Case-sensitive comparison. -*/ -TRIO_STRING_PUBLIC int -trio_equal_case_max -TRIO_ARGS3((first, max, second), - TRIO_CONST char *first, - size_t max, - TRIO_CONST char *second) -{ - assert(first); - assert(second); - - if ((first != NULL) && (second != NULL)) - { - return (0 == strncmp(first, second, max)); - } - return FALSE; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** - Compare if two strings are equal. - - @param first First string. - @param second Second string. - @return Boolean indicating whether the two strings are equal or not. - - Collating characters are considered equal. -*/ -TRIO_STRING_PUBLIC int -trio_equal_locale -TRIO_ARGS2((first, second), - TRIO_CONST char *first, - TRIO_CONST char *second) -{ - assert(first); - assert(second); - -#if defined(LC_COLLATE) - return (strcoll(first, second) == 0); -#else - return trio_equal(first, second); -#endif -} - - -/** - Compare if two strings up until the first @p max characters are equal. - - @param first First string. - @param max Maximum number of characters to compare. - @param second Second string. - @return Boolean indicating whether the two strings are equal or not. - - Case-insensitive comparison. -*/ -TRIO_STRING_PUBLIC int -trio_equal_max -TRIO_ARGS3((first, max, second), - TRIO_CONST char *first, - size_t max, - TRIO_CONST char *second) -{ - assert(first); - assert(second); - - if ((first != NULL) && (second != NULL)) - { -#if defined(USE_STRNCASECMP) - return (0 == strncasecmp(first, second, max)); -#else - /* Not adequately tested yet */ - size_t cnt = 0; - while ((*first != NIL) && (*second != NIL) && (cnt <= max)) - { - if (trio_to_upper(*first) != trio_to_upper(*second)) - { - break; - } - first++; - second++; - cnt++; - } - return ((cnt == max) || ((*first == NIL) && (*second == NIL))); -#endif - } - return FALSE; -} - - -/** - Provide a textual description of an error code (errno). - - @param error_number Error number. - @return Textual description of @p error_number. -*/ -TRIO_STRING_PUBLIC TRIO_CONST char * -trio_error -TRIO_ARGS1((error_number), - int error_number) -{ -#if defined(USE_STRERROR) - - return strerror(error_number); - -#elif defined(USE_SYS_ERRLIST) - - extern char *sys_errlist[]; - extern int sys_nerr; - - return ((error_number < 0) || (error_number >= sys_nerr)) - ? "unknown" - : sys_errlist[error_number]; - -#else - - return "unknown"; - -#endif -} - - -#if !defined(TRIO_MINIMAL) -/** - Format the date/time according to @p format. - - @param target Target string. - @param max Maximum number of characters to format. - @param format Formatting string. - @param datetime Date/time structure. - @return Number of formatted characters. - - The formatting string accepts the same specifiers as the standard C - function strftime. -*/ -TRIO_STRING_PUBLIC size_t -trio_format_date_max -TRIO_ARGS4((target, max, format, datetime), - char *target, - size_t max, - TRIO_CONST char *format, - TRIO_CONST struct tm *datetime) -{ - assert(target); - assert(format); - assert(datetime); - assert(max > 0); - - return strftime(target, max, format, datetime); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Calculate a hash value for a string. - - @param string String to be calculated on. - @param type Hash function. - @return Calculated hash value. - - @p type can be one of the following - @li @c TRIO_HASH_PLAIN Plain hash function. -*/ -TRIO_STRING_PUBLIC unsigned long -trio_hash -TRIO_ARGS2((string, type), - TRIO_CONST char *string, - int type) -{ - unsigned long value = 0L; - char ch; - - assert(string); - - switch (type) - { - case TRIO_HASH_PLAIN: - while ( (ch = *string++) != NIL ) - { - value *= 31; - value += (unsigned long)ch; - } - break; - default: - assert(FALSE); - break; - } - return value; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Find first occurrence of a character in a string. - - @param string String to be searched. - @param character Character to be found. - @param A pointer to the found character, or NULL if character was not found. - */ -TRIO_STRING_PUBLIC char * -trio_index -TRIO_ARGS2((string, character), - TRIO_CONST char *string, - int character) -{ - assert(string); - - return strchr(string, character); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Find last occurrence of a character in a string. - - @param string String to be searched. - @param character Character to be found. - @param A pointer to the found character, or NULL if character was not found. - */ -TRIO_STRING_PUBLIC char * -trio_index_last -TRIO_ARGS2((string, character), - TRIO_CONST char *string, - int character) -{ - assert(string); - - return strchr(string, character); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Convert the alphabetic letters in the string to lower-case. - - @param target String to be converted. - @return Number of processed characters (converted or not). -*/ -TRIO_STRING_PUBLIC int -trio_lower -TRIO_ARGS1((target), - char *target) -{ - assert(target); - - return trio_span_function(target, target, trio_to_lower); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Compare two strings using wildcards. - - @param string String to be searched. - @param pattern Pattern, including wildcards, to search for. - @return Boolean value indicating success or failure. - - Case-insensitive comparison. - - The following wildcards can be used - @li @c * Match any number of characters. - @li @c ? Match a single character. -*/ -TRIO_STRING_PUBLIC int -trio_match -TRIO_ARGS2((string, pattern), - TRIO_CONST char *string, - TRIO_CONST char *pattern) -{ - assert(string); - assert(pattern); - - for (; ('*' != *pattern); ++pattern, ++string) - { - if (NIL == *string) - { - return (NIL == *pattern); - } - if ((trio_to_upper((int)*string) != trio_to_upper((int)*pattern)) - && ('?' != *pattern)) - { - return FALSE; - } - } - /* two-line patch to prevent *too* much recursiveness: */ - while ('*' == pattern[1]) - pattern++; - - do - { - if ( trio_match(string, &pattern[1]) ) - { - return TRUE; - } - } - while (*string++); - - return FALSE; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Compare two strings using wildcards. - - @param string String to be searched. - @param pattern Pattern, including wildcards, to search for. - @return Boolean value indicating success or failure. - - Case-sensitive comparison. - - The following wildcards can be used - @li @c * Match any number of characters. - @li @c ? Match a single character. -*/ -TRIO_STRING_PUBLIC int -trio_match_case -TRIO_ARGS2((string, pattern), - TRIO_CONST char *string, - TRIO_CONST char *pattern) -{ - assert(string); - assert(pattern); - - for (; ('*' != *pattern); ++pattern, ++string) - { - if (NIL == *string) - { - return (NIL == *pattern); - } - if ((*string != *pattern) - && ('?' != *pattern)) - { - return FALSE; - } - } - /* two-line patch to prevent *too* much recursiveness: */ - while ('*' == pattern[1]) - pattern++; - - do - { - if ( trio_match_case(string, &pattern[1]) ) - { - return TRUE; - } - } - while (*string++); - - return FALSE; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Execute a function on each character in string. - - @param target Target string. - @param source Source string. - @param Function Function to be executed. - @return Number of processed characters. -*/ -TRIO_STRING_PUBLIC size_t -trio_span_function -TRIO_ARGS3((target, source, Function), - char *target, - TRIO_CONST char *source, - int (*Function) TRIO_PROTO((int))) -{ - size_t count = 0; - - assert(target); - assert(source); - assert(Function); - - while (*source != NIL) - { - *target++ = Function(*source++); - count++; - } - return count; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Search for a substring in a string. - - @param string String to be searched. - @param substring String to be found. - @return Pointer to first occurrence of @p substring in @p string, or NULL - if no match was found. -*/ -TRIO_STRING_PUBLIC char * -trio_substring -TRIO_ARGS2((string, substring), - TRIO_CONST char *string, - TRIO_CONST char *substring) -{ - assert(string); - assert(substring); - - return strstr(string, substring); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Search for a substring in the first @p max characters of a string. - - @param string String to be searched. - @param max Maximum characters to be searched. - @param substring String to be found. - @return Pointer to first occurrence of @p substring in @p string, or NULL - if no match was found. -*/ -TRIO_STRING_PUBLIC char * -trio_substring_max -TRIO_ARGS3((string, max, substring), - TRIO_CONST char *string, - size_t max, - TRIO_CONST char *substring) -{ - size_t count; - size_t size; - char *result = NULL; - - assert(string); - assert(substring); - - size = trio_length(substring); - if (size <= max) - { - for (count = 0; count <= max - size; count++) - { - if (trio_equal_max(substring, size, &string[count])) - { - result = (char *)&string[count]; - break; - } - } - } - return result; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Tokenize string. - - @param string String to be tokenized. - @param tokens String containing list of delimiting characters. - @return Start of new token. - - @warning @p string will be destroyed. -*/ -TRIO_STRING_PUBLIC char * -trio_tokenize -TRIO_ARGS2((string, delimiters), - char *string, - TRIO_CONST char *delimiters) -{ - assert(delimiters); - - return strtok(string, delimiters); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** - Convert string to floating-point number. - - @param source String to be converted. - @param endp Pointer to end of the converted string. - @return A floating-point number. - - The following Extended Backus-Naur form is used - @verbatim - double ::= [ <sign> ] - ( <number> | - <number> <decimal_point> <number> | - <decimal_point> <number> ) - [ <exponential> [ <sign> ] <number> ] - number ::= 1*( <digit> ) - digit ::= ( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ) - exponential ::= ( 'e' | 'E' ) - sign ::= ( '-' | '+' ) - decimal_point ::= '.' - @endverbatim -*/ -/* FIXME: Add EBNF for hex-floats */ -TRIO_STRING_PUBLIC trio_long_double_t -trio_to_long_double -TRIO_ARGS2((source, endp), - TRIO_CONST char *source, - char **endp) -{ -#if defined(USE_STRTOLD) - return strtold(source, endp); -#else - int isNegative = FALSE; - int isExponentNegative = FALSE; - trio_long_double_t integer = 0.0; - trio_long_double_t fraction = 0.0; - unsigned long exponent = 0; - trio_long_double_t base; - trio_long_double_t fracdiv = 1.0; - trio_long_double_t value = 0.0; - - /* First try hex-floats */ - if ((source[0] == '0') && ((source[1] == 'x') || (source[1] == 'X'))) - { - base = 16.0; - source += 2; - while (isxdigit((int)*source)) - { - integer *= base; - integer += (isdigit((int)*source) - ? (*source - '0') - : 10 + (trio_to_upper((int)*source) - 'A')); - source++; - } - if (*source == '.') - { - source++; - while (isxdigit((int)*source)) - { - fracdiv /= base; - fraction += fracdiv * (isdigit((int)*source) - ? (*source - '0') - : 10 + (trio_to_upper((int)*source) - 'A')); - source++; - } - if ((*source == 'p') || (*source == 'P')) - { - source++; - if ((*source == '+') || (*source == '-')) - { - isExponentNegative = (*source == '-'); - source++; - } - while (isdigit((int)*source)) - { - exponent *= 10; - exponent += (*source - '0'); - source++; - } - } - } - /* For later use with exponent */ - base = 2.0; - } - else /* Then try normal decimal floats */ - { - base = 10.0; - isNegative = (*source == '-'); - /* Skip sign */ - if ((*source == '+') || (*source == '-')) - source++; - - /* Integer part */ - while (isdigit((int)*source)) - { - integer *= base; - integer += (*source - '0'); - source++; - } - - if (*source == '.') - { - source++; /* skip decimal point */ - while (isdigit((int)*source)) - { - fracdiv /= base; - fraction += (*source - '0') * fracdiv; - source++; - } - } - if ((*source == 'e') - || (*source == 'E') -#if TRIO_MICROSOFT - || (*source == 'd') - || (*source == 'D') -#endif - ) - { - source++; /* Skip exponential indicator */ - isExponentNegative = (*source == '-'); - if ((*source == '+') || (*source == '-')) - source++; - while (isdigit((int)*source)) - { - exponent *= (int)base; - exponent += (*source - '0'); - source++; - } - } - } - - value = integer + fraction; - if (exponent != 0) - { - if (isExponentNegative) - value /= pow(base, (double)exponent); - else - value *= pow(base, (double)exponent); - } - if (isNegative) - value = -value; - - if (endp) - *endp = (char *)source; - return value; -#endif -} - - -/** - Convert string to floating-point number. - - @param source String to be converted. - @param endp Pointer to end of the converted string. - @return A floating-point number. - - See @ref trio_to_long_double. -*/ -TRIO_STRING_PUBLIC double -trio_to_double -TRIO_ARGS2((source, endp), - TRIO_CONST char *source, - char **endp) -{ -#if defined(USE_STRTOD) - return strtod(source, endp); -#else - return (double)trio_to_long_double(source, endp); -#endif -} - -#if !defined(TRIO_MINIMAL) -/** - Convert string to floating-point number. - - @param source String to be converted. - @param endp Pointer to end of the converted string. - @return A floating-point number. - - See @ref trio_to_long_double. -*/ -TRIO_STRING_PUBLIC float -trio_to_float -TRIO_ARGS2((source, endp), - TRIO_CONST char *source, - char **endp) -{ -#if defined(USE_STRTOF) - return strtof(source, endp); -#else - return (float)trio_to_long_double(source, endp); -#endif -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** - Convert string to signed integer. - - @param string String to be converted. - @param endp Pointer to end of converted string. - @param base Radix number of number. -*/ -TRIO_STRING_PUBLIC long -trio_to_long -TRIO_ARGS3((string, endp, base), - TRIO_CONST char *string, - char **endp, - int base) -{ - assert(string); - assert((base >= 2) && (base <= 36)); - - return strtol(string, endp, base); -} - - -#if !defined(TRIO_MINIMAL) -/** - Convert one alphabetic letter to lower-case. - - @param source The letter to be converted. - @return The converted letter. -*/ -TRIO_STRING_PUBLIC int -trio_to_lower -TRIO_ARGS1((source), - int source) -{ -#if defined(USE_TOLOWER) - - return tolower(source); - -#else - - /* Does not handle locales or non-contiguous alphabetic characters */ - return ((source >= (int)'A') && (source <= (int)'Z')) - ? source - 'A' + 'a' - : source; - -#endif -} -#endif /* !defined(TRIO_MINIMAL) */ - -#if !defined(TRIO_MINIMAL) -/** - Convert string to unsigned integer. - - @param string String to be converted. - @param endp Pointer to end of converted string. - @param base Radix number of number. -*/ -TRIO_STRING_PUBLIC unsigned long -trio_to_unsigned_long -TRIO_ARGS3((string, endp, base), - TRIO_CONST char *string, - char **endp, - int base) -{ - assert(string); - assert((base >= 2) && (base <= 36)); - - return strtoul(string, endp, base); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** - Convert one alphabetic letter to upper-case. - - @param source The letter to be converted. - @return The converted letter. -*/ -TRIO_STRING_PUBLIC int -trio_to_upper -TRIO_ARGS1((source), - int source) -{ -#if defined(USE_TOUPPER) - - return toupper(source); - -#else - - /* Does not handle locales or non-contiguous alphabetic characters */ - return ((source >= (int)'a') && (source <= (int)'z')) - ? source - 'a' + 'A' - : source; - -#endif -} - -#if !defined(TRIO_MINIMAL) -/** - Convert the alphabetic letters in the string to upper-case. - - @param target The string to be converted. - @return The number of processed characters (converted or not). -*/ -TRIO_STRING_PUBLIC int -trio_upper -TRIO_ARGS1((target), - char *target) -{ - assert(target); - - return trio_span_function(target, target, trio_to_upper); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** @} End of StaticStrings */ - - -/************************************************************************* - * Dynamic String Functions - */ - -#if defined(TRIO_DOCUMENTATION) -# include "doc/doc_dynamic.h" -#endif -/** @addtogroup DynamicStrings - @{ -*/ - -/* - * TrioStringAlloc - */ -TRIO_STRING_PRIVATE trio_string_t * -TrioStringAlloc(TRIO_NOARGS) -{ - trio_string_t *self; - - self = (trio_string_t *)TRIO_MALLOC(sizeof(trio_string_t)); - if (self) - { - self->content = NULL; - self->length = 0; - self->allocated = 0; - } - return self; -} - - -/* - * TrioStringGrow - * - * The size of the string will be increased by 'delta' characters. If - * 'delta' is zero, the size will be doubled. - */ -TRIO_STRING_PRIVATE BOOLEAN_T -TrioStringGrow -TRIO_ARGS2((self, delta), - trio_string_t *self, - size_t delta) -{ - BOOLEAN_T status = FALSE; - char *new_content; - size_t new_size; - - new_size = (delta == 0) - ? ( (self->allocated == 0) ? 1 : self->allocated * 2 ) - : self->allocated + delta; - - new_content = (char *)TRIO_REALLOC(self->content, new_size); - if (new_content) - { - self->content = new_content; - self->allocated = new_size; - status = TRUE; - } - return status; -} - - -#if !defined(TRIO_MINIMAL) -/* - * TrioStringGrowTo - * - * The size of the string will be increased to 'length' plus one characters. - * If 'length' is less than the original size, the original size will be - * used (that is, the size of the string is never decreased). - */ -TRIO_STRING_PRIVATE BOOLEAN_T -TrioStringGrowTo -TRIO_ARGS2((self, length), - trio_string_t *self, - size_t length) -{ - length++; /* Room for terminating zero */ - return (self->allocated < length) - ? TrioStringGrow(self, length - self->allocated) - : TRUE; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/** - Create a new dynamic string. - - @param initial_size Initial size of the buffer. - @return Newly allocated dynamic string, or NULL if memory allocation failed. -*/ -TRIO_STRING_PUBLIC trio_string_t * -trio_string_create -TRIO_ARGS1((initial_size), - int initial_size) -{ - trio_string_t *self; - - self = TrioStringAlloc(); - if (self) - { - if (TrioStringGrow(self, - (size_t)((initial_size > 0) ? initial_size : 1))) - { - self->content[0] = (char)0; - self->allocated = initial_size; - } - else - { - trio_string_destroy(self); - self = NULL; - } - } - return self; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** - Deallocate the dynamic string and its contents. - - @param self Dynamic string -*/ -TRIO_STRING_PUBLIC void -trio_string_destroy -TRIO_ARGS1((self), - trio_string_t *self) -{ - assert(self); - - if (self) - { - trio_destroy(self->content); - TRIO_FREE(self); - } -} - - -#if !defined(TRIO_MINIMAL) -/** - Get a pointer to the content. - - @param self Dynamic string. - @param offset Offset into content. - @return Pointer to the content. - - @p Offset can be zero, positive, or negative. If @p offset is zero, - then the start of the content will be returned. If @p offset is positive, - then a pointer to @p offset number of characters from the beginning of the - content is returned. If @p offset is negative, then a pointer to @p offset - number of characters from the ending of the string, starting at the - terminating zero, is returned. -*/ -TRIO_STRING_PUBLIC char * -trio_string_get -TRIO_ARGS2((self, offset), - trio_string_t *self, - int offset) -{ - char *result = NULL; - - assert(self); - - if (self->content != NULL) - { - if (self->length == 0) - { - (void)trio_string_length(self); - } - if (offset >= 0) - { - if (offset > (int)self->length) - { - offset = self->length; - } - } - else - { - offset += self->length + 1; - if (offset < 0) - { - offset = 0; - } - } - result = &(self->content[offset]); - } - return result; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/** - Extract the content. - - @param self Dynamic String - @return Content of dynamic string. - - The content is removed from the dynamic string. This enables destruction - of the dynamic string without deallocation of the content. -*/ -TRIO_STRING_PUBLIC char * -trio_string_extract -TRIO_ARGS1((self), - trio_string_t *self) -{ - char *result; - - assert(self); - - result = self->content; - /* FIXME: Allocate new empty buffer? */ - self->content = NULL; - self->length = self->allocated = 0; - return result; -} - - -#if !defined(TRIO_MINIMAL) -/** - Set the content of the dynamic string. - - @param self Dynamic String - @param buffer The new content. - - Sets the content of the dynamic string to a copy @p buffer. - An existing content will be deallocated first, if necessary. - - @remark - This function will make a copy of @p buffer. - You are responsible for deallocating @p buffer yourself. -*/ -TRIO_STRING_PUBLIC void -trio_xstring_set -TRIO_ARGS2((self, buffer), - trio_string_t *self, - char *buffer) -{ - assert(self); - - trio_destroy(self->content); - self->content = trio_duplicate(buffer); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/* - * trio_string_size - */ -TRIO_STRING_PUBLIC int -trio_string_size -TRIO_ARGS1((self), - trio_string_t *self) -{ - assert(self); - - return self->allocated; -} - - -/* - * trio_string_terminate - */ -TRIO_STRING_PUBLIC void -trio_string_terminate -TRIO_ARGS1((self), - trio_string_t *self) -{ - trio_xstring_append_char(self, 0); -} - - -#if !defined(TRIO_MINIMAL) -/** - Append the second string to the first. - - @param self Dynamic string to be modified. - @param other Dynamic string to copy from. - @return Boolean value indicating success or failure. -*/ -TRIO_STRING_PUBLIC int -trio_string_append -TRIO_ARGS2((self, other), - trio_string_t *self, - trio_string_t *other) -{ - size_t length; - - assert(self); - assert(other); - - length = self->length + other->length; - if (!TrioStringGrowTo(self, length)) - goto error; - trio_copy(&self->content[self->length], other->content); - self->length = length; - return TRUE; - - error: - return FALSE; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_append - */ -TRIO_STRING_PUBLIC int -trio_xstring_append -TRIO_ARGS2((self, other), - trio_string_t *self, - TRIO_CONST char *other) -{ - size_t length; - - assert(self); - assert(other); - - length = self->length + trio_length(other); - if (!TrioStringGrowTo(self, length)) - goto error; - trio_copy(&self->content[self->length], other); - self->length = length; - return TRUE; - - error: - return FALSE; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/* - * trio_xstring_append_char - */ -TRIO_STRING_PUBLIC int -trio_xstring_append_char -TRIO_ARGS2((self, character), - trio_string_t *self, - char character) -{ - assert(self); - - if ((int)self->length >= trio_string_size(self)) - { - if (!TrioStringGrow(self, 0)) - goto error; - } - self->content[self->length] = character; - self->length++; - return TRUE; - - error: - return FALSE; -} - - -#if !defined(TRIO_MINIMAL) -/** - Search for the first occurrence of second parameter in the first. - - @param self Dynamic string to be modified. - @param other Dynamic string to copy from. - @return Boolean value indicating success or failure. -*/ -TRIO_STRING_PUBLIC int -trio_string_contains -TRIO_ARGS2((self, other), - trio_string_t *self, - trio_string_t *other) -{ - assert(self); - assert(other); - - return trio_contains(self->content, other->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_contains - */ -TRIO_STRING_PUBLIC int -trio_xstring_contains -TRIO_ARGS2((self, other), - trio_string_t *self, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - return trio_contains(self->content, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_copy - */ -TRIO_STRING_PUBLIC int -trio_string_copy -TRIO_ARGS2((self, other), - trio_string_t *self, - trio_string_t *other) -{ - assert(self); - assert(other); - - self->length = 0; - return trio_string_append(self, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_copy - */ -TRIO_STRING_PUBLIC int -trio_xstring_copy -TRIO_ARGS2((self, other), - trio_string_t *self, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - self->length = 0; - return trio_xstring_append(self, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_duplicate - */ -TRIO_STRING_PUBLIC trio_string_t * -trio_string_duplicate -TRIO_ARGS1((other), - trio_string_t *other) -{ - trio_string_t *self; - - assert(other); - - self = TrioStringAlloc(); - if (self) - { - self->content = TrioDuplicateMax(other->content, other->length); - if (self->content) - { - self->length = other->length; - self->allocated = self->length + 1; - } - else - { - self->length = self->allocated = 0; - } - } - return self; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -/* - * trio_xstring_duplicate - */ -TRIO_STRING_PUBLIC trio_string_t * -trio_xstring_duplicate -TRIO_ARGS1((other), - TRIO_CONST char *other) -{ - trio_string_t *self; - - assert(other); - - self = TrioStringAlloc(); - if (self) - { - self->content = TrioDuplicateMax(other, trio_length(other)); - if (self->content) - { - self->length = trio_length(self->content); - self->allocated = self->length + 1; - } - else - { - self->length = self->allocated = 0; - } - } - return self; -} - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_equal - */ -TRIO_STRING_PUBLIC int -trio_string_equal -TRIO_ARGS2((self, other), - trio_string_t *self, - trio_string_t *other) -{ - assert(self); - assert(other); - - return trio_equal(self->content, other->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_equal - */ -TRIO_STRING_PUBLIC int -trio_xstring_equal -TRIO_ARGS2((self, other), - trio_string_t *self, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - return trio_equal(self->content, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_equal_max - */ -TRIO_STRING_PUBLIC int -trio_string_equal_max -TRIO_ARGS3((self, max, other), - trio_string_t *self, - size_t max, - trio_string_t *other) -{ - assert(self); - assert(other); - - return trio_equal_max(self->content, max, other->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_equal_max - */ -TRIO_STRING_PUBLIC int -trio_xstring_equal_max -TRIO_ARGS3((self, max, other), - trio_string_t *self, - size_t max, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - return trio_equal_max(self->content, max, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_equal_case - */ -TRIO_STRING_PUBLIC int -trio_string_equal_case -TRIO_ARGS2((self, other), - trio_string_t *self, - trio_string_t *other) -{ - assert(self); - assert(other); - - return trio_equal_case(self->content, other->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_equal_case - */ -TRIO_STRING_PUBLIC int -trio_xstring_equal_case -TRIO_ARGS2((self, other), - trio_string_t *self, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - return trio_equal_case(self->content, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_equal_case_max - */ -TRIO_STRING_PUBLIC int -trio_string_equal_case_max -TRIO_ARGS3((self, max, other), - trio_string_t *self, - size_t max, - trio_string_t *other) -{ - assert(self); - assert(other); - - return trio_equal_case_max(self->content, max, other->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_equal_case_max - */ -TRIO_STRING_PUBLIC int -trio_xstring_equal_case_max -TRIO_ARGS3((self, max, other), - trio_string_t *self, - size_t max, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - return trio_equal_case_max(self->content, max, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_format_data_max - */ -TRIO_STRING_PUBLIC size_t -trio_string_format_date_max -TRIO_ARGS4((self, max, format, datetime), - trio_string_t *self, - size_t max, - TRIO_CONST char *format, - TRIO_CONST struct tm *datetime) -{ - assert(self); - - return trio_format_date_max(self->content, max, format, datetime); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_index - */ -TRIO_STRING_PUBLIC char * -trio_string_index -TRIO_ARGS2((self, character), - trio_string_t *self, - int character) -{ - assert(self); - - return trio_index(self->content, character); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_index_last - */ -TRIO_STRING_PUBLIC char * -trio_string_index_last -TRIO_ARGS2((self, character), - trio_string_t *self, - int character) -{ - assert(self); - - return trio_index_last(self->content, character); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_length - */ -TRIO_STRING_PUBLIC int -trio_string_length -TRIO_ARGS1((self), - trio_string_t *self) -{ - assert(self); - - if (self->length == 0) - { - self->length = trio_length(self->content); - } - return self->length; -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_lower - */ -TRIO_STRING_PUBLIC int -trio_string_lower -TRIO_ARGS1((self), - trio_string_t *self) -{ - assert(self); - - return trio_lower(self->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_match - */ -TRIO_STRING_PUBLIC int -trio_string_match -TRIO_ARGS2((self, other), - trio_string_t *self, - trio_string_t *other) -{ - assert(self); - assert(other); - - return trio_match(self->content, other->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_match - */ -TRIO_STRING_PUBLIC int -trio_xstring_match -TRIO_ARGS2((self, other), - trio_string_t *self, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - return trio_match(self->content, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_match_case - */ -TRIO_STRING_PUBLIC int -trio_string_match_case -TRIO_ARGS2((self, other), - trio_string_t *self, - trio_string_t *other) -{ - assert(self); - assert(other); - - return trio_match_case(self->content, other->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_match_case - */ -TRIO_STRING_PUBLIC int -trio_xstring_match_case -TRIO_ARGS2((self, other), - trio_string_t *self, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - return trio_match_case(self->content, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_substring - */ -TRIO_STRING_PUBLIC char * -trio_string_substring -TRIO_ARGS2((self, other), - trio_string_t *self, - trio_string_t *other) -{ - assert(self); - assert(other); - - return trio_substring(self->content, other->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_xstring_substring - */ -TRIO_STRING_PUBLIC char * -trio_xstring_substring -TRIO_ARGS2((self, other), - trio_string_t *self, - TRIO_CONST char *other) -{ - assert(self); - assert(other); - - return trio_substring(self->content, other); -} -#endif /* !defined(TRIO_MINIMAL) */ - - -#if !defined(TRIO_MINIMAL) -/* - * trio_string_upper - */ -TRIO_STRING_PUBLIC int -trio_string_upper -TRIO_ARGS1((self), - trio_string_t *self) -{ - assert(self); - - return trio_upper(self->content); -} -#endif /* !defined(TRIO_MINIMAL) */ - -/** @} End of DynamicStrings */ diff --git a/ThirdParty/libxml2/vtklibxml2/triostr.h b/ThirdParty/libxml2/vtklibxml2/triostr.h deleted file mode 100644 index a4a76ed0231..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/triostr.h +++ /dev/null @@ -1,140 +0,0 @@ -/************************************************************************* - * - * Id: triostr.h 1886 2003-04-03 15:28:28Z veillard - * - * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************/ - -#ifndef TRIO_TRIOSTR_H -#define TRIO_TRIOSTR_H - -#include <assert.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include "triodef.h" -#include "triop.h" - -enum { - TRIO_HASH_NONE = 0, - TRIO_HASH_PLAIN, - TRIO_HASH_TWOSIGNED -}; - -#if !defined(TRIO_STRING_PUBLIC) -# if !defined(TRIO_PUBLIC) -# define TRIO_PUBLIC -# endif -# define TRIO_STRING_PUBLIC TRIO_PUBLIC -#endif - -/************************************************************************* - * String functions - */ - -TRIO_STRING_PUBLIC int trio_copy_max TRIO_PROTO((char *target, size_t max, const char *source)); -TRIO_STRING_PUBLIC char *trio_create TRIO_PROTO((size_t size)); -TRIO_STRING_PUBLIC void trio_destroy TRIO_PROTO((char *string)); -TRIO_STRING_PUBLIC char *trio_duplicate TRIO_PROTO((const char *source)); -TRIO_STRING_PUBLIC int trio_equal TRIO_PROTO((const char *first, const char *second)); -TRIO_STRING_PUBLIC int trio_equal_case TRIO_PROTO((const char *first, const char *second)); -TRIO_STRING_PUBLIC int trio_equal_locale TRIO_PROTO((const char *first, const char *second)); -TRIO_STRING_PUBLIC int trio_equal_max TRIO_PROTO((const char *first, size_t max, const char *second)); -TRIO_STRING_PUBLIC TRIO_CONST char *trio_error TRIO_PROTO((int)); -TRIO_STRING_PUBLIC size_t trio_length TRIO_PROTO((const char *string)); -TRIO_STRING_PUBLIC double trio_to_double TRIO_PROTO((const char *source, char **endp)); -TRIO_STRING_PUBLIC long trio_to_long TRIO_PROTO((const char *source, char **endp, int base)); -TRIO_STRING_PUBLIC trio_long_double_t trio_to_long_double TRIO_PROTO((const char *source, char **endp)); -TRIO_STRING_PUBLIC int trio_to_upper TRIO_PROTO((int source)); - -#if !defined(TRIO_MINIMAL) - -TRIO_STRING_PUBLIC int trio_append TRIO_PROTO((char *target, const char *source)); -TRIO_STRING_PUBLIC int trio_append_max TRIO_PROTO((char *target, size_t max, const char *source)); -TRIO_STRING_PUBLIC int trio_contains TRIO_PROTO((const char *string, const char *substring)); -TRIO_STRING_PUBLIC int trio_copy TRIO_PROTO((char *target, const char *source)); -TRIO_STRING_PUBLIC char *trio_duplicate_max TRIO_PROTO((const char *source, size_t max)); -TRIO_STRING_PUBLIC int trio_equal_case_max TRIO_PROTO((const char *first, size_t max, const char *second)); -TRIO_STRING_PUBLIC size_t trio_format_date_max TRIO_PROTO((char *target, size_t max, const char *format, const struct tm *datetime)); -TRIO_STRING_PUBLIC unsigned long trio_hash TRIO_PROTO((const char *string, int type)); -TRIO_STRING_PUBLIC char *trio_index TRIO_PROTO((const char *string, int character)); -TRIO_STRING_PUBLIC char *trio_index_last TRIO_PROTO((const char *string, int character)); -TRIO_STRING_PUBLIC int trio_lower TRIO_PROTO((char *target)); -TRIO_STRING_PUBLIC int trio_match TRIO_PROTO((const char *string, const char *pattern)); -TRIO_STRING_PUBLIC int trio_match_case TRIO_PROTO((const char *string, const char *pattern)); -TRIO_STRING_PUBLIC size_t trio_span_function TRIO_PROTO((char *target, const char *source, int (*Function) TRIO_PROTO((int)))); -TRIO_STRING_PUBLIC char *trio_substring TRIO_PROTO((const char *string, const char *substring)); -TRIO_STRING_PUBLIC char *trio_substring_max TRIO_PROTO((const char *string, size_t max, const char *substring)); -TRIO_STRING_PUBLIC float trio_to_float TRIO_PROTO((const char *source, char **endp)); -TRIO_STRING_PUBLIC int trio_to_lower TRIO_PROTO((int source)); -TRIO_STRING_PUBLIC unsigned long trio_to_unsigned_long TRIO_PROTO((const char *source, char **endp, int base)); -TRIO_STRING_PUBLIC char *trio_tokenize TRIO_PROTO((char *string, const char *delimiters)); -TRIO_STRING_PUBLIC int trio_upper TRIO_PROTO((char *target)); - -#endif /* !defined(TRIO_MINIMAL) */ - -/************************************************************************* - * Dynamic string functions - */ - -/* - * Opaque type for dynamic strings - */ - -typedef struct _trio_string_t trio_string_t; - -TRIO_STRING_PUBLIC void trio_string_destroy TRIO_PROTO((trio_string_t *self)); -TRIO_STRING_PUBLIC char *trio_string_extract TRIO_PROTO((trio_string_t *self)); -TRIO_STRING_PUBLIC int trio_string_size TRIO_PROTO((trio_string_t *self)); -TRIO_STRING_PUBLIC void trio_string_terminate TRIO_PROTO((trio_string_t *self)); -TRIO_STRING_PUBLIC int trio_xstring_append_char TRIO_PROTO((trio_string_t *self, char character)); -TRIO_STRING_PUBLIC trio_string_t *trio_xstring_duplicate TRIO_PROTO((const char *other)); - -#if !defined(TRIO_MINIMAL) - -TRIO_STRING_PUBLIC trio_string_t *trio_string_create TRIO_PROTO((int initial_size)); -TRIO_STRING_PUBLIC char *trio_string_get TRIO_PROTO((trio_string_t *self, int offset)); -TRIO_STRING_PUBLIC void trio_xstring_set TRIO_PROTO((trio_string_t *self, char *buffer)); - -TRIO_STRING_PUBLIC int trio_string_append TRIO_PROTO((trio_string_t *self, trio_string_t *other)); -TRIO_STRING_PUBLIC int trio_string_contains TRIO_PROTO((trio_string_t *self, trio_string_t *other)); -TRIO_STRING_PUBLIC int trio_string_copy TRIO_PROTO((trio_string_t *self, trio_string_t *other)); -TRIO_STRING_PUBLIC trio_string_t *trio_string_duplicate TRIO_PROTO((trio_string_t *other)); -TRIO_STRING_PUBLIC int trio_string_equal TRIO_PROTO((trio_string_t *self, trio_string_t *other)); -TRIO_STRING_PUBLIC int trio_string_equal_max TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *second)); -TRIO_STRING_PUBLIC int trio_string_equal_case TRIO_PROTO((trio_string_t *self, trio_string_t *other)); -TRIO_STRING_PUBLIC int trio_string_equal_case_max TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *other)); -TRIO_STRING_PUBLIC size_t trio_string_format_date_max TRIO_PROTO((trio_string_t *self, size_t max, const char *format, const struct tm *datetime)); -TRIO_STRING_PUBLIC char *trio_string_index TRIO_PROTO((trio_string_t *self, int character)); -TRIO_STRING_PUBLIC char *trio_string_index_last TRIO_PROTO((trio_string_t *self, int character)); -TRIO_STRING_PUBLIC int trio_string_length TRIO_PROTO((trio_string_t *self)); -TRIO_STRING_PUBLIC int trio_string_lower TRIO_PROTO((trio_string_t *self)); -TRIO_STRING_PUBLIC int trio_string_match TRIO_PROTO((trio_string_t *self, trio_string_t *other)); -TRIO_STRING_PUBLIC int trio_string_match_case TRIO_PROTO((trio_string_t *self, trio_string_t *other)); -TRIO_STRING_PUBLIC char *trio_string_substring TRIO_PROTO((trio_string_t *self, trio_string_t *other)); -TRIO_STRING_PUBLIC int trio_string_upper TRIO_PROTO((trio_string_t *self)); - -TRIO_STRING_PUBLIC int trio_xstring_append TRIO_PROTO((trio_string_t *self, const char *other)); -TRIO_STRING_PUBLIC int trio_xstring_contains TRIO_PROTO((trio_string_t *self, const char *other)); -TRIO_STRING_PUBLIC int trio_xstring_copy TRIO_PROTO((trio_string_t *self, const char *other)); -TRIO_STRING_PUBLIC int trio_xstring_equal TRIO_PROTO((trio_string_t *self, const char *other)); -TRIO_STRING_PUBLIC int trio_xstring_equal_max TRIO_PROTO((trio_string_t *self, size_t max, const char *other)); -TRIO_STRING_PUBLIC int trio_xstring_equal_case TRIO_PROTO((trio_string_t *self, const char *other)); -TRIO_STRING_PUBLIC int trio_xstring_equal_case_max TRIO_PROTO((trio_string_t *self, size_t max, const char *other)); -TRIO_STRING_PUBLIC int trio_xstring_match TRIO_PROTO((trio_string_t *self, const char *other)); -TRIO_STRING_PUBLIC int trio_xstring_match_case TRIO_PROTO((trio_string_t *self, const char *other)); -TRIO_STRING_PUBLIC char *trio_xstring_substring TRIO_PROTO((trio_string_t *self, const char *other)); - -#endif /* !defined(TRIO_MINIMAL) */ - -#endif /* TRIO_TRIOSTR_H */ diff --git a/ThirdParty/libxml2/vtklibxml2/uri.c b/ThirdParty/libxml2/vtklibxml2/uri.c deleted file mode 100644 index 8dab54bed81..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/uri.c +++ /dev/null @@ -1,2483 +0,0 @@ -/** - * uri.c: set of generic URI related routines - * - * Reference: RFCs 2396, 2732 and 2373 - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> - -#include <libxml/xmlmemory.h> -#include <libxml/uri.h> -#include <libxml/globals.h> -#include <libxml/xmlerror.h> - -/************************************************************************ - * * - * Macros to differentiate various character type * - * directly extracted from RFC 2396 * - * * - ************************************************************************/ - -/* - * alpha = lowalpha | upalpha - */ -#define IS_ALPHA(x) (IS_LOWALPHA(x) || IS_UPALPHA(x)) - - -/* - * lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | - * "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | - * "u" | "v" | "w" | "x" | "y" | "z" - */ - -#define IS_LOWALPHA(x) (((x) >= 'a') && ((x) <= 'z')) - -/* - * upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | - * "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | - * "U" | "V" | "W" | "X" | "Y" | "Z" - */ -#define IS_UPALPHA(x) (((x) >= 'A') && ((x) <= 'Z')) - -#ifdef IS_DIGIT -#undef IS_DIGIT -#endif -/* - * digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" - */ -#define IS_DIGIT(x) (((x) >= '0') && ((x) <= '9')) - -/* - * alphanum = alpha | digit - */ - -#define IS_ALPHANUM(x) (IS_ALPHA(x) || IS_DIGIT(x)) - -/* - * hex = digit | "A" | "B" | "C" | "D" | "E" | "F" | - * "a" | "b" | "c" | "d" | "e" | "f" - */ - -#define IS_HEX(x) ((IS_DIGIT(x)) || (((x) >= 'a') && ((x) <= 'f')) || \ - (((x) >= 'A') && ((x) <= 'F'))) - -/* - * mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" - */ - -#define IS_MARK(x) (((x) == '-') || ((x) == '_') || ((x) == '.') || \ - ((x) == '!') || ((x) == '~') || ((x) == '*') || ((x) == '\'') || \ - ((x) == '(') || ((x) == ')')) - - -/* - * reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," | - * "[" | "]" - */ - -#define IS_RESERVED(x) (((x) == ';') || ((x) == '/') || ((x) == '?') || \ - ((x) == ':') || ((x) == '@') || ((x) == '&') || ((x) == '=') || \ - ((x) == '+') || ((x) == '$') || ((x) == ',') || ((x) == '[') || \ - ((x) == ']')) - -/* - * unreserved = alphanum | mark - */ - -#define IS_UNRESERVED(x) (IS_ALPHANUM(x) || IS_MARK(x)) - -/* - * escaped = "%" hex hex - */ - -#define IS_ESCAPED(p) ((*(p) == '%') && (IS_HEX((p)[1])) && \ - (IS_HEX((p)[2]))) - -/* - * uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" | - * "&" | "=" | "+" | "$" | "," - */ -#define IS_URIC_NO_SLASH(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) ||\ - ((*(p) == ';')) || ((*(p) == '?')) || ((*(p) == ':')) ||\ - ((*(p) == '@')) || ((*(p) == '&')) || ((*(p) == '=')) ||\ - ((*(p) == '+')) || ((*(p) == '$')) || ((*(p) == ','))) - -/* - * pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | "," - */ -#define IS_PCHAR(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) || \ - ((*(p) == ':')) || ((*(p) == '@')) || ((*(p) == '&')) ||\ - ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) ||\ - ((*(p) == ','))) - -/* - * rel_segment = 1*( unreserved | escaped | - * ";" | "@" | "&" | "=" | "+" | "$" | "," ) - */ - -#define IS_SEGMENT(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) || \ - ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) || \ - ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) || \ - ((*(p) == ','))) - -/* - * scheme = alpha *( alpha | digit | "+" | "-" | "." ) - */ - -#define IS_SCHEME(x) ((IS_ALPHA(x)) || (IS_DIGIT(x)) || \ - ((x) == '+') || ((x) == '-') || ((x) == '.')) - -/* - * reg_name = 1*( unreserved | escaped | "$" | "," | - * ";" | ":" | "@" | "&" | "=" | "+" ) - */ - -#define IS_REG_NAME(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) || \ - ((*(p) == '$')) || ((*(p) == ',')) || ((*(p) == ';')) || \ - ((*(p) == ':')) || ((*(p) == '@')) || ((*(p) == '&')) || \ - ((*(p) == '=')) || ((*(p) == '+'))) - -/* - * userinfo = *( unreserved | escaped | ";" | ":" | "&" | "=" | - * "+" | "$" | "," ) - */ -#define IS_USERINFO(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) || \ - ((*(p) == ';')) || ((*(p) == ':')) || ((*(p) == '&')) || \ - ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) || \ - ((*(p) == ','))) - -/* - * uric = reserved | unreserved | escaped - */ - -#define IS_URIC(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) || \ - (IS_RESERVED(*(p)))) - -/* -* unwise = "{" | "}" | "|" | "\" | "^" | "`" -*/ - -#define IS_UNWISE(p) \ - (((*(p) == '{')) || ((*(p) == '}')) || ((*(p) == '|')) || \ - ((*(p) == '\\')) || ((*(p) == '^')) || ((*(p) == '[')) || \ - ((*(p) == ']')) || ((*(p) == '`'))) - -/* - * Skip to next pointer char, handle escaped sequences - */ - -#define NEXT(p) ((*p == '%')? p += 3 : p++) - -/* - * Productions from the spec. - * - * authority = server | reg_name - * reg_name = 1*( unreserved | escaped | "$" | "," | - * ";" | ":" | "@" | "&" | "=" | "+" ) - * - * path = [ abs_path | opaque_part ] - */ - -#define STRNDUP(s, n) (char *) xmlStrndup((const xmlChar *)(s), (n)) - -/************************************************************************ - * * - * Generic URI structure functions * - * * - ************************************************************************/ - -/** - * xmlCreateURI: - * - * Simply creates an empty xmlURI - * - * Returns the new structure or NULL in case of error - */ -xmlURIPtr -xmlCreateURI(void) { - xmlURIPtr ret; - - ret = (xmlURIPtr) xmlMalloc(sizeof(xmlURI)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlCreateURI: out of memory\n"); - return(NULL); - } - memset(ret, 0, sizeof(xmlURI)); - return(ret); -} - -/** - * xmlSaveUri: - * @uri: pointer to an xmlURI - * - * Save the URI as an escaped string - * - * Returns a new string (to be deallocated by caller) - */ -xmlChar * -xmlSaveUri(xmlURIPtr uri) { - xmlChar *ret = NULL; - const char *p; - int len; - int max; - - if (uri == NULL) return(NULL); - - - max = 80; - ret = (xmlChar *) xmlMallocAtomic((max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - len = 0; - - if (uri->scheme != NULL) { - p = uri->scheme; - while (*p != 0) { - if (len >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = *p++; - } - if (len >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = ':'; - } - if (uri->opaque != NULL) { - p = uri->opaque; - while (*p != 0) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - if (IS_RESERVED(*(p)) || IS_UNRESERVED(*(p))) - ret[len++] = *p++; - else { - int val = *(unsigned char *)p++; - int hi = val / 0x10, lo = val % 0x10; - ret[len++] = '%'; - ret[len++] = hi + (hi > 9? 'A'-10 : '0'); - ret[len++] = lo + (lo > 9? 'A'-10 : '0'); - } - } - } else { - if (uri->server != NULL) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = '/'; - ret[len++] = '/'; - if (uri->user != NULL) { - p = uri->user; - while (*p != 0) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - if ((IS_UNRESERVED(*(p))) || - ((*(p) == ';')) || ((*(p) == ':')) || - ((*(p) == '&')) || ((*(p) == '=')) || - ((*(p) == '+')) || ((*(p) == '$')) || - ((*(p) == ','))) - ret[len++] = *p++; - else { - int val = *(unsigned char *)p++; - int hi = val / 0x10, lo = val % 0x10; - ret[len++] = '%'; - ret[len++] = hi + (hi > 9? 'A'-10 : '0'); - ret[len++] = lo + (lo > 9? 'A'-10 : '0'); - } - } - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = '@'; - } - p = uri->server; - while (*p != 0) { - if (len >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = *p++; - } - if (uri->port > 0) { - if (len + 10 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - len += snprintf((char *) &ret[len], max - len, ":%d", uri->port); - } - } else if (uri->authority != NULL) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = '/'; - ret[len++] = '/'; - p = uri->authority; - while (*p != 0) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - if ((IS_UNRESERVED(*(p))) || - ((*(p) == '$')) || ((*(p) == ',')) || ((*(p) == ';')) || - ((*(p) == ':')) || ((*(p) == '@')) || ((*(p) == '&')) || - ((*(p) == '=')) || ((*(p) == '+'))) - ret[len++] = *p++; - else { - int val = *(unsigned char *)p++; - int hi = val / 0x10, lo = val % 0x10; - ret[len++] = '%'; - ret[len++] = hi + (hi > 9? 'A'-10 : '0'); - ret[len++] = lo + (lo > 9? 'A'-10 : '0'); - } - } - } else if (uri->scheme != NULL) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = '/'; - ret[len++] = '/'; - } - if (uri->path != NULL) { - p = uri->path; - while (*p != 0) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) || - ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) || - ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) || - ((*(p) == ','))) - ret[len++] = *p++; - else { - int val = *(unsigned char *)p++; - int hi = val / 0x10, lo = val % 0x10; - ret[len++] = '%'; - ret[len++] = hi + (hi > 9? 'A'-10 : '0'); - ret[len++] = lo + (lo > 9? 'A'-10 : '0'); - } - } - } - if (uri->query != NULL) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = '?'; - p = uri->query; - while (*p != 0) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) - ret[len++] = *p++; - else { - int val = *(unsigned char *)p++; - int hi = val / 0x10, lo = val % 0x10; - ret[len++] = '%'; - ret[len++] = hi + (hi > 9? 'A'-10 : '0'); - ret[len++] = lo + (lo > 9? 'A'-10 : '0'); - } - } - } - } - if (uri->fragment != NULL) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = '#'; - p = uri->fragment; - while (*p != 0) { - if (len + 3 >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, - (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) - ret[len++] = *p++; - else { - int val = *(unsigned char *)p++; - int hi = val / 0x10, lo = val % 0x10; - ret[len++] = '%'; - ret[len++] = hi + (hi > 9? 'A'-10 : '0'); - ret[len++] = lo + (lo > 9? 'A'-10 : '0'); - } - } - } - if (len >= max) { - max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } - } - ret[len++] = 0; - return(ret); -} - -/** - * xmlPrintURI: - * @stream: a FILE* for the output - * @uri: pointer to an xmlURI - * - * Prints the URI in the stream @stream. - */ -void -xmlPrintURI(FILE *stream, xmlURIPtr uri) { - xmlChar *out; - - out = xmlSaveUri(uri); - if (out != NULL) { - fprintf(stream, "%s", (char *) out); - xmlFree(out); - } -} - -/** - * xmlCleanURI: - * @uri: pointer to an xmlURI - * - * Make sure the xmlURI struct is free of content - */ -static void -xmlCleanURI(xmlURIPtr uri) { - if (uri == NULL) return; - - if (uri->scheme != NULL) xmlFree(uri->scheme); - uri->scheme = NULL; - if (uri->server != NULL) xmlFree(uri->server); - uri->server = NULL; - if (uri->user != NULL) xmlFree(uri->user); - uri->user = NULL; - if (uri->path != NULL) xmlFree(uri->path); - uri->path = NULL; - if (uri->fragment != NULL) xmlFree(uri->fragment); - uri->fragment = NULL; - if (uri->opaque != NULL) xmlFree(uri->opaque); - uri->opaque = NULL; - if (uri->authority != NULL) xmlFree(uri->authority); - uri->authority = NULL; - if (uri->query != NULL) xmlFree(uri->query); - uri->query = NULL; -} - -/** - * xmlFreeURI: - * @uri: pointer to an xmlURI - * - * Free up the xmlURI struct - */ -void -xmlFreeURI(xmlURIPtr uri) { - if (uri == NULL) return; - - if (uri->scheme != NULL) xmlFree(uri->scheme); - if (uri->server != NULL) xmlFree(uri->server); - if (uri->user != NULL) xmlFree(uri->user); - if (uri->path != NULL) xmlFree(uri->path); - if (uri->fragment != NULL) xmlFree(uri->fragment); - if (uri->opaque != NULL) xmlFree(uri->opaque); - if (uri->authority != NULL) xmlFree(uri->authority); - if (uri->query != NULL) xmlFree(uri->query); - xmlFree(uri); -} - -/************************************************************************ - * * - * Helper functions * - * * - ************************************************************************/ - -/** - * xmlNormalizeURIPath: - * @path: pointer to the path string - * - * Applies the 5 normalization steps to a path string--that is, RFC 2396 - * Section 5.2, steps 6.c through 6.g. - * - * Normalization occurs directly on the string, no new allocation is done - * - * Returns 0 or an error code - */ -int -xmlNormalizeURIPath(char *path) { - char *cur, *out; - - if (path == NULL) - return(-1); - - /* Skip all initial "/" chars. We want to get to the beginning of the - * first non-empty segment. - */ - cur = path; - while (cur[0] == '/') - ++cur; - if (cur[0] == '\0') - return(0); - - /* Keep everything we've seen so far. */ - out = cur; - - /* - * Analyze each segment in sequence for cases (c) and (d). - */ - while (cur[0] != '\0') { - /* - * c) All occurrences of "./", where "." is a complete path segment, - * are removed from the buffer string. - */ - if ((cur[0] == '.') && (cur[1] == '/')) { - cur += 2; - /* '//' normalization should be done at this point too */ - while (cur[0] == '/') - cur++; - continue; - } - - /* - * d) If the buffer string ends with "." as a complete path segment, - * that "." is removed. - */ - if ((cur[0] == '.') && (cur[1] == '\0')) - break; - - /* Otherwise keep the segment. */ - while (cur[0] != '/') { - if (cur[0] == '\0') - goto done_cd; - (out++)[0] = (cur++)[0]; - } - /* nomalize // */ - while ((cur[0] == '/') && (cur[1] == '/')) - cur++; - - (out++)[0] = (cur++)[0]; - } - done_cd: - out[0] = '\0'; - - /* Reset to the beginning of the first segment for the next sequence. */ - cur = path; - while (cur[0] == '/') - ++cur; - if (cur[0] == '\0') - return(0); - - /* - * Analyze each segment in sequence for cases (e) and (f). - * - * e) All occurrences of "<segment>/../", where <segment> is a - * complete path segment not equal to "..", are removed from the - * buffer string. Removal of these path segments is performed - * iteratively, removing the leftmost matching pattern on each - * iteration, until no matching pattern remains. - * - * f) If the buffer string ends with "<segment>/..", where <segment> - * is a complete path segment not equal to "..", that - * "<segment>/.." is removed. - * - * To satisfy the "iterative" clause in (e), we need to collapse the - * string every time we find something that needs to be removed. Thus, - * we don't need to keep two pointers into the string: we only need a - * "current position" pointer. - */ - while (1) { - char *segp, *tmp; - - /* At the beginning of each iteration of this loop, "cur" points to - * the first character of the segment we want to examine. - */ - - /* Find the end of the current segment. */ - segp = cur; - while ((segp[0] != '/') && (segp[0] != '\0')) - ++segp; - - /* If this is the last segment, we're done (we need at least two - * segments to meet the criteria for the (e) and (f) cases). - */ - if (segp[0] == '\0') - break; - - /* If the first segment is "..", or if the next segment _isn't_ "..", - * keep this segment and try the next one. - */ - ++segp; - if (((cur[0] == '.') && (cur[1] == '.') && (segp == cur+3)) - || ((segp[0] != '.') || (segp[1] != '.') - || ((segp[2] != '/') && (segp[2] != '\0')))) { - cur = segp; - continue; - } - - /* If we get here, remove this segment and the next one and back up - * to the previous segment (if there is one), to implement the - * "iteratively" clause. It's pretty much impossible to back up - * while maintaining two pointers into the buffer, so just compact - * the whole buffer now. - */ - - /* If this is the end of the buffer, we're done. */ - if (segp[2] == '\0') { - cur[0] = '\0'; - break; - } - /* Valgrind complained, strcpy(cur, segp + 3); */ - /* string will overlap, do not use strcpy */ - tmp = cur; - segp += 3; - while ((*tmp++ = *segp++) != 0); - - /* If there are no previous segments, then keep going from here. */ - segp = cur; - while ((segp > path) && ((--segp)[0] == '/')) - ; - if (segp == path) - continue; - - /* "segp" is pointing to the end of a previous segment; find it's - * start. We need to back up to the previous segment and start - * over with that to handle things like "foo/bar/../..". If we - * don't do this, then on the first pass we'll remove the "bar/..", - * but be pointing at the second ".." so we won't realize we can also - * remove the "foo/..". - */ - cur = segp; - while ((cur > path) && (cur[-1] != '/')) - --cur; - } - out[0] = '\0'; - - /* - * g) If the resulting buffer string still begins with one or more - * complete path segments of "..", then the reference is - * considered to be in error. Implementations may handle this - * error by retaining these components in the resolved path (i.e., - * treating them as part of the final URI), by removing them from - * the resolved path (i.e., discarding relative levels above the - * root), or by avoiding traversal of the reference. - * - * We discard them from the final path. - */ - if (path[0] == '/') { - cur = path; - while ((cur[0] == '/') && (cur[1] == '.') && (cur[2] == '.') - && ((cur[3] == '/') || (cur[3] == '\0'))) - cur += 3; - - if (cur != path) { - out = path; - while (cur[0] != '\0') - (out++)[0] = (cur++)[0]; - out[0] = 0; - } - } - - return(0); -} - -static int is_hex(char c) { - if (((c >= '0') && (c <= '9')) || - ((c >= 'a') && (c <= 'f')) || - ((c >= 'A') && (c <= 'F'))) - return(1); - return(0); -} - -/** - * xmlURIUnescapeString: - * @str: the string to unescape - * @len: the length in bytes to unescape (or <= 0 to indicate full string) - * @target: optional destination buffer - * - * Unescaping routine, does not do validity checks ! - * Output is direct unsigned char translation of %XX values (no encoding) - * - * Returns an copy of the string, but unescaped - */ -char * -xmlURIUnescapeString(const char *str, int len, char *target) { - char *ret, *out; - const char *in; - - if (str == NULL) - return(NULL); - if (len <= 0) len = strlen(str); - if (len < 0) return(NULL); - - if (target == NULL) { - ret = (char *) xmlMallocAtomic(len + 1); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlURIUnescapeString: out of memory\n"); - return(NULL); - } - } else - ret = target; - in = str; - out = ret; - while(len > 0) { - if ((len > 2) && (*in == '%') && (is_hex(in[1])) && (is_hex(in[2]))) { - in++; - if ((*in >= '0') && (*in <= '9')) - *out = (*in - '0'); - else if ((*in >= 'a') && (*in <= 'f')) - *out = (*in - 'a') + 10; - else if ((*in >= 'A') && (*in <= 'F')) - *out = (*in - 'A') + 10; - in++; - if ((*in >= '0') && (*in <= '9')) - *out = *out * 16 + (*in - '0'); - else if ((*in >= 'a') && (*in <= 'f')) - *out = *out * 16 + (*in - 'a') + 10; - else if ((*in >= 'A') && (*in <= 'F')) - *out = *out * 16 + (*in - 'A') + 10; - in++; - len -= 3; - out++; - } else { - *out++ = *in++; - len--; - } - } - *out = 0; - return(ret); -} - -/** - * xmlURIEscapeStr: - * @str: string to escape - * @list: exception list string of chars not to escape - * - * This routine escapes a string to hex, ignoring reserved characters (a-z) - * and the characters in the exception list. - * - * Returns a new escaped string or NULL in case of error. - */ -xmlChar * -xmlURIEscapeStr(const xmlChar *str, const xmlChar *list) { - xmlChar *ret, ch; - const xmlChar *in; - - unsigned int len, out; - - if (str == NULL) - return(NULL); - if (str[0] == 0) - return(xmlStrdup(str)); - len = xmlStrlen(str); - if (!(len > 0)) return(NULL); - - len += 20; - ret = (xmlChar *) xmlMallocAtomic(len); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlURIEscapeStr: out of memory\n"); - return(NULL); - } - in = (const xmlChar *) str; - out = 0; - while(*in != 0) { - if (len - out <= 3) { - len += 20; - ret = (xmlChar *) xmlRealloc(ret, len); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlURIEscapeStr: out of memory\n"); - return(NULL); - } - } - - ch = *in; - - if ((ch != '@') && (!IS_UNRESERVED(ch)) && (!xmlStrchr(list, ch))) { - unsigned char val; - ret[out++] = '%'; - val = ch >> 4; - if (val <= 9) - ret[out++] = '0' + val; - else - ret[out++] = 'A' + val - 0xA; - val = ch & 0xF; - if (val <= 9) - ret[out++] = '0' + val; - else - ret[out++] = 'A' + val - 0xA; - in++; - } else { - ret[out++] = *in++; - } - - } - ret[out] = 0; - return(ret); -} - -/** - * xmlURIEscape: - * @str: the string of the URI to escape - * - * Escaping routine, does not do validity checks ! - * It will try to escape the chars needing this, but this is heuristic - * based it's impossible to be sure. - * - * Returns an copy of the string, but escaped - * - * 25 May 2001 - * Uses xmlParseURI and xmlURIEscapeStr to try to escape correctly - * according to RFC2396. - * - Carl Douglas - */ -xmlChar * -xmlURIEscape(const xmlChar * str) -{ - xmlChar *ret, *segment = NULL; - xmlURIPtr uri; - int ret2; - -#define NULLCHK(p) if(!p) { \ - xmlGenericError(xmlGenericErrorContext, \ - "xmlURIEscape: out of memory\n"); \ - return NULL; } - - if (str == NULL) - return (NULL); - - uri = xmlCreateURI(); - if (uri != NULL) { - /* - * Allow escaping errors in the unescaped form - */ - uri->cleanup = 1; - ret2 = xmlParseURIReference(uri, (const char *)str); - if (ret2) { - xmlFreeURI(uri); - return (NULL); - } - } - - if (!uri) - return NULL; - - ret = NULL; - - if (uri->scheme) { - segment = xmlURIEscapeStr(BAD_CAST uri->scheme, BAD_CAST "+-."); - NULLCHK(segment) - ret = xmlStrcat(ret, segment); - ret = xmlStrcat(ret, BAD_CAST ":"); - xmlFree(segment); - } - - if (uri->authority) { - segment = - xmlURIEscapeStr(BAD_CAST uri->authority, BAD_CAST "/?;:@"); - NULLCHK(segment) - ret = xmlStrcat(ret, BAD_CAST "//"); - ret = xmlStrcat(ret, segment); - xmlFree(segment); - } - - if (uri->user) { - segment = xmlURIEscapeStr(BAD_CAST uri->user, BAD_CAST ";:&=+$,"); - NULLCHK(segment) - ret = xmlStrcat(ret,BAD_CAST "//"); - ret = xmlStrcat(ret, segment); - ret = xmlStrcat(ret, BAD_CAST "@"); - xmlFree(segment); - } - - if (uri->server) { - segment = xmlURIEscapeStr(BAD_CAST uri->server, BAD_CAST "/?;:@"); - NULLCHK(segment) - if (uri->user == NULL) - ret = xmlStrcat(ret, BAD_CAST "//"); - ret = xmlStrcat(ret, segment); - xmlFree(segment); - } - - if (uri->port) { - xmlChar port[10]; - - snprintf((char *) port, 10, "%d", uri->port); - ret = xmlStrcat(ret, BAD_CAST ":"); - ret = xmlStrcat(ret, port); - } - - if (uri->path) { - segment = - xmlURIEscapeStr(BAD_CAST uri->path, BAD_CAST ":@&=+$,/?;"); - NULLCHK(segment) - ret = xmlStrcat(ret, segment); - xmlFree(segment); - } - - if (uri->query) { - segment = - xmlURIEscapeStr(BAD_CAST uri->query, BAD_CAST ";/?:@&=+,$"); - NULLCHK(segment) - ret = xmlStrcat(ret, BAD_CAST "?"); - ret = xmlStrcat(ret, segment); - xmlFree(segment); - } - - if (uri->opaque) { - segment = xmlURIEscapeStr(BAD_CAST uri->opaque, BAD_CAST ""); - NULLCHK(segment) - ret = xmlStrcat(ret, segment); - xmlFree(segment); - } - - if (uri->fragment) { - segment = xmlURIEscapeStr(BAD_CAST uri->fragment, BAD_CAST "#"); - NULLCHK(segment) - ret = xmlStrcat(ret, BAD_CAST "#"); - ret = xmlStrcat(ret, segment); - xmlFree(segment); - } - - xmlFreeURI(uri); -#undef NULLCHK - - return (ret); -} - -/************************************************************************ - * * - * Escaped URI parsing * - * * - ************************************************************************/ - -/** - * xmlParseURIFragment: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse an URI fragment string and fills in the appropriate fields - * of the @uri structure. - * - * fragment = *uric - * - * Returns 0 or the error code - */ -static int -xmlParseURIFragment(xmlURIPtr uri, const char **str) -{ - const char *cur; - - if (str == NULL) - return (-1); - - cur = *str; - - while (IS_URIC(cur) || IS_UNWISE(cur)) - NEXT(cur); - if (uri != NULL) { - if (uri->fragment != NULL) - xmlFree(uri->fragment); - if (uri->cleanup & 2) - uri->fragment = STRNDUP(*str, cur - *str); - else - uri->fragment = xmlURIUnescapeString(*str, cur - *str, NULL); - } - *str = cur; - return (0); -} - -/** - * xmlParseURIQuery: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse the query part of an URI - * - * query = *uric - * - * Returns 0 or the error code - */ -static int -xmlParseURIQuery(xmlURIPtr uri, const char **str) -{ - const char *cur; - - if (str == NULL) - return (-1); - - cur = *str; - - while ((IS_URIC(cur)) || - ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) - NEXT(cur); - if (uri != NULL) { - if (uri->query != NULL) - xmlFree(uri->query); - if (uri->cleanup & 2) - uri->query = STRNDUP(*str, cur - *str); - else - uri->query = xmlURIUnescapeString(*str, cur - *str, NULL); - } - *str = cur; - return (0); -} - -/** - * xmlParseURIScheme: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse an URI scheme - * - * scheme = alpha *( alpha | digit | "+" | "-" | "." ) - * - * Returns 0 or the error code - */ -static int -xmlParseURIScheme(xmlURIPtr uri, const char **str) { - const char *cur; - - if (str == NULL) - return(-1); - - cur = *str; - if (!IS_ALPHA(*cur)) - return(2); - cur++; - while (IS_SCHEME(*cur)) cur++; - if (uri != NULL) { - if (uri->scheme != NULL) xmlFree(uri->scheme); - uri->scheme = STRNDUP(*str, cur - *str); - } - *str = cur; - return(0); -} - -/** - * xmlParseURIOpaquePart: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse an URI opaque part - * - * opaque_part = uric_no_slash *uric - * - * Returns 0 or the error code - */ -static int -xmlParseURIOpaquePart(xmlURIPtr uri, const char **str) -{ - const char *cur; - - if (str == NULL) - return (-1); - - cur = *str; - if (!((IS_URIC_NO_SLASH(cur)) || - ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur))))) { - return (3); - } - NEXT(cur); - while ((IS_URIC(cur)) || - ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) - NEXT(cur); - if (uri != NULL) { - if (uri->opaque != NULL) - xmlFree(uri->opaque); - if (uri->cleanup & 2) - uri->opaque = STRNDUP(*str, cur - *str); - else - uri->opaque = xmlURIUnescapeString(*str, cur - *str, NULL); - } - *str = cur; - return (0); -} - -/** - * xmlParseURIServer: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse a server subpart of an URI, it's a finer grain analysis - * of the authority part. - * - * server = [ [ userinfo "@" ] hostport ] - * userinfo = *( unreserved | escaped | - * ";" | ":" | "&" | "=" | "+" | "$" | "," ) - * hostport = host [ ":" port ] - * host = hostname | IPv4address | IPv6reference - * hostname = *( domainlabel "." ) toplabel [ "." ] - * domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum - * toplabel = alpha | alpha *( alphanum | "-" ) alphanum - * IPv6reference = "[" IPv6address "]" - * IPv6address = hexpart [ ":" IPv4address ] - * IPv4address = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit - * hexpart = hexseq | hexseq "::" [ hexseq ]| "::" [ hexseq ] - * hexseq = hex4 *( ":" hex4) - * hex4 = 1*4hexdig - * port = *digit - * - * Returns 0 or the error code - */ -static int -xmlParseURIServer(xmlURIPtr uri, const char **str) { - const char *cur; - const char *host, *tmp; - const int IPV4max = 4; - const int IPV6max = 8; - int oct; - - if (str == NULL) - return(-1); - - cur = *str; - - /* - * is there a userinfo ? - */ - while (IS_USERINFO(cur)) NEXT(cur); - if (*cur == '@') { - if (uri != NULL) { - if (uri->user != NULL) xmlFree(uri->user); - if (uri->cleanup & 2) - uri->path = STRNDUP(*str, cur - *str); - else - uri->user = xmlURIUnescapeString(*str, cur - *str, NULL); - } - cur++; - } else { - if (uri != NULL) { - if (uri->user != NULL) xmlFree(uri->user); - uri->user = NULL; - } - cur = *str; - } - /* - * This can be empty in the case where there is no server - */ - host = cur; - if (*cur == '/') { - if (uri != NULL) { - if (uri->authority != NULL) xmlFree(uri->authority); - uri->authority = NULL; - if (uri->server != NULL) xmlFree(uri->server); - uri->server = NULL; - uri->port = 0; - } - return(0); - } - /* - * host part of hostport can denote an IPV4 address, an IPV6 address - * or an unresolved name. Check the IP first, its easier to detect - * errors if wrong one. - * An IPV6 address must start with a '[' and end with a ']'. - */ - if (*cur == '[') { - int compress=0; - cur++; - for (oct = 0; oct < IPV6max; ++oct) { - if (*cur == ':') { - if (compress) - return(3); /* multiple compression attempted */ - if (!oct) { /* initial char is compression */ - if (*++cur != ':') - return(3); - } - compress = 1; /* set compression-encountered flag */ - cur++; /* skip over the second ':' */ - continue; - } - while(IS_HEX(*cur)) cur++; - if (oct == (IPV6max-1)) - continue; - if (*cur != ':') - break; - cur++; - } - if ((!compress) && (oct != IPV6max)) - return(3); - if (*cur != ']') - return(3); - if (uri != NULL) { - if (uri->server != NULL) xmlFree(uri->server); - uri->server = (char *)xmlStrndup((xmlChar *)host+1, - (cur-host)-1); - } - cur++; - } else { - /* - * Not IPV6, maybe IPV4 - */ - for (oct = 0; oct < IPV4max; ++oct) { - if (*cur == '.') - return(3); /* e.g. http://.xml/ or http://18.29..30/ */ - while(IS_DIGIT(*cur)) cur++; - if (oct == (IPV4max-1)) - continue; - if (*cur != '.') - break; - cur++; - } - } - if ((host[0] != '[') && (oct < IPV4max || (*cur == '.' && cur++) || - IS_ALPHA(*cur))) { - /* maybe host_name */ - if (!IS_ALPHANUM(*cur)) - return(4); /* e.g. http://xml.$oft */ - do { - do ++cur; while (IS_ALPHANUM(*cur)); - if (*cur == '-') { - --cur; - if (*cur == '.') - return(5); /* e.g. http://xml.-soft */ - ++cur; - continue; - } - if (*cur == '.') { - --cur; - if (*cur == '-') - return(6); /* e.g. http://xml-.soft */ - if (*cur == '.') - return(7); /* e.g. http://xml..soft */ - ++cur; - continue; - } - break; - } while (1); - tmp = cur; - if (tmp[-1] == '.') - --tmp; /* e.g. http://xml.$Oft/ */ - do --tmp; while (tmp >= host && IS_ALPHANUM(*tmp)); - if ((++tmp == host || tmp[-1] == '.') && !IS_ALPHA(*tmp)) - return(8); /* e.g. http://xmlsOft.0rg/ */ - } - if (uri != NULL) { - if (uri->authority != NULL) xmlFree(uri->authority); - uri->authority = NULL; - if (host[0] != '[') { /* it's not an IPV6 addr */ - if (uri->server != NULL) xmlFree(uri->server); - if (uri->cleanup & 2) - uri->server = STRNDUP(host, cur - host); - else - uri->server = xmlURIUnescapeString(host, cur - host, NULL); - } - } - /* - * finish by checking for a port presence. - */ - if (*cur == ':') { - cur++; - if (IS_DIGIT(*cur)) { - if (uri != NULL) - uri->port = 0; - while (IS_DIGIT(*cur)) { - if (uri != NULL) - uri->port = uri->port * 10 + (*cur - '0'); - cur++; - } - } - } - *str = cur; - return(0); -} - -/** - * xmlParseURIRelSegment: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse an URI relative segment - * - * rel_segment = 1*( unreserved | escaped | ";" | "@" | "&" | "=" | - * "+" | "$" | "," ) - * - * Returns 0 or the error code - */ -static int -xmlParseURIRelSegment(xmlURIPtr uri, const char **str) -{ - const char *cur; - - if (str == NULL) - return (-1); - - cur = *str; - if (!((IS_SEGMENT(cur)) || - ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur))))) { - return (3); - } - NEXT(cur); - while ((IS_SEGMENT(cur)) || - ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) - NEXT(cur); - if (uri != NULL) { - if (uri->path != NULL) - xmlFree(uri->path); - if (uri->cleanup & 2) - uri->path = STRNDUP(*str, cur - *str); - else - uri->path = xmlURIUnescapeString(*str, cur - *str, NULL); - } - *str = cur; - return (0); -} - -/** - * xmlParseURIPathSegments: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * @slash: should we add a leading slash - * - * Parse an URI set of path segments - * - * path_segments = segment *( "/" segment ) - * segment = *pchar *( ";" param ) - * param = *pchar - * - * Returns 0 or the error code - */ -static int -xmlParseURIPathSegments(xmlURIPtr uri, const char **str, int slash) -{ - const char *cur; - - if (str == NULL) - return (-1); - - cur = *str; - - do { - while ((IS_PCHAR(cur)) || - ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) - NEXT(cur); - while (*cur == ';') { - cur++; - while ((IS_PCHAR(cur)) || - ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) - NEXT(cur); - } - if (*cur != '/') - break; - cur++; - } while (1); - if (uri != NULL) { - int len, len2 = 0; - char *path; - - /* - * Concat the set of path segments to the current path - */ - len = cur - *str; - if (slash) - len++; - - if (uri->path != NULL) { - len2 = strlen(uri->path); - len += len2; - } - path = (char *) xmlMallocAtomic(len + 1); - if (path == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlParseURIPathSegments: out of memory\n"); - *str = cur; - return (-1); - } - if (uri->path != NULL) - memcpy(path, uri->path, len2); - if (slash) { - path[len2] = '/'; - len2++; - } - path[len2] = 0; - if (cur - *str > 0) { - if (uri->cleanup & 2) { - memcpy(&path[len2], *str, cur - *str); - path[len2 + (cur - *str)] = 0; - } else - xmlURIUnescapeString(*str, cur - *str, &path[len2]); - } - if (uri->path != NULL) - xmlFree(uri->path); - uri->path = path; - } - *str = cur; - return (0); -} - -/** - * xmlParseURIAuthority: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse the authority part of an URI. - * - * authority = server | reg_name - * server = [ [ userinfo "@" ] hostport ] - * reg_name = 1*( unreserved | escaped | "$" | "," | ";" | ":" | - * "@" | "&" | "=" | "+" ) - * - * Note : this is completely ambiguous since reg_name is allowed to - * use the full set of chars in use by server: - * - * 3.2.1. Registry-based Naming Authority - * - * The structure of a registry-based naming authority is specific - * to the URI scheme, but constrained to the allowed characters - * for an authority component. - * - * Returns 0 or the error code - */ -static int -xmlParseURIAuthority(xmlURIPtr uri, const char **str) { - const char *cur; - int ret; - - if (str == NULL) - return(-1); - - cur = *str; - - /* - * try first to parse it as a server string. - */ - ret = xmlParseURIServer(uri, str); - if ((ret == 0) && (*str != NULL) && - ((**str == 0) || (**str == '/') || (**str == '?'))) - return(0); - *str = cur; - - /* - * failed, fallback to reg_name - */ - if (!IS_REG_NAME(cur)) { - return(5); - } - NEXT(cur); - while (IS_REG_NAME(cur)) NEXT(cur); - if (uri != NULL) { - if (uri->server != NULL) xmlFree(uri->server); - uri->server = NULL; - if (uri->user != NULL) xmlFree(uri->user); - uri->user = NULL; - if (uri->authority != NULL) xmlFree(uri->authority); - if (uri->cleanup & 2) - uri->authority = STRNDUP(*str, cur - *str); - else - uri->authority = xmlURIUnescapeString(*str, cur - *str, NULL); - } - *str = cur; - return(0); -} - -/** - * xmlParseURIHierPart: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse an URI hierarchical part - * - * hier_part = ( net_path | abs_path ) [ "?" query ] - * abs_path = "/" path_segments - * net_path = "//" authority [ abs_path ] - * - * Returns 0 or the error code - */ -static int -xmlParseURIHierPart(xmlURIPtr uri, const char **str) { - int ret; - const char *cur; - - if (str == NULL) - return(-1); - - cur = *str; - - if ((cur[0] == '/') && (cur[1] == '/')) { - cur += 2; - ret = xmlParseURIAuthority(uri, &cur); - if (ret != 0) - return(ret); - if (cur[0] == '/') { - cur++; - ret = xmlParseURIPathSegments(uri, &cur, 1); - } - } else if (cur[0] == '/') { - cur++; - ret = xmlParseURIPathSegments(uri, &cur, 1); - } else { - return(4); - } - if (ret != 0) - return(ret); - if (*cur == '?') { - cur++; - ret = xmlParseURIQuery(uri, &cur); - if (ret != 0) - return(ret); - } - *str = cur; - return(0); -} - -/** - * xmlParseAbsoluteURI: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse an URI reference string and fills in the appropriate fields - * of the @uri structure - * - * absoluteURI = scheme ":" ( hier_part | opaque_part ) - * - * Returns 0 or the error code - */ -static int -xmlParseAbsoluteURI(xmlURIPtr uri, const char **str) { - int ret; - const char *cur; - - if (str == NULL) - return(-1); - - cur = *str; - - ret = xmlParseURIScheme(uri, str); - if (ret != 0) return(ret); - if (**str != ':') { - *str = cur; - return(1); - } - (*str)++; - if (**str == '/') - return(xmlParseURIHierPart(uri, str)); - return(xmlParseURIOpaquePart(uri, str)); -} - -/** - * xmlParseRelativeURI: - * @uri: pointer to an URI structure - * @str: pointer to the string to analyze - * - * Parse an relative URI string and fills in the appropriate fields - * of the @uri structure - * - * relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ] - * abs_path = "/" path_segments - * net_path = "//" authority [ abs_path ] - * rel_path = rel_segment [ abs_path ] - * - * Returns 0 or the error code - */ -static int -xmlParseRelativeURI(xmlURIPtr uri, const char **str) { - int ret = 0; - const char *cur; - - if (str == NULL) - return(-1); - - cur = *str; - if ((cur[0] == '/') && (cur[1] == '/')) { - cur += 2; - ret = xmlParseURIAuthority(uri, &cur); - if (ret != 0) - return(ret); - if (cur[0] == '/') { - cur++; - ret = xmlParseURIPathSegments(uri, &cur, 1); - } - } else if (cur[0] == '/') { - cur++; - ret = xmlParseURIPathSegments(uri, &cur, 1); - } else if (cur[0] != '#' && cur[0] != '?') { - ret = xmlParseURIRelSegment(uri, &cur); - if (ret != 0) - return(ret); - if (cur[0] == '/') { - cur++; - ret = xmlParseURIPathSegments(uri, &cur, 1); - } - } - if (ret != 0) - return(ret); - if (*cur == '?') { - cur++; - ret = xmlParseURIQuery(uri, &cur); - if (ret != 0) - return(ret); - } - *str = cur; - return(ret); -} - -/** - * xmlParseURIReference: - * @uri: pointer to an URI structure - * @str: the string to analyze - * - * Parse an URI reference string and fills in the appropriate fields - * of the @uri structure - * - * URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] - * - * Returns 0 or the error code - */ -int -xmlParseURIReference(xmlURIPtr uri, const char *str) { - int ret; - const char *tmp = str; - - if (str == NULL) - return(-1); - xmlCleanURI(uri); - - /* - * Try first to parse absolute refs, then fallback to relative if - * it fails. - */ - ret = xmlParseAbsoluteURI(uri, &str); - if (ret != 0) { - xmlCleanURI(uri); - str = tmp; - ret = xmlParseRelativeURI(uri, &str); - } - if (ret != 0) { - xmlCleanURI(uri); - return(ret); - } - - if (*str == '#') { - str++; - ret = xmlParseURIFragment(uri, &str); - if (ret != 0) return(ret); - } - if (*str != 0) { - xmlCleanURI(uri); - return(1); - } - return(0); -} - -/** - * xmlParseURI: - * @str: the URI string to analyze - * - * Parse an URI - * - * URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] - * - * Returns a newly built xmlURIPtr or NULL in case of error - */ -xmlURIPtr -xmlParseURI(const char *str) { - xmlURIPtr uri; - int ret; - - if (str == NULL) - return(NULL); - uri = xmlCreateURI(); - if (uri != NULL) { - ret = xmlParseURIReference(uri, str); - if (ret) { - xmlFreeURI(uri); - return(NULL); - } - } - return(uri); -} - -/** - * xmlParseURIRaw: - * @str: the URI string to analyze - * @raw: if 1 unescaping of URI pieces are disabled - * - * Parse an URI but allows to keep intact the original fragments. - * - * URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] - * - * Returns a newly built xmlURIPtr or NULL in case of error - */ -xmlURIPtr -xmlParseURIRaw(const char *str, int raw) { - xmlURIPtr uri; - int ret; - - if (str == NULL) - return(NULL); - uri = xmlCreateURI(); - if (uri != NULL) { - if (raw) { - uri->cleanup |= 2; - } - ret = xmlParseURIReference(uri, str); - if (ret) { - xmlFreeURI(uri); - return(NULL); - } - } - return(uri); -} - -/************************************************************************ - * * - * Public functions * - * * - ************************************************************************/ - -/** - * xmlBuildURI: - * @URI: the URI instance found in the document - * @base: the base value - * - * Computes he final URI of the reference done by checking that - * the given URI is valid, and building the final URI using the - * base URI. This is processed according to section 5.2 of the - * RFC 2396 - * - * 5.2. Resolving Relative References to Absolute Form - * - * Returns a new URI string (to be freed by the caller) or NULL in case - * of error. - */ -xmlChar * -xmlBuildURI(const xmlChar *URI, const xmlChar *base) { - xmlChar *val = NULL; - int ret, len, indx, cur, out; - xmlURIPtr ref = NULL; - xmlURIPtr bas = NULL; - xmlURIPtr res = NULL; - - /* - * 1) The URI reference is parsed into the potential four components and - * fragment identifier, as described in Section 4.3. - * - * NOTE that a completely empty URI is treated by modern browsers - * as a reference to "." rather than as a synonym for the current - * URI. Should we do that here? - */ - if (URI == NULL) - ret = -1; - else { - if (*URI) { - ref = xmlCreateURI(); - if (ref == NULL) - goto done; - ret = xmlParseURIReference(ref, (const char *) URI); - } - else - ret = 0; - } - if (ret != 0) - goto done; - if ((ref != NULL) && (ref->scheme != NULL)) { - /* - * The URI is absolute don't modify. - */ - val = xmlStrdup(URI); - goto done; - } - if (base == NULL) - ret = -1; - else { - bas = xmlCreateURI(); - if (bas == NULL) - goto done; - ret = xmlParseURIReference(bas, (const char *) base); - } - if (ret != 0) { - if (ref) - val = xmlSaveUri(ref); - goto done; - } - if (ref == NULL) { - /* - * the base fragment must be ignored - */ - if (bas->fragment != NULL) { - xmlFree(bas->fragment); - bas->fragment = NULL; - } - val = xmlSaveUri(bas); - goto done; - } - - /* - * 2) If the path component is empty and the scheme, authority, and - * query components are undefined, then it is a reference to the - * current document and we are done. Otherwise, the reference URI's - * query and fragment components are defined as found (or not found) - * within the URI reference and not inherited from the base URI. - * - * NOTE that in modern browsers, the parsing differs from the above - * in the following aspect: the query component is allowed to be - * defined while still treating this as a reference to the current - * document. - */ - res = xmlCreateURI(); - if (res == NULL) - goto done; - if ((ref->scheme == NULL) && (ref->path == NULL) && - ((ref->authority == NULL) && (ref->server == NULL))) { - if (bas->scheme != NULL) - res->scheme = xmlMemStrdup(bas->scheme); - if (bas->authority != NULL) - res->authority = xmlMemStrdup(bas->authority); - else if (bas->server != NULL) { - res->server = xmlMemStrdup(bas->server); - if (bas->user != NULL) - res->user = xmlMemStrdup(bas->user); - res->port = bas->port; - } - if (bas->path != NULL) - res->path = xmlMemStrdup(bas->path); - if (ref->query != NULL) - res->query = xmlMemStrdup(ref->query); - else if (bas->query != NULL) - res->query = xmlMemStrdup(bas->query); - if (ref->fragment != NULL) - res->fragment = xmlMemStrdup(ref->fragment); - goto step_7; - } - - /* - * 3) If the scheme component is defined, indicating that the reference - * starts with a scheme name, then the reference is interpreted as an - * absolute URI and we are done. Otherwise, the reference URI's - * scheme is inherited from the base URI's scheme component. - */ - if (ref->scheme != NULL) { - val = xmlSaveUri(ref); - goto done; - } - if (bas->scheme != NULL) - res->scheme = xmlMemStrdup(bas->scheme); - - if (ref->query != NULL) - res->query = xmlMemStrdup(ref->query); - if (ref->fragment != NULL) - res->fragment = xmlMemStrdup(ref->fragment); - - /* - * 4) If the authority component is defined, then the reference is a - * network-path and we skip to step 7. Otherwise, the reference - * URI's authority is inherited from the base URI's authority - * component, which will also be undefined if the URI scheme does not - * use an authority component. - */ - if ((ref->authority != NULL) || (ref->server != NULL)) { - if (ref->authority != NULL) - res->authority = xmlMemStrdup(ref->authority); - else { - res->server = xmlMemStrdup(ref->server); - if (ref->user != NULL) - res->user = xmlMemStrdup(ref->user); - res->port = ref->port; - } - if (ref->path != NULL) - res->path = xmlMemStrdup(ref->path); - goto step_7; - } - if (bas->authority != NULL) - res->authority = xmlMemStrdup(bas->authority); - else if (bas->server != NULL) { - res->server = xmlMemStrdup(bas->server); - if (bas->user != NULL) - res->user = xmlMemStrdup(bas->user); - res->port = bas->port; - } - - /* - * 5) If the path component begins with a slash character ("/"), then - * the reference is an absolute-path and we skip to step 7. - */ - if ((ref->path != NULL) && (ref->path[0] == '/')) { - res->path = xmlMemStrdup(ref->path); - goto step_7; - } - - - /* - * 6) If this step is reached, then we are resolving a relative-path - * reference. The relative path needs to be merged with the base - * URI's path. Although there are many ways to do this, we will - * describe a simple method using a separate string buffer. - * - * Allocate a buffer large enough for the result string. - */ - len = 2; /* extra / and 0 */ - if (ref->path != NULL) - len += strlen(ref->path); - if (bas->path != NULL) - len += strlen(bas->path); - res->path = (char *) xmlMallocAtomic(len); - if (res->path == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlBuildURI: out of memory\n"); - goto done; - } - res->path[0] = 0; - - /* - * a) All but the last segment of the base URI's path component is - * copied to the buffer. In other words, any characters after the - * last (right-most) slash character, if any, are excluded. - */ - cur = 0; - out = 0; - if (bas->path != NULL) { - while (bas->path[cur] != 0) { - while ((bas->path[cur] != 0) && (bas->path[cur] != '/')) - cur++; - if (bas->path[cur] == 0) - break; - - cur++; - while (out < cur) { - res->path[out] = bas->path[out]; - out++; - } - } - } - res->path[out] = 0; - - /* - * b) The reference's path component is appended to the buffer - * string. - */ - if (ref->path != NULL && ref->path[0] != 0) { - indx = 0; - /* - * Ensure the path includes a '/' - */ - if ((out == 0) && (bas->server != NULL)) - res->path[out++] = '/'; - while (ref->path[indx] != 0) { - res->path[out++] = ref->path[indx++]; - } - } - res->path[out] = 0; - - /* - * Steps c) to h) are really path normalization steps - */ - xmlNormalizeURIPath(res->path); - -step_7: - - /* - * 7) The resulting URI components, including any inherited from the - * base URI, are recombined to give the absolute form of the URI - * reference. - */ - val = xmlSaveUri(res); - -done: - if (ref != NULL) - xmlFreeURI(ref); - if (bas != NULL) - xmlFreeURI(bas); - if (res != NULL) - xmlFreeURI(res); - return(val); -} - -/** - * xmlBuildRelativeURI: - * @URI: the URI reference under consideration - * @base: the base value - * - * Expresses the URI of the reference in terms relative to the - * base. Some examples of this operation include: - * base = "http://site1.com/docs/book1.html" - * URI input URI returned - * docs/pic1.gif pic1.gif - * docs/img/pic1.gif img/pic1.gif - * img/pic1.gif ../img/pic1.gif - * http://site1.com/docs/pic1.gif pic1.gif - * http://site2.com/docs/pic1.gif http://site2.com/docs/pic1.gif - * - * base = "docs/book1.html" - * URI input URI returned - * docs/pic1.gif pic1.gif - * docs/img/pic1.gif img/pic1.gif - * img/pic1.gif ../img/pic1.gif - * http://site1.com/docs/pic1.gif http://site1.com/docs/pic1.gif - * - * - * Note: if the URI reference is really wierd or complicated, it may be - * worthwhile to first convert it into a "nice" one by calling - * xmlBuildURI (using 'base') before calling this routine, - * since this routine (for reasonable efficiency) assumes URI has - * already been through some validation. - * - * Returns a new URI string (to be freed by the caller) or NULL in case - * error. - */ -xmlChar * -xmlBuildRelativeURI (const xmlChar * URI, const xmlChar * base) -{ - xmlChar *val = NULL; - int ret; - int ix; - int pos = 0; - int nbslash = 0; - int len; - xmlURIPtr ref = NULL; - xmlURIPtr bas = NULL; - xmlChar *bptr, *uptr, *vptr; - int remove_path = 0; - - if ((URI == NULL) || (*URI == 0)) - return NULL; - - /* - * First parse URI into a standard form - */ - ref = xmlCreateURI (); - if (ref == NULL) - return NULL; - /* If URI not already in "relative" form */ - if (URI[0] != '.') { - ret = xmlParseURIReference (ref, (const char *) URI); - if (ret != 0) - goto done; /* Error in URI, return NULL */ - } else - ref->path = (char *)xmlStrdup(URI); - - /* - * Next parse base into the same standard form - */ - if ((base == NULL) || (*base == 0)) { - val = xmlStrdup (URI); - goto done; - } - bas = xmlCreateURI (); - if (bas == NULL) - goto done; - if (base[0] != '.') { - ret = xmlParseURIReference (bas, (const char *) base); - if (ret != 0) - goto done; /* Error in base, return NULL */ - } else - bas->path = (char *)xmlStrdup(base); - - /* - * If the scheme / server on the URI differs from the base, - * just return the URI - */ - if ((ref->scheme != NULL) && - ((bas->scheme == NULL) || - (xmlStrcmp ((xmlChar *)bas->scheme, (xmlChar *)ref->scheme)) || - (xmlStrcmp ((xmlChar *)bas->server, (xmlChar *)ref->server)))) { - val = xmlStrdup (URI); - goto done; - } - if (xmlStrEqual((xmlChar *)bas->path, (xmlChar *)ref->path)) { - val = xmlStrdup(BAD_CAST ""); - goto done; - } - if (bas->path == NULL) { - val = xmlStrdup((xmlChar *)ref->path); - goto done; - } - if (ref->path == NULL) { - ref->path = (char *) "/"; - remove_path = 1; - } - - /* - * At this point (at last!) we can compare the two paths - * - * First we take care of the special case where either of the - * two path components may be missing (bug 316224) - */ - if (bas->path == NULL) { - if (ref->path != NULL) { - uptr = (xmlChar *) ref->path; - if (*uptr == '/') - uptr++; - val = xmlStrdup(uptr); - } - goto done; - } - bptr = (xmlChar *)bas->path; - if (ref->path == NULL) { - for (ix = 0; bptr[ix] != 0; ix++) { - if (bptr[ix] == '/') - nbslash++; - } - uptr = NULL; - len = 1; /* this is for a string terminator only */ - } else { - /* - * Next we compare the two strings and find where they first differ - */ - if ((ref->path[pos] == '.') && (ref->path[pos+1] == '/')) - pos += 2; - if ((*bptr == '.') && (bptr[1] == '/')) - bptr += 2; - else if ((*bptr == '/') && (ref->path[pos] != '/')) - bptr++; - while ((bptr[pos] == ref->path[pos]) && (bptr[pos] != 0)) - pos++; - - if (bptr[pos] == ref->path[pos]) { - val = xmlStrdup(BAD_CAST ""); - goto done; /* (I can't imagine why anyone would do this) */ - } - - /* - * In URI, "back up" to the last '/' encountered. This will be the - * beginning of the "unique" suffix of URI - */ - ix = pos; - if ((ref->path[ix] == '/') && (ix > 0)) - ix--; - else if ((ref->path[ix] == 0) && (ix > 1) && (ref->path[ix - 1] == '/')) - ix -= 2; - for (; ix > 0; ix--) { - if (ref->path[ix] == '/') - break; - } - if (ix == 0) { - uptr = (xmlChar *)ref->path; - } else { - ix++; - uptr = (xmlChar *)&ref->path[ix]; - } - - /* - * In base, count the number of '/' from the differing point - */ - if (bptr[pos] != ref->path[pos]) {/* check for trivial URI == base */ - for (; bptr[ix] != 0; ix++) { - if (bptr[ix] == '/') - nbslash++; - } - } - len = xmlStrlen (uptr) + 1; - } - - if (nbslash == 0) { - if (uptr != NULL) - val = xmlStrdup (uptr); - goto done; - } - - /* - * Allocate just enough space for the returned string - - * length of the remainder of the URI, plus enough space - * for the "../" groups, plus one for the terminator - */ - val = (xmlChar *) xmlMalloc (len + 3 * nbslash); - if (val == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlBuildRelativeURI: out of memory\n"); - goto done; - } - vptr = val; - /* - * Put in as many "../" as needed - */ - for (; nbslash>0; nbslash--) { - *vptr++ = '.'; - *vptr++ = '.'; - *vptr++ = '/'; - } - /* - * Finish up with the end of the URI - */ - if (uptr != NULL) { - if ((vptr > val) && (len > 0) && - (uptr[0] == '/') && (vptr[-1] == '/')) { - memcpy (vptr, uptr + 1, len - 1); - vptr[len - 2] = 0; - } else { - memcpy (vptr, uptr, len); - vptr[len - 1] = 0; - } - } else { - vptr[len - 1] = 0; - } - -done: - /* - * Free the working variables - */ - if (remove_path != 0) - ref->path = NULL; - if (ref != NULL) - xmlFreeURI (ref); - if (bas != NULL) - xmlFreeURI (bas); - - return val; -} - -/** - * xmlCanonicPath: - * @path: the resource locator in a filesystem notation - * - * Constructs a canonic path from the specified path. - * - * Returns a new canonic path, or a duplicate of the path parameter if the - * construction fails. The caller is responsible for freeing the memory occupied - * by the returned string. If there is insufficient memory available, or the - * argument is NULL, the function returns NULL. - */ -#define IS_WINDOWS_PATH(p) \ - ((p != NULL) && \ - (((p[0] >= 'a') && (p[0] <= 'z')) || \ - ((p[0] >= 'A') && (p[0] <= 'Z'))) && \ - (p[1] == ':') && ((p[2] == '/') || (p[2] == '\\'))) -xmlChar * -xmlCanonicPath(const xmlChar *path) -{ -#if defined(_WIN32) && !defined(__CYGWIN__) - int len = 0; - /*int i = 0;*/ - xmlChar *p = NULL; -#endif - xmlURIPtr uri; - xmlChar *ret; - const xmlChar *absuri; - - if (path == NULL) - return(NULL); - if ((uri = xmlParseURI((const char *) path)) != NULL) { - xmlFreeURI(uri); - return xmlStrdup(path); - } - - absuri = xmlStrstr(path, BAD_CAST "://"); - if (absuri != NULL) { - int l, j; - unsigned char c; - xmlChar *escURI; - - /* - * this looks like an URI where some parts have not been - * escaped leading to a parsing problem check that the first - * part matches a protocol. - */ - l = absuri - path; - if ((l <= 0) || (l > 20)) - goto path_processing; - for (j = 0;j < l;j++) { - c = path[j]; - if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')))) - goto path_processing; - } - - escURI = xmlURIEscapeStr(path, BAD_CAST ":/?_.#&;="); - if (escURI != NULL) { - uri = xmlParseURI((const char *) escURI); - if (uri != NULL) { - xmlFreeURI(uri); - return escURI; - } - xmlFreeURI(uri); - } - } - -path_processing: -#if defined(_WIN32) && !defined(__CYGWIN__) - /* - * This really need to be cleaned up by someone with a Windows box - */ - uri = xmlCreateURI(); - if (uri == NULL) { - return(NULL); - } - - len = xmlStrlen(path); - if ((len > 2) && IS_WINDOWS_PATH(path)) { - uri->scheme = xmlStrdup(BAD_CAST "file"); - uri->path = xmlMallocAtomic(len + 2); - if (uri->path == NULL) { - xmlFreeURI(uri); - return(NULL); - } - uri->path[0] = '/'; - p = uri->path + 1; - strncpy(p, path, len + 1); - } else { - uri->path = xmlStrdup(path); - if (uri->path == NULL) { - xmlFreeURI(uri); - return(NULL); - } - p = uri->path; - } - while (*p != '\0') { - if (*p == '\\') - *p = '/'; - p++; - } - if (uri->path == NULL) { - xmlFreeURI(uri); - return(NULL); - } - - if (uri->scheme == NULL) { - ret = xmlStrdup((const xmlChar *) path); - } else { - ret = xmlSaveUri(uri); - } - - xmlFreeURI(uri); -#else - ret = xmlStrdup((const xmlChar *) path); -#endif - return(ret); -} - -/** - * xmlPathToURI: - * @path: the resource locator in a filesystem notation - * - * Constructs an URI expressing the existing path - * - * Returns a new URI, or a duplicate of the path parameter if the - * construction fails. The caller is responsible for freeing the memory - * occupied by the returned string. If there is insufficient memory available, - * or the argument is NULL, the function returns NULL. - */ -xmlChar * -xmlPathToURI(const xmlChar *path) -{ - xmlURIPtr uri; - xmlURI temp; - xmlChar *ret, *cal; - - if (path == NULL) - return(NULL); - - if ((uri = xmlParseURI((const char *) path)) != NULL) { - xmlFreeURI(uri); - return xmlStrdup(path); - } - cal = xmlCanonicPath(path); - if (cal == NULL) - return(NULL); - memset(&temp, 0, sizeof(temp)); - temp.path = (char *) cal; - ret = xmlSaveUri(&temp); - xmlFree(cal); - return(ret); -} -#define bottom_uri -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/valid.c b/ThirdParty/libxml2/vtklibxml2/valid.c deleted file mode 100644 index d6758598f1f..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/valid.c +++ /dev/null @@ -1,6955 +0,0 @@ -/* - * valid.c : part of the code use to do the DTD handling and the validity - * checking - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#include <libxml/xmlmemory.h> -#include <libxml/hash.h> -#include <libxml/uri.h> -#include <libxml/valid.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/xmlerror.h> -#include <libxml/list.h> -#include <libxml/globals.h> - -static xmlElementPtr xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, - int create); -/* #define DEBUG_VALID_ALGO */ -/* #define DEBUG_REGEXP_ALGO */ - -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -/************************************************************************ - * * - * Error handling routines * - * * - ************************************************************************/ - -/** - * xmlVErrMemory: - * @ctxt: an XML validation parser context - * @extra: extra informations - * - * Handle an out of memory error - */ -static void -xmlVErrMemory(xmlValidCtxtPtr ctxt, const char *extra) -{ - xmlGenericErrorFunc channel = NULL; - xmlParserCtxtPtr pctxt = NULL; - void *data = NULL; - - if (ctxt != NULL) { - channel = ctxt->error; - data = ctxt->userData; - /* Use the special values to detect if it is part of a parsing - context */ - if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || - (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { - long delta = (char *) ctxt - (char *) ctxt->userData; - if ((delta > 0) && (delta < 250)) - pctxt = ctxt->userData; - } - } - if (extra) - __xmlRaiseError(NULL, channel, data, - pctxt, NULL, XML_FROM_VALID, XML_ERR_NO_MEMORY, - XML_ERR_FATAL, NULL, 0, extra, NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); - else - __xmlRaiseError(NULL, channel, data, - pctxt, NULL, XML_FROM_VALID, XML_ERR_NO_MEMORY, - XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, - "Memory allocation failed\n"); -} - -/** - * xmlErrValid: - * @ctxt: an XML validation parser context - * @error: the error number - * @extra: extra informations - * - * Handle a validation error - */ -static void -xmlErrValid(xmlValidCtxtPtr ctxt, xmlParserErrors error, - const char *msg, const char *extra) -{ - xmlGenericErrorFunc channel = NULL; - xmlParserCtxtPtr pctxt = NULL; - void *data = NULL; - - if (ctxt != NULL) { - channel = ctxt->error; - data = ctxt->userData; - /* Use the special values to detect if it is part of a parsing - context */ - if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || - (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { - long delta = (char *) ctxt - (char *) ctxt->userData; - if ((delta > 0) && (delta < 250)) - pctxt = ctxt->userData; - } - } - if (extra) - __xmlRaiseError(NULL, channel, data, - pctxt, NULL, XML_FROM_VALID, error, - XML_ERR_ERROR, NULL, 0, extra, NULL, NULL, 0, 0, - msg, extra); - else - __xmlRaiseError(NULL, channel, data, - pctxt, NULL, XML_FROM_VALID, error, - XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, 0, 0, - msg); -} - -#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlErrValidNode: - * @ctxt: an XML validation parser context - * @node: the node raising the error - * @error: the error number - * @str1: extra informations - * @str2: extra informations - * @str3: extra informations - * - * Handle a validation error, provide contextual informations - */ -static void -xmlErrValidNode(xmlValidCtxtPtr ctxt, - xmlNodePtr node, xmlParserErrors error, - const char *msg, const xmlChar * str1, - const xmlChar * str2, const xmlChar * str3) -{ - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - xmlParserCtxtPtr pctxt = NULL; - void *data = NULL; - - if (ctxt != NULL) { - channel = ctxt->error; - data = ctxt->userData; - /* Use the special values to detect if it is part of a parsing - context */ - if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || - (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { - long delta = (char *) ctxt - (char *) ctxt->userData; - if ((delta > 0) && (delta < 250)) - pctxt = ctxt->userData; - } - } - __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, - XML_ERR_ERROR, NULL, 0, - (const char *) str1, - (const char *) str1, - (const char *) str3, 0, 0, msg, str1, str2, str3); -} -#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ - -#ifdef LIBXML_VALID_ENABLED -/** - * xmlErrValidNodeNr: - * @ctxt: an XML validation parser context - * @node: the node raising the error - * @error: the error number - * @str1: extra informations - * @int2: extra informations - * @str3: extra informations - * - * Handle a validation error, provide contextual informations - */ -static void -xmlErrValidNodeNr(xmlValidCtxtPtr ctxt, - xmlNodePtr node, xmlParserErrors error, - const char *msg, const xmlChar * str1, - int int2, const xmlChar * str3) -{ - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - xmlParserCtxtPtr pctxt = NULL; - void *data = NULL; - - if (ctxt != NULL) { - channel = ctxt->error; - data = ctxt->userData; - /* Use the special values to detect if it is part of a parsing - context */ - if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || - (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { - long delta = (char *) ctxt - (char *) ctxt->userData; - if ((delta > 0) && (delta < 250)) - pctxt = ctxt->userData; - } - } - __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, - XML_ERR_ERROR, NULL, 0, - (const char *) str1, - (const char *) str3, - NULL, int2, 0, msg, str1, int2, str3); -} - -/** - * xmlErrValidWarning: - * @ctxt: an XML validation parser context - * @node: the node raising the error - * @error: the error number - * @str1: extra information - * @str2: extra information - * @str3: extra information - * - * Handle a validation error, provide contextual information - */ -static void -xmlErrValidWarning(xmlValidCtxtPtr ctxt, - xmlNodePtr node, xmlParserErrors error, - const char *msg, const xmlChar * str1, - const xmlChar * str2, const xmlChar * str3) -{ - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - xmlParserCtxtPtr pctxt = NULL; - void *data = NULL; - - if (ctxt != NULL) { - channel = ctxt->warning; - data = ctxt->userData; - /* Use the special values to detect if it is part of a parsing - context */ - if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || - (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { - long delta = (char *) ctxt - (char *) ctxt->userData; - if ((delta > 0) && (delta < 250)) - pctxt = ctxt->userData; - } - } - __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, - XML_ERR_WARNING, NULL, 0, - (const char *) str1, - (const char *) str1, - (const char *) str3, 0, 0, msg, str1, str2, str3); -} - - - -#ifdef LIBXML_REGEXP_ENABLED -/* - * If regexp are enabled we can do continuous validation without the - * need of a tree to validate the content model. this is done in each - * callbacks. - * Each xmlValidState represent the validation state associated to the - * set of nodes currently open from the document root to the current element. - */ - - -typedef struct _xmlValidState { - xmlElementPtr elemDecl; /* pointer to the content model */ - xmlNodePtr node; /* pointer to the current node */ - xmlRegExecCtxtPtr exec; /* regexp runtime */ -} _xmlValidState; - - -static int -vstateVPush(xmlValidCtxtPtr ctxt, xmlElementPtr elemDecl, xmlNodePtr node) { - if ((ctxt->vstateMax == 0) || (ctxt->vstateTab == NULL)) { - ctxt->vstateMax = 10; - ctxt->vstateTab = (xmlValidState *) xmlMalloc(ctxt->vstateMax * - sizeof(ctxt->vstateTab[0])); - if (ctxt->vstateTab == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - return(-1); - } - } - - if (ctxt->vstateNr >= ctxt->vstateMax) { - xmlValidState *tmp; - - tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab, - 2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); - if (tmp == NULL) { - xmlVErrMemory(ctxt, "realloc failed"); - return(-1); - } - ctxt->vstateMax *= 2; - ctxt->vstateTab = tmp; - } - ctxt->vstate = &ctxt->vstateTab[ctxt->vstateNr]; - ctxt->vstateTab[ctxt->vstateNr].elemDecl = elemDecl; - ctxt->vstateTab[ctxt->vstateNr].node = node; - if ((elemDecl != NULL) && (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT)) { - if (elemDecl->contModel == NULL) - xmlValidBuildContentModel(ctxt, elemDecl); - if (elemDecl->contModel != NULL) { - ctxt->vstateTab[ctxt->vstateNr].exec = - xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL); - } else { - ctxt->vstateTab[ctxt->vstateNr].exec = NULL; - xmlErrValidNode(ctxt, (xmlNodePtr) elemDecl, - XML_ERR_INTERNAL_ERROR, - "Failed to build content model regexp for %s\n", - node->name, NULL, NULL); - } - } - return(ctxt->vstateNr++); -} - -static int -vstateVPop(xmlValidCtxtPtr ctxt) { - xmlElementPtr elemDecl; - - if (ctxt->vstateNr < 1) return(-1); - ctxt->vstateNr--; - elemDecl = ctxt->vstateTab[ctxt->vstateNr].elemDecl; - ctxt->vstateTab[ctxt->vstateNr].elemDecl = NULL; - ctxt->vstateTab[ctxt->vstateNr].node = NULL; - if ((elemDecl != NULL) && (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT)) { - xmlRegFreeExecCtxt(ctxt->vstateTab[ctxt->vstateNr].exec); - } - ctxt->vstateTab[ctxt->vstateNr].exec = NULL; - if (ctxt->vstateNr >= 1) - ctxt->vstate = &ctxt->vstateTab[ctxt->vstateNr - 1]; - else - ctxt->vstate = NULL; - return(ctxt->vstateNr); -} - -#else /* not LIBXML_REGEXP_ENABLED */ -/* - * If regexp are not enabled, it uses a home made algorithm less - * complex and easier to - * debug/maintain than a generic NFA -> DFA state based algo. The - * only restriction is on the deepness of the tree limited by the - * size of the occurs bitfield - * - * this is the content of a saved state for rollbacks - */ - -#define ROLLBACK_OR 0 -#define ROLLBACK_PARENT 1 - -typedef struct _xmlValidState { - xmlElementContentPtr cont; /* pointer to the content model subtree */ - xmlNodePtr node; /* pointer to the current node in the list */ - long occurs;/* bitfield for multiple occurrences */ - unsigned char depth; /* current depth in the overall tree */ - unsigned char state; /* ROLLBACK_XXX */ -} _xmlValidState; - -#define MAX_RECURSE 25000 -#define MAX_DEPTH ((sizeof(_xmlValidState.occurs)) * 8) -#define CONT ctxt->vstate->cont -#define NODE ctxt->vstate->node -#define DEPTH ctxt->vstate->depth -#define OCCURS ctxt->vstate->occurs -#define STATE ctxt->vstate->state - -#define OCCURRENCE (ctxt->vstate->occurs & (1 << DEPTH)) -#define PARENT_OCCURRENCE (ctxt->vstate->occurs & ((1 << DEPTH) - 1)) - -#define SET_OCCURRENCE ctxt->vstate->occurs |= (1 << DEPTH) -#define RESET_OCCURRENCE ctxt->vstate->occurs &= ((1 << DEPTH) - 1) - -static int -vstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont, - xmlNodePtr node, unsigned char depth, long occurs, - unsigned char state) { - int i = ctxt->vstateNr - 1; - - if (ctxt->vstateNr > MAX_RECURSE) { - return(-1); - } - if (ctxt->vstateTab == NULL) { - ctxt->vstateMax = 8; - ctxt->vstateTab = (xmlValidState *) xmlMalloc( - ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); - if (ctxt->vstateTab == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - return(-1); - } - } - if (ctxt->vstateNr >= ctxt->vstateMax) { - xmlValidState *tmp; - - tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab, - 2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); - if (tmp == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - return(-1); - } - ctxt->vstateMax *= 2; - ctxt->vstateTab = tmp; - ctxt->vstate = &ctxt->vstateTab[0]; - } - /* - * Don't push on the stack a state already here - */ - if ((i >= 0) && (ctxt->vstateTab[i].cont == cont) && - (ctxt->vstateTab[i].node == node) && - (ctxt->vstateTab[i].depth == depth) && - (ctxt->vstateTab[i].occurs == occurs) && - (ctxt->vstateTab[i].state == state)) - return(ctxt->vstateNr); - ctxt->vstateTab[ctxt->vstateNr].cont = cont; - ctxt->vstateTab[ctxt->vstateNr].node = node; - ctxt->vstateTab[ctxt->vstateNr].depth = depth; - ctxt->vstateTab[ctxt->vstateNr].occurs = occurs; - ctxt->vstateTab[ctxt->vstateNr].state = state; - return(ctxt->vstateNr++); -} - -static int -vstateVPop(xmlValidCtxtPtr ctxt) { - if (ctxt->vstateNr <= 1) return(-1); - ctxt->vstateNr--; - ctxt->vstate = &ctxt->vstateTab[0]; - ctxt->vstate->cont = ctxt->vstateTab[ctxt->vstateNr].cont; - ctxt->vstate->node = ctxt->vstateTab[ctxt->vstateNr].node; - ctxt->vstate->depth = ctxt->vstateTab[ctxt->vstateNr].depth; - ctxt->vstate->occurs = ctxt->vstateTab[ctxt->vstateNr].occurs; - ctxt->vstate->state = ctxt->vstateTab[ctxt->vstateNr].state; - return(ctxt->vstateNr); -} - -#endif /* LIBXML_REGEXP_ENABLED */ - -static int -nodeVPush(xmlValidCtxtPtr ctxt, xmlNodePtr value) -{ - if (ctxt->nodeMax <= 0) { - ctxt->nodeMax = 4; - ctxt->nodeTab = - (xmlNodePtr *) xmlMalloc(ctxt->nodeMax * - sizeof(ctxt->nodeTab[0])); - if (ctxt->nodeTab == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - ctxt->nodeMax = 0; - return (0); - } - } - if (ctxt->nodeNr >= ctxt->nodeMax) { - xmlNodePtr *tmp; - tmp = (xmlNodePtr *) xmlRealloc(ctxt->nodeTab, - ctxt->nodeMax * 2 * sizeof(ctxt->nodeTab[0])); - if (tmp == NULL) { - xmlVErrMemory(ctxt, "realloc failed"); - return (0); - } - ctxt->nodeMax *= 2; - ctxt->nodeTab = tmp; - } - ctxt->nodeTab[ctxt->nodeNr] = value; - ctxt->node = value; - return (ctxt->nodeNr++); -} -static xmlNodePtr -nodeVPop(xmlValidCtxtPtr ctxt) -{ - xmlNodePtr ret; - - if (ctxt->nodeNr <= 0) - return (NULL); - ctxt->nodeNr--; - if (ctxt->nodeNr > 0) - ctxt->node = ctxt->nodeTab[ctxt->nodeNr - 1]; - else - ctxt->node = NULL; - ret = ctxt->nodeTab[ctxt->nodeNr]; - ctxt->nodeTab[ctxt->nodeNr] = NULL; - return (ret); -} - -#ifdef DEBUG_VALID_ALGO -static void -xmlValidPrintNode(xmlNodePtr cur) { - if (cur == NULL) { - xmlGenericError(xmlGenericErrorContext, "null"); - return; - } - switch (cur->type) { - case XML_ELEMENT_NODE: - xmlGenericError(xmlGenericErrorContext, "%s ", cur->name); - break; - case XML_TEXT_NODE: - xmlGenericError(xmlGenericErrorContext, "text "); - break; - case XML_CDATA_SECTION_NODE: - xmlGenericError(xmlGenericErrorContext, "cdata "); - break; - case XML_ENTITY_REF_NODE: - xmlGenericError(xmlGenericErrorContext, "&%s; ", cur->name); - break; - case XML_PI_NODE: - xmlGenericError(xmlGenericErrorContext, "pi(%s) ", cur->name); - break; - case XML_COMMENT_NODE: - xmlGenericError(xmlGenericErrorContext, "comment "); - break; - case XML_ATTRIBUTE_NODE: - xmlGenericError(xmlGenericErrorContext, "?attr? "); - break; - case XML_ENTITY_NODE: - xmlGenericError(xmlGenericErrorContext, "?ent? "); - break; - case XML_DOCUMENT_NODE: - xmlGenericError(xmlGenericErrorContext, "?doc? "); - break; - case XML_DOCUMENT_TYPE_NODE: - xmlGenericError(xmlGenericErrorContext, "?doctype? "); - break; - case XML_DOCUMENT_FRAG_NODE: - xmlGenericError(xmlGenericErrorContext, "?frag? "); - break; - case XML_NOTATION_NODE: - xmlGenericError(xmlGenericErrorContext, "?nota? "); - break; - case XML_HTML_DOCUMENT_NODE: - xmlGenericError(xmlGenericErrorContext, "?html? "); - break; -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: - xmlGenericError(xmlGenericErrorContext, "?docb? "); - break; -#endif - case XML_DTD_NODE: - xmlGenericError(xmlGenericErrorContext, "?dtd? "); - break; - case XML_ELEMENT_DECL: - xmlGenericError(xmlGenericErrorContext, "?edecl? "); - break; - case XML_ATTRIBUTE_DECL: - xmlGenericError(xmlGenericErrorContext, "?adecl? "); - break; - case XML_ENTITY_DECL: - xmlGenericError(xmlGenericErrorContext, "?entdecl? "); - break; - case XML_NAMESPACE_DECL: - xmlGenericError(xmlGenericErrorContext, "?nsdecl? "); - break; - case XML_XINCLUDE_START: - xmlGenericError(xmlGenericErrorContext, "incstart "); - break; - case XML_XINCLUDE_END: - xmlGenericError(xmlGenericErrorContext, "incend "); - break; - } -} - -static void -xmlValidPrintNodeList(xmlNodePtr cur) { - if (cur == NULL) - xmlGenericError(xmlGenericErrorContext, "null "); - while (cur != NULL) { - xmlValidPrintNode(cur); - cur = cur->next; - } -} - -static void -xmlValidDebug(xmlNodePtr cur, xmlElementContentPtr cont) { - char expr[5000]; - - expr[0] = 0; - xmlGenericError(xmlGenericErrorContext, "valid: "); - xmlValidPrintNodeList(cur); - xmlGenericError(xmlGenericErrorContext, "against "); - xmlSnprintfElementContent(expr, 5000, cont, 1); - xmlGenericError(xmlGenericErrorContext, "%s\n", expr); -} - -static void -xmlValidDebugState(xmlValidStatePtr state) { - xmlGenericError(xmlGenericErrorContext, "("); - if (state->cont == NULL) - xmlGenericError(xmlGenericErrorContext, "null,"); - else - switch (state->cont->type) { - case XML_ELEMENT_CONTENT_PCDATA: - xmlGenericError(xmlGenericErrorContext, "pcdata,"); - break; - case XML_ELEMENT_CONTENT_ELEMENT: - xmlGenericError(xmlGenericErrorContext, "%s,", - state->cont->name); - break; - case XML_ELEMENT_CONTENT_SEQ: - xmlGenericError(xmlGenericErrorContext, "seq,"); - break; - case XML_ELEMENT_CONTENT_OR: - xmlGenericError(xmlGenericErrorContext, "or,"); - break; - } - xmlValidPrintNode(state->node); - xmlGenericError(xmlGenericErrorContext, ",%d,%X,%d)", - state->depth, state->occurs, state->state); -} - -static void -xmlValidStateDebug(xmlValidCtxtPtr ctxt) { - int i, j; - - xmlGenericError(xmlGenericErrorContext, "state: "); - xmlValidDebugState(ctxt->vstate); - xmlGenericError(xmlGenericErrorContext, " stack: %d ", - ctxt->vstateNr - 1); - for (i = 0, j = ctxt->vstateNr - 1;(i < 3) && (j > 0);i++,j--) - xmlValidDebugState(&ctxt->vstateTab[j]); - xmlGenericError(xmlGenericErrorContext, "\n"); -} - -/***** -#define DEBUG_VALID_STATE(n,c) xmlValidDebug(n,c); - *****/ - -#define DEBUG_VALID_STATE(n,c) xmlValidStateDebug(ctxt); -#define DEBUG_VALID_MSG(m) \ - xmlGenericError(xmlGenericErrorContext, "%s\n", m); - -#else -#define DEBUG_VALID_STATE(n,c) -#define DEBUG_VALID_MSG(m) -#endif - -/* TODO: use hash table for accesses to elem and attribute definitions */ - - -#define CHECK_DTD \ - if (doc == NULL) return(0); \ - else if ((doc->intSubset == NULL) && \ - (doc->extSubset == NULL)) return(0) - -xmlAttributePtr xmlScanAttributeDecl(xmlDtdPtr dtd, const xmlChar *elem); - -#ifdef LIBXML_REGEXP_ENABLED - -/************************************************************************ - * * - * Content model validation based on the regexps * - * * - ************************************************************************/ - -/** - * xmlValidBuildAContentModel: - * @content: the content model - * @ctxt: the schema parser context - * @name: the element name whose content is being built - * - * Generate the automata sequence needed for that type - * - * Returns 1 if successful or 0 in case of error. - */ -static int -xmlValidBuildAContentModel(xmlElementContentPtr content, - xmlValidCtxtPtr ctxt, - const xmlChar *name) { - if (content == NULL) { - xmlErrValidNode(ctxt, NULL, XML_ERR_INTERNAL_ERROR, - "Found NULL content in content model of %s\n", - name, NULL, NULL); - return(0); - } - switch (content->type) { - case XML_ELEMENT_CONTENT_PCDATA: - xmlErrValidNode(ctxt, NULL, XML_ERR_INTERNAL_ERROR, - "Found PCDATA in content model of %s\n", - name, NULL, NULL); - return(0); - break; - case XML_ELEMENT_CONTENT_ELEMENT: { - xmlAutomataStatePtr oldstate = ctxt->state; - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(content->name, content->prefix, fn, 50); - if (fullname == NULL) { - xmlVErrMemory(ctxt, "Building content model"); - return(0); - } - - switch (content->ocur) { - case XML_ELEMENT_CONTENT_ONCE: - ctxt->state = xmlAutomataNewTransition(ctxt->am, - ctxt->state, NULL, fullname, NULL); - break; - case XML_ELEMENT_CONTENT_OPT: - ctxt->state = xmlAutomataNewTransition(ctxt->am, - ctxt->state, NULL, fullname, NULL); - xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); - break; - case XML_ELEMENT_CONTENT_PLUS: - ctxt->state = xmlAutomataNewTransition(ctxt->am, - ctxt->state, NULL, fullname, NULL); - xmlAutomataNewTransition(ctxt->am, ctxt->state, - ctxt->state, fullname, NULL); - break; - case XML_ELEMENT_CONTENT_MULT: - ctxt->state = xmlAutomataNewEpsilon(ctxt->am, - ctxt->state, NULL); - xmlAutomataNewTransition(ctxt->am, - ctxt->state, ctxt->state, fullname, NULL); - break; - } - if ((fullname != fn) && (fullname != content->name)) - xmlFree(fullname); - break; - } - case XML_ELEMENT_CONTENT_SEQ: { - xmlAutomataStatePtr oldstate, oldend; - xmlElementContentOccur ocur; - - /* - * Simply iterate over the content - */ - oldstate = ctxt->state; - ocur = content->ocur; - if (ocur != XML_ELEMENT_CONTENT_ONCE) { - ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); - oldstate = ctxt->state; - } - do { - xmlValidBuildAContentModel(content->c1, ctxt, name); - content = content->c2; - } while ((content->type == XML_ELEMENT_CONTENT_SEQ) && - (content->ocur == XML_ELEMENT_CONTENT_ONCE)); - xmlValidBuildAContentModel(content, ctxt, name); - oldend = ctxt->state; - ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldend, NULL); - switch (ocur) { - case XML_ELEMENT_CONTENT_ONCE: - break; - case XML_ELEMENT_CONTENT_OPT: - xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); - break; - case XML_ELEMENT_CONTENT_MULT: - xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); - xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); - break; - case XML_ELEMENT_CONTENT_PLUS: - xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); - break; - } - break; - } - case XML_ELEMENT_CONTENT_OR: { - xmlAutomataStatePtr oldstate, oldend; - xmlElementContentOccur ocur; - - ocur = content->ocur; - if ((ocur == XML_ELEMENT_CONTENT_PLUS) || - (ocur == XML_ELEMENT_CONTENT_MULT)) { - ctxt->state = xmlAutomataNewEpsilon(ctxt->am, - ctxt->state, NULL); - } - oldstate = ctxt->state; - oldend = xmlAutomataNewState(ctxt->am); - - /* - * iterate over the subtypes and remerge the end with an - * epsilon transition - */ - do { - ctxt->state = oldstate; - xmlValidBuildAContentModel(content->c1, ctxt, name); - xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldend); - content = content->c2; - } while ((content->type == XML_ELEMENT_CONTENT_OR) && - (content->ocur == XML_ELEMENT_CONTENT_ONCE)); - ctxt->state = oldstate; - xmlValidBuildAContentModel(content, ctxt, name); - xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldend); - ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldend, NULL); - switch (ocur) { - case XML_ELEMENT_CONTENT_ONCE: - break; - case XML_ELEMENT_CONTENT_OPT: - xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); - break; - case XML_ELEMENT_CONTENT_MULT: - xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); - xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); - break; - case XML_ELEMENT_CONTENT_PLUS: - xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); - break; - } - break; - } - default: - xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, - "ContentModel broken for element %s\n", - (const char *) name); - return(0); - } - return(1); -} -/** - * xmlValidBuildContentModel: - * @ctxt: a validation context - * @elem: an element declaration node - * - * (Re)Build the automata associated to the content model of this - * element - * - * Returns 1 in case of success, 0 in case of error - */ -int -xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem) { - - if ((ctxt == NULL) || (elem == NULL)) - return(0); - if (elem->type != XML_ELEMENT_DECL) - return(0); - if (elem->etype != XML_ELEMENT_TYPE_ELEMENT) - return(1); - /* TODO: should we rebuild in this case ? */ - if (elem->contModel != NULL) { - if (!xmlRegexpIsDeterminist(elem->contModel)) { - ctxt->valid = 0; - return(0); - } - return(1); - } - - ctxt->am = xmlNewAutomata(); - if (ctxt->am == NULL) { - xmlErrValidNode(ctxt, (xmlNodePtr) elem, - XML_ERR_INTERNAL_ERROR, - "Cannot create automata for element %s\n", - elem->name, NULL, NULL); - return(0); - } - ctxt->state = xmlAutomataGetInitState(ctxt->am); - xmlValidBuildAContentModel(elem->content, ctxt, elem->name); - xmlAutomataSetFinalState(ctxt->am, ctxt->state); - elem->contModel = xmlAutomataCompile(ctxt->am); - if (xmlRegexpIsDeterminist(elem->contModel) != 1) { - char expr[5000]; - expr[0] = 0; - xmlSnprintfElementContent(expr, 5000, elem->content, 1); - xmlErrValidNode(ctxt, (xmlNodePtr) elem, - XML_DTD_CONTENT_NOT_DETERMINIST, - "Content model of %s is not determinist: %s\n", - elem->name, BAD_CAST expr, NULL); -#ifdef DEBUG_REGEXP_ALGO - xmlRegexpPrint(stderr, elem->contModel); -#endif - ctxt->valid = 0; - ctxt->state = NULL; - xmlFreeAutomata(ctxt->am); - ctxt->am = NULL; - return(0); - } - ctxt->state = NULL; - xmlFreeAutomata(ctxt->am); - ctxt->am = NULL; - return(1); -} - -#endif /* LIBXML_REGEXP_ENABLED */ - -/**************************************************************** - * * - * Util functions for data allocation/deallocation * - * * - ****************************************************************/ - -/** - * xmlNewValidCtxt: - * - * Allocate a validation context structure. - * - * Returns NULL if not, otherwise the new validation context structure - */ -xmlValidCtxtPtr xmlNewValidCtxt(void) { - xmlValidCtxtPtr ret; - - if ((ret = xmlMalloc(sizeof (xmlValidCtxt))) == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return (NULL); - } - - (void) memset(ret, 0, sizeof (xmlValidCtxt)); - - return (ret); -} - -/** - * xmlFreeValidCtxt: - * @cur: the validation context to free - * - * Free a validation context structure. - */ -void -xmlFreeValidCtxt(xmlValidCtxtPtr cur) { - if (cur->vstateTab != NULL) - xmlFree(cur->vstateTab); - if (cur->nodeTab != NULL) - xmlFree(cur->nodeTab); - xmlFree(cur); -} - -#endif /* LIBXML_VALID_ENABLED */ - -/** - * xmlNewDocElementContent: - * @doc: the document - * @name: the subelement name or NULL - * @type: the type of element content decl - * - * Allocate an element content structure for the document. - * - * Returns NULL if not, otherwise the new element content structure - */ -xmlElementContentPtr -xmlNewDocElementContent(xmlDocPtr doc, const xmlChar *name, - xmlElementContentType type) { - xmlElementContentPtr ret; - xmlDictPtr dict = NULL; - - if (doc != NULL) - dict = doc->dict; - - switch(type) { - case XML_ELEMENT_CONTENT_ELEMENT: - if (name == NULL) { - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewElementContent : name == NULL !\n", - NULL); - } - break; - case XML_ELEMENT_CONTENT_PCDATA: - case XML_ELEMENT_CONTENT_SEQ: - case XML_ELEMENT_CONTENT_OR: - if (name != NULL) { - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewElementContent : name != NULL !\n", - NULL); - } - break; - default: - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "Internal: ELEMENT content corrupted invalid type\n", - NULL); - return(NULL); - } - ret = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); - if (ret == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(NULL); - } - memset(ret, 0, sizeof(xmlElementContent)); - ret->type = type; - ret->ocur = XML_ELEMENT_CONTENT_ONCE; - if (name != NULL) { - int l; - const xmlChar *tmp; - - tmp = xmlSplitQName3(name, &l); - if (tmp == NULL) { - if (dict == NULL) - ret->name = xmlStrdup(name); - else - ret->name = xmlDictLookup(dict, name, -1); - } else { - if (dict == NULL) { - ret->prefix = xmlStrndup(name, l); - ret->name = xmlStrdup(tmp); - } else { - ret->prefix = xmlDictLookup(dict, name, l); - ret->name = xmlDictLookup(dict, tmp, -1); - } - } - } - return(ret); -} - -/** - * xmlNewElementContent: - * @name: the subelement name or NULL - * @type: the type of element content decl - * - * Allocate an element content structure. - * Deprecated in favor of xmlNewDocElementContent - * - * Returns NULL if not, otherwise the new element content structure - */ -xmlElementContentPtr -xmlNewElementContent(const xmlChar *name, xmlElementContentType type) { - return(xmlNewDocElementContent(NULL, name, type)); -} - -/** - * xmlCopyDocElementContent: - * @doc: the document owning the element declaration - * @cur: An element content pointer. - * - * Build a copy of an element content description. - * - * Returns the new xmlElementContentPtr or NULL in case of error. - */ -xmlElementContentPtr -xmlCopyDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur) { - xmlElementContentPtr ret = NULL, prev = NULL, tmp; - xmlDictPtr dict = NULL; - - if (cur == NULL) return(NULL); - - if (doc != NULL) - dict = doc->dict; - - ret = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); - if (ret == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(NULL); - } - memset(ret, 0, sizeof(xmlElementContent)); - ret->type = cur->type; - ret->ocur = cur->ocur; - if (cur->name != NULL) { - if (dict) - ret->name = xmlDictLookup(dict, cur->name, -1); - else - ret->name = xmlStrdup(cur->name); - } - - if (cur->prefix != NULL) { - if (dict) - ret->prefix = xmlDictLookup(dict, cur->prefix, -1); - else - ret->prefix = xmlStrdup(cur->prefix); - } - if (cur->c1 != NULL) - ret->c1 = xmlCopyDocElementContent(doc, cur->c1); - if (ret->c1 != NULL) - ret->c1->parent = ret; - if (cur->c2 != NULL) { - prev = ret; - cur = cur->c2; - while (cur != NULL) { - tmp = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); - if (tmp == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(ret); - } - memset(tmp, 0, sizeof(xmlElementContent)); - tmp->type = cur->type; - tmp->ocur = cur->ocur; - prev->c2 = tmp; - if (cur->name != NULL) { - if (dict) - tmp->name = xmlDictLookup(dict, cur->name, -1); - else - tmp->name = xmlStrdup(cur->name); - } - - if (cur->prefix != NULL) { - if (dict) - tmp->prefix = xmlDictLookup(dict, cur->prefix, -1); - else - tmp->prefix = xmlStrdup(cur->prefix); - } - if (cur->c1 != NULL) - tmp->c1 = xmlCopyDocElementContent(doc,cur->c1); - if (tmp->c1 != NULL) - tmp->c1->parent = ret; - prev = tmp; - cur = cur->c2; - } - } - return(ret); -} - -/** - * xmlCopyElementContent: - * @cur: An element content pointer. - * - * Build a copy of an element content description. - * Deprecated, use xmlCopyDocElementContent instead - * - * Returns the new xmlElementContentPtr or NULL in case of error. - */ -xmlElementContentPtr -xmlCopyElementContent(xmlElementContentPtr cur) { - return(xmlCopyDocElementContent(NULL, cur)); -} - -/** - * xmlFreeDocElementContent: - * @doc: the document owning the element declaration - * @cur: the element content tree to free - * - * Free an element content structure. The whole subtree is removed. - */ -void -xmlFreeDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur) { - xmlElementContentPtr next; - xmlDictPtr dict = NULL; - - if (doc != NULL) - dict = doc->dict; - - while (cur != NULL) { - next = cur->c2; - switch (cur->type) { - case XML_ELEMENT_CONTENT_PCDATA: - case XML_ELEMENT_CONTENT_ELEMENT: - case XML_ELEMENT_CONTENT_SEQ: - case XML_ELEMENT_CONTENT_OR: - break; - default: - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "Internal: ELEMENT content corrupted invalid type\n", - NULL); - return; - } - if (cur->c1 != NULL) xmlFreeDocElementContent(doc, cur->c1); - if (dict) { - if ((cur->name != NULL) && (!xmlDictOwns(dict, cur->name))) - xmlFree((xmlChar *) cur->name); - if ((cur->prefix != NULL) && (!xmlDictOwns(dict, cur->prefix))) - xmlFree((xmlChar *) cur->prefix); - } else { - if (cur->name != NULL) xmlFree((xmlChar *) cur->name); - if (cur->prefix != NULL) xmlFree((xmlChar *) cur->prefix); - } - xmlFree(cur); - cur = next; - } -} - -/** - * xmlFreeElementContent: - * @cur: the element content tree to free - * - * Free an element content structure. The whole subtree is removed. - * Deprecated, use xmlFreeDocElementContent instead - */ -void -xmlFreeElementContent(xmlElementContentPtr cur) { - xmlFreeDocElementContent(NULL, cur); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlDumpElementContent: - * @buf: An XML buffer - * @content: An element table - * @glob: 1 if one must print the englobing parenthesis, 0 otherwise - * - * This will dump the content of the element table as an XML DTD definition - */ -static void -xmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob) { - if (content == NULL) return; - - if (glob) xmlBufferWriteChar(buf, "("); - switch (content->type) { - case XML_ELEMENT_CONTENT_PCDATA: - xmlBufferWriteChar(buf, "#PCDATA"); - break; - case XML_ELEMENT_CONTENT_ELEMENT: - if (content->prefix != NULL) { - xmlBufferWriteCHAR(buf, content->prefix); - xmlBufferWriteChar(buf, ":"); - } - xmlBufferWriteCHAR(buf, content->name); - break; - case XML_ELEMENT_CONTENT_SEQ: - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) - xmlDumpElementContent(buf, content->c1, 1); - else - xmlDumpElementContent(buf, content->c1, 0); - xmlBufferWriteChar(buf, " , "); - if ((content->c2->type == XML_ELEMENT_CONTENT_OR) || - ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) && - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) - xmlDumpElementContent(buf, content->c2, 1); - else - xmlDumpElementContent(buf, content->c2, 0); - break; - case XML_ELEMENT_CONTENT_OR: - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) - xmlDumpElementContent(buf, content->c1, 1); - else - xmlDumpElementContent(buf, content->c1, 0); - xmlBufferWriteChar(buf, " | "); - if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || - ((content->c2->type == XML_ELEMENT_CONTENT_OR) && - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) - xmlDumpElementContent(buf, content->c2, 1); - else - xmlDumpElementContent(buf, content->c2, 0); - break; - default: - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "Internal: ELEMENT content corrupted invalid type\n", - NULL); - } - if (glob) - xmlBufferWriteChar(buf, ")"); - switch (content->ocur) { - case XML_ELEMENT_CONTENT_ONCE: - break; - case XML_ELEMENT_CONTENT_OPT: - xmlBufferWriteChar(buf, "?"); - break; - case XML_ELEMENT_CONTENT_MULT: - xmlBufferWriteChar(buf, "*"); - break; - case XML_ELEMENT_CONTENT_PLUS: - xmlBufferWriteChar(buf, "+"); - break; - } -} - -/** - * xmlSprintfElementContent: - * @buf: an output buffer - * @content: An element table - * @englob: 1 if one must print the englobing parenthesis, 0 otherwise - * - * Deprecated, unsafe, use xmlSnprintfElementContent - */ -void -xmlSprintfElementContent(char *buf ATTRIBUTE_UNUSED, - xmlElementContentPtr content ATTRIBUTE_UNUSED, - int englob ATTRIBUTE_UNUSED) { -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlSnprintfElementContent: - * @buf: an output buffer - * @size: the buffer size - * @content: An element table - * @englob: 1 if one must print the englobing parenthesis, 0 otherwise - * - * This will dump the content of the element content definition - * Intended just for the debug routine - */ -void -xmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int englob) { - int len; - - if (content == NULL) return; - len = strlen(buf); - if (size - len < 50) { - if ((size - len > 4) && (buf[len - 1] != '.')) - strcat(buf, " ..."); - return; - } - if (englob) strcat(buf, "("); - switch (content->type) { - case XML_ELEMENT_CONTENT_PCDATA: - strcat(buf, "#PCDATA"); - break; - case XML_ELEMENT_CONTENT_ELEMENT: - if (content->prefix != NULL) { - if (size - len < xmlStrlen(content->prefix) + 10) { - strcat(buf, " ..."); - return; - } - strcat(buf, (char *) content->prefix); - strcat(buf, ":"); - } - if (size - len < xmlStrlen(content->name) + 10) { - strcat(buf, " ..."); - return; - } - if (content->name != NULL) - strcat(buf, (char *) content->name); - break; - case XML_ELEMENT_CONTENT_SEQ: - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) - xmlSnprintfElementContent(buf, size, content->c1, 1); - else - xmlSnprintfElementContent(buf, size, content->c1, 0); - len = strlen(buf); - if (size - len < 50) { - if ((size - len > 4) && (buf[len - 1] != '.')) - strcat(buf, " ..."); - return; - } - strcat(buf, " , "); - if (((content->c2->type == XML_ELEMENT_CONTENT_OR) || - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)) && - (content->c2->type != XML_ELEMENT_CONTENT_ELEMENT)) - xmlSnprintfElementContent(buf, size, content->c2, 1); - else - xmlSnprintfElementContent(buf, size, content->c2, 0); - break; - case XML_ELEMENT_CONTENT_OR: - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) - xmlSnprintfElementContent(buf, size, content->c1, 1); - else - xmlSnprintfElementContent(buf, size, content->c1, 0); - len = strlen(buf); - if (size - len < 50) { - if ((size - len > 4) && (buf[len - 1] != '.')) - strcat(buf, " ..."); - return; - } - strcat(buf, " | "); - if (((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)) && - (content->c2->type != XML_ELEMENT_CONTENT_ELEMENT)) - xmlSnprintfElementContent(buf, size, content->c2, 1); - else - xmlSnprintfElementContent(buf, size, content->c2, 0); - break; - } - if (englob) - strcat(buf, ")"); - switch (content->ocur) { - case XML_ELEMENT_CONTENT_ONCE: - break; - case XML_ELEMENT_CONTENT_OPT: - strcat(buf, "?"); - break; - case XML_ELEMENT_CONTENT_MULT: - strcat(buf, "*"); - break; - case XML_ELEMENT_CONTENT_PLUS: - strcat(buf, "+"); - break; - } -} - -/**************************************************************** - * * - * Registration of DTD declarations * - * * - ****************************************************************/ - -/** - * xmlFreeElement: - * @elem: An element - * - * Deallocate the memory used by an element definition - */ -static void -xmlFreeElement(xmlElementPtr elem) { - if (elem == NULL) return; - xmlUnlinkNode((xmlNodePtr) elem); - xmlFreeDocElementContent(elem->doc, elem->content); - if (elem->name != NULL) - xmlFree((xmlChar *) elem->name); - if (elem->prefix != NULL) - xmlFree((xmlChar *) elem->prefix); -#ifdef LIBXML_REGEXP_ENABLED - if (elem->contModel != NULL) - xmlRegFreeRegexp(elem->contModel); -#endif - xmlFree(elem); -} - - -/** - * xmlAddElementDecl: - * @ctxt: the validation context - * @dtd: pointer to the DTD - * @name: the entity name - * @type: the element type - * @content: the element content tree or NULL - * - * Register a new element declaration - * - * Returns NULL if not, otherwise the entity - */ -xmlElementPtr -xmlAddElementDecl(xmlValidCtxtPtr ctxt, - xmlDtdPtr dtd, const xmlChar *name, - xmlElementTypeVal type, - xmlElementContentPtr content) { - xmlElementPtr ret; - xmlElementTablePtr table; - xmlAttributePtr oldAttributes = NULL; - xmlChar *ns, *uqname; - - if (dtd == NULL) { - return(NULL); - } - if (name == NULL) { - return(NULL); - } - - switch (type) { - case XML_ELEMENT_TYPE_EMPTY: - if (content != NULL) { - xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlAddElementDecl: content != NULL for EMPTY\n", - NULL); - return(NULL); - } - break; - case XML_ELEMENT_TYPE_ANY: - if (content != NULL) { - xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlAddElementDecl: content != NULL for ANY\n", - NULL); - return(NULL); - } - break; - case XML_ELEMENT_TYPE_MIXED: - if (content == NULL) { - xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlAddElementDecl: content == NULL for MIXED\n", - NULL); - return(NULL); - } - break; - case XML_ELEMENT_TYPE_ELEMENT: - if (content == NULL) { - xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlAddElementDecl: content == NULL for ELEMENT\n", - NULL); - return(NULL); - } - break; - default: - xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, - "Internal: ELEMENT decl corrupted invalid type\n", - NULL); - return(NULL); - } - - /* - * check if name is a QName - */ - uqname = xmlSplitQName2(name, &ns); - if (uqname != NULL) - name = uqname; - - /* - * Create the Element table if needed. - */ - table = (xmlElementTablePtr) dtd->elements; - if (table == NULL) { - xmlDictPtr dict = NULL; - - if (dtd->doc != NULL) - dict = dtd->doc->dict; - table = xmlHashCreateDict(0, dict); - dtd->elements = (void *) table; - } - if (table == NULL) { - xmlVErrMemory(ctxt, - "xmlAddElementDecl: Table creation failed!\n"); - if (uqname != NULL) - xmlFree(uqname); - if (ns != NULL) - xmlFree(ns); - return(NULL); - } - - /* - * lookup old attributes inserted on an undefined element in the - * internal subset. - */ - if ((dtd->doc != NULL) && (dtd->doc->intSubset != NULL)) { - ret = xmlHashLookup2(dtd->doc->intSubset->elements, name, ns); - if ((ret != NULL) && (ret->etype == XML_ELEMENT_TYPE_UNDEFINED)) { - oldAttributes = ret->attributes; - ret->attributes = NULL; - xmlHashRemoveEntry2(dtd->doc->intSubset->elements, name, ns, NULL); - xmlFreeElement(ret); - } - } - - /* - * The element may already be present if one of its attribute - * was registered first - */ - ret = xmlHashLookup2(table, name, ns); - if (ret != NULL) { - if (ret->etype != XML_ELEMENT_TYPE_UNDEFINED) { -#ifdef LIBXML_VALID_ENABLED - /* - * The element is already defined in this DTD. - */ - xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ELEM_REDEFINED, - "Redefinition of element %s\n", - name, NULL, NULL); -#endif /* LIBXML_VALID_ENABLED */ - if (uqname != NULL) - xmlFree(uqname); - if (ns != NULL) - xmlFree(ns); - return(NULL); - } - if (ns != NULL) { - xmlFree(ns); - ns = NULL; - } - } else { - ret = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); - if (ret == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - if (uqname != NULL) - xmlFree(uqname); - if (ns != NULL) - xmlFree(ns); - return(NULL); - } - memset(ret, 0, sizeof(xmlElement)); - ret->type = XML_ELEMENT_DECL; - - /* - * fill the structure. - */ - ret->name = xmlStrdup(name); - if (ret->name == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - if (uqname != NULL) - xmlFree(uqname); - if (ns != NULL) - xmlFree(ns); - xmlFree(ret); - return(NULL); - } - ret->prefix = ns; - - /* - * Validity Check: - * Insertion must not fail - */ - if (xmlHashAddEntry2(table, name, ns, ret)) { -#ifdef LIBXML_VALID_ENABLED - /* - * The element is already defined in this DTD. - */ - xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ELEM_REDEFINED, - "Redefinition of element %s\n", - name, NULL, NULL); -#endif /* LIBXML_VALID_ENABLED */ - xmlFreeElement(ret); - if (uqname != NULL) - xmlFree(uqname); - return(NULL); - } - /* - * For new element, may have attributes from earlier - * definition in internal subset - */ - ret->attributes = oldAttributes; - } - - /* - * Finish to fill the structure. - */ - ret->etype = type; - /* - * Avoid a stupid copy when called by the parser - * and flag it by setting a special parent value - * so the parser doesn't unallocate it. - */ - if ((ctxt != NULL) && - ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || - (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1))) { - ret->content = content; - if (content != NULL) - content->parent = (xmlElementContentPtr) 1; - } else { - ret->content = xmlCopyDocElementContent(dtd->doc, content); - } - - /* - * Link it to the DTD - */ - ret->parent = dtd; - ret->doc = dtd->doc; - if (dtd->last == NULL) { - dtd->children = dtd->last = (xmlNodePtr) ret; - } else { - dtd->last->next = (xmlNodePtr) ret; - ret->prev = dtd->last; - dtd->last = (xmlNodePtr) ret; - } - if (uqname != NULL) - xmlFree(uqname); - return(ret); -} - -/** - * xmlFreeElementTable: - * @table: An element table - * - * Deallocate the memory used by an element hash table. - */ -void -xmlFreeElementTable(xmlElementTablePtr table) { - xmlHashFree(table, (xmlHashDeallocator) xmlFreeElement); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlCopyElement: - * @elem: An element - * - * Build a copy of an element. - * - * Returns the new xmlElementPtr or NULL in case of error. - */ -static xmlElementPtr -xmlCopyElement(xmlElementPtr elem) { - xmlElementPtr cur; - - cur = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); - if (cur == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(NULL); - } - memset(cur, 0, sizeof(xmlElement)); - cur->type = XML_ELEMENT_DECL; - cur->etype = elem->etype; - if (elem->name != NULL) - cur->name = xmlStrdup(elem->name); - else - cur->name = NULL; - if (elem->prefix != NULL) - cur->prefix = xmlStrdup(elem->prefix); - else - cur->prefix = NULL; - cur->content = xmlCopyElementContent(elem->content); - /* TODO : rebuild the attribute list on the copy */ - cur->attributes = NULL; - return(cur); -} - -/** - * xmlCopyElementTable: - * @table: An element table - * - * Build a copy of an element table. - * - * Returns the new xmlElementTablePtr or NULL in case of error. - */ -xmlElementTablePtr -xmlCopyElementTable(xmlElementTablePtr table) { - return((xmlElementTablePtr) xmlHashCopy(table, - (xmlHashCopier) xmlCopyElement)); -} -#endif /* LIBXML_TREE_ENABLED */ - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlDumpElementDecl: - * @buf: the XML buffer output - * @elem: An element table - * - * This will dump the content of the element declaration as an XML - * DTD definition - */ -void -xmlDumpElementDecl(xmlBufferPtr buf, xmlElementPtr elem) { - if ((buf == NULL) || (elem == NULL)) - return; - switch (elem->etype) { - case XML_ELEMENT_TYPE_EMPTY: - xmlBufferWriteChar(buf, "<!ELEMENT "); - if (elem->prefix != NULL) { - xmlBufferWriteCHAR(buf, elem->prefix); - xmlBufferWriteChar(buf, ":"); - } - xmlBufferWriteCHAR(buf, elem->name); - xmlBufferWriteChar(buf, " EMPTY>\n"); - break; - case XML_ELEMENT_TYPE_ANY: - xmlBufferWriteChar(buf, "<!ELEMENT "); - if (elem->prefix != NULL) { - xmlBufferWriteCHAR(buf, elem->prefix); - xmlBufferWriteChar(buf, ":"); - } - xmlBufferWriteCHAR(buf, elem->name); - xmlBufferWriteChar(buf, " ANY>\n"); - break; - case XML_ELEMENT_TYPE_MIXED: - xmlBufferWriteChar(buf, "<!ELEMENT "); - if (elem->prefix != NULL) { - xmlBufferWriteCHAR(buf, elem->prefix); - xmlBufferWriteChar(buf, ":"); - } - xmlBufferWriteCHAR(buf, elem->name); - xmlBufferWriteChar(buf, " "); - xmlDumpElementContent(buf, elem->content, 1); - xmlBufferWriteChar(buf, ">\n"); - break; - case XML_ELEMENT_TYPE_ELEMENT: - xmlBufferWriteChar(buf, "<!ELEMENT "); - if (elem->prefix != NULL) { - xmlBufferWriteCHAR(buf, elem->prefix); - xmlBufferWriteChar(buf, ":"); - } - xmlBufferWriteCHAR(buf, elem->name); - xmlBufferWriteChar(buf, " "); - xmlDumpElementContent(buf, elem->content, 1); - xmlBufferWriteChar(buf, ">\n"); - break; - default: - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "Internal: ELEMENT struct corrupted invalid type\n", - NULL); - } -} - -/** - * xmlDumpElementDeclScan: - * @elem: An element table - * @buf: the XML buffer output - * - * This routine is used by the hash scan function. It just reverses - * the arguments. - */ -static void -xmlDumpElementDeclScan(xmlElementPtr elem, xmlBufferPtr buf) { - xmlDumpElementDecl(buf, elem); -} - -/** - * xmlDumpElementTable: - * @buf: the XML buffer output - * @table: An element table - * - * This will dump the content of the element table as an XML DTD definition - */ -void -xmlDumpElementTable(xmlBufferPtr buf, xmlElementTablePtr table) { - if ((buf == NULL) || (table == NULL)) - return; - xmlHashScan(table, (xmlHashScanner) xmlDumpElementDeclScan, buf); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlCreateEnumeration: - * @name: the enumeration name or NULL - * - * create and initialize an enumeration attribute node. - * - * Returns the xmlEnumerationPtr just created or NULL in case - * of error. - */ -xmlEnumerationPtr -xmlCreateEnumeration(const xmlChar *name) { - xmlEnumerationPtr ret; - - ret = (xmlEnumerationPtr) xmlMalloc(sizeof(xmlEnumeration)); - if (ret == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(NULL); - } - memset(ret, 0, sizeof(xmlEnumeration)); - - if (name != NULL) - ret->name = xmlStrdup(name); - return(ret); -} - -/** - * xmlFreeEnumeration: - * @cur: the tree to free. - * - * free an enumeration attribute node (recursive). - */ -void -xmlFreeEnumeration(xmlEnumerationPtr cur) { - if (cur == NULL) return; - - if (cur->next != NULL) xmlFreeEnumeration(cur->next); - - if (cur->name != NULL) xmlFree((xmlChar *) cur->name); - xmlFree(cur); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlCopyEnumeration: - * @cur: the tree to copy. - * - * Copy an enumeration attribute node (recursive). - * - * Returns the xmlEnumerationPtr just created or NULL in case - * of error. - */ -xmlEnumerationPtr -xmlCopyEnumeration(xmlEnumerationPtr cur) { - xmlEnumerationPtr ret; - - if (cur == NULL) return(NULL); - ret = xmlCreateEnumeration((xmlChar *) cur->name); - - if (cur->next != NULL) ret->next = xmlCopyEnumeration(cur->next); - else ret->next = NULL; - - return(ret); -} -#endif /* LIBXML_TREE_ENABLED */ - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlDumpEnumeration: - * @buf: the XML buffer output - * @enum: An enumeration - * - * This will dump the content of the enumeration - */ -static void -xmlDumpEnumeration(xmlBufferPtr buf, xmlEnumerationPtr cur) { - if ((buf == NULL) || (cur == NULL)) - return; - - xmlBufferWriteCHAR(buf, cur->name); - if (cur->next == NULL) - xmlBufferWriteChar(buf, ")"); - else { - xmlBufferWriteChar(buf, " | "); - xmlDumpEnumeration(buf, cur->next); - } -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -#ifdef LIBXML_VALID_ENABLED -/** - * xmlScanAttributeDeclCallback: - * @attr: the attribute decl - * @list: the list to update - * - * Callback called by xmlScanAttributeDecl when a new attribute - * has to be entered in the list. - */ -static void -xmlScanAttributeDeclCallback(xmlAttributePtr attr, xmlAttributePtr *list, - const xmlChar* name ATTRIBUTE_UNUSED) { - attr->nexth = *list; - *list = attr; -} - -/** - * xmlScanAttributeDecl: - * @dtd: pointer to the DTD - * @elem: the element name - * - * When inserting a new element scan the DtD for existing attributes - * for that element and initialize the Attribute chain - * - * Returns the pointer to the first attribute decl in the chain, - * possibly NULL. - */ -xmlAttributePtr -xmlScanAttributeDecl(xmlDtdPtr dtd, const xmlChar *elem) { - xmlAttributePtr ret = NULL; - xmlAttributeTablePtr table; - - if (dtd == NULL) { - return(NULL); - } - if (elem == NULL) { - return(NULL); - } - table = (xmlAttributeTablePtr) dtd->attributes; - if (table == NULL) - return(NULL); - - /* WRONG !!! */ - xmlHashScan3(table, NULL, NULL, elem, - (xmlHashScanner) xmlScanAttributeDeclCallback, &ret); - return(ret); -} - -/** - * xmlScanIDAttributeDecl: - * @ctxt: the validation context - * @elem: the element name - * @err: whether to raise errors here - * - * Verify that the element don't have too many ID attributes - * declared. - * - * Returns the number of ID attributes found. - */ -static int -xmlScanIDAttributeDecl(xmlValidCtxtPtr ctxt, xmlElementPtr elem, int err) { - xmlAttributePtr cur; - int ret = 0; - - if (elem == NULL) return(0); - cur = elem->attributes; - while (cur != NULL) { - if (cur->atype == XML_ATTRIBUTE_ID) { - ret ++; - if ((ret > 1) && (err)) - xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_MULTIPLE_ID, - "Element %s has too many ID attributes defined : %s\n", - elem->name, cur->name, NULL); - } - cur = cur->nexth; - } - return(ret); -} -#endif /* LIBXML_VALID_ENABLED */ - -/** - * xmlFreeAttribute: - * @elem: An attribute - * - * Deallocate the memory used by an attribute definition - */ -static void -xmlFreeAttribute(xmlAttributePtr attr) { - xmlDictPtr dict; - - if (attr == NULL) return; - if (attr->doc != NULL) - dict = attr->doc->dict; - else - dict = NULL; - xmlUnlinkNode((xmlNodePtr) attr); - if (attr->tree != NULL) - xmlFreeEnumeration(attr->tree); - if (dict) { - if ((attr->elem != NULL) && (!xmlDictOwns(dict, attr->elem))) - xmlFree((xmlChar *) attr->elem); - if ((attr->name != NULL) && (!xmlDictOwns(dict, attr->name))) - xmlFree((xmlChar *) attr->name); - if ((attr->prefix != NULL) && (!xmlDictOwns(dict, attr->prefix))) - xmlFree((xmlChar *) attr->prefix); - if ((attr->defaultValue != NULL) && - (!xmlDictOwns(dict, attr->defaultValue))) - xmlFree((xmlChar *) attr->defaultValue); - } else { - if (attr->elem != NULL) - xmlFree((xmlChar *) attr->elem); - if (attr->name != NULL) - xmlFree((xmlChar *) attr->name); - if (attr->defaultValue != NULL) - xmlFree((xmlChar *) attr->defaultValue); - if (attr->prefix != NULL) - xmlFree((xmlChar *) attr->prefix); - } - xmlFree(attr); -} - - -/** - * xmlAddAttributeDecl: - * @ctxt: the validation context - * @dtd: pointer to the DTD - * @elem: the element name - * @name: the attribute name - * @ns: the attribute namespace prefix - * @type: the attribute type - * @def: the attribute default type - * @defaultValue: the attribute default value - * @tree: if it's an enumeration, the associated list - * - * Register a new attribute declaration - * Note that @tree becomes the ownership of the DTD - * - * Returns NULL if not new, otherwise the attribute decl - */ -xmlAttributePtr -xmlAddAttributeDecl(xmlValidCtxtPtr ctxt, - xmlDtdPtr dtd, const xmlChar *elem, - const xmlChar *name, const xmlChar *ns, - xmlAttributeType type, xmlAttributeDefault def, - const xmlChar *defaultValue, xmlEnumerationPtr tree) { - xmlAttributePtr ret; - xmlAttributeTablePtr table; - xmlElementPtr elemDef; - xmlDictPtr dict = NULL; - - if (dtd == NULL) { - xmlFreeEnumeration(tree); - return(NULL); - } - if (name == NULL) { - xmlFreeEnumeration(tree); - return(NULL); - } - if (elem == NULL) { - xmlFreeEnumeration(tree); - return(NULL); - } - if (dtd->doc != NULL) - dict = dtd->doc->dict; - -#ifdef LIBXML_VALID_ENABLED - /* - * Check the type and possibly the default value. - */ - switch (type) { - case XML_ATTRIBUTE_CDATA: - break; - case XML_ATTRIBUTE_ID: - break; - case XML_ATTRIBUTE_IDREF: - break; - case XML_ATTRIBUTE_IDREFS: - break; - case XML_ATTRIBUTE_ENTITY: - break; - case XML_ATTRIBUTE_ENTITIES: - break; - case XML_ATTRIBUTE_NMTOKEN: - break; - case XML_ATTRIBUTE_NMTOKENS: - break; - case XML_ATTRIBUTE_ENUMERATION: - break; - case XML_ATTRIBUTE_NOTATION: - break; - default: - xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, - "Internal: ATTRIBUTE struct corrupted invalid type\n", - NULL); - xmlFreeEnumeration(tree); - return(NULL); - } - if ((defaultValue != NULL) && - (!xmlValidateAttributeValue(type, defaultValue))) { - xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ATTRIBUTE_DEFAULT, - "Attribute %s of %s: invalid default value\n", - elem, name, defaultValue); - defaultValue = NULL; - if (ctxt != NULL) - ctxt->valid = 0; - } -#endif /* LIBXML_VALID_ENABLED */ - - /* - * Check first that an attribute defined in the external subset wasn't - * already defined in the internal subset - */ - if ((dtd->doc != NULL) && (dtd->doc->extSubset == dtd) && - (dtd->doc->intSubset != NULL) && - (dtd->doc->intSubset->attributes != NULL)) { - ret = xmlHashLookup3(dtd->doc->intSubset->attributes, name, ns, elem); - if (ret != NULL) - return(NULL); - } - - /* - * Create the Attribute table if needed. - */ - table = (xmlAttributeTablePtr) dtd->attributes; - if (table == NULL) { - table = xmlHashCreateDict(0, dict); - dtd->attributes = (void *) table; - } - if (table == NULL) { - xmlVErrMemory(ctxt, - "xmlAddAttributeDecl: Table creation failed!\n"); - return(NULL); - } - - - ret = (xmlAttributePtr) xmlMalloc(sizeof(xmlAttribute)); - if (ret == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - return(NULL); - } - memset(ret, 0, sizeof(xmlAttribute)); - ret->type = XML_ATTRIBUTE_DECL; - - /* - * fill the structure. - */ - ret->atype = type; - /* - * doc must be set before possible error causes call - * to xmlFreeAttribute (because it's used to check on - * dict use) - */ - ret->doc = dtd->doc; - if (dict) { - ret->name = xmlDictLookup(dict, name, -1); - ret->prefix = xmlDictLookup(dict, ns, -1); - ret->elem = xmlDictLookup(dict, elem, -1); - } else { - ret->name = xmlStrdup(name); - ret->prefix = xmlStrdup(ns); - ret->elem = xmlStrdup(elem); - } - ret->def = def; - ret->tree = tree; - if (defaultValue != NULL) { - if (dict) - ret->defaultValue = xmlDictLookup(dict, defaultValue, -1); - else - ret->defaultValue = xmlStrdup(defaultValue); - } - - /* - * Validity Check: - * Search the DTD for previous declarations of the ATTLIST - */ - if (xmlHashAddEntry3(table, ret->name, ret->prefix, ret->elem, ret) < 0) { -#ifdef LIBXML_VALID_ENABLED - /* - * The attribute is already defined in this DTD. - */ - xmlErrValidWarning(ctxt, (xmlNodePtr) dtd, XML_DTD_ATTRIBUTE_REDEFINED, - "Attribute %s of element %s: already defined\n", - name, elem, NULL); -#endif /* LIBXML_VALID_ENABLED */ - xmlFreeAttribute(ret); - return(NULL); - } - - /* - * Validity Check: - * Multiple ID per element - */ - elemDef = xmlGetDtdElementDesc2(dtd, elem, 1); - if (elemDef != NULL) { - -#ifdef LIBXML_VALID_ENABLED - if ((type == XML_ATTRIBUTE_ID) && - (xmlScanIDAttributeDecl(NULL, elemDef, 1) != 0)) { - xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_MULTIPLE_ID, - "Element %s has too may ID attributes defined : %s\n", - elem, name, NULL); - if (ctxt != NULL) - ctxt->valid = 0; - } -#endif /* LIBXML_VALID_ENABLED */ - - /* - * Insert namespace default def first they need to be - * processed first. - */ - if ((xmlStrEqual(ret->name, BAD_CAST "xmlns")) || - ((ret->prefix != NULL && - (xmlStrEqual(ret->prefix, BAD_CAST "xmlns"))))) { - ret->nexth = elemDef->attributes; - elemDef->attributes = ret; - } else { - xmlAttributePtr tmp = elemDef->attributes; - - while ((tmp != NULL) && - ((xmlStrEqual(tmp->name, BAD_CAST "xmlns")) || - ((ret->prefix != NULL && - (xmlStrEqual(ret->prefix, BAD_CAST "xmlns")))))) { - if (tmp->nexth == NULL) - break; - tmp = tmp->nexth; - } - if (tmp != NULL) { - ret->nexth = tmp->nexth; - tmp->nexth = ret; - } else { - ret->nexth = elemDef->attributes; - elemDef->attributes = ret; - } - } - } - - /* - * Link it to the DTD - */ - ret->parent = dtd; - if (dtd->last == NULL) { - dtd->children = dtd->last = (xmlNodePtr) ret; - } else { - dtd->last->next = (xmlNodePtr) ret; - ret->prev = dtd->last; - dtd->last = (xmlNodePtr) ret; - } - return(ret); -} - -/** - * xmlFreeAttributeTable: - * @table: An attribute table - * - * Deallocate the memory used by an entities hash table. - */ -void -xmlFreeAttributeTable(xmlAttributeTablePtr table) { - xmlHashFree(table, (xmlHashDeallocator) xmlFreeAttribute); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlCopyAttribute: - * @attr: An attribute - * - * Build a copy of an attribute. - * - * Returns the new xmlAttributePtr or NULL in case of error. - */ -static xmlAttributePtr -xmlCopyAttribute(xmlAttributePtr attr) { - xmlAttributePtr cur; - - cur = (xmlAttributePtr) xmlMalloc(sizeof(xmlAttribute)); - if (cur == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(NULL); - } - memset(cur, 0, sizeof(xmlAttribute)); - cur->type = XML_ATTRIBUTE_DECL; - cur->atype = attr->atype; - cur->def = attr->def; - cur->tree = xmlCopyEnumeration(attr->tree); - if (attr->elem != NULL) - cur->elem = xmlStrdup(attr->elem); - if (attr->name != NULL) - cur->name = xmlStrdup(attr->name); - if (attr->prefix != NULL) - cur->prefix = xmlStrdup(attr->prefix); - if (attr->defaultValue != NULL) - cur->defaultValue = xmlStrdup(attr->defaultValue); - return(cur); -} - -/** - * xmlCopyAttributeTable: - * @table: An attribute table - * - * Build a copy of an attribute table. - * - * Returns the new xmlAttributeTablePtr or NULL in case of error. - */ -xmlAttributeTablePtr -xmlCopyAttributeTable(xmlAttributeTablePtr table) { - return((xmlAttributeTablePtr) xmlHashCopy(table, - (xmlHashCopier) xmlCopyAttribute)); -} -#endif /* LIBXML_TREE_ENABLED */ - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlDumpAttributeDecl: - * @buf: the XML buffer output - * @attr: An attribute declaration - * - * This will dump the content of the attribute declaration as an XML - * DTD definition - */ -void -xmlDumpAttributeDecl(xmlBufferPtr buf, xmlAttributePtr attr) { - if ((buf == NULL) || (attr == NULL)) - return; - xmlBufferWriteChar(buf, "<!ATTLIST "); - xmlBufferWriteCHAR(buf, attr->elem); - xmlBufferWriteChar(buf, " "); - if (attr->prefix != NULL) { - xmlBufferWriteCHAR(buf, attr->prefix); - xmlBufferWriteChar(buf, ":"); - } - xmlBufferWriteCHAR(buf, attr->name); - switch (attr->atype) { - case XML_ATTRIBUTE_CDATA: - xmlBufferWriteChar(buf, " CDATA"); - break; - case XML_ATTRIBUTE_ID: - xmlBufferWriteChar(buf, " ID"); - break; - case XML_ATTRIBUTE_IDREF: - xmlBufferWriteChar(buf, " IDREF"); - break; - case XML_ATTRIBUTE_IDREFS: - xmlBufferWriteChar(buf, " IDREFS"); - break; - case XML_ATTRIBUTE_ENTITY: - xmlBufferWriteChar(buf, " ENTITY"); - break; - case XML_ATTRIBUTE_ENTITIES: - xmlBufferWriteChar(buf, " ENTITIES"); - break; - case XML_ATTRIBUTE_NMTOKEN: - xmlBufferWriteChar(buf, " NMTOKEN"); - break; - case XML_ATTRIBUTE_NMTOKENS: - xmlBufferWriteChar(buf, " NMTOKENS"); - break; - case XML_ATTRIBUTE_ENUMERATION: - xmlBufferWriteChar(buf, " ("); - xmlDumpEnumeration(buf, attr->tree); - break; - case XML_ATTRIBUTE_NOTATION: - xmlBufferWriteChar(buf, " NOTATION ("); - xmlDumpEnumeration(buf, attr->tree); - break; - default: - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "Internal: ATTRIBUTE struct corrupted invalid type\n", - NULL); - } - switch (attr->def) { - case XML_ATTRIBUTE_NONE: - break; - case XML_ATTRIBUTE_REQUIRED: - xmlBufferWriteChar(buf, " #REQUIRED"); - break; - case XML_ATTRIBUTE_IMPLIED: - xmlBufferWriteChar(buf, " #IMPLIED"); - break; - case XML_ATTRIBUTE_FIXED: - xmlBufferWriteChar(buf, " #FIXED"); - break; - default: - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "Internal: ATTRIBUTE struct corrupted invalid def\n", - NULL); - } - if (attr->defaultValue != NULL) { - xmlBufferWriteChar(buf, " "); - xmlBufferWriteQuotedString(buf, attr->defaultValue); - } - xmlBufferWriteChar(buf, ">\n"); -} - -/** - * xmlDumpAttributeDeclScan: - * @attr: An attribute declaration - * @buf: the XML buffer output - * - * This is used with the hash scan function - just reverses arguments - */ -static void -xmlDumpAttributeDeclScan(xmlAttributePtr attr, xmlBufferPtr buf) { - xmlDumpAttributeDecl(buf, attr); -} - -/** - * xmlDumpAttributeTable: - * @buf: the XML buffer output - * @table: An attribute table - * - * This will dump the content of the attribute table as an XML DTD definition - */ -void -xmlDumpAttributeTable(xmlBufferPtr buf, xmlAttributeTablePtr table) { - if ((buf == NULL) || (table == NULL)) - return; - xmlHashScan(table, (xmlHashScanner) xmlDumpAttributeDeclScan, buf); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/************************************************************************ - * * - * NOTATIONs * - * * - ************************************************************************/ -/** - * xmlFreeNotation: - * @not: A notation - * - * Deallocate the memory used by an notation definition - */ -static void -xmlFreeNotation(xmlNotationPtr nota) { - if (nota == NULL) return; - if (nota->name != NULL) - xmlFree((xmlChar *) nota->name); - if (nota->PublicID != NULL) - xmlFree((xmlChar *) nota->PublicID); - if (nota->SystemID != NULL) - xmlFree((xmlChar *) nota->SystemID); - xmlFree(nota); -} - - -/** - * xmlAddNotationDecl: - * @dtd: pointer to the DTD - * @ctxt: the validation context - * @name: the entity name - * @PublicID: the public identifier or NULL - * @SystemID: the system identifier or NULL - * - * Register a new notation declaration - * - * Returns NULL if not, otherwise the entity - */ -xmlNotationPtr -xmlAddNotationDecl(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, - const xmlChar *name, - const xmlChar *PublicID, const xmlChar *SystemID) { - xmlNotationPtr ret; - xmlNotationTablePtr table; - - if (dtd == NULL) { - return(NULL); - } - if (name == NULL) { - return(NULL); - } - if ((PublicID == NULL) && (SystemID == NULL)) { - return(NULL); - } - - /* - * Create the Notation table if needed. - */ - table = (xmlNotationTablePtr) dtd->notations; - if (table == NULL) { - xmlDictPtr dict = NULL; - if (dtd->doc != NULL) - dict = dtd->doc->dict; - - dtd->notations = table = xmlHashCreateDict(0, dict); - } - if (table == NULL) { - xmlVErrMemory(ctxt, - "xmlAddNotationDecl: Table creation failed!\n"); - return(NULL); - } - - ret = (xmlNotationPtr) xmlMalloc(sizeof(xmlNotation)); - if (ret == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - return(NULL); - } - memset(ret, 0, sizeof(xmlNotation)); - - /* - * fill the structure. - */ - ret->name = xmlStrdup(name); - if (SystemID != NULL) - ret->SystemID = xmlStrdup(SystemID); - if (PublicID != NULL) - ret->PublicID = xmlStrdup(PublicID); - - /* - * Validity Check: - * Check the DTD for previous declarations of the ATTLIST - */ - if (xmlHashAddEntry(table, name, ret)) { -#ifdef LIBXML_VALID_ENABLED - xmlErrValid(NULL, XML_DTD_NOTATION_REDEFINED, - "xmlAddNotationDecl: %s already defined\n", - (const char *) name); -#endif /* LIBXML_VALID_ENABLED */ - xmlFreeNotation(ret); - return(NULL); - } - return(ret); -} - -/** - * xmlFreeNotationTable: - * @table: An notation table - * - * Deallocate the memory used by an entities hash table. - */ -void -xmlFreeNotationTable(xmlNotationTablePtr table) { - xmlHashFree(table, (xmlHashDeallocator) xmlFreeNotation); -} - -#ifdef LIBXML_TREE_ENABLED -/** - * xmlCopyNotation: - * @nota: A notation - * - * Build a copy of a notation. - * - * Returns the new xmlNotationPtr or NULL in case of error. - */ -static xmlNotationPtr -xmlCopyNotation(xmlNotationPtr nota) { - xmlNotationPtr cur; - - cur = (xmlNotationPtr) xmlMalloc(sizeof(xmlNotation)); - if (cur == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(NULL); - } - if (nota->name != NULL) - cur->name = xmlStrdup(nota->name); - else - cur->name = NULL; - if (nota->PublicID != NULL) - cur->PublicID = xmlStrdup(nota->PublicID); - else - cur->PublicID = NULL; - if (nota->SystemID != NULL) - cur->SystemID = xmlStrdup(nota->SystemID); - else - cur->SystemID = NULL; - return(cur); -} - -/** - * xmlCopyNotationTable: - * @table: A notation table - * - * Build a copy of a notation table. - * - * Returns the new xmlNotationTablePtr or NULL in case of error. - */ -xmlNotationTablePtr -xmlCopyNotationTable(xmlNotationTablePtr table) { - return((xmlNotationTablePtr) xmlHashCopy(table, - (xmlHashCopier) xmlCopyNotation)); -} -#endif /* LIBXML_TREE_ENABLED */ - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlDumpNotationDecl: - * @buf: the XML buffer output - * @nota: A notation declaration - * - * This will dump the content the notation declaration as an XML DTD definition - */ -void -xmlDumpNotationDecl(xmlBufferPtr buf, xmlNotationPtr nota) { - if ((buf == NULL) || (nota == NULL)) - return; - xmlBufferWriteChar(buf, "<!NOTATION "); - xmlBufferWriteCHAR(buf, nota->name); - if (nota->PublicID != NULL) { - xmlBufferWriteChar(buf, " PUBLIC "); - xmlBufferWriteQuotedString(buf, nota->PublicID); - if (nota->SystemID != NULL) { - xmlBufferWriteChar(buf, " "); - xmlBufferWriteQuotedString(buf, nota->SystemID); - } - } else { - xmlBufferWriteChar(buf, " SYSTEM "); - xmlBufferWriteQuotedString(buf, nota->SystemID); - } - xmlBufferWriteChar(buf, " >\n"); -} - -/** - * xmlDumpNotationDeclScan: - * @nota: A notation declaration - * @buf: the XML buffer output - * - * This is called with the hash scan function, and just reverses args - */ -static void -xmlDumpNotationDeclScan(xmlNotationPtr nota, xmlBufferPtr buf) { - xmlDumpNotationDecl(buf, nota); -} - -/** - * xmlDumpNotationTable: - * @buf: the XML buffer output - * @table: A notation table - * - * This will dump the content of the notation table as an XML DTD definition - */ -void -xmlDumpNotationTable(xmlBufferPtr buf, xmlNotationTablePtr table) { - if ((buf == NULL) || (table == NULL)) - return; - xmlHashScan(table, (xmlHashScanner) xmlDumpNotationDeclScan, buf); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/************************************************************************ - * * - * IDs * - * * - ************************************************************************/ -/** - * DICT_FREE: - * @str: a string - * - * Free a string if it is not owned by the "dict" dictionnary in the - * current scope - */ -#define DICT_FREE(str) \ - if ((str) && ((!dict) || \ - (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ - xmlFree((char *)(str)); - -/** - * xmlFreeID: - * @not: A id - * - * Deallocate the memory used by an id definition - */ -static void -xmlFreeID(xmlIDPtr id) { - xmlDictPtr dict = NULL; - - if (id == NULL) return; - - if (id->doc != NULL) - dict = id->doc->dict; - - if (id->value != NULL) - DICT_FREE(id->value) - if (id->name != NULL) - DICT_FREE(id->name) - xmlFree(id); -} - - -/** - * xmlAddID: - * @ctxt: the validation context - * @doc: pointer to the document - * @value: the value name - * @attr: the attribute holding the ID - * - * Register a new id declaration - * - * Returns NULL if not, otherwise the new xmlIDPtr - */ -xmlIDPtr -xmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, - xmlAttrPtr attr) { - xmlIDPtr ret; - xmlIDTablePtr table; - - if (doc == NULL) { - return(NULL); - } - if (value == NULL) { - return(NULL); - } - if (attr == NULL) { - return(NULL); - } - - /* - * Create the ID table if needed. - */ - table = (xmlIDTablePtr) doc->ids; - if (table == NULL) { - doc->ids = table = xmlHashCreateDict(0, doc->dict); - } - if (table == NULL) { - xmlVErrMemory(ctxt, - "xmlAddID: Table creation failed!\n"); - return(NULL); - } - - ret = (xmlIDPtr) xmlMalloc(sizeof(xmlID)); - if (ret == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - return(NULL); - } - - /* - * fill the structure. - */ - ret->value = xmlStrdup(value); - ret->doc = doc; - if ((ctxt != NULL) && (ctxt->vstateNr != 0)) { - /* - * Operating in streaming mode, attr is gonna disapear - */ - if (doc->dict != NULL) - ret->name = xmlDictLookup(doc->dict, attr->name, -1); - else - ret->name = xmlStrdup(attr->name); - ret->attr = NULL; - } else { - ret->attr = attr; - ret->name = NULL; - } - ret->lineno = xmlGetLineNo(attr->parent); - - if (xmlHashAddEntry(table, value, ret) < 0) { -#ifdef LIBXML_VALID_ENABLED - /* - * The id is already defined in this DTD. - */ - if ((ctxt != NULL) && (ctxt->error != NULL)) { - xmlErrValidNode(ctxt, attr->parent, XML_DTD_ID_REDEFINED, - "ID %s already defined\n", - value, NULL, NULL); - } -#endif /* LIBXML_VALID_ENABLED */ - xmlFreeID(ret); - return(NULL); - } - if (attr != NULL) - attr->atype = XML_ATTRIBUTE_ID; - return(ret); -} - -/** - * xmlFreeIDTable: - * @table: An id table - * - * Deallocate the memory used by an ID hash table. - */ -void -xmlFreeIDTable(xmlIDTablePtr table) { - xmlHashFree(table, (xmlHashDeallocator) xmlFreeID); -} - -/** - * xmlIsID: - * @doc: the document - * @elem: the element carrying the attribute - * @attr: the attribute - * - * Determine whether an attribute is of type ID. In case we have DTD(s) - * then this is done if DTD loading has been requested. In the case - * of HTML documents parsed with the HTML parser, then ID detection is - * done systematically. - * - * Returns 0 or 1 depending on the lookup result - */ -int -xmlIsID(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { - if ((attr == NULL) || (attr->name == NULL)) return(0); - if ((attr->ns != NULL) && (attr->ns->prefix != NULL) && - (!strcmp((char *) attr->name, "id")) && - (!strcmp((char *) attr->ns->prefix, "xml"))) - return(1); - if (doc == NULL) return(0); - if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) { - return(0); - } else if (doc->type == XML_HTML_DOCUMENT_NODE) { - if ((xmlStrEqual(BAD_CAST "id", attr->name)) || - ((xmlStrEqual(BAD_CAST "name", attr->name)) && - ((elem == NULL) || (!xmlStrEqual(elem->name, BAD_CAST "input"))))) - return(1); - return(0); - } else if (elem == NULL) { - return(0); - } else { - xmlAttributePtr attrDecl = NULL; - - xmlChar felem[50], fattr[50]; - xmlChar *fullelemname, *fullattrname; - - fullelemname = (elem->ns != NULL && elem->ns->prefix != NULL) ? - xmlBuildQName(elem->name, elem->ns->prefix, felem, 50) : - (xmlChar *)elem->name; - - fullattrname = (attr->ns != NULL && attr->ns->prefix != NULL) ? - xmlBuildQName(attr->name, attr->ns->prefix, fattr, 50) : - (xmlChar *)attr->name; - - if (fullelemname != NULL && fullattrname != NULL) { - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullelemname, - fullattrname); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullelemname, - fullattrname); - } - - if ((fullattrname != fattr) && (fullattrname != attr->name)) - xmlFree(fullattrname); - if ((fullelemname != felem) && (fullelemname != elem->name)) - xmlFree(fullelemname); - - if ((attrDecl != NULL) && (attrDecl->atype == XML_ATTRIBUTE_ID)) - return(1); - } - return(0); -} - -/** - * xmlRemoveID: - * @doc: the document - * @attr: the attribute - * - * Remove the given attribute from the ID table maintained internally. - * - * Returns -1 if the lookup failed and 0 otherwise - */ -int -xmlRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { - xmlIDTablePtr table; - xmlIDPtr id; - xmlChar *ID; - - if (doc == NULL) return(-1); - if (attr == NULL) return(-1); - table = (xmlIDTablePtr) doc->ids; - if (table == NULL) - return(-1); - - if (attr == NULL) - return(-1); - ID = xmlNodeListGetString(doc, attr->children, 1); - if (ID == NULL) - return(-1); - id = xmlHashLookup(table, ID); - if (id == NULL || id->attr != attr) { - xmlFree(ID); - return(-1); - } - xmlHashRemoveEntry(table, ID, (xmlHashDeallocator) xmlFreeID); - xmlFree(ID); - attr->atype = 0; - return(0); -} - -/** - * xmlGetID: - * @doc: pointer to the document - * @ID: the ID value - * - * Search the attribute declaring the given ID - * - * Returns NULL if not found, otherwise the xmlAttrPtr defining the ID - */ -xmlAttrPtr -xmlGetID(xmlDocPtr doc, const xmlChar *ID) { - xmlIDTablePtr table; - xmlIDPtr id; - - if (doc == NULL) { - return(NULL); - } - - if (ID == NULL) { - return(NULL); - } - - table = (xmlIDTablePtr) doc->ids; - if (table == NULL) - return(NULL); - - id = xmlHashLookup(table, ID); - if (id == NULL) - return(NULL); - if (id->attr == NULL) { - /* - * We are operating on a stream, return a well known reference - * since the attribute node doesn't exist anymore - */ - return((xmlAttrPtr) doc); - } - return(id->attr); -} - -/************************************************************************ - * * - * Refs * - * * - ************************************************************************/ -typedef struct xmlRemoveMemo_t -{ - xmlListPtr l; - xmlAttrPtr ap; -} xmlRemoveMemo; - -typedef xmlRemoveMemo *xmlRemoveMemoPtr; - -typedef struct xmlValidateMemo_t -{ - xmlValidCtxtPtr ctxt; - const xmlChar *name; -} xmlValidateMemo; - -typedef xmlValidateMemo *xmlValidateMemoPtr; - -/** - * xmlFreeRef: - * @lk: A list link - * - * Deallocate the memory used by a ref definition - */ -static void -xmlFreeRef(xmlLinkPtr lk) { - xmlRefPtr ref = (xmlRefPtr)xmlLinkGetData(lk); - if (ref == NULL) return; - if (ref->value != NULL) - xmlFree((xmlChar *)ref->value); - if (ref->name != NULL) - xmlFree((xmlChar *)ref->name); - xmlFree(ref); -} - -/** - * xmlFreeRefList: - * @list_ref: A list of references. - * - * Deallocate the memory used by a list of references - */ -static void -xmlFreeRefList(xmlListPtr list_ref) { - if (list_ref == NULL) return; - xmlListDelete(list_ref); -} - -/** - * xmlWalkRemoveRef: - * @data: Contents of current link - * @user: Value supplied by the user - * - * Returns 0 to abort the walk or 1 to continue - */ -static int -xmlWalkRemoveRef(const void *data, const void *user) -{ - xmlAttrPtr attr0 = ((xmlRefPtr)data)->attr; - xmlAttrPtr attr1 = ((xmlRemoveMemoPtr)user)->ap; - xmlListPtr ref_list = ((xmlRemoveMemoPtr)user)->l; - - if (attr0 == attr1) { /* Matched: remove and terminate walk */ - xmlListRemoveFirst(ref_list, (void *)data); - return 0; - } - return 1; -} - -/** - * xmlDummyCompare - * @data0: Value supplied by the user - * @data1: Value supplied by the user - * - * Do nothing, return 0. Used to create unordered lists. - */ -static int -xmlDummyCompare(const void *data0 ATTRIBUTE_UNUSED, - const void *data1 ATTRIBUTE_UNUSED) -{ - return (0); -} - -/** - * xmlAddRef: - * @ctxt: the validation context - * @doc: pointer to the document - * @value: the value name - * @attr: the attribute holding the Ref - * - * Register a new ref declaration - * - * Returns NULL if not, otherwise the new xmlRefPtr - */ -xmlRefPtr -xmlAddRef(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, - xmlAttrPtr attr) { - xmlRefPtr ret; - xmlRefTablePtr table; - xmlListPtr ref_list; - - if (doc == NULL) { - return(NULL); - } - if (value == NULL) { - return(NULL); - } - if (attr == NULL) { - return(NULL); - } - - /* - * Create the Ref table if needed. - */ - table = (xmlRefTablePtr) doc->refs; - if (table == NULL) { - doc->refs = table = xmlHashCreateDict(0, doc->dict); - } - if (table == NULL) { - xmlVErrMemory(ctxt, - "xmlAddRef: Table creation failed!\n"); - return(NULL); - } - - ret = (xmlRefPtr) xmlMalloc(sizeof(xmlRef)); - if (ret == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - return(NULL); - } - - /* - * fill the structure. - */ - ret->value = xmlStrdup(value); - if ((ctxt != NULL) && (ctxt->vstateNr != 0)) { - /* - * Operating in streaming mode, attr is gonna disapear - */ - ret->name = xmlStrdup(attr->name); - ret->attr = NULL; - } else { - ret->name = NULL; - ret->attr = attr; - } - ret->lineno = xmlGetLineNo(attr->parent); - - /* To add a reference :- - * References are maintained as a list of references, - * Lookup the entry, if no entry create new nodelist - * Add the owning node to the NodeList - * Return the ref - */ - - if (NULL == (ref_list = xmlHashLookup(table, value))) { - if (NULL == (ref_list = xmlListCreate(xmlFreeRef, xmlDummyCompare))) { - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "xmlAddRef: Reference list creation failed!\n", - NULL); - return(NULL); - } - if (xmlHashAddEntry(table, value, ref_list) < 0) { - xmlListDelete(ref_list); - xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, - "xmlAddRef: Reference list insertion failed!\n", - NULL); - return(NULL); - } - } -/* xmlListInsert(ref_list, ret); */ - xmlListAppend(ref_list, ret); - return(ret); -} - -/** - * xmlFreeRefTable: - * @table: An ref table - * - * Deallocate the memory used by an Ref hash table. - */ -void -xmlFreeRefTable(xmlRefTablePtr table) { - xmlHashFree(table, (xmlHashDeallocator) xmlFreeRefList); -} - -/** - * xmlIsRef: - * @doc: the document - * @elem: the element carrying the attribute - * @attr: the attribute - * - * Determine whether an attribute is of type Ref. In case we have DTD(s) - * then this is simple, otherwise we use an heuristic: name Ref (upper - * or lowercase). - * - * Returns 0 or 1 depending on the lookup result - */ -int -xmlIsRef(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { - if (attr == NULL) - return(0); - if (doc == NULL) { - doc = attr->doc; - if (doc == NULL) return(0); - } - - if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) { - return(0); - } else if (doc->type == XML_HTML_DOCUMENT_NODE) { - /* TODO @@@ */ - return(0); - } else { - xmlAttributePtr attrDecl; - - if (elem == NULL) return(0); - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, attr->name); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, - elem->name, attr->name); - - if ((attrDecl != NULL) && - (attrDecl->atype == XML_ATTRIBUTE_IDREF || - attrDecl->atype == XML_ATTRIBUTE_IDREFS)) - return(1); - } - return(0); -} - -/** - * xmlRemoveRef: - * @doc: the document - * @attr: the attribute - * - * Remove the given attribute from the Ref table maintained internally. - * - * Returns -1 if the lookup failed and 0 otherwise - */ -int -xmlRemoveRef(xmlDocPtr doc, xmlAttrPtr attr) { - xmlListPtr ref_list; - xmlRefTablePtr table; - xmlChar *ID; - xmlRemoveMemo target; - - if (doc == NULL) return(-1); - if (attr == NULL) return(-1); - table = (xmlRefTablePtr) doc->refs; - if (table == NULL) - return(-1); - - if (attr == NULL) - return(-1); - ID = xmlNodeListGetString(doc, attr->children, 1); - if (ID == NULL) - return(-1); - ref_list = xmlHashLookup(table, ID); - - if(ref_list == NULL) { - xmlFree(ID); - return (-1); - } - /* At this point, ref_list refers to a list of references which - * have the same key as the supplied attr. Our list of references - * is ordered by reference address and we don't have that information - * here to use when removing. We'll have to walk the list and - * check for a matching attribute, when we find one stop the walk - * and remove the entry. - * The list is ordered by reference, so that means we don't have the - * key. Passing the list and the reference to the walker means we - * will have enough data to be able to remove the entry. - */ - target.l = ref_list; - target.ap = attr; - - /* Remove the supplied attr from our list */ - xmlListWalk(ref_list, xmlWalkRemoveRef, &target); - - /*If the list is empty then remove the list entry in the hash */ - if (xmlListEmpty(ref_list)) - xmlHashUpdateEntry(table, ID, NULL, (xmlHashDeallocator) - xmlFreeRefList); - xmlFree(ID); - return(0); -} - -/** - * xmlGetRefs: - * @doc: pointer to the document - * @ID: the ID value - * - * Find the set of references for the supplied ID. - * - * Returns NULL if not found, otherwise node set for the ID. - */ -xmlListPtr -xmlGetRefs(xmlDocPtr doc, const xmlChar *ID) { - xmlRefTablePtr table; - - if (doc == NULL) { - return(NULL); - } - - if (ID == NULL) { - return(NULL); - } - - table = (xmlRefTablePtr) doc->refs; - if (table == NULL) - return(NULL); - - return (xmlHashLookup(table, ID)); -} - -/************************************************************************ - * * - * Routines for validity checking * - * * - ************************************************************************/ - -/** - * xmlGetDtdElementDesc: - * @dtd: a pointer to the DtD to search - * @name: the element name - * - * Search the DTD for the description of this element - * - * returns the xmlElementPtr if found or NULL - */ - -xmlElementPtr -xmlGetDtdElementDesc(xmlDtdPtr dtd, const xmlChar *name) { - xmlElementTablePtr table; - xmlElementPtr cur; - xmlChar *uqname = NULL, *prefix = NULL; - - if ((dtd == NULL) || (name == NULL)) return(NULL); - if (dtd->elements == NULL) - return(NULL); - table = (xmlElementTablePtr) dtd->elements; - - uqname = xmlSplitQName2(name, &prefix); - if (uqname != NULL) - name = uqname; - cur = xmlHashLookup2(table, name, prefix); - if (prefix != NULL) xmlFree(prefix); - if (uqname != NULL) xmlFree(uqname); - return(cur); -} -/** - * xmlGetDtdElementDesc2: - * @dtd: a pointer to the DtD to search - * @name: the element name - * @create: create an empty description if not found - * - * Search the DTD for the description of this element - * - * returns the xmlElementPtr if found or NULL - */ - -static xmlElementPtr -xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, int create) { - xmlElementTablePtr table; - xmlElementPtr cur; - xmlChar *uqname = NULL, *prefix = NULL; - - if (dtd == NULL) return(NULL); - if (dtd->elements == NULL) { - xmlDictPtr dict = NULL; - - if (dtd->doc != NULL) - dict = dtd->doc->dict; - - if (!create) - return(NULL); - /* - * Create the Element table if needed. - */ - table = (xmlElementTablePtr) dtd->elements; - if (table == NULL) { - table = xmlHashCreateDict(0, dict); - dtd->elements = (void *) table; - } - if (table == NULL) { - xmlVErrMemory(NULL, "element table allocation failed"); - return(NULL); - } - } - table = (xmlElementTablePtr) dtd->elements; - - uqname = xmlSplitQName2(name, &prefix); - if (uqname != NULL) - name = uqname; - cur = xmlHashLookup2(table, name, prefix); - if ((cur == NULL) && (create)) { - cur = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); - if (cur == NULL) { - xmlVErrMemory(NULL, "malloc failed"); - return(NULL); - } - memset(cur, 0, sizeof(xmlElement)); - cur->type = XML_ELEMENT_DECL; - - /* - * fill the structure. - */ - cur->name = xmlStrdup(name); - cur->prefix = xmlStrdup(prefix); - cur->etype = XML_ELEMENT_TYPE_UNDEFINED; - - xmlHashAddEntry2(table, name, prefix, cur); - } - if (prefix != NULL) xmlFree(prefix); - if (uqname != NULL) xmlFree(uqname); - return(cur); -} - -/** - * xmlGetDtdQElementDesc: - * @dtd: a pointer to the DtD to search - * @name: the element name - * @prefix: the element namespace prefix - * - * Search the DTD for the description of this element - * - * returns the xmlElementPtr if found or NULL - */ - -xmlElementPtr -xmlGetDtdQElementDesc(xmlDtdPtr dtd, const xmlChar *name, - const xmlChar *prefix) { - xmlElementTablePtr table; - - if (dtd == NULL) return(NULL); - if (dtd->elements == NULL) return(NULL); - table = (xmlElementTablePtr) dtd->elements; - - return(xmlHashLookup2(table, name, prefix)); -} - -/** - * xmlGetDtdAttrDesc: - * @dtd: a pointer to the DtD to search - * @elem: the element name - * @name: the attribute name - * - * Search the DTD for the description of this attribute on - * this element. - * - * returns the xmlAttributePtr if found or NULL - */ - -xmlAttributePtr -xmlGetDtdAttrDesc(xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name) { - xmlAttributeTablePtr table; - xmlAttributePtr cur; - xmlChar *uqname = NULL, *prefix = NULL; - - if (dtd == NULL) return(NULL); - if (dtd->attributes == NULL) return(NULL); - - table = (xmlAttributeTablePtr) dtd->attributes; - if (table == NULL) - return(NULL); - - uqname = xmlSplitQName2(name, &prefix); - - if (uqname != NULL) { - cur = xmlHashLookup3(table, uqname, prefix, elem); - if (prefix != NULL) xmlFree(prefix); - if (uqname != NULL) xmlFree(uqname); - } else - cur = xmlHashLookup3(table, name, NULL, elem); - return(cur); -} - -/** - * xmlGetDtdQAttrDesc: - * @dtd: a pointer to the DtD to search - * @elem: the element name - * @name: the attribute name - * @prefix: the attribute namespace prefix - * - * Search the DTD for the description of this qualified attribute on - * this element. - * - * returns the xmlAttributePtr if found or NULL - */ - -xmlAttributePtr -xmlGetDtdQAttrDesc(xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name, - const xmlChar *prefix) { - xmlAttributeTablePtr table; - - if (dtd == NULL) return(NULL); - if (dtd->attributes == NULL) return(NULL); - table = (xmlAttributeTablePtr) dtd->attributes; - - return(xmlHashLookup3(table, name, prefix, elem)); -} - -/** - * xmlGetDtdNotationDesc: - * @dtd: a pointer to the DtD to search - * @name: the notation name - * - * Search the DTD for the description of this notation - * - * returns the xmlNotationPtr if found or NULL - */ - -xmlNotationPtr -xmlGetDtdNotationDesc(xmlDtdPtr dtd, const xmlChar *name) { - xmlNotationTablePtr table; - - if (dtd == NULL) return(NULL); - if (dtd->notations == NULL) return(NULL); - table = (xmlNotationTablePtr) dtd->notations; - - return(xmlHashLookup(table, name)); -} - -#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -/** - * xmlValidateNotationUse: - * @ctxt: the validation context - * @doc: the document - * @notationName: the notation name to check - * - * Validate that the given name match a notation declaration. - * - [ VC: Notation Declared ] - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateNotationUse(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - const xmlChar *notationName) { - xmlNotationPtr notaDecl; - if ((doc == NULL) || (doc->intSubset == NULL)) return(-1); - - notaDecl = xmlGetDtdNotationDesc(doc->intSubset, notationName); - if ((notaDecl == NULL) && (doc->extSubset != NULL)) - notaDecl = xmlGetDtdNotationDesc(doc->extSubset, notationName); - - if ((notaDecl == NULL) && (ctxt != NULL)) { - xmlErrValidNode(ctxt, (xmlNodePtr) doc, XML_DTD_UNKNOWN_NOTATION, - "NOTATION %s is not declared\n", - notationName, NULL, NULL); - return(0); - } - return(1); -} -#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ - -/** - * xmlIsMixedElement: - * @doc: the document - * @name: the element name - * - * Search in the DtDs whether an element accept Mixed content (or ANY) - * basically if it is supposed to accept text childs - * - * returns 0 if no, 1 if yes, and -1 if no element description is available - */ - -int -xmlIsMixedElement(xmlDocPtr doc, const xmlChar *name) { - xmlElementPtr elemDecl; - - if ((doc == NULL) || (doc->intSubset == NULL)) return(-1); - - elemDecl = xmlGetDtdElementDesc(doc->intSubset, name); - if ((elemDecl == NULL) && (doc->extSubset != NULL)) - elemDecl = xmlGetDtdElementDesc(doc->extSubset, name); - if (elemDecl == NULL) return(-1); - switch (elemDecl->etype) { - case XML_ELEMENT_TYPE_UNDEFINED: - return(-1); - case XML_ELEMENT_TYPE_ELEMENT: - return(0); - case XML_ELEMENT_TYPE_EMPTY: - /* - * return 1 for EMPTY since we want VC error to pop up - * on <empty> </empty> for example - */ - case XML_ELEMENT_TYPE_ANY: - case XML_ELEMENT_TYPE_MIXED: - return(1); - } - return(1); -} - -#ifdef LIBXML_VALID_ENABLED -/** - * xmlValidateNameValue: - * @value: an Name value - * - * Validate that the given value match Name production - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateNameValue(const xmlChar *value) { - const xmlChar *cur; - int val, len; - - if (value == NULL) return(0); - cur = value; - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - if (!IS_LETTER(val) && (val != '_') && - (val != ':')) { - return(0); - } - - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || - (val == '.') || (val == '-') || - (val == '_') || (val == ':') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - - if (val != 0) return(0); - - return(1); -} - -/** - * xmlValidateNamesValue: - * @value: an Names value - * - * Validate that the given value match Names production - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateNamesValue(const xmlChar *value) { - const xmlChar *cur; - int val, len; - - if (value == NULL) return(0); - cur = value; - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - - if (!IS_LETTER(val) && (val != '_') && - (val != ':')) { - return(0); - } - - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || - (val == '.') || (val == '-') || - (val == '_') || (val == ':') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - - /* Should not test IS_BLANK(val) here -- see erratum E20*/ - while (val == 0x20) { - while (val == 0x20) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - - if (!IS_LETTER(val) && (val != '_') && - (val != ':')) { - return(0); - } - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || - (val == '.') || (val == '-') || - (val == '_') || (val == ':') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - } - - if (val != 0) return(0); - - return(1); -} - -/** - * xmlValidateNmtokenValue: - * @value: an Nmtoken value - * - * Validate that the given value match Nmtoken production - * - * [ VC: Name Token ] - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateNmtokenValue(const xmlChar *value) { - const xmlChar *cur; - int val, len; - - if (value == NULL) return(0); - cur = value; - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - - if (!IS_LETTER(val) && !IS_DIGIT(val) && - (val != '.') && (val != '-') && - (val != '_') && (val != ':') && - (!IS_COMBINING(val)) && - (!IS_EXTENDER(val))) - return(0); - - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || - (val == '.') || (val == '-') || - (val == '_') || (val == ':') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - - if (val != 0) return(0); - - return(1); -} - -/** - * xmlValidateNmtokensValue: - * @value: an Nmtokens value - * - * Validate that the given value match Nmtokens production - * - * [ VC: Name Token ] - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateNmtokensValue(const xmlChar *value) { - const xmlChar *cur; - int val, len; - - if (value == NULL) return(0); - cur = value; - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - - while (IS_BLANK(val)) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - - if (!IS_LETTER(val) && !IS_DIGIT(val) && - (val != '.') && (val != '-') && - (val != '_') && (val != ':') && - (!IS_COMBINING(val)) && - (!IS_EXTENDER(val))) - return(0); - - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || - (val == '.') || (val == '-') || - (val == '_') || (val == ':') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - - /* Should not test IS_BLANK(val) here -- see erratum E20*/ - while (val == 0x20) { - while (val == 0x20) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - if (val == 0) return(1); - - if (!IS_LETTER(val) && !IS_DIGIT(val) && - (val != '.') && (val != '-') && - (val != '_') && (val != ':') && - (!IS_COMBINING(val)) && - (!IS_EXTENDER(val))) - return(0); - - while ((IS_LETTER(val)) || (IS_DIGIT(val)) || - (val == '.') || (val == '-') || - (val == '_') || (val == ':') || - (IS_COMBINING(val)) || - (IS_EXTENDER(val))) { - val = xmlStringCurrentChar(NULL, cur, &len); - cur += len; - } - } - - if (val != 0) return(0); - - return(1); -} - -/** - * xmlValidateNotationDecl: - * @ctxt: the validation context - * @doc: a document instance - * @nota: a notation definition - * - * Try to validate a single notation definition - * basically it does the following checks as described by the - * XML-1.0 recommendation: - * - it seems that no validity constraint exists on notation declarations - * But this function get called anyway ... - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateNotationDecl(xmlValidCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlDocPtr doc ATTRIBUTE_UNUSED, - xmlNotationPtr nota ATTRIBUTE_UNUSED) { - int ret = 1; - - return(ret); -} - -/** - * xmlValidateAttributeValue: - * @type: an attribute type - * @value: an attribute value - * - * Validate that the given attribute value match the proper production - * - * [ VC: ID ] - * Values of type ID must match the Name production.... - * - * [ VC: IDREF ] - * Values of type IDREF must match the Name production, and values - * of type IDREFS must match Names ... - * - * [ VC: Entity Name ] - * Values of type ENTITY must match the Name production, values - * of type ENTITIES must match Names ... - * - * [ VC: Name Token ] - * Values of type NMTOKEN must match the Nmtoken production; values - * of type NMTOKENS must match Nmtokens. - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateAttributeValue(xmlAttributeType type, const xmlChar *value) { - switch (type) { - case XML_ATTRIBUTE_ENTITIES: - case XML_ATTRIBUTE_IDREFS: - return(xmlValidateNamesValue(value)); - case XML_ATTRIBUTE_ENTITY: - case XML_ATTRIBUTE_IDREF: - case XML_ATTRIBUTE_ID: - case XML_ATTRIBUTE_NOTATION: - return(xmlValidateNameValue(value)); - case XML_ATTRIBUTE_NMTOKENS: - case XML_ATTRIBUTE_ENUMERATION: - return(xmlValidateNmtokensValue(value)); - case XML_ATTRIBUTE_NMTOKEN: - return(xmlValidateNmtokenValue(value)); - case XML_ATTRIBUTE_CDATA: - break; - } - return(1); -} - -/** - * xmlValidateAttributeValue2: - * @ctxt: the validation context - * @doc: the document - * @name: the attribute name (used for error reporting only) - * @type: the attribute type - * @value: the attribute value - * - * Validate that the given attribute value match a given type. - * This typically cannot be done before having finished parsing - * the subsets. - * - * [ VC: IDREF ] - * Values of type IDREF must match one of the declared IDs - * Values of type IDREFS must match a sequence of the declared IDs - * each Name must match the value of an ID attribute on some element - * in the XML document; i.e. IDREF values must match the value of - * some ID attribute - * - * [ VC: Entity Name ] - * Values of type ENTITY must match one declared entity - * Values of type ENTITIES must match a sequence of declared entities - * - * [ VC: Notation Attributes ] - * all notation names in the declaration must be declared. - * - * returns 1 if valid or 0 otherwise - */ - -static int -xmlValidateAttributeValue2(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - const xmlChar *name, xmlAttributeType type, const xmlChar *value) { - int ret = 1; - switch (type) { - case XML_ATTRIBUTE_IDREFS: - case XML_ATTRIBUTE_IDREF: - case XML_ATTRIBUTE_ID: - case XML_ATTRIBUTE_NMTOKENS: - case XML_ATTRIBUTE_ENUMERATION: - case XML_ATTRIBUTE_NMTOKEN: - case XML_ATTRIBUTE_CDATA: - break; - case XML_ATTRIBUTE_ENTITY: { - xmlEntityPtr ent; - - ent = xmlGetDocEntity(doc, value); - /* yeah it's a bit messy... */ - if ((ent == NULL) && (doc->standalone == 1)) { - doc->standalone = 0; - ent = xmlGetDocEntity(doc, value); - } - if (ent == NULL) { - xmlErrValidNode(ctxt, (xmlNodePtr) doc, - XML_DTD_UNKNOWN_ENTITY, - "ENTITY attribute %s reference an unknown entity \"%s\"\n", - name, value, NULL); - ret = 0; - } else if (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { - xmlErrValidNode(ctxt, (xmlNodePtr) doc, - XML_DTD_ENTITY_TYPE, - "ENTITY attribute %s reference an entity \"%s\" of wrong type\n", - name, value, NULL); - ret = 0; - } - break; - } - case XML_ATTRIBUTE_ENTITIES: { - xmlChar *dup, *nam = NULL, *cur, save; - xmlEntityPtr ent; - - dup = xmlStrdup(value); - if (dup == NULL) - return(0); - cur = dup; - while (*cur != 0) { - nam = cur; - while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; - save = *cur; - *cur = 0; - ent = xmlGetDocEntity(doc, nam); - if (ent == NULL) { - xmlErrValidNode(ctxt, (xmlNodePtr) doc, - XML_DTD_UNKNOWN_ENTITY, - "ENTITIES attribute %s reference an unknown entity \"%s\"\n", - name, nam, NULL); - ret = 0; - } else if (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { - xmlErrValidNode(ctxt, (xmlNodePtr) doc, - XML_DTD_ENTITY_TYPE, - "ENTITIES attribute %s reference an entity \"%s\" of wrong type\n", - name, nam, NULL); - ret = 0; - } - if (save == 0) - break; - *cur = save; - while (IS_BLANK_CH(*cur)) cur++; - } - xmlFree(dup); - break; - } - case XML_ATTRIBUTE_NOTATION: { - xmlNotationPtr nota; - - nota = xmlGetDtdNotationDesc(doc->intSubset, value); - if ((nota == NULL) && (doc->extSubset != NULL)) - nota = xmlGetDtdNotationDesc(doc->extSubset, value); - - if (nota == NULL) { - xmlErrValidNode(ctxt, (xmlNodePtr) doc, - XML_DTD_UNKNOWN_NOTATION, - "NOTATION attribute %s reference an unknown notation \"%s\"\n", - name, value, NULL); - ret = 0; - } - break; - } - } - return(ret); -} - -/** - * xmlValidCtxtNormalizeAttributeValue: - * @ctxt: the validation context - * @doc: the document - * @elem: the parent - * @name: the attribute name - * @value: the attribute value - * @ctxt: the validation context or NULL - * - * Does the validation related extra step of the normalization of attribute - * values: - * - * If the declared value is not CDATA, then the XML processor must further - * process the normalized attribute value by discarding any leading and - * trailing space (#x20) characters, and by replacing sequences of space - * (#x20) characters by single space (#x20) character. - * - * Also check VC: Standalone Document Declaration in P32, and update - * ctxt->valid accordingly - * - * returns a new normalized string if normalization is needed, NULL otherwise - * the caller must free the returned value. - */ - -xmlChar * -xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - xmlNodePtr elem, const xmlChar *name, const xmlChar *value) { - xmlChar *ret, *dst; - const xmlChar *src; - xmlAttributePtr attrDecl = NULL; - int extsubset = 0; - - if (doc == NULL) return(NULL); - if (elem == NULL) return(NULL); - if (name == NULL) return(NULL); - if (value == NULL) return(NULL); - - if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); - if (fullname == NULL) - return(NULL); - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, name); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) { - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullname, name); - if (attrDecl != NULL) - extsubset = 1; - } - if ((fullname != fn) && (fullname != elem->name)) - xmlFree(fullname); - } - if ((attrDecl == NULL) && (doc->intSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, name); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) { - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, elem->name, name); - if (attrDecl != NULL) - extsubset = 1; - } - - if (attrDecl == NULL) - return(NULL); - if (attrDecl->atype == XML_ATTRIBUTE_CDATA) - return(NULL); - - ret = xmlStrdup(value); - if (ret == NULL) - return(NULL); - src = value; - dst = ret; - while (*src == 0x20) src++; - while (*src != 0) { - if (*src == 0x20) { - while (*src == 0x20) src++; - if (*src != 0) - *dst++ = 0x20; - } else { - *dst++ = *src++; - } - } - *dst = 0; - if ((doc->standalone) && (extsubset == 1) && (!xmlStrEqual(value, ret))) { - xmlErrValidNode(ctxt, elem, XML_DTD_NOT_STANDALONE, -"standalone: %s on %s value had to be normalized based on external subset declaration\n", - name, elem->name, NULL); - ctxt->valid = 0; - } - return(ret); -} - -/** - * xmlValidNormalizeAttributeValue: - * @doc: the document - * @elem: the parent - * @name: the attribute name - * @value: the attribute value - * - * Does the validation related extra step of the normalization of attribute - * values: - * - * If the declared value is not CDATA, then the XML processor must further - * process the normalized attribute value by discarding any leading and - * trailing space (#x20) characters, and by replacing sequences of space - * (#x20) characters by single space (#x20) character. - * - * Returns a new normalized string if normalization is needed, NULL otherwise - * the caller must free the returned value. - */ - -xmlChar * -xmlValidNormalizeAttributeValue(xmlDocPtr doc, xmlNodePtr elem, - const xmlChar *name, const xmlChar *value) { - xmlChar *ret, *dst; - const xmlChar *src; - xmlAttributePtr attrDecl = NULL; - - if (doc == NULL) return(NULL); - if (elem == NULL) return(NULL); - if (name == NULL) return(NULL); - if (value == NULL) return(NULL); - - if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); - if (fullname == NULL) - return(NULL); - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, name); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullname, name); - if ((fullname != fn) && (fullname != elem->name)) - xmlFree(fullname); - } - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, name); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, elem->name, name); - - if (attrDecl == NULL) - return(NULL); - if (attrDecl->atype == XML_ATTRIBUTE_CDATA) - return(NULL); - - ret = xmlStrdup(value); - if (ret == NULL) - return(NULL); - src = value; - dst = ret; - while (*src == 0x20) src++; - while (*src != 0) { - if (*src == 0x20) { - while (*src == 0x20) src++; - if (*src != 0) - *dst++ = 0x20; - } else { - *dst++ = *src++; - } - } - *dst = 0; - return(ret); -} - -static void -xmlValidateAttributeIdCallback(xmlAttributePtr attr, int *count, - const xmlChar* name ATTRIBUTE_UNUSED) { - if (attr->atype == XML_ATTRIBUTE_ID) (*count)++; -} - -/** - * xmlValidateAttributeDecl: - * @ctxt: the validation context - * @doc: a document instance - * @attr: an attribute definition - * - * Try to validate a single attribute definition - * basically it does the following checks as described by the - * XML-1.0 recommendation: - * - [ VC: Attribute Default Legal ] - * - [ VC: Enumeration ] - * - [ VC: ID Attribute Default ] - * - * The ID/IDREF uniqueness and matching are done separately - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - xmlAttributePtr attr) { - int ret = 1; - int val; - CHECK_DTD; - if(attr == NULL) return(1); - - /* Attribute Default Legal */ - /* Enumeration */ - if (attr->defaultValue != NULL) { - val = xmlValidateAttributeValue(attr->atype, attr->defaultValue); - if (val == 0) { - xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_DEFAULT, - "Syntax of default value for attribute %s of %s is not valid\n", - attr->name, attr->elem, NULL); - } - ret &= val; - } - - /* ID Attribute Default */ - if ((attr->atype == XML_ATTRIBUTE_ID)&& - (attr->def != XML_ATTRIBUTE_IMPLIED) && - (attr->def != XML_ATTRIBUTE_REQUIRED)) { - xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ID_FIXED, - "ID attribute %s of %s is not valid must be #IMPLIED or #REQUIRED\n", - attr->name, attr->elem, NULL); - ret = 0; - } - - /* One ID per Element Type */ - if (attr->atype == XML_ATTRIBUTE_ID) { - int nbId; - - /* the trick is that we parse DtD as their own internal subset */ - xmlElementPtr elem = xmlGetDtdElementDesc(doc->intSubset, - attr->elem); - if (elem != NULL) { - nbId = xmlScanIDAttributeDecl(NULL, elem, 0); - } else { - xmlAttributeTablePtr table; - - /* - * The attribute may be declared in the internal subset and the - * element in the external subset. - */ - nbId = 0; - if (doc->intSubset != NULL) { - table = (xmlAttributeTablePtr) doc->intSubset->attributes; - xmlHashScan3(table, NULL, NULL, attr->elem, (xmlHashScanner) - xmlValidateAttributeIdCallback, &nbId); - } - } - if (nbId > 1) { - - xmlErrValidNodeNr(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, - "Element %s has %d ID attribute defined in the internal subset : %s\n", - attr->elem, nbId, attr->name); - } else if (doc->extSubset != NULL) { - int extId = 0; - elem = xmlGetDtdElementDesc(doc->extSubset, attr->elem); - if (elem != NULL) { - extId = xmlScanIDAttributeDecl(NULL, elem, 0); - } - if (extId > 1) { - xmlErrValidNodeNr(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, - "Element %s has %d ID attribute defined in the external subset : %s\n", - attr->elem, extId, attr->name); - } else if (extId + nbId > 1) { - xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, -"Element %s has ID attributes defined in the internal and external subset : %s\n", - attr->elem, attr->name, NULL); - } - } - } - - /* Validity Constraint: Enumeration */ - if ((attr->defaultValue != NULL) && (attr->tree != NULL)) { - xmlEnumerationPtr tree = attr->tree; - while (tree != NULL) { - if (xmlStrEqual(tree->name, attr->defaultValue)) break; - tree = tree->next; - } - if (tree == NULL) { - xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_VALUE, -"Default value \"%s\" for attribute %s of %s is not among the enumerated set\n", - attr->defaultValue, attr->name, attr->elem); - ret = 0; - } - } - - return(ret); -} - -/** - * xmlValidateElementDecl: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element definition - * - * Try to validate a single element definition - * basically it does the following checks as described by the - * XML-1.0 recommendation: - * - [ VC: One ID per Element Type ] - * - [ VC: No Duplicate Types ] - * - [ VC: Unique Element Type Declaration ] - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateElementDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - xmlElementPtr elem) { - int ret = 1; - xmlElementPtr tst; - - CHECK_DTD; - - if (elem == NULL) return(1); - -#if 0 -#ifdef LIBXML_REGEXP_ENABLED - /* Build the regexp associated to the content model */ - ret = xmlValidBuildContentModel(ctxt, elem); -#endif -#endif - - /* No Duplicate Types */ - if (elem->etype == XML_ELEMENT_TYPE_MIXED) { - xmlElementContentPtr cur, next; - const xmlChar *name; - - cur = elem->content; - while (cur != NULL) { - if (cur->type != XML_ELEMENT_CONTENT_OR) break; - if (cur->c1 == NULL) break; - if (cur->c1->type == XML_ELEMENT_CONTENT_ELEMENT) { - name = cur->c1->name; - next = cur->c2; - while (next != NULL) { - if (next->type == XML_ELEMENT_CONTENT_ELEMENT) { - if ((xmlStrEqual(next->name, name)) && - (xmlStrEqual(next->prefix, cur->prefix))) { - if (cur->prefix == NULL) { - xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, - "Definition of %s has duplicate references of %s\n", - elem->name, name, NULL); - } else { - xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, - "Definition of %s has duplicate references of %s:%s\n", - elem->name, cur->prefix, name); - } - ret = 0; - } - break; - } - if (next->c1 == NULL) break; - if (next->c1->type != XML_ELEMENT_CONTENT_ELEMENT) break; - if ((xmlStrEqual(next->c1->name, name)) && - (xmlStrEqual(next->c1->prefix, cur->prefix))) { - if (cur->prefix == NULL) { - xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, - "Definition of %s has duplicate references to %s\n", - elem->name, name, NULL); - } else { - xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, - "Definition of %s has duplicate references to %s:%s\n", - elem->name, cur->prefix, name); - } - ret = 0; - } - next = next->c2; - } - } - cur = cur->c2; - } - } - - /* VC: Unique Element Type Declaration */ - tst = xmlGetDtdElementDesc(doc->intSubset, elem->name); - if ((tst != NULL ) && (tst != elem) && - ((tst->prefix == elem->prefix) || - (xmlStrEqual(tst->prefix, elem->prefix))) && - (tst->etype != XML_ELEMENT_TYPE_UNDEFINED)) { - xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_ELEM_REDEFINED, - "Redefinition of element %s\n", - elem->name, NULL, NULL); - ret = 0; - } - tst = xmlGetDtdElementDesc(doc->extSubset, elem->name); - if ((tst != NULL ) && (tst != elem) && - ((tst->prefix == elem->prefix) || - (xmlStrEqual(tst->prefix, elem->prefix))) && - (tst->etype != XML_ELEMENT_TYPE_UNDEFINED)) { - xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_ELEM_REDEFINED, - "Redefinition of element %s\n", - elem->name, NULL, NULL); - ret = 0; - } - /* One ID per Element Type - * already done when registering the attribute - if (xmlScanIDAttributeDecl(ctxt, elem) > 1) { - ret = 0; - } */ - return(ret); -} - -/** - * xmlValidateOneAttribute: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * @attr: an attribute instance - * @value: the attribute value (without entities processing) - * - * Try to validate a single attribute for an element - * basically it does the following checks as described by the - * XML-1.0 recommendation: - * - [ VC: Attribute Value Type ] - * - [ VC: Fixed Attribute Default ] - * - [ VC: Entity Name ] - * - [ VC: Name Token ] - * - [ VC: ID ] - * - [ VC: IDREF ] - * - [ VC: Entity Name ] - * - [ VC: Notation Attributes ] - * - * The ID/IDREF uniqueness and matching are done separately - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - xmlNodePtr elem, xmlAttrPtr attr, const xmlChar *value) -{ - xmlAttributePtr attrDecl = NULL; - int val; - int ret = 1; - - CHECK_DTD; - if ((elem == NULL) || (elem->name == NULL)) return(0); - if ((attr == NULL) || (attr->name == NULL)) return(0); - - if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); - if (fullname == NULL) - return(0); - if (attr->ns != NULL) { - attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, fullname, - attr->name, attr->ns->prefix); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, fullname, - attr->name, attr->ns->prefix); - } else { - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, attr->name); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, - fullname, attr->name); - } - if ((fullname != fn) && (fullname != elem->name)) - xmlFree(fullname); - } - if (attrDecl == NULL) { - if (attr->ns != NULL) { - attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elem->name, - attr->name, attr->ns->prefix); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elem->name, - attr->name, attr->ns->prefix); - } else { - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, - elem->name, attr->name); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, - elem->name, attr->name); - } - } - - - /* Validity Constraint: Attribute Value Type */ - if (attrDecl == NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, - "No declaration for attribute %s of element %s\n", - attr->name, elem->name, NULL); - return(0); - } - attr->atype = attrDecl->atype; - - val = xmlValidateAttributeValue(attrDecl->atype, value); - if (val == 0) { - xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, - "Syntax of value for attribute %s of %s is not valid\n", - attr->name, elem->name, NULL); - ret = 0; - } - - /* Validity constraint: Fixed Attribute Default */ - if (attrDecl->def == XML_ATTRIBUTE_FIXED) { - if (!xmlStrEqual(value, attrDecl->defaultValue)) { - xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, - "Value for attribute %s of %s is different from default \"%s\"\n", - attr->name, elem->name, attrDecl->defaultValue); - ret = 0; - } - } - - /* Validity Constraint: ID uniqueness */ - if (attrDecl->atype == XML_ATTRIBUTE_ID) { - if (xmlAddID(ctxt, doc, value, attr) == NULL) - ret = 0; - } - - if ((attrDecl->atype == XML_ATTRIBUTE_IDREF) || - (attrDecl->atype == XML_ATTRIBUTE_IDREFS)) { - if (xmlAddRef(ctxt, doc, value, attr) == NULL) - ret = 0; - } - - /* Validity Constraint: Notation Attributes */ - if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { - xmlEnumerationPtr tree = attrDecl->tree; - xmlNotationPtr nota; - - /* First check that the given NOTATION was declared */ - nota = xmlGetDtdNotationDesc(doc->intSubset, value); - if (nota == NULL) - nota = xmlGetDtdNotationDesc(doc->extSubset, value); - - if (nota == NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, - "Value \"%s\" for attribute %s of %s is not a declared Notation\n", - value, attr->name, elem->name); - ret = 0; - } - - /* Second, verify that it's among the list */ - while (tree != NULL) { - if (xmlStrEqual(tree->name, value)) break; - tree = tree->next; - } - if (tree == NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, -"Value \"%s\" for attribute %s of %s is not among the enumerated notations\n", - value, attr->name, elem->name); - ret = 0; - } - } - - /* Validity Constraint: Enumeration */ - if (attrDecl->atype == XML_ATTRIBUTE_ENUMERATION) { - xmlEnumerationPtr tree = attrDecl->tree; - while (tree != NULL) { - if (xmlStrEqual(tree->name, value)) break; - tree = tree->next; - } - if (tree == NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, - "Value \"%s\" for attribute %s of %s is not among the enumerated set\n", - value, attr->name, elem->name); - ret = 0; - } - } - - /* Fixed Attribute Default */ - if ((attrDecl->def == XML_ATTRIBUTE_FIXED) && - (!xmlStrEqual(attrDecl->defaultValue, value))) { - xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, - "Value for attribute %s of %s must be \"%s\"\n", - attr->name, elem->name, attrDecl->defaultValue); - ret = 0; - } - - /* Extra check for the attribute value */ - ret &= xmlValidateAttributeValue2(ctxt, doc, attr->name, - attrDecl->atype, value); - - return(ret); -} - -/** - * xmlValidateOneNamespace: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * @prefix: the namespace prefix - * @ns: an namespace declaration instance - * @value: the attribute value (without entities processing) - * - * Try to validate a single namespace declaration for an element - * basically it does the following checks as described by the - * XML-1.0 recommendation: - * - [ VC: Attribute Value Type ] - * - [ VC: Fixed Attribute Default ] - * - [ VC: Entity Name ] - * - [ VC: Name Token ] - * - [ VC: ID ] - * - [ VC: IDREF ] - * - [ VC: Entity Name ] - * - [ VC: Notation Attributes ] - * - * The ID/IDREF uniqueness and matching are done separately - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateOneNamespace(xmlValidCtxtPtr ctxt, xmlDocPtr doc, -xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { - /* xmlElementPtr elemDecl; */ - xmlAttributePtr attrDecl = NULL; - int val; - int ret = 1; - - CHECK_DTD; - if ((elem == NULL) || (elem->name == NULL)) return(0); - if ((ns == NULL) || (ns->href == NULL)) return(0); - - if (prefix != NULL) { - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(elem->name, prefix, fn, 50); - if (fullname == NULL) { - xmlVErrMemory(ctxt, "Validating namespace"); - return(0); - } - if (ns->prefix != NULL) { - attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, fullname, - ns->prefix, BAD_CAST "xmlns"); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, fullname, - ns->prefix, BAD_CAST "xmlns"); - } else { - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, - BAD_CAST "xmlns"); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullname, - BAD_CAST "xmlns"); - } - if ((fullname != fn) && (fullname != elem->name)) - xmlFree(fullname); - } - if (attrDecl == NULL) { - if (ns->prefix != NULL) { - attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elem->name, - ns->prefix, BAD_CAST "xmlns"); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elem->name, - ns->prefix, BAD_CAST "xmlns"); - } else { - attrDecl = xmlGetDtdAttrDesc(doc->intSubset, - elem->name, BAD_CAST "xmlns"); - if ((attrDecl == NULL) && (doc->extSubset != NULL)) - attrDecl = xmlGetDtdAttrDesc(doc->extSubset, - elem->name, BAD_CAST "xmlns"); - } - } - - - /* Validity Constraint: Attribute Value Type */ - if (attrDecl == NULL) { - if (ns->prefix != NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, - "No declaration for attribute xmlns:%s of element %s\n", - ns->prefix, elem->name, NULL); - } else { - xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, - "No declaration for attribute xmlns of element %s\n", - elem->name, NULL, NULL); - } - return(0); - } - - val = xmlValidateAttributeValue(attrDecl->atype, value); - if (val == 0) { - if (ns->prefix != NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT, - "Syntax of value for attribute xmlns:%s of %s is not valid\n", - ns->prefix, elem->name, NULL); - } else { - xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT, - "Syntax of value for attribute xmlns of %s is not valid\n", - elem->name, NULL, NULL); - } - ret = 0; - } - - /* Validity constraint: Fixed Attribute Default */ - if (attrDecl->def == XML_ATTRIBUTE_FIXED) { - if (!xmlStrEqual(value, attrDecl->defaultValue)) { - if (ns->prefix != NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, - "Value for attribute xmlns:%s of %s is different from default \"%s\"\n", - ns->prefix, elem->name, attrDecl->defaultValue); - } else { - xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, - "Value for attribute xmlns of %s is different from default \"%s\"\n", - elem->name, attrDecl->defaultValue, NULL); - } - ret = 0; - } - } - - /* Validity Constraint: ID uniqueness */ - if (attrDecl->atype == XML_ATTRIBUTE_ID) { - if (xmlAddID(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) - ret = 0; - } - - if ((attrDecl->atype == XML_ATTRIBUTE_IDREF) || - (attrDecl->atype == XML_ATTRIBUTE_IDREFS)) { - if (xmlAddRef(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) - ret = 0; - } - - /* Validity Constraint: Notation Attributes */ - if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { - xmlEnumerationPtr tree = attrDecl->tree; - xmlNotationPtr nota; - - /* First check that the given NOTATION was declared */ - nota = xmlGetDtdNotationDesc(doc->intSubset, value); - if (nota == NULL) - nota = xmlGetDtdNotationDesc(doc->extSubset, value); - - if (nota == NULL) { - if (ns->prefix != NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, - "Value \"%s\" for attribute xmlns:%s of %s is not a declared Notation\n", - value, ns->prefix, elem->name); - } else { - xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, - "Value \"%s\" for attribute xmlns of %s is not a declared Notation\n", - value, elem->name, NULL); - } - ret = 0; - } - - /* Second, verify that it's among the list */ - while (tree != NULL) { - if (xmlStrEqual(tree->name, value)) break; - tree = tree->next; - } - if (tree == NULL) { - if (ns->prefix != NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, -"Value \"%s\" for attribute xmlns:%s of %s is not among the enumerated notations\n", - value, ns->prefix, elem->name); - } else { - xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, -"Value \"%s\" for attribute xmlns of %s is not among the enumerated notations\n", - value, elem->name, NULL); - } - ret = 0; - } - } - - /* Validity Constraint: Enumeration */ - if (attrDecl->atype == XML_ATTRIBUTE_ENUMERATION) { - xmlEnumerationPtr tree = attrDecl->tree; - while (tree != NULL) { - if (xmlStrEqual(tree->name, value)) break; - tree = tree->next; - } - if (tree == NULL) { - if (ns->prefix != NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, -"Value \"%s\" for attribute xmlns:%s of %s is not among the enumerated set\n", - value, ns->prefix, elem->name); - } else { - xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, -"Value \"%s\" for attribute xmlns of %s is not among the enumerated set\n", - value, elem->name, NULL); - } - ret = 0; - } - } - - /* Fixed Attribute Default */ - if ((attrDecl->def == XML_ATTRIBUTE_FIXED) && - (!xmlStrEqual(attrDecl->defaultValue, value))) { - if (ns->prefix != NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, - "Value for attribute xmlns:%s of %s must be \"%s\"\n", - ns->prefix, elem->name, attrDecl->defaultValue); - } else { - xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, - "Value for attribute xmlns of %s must be \"%s\"\n", - elem->name, attrDecl->defaultValue, NULL); - } - ret = 0; - } - - /* Extra check for the attribute value */ - if (ns->prefix != NULL) { - ret &= xmlValidateAttributeValue2(ctxt, doc, ns->prefix, - attrDecl->atype, value); - } else { - ret &= xmlValidateAttributeValue2(ctxt, doc, BAD_CAST "xmlns", - attrDecl->atype, value); - } - - return(ret); -} - -#ifndef LIBXML_REGEXP_ENABLED -/** - * xmlValidateSkipIgnorable: - * @ctxt: the validation context - * @child: the child list - * - * Skip ignorable elements w.r.t. the validation process - * - * returns the first element to consider for validation of the content model - */ - -static xmlNodePtr -xmlValidateSkipIgnorable(xmlNodePtr child) { - while (child != NULL) { - switch (child->type) { - /* These things are ignored (skipped) during validation. */ - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - child = child->next; - break; - case XML_TEXT_NODE: - if (xmlIsBlankNode(child)) - child = child->next; - else - return(child); - break; - /* keep current node */ - default: - return(child); - } - } - return(child); -} - -/** - * xmlValidateElementType: - * @ctxt: the validation context - * - * Try to validate the content model of an element internal function - * - * returns 1 if valid or 0 ,-1 in case of error, -2 if an entity - * reference is found and -3 if the validation succeeded but - * the content model is not determinist. - */ - -static int -xmlValidateElementType(xmlValidCtxtPtr ctxt) { - int ret = -1; - int determinist = 1; - - NODE = xmlValidateSkipIgnorable(NODE); - if ((NODE == NULL) && (CONT == NULL)) - return(1); - if ((NODE == NULL) && - ((CONT->ocur == XML_ELEMENT_CONTENT_MULT) || - (CONT->ocur == XML_ELEMENT_CONTENT_OPT))) { - return(1); - } - if (CONT == NULL) return(-1); - if ((NODE != NULL) && (NODE->type == XML_ENTITY_REF_NODE)) - return(-2); - - /* - * We arrive here when more states need to be examined - */ -cont: - - /* - * We just recovered from a rollback generated by a possible - * epsilon transition, go directly to the analysis phase - */ - if (STATE == ROLLBACK_PARENT) { - DEBUG_VALID_MSG("restored parent branch"); - DEBUG_VALID_STATE(NODE, CONT) - ret = 1; - goto analyze; - } - - DEBUG_VALID_STATE(NODE, CONT) - /* - * we may have to save a backup state here. This is the equivalent - * of handling epsilon transition in NFAs. - */ - if ((CONT != NULL) && - ((CONT->parent == NULL) || - (CONT->parent->type != XML_ELEMENT_CONTENT_OR)) && - ((CONT->ocur == XML_ELEMENT_CONTENT_MULT) || - (CONT->ocur == XML_ELEMENT_CONTENT_OPT) || - ((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURRENCE)))) { - DEBUG_VALID_MSG("saving parent branch"); - if (vstateVPush(ctxt, CONT, NODE, DEPTH, OCCURS, ROLLBACK_PARENT) < 0) - return(0); - } - - - /* - * Check first if the content matches - */ - switch (CONT->type) { - case XML_ELEMENT_CONTENT_PCDATA: - if (NODE == NULL) { - DEBUG_VALID_MSG("pcdata failed no node"); - ret = 0; - break; - } - if (NODE->type == XML_TEXT_NODE) { - DEBUG_VALID_MSG("pcdata found, skip to next"); - /* - * go to next element in the content model - * skipping ignorable elems - */ - do { - NODE = NODE->next; - NODE = xmlValidateSkipIgnorable(NODE); - if ((NODE != NULL) && - (NODE->type == XML_ENTITY_REF_NODE)) - return(-2); - } while ((NODE != NULL) && - ((NODE->type != XML_ELEMENT_NODE) && - (NODE->type != XML_TEXT_NODE) && - (NODE->type != XML_CDATA_SECTION_NODE))); - ret = 1; - break; - } else { - DEBUG_VALID_MSG("pcdata failed"); - ret = 0; - break; - } - break; - case XML_ELEMENT_CONTENT_ELEMENT: - if (NODE == NULL) { - DEBUG_VALID_MSG("element failed no node"); - ret = 0; - break; - } - ret = ((NODE->type == XML_ELEMENT_NODE) && - (xmlStrEqual(NODE->name, CONT->name))); - if (ret == 1) { - if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { - ret = (CONT->prefix == NULL); - } else if (CONT->prefix == NULL) { - ret = 0; - } else { - ret = xmlStrEqual(NODE->ns->prefix, CONT->prefix); - } - } - if (ret == 1) { - DEBUG_VALID_MSG("element found, skip to next"); - /* - * go to next element in the content model - * skipping ignorable elems - */ - do { - NODE = NODE->next; - NODE = xmlValidateSkipIgnorable(NODE); - if ((NODE != NULL) && - (NODE->type == XML_ENTITY_REF_NODE)) - return(-2); - } while ((NODE != NULL) && - ((NODE->type != XML_ELEMENT_NODE) && - (NODE->type != XML_TEXT_NODE) && - (NODE->type != XML_CDATA_SECTION_NODE))); - } else { - DEBUG_VALID_MSG("element failed"); - ret = 0; - break; - } - break; - case XML_ELEMENT_CONTENT_OR: - /* - * Small optimization. - */ - if (CONT->c1->type == XML_ELEMENT_CONTENT_ELEMENT) { - if ((NODE == NULL) || - (!xmlStrEqual(NODE->name, CONT->c1->name))) { - DEPTH++; - CONT = CONT->c2; - goto cont; - } - if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { - ret = (CONT->c1->prefix == NULL); - } else if (CONT->c1->prefix == NULL) { - ret = 0; - } else { - ret = xmlStrEqual(NODE->ns->prefix, CONT->c1->prefix); - } - if (ret == 0) { - DEPTH++; - CONT = CONT->c2; - goto cont; - } - } - - /* - * save the second branch 'or' branch - */ - DEBUG_VALID_MSG("saving 'or' branch"); - if (vstateVPush(ctxt, CONT->c2, NODE, (unsigned char)(DEPTH + 1), - OCCURS, ROLLBACK_OR) < 0) - return(-1); - DEPTH++; - CONT = CONT->c1; - goto cont; - case XML_ELEMENT_CONTENT_SEQ: - /* - * Small optimization. - */ - if ((CONT->c1->type == XML_ELEMENT_CONTENT_ELEMENT) && - ((CONT->c1->ocur == XML_ELEMENT_CONTENT_OPT) || - (CONT->c1->ocur == XML_ELEMENT_CONTENT_MULT))) { - if ((NODE == NULL) || - (!xmlStrEqual(NODE->name, CONT->c1->name))) { - DEPTH++; - CONT = CONT->c2; - goto cont; - } - if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { - ret = (CONT->c1->prefix == NULL); - } else if (CONT->c1->prefix == NULL) { - ret = 0; - } else { - ret = xmlStrEqual(NODE->ns->prefix, CONT->c1->prefix); - } - if (ret == 0) { - DEPTH++; - CONT = CONT->c2; - goto cont; - } - } - DEPTH++; - CONT = CONT->c1; - goto cont; - } - - /* - * At this point handle going up in the tree - */ - if (ret == -1) { - DEBUG_VALID_MSG("error found returning"); - return(ret); - } -analyze: - while (CONT != NULL) { - /* - * First do the analysis depending on the occurrence model at - * this level. - */ - if (ret == 0) { - switch (CONT->ocur) { - xmlNodePtr cur; - - case XML_ELEMENT_CONTENT_ONCE: - cur = ctxt->vstate->node; - DEBUG_VALID_MSG("Once branch failed, rollback"); - if (vstateVPop(ctxt) < 0 ) { - DEBUG_VALID_MSG("exhaustion, failed"); - return(0); - } - if (cur != ctxt->vstate->node) - determinist = -3; - goto cont; - case XML_ELEMENT_CONTENT_PLUS: - if (OCCURRENCE == 0) { - cur = ctxt->vstate->node; - DEBUG_VALID_MSG("Plus branch failed, rollback"); - if (vstateVPop(ctxt) < 0 ) { - DEBUG_VALID_MSG("exhaustion, failed"); - return(0); - } - if (cur != ctxt->vstate->node) - determinist = -3; - goto cont; - } - DEBUG_VALID_MSG("Plus branch found"); - ret = 1; - break; - case XML_ELEMENT_CONTENT_MULT: -#ifdef DEBUG_VALID_ALGO - if (OCCURRENCE == 0) { - DEBUG_VALID_MSG("Mult branch failed"); - } else { - DEBUG_VALID_MSG("Mult branch found"); - } -#endif - ret = 1; - break; - case XML_ELEMENT_CONTENT_OPT: - DEBUG_VALID_MSG("Option branch failed"); - ret = 1; - break; - } - } else { - switch (CONT->ocur) { - case XML_ELEMENT_CONTENT_OPT: - DEBUG_VALID_MSG("Option branch succeeded"); - ret = 1; - break; - case XML_ELEMENT_CONTENT_ONCE: - DEBUG_VALID_MSG("Once branch succeeded"); - ret = 1; - break; - case XML_ELEMENT_CONTENT_PLUS: - if (STATE == ROLLBACK_PARENT) { - DEBUG_VALID_MSG("Plus branch rollback"); - ret = 1; - break; - } - if (NODE == NULL) { - DEBUG_VALID_MSG("Plus branch exhausted"); - ret = 1; - break; - } - DEBUG_VALID_MSG("Plus branch succeeded, continuing"); - SET_OCCURRENCE; - goto cont; - case XML_ELEMENT_CONTENT_MULT: - if (STATE == ROLLBACK_PARENT) { - DEBUG_VALID_MSG("Mult branch rollback"); - ret = 1; - break; - } - if (NODE == NULL) { - DEBUG_VALID_MSG("Mult branch exhausted"); - ret = 1; - break; - } - DEBUG_VALID_MSG("Mult branch succeeded, continuing"); - /* SET_OCCURRENCE; */ - goto cont; - } - } - STATE = 0; - - /* - * Then act accordingly at the parent level - */ - RESET_OCCURRENCE; - if (CONT->parent == NULL) - break; - - switch (CONT->parent->type) { - case XML_ELEMENT_CONTENT_PCDATA: - DEBUG_VALID_MSG("Error: parent pcdata"); - return(-1); - case XML_ELEMENT_CONTENT_ELEMENT: - DEBUG_VALID_MSG("Error: parent element"); - return(-1); - case XML_ELEMENT_CONTENT_OR: - if (ret == 1) { - DEBUG_VALID_MSG("Or succeeded"); - CONT = CONT->parent; - DEPTH--; - } else { - DEBUG_VALID_MSG("Or failed"); - CONT = CONT->parent; - DEPTH--; - } - break; - case XML_ELEMENT_CONTENT_SEQ: - if (ret == 0) { - DEBUG_VALID_MSG("Sequence failed"); - CONT = CONT->parent; - DEPTH--; - } else if (CONT == CONT->parent->c1) { - DEBUG_VALID_MSG("Sequence testing 2nd branch"); - CONT = CONT->parent->c2; - goto cont; - } else { - DEBUG_VALID_MSG("Sequence succeeded"); - CONT = CONT->parent; - DEPTH--; - } - } - } - if (NODE != NULL) { - xmlNodePtr cur; - - cur = ctxt->vstate->node; - DEBUG_VALID_MSG("Failed, remaining input, rollback"); - if (vstateVPop(ctxt) < 0 ) { - DEBUG_VALID_MSG("exhaustion, failed"); - return(0); - } - if (cur != ctxt->vstate->node) - determinist = -3; - goto cont; - } - if (ret == 0) { - xmlNodePtr cur; - - cur = ctxt->vstate->node; - DEBUG_VALID_MSG("Failure, rollback"); - if (vstateVPop(ctxt) < 0 ) { - DEBUG_VALID_MSG("exhaustion, failed"); - return(0); - } - if (cur != ctxt->vstate->node) - determinist = -3; - goto cont; - } - return(determinist); -} -#endif - -/** - * xmlSnprintfElements: - * @buf: an output buffer - * @size: the size of the buffer - * @content: An element - * @glob: 1 if one must print the englobing parenthesis, 0 otherwise - * - * This will dump the list of elements to the buffer - * Intended just for the debug routine - */ -static void -xmlSnprintfElements(char *buf, int size, xmlNodePtr node, int glob) { - xmlNodePtr cur; - int len; - - if (node == NULL) return; - if (glob) strcat(buf, "("); - cur = node; - while (cur != NULL) { - len = strlen(buf); - if (size - len < 50) { - if ((size - len > 4) && (buf[len - 1] != '.')) - strcat(buf, " ..."); - return; - } - switch (cur->type) { - case XML_ELEMENT_NODE: - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - if (size - len < xmlStrlen(cur->ns->prefix) + 10) { - if ((size - len > 4) && (buf[len - 1] != '.')) - strcat(buf, " ..."); - return; - } - strcat(buf, (char *) cur->ns->prefix); - strcat(buf, ":"); - } - if (size - len < xmlStrlen(cur->name) + 10) { - if ((size - len > 4) && (buf[len - 1] != '.')) - strcat(buf, " ..."); - return; - } - strcat(buf, (char *) cur->name); - if (cur->next != NULL) - strcat(buf, " "); - break; - case XML_TEXT_NODE: - if (xmlIsBlankNode(cur)) - break; - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - strcat(buf, "CDATA"); - if (cur->next != NULL) - strcat(buf, " "); - break; - case XML_ATTRIBUTE_NODE: - case XML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_HTML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_NAMESPACE_DECL: - strcat(buf, "???"); - if (cur->next != NULL) - strcat(buf, " "); - break; - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_DTD_NODE: - case XML_COMMENT_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - break; - } - cur = cur->next; - } - if (glob) strcat(buf, ")"); -} - -/** - * xmlValidateElementContent: - * @ctxt: the validation context - * @child: the child list - * @elemDecl: pointer to the element declaration - * @warn: emit the error message - * @parent: the parent element (for error reporting) - * - * Try to validate the content model of an element - * - * returns 1 if valid or 0 if not and -1 in case of error - */ - -static int -xmlValidateElementContent(xmlValidCtxtPtr ctxt, xmlNodePtr child, - xmlElementPtr elemDecl, int warn, xmlNodePtr parent) { - int ret = 1; -#ifndef LIBXML_REGEXP_ENABLED - xmlNodePtr repl = NULL, last = NULL, tmp; -#endif - xmlNodePtr cur; - xmlElementContentPtr cont; - const xmlChar *name; - - if (elemDecl == NULL) - return(-1); - cont = elemDecl->content; - name = elemDecl->name; - -#ifdef LIBXML_REGEXP_ENABLED - /* Build the regexp associated to the content model */ - if (elemDecl->contModel == NULL) - ret = xmlValidBuildContentModel(ctxt, elemDecl); - if (elemDecl->contModel == NULL) { - return(-1); - } else { - xmlRegExecCtxtPtr exec; - - if (!xmlRegexpIsDeterminist(elemDecl->contModel)) { - return(-1); - } - ctxt->nodeMax = 0; - ctxt->nodeNr = 0; - ctxt->nodeTab = NULL; - exec = xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL); - if (exec != NULL) { - cur = child; - while (cur != NULL) { - switch (cur->type) { - case XML_ENTITY_REF_NODE: - /* - * Push the current node to be able to roll back - * and process within the entity - */ - if ((cur->children != NULL) && - (cur->children->children != NULL)) { - nodeVPush(ctxt, cur); - cur = cur->children->children; - continue; - } - break; - case XML_TEXT_NODE: - if (xmlIsBlankNode(cur)) - break; - ret = 0; - goto fail; - case XML_CDATA_SECTION_NODE: - /* TODO */ - ret = 0; - goto fail; - case XML_ELEMENT_NODE: - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(cur->name, - cur->ns->prefix, fn, 50); - if (fullname == NULL) { - ret = -1; - goto fail; - } - ret = xmlRegExecPushString(exec, fullname, NULL); - if ((fullname != fn) && (fullname != cur->name)) - xmlFree(fullname); - } else { - ret = xmlRegExecPushString(exec, cur->name, NULL); - } - break; - default: - break; - } - /* - * Switch to next element - */ - cur = cur->next; - while (cur == NULL) { - cur = nodeVPop(ctxt); - if (cur == NULL) - break; - cur = cur->next; - } - } - ret = xmlRegExecPushString(exec, NULL, NULL); -fail: - xmlRegFreeExecCtxt(exec); - } - } -#else /* LIBXML_REGEXP_ENABLED */ - /* - * Allocate the stack - */ - ctxt->vstateMax = 8; - ctxt->vstateTab = (xmlValidState *) xmlMalloc( - ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); - if (ctxt->vstateTab == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - return(-1); - } - /* - * The first entry in the stack is reserved to the current state - */ - ctxt->nodeMax = 0; - ctxt->nodeNr = 0; - ctxt->nodeTab = NULL; - ctxt->vstate = &ctxt->vstateTab[0]; - ctxt->vstateNr = 1; - CONT = cont; - NODE = child; - DEPTH = 0; - OCCURS = 0; - STATE = 0; - ret = xmlValidateElementType(ctxt); - if ((ret == -3) && (warn)) { - xmlErrValidWarning(ctxt, child, XML_DTD_CONTENT_NOT_DETERMINIST, - "Content model for Element %s is ambiguous\n", - name, NULL, NULL); - } else if (ret == -2) { - /* - * An entities reference appeared at this level. - * Buid a minimal representation of this node content - * sufficient to run the validation process on it - */ - DEBUG_VALID_MSG("Found an entity reference, linearizing"); - cur = child; - while (cur != NULL) { - switch (cur->type) { - case XML_ENTITY_REF_NODE: - /* - * Push the current node to be able to roll back - * and process within the entity - */ - if ((cur->children != NULL) && - (cur->children->children != NULL)) { - nodeVPush(ctxt, cur); - cur = cur->children->children; - continue; - } - break; - case XML_TEXT_NODE: - if (xmlIsBlankNode(cur)) - break; - /* no break on purpose */ - case XML_CDATA_SECTION_NODE: - /* no break on purpose */ - case XML_ELEMENT_NODE: - /* - * Allocate a new node and minimally fills in - * what's required - */ - tmp = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); - if (tmp == NULL) { - xmlVErrMemory(ctxt, "malloc failed"); - xmlFreeNodeList(repl); - ret = -1; - goto done; - } - tmp->type = cur->type; - tmp->name = cur->name; - tmp->ns = cur->ns; - tmp->next = NULL; - tmp->content = NULL; - if (repl == NULL) - repl = last = tmp; - else { - last->next = tmp; - last = tmp; - } - if (cur->type == XML_CDATA_SECTION_NODE) { - /* - * E59 spaces in CDATA does not match the - * nonterminal S - */ - tmp->content = xmlStrdup(BAD_CAST "CDATA"); - } - break; - default: - break; - } - /* - * Switch to next element - */ - cur = cur->next; - while (cur == NULL) { - cur = nodeVPop(ctxt); - if (cur == NULL) - break; - cur = cur->next; - } - } - - /* - * Relaunch the validation - */ - ctxt->vstate = &ctxt->vstateTab[0]; - ctxt->vstateNr = 1; - CONT = cont; - NODE = repl; - DEPTH = 0; - OCCURS = 0; - STATE = 0; - ret = xmlValidateElementType(ctxt); - } -#endif /* LIBXML_REGEXP_ENABLED */ - if ((warn) && ((ret != 1) && (ret != -3))) { - if (ctxt != NULL) { - char expr[5000]; - char list[5000]; - - expr[0] = 0; - xmlSnprintfElementContent(&expr[0], 5000, cont, 1); - list[0] = 0; -#ifndef LIBXML_REGEXP_ENABLED - if (repl != NULL) - xmlSnprintfElements(&list[0], 5000, repl, 1); - else -#endif /* LIBXML_REGEXP_ENABLED */ - xmlSnprintfElements(&list[0], 5000, child, 1); - - if (name != NULL) { - xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, - "Element %s content does not follow the DTD, expecting %s, got %s\n", - name, BAD_CAST expr, BAD_CAST list); - } else { - xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, - "Element content does not follow the DTD, expecting %s, got %s\n", - BAD_CAST expr, BAD_CAST list, NULL); - } - } else { - if (name != NULL) { - xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, - "Element %s content does not follow the DTD\n", - name, NULL, NULL); - } else { - xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, - "Element content does not follow the DTD\n", - NULL, NULL, NULL); - } - } - ret = 0; - } - if (ret == -3) - ret = 1; - -#ifndef LIBXML_REGEXP_ENABLED -done: - /* - * Deallocate the copy if done, and free up the validation stack - */ - while (repl != NULL) { - tmp = repl->next; - xmlFree(repl); - repl = tmp; - } - ctxt->vstateMax = 0; - if (ctxt->vstateTab != NULL) { - xmlFree(ctxt->vstateTab); - ctxt->vstateTab = NULL; - } -#endif - ctxt->nodeMax = 0; - ctxt->nodeNr = 0; - if (ctxt->nodeTab != NULL) { - xmlFree(ctxt->nodeTab); - ctxt->nodeTab = NULL; - } - return(ret); - -} - -/** - * xmlValidateCdataElement: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * - * Check that an element follows #CDATA - * - * returns 1 if valid or 0 otherwise - */ -static int -xmlValidateOneCdataElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - xmlNodePtr elem) { - int ret = 1; - xmlNodePtr cur, child; - - if ((ctxt == NULL) || (doc == NULL) || (elem == NULL)) - return(0); - - child = elem->children; - - cur = child; - while (cur != NULL) { - switch (cur->type) { - case XML_ENTITY_REF_NODE: - /* - * Push the current node to be able to roll back - * and process within the entity - */ - if ((cur->children != NULL) && - (cur->children->children != NULL)) { - nodeVPush(ctxt, cur); - cur = cur->children->children; - continue; - } - break; - case XML_COMMENT_NODE: - case XML_PI_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - break; - default: - ret = 0; - goto done; - } - /* - * Switch to next element - */ - cur = cur->next; - while (cur == NULL) { - cur = nodeVPop(ctxt); - if (cur == NULL) - break; - cur = cur->next; - } - } -done: - ctxt->nodeMax = 0; - ctxt->nodeNr = 0; - if (ctxt->nodeTab != NULL) { - xmlFree(ctxt->nodeTab); - ctxt->nodeTab = NULL; - } - return(ret); -} - -/** - * xmlValidateCheckMixed: - * @ctxt: the validation context - * @cont: the mixed content model - * @qname: the qualified name as appearing in the serialization - * - * Check if the given node is part of the content model. - * - * Returns 1 if yes, 0 if no, -1 in case of error - */ -static int -xmlValidateCheckMixed(xmlValidCtxtPtr ctxt, - xmlElementContentPtr cont, const xmlChar *qname) { - const xmlChar *name; - int plen; - name = xmlSplitQName3(qname, &plen); - - if (name == NULL) { - while (cont != NULL) { - if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { - if ((cont->prefix == NULL) && (xmlStrEqual(cont->name, qname))) - return(1); - } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && - (cont->c1 != NULL) && - (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ - if ((cont->c1->prefix == NULL) && - (xmlStrEqual(cont->c1->name, qname))) - return(1); - } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || - (cont->c1 == NULL) || - (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ - xmlErrValid(NULL, XML_DTD_MIXED_CORRUPT, - "Internal: MIXED struct corrupted\n", - NULL); - break; - } - cont = cont->c2; - } - } else { - while (cont != NULL) { - if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { - if ((cont->prefix != NULL) && - (xmlStrncmp(cont->prefix, qname, plen) == 0) && - (xmlStrEqual(cont->name, name))) - return(1); - } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && - (cont->c1 != NULL) && - (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ - if ((cont->c1->prefix != NULL) && - (xmlStrncmp(cont->c1->prefix, qname, plen) == 0) && - (xmlStrEqual(cont->c1->name, name))) - return(1); - } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || - (cont->c1 == NULL) || - (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ - xmlErrValid(ctxt, XML_DTD_MIXED_CORRUPT, - "Internal: MIXED struct corrupted\n", - NULL); - break; - } - cont = cont->c2; - } - } - return(0); -} - -/** - * xmlValidGetElemDecl: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * @extsubset: pointer, (out) indicate if the declaration was found - * in the external subset. - * - * Finds a declaration associated to an element in the document. - * - * returns the pointer to the declaration or NULL if not found. - */ -static xmlElementPtr -xmlValidGetElemDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - xmlNodePtr elem, int *extsubset) { - xmlElementPtr elemDecl = NULL; - const xmlChar *prefix = NULL; - - if ((ctxt == NULL) || (doc == NULL) || - (elem == NULL) || (elem->name == NULL)) - return(NULL); - if (extsubset != NULL) - *extsubset = 0; - - /* - * Fetch the declaration for the qualified name - */ - if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) - prefix = elem->ns->prefix; - - if (prefix != NULL) { - elemDecl = xmlGetDtdQElementDesc(doc->intSubset, - elem->name, prefix); - if ((elemDecl == NULL) && (doc->extSubset != NULL)) { - elemDecl = xmlGetDtdQElementDesc(doc->extSubset, - elem->name, prefix); - if ((elemDecl != NULL) && (extsubset != NULL)) - *extsubset = 1; - } - } - - /* - * Fetch the declaration for the non qualified name - * This is "non-strict" validation should be done on the - * full QName but in that case being flexible makes sense. - */ - if (elemDecl == NULL) { - elemDecl = xmlGetDtdElementDesc(doc->intSubset, elem->name); - if ((elemDecl == NULL) && (doc->extSubset != NULL)) { - elemDecl = xmlGetDtdElementDesc(doc->extSubset, elem->name); - if ((elemDecl != NULL) && (extsubset != NULL)) - *extsubset = 1; - } - } - if (elemDecl == NULL) { - xmlErrValidNode(ctxt, elem, - XML_DTD_UNKNOWN_ELEM, - "No declaration for element %s\n", - elem->name, NULL, NULL); - } - return(elemDecl); -} - -#ifdef LIBXML_REGEXP_ENABLED -/** - * xmlValidatePushElement: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * @qname: the qualified name as appearing in the serialization - * - * Push a new element start on the validation stack. - * - * returns 1 if no validation problem was found or 0 otherwise - */ -int -xmlValidatePushElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - xmlNodePtr elem, const xmlChar *qname) { - int ret = 1; - xmlElementPtr eDecl; - int extsubset = 0; - - if (ctxt == NULL) - return(0); -/* printf("PushElem %s\n", qname); */ - if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { - xmlValidStatePtr state = ctxt->vstate; - xmlElementPtr elemDecl; - - /* - * Check the new element agaisnt the content model of the new elem. - */ - if (state->elemDecl != NULL) { - elemDecl = state->elemDecl; - - switch(elemDecl->etype) { - case XML_ELEMENT_TYPE_UNDEFINED: - ret = 0; - break; - case XML_ELEMENT_TYPE_EMPTY: - xmlErrValidNode(ctxt, state->node, - XML_DTD_NOT_EMPTY, - "Element %s was declared EMPTY this one has content\n", - state->node->name, NULL, NULL); - ret = 0; - break; - case XML_ELEMENT_TYPE_ANY: - /* I don't think anything is required then */ - break; - case XML_ELEMENT_TYPE_MIXED: - /* simple case of declared as #PCDATA */ - if ((elemDecl->content != NULL) && - (elemDecl->content->type == - XML_ELEMENT_CONTENT_PCDATA)) { - xmlErrValidNode(ctxt, state->node, - XML_DTD_NOT_PCDATA, - "Element %s was declared #PCDATA but contains non text nodes\n", - state->node->name, NULL, NULL); - ret = 0; - } else { - ret = xmlValidateCheckMixed(ctxt, elemDecl->content, - qname); - if (ret != 1) { - xmlErrValidNode(ctxt, state->node, - XML_DTD_INVALID_CHILD, - "Element %s is not declared in %s list of possible children\n", - qname, state->node->name, NULL); - } - } - break; - case XML_ELEMENT_TYPE_ELEMENT: - /* - * TODO: - * VC: Standalone Document Declaration - * - element types with element content, if white space - * occurs directly within any instance of those types. - */ - if (state->exec != NULL) { - ret = xmlRegExecPushString(state->exec, qname, NULL); - if (ret < 0) { - xmlErrValidNode(ctxt, state->node, - XML_DTD_CONTENT_MODEL, - "Element %s content does not follow the DTD, Misplaced %s\n", - state->node->name, qname, NULL); - ret = 0; - } else { - ret = 1; - } - } - break; - } - } - } - eDecl = xmlValidGetElemDecl(ctxt, doc, elem, &extsubset); - vstateVPush(ctxt, eDecl, elem); - return(ret); -} - -/** - * xmlValidatePushCData: - * @ctxt: the validation context - * @data: some character data read - * @len: the length of the data - * - * check the CData parsed for validation in the current stack - * - * returns 1 if no validation problem was found or 0 otherwise - */ -int -xmlValidatePushCData(xmlValidCtxtPtr ctxt, const xmlChar *data, int len) { - int ret = 1; - -/* printf("CDATA %s %d\n", data, len); */ - if (ctxt == NULL) - return(0); - if (len <= 0) - return(ret); - if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { - xmlValidStatePtr state = ctxt->vstate; - xmlElementPtr elemDecl; - - /* - * Check the new element agaisnt the content model of the new elem. - */ - if (state->elemDecl != NULL) { - elemDecl = state->elemDecl; - - switch(elemDecl->etype) { - case XML_ELEMENT_TYPE_UNDEFINED: - ret = 0; - break; - case XML_ELEMENT_TYPE_EMPTY: - xmlErrValidNode(ctxt, state->node, - XML_DTD_NOT_EMPTY, - "Element %s was declared EMPTY this one has content\n", - state->node->name, NULL, NULL); - ret = 0; - break; - case XML_ELEMENT_TYPE_ANY: - break; - case XML_ELEMENT_TYPE_MIXED: - break; - case XML_ELEMENT_TYPE_ELEMENT: - if (len > 0) { - int i; - - for (i = 0;i < len;i++) { - if (!IS_BLANK_CH(data[i])) { - xmlErrValidNode(ctxt, state->node, - XML_DTD_CONTENT_MODEL, - "Element %s content does not follow the DTD, Text not allowed\n", - state->node->name, NULL, NULL); - ret = 0; - goto done; - } - } - /* - * TODO: - * VC: Standalone Document Declaration - * element types with element content, if white space - * occurs directly within any instance of those types. - */ - } - break; - } - } - } -done: - return(ret); -} - -/** - * xmlValidatePopElement: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * @qname: the qualified name as appearing in the serialization - * - * Pop the element end from the validation stack. - * - * returns 1 if no validation problem was found or 0 otherwise - */ -int -xmlValidatePopElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc ATTRIBUTE_UNUSED, - xmlNodePtr elem ATTRIBUTE_UNUSED, - const xmlChar *qname ATTRIBUTE_UNUSED) { - int ret = 1; - - if (ctxt == NULL) - return(0); -/* printf("PopElem %s\n", qname); */ - if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { - xmlValidStatePtr state = ctxt->vstate; - xmlElementPtr elemDecl; - - /* - * Check the new element agaisnt the content model of the new elem. - */ - if (state->elemDecl != NULL) { - elemDecl = state->elemDecl; - - if (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT) { - if (state->exec != NULL) { - ret = xmlRegExecPushString(state->exec, NULL, NULL); - if (ret == 0) { - xmlErrValidNode(ctxt, state->node, - XML_DTD_CONTENT_MODEL, - "Element %s content does not follow the DTD, Expecting more child\n", - state->node->name, NULL,NULL); - } else { - /* - * previous validation errors should not generate - * a new one here - */ - ret = 1; - } - } - } - } - vstateVPop(ctxt); - } - return(ret); -} -#endif /* LIBXML_REGEXP_ENABLED */ - -/** - * xmlValidateOneElement: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * - * Try to validate a single element and it's attributes, - * basically it does the following checks as described by the - * XML-1.0 recommendation: - * - [ VC: Element Valid ] - * - [ VC: Required Attribute ] - * Then call xmlValidateOneAttribute() for each attribute present. - * - * The ID/IDREF checkings are done separately - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateOneElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, - xmlNodePtr elem) { - xmlElementPtr elemDecl = NULL; - xmlElementContentPtr cont; - xmlAttributePtr attr; - xmlNodePtr child; - int ret = 1, tmp; - const xmlChar *name; - int extsubset = 0; - - CHECK_DTD; - - if (elem == NULL) return(0); - switch (elem->type) { - case XML_ATTRIBUTE_NODE: - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "Attribute element not expected\n", NULL, NULL ,NULL); - return(0); - case XML_TEXT_NODE: - if (elem->children != NULL) { - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "Text element has children !\n", - NULL,NULL,NULL); - return(0); - } - if (elem->ns != NULL) { - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "Text element has namespace !\n", - NULL,NULL,NULL); - return(0); - } - if (elem->content == NULL) { - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "Text element has no content !\n", - NULL,NULL,NULL); - return(0); - } - return(1); - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - return(1); - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - return(1); - case XML_ENTITY_NODE: - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "Entity element not expected\n", NULL, NULL ,NULL); - return(0); - case XML_NOTATION_NODE: - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "Notation element not expected\n", NULL, NULL ,NULL); - return(0); - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "Document element not expected\n", NULL, NULL ,NULL); - return(0); - case XML_HTML_DOCUMENT_NODE: - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "HTML Document not expected\n", NULL, NULL ,NULL); - return(0); - case XML_ELEMENT_NODE: - break; - default: - xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, - "unknown element type\n", NULL, NULL ,NULL); - return(0); - } - - /* - * Fetch the declaration - */ - elemDecl = xmlValidGetElemDecl(ctxt, doc, elem, &extsubset); - if (elemDecl == NULL) - return(0); - - /* - * If vstateNr is not zero that means continuous validation is - * activated, do not try to check the content model at that level. - */ - if (ctxt->vstateNr == 0) { - /* Check that the element content matches the definition */ - switch (elemDecl->etype) { - case XML_ELEMENT_TYPE_UNDEFINED: - xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ELEM, - "No declaration for element %s\n", - elem->name, NULL, NULL); - return(0); - case XML_ELEMENT_TYPE_EMPTY: - if (elem->children != NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_NOT_EMPTY, - "Element %s was declared EMPTY this one has content\n", - elem->name, NULL, NULL); - ret = 0; - } - break; - case XML_ELEMENT_TYPE_ANY: - /* I don't think anything is required then */ - break; - case XML_ELEMENT_TYPE_MIXED: - - /* simple case of declared as #PCDATA */ - if ((elemDecl->content != NULL) && - (elemDecl->content->type == XML_ELEMENT_CONTENT_PCDATA)) { - ret = xmlValidateOneCdataElement(ctxt, doc, elem); - if (!ret) { - xmlErrValidNode(ctxt, elem, XML_DTD_NOT_PCDATA, - "Element %s was declared #PCDATA but contains non text nodes\n", - elem->name, NULL, NULL); - } - break; - } - child = elem->children; - /* Hum, this start to get messy */ - while (child != NULL) { - if (child->type == XML_ELEMENT_NODE) { - name = child->name; - if ((child->ns != NULL) && (child->ns->prefix != NULL)) { - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(child->name, child->ns->prefix, - fn, 50); - if (fullname == NULL) - return(0); - cont = elemDecl->content; - while (cont != NULL) { - if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { - if (xmlStrEqual(cont->name, fullname)) - break; - } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && - (cont->c1 != NULL) && - (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ - if (xmlStrEqual(cont->c1->name, fullname)) - break; - } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || - (cont->c1 == NULL) || - (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ - xmlErrValid(NULL, XML_DTD_MIXED_CORRUPT, - "Internal: MIXED struct corrupted\n", - NULL); - break; - } - cont = cont->c2; - } - if ((fullname != fn) && (fullname != child->name)) - xmlFree(fullname); - if (cont != NULL) - goto child_ok; - } - cont = elemDecl->content; - while (cont != NULL) { - if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { - if (xmlStrEqual(cont->name, name)) break; - } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && - (cont->c1 != NULL) && - (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)) { - if (xmlStrEqual(cont->c1->name, name)) break; - } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || - (cont->c1 == NULL) || - (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)) { - xmlErrValid(ctxt, XML_DTD_MIXED_CORRUPT, - "Internal: MIXED struct corrupted\n", - NULL); - break; - } - cont = cont->c2; - } - if (cont == NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_CHILD, - "Element %s is not declared in %s list of possible children\n", - name, elem->name, NULL); - ret = 0; - } - } -child_ok: - child = child->next; - } - break; - case XML_ELEMENT_TYPE_ELEMENT: - if ((doc->standalone == 1) && (extsubset == 1)) { - /* - * VC: Standalone Document Declaration - * - element types with element content, if white space - * occurs directly within any instance of those types. - */ - child = elem->children; - while (child != NULL) { - if (child->type == XML_TEXT_NODE) { - const xmlChar *content = child->content; - - while (IS_BLANK_CH(*content)) - content++; - if (*content == 0) { - xmlErrValidNode(ctxt, elem, - XML_DTD_STANDALONE_WHITE_SPACE, -"standalone: %s declared in the external subset contains white spaces nodes\n", - elem->name, NULL, NULL); - ret = 0; - break; - } - } - child =child->next; - } - } - child = elem->children; - cont = elemDecl->content; - tmp = xmlValidateElementContent(ctxt, child, elemDecl, 1, elem); - if (tmp <= 0) - ret = tmp; - break; - } - } /* not continuous */ - - /* [ VC: Required Attribute ] */ - attr = elemDecl->attributes; - while (attr != NULL) { - if (attr->def == XML_ATTRIBUTE_REQUIRED) { - int qualified = -1; - - if ((attr->prefix == NULL) && - (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) { - xmlNsPtr ns; - - ns = elem->nsDef; - while (ns != NULL) { - if (ns->prefix == NULL) - goto found; - ns = ns->next; - } - } else if (xmlStrEqual(attr->prefix, BAD_CAST "xmlns")) { - xmlNsPtr ns; - - ns = elem->nsDef; - while (ns != NULL) { - if (xmlStrEqual(attr->name, ns->prefix)) - goto found; - ns = ns->next; - } - } else { - xmlAttrPtr attrib; - - attrib = elem->properties; - while (attrib != NULL) { - if (xmlStrEqual(attrib->name, attr->name)) { - if (attr->prefix != NULL) { - xmlNsPtr nameSpace = attrib->ns; - - if (nameSpace == NULL) - nameSpace = elem->ns; - /* - * qualified names handling is problematic, having a - * different prefix should be possible but DTDs don't - * allow to define the URI instead of the prefix :-( - */ - if (nameSpace == NULL) { - if (qualified < 0) - qualified = 0; - } else if (!xmlStrEqual(nameSpace->prefix, - attr->prefix)) { - if (qualified < 1) - qualified = 1; - } else - goto found; - } else { - /* - * We should allow applications to define namespaces - * for their application even if the DTD doesn't - * carry one, otherwise, basically we would always - * break. - */ - goto found; - } - } - attrib = attrib->next; - } - } - if (qualified == -1) { - if (attr->prefix == NULL) { - xmlErrValidNode(ctxt, elem, XML_DTD_MISSING_ATTRIBUTE, - "Element %s does not carry attribute %s\n", - elem->name, attr->name, NULL); - ret = 0; - } else { - xmlErrValidNode(ctxt, elem, XML_DTD_MISSING_ATTRIBUTE, - "Element %s does not carry attribute %s:%s\n", - elem->name, attr->prefix,attr->name); - ret = 0; - } - } else if (qualified == 0) { - xmlErrValidWarning(ctxt, elem, XML_DTD_NO_PREFIX, - "Element %s required attribute %s:%s has no prefix\n", - elem->name, attr->prefix, attr->name); - } else if (qualified == 1) { - xmlErrValidWarning(ctxt, elem, XML_DTD_DIFFERENT_PREFIX, - "Element %s required attribute %s:%s has different prefix\n", - elem->name, attr->prefix, attr->name); - } - } else if (attr->def == XML_ATTRIBUTE_FIXED) { - /* - * Special tests checking #FIXED namespace declarations - * have the right value since this is not done as an - * attribute checking - */ - if ((attr->prefix == NULL) && - (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) { - xmlNsPtr ns; - - ns = elem->nsDef; - while (ns != NULL) { - if (ns->prefix == NULL) { - if (!xmlStrEqual(attr->defaultValue, ns->href)) { - xmlErrValidNode(ctxt, elem, - XML_DTD_ELEM_DEFAULT_NAMESPACE, - "Element %s namespace name for default namespace does not match the DTD\n", - elem->name, NULL, NULL); - ret = 0; - } - goto found; - } - ns = ns->next; - } - } else if (xmlStrEqual(attr->prefix, BAD_CAST "xmlns")) { - xmlNsPtr ns; - - ns = elem->nsDef; - while (ns != NULL) { - if (xmlStrEqual(attr->name, ns->prefix)) { - if (!xmlStrEqual(attr->defaultValue, ns->href)) { - xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, - "Element %s namespace name for %s does not match the DTD\n", - elem->name, ns->prefix, NULL); - ret = 0; - } - goto found; - } - ns = ns->next; - } - } - } -found: - attr = attr->nexth; - } - return(ret); -} - -/** - * xmlValidateRoot: - * @ctxt: the validation context - * @doc: a document instance - * - * Try to validate a the root element - * basically it does the following check as described by the - * XML-1.0 recommendation: - * - [ VC: Root Element Type ] - * it doesn't try to recurse or apply other check to the element - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateRoot(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { - xmlNodePtr root; - int ret; - - if (doc == NULL) return(0); - - root = xmlDocGetRootElement(doc); - if ((root == NULL) || (root->name == NULL)) { - xmlErrValid(ctxt, XML_DTD_NO_ROOT, - "no root element\n", NULL); - return(0); - } - - /* - * When doing post validation against a separate DTD, those may - * no internal subset has been generated - */ - if ((doc->intSubset != NULL) && - (doc->intSubset->name != NULL)) { - /* - * Check first the document root against the NQName - */ - if (!xmlStrEqual(doc->intSubset->name, root->name)) { - if ((root->ns != NULL) && (root->ns->prefix != NULL)) { - xmlChar fn[50]; - xmlChar *fullname; - - fullname = xmlBuildQName(root->name, root->ns->prefix, fn, 50); - if (fullname == NULL) { - xmlVErrMemory(ctxt, NULL); - return(0); - } - ret = xmlStrEqual(doc->intSubset->name, fullname); - if ((fullname != fn) && (fullname != root->name)) - xmlFree(fullname); - if (ret == 1) - goto name_ok; - } - if ((xmlStrEqual(doc->intSubset->name, BAD_CAST "HTML")) && - (xmlStrEqual(root->name, BAD_CAST "html"))) - goto name_ok; - xmlErrValidNode(ctxt, root, XML_DTD_ROOT_NAME, - "root and DTD name do not match '%s' and '%s'\n", - root->name, doc->intSubset->name, NULL); - return(0); - } - } -name_ok: - return(1); -} - - -/** - * xmlValidateElement: - * @ctxt: the validation context - * @doc: a document instance - * @elem: an element instance - * - * Try to validate the subtree under an element - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem) { - xmlNodePtr child; - xmlAttrPtr attr; - xmlNsPtr ns; - const xmlChar *value; - int ret = 1; - - if (elem == NULL) return(0); - - /* - * XInclude elements were added after parsing in the infoset, - * they don't really mean anything validation wise. - */ - if ((elem->type == XML_XINCLUDE_START) || - (elem->type == XML_XINCLUDE_END)) - return(1); - - CHECK_DTD; - - /* - * Entities references have to be handled separately - */ - if (elem->type == XML_ENTITY_REF_NODE) { - return(1); - } - - ret &= xmlValidateOneElement(ctxt, doc, elem); - if (elem->type == XML_ELEMENT_NODE) { - attr = elem->properties; - while (attr != NULL) { - value = xmlNodeListGetString(doc, attr->children, 0); - ret &= xmlValidateOneAttribute(ctxt, doc, elem, attr, value); - if (value != NULL) - xmlFree((char *)value); - attr= attr->next; - } - ns = elem->nsDef; - while (ns != NULL) { - if (elem->ns == NULL) - ret &= xmlValidateOneNamespace(ctxt, doc, elem, NULL, - ns, ns->href); - else - ret &= xmlValidateOneNamespace(ctxt, doc, elem, - elem->ns->prefix, ns, ns->href); - ns = ns->next; - } - } - child = elem->children; - while (child != NULL) { - ret &= xmlValidateElement(ctxt, doc, child); - child = child->next; - } - - return(ret); -} - -/** - * xmlValidateRef: - * @ref: A reference to be validated - * @ctxt: Validation context - * @name: Name of ID we are searching for - * - */ -static void -xmlValidateRef(xmlRefPtr ref, xmlValidCtxtPtr ctxt, - const xmlChar *name) { - xmlAttrPtr id; - xmlAttrPtr attr; - - if (ref == NULL) - return; - if ((ref->attr == NULL) && (ref->name == NULL)) - return; - attr = ref->attr; - if (attr == NULL) { - xmlChar *dup, *str = NULL, *cur, save; - - dup = xmlStrdup(name); - if (dup == NULL) { - ctxt->valid = 0; - return; - } - cur = dup; - while (*cur != 0) { - str = cur; - while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; - save = *cur; - *cur = 0; - id = xmlGetID(ctxt->doc, str); - if (id == NULL) { - xmlErrValidNodeNr(ctxt, NULL, XML_DTD_UNKNOWN_ID, - "attribute %s line %d references an unknown ID \"%s\"\n", - ref->name, ref->lineno, str); - ctxt->valid = 0; - } - if (save == 0) - break; - *cur = save; - while (IS_BLANK_CH(*cur)) cur++; - } - xmlFree(dup); - } else if (attr->atype == XML_ATTRIBUTE_IDREF) { - id = xmlGetID(ctxt->doc, name); - if (id == NULL) { - xmlErrValidNode(ctxt, attr->parent, XML_DTD_UNKNOWN_ID, - "IDREF attribute %s references an unknown ID \"%s\"\n", - attr->name, name, NULL); - ctxt->valid = 0; - } - } else if (attr->atype == XML_ATTRIBUTE_IDREFS) { - xmlChar *dup, *str = NULL, *cur, save; - - dup = xmlStrdup(name); - if (dup == NULL) { - xmlVErrMemory(ctxt, "IDREFS split"); - ctxt->valid = 0; - return; - } - cur = dup; - while (*cur != 0) { - str = cur; - while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; - save = *cur; - *cur = 0; - id = xmlGetID(ctxt->doc, str); - if (id == NULL) { - xmlErrValidNode(ctxt, attr->parent, XML_DTD_UNKNOWN_ID, - "IDREFS attribute %s references an unknown ID \"%s\"\n", - attr->name, str, NULL); - ctxt->valid = 0; - } - if (save == 0) - break; - *cur = save; - while (IS_BLANK_CH(*cur)) cur++; - } - xmlFree(dup); - } -} - -/** - * xmlWalkValidateList: - * @data: Contents of current link - * @user: Value supplied by the user - * - * Returns 0 to abort the walk or 1 to continue - */ -static int -xmlWalkValidateList(const void *data, const void *user) -{ - xmlValidateMemoPtr memo = (xmlValidateMemoPtr)user; - xmlValidateRef((xmlRefPtr)data, memo->ctxt, memo->name); - return 1; -} - -/** - * xmlValidateCheckRefCallback: - * @ref_list: List of references - * @ctxt: Validation context - * @name: Name of ID we are searching for - * - */ -static void -xmlValidateCheckRefCallback(xmlListPtr ref_list, xmlValidCtxtPtr ctxt, - const xmlChar *name) { - xmlValidateMemo memo; - - if (ref_list == NULL) - return; - memo.ctxt = ctxt; - memo.name = name; - - xmlListWalk(ref_list, xmlWalkValidateList, &memo); - -} - -/** - * xmlValidateDocumentFinal: - * @ctxt: the validation context - * @doc: a document instance - * - * Does the final step for the document validation once all the - * incremental validation steps have been completed - * - * basically it does the following checks described by the XML Rec - * - * Check all the IDREF/IDREFS attributes definition for validity - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { - xmlRefTablePtr table; - - if (ctxt == NULL) - return(0); - if (doc == NULL) { - xmlErrValid(ctxt, XML_DTD_NO_DOC, - "xmlValidateDocumentFinal: doc == NULL\n", NULL); - return(0); - } - - /* - * Check all the NOTATION/NOTATIONS attributes - */ - /* - * Check all the ENTITY/ENTITIES attributes definition for validity - */ - /* - * Check all the IDREF/IDREFS attributes definition for validity - */ - table = (xmlRefTablePtr) doc->refs; - ctxt->doc = doc; - ctxt->valid = 1; - xmlHashScan(table, (xmlHashScanner) xmlValidateCheckRefCallback, ctxt); - return(ctxt->valid); -} - -/** - * xmlValidateDtd: - * @ctxt: the validation context - * @doc: a document instance - * @dtd: a dtd instance - * - * Try to validate the document against the dtd instance - * - * Basically it does check all the definitions in the DtD. - * Note the the internal subset (if present) is de-coupled - * (i.e. not used), which could give problems if ID or IDREF - * is present. - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateDtd(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlDtdPtr dtd) { - int ret; - xmlDtdPtr oldExt, oldInt; - xmlNodePtr root; - - if (dtd == NULL) return(0); - if (doc == NULL) return(0); - oldExt = doc->extSubset; - oldInt = doc->intSubset; - doc->extSubset = dtd; - doc->intSubset = NULL; - ret = xmlValidateRoot(ctxt, doc); - if (ret == 0) { - doc->extSubset = oldExt; - doc->intSubset = oldInt; - return(ret); - } - if (doc->ids != NULL) { - xmlFreeIDTable(doc->ids); - doc->ids = NULL; - } - if (doc->refs != NULL) { - xmlFreeRefTable(doc->refs); - doc->refs = NULL; - } - root = xmlDocGetRootElement(doc); - ret = xmlValidateElement(ctxt, doc, root); - ret &= xmlValidateDocumentFinal(ctxt, doc); - doc->extSubset = oldExt; - doc->intSubset = oldInt; - return(ret); -} - -static void -xmlValidateNotationCallback(xmlEntityPtr cur, xmlValidCtxtPtr ctxt, - const xmlChar *name ATTRIBUTE_UNUSED) { - if (cur == NULL) - return; - if (cur->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { - xmlChar *notation = cur->content; - - if (notation != NULL) { - int ret; - - ret = xmlValidateNotationUse(ctxt, cur->doc, notation); - if (ret != 1) { - ctxt->valid = 0; - } - } - } -} - -static void -xmlValidateAttributeCallback(xmlAttributePtr cur, xmlValidCtxtPtr ctxt, - const xmlChar *name ATTRIBUTE_UNUSED) { - int ret; - xmlDocPtr doc; - xmlElementPtr elem = NULL; - - if (cur == NULL) - return; - switch (cur->atype) { - case XML_ATTRIBUTE_CDATA: - case XML_ATTRIBUTE_ID: - case XML_ATTRIBUTE_IDREF : - case XML_ATTRIBUTE_IDREFS: - case XML_ATTRIBUTE_NMTOKEN: - case XML_ATTRIBUTE_NMTOKENS: - case XML_ATTRIBUTE_ENUMERATION: - break; - case XML_ATTRIBUTE_ENTITY: - case XML_ATTRIBUTE_ENTITIES: - case XML_ATTRIBUTE_NOTATION: - if (cur->defaultValue != NULL) { - - ret = xmlValidateAttributeValue2(ctxt, ctxt->doc, cur->name, - cur->atype, cur->defaultValue); - if ((ret == 0) && (ctxt->valid == 1)) - ctxt->valid = 0; - } - if (cur->tree != NULL) { - xmlEnumerationPtr tree = cur->tree; - while (tree != NULL) { - ret = xmlValidateAttributeValue2(ctxt, ctxt->doc, - cur->name, cur->atype, tree->name); - if ((ret == 0) && (ctxt->valid == 1)) - ctxt->valid = 0; - tree = tree->next; - } - } - } - if (cur->atype == XML_ATTRIBUTE_NOTATION) { - doc = cur->doc; - if (cur->elem == NULL) { - xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, - "xmlValidateAttributeCallback(%s): internal error\n", - (const char *) cur->name); - return; - } - - if (doc != NULL) - elem = xmlGetDtdElementDesc(doc->intSubset, cur->elem); - if ((elem == NULL) && (doc != NULL)) - elem = xmlGetDtdElementDesc(doc->extSubset, cur->elem); - if ((elem == NULL) && (cur->parent != NULL) && - (cur->parent->type == XML_DTD_NODE)) - elem = xmlGetDtdElementDesc((xmlDtdPtr) cur->parent, cur->elem); - if (elem == NULL) { - xmlErrValidNode(ctxt, NULL, XML_DTD_UNKNOWN_ELEM, - "attribute %s: could not find decl for element %s\n", - cur->name, cur->elem, NULL); - return; - } - if (elem->etype == XML_ELEMENT_TYPE_EMPTY) { - xmlErrValidNode(ctxt, NULL, XML_DTD_EMPTY_NOTATION, - "NOTATION attribute %s declared for EMPTY element %s\n", - cur->name, cur->elem, NULL); - ctxt->valid = 0; - } - } -} - -/** - * xmlValidateDtdFinal: - * @ctxt: the validation context - * @doc: a document instance - * - * Does the final step for the dtds validation once all the - * subsets have been parsed - * - * basically it does the following checks described by the XML Rec - * - check that ENTITY and ENTITIES type attributes default or - * possible values matches one of the defined entities. - * - check that NOTATION type attributes default or - * possible values matches one of the defined notations. - * - * returns 1 if valid or 0 if invalid and -1 if not well-formed - */ - -int -xmlValidateDtdFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { - xmlDtdPtr dtd; - xmlAttributeTablePtr table; - xmlEntitiesTablePtr entities; - - if (doc == NULL) return(0); - if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) - return(0); - ctxt->doc = doc; - ctxt->valid = 1; - dtd = doc->intSubset; - if ((dtd != NULL) && (dtd->attributes != NULL)) { - table = (xmlAttributeTablePtr) dtd->attributes; - xmlHashScan(table, (xmlHashScanner) xmlValidateAttributeCallback, ctxt); - } - if ((dtd != NULL) && (dtd->entities != NULL)) { - entities = (xmlEntitiesTablePtr) dtd->entities; - xmlHashScan(entities, (xmlHashScanner) xmlValidateNotationCallback, - ctxt); - } - dtd = doc->extSubset; - if ((dtd != NULL) && (dtd->attributes != NULL)) { - table = (xmlAttributeTablePtr) dtd->attributes; - xmlHashScan(table, (xmlHashScanner) xmlValidateAttributeCallback, ctxt); - } - if ((dtd != NULL) && (dtd->entities != NULL)) { - entities = (xmlEntitiesTablePtr) dtd->entities; - xmlHashScan(entities, (xmlHashScanner) xmlValidateNotationCallback, - ctxt); - } - return(ctxt->valid); -} - -/** - * xmlValidateDocument: - * @ctxt: the validation context - * @doc: a document instance - * - * Try to validate the document instance - * - * basically it does the all the checks described by the XML Rec - * i.e. validates the internal and external subset (if present) - * and validate the document tree. - * - * returns 1 if valid or 0 otherwise - */ - -int -xmlValidateDocument(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { - int ret; - xmlNodePtr root; - - if (doc == NULL) - return(0); - if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) { - xmlErrValid(ctxt, XML_DTD_NO_DTD, - "no DTD found!\n", NULL); - return(0); - } - if ((doc->intSubset != NULL) && ((doc->intSubset->SystemID != NULL) || - (doc->intSubset->ExternalID != NULL)) && (doc->extSubset == NULL)) { - xmlChar *sysID; - if (doc->intSubset->SystemID != NULL) { - sysID = xmlBuildURI(doc->intSubset->SystemID, - doc->URL); - if (sysID == NULL) { - xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, - "Could not build URI for external subset \"%s\"\n", - (const char *) doc->intSubset->SystemID); - return 0; - } - } else - sysID = NULL; - doc->extSubset = xmlParseDTD(doc->intSubset->ExternalID, - (const xmlChar *)sysID); - if (sysID != NULL) - xmlFree(sysID); - if (doc->extSubset == NULL) { - if (doc->intSubset->SystemID != NULL) { - xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, - "Could not load the external subset \"%s\"\n", - (const char *) doc->intSubset->SystemID); - } else { - xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, - "Could not load the external subset \"%s\"\n", - (const char *) doc->intSubset->ExternalID); - } - return(0); - } - } - - if (doc->ids != NULL) { - xmlFreeIDTable(doc->ids); - doc->ids = NULL; - } - if (doc->refs != NULL) { - xmlFreeRefTable(doc->refs); - doc->refs = NULL; - } - ret = xmlValidateDtdFinal(ctxt, doc); - if (!xmlValidateRoot(ctxt, doc)) return(0); - - root = xmlDocGetRootElement(doc); - ret &= xmlValidateElement(ctxt, doc, root); - ret &= xmlValidateDocumentFinal(ctxt, doc); - return(ret); -} - -/************************************************************************ - * * - * Routines for dynamic validation editing * - * * - ************************************************************************/ - -/** - * xmlValidGetPotentialChildren: - * @ctree: an element content tree - * @names: an array to store the list of child names - * @len: a pointer to the number of element in the list - * @max: the size of the array - * - * Build/extend a list of potential children allowed by the content tree - * - * returns the number of element in the list, or -1 in case of error. - */ - -int -xmlValidGetPotentialChildren(xmlElementContent *ctree, - const xmlChar **names, - int *len, int max) { - int i; - - if ((ctree == NULL) || (names == NULL) || (len == NULL)) - return(-1); - if (*len >= max) return(*len); - - switch (ctree->type) { - case XML_ELEMENT_CONTENT_PCDATA: - for (i = 0; i < *len;i++) - if (xmlStrEqual(BAD_CAST "#PCDATA", names[i])) return(*len); - names[(*len)++] = BAD_CAST "#PCDATA"; - break; - case XML_ELEMENT_CONTENT_ELEMENT: - for (i = 0; i < *len;i++) - if (xmlStrEqual(ctree->name, names[i])) return(*len); - names[(*len)++] = ctree->name; - break; - case XML_ELEMENT_CONTENT_SEQ: - xmlValidGetPotentialChildren(ctree->c1, names, len, max); - xmlValidGetPotentialChildren(ctree->c2, names, len, max); - break; - case XML_ELEMENT_CONTENT_OR: - xmlValidGetPotentialChildren(ctree->c1, names, len, max); - xmlValidGetPotentialChildren(ctree->c2, names, len, max); - break; - } - - return(*len); -} - -/* - * Dummy function to suppress messages while we try out valid elements - */ -static void XMLCDECL xmlNoValidityErr(void *ctx ATTRIBUTE_UNUSED, - const char *msg ATTRIBUTE_UNUSED, ...) { - return; -} - -/** - * xmlValidGetValidElements: - * @prev: an element to insert after - * @next: an element to insert next - * @names: an array to store the list of child names - * @max: the size of the array - * - * This function returns the list of authorized children to insert - * within an existing tree while respecting the validity constraints - * forced by the Dtd. The insertion point is defined using @prev and - * @next in the following ways: - * to insert before 'node': xmlValidGetValidElements(node->prev, node, ... - * to insert next 'node': xmlValidGetValidElements(node, node->next, ... - * to replace 'node': xmlValidGetValidElements(node->prev, node->next, ... - * to prepend a child to 'node': xmlValidGetValidElements(NULL, node->childs, - * to append a child to 'node': xmlValidGetValidElements(node->last, NULL, ... - * - * pointers to the element names are inserted at the beginning of the array - * and do not need to be freed. - * - * returns the number of element in the list, or -1 in case of error. If - * the function returns the value @max the caller is invited to grow the - * receiving array and retry. - */ - -int -xmlValidGetValidElements(xmlNode *prev, xmlNode *next, const xmlChar **names, - int max) { - xmlValidCtxt vctxt; - int nb_valid_elements = 0; - const xmlChar *elements[256]; - int nb_elements = 0, i; - const xmlChar *name; - - xmlNode *ref_node; - xmlNode *parent; - xmlNode *test_node; - - xmlNode *prev_next; - xmlNode *next_prev; - xmlNode *parent_childs; - xmlNode *parent_last; - - xmlElement *element_desc; - - if (prev == NULL && next == NULL) - return(-1); - - if (names == NULL) return(-1); - if (max <= 0) return(-1); - - memset(&vctxt, 0, sizeof (xmlValidCtxt)); - vctxt.error = xmlNoValidityErr; /* this suppresses err/warn output */ - - nb_valid_elements = 0; - ref_node = prev ? prev : next; - parent = ref_node->parent; - - /* - * Retrieves the parent element declaration - */ - element_desc = xmlGetDtdElementDesc(parent->doc->intSubset, - parent->name); - if ((element_desc == NULL) && (parent->doc->extSubset != NULL)) - element_desc = xmlGetDtdElementDesc(parent->doc->extSubset, - parent->name); - if (element_desc == NULL) return(-1); - - /* - * Do a backup of the current tree structure - */ - prev_next = prev ? prev->next : NULL; - next_prev = next ? next->prev : NULL; - parent_childs = parent->children; - parent_last = parent->last; - - /* - * Creates a dummy node and insert it into the tree - */ - test_node = xmlNewDocNode (ref_node->doc, NULL, BAD_CAST "<!dummy?>", NULL); - test_node->parent = parent; - test_node->prev = prev; - test_node->next = next; - name = test_node->name; - - if (prev) prev->next = test_node; - else parent->children = test_node; - - if (next) next->prev = test_node; - else parent->last = test_node; - - /* - * Insert each potential child node and check if the parent is - * still valid - */ - nb_elements = xmlValidGetPotentialChildren(element_desc->content, - elements, &nb_elements, 256); - - for (i = 0;i < nb_elements;i++) { - test_node->name = elements[i]; - if (xmlValidateOneElement(&vctxt, parent->doc, parent)) { - int j; - - for (j = 0; j < nb_valid_elements;j++) - if (xmlStrEqual(elements[i], names[j])) break; - names[nb_valid_elements++] = elements[i]; - if (nb_valid_elements >= max) break; - } - } - - /* - * Restore the tree structure - */ - if (prev) prev->next = prev_next; - if (next) next->prev = next_prev; - parent->children = parent_childs; - parent->last = parent_last; - - /* - * Free up the dummy node - */ - test_node->name = name; - xmlFreeNode(test_node); - - return(nb_valid_elements); -} -#endif /* LIBXML_VALID_ENABLED */ - -#define bottom_valid -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/vtk_README.txt b/ThirdParty/libxml2/vtklibxml2/vtk_README.txt deleted file mode 100644 index f6a80ee23ee..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/vtk_README.txt +++ /dev/null @@ -1,57 +0,0 @@ -In order to update VTK's libxml2 version, see below. - -MOST RECENTLY MERGED TAG: VTK-libxml2-upstream-2-6-27 - ------------------------------------------------------------------------------- -This libxml2 was converted from upstream as follows: - -1.) Export libxml2 source from SVN: - - svn export http://svn.gnome.org/svn/libxml2/tags/LIBXML2_2_6_27 \ - libxml2-2.6.27 - -2.) Fix trio*.h files: - "Id" --> "Id: ..." - -3.) Remove extra directories and files, fix permissions: - - rm -rf doc result python optim bakefile xstc vms macos example test win32 - rm *.py *.pl *.sh install-sh test*.c test*.h ac* missing mkinstalldirs TODO* - rm README* NEWS MAINTAINERS INSTALL HACKING - rm global.data ChangeLog chvalid.def configure.in - rm Makefile* include/Makefile* include/libxml/Makefile* - rm libxml-2.0* libxml.3 libxml.spec.in libxml.m4 xml2* include/win32config.h - chmod 644 chvalid.c - -4.) Checkin files to VTK-libxml2-upstream branch. - Create the tag VTK-libxml2-upstream-2-6-27 on the branch. - VTK-specific changes are then performed on the main tree. - -5.) Mangle with vtk_libxml2_mangle.h included in include/libxml/xmlexports.h. - Hack up globals.c and include/libxml/globals.h to fix some mangling. - -6.) Hack up include/libxml/*.h to use double-quote includes without - libxml/ prefix. This should cause each header to include the - other headers it needs from the same directory. ------------------------------------------------------------------------------- -To upgrade to a newer libxml2 version: - -1.) Follow steps 1-3 above. -2.) Commit the new upstream version on the VTK-libxml2-upstream branch. - Create the tag VTK-libxml2-upstream-<major-minor-patch> to indicate - the version. - -3.) Merge the changes between the previous and current versions to the - main tree: - - cvs update -dAP - cvs tag VTK-libxml2-<new>-merge-pre - cvs update -d -j VTK-libxml2-upstream-<old> -j VTK-libxml2-upstream-<new> - -4.) Manually resolve conflicts and commit. - - cvs commit -m "ENH: Updating libxml2 to <new>" - cvs tag VTK-libxml2-<new>-merge-post - -5.) Update the tag at the top of this file indicating the most recently - merged version. diff --git a/ThirdParty/libxml2/vtklibxml2/vtk_libxml2_zlib.h b/ThirdParty/libxml2/vtklibxml2/vtk_libxml2_zlib.h deleted file mode 100644 index d0b0af0cb5e..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/vtk_libxml2_zlib.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef vtk_libxml2_zlib_h -#define vtk_libxml2_zlib_h - -#if defined(HAVE_VTK_ZLIB_H) -# include <vtk_zlib.h> -#elif defined(HAVE_ZLIB_H) -# include <zlib.h> -#endif - -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/xinclude.c b/ThirdParty/libxml2/vtklibxml2/xinclude.c deleted file mode 100644 index 39a3f035cfa..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xinclude.c +++ /dev/null @@ -1,2555 +0,0 @@ -/* - * xinclude.c : Code to implement XInclude processing - * - * World Wide Web Consortium W3C Last Call Working Draft 10 November 2003 - * http://www.w3.org/TR/2003/WD-xinclude-20031110 - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/uri.h> -#include <libxml/xpointer.h> -#include <libxml/parserInternals.h> -#include <libxml/xmlerror.h> -#include <libxml/encoding.h> -#include <libxml/globals.h> - -#ifdef LIBXML_XINCLUDE_ENABLED -#include <libxml/xinclude.h> - - -#define XINCLUDE_MAX_DEPTH 40 - -/* #define DEBUG_XINCLUDE */ -#ifdef DEBUG_XINCLUDE -#ifdef LIBXML_DEBUG_ENABLED -#include <libxml/debugXML.h> -#endif -#endif - -/************************************************************************ - * * - * XInclude context handling * - * * - ************************************************************************/ - -/* - * An XInclude context - */ -typedef xmlChar *xmlURL; - -typedef struct _xmlXIncludeRef xmlXIncludeRef; -typedef xmlXIncludeRef *xmlXIncludeRefPtr; -struct _xmlXIncludeRef { - xmlChar *URI; /* the fully resolved resource URL */ - xmlChar *fragment; /* the fragment in the URI */ - xmlDocPtr doc; /* the parsed document */ - xmlNodePtr ref; /* the node making the reference in the source */ - xmlNodePtr inc; /* the included copy */ - int xml; /* xml or txt */ - int count; /* how many refs use that specific doc */ - xmlXPathObjectPtr xptr; /* the xpointer if needed */ - int emptyFb; /* flag to show fallback empty */ -}; - -struct _xmlXIncludeCtxt { - xmlDocPtr doc; /* the source document */ - int incBase; /* the first include for this document */ - int incNr; /* number of includes */ - int incMax; /* size of includes tab */ - xmlXIncludeRefPtr *incTab; /* array of included references */ - - int txtNr; /* number of unparsed documents */ - int txtMax; /* size of unparsed documents tab */ - xmlNodePtr *txtTab; /* array of unparsed text nodes */ - xmlURL *txturlTab; /* array of unparsed text URLs */ - - xmlChar * url; /* the current URL processed */ - int urlNr; /* number of URLs stacked */ - int urlMax; /* size of URL stack */ - xmlChar * *urlTab; /* URL stack */ - - int nbErrors; /* the number of errors detected */ - int legacy; /* using XINCLUDE_OLD_NS */ - int parseFlags; /* the flags used for parsing XML documents */ - xmlChar * base; /* the current xml:base */ - - void *_private; /* application data */ -}; - -static int -xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree); - - -/************************************************************************ - * * - * XInclude error handler * - * * - ************************************************************************/ - -/** - * xmlXIncludeErrMemory: - * @extra: extra information - * - * Handle an out of memory condition - */ -static void -xmlXIncludeErrMemory(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, - const char *extra) -{ - if (ctxt != NULL) - ctxt->nbErrors++; - __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, - XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, - extra, NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); -} - -/** - * xmlXIncludeErr: - * @ctxt: the XInclude context - * @node: the context node - * @msg: the error message - * @extra: extra information - * - * Handle an XInclude error - */ -static void -xmlXIncludeErr(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, int error, - const char *msg, const xmlChar *extra) -{ - if (ctxt != NULL) - ctxt->nbErrors++; - __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, - error, XML_ERR_ERROR, NULL, 0, - (const char *) extra, NULL, NULL, 0, 0, - msg, (const char *) extra); -} - -#if 0 -/** - * xmlXIncludeWarn: - * @ctxt: the XInclude context - * @node: the context node - * @msg: the error message - * @extra: extra information - * - * Emit an XInclude warning. - */ -static void -xmlXIncludeWarn(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, int error, - const char *msg, const xmlChar *extra) -{ - __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, - error, XML_ERR_WARNING, NULL, 0, - (const char *) extra, NULL, NULL, 0, 0, - msg, (const char *) extra); -} -#endif - -/** - * xmlXIncludeGetProp: - * @ctxt: the XInclude context - * @cur: the node - * @name: the attribute name - * - * Get an XInclude attribute - * - * Returns the value (to be freed) or NULL if not found - */ -static xmlChar * -xmlXIncludeGetProp(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur, - const xmlChar *name) { - xmlChar *ret; - - ret = xmlGetNsProp(cur, XINCLUDE_NS, name); - if (ret != NULL) - return(ret); - if (ctxt->legacy != 0) { - ret = xmlGetNsProp(cur, XINCLUDE_OLD_NS, name); - if (ret != NULL) - return(ret); - } - ret = xmlGetProp(cur, name); - return(ret); -} -/** - * xmlXIncludeFreeRef: - * @ref: the XInclude reference - * - * Free an XInclude reference - */ -static void -xmlXIncludeFreeRef(xmlXIncludeRefPtr ref) { - if (ref == NULL) - return; -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "Freeing ref\n"); -#endif - if (ref->doc != NULL) { -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "Freeing doc %s\n", ref->URI); -#endif - xmlFreeDoc(ref->doc); - } - if (ref->URI != NULL) - xmlFree(ref->URI); - if (ref->fragment != NULL) - xmlFree(ref->fragment); - if (ref->xptr != NULL) - xmlXPathFreeObject(ref->xptr); - xmlFree(ref); -} - -/** - * xmlXIncludeNewRef: - * @ctxt: the XInclude context - * @URI: the resource URI - * - * Creates a new reference within an XInclude context - * - * Returns the new set - */ -static xmlXIncludeRefPtr -xmlXIncludeNewRef(xmlXIncludeCtxtPtr ctxt, const xmlChar *URI, - xmlNodePtr ref) { - xmlXIncludeRefPtr ret; - -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "New ref %s\n", URI); -#endif - ret = (xmlXIncludeRefPtr) xmlMalloc(sizeof(xmlXIncludeRef)); - if (ret == NULL) { - xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); - return(NULL); - } - memset(ret, 0, sizeof(xmlXIncludeRef)); - if (URI == NULL) - ret->URI = NULL; - else - ret->URI = xmlStrdup(URI); - ret->fragment = NULL; - ret->ref = ref; - ret->doc = NULL; - ret->count = 0; - ret->xml = 0; - ret->inc = NULL; - if (ctxt->incMax == 0) { - ctxt->incMax = 4; - ctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(ctxt->incMax * - sizeof(ctxt->incTab[0])); - if (ctxt->incTab == NULL) { - xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); - xmlXIncludeFreeRef(ret); - return(NULL); - } - } - if (ctxt->incNr >= ctxt->incMax) { - ctxt->incMax *= 2; - ctxt->incTab = (xmlXIncludeRefPtr *) xmlRealloc(ctxt->incTab, - ctxt->incMax * sizeof(ctxt->incTab[0])); - if (ctxt->incTab == NULL) { - xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); - xmlXIncludeFreeRef(ret); - return(NULL); - } - } - ctxt->incTab[ctxt->incNr++] = ret; - return(ret); -} - -/** - * xmlXIncludeNewContext: - * @doc: an XML Document - * - * Creates a new XInclude context - * - * Returns the new set - */ -xmlXIncludeCtxtPtr -xmlXIncludeNewContext(xmlDocPtr doc) { - xmlXIncludeCtxtPtr ret; - -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "New context\n"); -#endif - if (doc == NULL) - return(NULL); - ret = (xmlXIncludeCtxtPtr) xmlMalloc(sizeof(xmlXIncludeCtxt)); - if (ret == NULL) { - xmlXIncludeErrMemory(NULL, (xmlNodePtr) doc, - "creating XInclude context"); - return(NULL); - } - memset(ret, 0, sizeof(xmlXIncludeCtxt)); - ret->doc = doc; - ret->incNr = 0; - ret->incBase = 0; - ret->incMax = 0; - ret->incTab = NULL; - ret->nbErrors = 0; - return(ret); -} - -/** - * xmlXIncludeURLPush: - * @ctxt: the parser context - * @value: the url - * - * Pushes a new url on top of the url stack - * - * Returns -1 in case of error, the index in the stack otherwise - */ -static int -xmlXIncludeURLPush(xmlXIncludeCtxtPtr ctxt, - const xmlChar *value) -{ - if (ctxt->urlNr > XINCLUDE_MAX_DEPTH) { - xmlXIncludeErr(ctxt, NULL, XML_XINCLUDE_RECURSION, - "detected a recursion in %s\n", value); - return(-1); - } - if (ctxt->urlTab == NULL) { - ctxt->urlMax = 4; - ctxt->urlNr = 0; - ctxt->urlTab = (xmlChar * *) xmlMalloc( - ctxt->urlMax * sizeof(ctxt->urlTab[0])); - if (ctxt->urlTab == NULL) { - xmlXIncludeErrMemory(ctxt, NULL, "adding URL"); - return (-1); - } - } - if (ctxt->urlNr >= ctxt->urlMax) { - ctxt->urlMax *= 2; - ctxt->urlTab = - (xmlChar * *) xmlRealloc(ctxt->urlTab, - ctxt->urlMax * - sizeof(ctxt->urlTab[0])); - if (ctxt->urlTab == NULL) { - xmlXIncludeErrMemory(ctxt, NULL, "adding URL"); - return (-1); - } - } - ctxt->url = ctxt->urlTab[ctxt->urlNr] = xmlStrdup(value); - return (ctxt->urlNr++); -} - -/** - * xmlXIncludeURLPop: - * @ctxt: the parser context - * - * Pops the top URL from the URL stack - */ -static void -xmlXIncludeURLPop(xmlXIncludeCtxtPtr ctxt) -{ - xmlChar * ret; - - if (ctxt->urlNr <= 0) - return; - ctxt->urlNr--; - if (ctxt->urlNr > 0) - ctxt->url = ctxt->urlTab[ctxt->urlNr - 1]; - else - ctxt->url = NULL; - ret = ctxt->urlTab[ctxt->urlNr]; - ctxt->urlTab[ctxt->urlNr] = NULL; - if (ret != NULL) - xmlFree(ret); -} - -/** - * xmlXIncludeFreeContext: - * @ctxt: the XInclude context - * - * Free an XInclude context - */ -void -xmlXIncludeFreeContext(xmlXIncludeCtxtPtr ctxt) { - int i; - -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "Freeing context\n"); -#endif - if (ctxt == NULL) - return; - while (ctxt->urlNr > 0) - xmlXIncludeURLPop(ctxt); - if (ctxt->urlTab != NULL) - xmlFree(ctxt->urlTab); - for (i = 0;i < ctxt->incNr;i++) { - if (ctxt->incTab[i] != NULL) - xmlXIncludeFreeRef(ctxt->incTab[i]); - } - if (ctxt->txturlTab != NULL) { - for (i = 0;i < ctxt->txtNr;i++) { - if (ctxt->txturlTab[i] != NULL) - xmlFree(ctxt->txturlTab[i]); - } - } - if (ctxt->incTab != NULL) - xmlFree(ctxt->incTab); - if (ctxt->txtTab != NULL) - xmlFree(ctxt->txtTab); - if (ctxt->txturlTab != NULL) - xmlFree(ctxt->txturlTab); - if (ctxt->base != NULL) { - xmlFree(ctxt->base); - } - xmlFree(ctxt); -} - -/** - * xmlXIncludeParseFile: - * @ctxt: the XInclude context - * @URL: the URL or file path - * - * parse a document for XInclude - */ -static xmlDocPtr -xmlXIncludeParseFile(xmlXIncludeCtxtPtr ctxt, const char *URL) { - xmlDocPtr ret; - xmlParserCtxtPtr pctxt; - char *directory = NULL; - xmlParserInputPtr inputStream; - - xmlInitParser(); - - pctxt = xmlNewParserCtxt(); - if (pctxt == NULL) { - xmlXIncludeErrMemory(ctxt, NULL, "cannot allocate parser context"); - return(NULL); - } - - /* - * pass in the application data to the parser context. - */ - pctxt->_private = ctxt->_private; - - /* - * try to ensure that new documents included are actually - * built with the same dictionary as the including document. - */ - if ((ctxt->doc != NULL) && (ctxt->doc->dict != NULL) && - (pctxt->dict != NULL)) { - xmlDictFree(pctxt->dict); - pctxt->dict = ctxt->doc->dict; - xmlDictReference(pctxt->dict); - } - - xmlCtxtUseOptions(pctxt, ctxt->parseFlags | XML_PARSE_DTDLOAD); - - inputStream = xmlLoadExternalEntity(URL, NULL, pctxt); - if (inputStream == NULL) { - xmlFreeParserCtxt(pctxt); - return(NULL); - } - - inputPush(pctxt, inputStream); - - if ((pctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory(URL); - if ((pctxt->directory == NULL) && (directory != NULL)) - pctxt->directory = (char *) xmlStrdup((xmlChar *) directory); - - pctxt->loadsubset |= XML_DETECT_IDS; - - xmlParseDocument(pctxt); - - if (pctxt->wellFormed) { - ret = pctxt->myDoc; - } - else { - ret = NULL; - if (pctxt->myDoc != NULL) - xmlFreeDoc(pctxt->myDoc); - pctxt->myDoc = NULL; - } - xmlFreeParserCtxt(pctxt); - - return(ret); -} - -/** - * xmlXIncludeAddNode: - * @ctxt: the XInclude context - * @cur: the new node - * - * Add a new node to process to an XInclude context - */ -static int -xmlXIncludeAddNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur) { - xmlXIncludeRefPtr ref; - xmlURIPtr uri; - xmlChar *URL; - xmlChar *fragment = NULL; - xmlChar *href; - xmlChar *parse; - xmlChar *base; - xmlChar *URI; - int xml = 1, i; /* default Issue 64 */ - int local = 0; - - - if (ctxt == NULL) - return(-1); - if (cur == NULL) - return(-1); - -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "Add node\n"); -#endif - /* - * read the attributes - */ - href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); - if (href == NULL) { - href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ - if (href == NULL) - return(-1); - local = 1; - } - if (href[0] == '#') - local = 1; - parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); - if (parse != NULL) { - if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) - xml = 1; - else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) - xml = 0; - else { - xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_PARSE_VALUE, - "invalid value %s for 'parse'\n", parse); - if (href != NULL) - xmlFree(href); - if (parse != NULL) - xmlFree(parse); - return(-1); - } - } - - /* - * compute the URI - */ - base = xmlNodeGetBase(ctxt->doc, cur); - if (base == NULL) { - URI = xmlBuildURI(href, ctxt->doc->URL); - } else { - URI = xmlBuildURI(href, base); - } - if (URI == NULL) { - xmlChar *escbase; - xmlChar *eschref; - /* - * Some escaping may be needed - */ - escbase = xmlURIEscape(base); - eschref = xmlURIEscape(href); - URI = xmlBuildURI(eschref, escbase); - if (escbase != NULL) - xmlFree(escbase); - if (eschref != NULL) - xmlFree(eschref); - } - if (parse != NULL) - xmlFree(parse); - if (href != NULL) - xmlFree(href); - if (base != NULL) - xmlFree(base); - if (URI == NULL) { - xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, - "failed build URL\n", NULL); - return(-1); - } - fragment = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE_XPOINTER); - - /* - * Check the URL and remove any fragment identifier - */ - uri = xmlParseURI((const char *)URI); - if (uri == NULL) { - xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, - "invalid value URI %s\n", URI); - if (fragment != NULL) - xmlFree(fragment); - xmlFree(URI); - return(-1); - } - - if (uri->fragment != NULL) { - if (ctxt->legacy != 0) { - if (fragment == NULL) { - fragment = (xmlChar *) uri->fragment; - } else { - xmlFree(uri->fragment); - } - } else { - xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_FRAGMENT_ID, - "Invalid fragment identifier in URI %s use the xpointer attribute\n", - URI); - if (fragment != NULL) - xmlFree(fragment); - xmlFreeURI(uri); - xmlFree(URI); - return(-1); - } - uri->fragment = NULL; - } - URL = xmlSaveUri(uri); - xmlFreeURI(uri); - xmlFree(URI); - if (URL == NULL) { - xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, - "invalid value URI %s\n", URI); - if (fragment != NULL) - xmlFree(fragment); - return(-1); - } - - /* - * Check the URL against the stack for recursions - */ - if ((!local) && (xml == 1)) { - for (i = 0;i < ctxt->urlNr;i++) { - if (xmlStrEqual(URL, ctxt->urlTab[i])) { - xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_RECURSION, - "detected a recursion in %s\n", URL); - return(-1); - } - } - } - - ref = xmlXIncludeNewRef(ctxt, URL, cur); - if (ref == NULL) { - return(-1); - } - ref->fragment = fragment; - ref->doc = NULL; - ref->xml = xml; - ref->count = 1; - xmlFree(URL); - return(0); -} - -/** - * xmlXIncludeRecurseDoc: - * @ctxt: the XInclude context - * @doc: the new document - * @url: the associated URL - * - * The XInclude recursive nature is handled at this point. - */ -static void -xmlXIncludeRecurseDoc(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, - const xmlURL url ATTRIBUTE_UNUSED) { - xmlXIncludeCtxtPtr newctxt; - int i; - - /* - * Avoid recursion in already substitued resources - for (i = 0;i < ctxt->urlNr;i++) { - if (xmlStrEqual(doc->URL, ctxt->urlTab[i])) - return; - } - */ - -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "Recursing in doc %s\n", doc->URL); -#endif - /* - * Handle recursion here. - */ - - newctxt = xmlXIncludeNewContext(doc); - if (newctxt != NULL) { - /* - * Copy the existing document set - */ - newctxt->incMax = ctxt->incMax; - newctxt->incNr = ctxt->incNr; - newctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(newctxt->incMax * - sizeof(newctxt->incTab[0])); - if (newctxt->incTab == NULL) { - xmlXIncludeErrMemory(ctxt, (xmlNodePtr) doc, "processing doc"); - xmlFree(newctxt); - return; - } - /* - * copy the urlTab - */ - newctxt->urlMax = ctxt->urlMax; - newctxt->urlNr = ctxt->urlNr; - newctxt->urlTab = ctxt->urlTab; - - /* - * Inherit the existing base - */ - newctxt->base = xmlStrdup(ctxt->base); - - /* - * Inherit the documents already in use by other includes - */ - newctxt->incBase = ctxt->incNr; - for (i = 0;i < ctxt->incNr;i++) { - newctxt->incTab[i] = ctxt->incTab[i]; - newctxt->incTab[i]->count++; /* prevent the recursion from - freeing it */ - } - /* - * The new context should also inherit the Parse Flags - * (bug 132597) - */ - newctxt->parseFlags = ctxt->parseFlags; - xmlXIncludeDoProcess(newctxt, doc, xmlDocGetRootElement(doc)); - for (i = 0;i < ctxt->incNr;i++) { - newctxt->incTab[i]->count--; - newctxt->incTab[i] = NULL; - } - - /* urlTab may have been reallocated */ - ctxt->urlTab = newctxt->urlTab; - ctxt->urlMax = newctxt->urlMax; - - newctxt->urlMax = 0; - newctxt->urlNr = 0; - newctxt->urlTab = NULL; - - xmlXIncludeFreeContext(newctxt); - } -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "Done recursing in doc %s\n", url); -#endif -} - -/** - * xmlXIncludeAddTxt: - * @ctxt: the XInclude context - * @txt: the new text node - * @url: the associated URL - * - * Add a new txtument to the list - */ -static void -xmlXIncludeAddTxt(xmlXIncludeCtxtPtr ctxt, xmlNodePtr txt, const xmlURL url) { -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "Adding text %s\n", url); -#endif - if (ctxt->txtMax == 0) { - ctxt->txtMax = 4; - ctxt->txtTab = (xmlNodePtr *) xmlMalloc(ctxt->txtMax * - sizeof(ctxt->txtTab[0])); - if (ctxt->txtTab == NULL) { - xmlXIncludeErrMemory(ctxt, NULL, "processing text"); - return; - } - ctxt->txturlTab = (xmlURL *) xmlMalloc(ctxt->txtMax * - sizeof(ctxt->txturlTab[0])); - if (ctxt->txturlTab == NULL) { - xmlXIncludeErrMemory(ctxt, NULL, "processing text"); - return; - } - } - if (ctxt->txtNr >= ctxt->txtMax) { - ctxt->txtMax *= 2; - ctxt->txtTab = (xmlNodePtr *) xmlRealloc(ctxt->txtTab, - ctxt->txtMax * sizeof(ctxt->txtTab[0])); - if (ctxt->txtTab == NULL) { - xmlXIncludeErrMemory(ctxt, NULL, "processing text"); - return; - } - ctxt->txturlTab = (xmlURL *) xmlRealloc(ctxt->txturlTab, - ctxt->txtMax * sizeof(ctxt->txturlTab[0])); - if (ctxt->txturlTab == NULL) { - xmlXIncludeErrMemory(ctxt, NULL, "processing text"); - return; - } - } - ctxt->txtTab[ctxt->txtNr] = txt; - ctxt->txturlTab[ctxt->txtNr] = xmlStrdup(url); - ctxt->txtNr++; -} - -/************************************************************************ - * * - * Node copy with specific semantic * - * * - ************************************************************************/ - -/** - * xmlXIncludeCopyNode: - * @ctxt: the XInclude context - * @target: the document target - * @source: the document source - * @elem: the element - * - * Make a copy of the node while preserving the XInclude semantic - * of the Infoset copy - */ -static xmlNodePtr -xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, - xmlDocPtr source, xmlNodePtr elem) { - xmlNodePtr result = NULL; - - if ((ctxt == NULL) || (target == NULL) || (source == NULL) || - (elem == NULL)) - return(NULL); - if (elem->type == XML_DTD_NODE) - return(NULL); - result = xmlDocCopyNode(elem, target, 1); - return(result); -} - -/** - * xmlXIncludeCopyNodeList: - * @ctxt: the XInclude context - * @target: the document target - * @source: the document source - * @elem: the element list - * - * Make a copy of the node list while preserving the XInclude semantic - * of the Infoset copy - */ -static xmlNodePtr -xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, - xmlDocPtr source, xmlNodePtr elem) { - xmlNodePtr cur, res, result = NULL, last = NULL; - - if ((ctxt == NULL) || (target == NULL) || (source == NULL) || - (elem == NULL)) - return(NULL); - cur = elem; - while (cur != NULL) { - res = xmlXIncludeCopyNode(ctxt, target, source, cur); - if (res != NULL) { - if (result == NULL) { - result = last = res; - } else { - last->next = res; - res->prev = last; - last = res; - } - } - cur = cur->next; - } - return(result); -} - -/** - * xmlXIncludeGetNthChild: - * @cur: the node - * @no: the child number - * - * Returns the @n'th element child of @cur or NULL - */ -static xmlNodePtr -xmlXIncludeGetNthChild(xmlNodePtr cur, int no) { - int i; - if (cur == NULL) - return(cur); - cur = cur->children; - for (i = 0;i <= no;cur = cur->next) { - if (cur == NULL) - return(cur); - if ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - i++; - if (i == no) - break; - } - } - return(cur); -} - -xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *level); /* in xpointer.c */ -/** - * xmlXIncludeCopyRange: - * @ctxt: the XInclude context - * @target: the document target - * @source: the document source - * @obj: the XPointer result from the evaluation. - * - * Build a node list tree copy of the XPointer result. - * - * Returns an xmlNodePtr list or NULL. - * The caller has to free the node tree. - */ -static xmlNodePtr -xmlXIncludeCopyRange(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, - xmlDocPtr source, xmlXPathObjectPtr range) { - /* pointers to generated nodes */ - xmlNodePtr list = NULL, last = NULL, listParent = NULL; - xmlNodePtr tmp, tmp2; - /* pointers to traversal nodes */ - xmlNodePtr start, cur, end; - int index1, index2; - int level = 0, lastLevel = 0, endLevel = 0, endFlag = 0; - - if ((ctxt == NULL) || (target == NULL) || (source == NULL) || - (range == NULL)) - return(NULL); - if (range->type != XPATH_RANGE) - return(NULL); - start = (xmlNodePtr) range->user; - - if (start == NULL) - return(NULL); - end = range->user2; - if (end == NULL) - return(xmlDocCopyNode(start, target, 1)); - - cur = start; - index1 = range->index; - index2 = range->index2; - /* - * level is depth of the current node under consideration - * list is the pointer to the root of the output tree - * listParent is a pointer to the parent of output tree (within - the included file) in case we need to add another level - * last is a pointer to the last node added to the output tree - * lastLevel is the depth of last (relative to the root) - */ - while (cur != NULL) { - /* - * Check if our output tree needs a parent - */ - if (level < 0) { - while (level < 0) { - /* copy must include namespaces and properties */ - tmp2 = xmlDocCopyNode(listParent, target, 2); - xmlAddChild(tmp2, list); - list = tmp2; - listParent = listParent->parent; - level++; - } - last = list; - lastLevel = 0; - } - /* - * Check whether we need to change our insertion point - */ - while (level < lastLevel) { - last = last->parent; - lastLevel --; - } - if (cur == end) { /* Are we at the end of the range? */ - if (cur->type == XML_TEXT_NODE) { - const xmlChar *content = cur->content; - int len; - - if (content == NULL) { - tmp = xmlNewTextLen(NULL, 0); - } else { - len = index2; - if ((cur == start) && (index1 > 1)) { - content += (index1 - 1); - len -= (index1 - 1); - index1 = 0; - } else { - len = index2; - } - tmp = xmlNewTextLen(content, len); - } - /* single sub text node selection */ - if (list == NULL) - return(tmp); - /* prune and return full set */ - if (level == lastLevel) - xmlAddNextSibling(last, tmp); - else - xmlAddChild(last, tmp); - return(list); - } else { /* ending node not a text node */ - endLevel = level; /* remember the level of the end node */ - endFlag = 1; - /* last node - need to take care of properties + namespaces */ - tmp = xmlDocCopyNode(cur, target, 2); - if (list == NULL) { - list = tmp; - listParent = cur->parent; - } else { - if (level == lastLevel) - xmlAddNextSibling(last, tmp); - else { - xmlAddChild(last, tmp); - lastLevel = level; - } - } - last = tmp; - - if (index2 > 1) { - end = xmlXIncludeGetNthChild(cur, index2 - 1); - index2 = 0; - } - if ((cur == start) && (index1 > 1)) { - cur = xmlXIncludeGetNthChild(cur, index1 - 1); - index1 = 0; - } else { - cur = cur->children; - } - level++; /* increment level to show change */ - /* - * Now gather the remaining nodes from cur to end - */ - continue; /* while */ - } - } else if (cur == start) { /* Not at the end, are we at start? */ - if ((cur->type == XML_TEXT_NODE) || - (cur->type == XML_CDATA_SECTION_NODE)) { - const xmlChar *content = cur->content; - - if (content == NULL) { - tmp = xmlNewTextLen(NULL, 0); - } else { - if (index1 > 1) { - content += (index1 - 1); - index1 = 0; - } - tmp = xmlNewText(content); - } - last = list = tmp; - listParent = cur->parent; - } else { /* Not text node */ - /* - * start of the range - need to take care of - * properties and namespaces - */ - tmp = xmlDocCopyNode(cur, target, 2); - list = last = tmp; - listParent = cur->parent; - if (index1 > 1) { /* Do we need to position? */ - cur = xmlXIncludeGetNthChild(cur, index1 - 1); - level = lastLevel = 1; - index1 = 0; - /* - * Now gather the remaining nodes from cur to end - */ - continue; /* while */ - } - } - } else { - tmp = NULL; - switch (cur->type) { - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_NODE: - /* Do not copy DTD informations */ - break; - case XML_ENTITY_DECL: - /* handle crossing entities -> stack needed */ - break; - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - /* don't consider it part of the tree content */ - break; - case XML_ATTRIBUTE_NODE: - /* Humm, should not happen ! */ - break; - default: - /* - * Middle of the range - need to take care of - * properties and namespaces - */ - tmp = xmlDocCopyNode(cur, target, 2); - break; - } - if (tmp != NULL) { - if (level == lastLevel) - xmlAddNextSibling(last, tmp); - else { - xmlAddChild(last, tmp); - lastLevel = level; - } - last = tmp; - } - } - /* - * Skip to next node in document order - */ - cur = xmlXPtrAdvanceNode(cur, &level); - if (endFlag && (level >= endLevel)) - break; - } - return(list); -} - -/** - * xmlXIncludeBuildNodeList: - * @ctxt: the XInclude context - * @target: the document target - * @source: the document source - * @obj: the XPointer result from the evaluation. - * - * Build a node list tree copy of the XPointer result. - * This will drop Attributes and Namespace declarations. - * - * Returns an xmlNodePtr list or NULL. - * the caller has to free the node tree. - */ -static xmlNodePtr -xmlXIncludeCopyXPointer(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, - xmlDocPtr source, xmlXPathObjectPtr obj) { - xmlNodePtr list = NULL, last = NULL; - int i; - - if (source == NULL) - source = ctxt->doc; - if ((ctxt == NULL) || (target == NULL) || (source == NULL) || - (obj == NULL)) - return(NULL); - switch (obj->type) { - case XPATH_NODESET: { - xmlNodeSetPtr set = obj->nodesetval; - if (set == NULL) - return(NULL); - for (i = 0;i < set->nodeNr;i++) { - if (set->nodeTab[i] == NULL) - continue; - switch (set->nodeTab[i]->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ELEMENT_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_XINCLUDE_END: - break; - case XML_XINCLUDE_START: { - xmlNodePtr tmp, cur = set->nodeTab[i]; - - cur = cur->next; - while (cur != NULL) { - switch(cur->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ELEMENT_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - tmp = xmlXIncludeCopyNode(ctxt, target, - source, cur); - if (last == NULL) { - list = last = tmp; - } else { - xmlAddNextSibling(last, tmp); - last = tmp; - } - cur = cur->next; - continue; - default: - break; - } - break; - } - continue; - } - case XML_ATTRIBUTE_NODE: - case XML_NAMESPACE_DECL: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - continue; /* for */ - } - if (last == NULL) - list = last = xmlXIncludeCopyNode(ctxt, target, source, - set->nodeTab[i]); - else { - xmlAddNextSibling(last, - xmlXIncludeCopyNode(ctxt, target, source, - set->nodeTab[i])); - if (last->next != NULL) - last = last->next; - } - } - break; - } - case XPATH_LOCATIONSET: { - xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user; - if (set == NULL) - return(NULL); - for (i = 0;i < set->locNr;i++) { - if (last == NULL) - list = last = xmlXIncludeCopyXPointer(ctxt, target, source, - set->locTab[i]); - else - xmlAddNextSibling(last, - xmlXIncludeCopyXPointer(ctxt, target, source, - set->locTab[i])); - if (last != NULL) { - while (last->next != NULL) - last = last->next; - } - } - break; - } -#ifdef LIBXML_XPTR_ENABLED - case XPATH_RANGE: - return(xmlXIncludeCopyRange(ctxt, target, source, obj)); -#endif - case XPATH_POINT: - /* points are ignored in XInclude */ - break; - default: - break; - } - return(list); -} -/************************************************************************ - * * - * XInclude I/O handling * - * * - ************************************************************************/ - -typedef struct _xmlXIncludeMergeData xmlXIncludeMergeData; -typedef xmlXIncludeMergeData *xmlXIncludeMergeDataPtr; -struct _xmlXIncludeMergeData { - xmlDocPtr doc; - xmlXIncludeCtxtPtr ctxt; -}; - -/** - * xmlXIncludeMergeOneEntity: - * @ent: the entity - * @doc: the including doc - * @nr: the entity name - * - * Inplements the merge of one entity - */ -static void -xmlXIncludeMergeEntity(xmlEntityPtr ent, xmlXIncludeMergeDataPtr data, - xmlChar *name ATTRIBUTE_UNUSED) { - xmlEntityPtr ret, prev; - xmlDocPtr doc; - xmlXIncludeCtxtPtr ctxt; - - if ((ent == NULL) || (data == NULL)) - return; - ctxt = data->ctxt; - doc = data->doc; - if ((ctxt == NULL) || (doc == NULL)) - return; - switch (ent->etype) { - case XML_INTERNAL_PARAMETER_ENTITY: - case XML_EXTERNAL_PARAMETER_ENTITY: - case XML_INTERNAL_PREDEFINED_ENTITY: - return; - case XML_INTERNAL_GENERAL_ENTITY: - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - break; - } - ret = xmlAddDocEntity(doc, ent->name, ent->etype, ent->ExternalID, - ent->SystemID, ent->content); - if (ret != NULL) { - if (ent->URI != NULL) - ret->URI = xmlStrdup(ent->URI); - } else { - prev = xmlGetDocEntity(doc, ent->name); - if (prev != NULL) { - if (ent->etype != prev->etype) - goto error; - - if ((ent->SystemID != NULL) && (prev->SystemID != NULL)) { - if (!xmlStrEqual(ent->SystemID, prev->SystemID)) - goto error; - } else if ((ent->ExternalID != NULL) && - (prev->ExternalID != NULL)) { - if (!xmlStrEqual(ent->ExternalID, prev->ExternalID)) - goto error; - } else if ((ent->content != NULL) && (prev->content != NULL)) { - if (!xmlStrEqual(ent->content, prev->content)) - goto error; - } else { - goto error; - } - - } - } - return; -error: - switch (ent->etype) { - case XML_INTERNAL_PARAMETER_ENTITY: - case XML_EXTERNAL_PARAMETER_ENTITY: - case XML_INTERNAL_PREDEFINED_ENTITY: - case XML_INTERNAL_GENERAL_ENTITY: - case XML_EXTERNAL_GENERAL_PARSED_ENTITY: - return; - case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: - break; - } - xmlXIncludeErr(ctxt, (xmlNodePtr) ent, XML_XINCLUDE_ENTITY_DEF_MISMATCH, - "mismatch in redefinition of entity %s\n", - ent->name); -} - -/** - * xmlXIncludeMergeEntities: - * @ctxt: an XInclude context - * @doc: the including doc - * @from: the included doc - * - * Inplements the entity merge - * - * Returns 0 if merge succeeded, -1 if some processing failed - */ -static int -xmlXIncludeMergeEntities(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, - xmlDocPtr from) { - xmlNodePtr cur; - xmlDtdPtr target, source; - - if (ctxt == NULL) - return(-1); - - if ((from == NULL) || (from->intSubset == NULL)) - return(0); - - target = doc->intSubset; - if (target == NULL) { - cur = xmlDocGetRootElement(doc); - if (cur == NULL) - return(-1); - target = xmlCreateIntSubset(doc, cur->name, NULL, NULL); - if (target == NULL) - return(-1); - } - - source = from->intSubset; - if ((source != NULL) && (source->entities != NULL)) { - xmlXIncludeMergeData data; - - data.ctxt = ctxt; - data.doc = doc; - - xmlHashScan((xmlHashTablePtr) source->entities, - (xmlHashScanner) xmlXIncludeMergeEntity, &data); - } - source = from->extSubset; - if ((source != NULL) && (source->entities != NULL)) { - xmlXIncludeMergeData data; - - data.ctxt = ctxt; - data.doc = doc; - - /* - * don't duplicate existing stuff when external subsets are the same - */ - if ((!xmlStrEqual(target->ExternalID, source->ExternalID)) && - (!xmlStrEqual(target->SystemID, source->SystemID))) { - xmlHashScan((xmlHashTablePtr) source->entities, - (xmlHashScanner) xmlXIncludeMergeEntity, &data); - } - } - return(0); -} - -/** - * xmlXIncludeLoadDoc: - * @ctxt: the XInclude context - * @url: the associated URL - * @nr: the xinclude node number - * - * Load the document, and store the result in the XInclude context - * - * Returns 0 in case of success, -1 in case of failure - */ -static int -xmlXIncludeLoadDoc(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { - xmlDocPtr doc; - xmlURIPtr uri; - xmlChar *URL; - xmlChar *fragment = NULL; - int i = 0; -#ifdef LIBXML_XPTR_ENABLED - int saveFlags; -#endif - -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "Loading doc %s:%d\n", url, nr); -#endif - /* - * Check the URL and remove any fragment identifier - */ - uri = xmlParseURI((const char *)url); - if (uri == NULL) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_HREF_URI, - "invalid value URI %s\n", url); - return(-1); - } - if (uri->fragment != NULL) { - fragment = (xmlChar *) uri->fragment; - uri->fragment = NULL; - } - if ((ctxt->incTab != NULL) && (ctxt->incTab[nr] != NULL) && - (ctxt->incTab[nr]->fragment != NULL)) { - if (fragment != NULL) xmlFree(fragment); - fragment = xmlStrdup(ctxt->incTab[nr]->fragment); - } - URL = xmlSaveUri(uri); - xmlFreeURI(uri); - if (URL == NULL) { - if (ctxt->incTab != NULL) - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_HREF_URI, - "invalid value URI %s\n", url); - else - xmlXIncludeErr(ctxt, NULL, - XML_XINCLUDE_HREF_URI, - "invalid value URI %s\n", url); - if (fragment != NULL) - xmlFree(fragment); - return(-1); - } - - /* - * Handling of references to the local document are done - * directly through ctxt->doc. - */ - if ((URL[0] == 0) || (URL[0] == '#') || - ((ctxt->doc != NULL) && (xmlStrEqual(URL, ctxt->doc->URL)))) { - doc = NULL; - goto loaded; - } - - /* - * Prevent reloading twice the document. - */ - for (i = 0; i < ctxt->incNr; i++) { - if ((xmlStrEqual(URL, ctxt->incTab[i]->URI)) && - (ctxt->incTab[i]->doc != NULL)) { - doc = ctxt->incTab[i]->doc; -#ifdef DEBUG_XINCLUDE - printf("Already loaded %s\n", URL); -#endif - goto loaded; - } - } - - /* - * Load it. - */ -#ifdef DEBUG_XINCLUDE - printf("loading %s\n", URL); -#endif -#ifdef LIBXML_XPTR_ENABLED - /* - * If this is an XPointer evaluation, we want to assure that - * all entities have been resolved prior to processing the - * referenced document - */ - saveFlags = ctxt->parseFlags; - if (fragment != NULL) { /* if this is an XPointer eval */ - ctxt->parseFlags |= XML_PARSE_NOENT; - } -#endif - - doc = xmlXIncludeParseFile(ctxt, (const char *)URL); -#ifdef LIBXML_XPTR_ENABLED - ctxt->parseFlags = saveFlags; -#endif - if (doc == NULL) { - xmlFree(URL); - if (fragment != NULL) - xmlFree(fragment); - return(-1); - } - ctxt->incTab[nr]->doc = doc; - /* - * It's possible that the requested URL has been mapped to a - * completely different location (e.g. through a catalog entry). - * To check for this, we compare the URL with that of the doc - * and change it if they disagree (bug 146988). - */ - if (!xmlStrEqual(URL, doc->URL)) { - xmlFree(URL); - URL = xmlStrdup(doc->URL); - } - for (i = nr + 1; i < ctxt->incNr; i++) { - if (xmlStrEqual(URL, ctxt->incTab[i]->URI)) { - ctxt->incTab[nr]->count++; -#ifdef DEBUG_XINCLUDE - printf("Increasing %s count since reused\n", URL); -#endif - break; - } - } - - /* - * Make sure we have all entities fixed up - */ - xmlXIncludeMergeEntities(ctxt, ctxt->doc, doc); - - /* - * We don't need the DTD anymore, free up space - if (doc->intSubset != NULL) { - xmlUnlinkNode((xmlNodePtr) doc->intSubset); - xmlFreeNode((xmlNodePtr) doc->intSubset); - doc->intSubset = NULL; - } - if (doc->extSubset != NULL) { - xmlUnlinkNode((xmlNodePtr) doc->extSubset); - xmlFreeNode((xmlNodePtr) doc->extSubset); - doc->extSubset = NULL; - } - */ - xmlXIncludeRecurseDoc(ctxt, doc, URL); - -loaded: - if (fragment == NULL) { - /* - * Add the top children list as the replacement copy. - */ - if (doc == NULL) - { - /* Hopefully a DTD declaration won't be copied from - * the same document */ - ctxt->incTab[nr]->inc = xmlCopyNodeList(ctxt->doc->children); - } else { - ctxt->incTab[nr]->inc = xmlXIncludeCopyNodeList(ctxt, ctxt->doc, - doc, doc->children); - } - } -#ifdef LIBXML_XPTR_ENABLED - else { - /* - * Computes the XPointer expression and make a copy used - * as the replacement copy. - */ - xmlXPathObjectPtr xptr; - xmlXPathContextPtr xptrctxt; - xmlNodeSetPtr set; - - if (doc == NULL) { - xptrctxt = xmlXPtrNewContext(ctxt->doc, ctxt->incTab[nr]->ref, - NULL); - } else { - xptrctxt = xmlXPtrNewContext(doc, NULL, NULL); - } - if (xptrctxt == NULL) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_XPTR_FAILED, - "could not create XPointer context\n", NULL); - xmlFree(URL); - xmlFree(fragment); - return(-1); - } - xptr = xmlXPtrEval(fragment, xptrctxt); - if (xptr == NULL) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_XPTR_FAILED, - "XPointer evaluation failed: #%s\n", - fragment); - xmlXPathFreeContext(xptrctxt); - xmlFree(URL); - xmlFree(fragment); - return(-1); - } - switch (xptr->type) { - case XPATH_UNDEFINED: - case XPATH_BOOLEAN: - case XPATH_NUMBER: - case XPATH_STRING: - case XPATH_POINT: - case XPATH_USERS: - case XPATH_XSLT_TREE: - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_XPTR_RESULT, - "XPointer is not a range: #%s\n", - fragment); - xmlXPathFreeContext(xptrctxt); - xmlFree(URL); - xmlFree(fragment); - return(-1); - case XPATH_NODESET: - if ((xptr->nodesetval == NULL) || - (xptr->nodesetval->nodeNr <= 0)) { - xmlXPathFreeContext(xptrctxt); - xmlFree(URL); - xmlFree(fragment); - return(-1); - } - - case XPATH_RANGE: - case XPATH_LOCATIONSET: - break; - } - set = xptr->nodesetval; - if (set != NULL) { - for (i = 0;i < set->nodeNr;i++) { - if (set->nodeTab[i] == NULL) - continue; - switch (set->nodeTab[i]->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - continue; - case XML_ELEMENT_NODE: { - xmlChar *nodeBase; - xmlNodePtr el = set->nodeTab[i]; - - nodeBase = xmlNodeGetBase(el->doc, el); - if (nodeBase != NULL) { - if (!xmlStrEqual(nodeBase, el->doc->URL)) - xmlNodeSetBase(el, nodeBase); - xmlFree(nodeBase); - } - continue; - } - - case XML_ATTRIBUTE_NODE: - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_XPTR_RESULT, - "XPointer selects an attribute: #%s\n", - fragment); - set->nodeTab[i] = NULL; - continue; - case XML_NAMESPACE_DECL: - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_XPTR_RESULT, - "XPointer selects a namespace: #%s\n", - fragment); - set->nodeTab[i] = NULL; - continue; - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_XPTR_RESULT, - "XPointer selects unexpected nodes: #%s\n", - fragment); - set->nodeTab[i] = NULL; - set->nodeTab[i] = NULL; - continue; /* for */ - } - } - } - if (doc == NULL) { - ctxt->incTab[nr]->xptr = xptr; - ctxt->incTab[nr]->inc = NULL; - } else { - ctxt->incTab[nr]->inc = - xmlXIncludeCopyXPointer(ctxt, ctxt->doc, doc, xptr); - xmlXPathFreeObject(xptr); - } - xmlXPathFreeContext(xptrctxt); - xmlFree(fragment); - } -#endif - - /* - * Do the xml:base fixup if needed - */ - if ((doc != NULL) && (URL != NULL) && (xmlStrchr(URL, (xmlChar) '/'))) { - xmlNodePtr node; - xmlChar *base; - xmlChar *curBase; - - /* - * The base is only adjusted if "necessary", i.e. if the xinclude node - * has a base specified, or the URL is relative - */ - base = xmlGetNsProp(ctxt->incTab[nr]->ref, BAD_CAST "base", - XML_XML_NAMESPACE); - if (base == NULL) { - /* - * No xml:base on the xinclude node, so we check whether the - * URI base is different than (relative to) the context base - */ - curBase = xmlBuildRelativeURI(URL, ctxt->base); - if (curBase == NULL) { /* Error return */ - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_HREF_URI, - "trying to build relative URI from %s\n", URL); - } else { - /* If the URI doesn't contain a slash, it's not relative */ - if (!xmlStrchr(curBase, (xmlChar) '/')) - xmlFree(curBase); - else - base = curBase; - } - } - if (base != NULL) { /* Adjustment may be needed */ - node = ctxt->incTab[nr]->inc; - while (node != NULL) { - /* Only work on element nodes */ - if (node->type == XML_ELEMENT_NODE) { - curBase = xmlNodeGetBase(node->doc, node); - /* If no current base, set it */ - if (curBase == NULL) { - xmlNodeSetBase(node, base); - } else { - /* - * If the current base is the same as the - * URL of the document, then reset it to be - * the specified xml:base or the relative URI - */ - if (xmlStrEqual(curBase, node->doc->URL)) { - xmlNodeSetBase(node, base); - } else { - /* - * If the element already has an xml:base - * set, then relativise it if necessary - */ - xmlChar *xmlBase; - xmlBase = xmlGetNsProp(node, - BAD_CAST "base", - XML_XML_NAMESPACE); - if (xmlBase != NULL) { - xmlChar *relBase; - relBase = xmlBuildURI(xmlBase, base); - if (relBase == NULL) { /* error */ - xmlXIncludeErr(ctxt, - ctxt->incTab[nr]->ref, - XML_XINCLUDE_HREF_URI, - "trying to rebuild base from %s\n", - xmlBase); - } else { - xmlNodeSetBase(node, relBase); - xmlFree(relBase); - } - xmlFree(xmlBase); - } - } - xmlFree(curBase); - } - } - node = node->next; - } - xmlFree(base); - } - } - if ((nr < ctxt->incNr) && (ctxt->incTab[nr]->doc != NULL) && - (ctxt->incTab[nr]->count <= 1)) { -#ifdef DEBUG_XINCLUDE - printf("freeing %s\n", ctxt->incTab[nr]->doc->URL); -#endif - xmlFreeDoc(ctxt->incTab[nr]->doc); - ctxt->incTab[nr]->doc = NULL; - } - xmlFree(URL); - return(0); -} - -/** - * xmlXIncludeLoadTxt: - * @ctxt: the XInclude context - * @url: the associated URL - * @nr: the xinclude node number - * - * Load the content, and store the result in the XInclude context - * - * Returns 0 in case of success, -1 in case of failure - */ -static int -xmlXIncludeLoadTxt(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { - xmlParserInputBufferPtr buf; - xmlNodePtr node; - xmlURIPtr uri; - xmlChar *URL; - int i; - xmlChar *encoding = NULL; - xmlCharEncoding enc = (xmlCharEncoding) 0; - - /* - * Check the URL and remove any fragment identifier - */ - uri = xmlParseURI((const char *)url); - if (uri == NULL) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, - "invalid value URI %s\n", url); - return(-1); - } - if (uri->fragment != NULL) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_TEXT_FRAGMENT, - "fragment identifier forbidden for text: %s\n", - (const xmlChar *) uri->fragment); - xmlFreeURI(uri); - return(-1); - } - URL = xmlSaveUri(uri); - xmlFreeURI(uri); - if (URL == NULL) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, - "invalid value URI %s\n", url); - return(-1); - } - - /* - * Handling of references to the local document are done - * directly through ctxt->doc. - */ - if (URL[0] == 0) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_TEXT_DOCUMENT, - "text serialization of document not available\n", NULL); - xmlFree(URL); - return(-1); - } - - /* - * Prevent reloading twice the document. - */ - for (i = 0; i < ctxt->txtNr; i++) { - if (xmlStrEqual(URL, ctxt->txturlTab[i])) { - node = xmlCopyNode(ctxt->txtTab[i], 1); - goto loaded; - } - } - /* - * Try to get the encoding if available - */ - if ((ctxt->incTab[nr] != NULL) && (ctxt->incTab[nr]->ref != NULL)) { - encoding = xmlGetProp(ctxt->incTab[nr]->ref, XINCLUDE_PARSE_ENCODING); - } - if (encoding != NULL) { - /* - * TODO: we should not have to remap to the xmlCharEncoding - * predefined set, a better interface than - * xmlParserInputBufferCreateFilename should allow any - * encoding supported by iconv - */ - enc = xmlParseCharEncoding((const char *) encoding); - if (enc == XML_CHAR_ENCODING_ERROR) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_UNKNOWN_ENCODING, - "encoding %s not supported\n", encoding); - xmlFree(encoding); - xmlFree(URL); - return(-1); - } - xmlFree(encoding); - } - - /* - * Load it. - */ - buf = xmlParserInputBufferCreateFilename((const char *)URL, enc); - if (buf == NULL) { - xmlFree(URL); - return(-1); - } - node = xmlNewText(NULL); - - /* - * Scan all chars from the resource and add the to the node - */ - while (xmlParserInputBufferRead(buf, 128) > 0) { - int len; - const xmlChar *content; - - content = xmlBufferContent(buf->buffer); - len = xmlBufferLength(buf->buffer); - for (i = 0;i < len;) { - int cur; - int l; - - cur = xmlStringCurrentChar(NULL, &content[i], &l); - if (!IS_CHAR(cur)) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_INVALID_CHAR, - "%s contains invalid char\n", URL); - } else { - xmlNodeAddContentLen(node, &content[i], l); - } - i += l; - } - xmlBufferShrink(buf->buffer, len); - } - xmlFreeParserInputBuffer(buf); - xmlXIncludeAddTxt(ctxt, node, URL); - -loaded: - /* - * Add the element as the replacement copy. - */ - ctxt->incTab[nr]->inc = node; - xmlFree(URL); - return(0); -} - -/** - * xmlXIncludeLoadFallback: - * @ctxt: the XInclude context - * @fallback: the fallback node - * @nr: the xinclude node number - * - * Load the content of the fallback node, and store the result - * in the XInclude context - * - * Returns 0 in case of success, -1 in case of failure - */ -static int -xmlXIncludeLoadFallback(xmlXIncludeCtxtPtr ctxt, xmlNodePtr fallback, int nr) { - xmlXIncludeCtxtPtr newctxt; - int ret = 0; - - if ((fallback == NULL) || (ctxt == NULL)) - return(-1); - if (fallback->children != NULL) { - /* - * It's possible that the fallback also has 'includes' - * (Bug 129969), so we re-process the fallback just in case - */ - newctxt = xmlXIncludeNewContext(ctxt->doc); - if (newctxt == NULL) - return (-1); - newctxt->base = xmlStrdup(ctxt->base); /* Inherit the base from the existing context */ - xmlXIncludeSetFlags(newctxt, ctxt->parseFlags); - ret = xmlXIncludeDoProcess(newctxt, ctxt->doc, fallback->children); - if (ctxt->nbErrors > 0) - ret = -1; - else if (ret > 0) - ret = 0; /* xmlXIncludeDoProcess can return +ve number */ - xmlXIncludeFreeContext(newctxt); - - ctxt->incTab[nr]->inc = xmlDocCopyNodeList(ctxt->doc, - fallback->children); - } else { - ctxt->incTab[nr]->inc = NULL; - ctxt->incTab[nr]->emptyFb = 1; /* flag empty callback */ - } - return(ret); -} - -/************************************************************************ - * * - * XInclude Processing * - * * - ************************************************************************/ - -/** - * xmlXIncludePreProcessNode: - * @ctxt: an XInclude context - * @node: an XInclude node - * - * Implement the XInclude preprocessing, currently just adding the element - * for further processing. - * - * Returns the result list or NULL in case of error - */ -static xmlNodePtr -xmlXIncludePreProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { - xmlXIncludeAddNode(ctxt, node); - return(NULL); -} - -/** - * xmlXIncludeLoadNode: - * @ctxt: an XInclude context - * @nr: the node number - * - * Find and load the infoset replacement for the given node. - * - * Returns 0 if substitution succeeded, -1 if some processing failed - */ -static int -xmlXIncludeLoadNode(xmlXIncludeCtxtPtr ctxt, int nr) { - xmlNodePtr cur; - xmlChar *href; - xmlChar *parse; - xmlChar *base; - xmlChar *oldBase; - xmlChar *URI; - int xml = 1; /* default Issue 64 */ - int ret; - - if (ctxt == NULL) - return(-1); - if ((nr < 0) || (nr >= ctxt->incNr)) - return(-1); - cur = ctxt->incTab[nr]->ref; - if (cur == NULL) - return(-1); - - /* - * read the attributes - */ - href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); - if (href == NULL) { - href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ - if (href == NULL) - return(-1); - } - parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); - if (parse != NULL) { - if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) - xml = 1; - else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) - xml = 0; - else { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_PARSE_VALUE, - "invalid value %s for 'parse'\n", parse); - if (href != NULL) - xmlFree(href); - if (parse != NULL) - xmlFree(parse); - return(-1); - } - } - - /* - * compute the URI - */ - base = xmlNodeGetBase(ctxt->doc, cur); - if (base == NULL) { - URI = xmlBuildURI(href, ctxt->doc->URL); - } else { - URI = xmlBuildURI(href, base); - } - if (URI == NULL) { - xmlChar *escbase; - xmlChar *eschref; - /* - * Some escaping may be needed - */ - escbase = xmlURIEscape(base); - eschref = xmlURIEscape(href); - URI = xmlBuildURI(eschref, escbase); - if (escbase != NULL) - xmlFree(escbase); - if (eschref != NULL) - xmlFree(eschref); - } - if (URI == NULL) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_HREF_URI, "failed build URL\n", NULL); - if (parse != NULL) - xmlFree(parse); - if (href != NULL) - xmlFree(href); - if (base != NULL) - xmlFree(base); - return(-1); - } -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "parse: %s\n", - xml ? "xml": "text"); - xmlGenericError(xmlGenericErrorContext, "URI: %s\n", URI); -#endif - - /* - * Save the base for this include (saving the current one) - */ - oldBase = ctxt->base; - ctxt->base = base; - - if (xml) { - ret = xmlXIncludeLoadDoc(ctxt, URI, nr); - /* xmlXIncludeGetFragment(ctxt, cur, URI); */ - } else { - ret = xmlXIncludeLoadTxt(ctxt, URI, nr); - } - - /* - * Restore the original base before checking for fallback - */ - ctxt->base = oldBase; - - if (ret < 0) { - xmlNodePtr children; - - /* - * Time to try a fallback if availble - */ -#ifdef DEBUG_XINCLUDE - xmlGenericError(xmlGenericErrorContext, "error looking for fallback\n"); -#endif - children = cur->children; - while (children != NULL) { - if ((children->type == XML_ELEMENT_NODE) && - (children->ns != NULL) && - (xmlStrEqual(children->name, XINCLUDE_FALLBACK)) && - ((xmlStrEqual(children->ns->href, XINCLUDE_NS)) || - (xmlStrEqual(children->ns->href, XINCLUDE_OLD_NS)))) { - ret = xmlXIncludeLoadFallback(ctxt, children, nr); - if (ret == 0) - break; - } - children = children->next; - } - } - if (ret < 0) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_NO_FALLBACK, - "could not load %s, and no fallback was found\n", - URI); - } - - /* - * Cleanup - */ - if (URI != NULL) - xmlFree(URI); - if (parse != NULL) - xmlFree(parse); - if (href != NULL) - xmlFree(href); - if (base != NULL) - xmlFree(base); - return(0); -} - -/** - * xmlXIncludeIncludeNode: - * @ctxt: an XInclude context - * @nr: the node number - * - * Inplement the infoset replacement for the given node - * - * Returns 0 if substitution succeeded, -1 if some processing failed - */ -static int -xmlXIncludeIncludeNode(xmlXIncludeCtxtPtr ctxt, int nr) { - xmlNodePtr cur, end, list, tmp; - - if (ctxt == NULL) - return(-1); - if ((nr < 0) || (nr >= ctxt->incNr)) - return(-1); - cur = ctxt->incTab[nr]->ref; - if (cur == NULL) - return(-1); - - /* - * If we stored an XPointer a late computation may be needed - */ - if ((ctxt->incTab[nr]->inc == NULL) && - (ctxt->incTab[nr]->xptr != NULL)) { - ctxt->incTab[nr]->inc = - xmlXIncludeCopyXPointer(ctxt, ctxt->doc, ctxt->doc, - ctxt->incTab[nr]->xptr); - xmlXPathFreeObject(ctxt->incTab[nr]->xptr); - ctxt->incTab[nr]->xptr = NULL; - } - list = ctxt->incTab[nr]->inc; - ctxt->incTab[nr]->inc = NULL; - - /* - * Check against the risk of generating a multi-rooted document - */ - if ((cur->parent != NULL) && - (cur->parent->type != XML_ELEMENT_NODE)) { - int nb_elem = 0; - - tmp = list; - while (tmp != NULL) { - if (tmp->type == XML_ELEMENT_NODE) - nb_elem++; - tmp = tmp->next; - } - if (nb_elem > 1) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_MULTIPLE_ROOT, - "XInclude error: would result in multiple root nodes\n", - NULL); - return(-1); - } - } - - if (ctxt->parseFlags & XML_PARSE_NOXINCNODE) { - /* - * Add the list of nodes - */ - while (list != NULL) { - end = list; - list = list->next; - - xmlAddPrevSibling(cur, end); - } - xmlUnlinkNode(cur); - xmlFreeNode(cur); - } else { - /* - * Change the current node as an XInclude start one, and add an - * XInclude end one - */ - cur->type = XML_XINCLUDE_START; - end = xmlNewDocNode(cur->doc, cur->ns, cur->name, NULL); - if (end == NULL) { - xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, - XML_XINCLUDE_BUILD_FAILED, - "failed to build node\n", NULL); - return(-1); - } - end->type = XML_XINCLUDE_END; - xmlAddNextSibling(cur, end); - - /* - * Add the list of nodes - */ - while (list != NULL) { - cur = list; - list = list->next; - - xmlAddPrevSibling(end, cur); - } - } - - - return(0); -} - -/** - * xmlXIncludeTestNode: - * @ctxt: the XInclude processing context - * @node: an XInclude node - * - * test if the node is an XInclude node - * - * Returns 1 true, 0 otherwise - */ -static int -xmlXIncludeTestNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { - if (node == NULL) - return(0); - if (node->type != XML_ELEMENT_NODE) - return(0); - if (node->ns == NULL) - return(0); - if ((xmlStrEqual(node->ns->href, XINCLUDE_NS)) || - (xmlStrEqual(node->ns->href, XINCLUDE_OLD_NS))) { - if (xmlStrEqual(node->ns->href, XINCLUDE_OLD_NS)) { - if (ctxt->legacy == 0) { -#if 0 /* wait for the XML Core Working Group to get something stable ! */ - xmlXIncludeWarn(ctxt, node, XML_XINCLUDE_DEPRECATED_NS, - "Deprecated XInclude namespace found, use %s", - XINCLUDE_NS); -#endif - ctxt->legacy = 1; - } - } - if (xmlStrEqual(node->name, XINCLUDE_NODE)) { - xmlNodePtr child = node->children; - int nb_fallback = 0; - - while (child != NULL) { - if ((child->type == XML_ELEMENT_NODE) && - (child->ns != NULL) && - ((xmlStrEqual(child->ns->href, XINCLUDE_NS)) || - (xmlStrEqual(child->ns->href, XINCLUDE_OLD_NS)))) { - if (xmlStrEqual(child->name, XINCLUDE_NODE)) { - xmlXIncludeErr(ctxt, node, - XML_XINCLUDE_INCLUDE_IN_INCLUDE, - "%s has an 'include' child\n", - XINCLUDE_NODE); - return(0); - } - if (xmlStrEqual(child->name, XINCLUDE_FALLBACK)) { - nb_fallback++; - } - } - child = child->next; - } - if (nb_fallback > 1) { - xmlXIncludeErr(ctxt, node, XML_XINCLUDE_FALLBACKS_IN_INCLUDE, - "%s has multiple fallback children\n", - XINCLUDE_NODE); - return(0); - } - return(1); - } - if (xmlStrEqual(node->name, XINCLUDE_FALLBACK)) { - if ((node->parent == NULL) || - (node->parent->type != XML_ELEMENT_NODE) || - (node->parent->ns == NULL) || - ((!xmlStrEqual(node->parent->ns->href, XINCLUDE_NS)) && - (!xmlStrEqual(node->parent->ns->href, XINCLUDE_OLD_NS))) || - (!xmlStrEqual(node->parent->name, XINCLUDE_NODE))) { - xmlXIncludeErr(ctxt, node, - XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE, - "%s is not the child of an 'include'\n", - XINCLUDE_FALLBACK); - } - } - } - return(0); -} - -/** - * xmlXIncludeDoProcess: - * @ctxt: the XInclude processing context - * @doc: an XML document - * @tree: the top of the tree to process - * - * Implement the XInclude substitution on the XML document @doc - * - * Returns 0 if no substitution were done, -1 if some processing failed - * or the number of substitutions done. - */ -static int -xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree) { - xmlNodePtr cur; - int ret = 0; - int i, start; - - if ((doc == NULL) || (tree == NULL)) - return(-1); - if (ctxt == NULL) - return(-1); - - if (doc->URL != NULL) { - ret = xmlXIncludeURLPush(ctxt, doc->URL); - if (ret < 0) - return(-1); - } - start = ctxt->incNr; - - /* - * First phase: lookup the elements in the document - */ - cur = tree; - if (xmlXIncludeTestNode(ctxt, cur) == 1) - xmlXIncludePreProcessNode(ctxt, cur); - while ((cur != NULL) && (cur != tree->parent)) { - /* TODO: need to work on entities -> stack */ - if ((cur->children != NULL) && - (cur->children->type != XML_ENTITY_DECL) && - (cur->children->type != XML_XINCLUDE_START) && - (cur->children->type != XML_XINCLUDE_END)) { - cur = cur->children; - if (xmlXIncludeTestNode(ctxt, cur)) - xmlXIncludePreProcessNode(ctxt, cur); - } else if (cur->next != NULL) { - cur = cur->next; - if (xmlXIncludeTestNode(ctxt, cur)) - xmlXIncludePreProcessNode(ctxt, cur); - } else { - if (cur == tree) - break; - do { - cur = cur->parent; - if ((cur == NULL) || (cur == tree->parent)) - break; /* do */ - if (cur->next != NULL) { - cur = cur->next; - if (xmlXIncludeTestNode(ctxt, cur)) - xmlXIncludePreProcessNode(ctxt, cur); - break; /* do */ - } - } while (cur != NULL); - } - } - - /* - * Second Phase : collect the infosets fragments - */ - for (i = start;i < ctxt->incNr; i++) { - xmlXIncludeLoadNode(ctxt, i); - ret++; - } - - /* - * Third phase: extend the original document infoset. - * - * Originally we bypassed the inclusion if there were any errors - * encountered on any of the XIncludes. A bug was raised (bug - * 132588) requesting that we output the XIncludes without error, - * so the check for inc!=NULL || xptr!=NULL was put in. This may - * give some other problems in the future, but for now it seems to - * work ok. - * - */ - for (i = ctxt->incBase;i < ctxt->incNr; i++) { - if ((ctxt->incTab[i]->inc != NULL) || - (ctxt->incTab[i]->xptr != NULL) || - (ctxt->incTab[i]->emptyFb != 0)) /* (empty fallback) */ - xmlXIncludeIncludeNode(ctxt, i); - } - - if (doc->URL != NULL) - xmlXIncludeURLPop(ctxt); - return(ret); -} - -/** - * xmlXIncludeSetFlags: - * @ctxt: an XInclude processing context - * @flags: a set of xmlParserOption used for parsing XML includes - * - * Set the flags used for further processing of XML resources. - * - * Returns 0 in case of success and -1 in case of error. - */ -int -xmlXIncludeSetFlags(xmlXIncludeCtxtPtr ctxt, int flags) { - if (ctxt == NULL) - return(-1); - ctxt->parseFlags = flags; - return(0); -} - -/** - * xmlXIncludeProcessFlagsData: - * @doc: an XML document - * @flags: a set of xmlParserOption used for parsing XML includes - * @data: application data that will be passed to the parser context - * in the _private field of the parser context(s) - * - * Implement the XInclude substitution on the XML document @doc - * - * Returns 0 if no substitution were done, -1 if some processing failed - * or the number of substitutions done. - */ -int -xmlXIncludeProcessFlagsData(xmlDocPtr doc, int flags, void *data) { - xmlXIncludeCtxtPtr ctxt; - xmlNodePtr tree; - int ret = 0; - - if (doc == NULL) - return(-1); - tree = xmlDocGetRootElement(doc); - if (tree == NULL) - return(-1); - ctxt = xmlXIncludeNewContext(doc); - if (ctxt == NULL) - return(-1); - ctxt->_private = data; - ctxt->base = xmlStrdup((xmlChar *)doc->URL); - xmlXIncludeSetFlags(ctxt, flags); - ret = xmlXIncludeDoProcess(ctxt, doc, tree); - if ((ret >= 0) && (ctxt->nbErrors > 0)) - ret = -1; - - xmlXIncludeFreeContext(ctxt); - return(ret); -} - -/** - * xmlXIncludeProcessFlags: - * @doc: an XML document - * @flags: a set of xmlParserOption used for parsing XML includes - * - * Implement the XInclude substitution on the XML document @doc - * - * Returns 0 if no substitution were done, -1 if some processing failed - * or the number of substitutions done. - */ -int -xmlXIncludeProcessFlags(xmlDocPtr doc, int flags) { - return xmlXIncludeProcessFlagsData(doc, flags, NULL); -} - -/** - * xmlXIncludeProcess: - * @doc: an XML document - * - * Implement the XInclude substitution on the XML document @doc - * - * Returns 0 if no substitution were done, -1 if some processing failed - * or the number of substitutions done. - */ -int -xmlXIncludeProcess(xmlDocPtr doc) { - return(xmlXIncludeProcessFlags(doc, 0)); -} - -/** - * xmlXIncludeProcessTreeFlags: - * @tree: a node in an XML document - * @flags: a set of xmlParserOption used for parsing XML includes - * - * Implement the XInclude substitution for the given subtree - * - * Returns 0 if no substitution were done, -1 if some processing failed - * or the number of substitutions done. - */ -int -xmlXIncludeProcessTreeFlags(xmlNodePtr tree, int flags) { - xmlXIncludeCtxtPtr ctxt; - int ret = 0; - - if ((tree == NULL) || (tree->doc == NULL)) - return(-1); - ctxt = xmlXIncludeNewContext(tree->doc); - if (ctxt == NULL) - return(-1); - ctxt->base = xmlNodeGetBase(tree->doc, tree); - xmlXIncludeSetFlags(ctxt, flags); - ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); - if ((ret >= 0) && (ctxt->nbErrors > 0)) - ret = -1; - - xmlXIncludeFreeContext(ctxt); - return(ret); -} - -/** - * xmlXIncludeProcessTree: - * @tree: a node in an XML document - * - * Implement the XInclude substitution for the given subtree - * - * Returns 0 if no substitution were done, -1 if some processing failed - * or the number of substitutions done. - */ -int -xmlXIncludeProcessTree(xmlNodePtr tree) { - return(xmlXIncludeProcessTreeFlags(tree, 0)); -} - -/** - * xmlXIncludeProcessNode: - * @ctxt: an existing XInclude context - * @node: a node in an XML document - * - * Implement the XInclude substitution for the given subtree reusing - * the informations and data coming from the given context. - * - * Returns 0 if no substitution were done, -1 if some processing failed - * or the number of substitutions done. - */ -int -xmlXIncludeProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { - int ret = 0; - - if ((node == NULL) || (node->doc == NULL) || (ctxt == NULL)) - return(-1); - ret = xmlXIncludeDoProcess(ctxt, node->doc, node); - if ((ret >= 0) && (ctxt->nbErrors > 0)) - ret = -1; - return(ret); -} - -#else /* !LIBXML_XINCLUDE_ENABLED */ -#endif -#define bottom_xinclude -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/xlink.c b/ThirdParty/libxml2/vtklibxml2/xlink.c deleted file mode 100644 index 1581a79682e..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xlink.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * xlink.c : implementation of the hyperlinks detection module - * This version supports both XML XLinks and HTML simple links - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_XPTR_ENABLED -#include <string.h> /* for memset() only */ -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#include "vtk_libxml2_zlib.h" - -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/valid.h> -#include <libxml/xlink.h> -#include <libxml/globals.h> - -#define XLINK_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xlink/namespace/") -#define XHTML_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xhtml/") - -/**************************************************************** - * * - * Default setting and related functions * - * * - ****************************************************************/ - -static xlinkHandlerPtr xlinkDefaultHandler = NULL; -static xlinkNodeDetectFunc xlinkDefaultDetect = NULL; - -/** - * xlinkGetDefaultHandler: - * - * Get the default xlink handler. - * - * Returns the current xlinkHandlerPtr value. - */ -xlinkHandlerPtr -xlinkGetDefaultHandler(void) { - return(xlinkDefaultHandler); -} - - -/** - * xlinkSetDefaultHandler: - * @handler: the new value for the xlink handler block - * - * Set the default xlink handlers - */ -void -xlinkSetDefaultHandler(xlinkHandlerPtr handler) { - xlinkDefaultHandler = handler; -} - -/** - * xlinkGetDefaultDetect: - * - * Get the default xlink detection routine - * - * Returns the current function or NULL; - */ -xlinkNodeDetectFunc -xlinkGetDefaultDetect (void) { - return(xlinkDefaultDetect); -} - -/** - * xlinkSetDefaultDetect: - * @func: pointer to the new detection routine. - * - * Set the default xlink detection routine - */ -void -xlinkSetDefaultDetect (xlinkNodeDetectFunc func) { - xlinkDefaultDetect = func; -} - -/**************************************************************** - * * - * The detection routines * - * * - ****************************************************************/ - - -/** - * xlinkIsLink: - * @doc: the document containing the node - * @node: the node pointer itself - * - * Check whether the given node carries the attributes needed - * to be a link element (or is one of the linking elements issued - * from the (X)HTML DtDs). - * This routine don't try to do full checking of the link validity - * but tries to detect and return the appropriate link type. - * - * Returns the xlinkType of the node (XLINK_TYPE_NONE if there is no - * link detected. - */ -xlinkType -xlinkIsLink (xmlDocPtr doc, xmlNodePtr node) { - xmlChar *type = NULL, *role = NULL; - xlinkType ret = XLINK_TYPE_NONE; - - if (node == NULL) return(XLINK_TYPE_NONE); - if (doc == NULL) doc = node->doc; - if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) { - /* - * This is an HTML document. - */ - } else if ((node->ns != NULL) && - (xmlStrEqual(node->ns->href, XHTML_NAMESPACE))) { - /* - * !!!! We really need an IS_XHTML_ELEMENT function from HTMLtree.h @@@ - */ - /* - * This is an XHTML element within an XML document - * Check whether it's one of the element able to carry links - * and in that case if it holds the attributes. - */ - } - - /* - * We don't prevent a-priori having XML Linking constructs on - * XHTML elements - */ - type = xmlGetNsProp(node, BAD_CAST"type", XLINK_NAMESPACE); - if (type != NULL) { - if (xmlStrEqual(type, BAD_CAST "simple")) { - ret = XLINK_TYPE_SIMPLE; - } if (xmlStrEqual(type, BAD_CAST "extended")) { - role = xmlGetNsProp(node, BAD_CAST "role", XLINK_NAMESPACE); - if (role != NULL) { - xmlNsPtr xlink; - xlink = xmlSearchNs(doc, node, XLINK_NAMESPACE); - if (xlink == NULL) { - /* Humm, fallback method */ - if (xmlStrEqual(role, BAD_CAST"xlink:external-linkset")) - ret = XLINK_TYPE_EXTENDED_SET; - } else { - xmlChar buf[200]; - snprintf((char *) buf, sizeof(buf), "%s:external-linkset", - (char *) xlink->prefix); - buf[sizeof(buf) - 1] = 0; - if (xmlStrEqual(role, buf)) - ret = XLINK_TYPE_EXTENDED_SET; - - } - - } - ret = XLINK_TYPE_EXTENDED; - } - } - - if (type != NULL) xmlFree(type); - if (role != NULL) xmlFree(role); - return(ret); -} -#endif /* LIBXML_XPTR_ENABLED */ -#define bottom_xlink -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/xmlIO.c b/ThirdParty/libxml2/vtklibxml2/xmlIO.c deleted file mode 100644 index 94c957004fd..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlIO.c +++ /dev/null @@ -1,3881 +0,0 @@ -/* - * xmlIO.c : implementation of the I/O interfaces used by the parser - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - * - * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif - - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#include "vtk_libxml2_zlib.h" - -#ifdef WIN32 -#include <windows.h> -#endif - -/*--------------------------------------------------------------------------*/ -/* - VTK MODIFICATION: When building on cygwin with -mwin32 we get _WIN32 - defined. If -mno-cygwin is not given then __CYGWIN__ is still - defined. This is the case when VTK builds in cygwin. The cygwin - API does not provide _wfopen or _wstat, and libxml2 does not seem to - have accounted for this upstream. We work around the unresolved - symbols by providing them here. We simply return failure so that - the routines below fall back to the single-width API provided by - cygwin. -*/ -#if defined(_WIN32) && defined(__CYGWIN__) -static FILE* _wfopen(const wchar_t* path, const wchar_t* mode) -{ - (void)path; - (void)mode; - return 0; -} -static int _wstat(const wchar_t* path, struct _stat* info) -{ - (void)path; - (void)info; - return -1; -} -#endif -/*--------------------------------------------------------------------------*/ - -/* Figure a portable way to know if a file is a directory. */ -#ifndef HAVE_STAT -# ifdef HAVE__STAT - /* MS C library seems to define stat and _stat. The definition - is identical. Still, mapping them to each other causes a warning. */ -# ifndef _MSC_VER -# define stat(x,y) _stat(x,y) -# endif -# define HAVE_STAT -# endif -#else -# ifdef HAVE__STAT -# if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) -# define stat _stat -# endif -# endif -#endif -#ifdef HAVE_STAT -# ifndef S_ISDIR -# ifdef _S_ISDIR -# define S_ISDIR(x) _S_ISDIR(x) -# else -# ifdef S_IFDIR -# ifndef S_IFMT -# ifdef _S_IFMT -# define S_IFMT _S_IFMT -# endif -# endif -# ifdef S_IFMT -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# endif -# endif -# endif -# endif -#endif - -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/xmlIO.h> -#include <libxml/uri.h> -#include <libxml/nanohttp.h> -#include <libxml/nanoftp.h> -#include <libxml/xmlerror.h> -#ifdef LIBXML_CATALOG_ENABLED -#include <libxml/catalog.h> -#endif -#include <libxml/globals.h> - -/* #define VERBOSE_FAILURE */ -/* #define DEBUG_EXTERNAL_ENTITIES */ -/* #define DEBUG_INPUT */ - -#ifdef DEBUG_INPUT -#define MINLEN 40 -#else -#define MINLEN 4000 -#endif - -/* - * Input I/O callback sets - */ -typedef struct _xmlInputCallback { - xmlInputMatchCallback matchcallback; - xmlInputOpenCallback opencallback; - xmlInputReadCallback readcallback; - xmlInputCloseCallback closecallback; -} xmlInputCallback; - -#define MAX_INPUT_CALLBACK 15 - -static xmlInputCallback xmlInputCallbackTable[MAX_INPUT_CALLBACK]; -static int xmlInputCallbackNr = 0; -static int xmlInputCallbackInitialized = 0; - -#ifdef LIBXML_OUTPUT_ENABLED -/* - * Output I/O callback sets - */ -typedef struct _xmlOutputCallback { - xmlOutputMatchCallback matchcallback; - xmlOutputOpenCallback opencallback; - xmlOutputWriteCallback writecallback; - xmlOutputCloseCallback closecallback; -} xmlOutputCallback; - -#define MAX_OUTPUT_CALLBACK 15 - -static xmlOutputCallback xmlOutputCallbackTable[MAX_OUTPUT_CALLBACK]; -static int xmlOutputCallbackNr = 0; -static int xmlOutputCallbackInitialized = 0; -#endif /* LIBXML_OUTPUT_ENABLED */ - -/************************************************************************ - * * - * Tree memory error handler * - * * - ************************************************************************/ - -static const char *IOerr[] = { - "Unknown IO error", /* UNKNOWN */ - "Permission denied", /* EACCES */ - "Resource temporarily unavailable",/* EAGAIN */ - "Bad file descriptor", /* EBADF */ - "Bad message", /* EBADMSG */ - "Resource busy", /* EBUSY */ - "Operation canceled", /* ECANCELED */ - "No child processes", /* ECHILD */ - "Resource deadlock avoided",/* EDEADLK */ - "Domain error", /* EDOM */ - "File exists", /* EEXIST */ - "Bad address", /* EFAULT */ - "File too large", /* EFBIG */ - "Operation in progress", /* EINPROGRESS */ - "Interrupted function call",/* EINTR */ - "Invalid argument", /* EINVAL */ - "Input/output error", /* EIO */ - "Is a directory", /* EISDIR */ - "Too many open files", /* EMFILE */ - "Too many links", /* EMLINK */ - "Inappropriate message buffer length",/* EMSGSIZE */ - "Filename too long", /* ENAMETOOLONG */ - "Too many open files in system",/* ENFILE */ - "No such device", /* ENODEV */ - "No such file or directory",/* ENOENT */ - "Exec format error", /* ENOEXEC */ - "No locks available", /* ENOLCK */ - "Not enough space", /* ENOMEM */ - "No space left on device", /* ENOSPC */ - "Function not implemented", /* ENOSYS */ - "Not a directory", /* ENOTDIR */ - "Directory not empty", /* ENOTEMPTY */ - "Not supported", /* ENOTSUP */ - "Inappropriate I/O control operation",/* ENOTTY */ - "No such device or address",/* ENXIO */ - "Operation not permitted", /* EPERM */ - "Broken pipe", /* EPIPE */ - "Result too large", /* ERANGE */ - "Read-only file system", /* EROFS */ - "Invalid seek", /* ESPIPE */ - "No such process", /* ESRCH */ - "Operation timed out", /* ETIMEDOUT */ - "Improper link", /* EXDEV */ - "Attempt to load network entity %s", /* XML_IO_NETWORK_ATTEMPT */ - "encoder error", /* XML_IO_ENCODER */ - "flush error", - "write error", - "no input", - "buffer full", - "loading error", - "not a socket", /* ENOTSOCK */ - "already connected", /* EISCONN */ - "connection refused", /* ECONNREFUSED */ - "unreachable network", /* ENETUNREACH */ - "adddress in use", /* EADDRINUSE */ - "already in use", /* EALREADY */ - "unknown address familly", /* EAFNOSUPPORT */ -}; - -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) -/** - * __xmlIOWin32UTF8ToWChar: - * @u8String: uft-8 string - * - * Convert a string from utf-8 to wchar (WINDOWS ONLY!) - */ -static wchar_t * -__xmlIOWin32UTF8ToWChar(const char *u8String) -{ - wchar_t *wString = NULL; - - if (u8String) { - int wLen = - MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8String, - -1, NULL, 0); - if (wLen) { - wString = xmlMalloc(wLen * sizeof(wchar_t)); - if (wString) { - if (MultiByteToWideChar - (CP_UTF8, 0, u8String, -1, wString, wLen) == 0) { - xmlFree(wString); - wString = NULL; - } - } - } - } - - return wString; -} -#endif - -/** - * xmlIOErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlIOErrMemory(const char *extra) -{ - __xmlSimpleError(XML_FROM_IO, XML_ERR_NO_MEMORY, NULL, NULL, extra); -} - -/** - * __xmlIOErr: - * @code: the error number - * @ - * @extra: extra informations - * - * Handle an I/O error - */ -void -__xmlIOErr(int domain, int code, const char *extra) -{ - unsigned int idx; - - if (code == 0) { -#ifdef HAVE_ERRNO_H - if (errno == 0) code = 0; -#ifdef EACCES - else if (errno == EACCES) code = XML_IO_EACCES; -#endif -#ifdef EAGAIN - else if (errno == EAGAIN) code = XML_IO_EAGAIN; -#endif -#ifdef EBADF - else if (errno == EBADF) code = XML_IO_EBADF; -#endif -#ifdef EBADMSG - else if (errno == EBADMSG) code = XML_IO_EBADMSG; -#endif -#ifdef EBUSY - else if (errno == EBUSY) code = XML_IO_EBUSY; -#endif -#ifdef ECANCELED - else if (errno == ECANCELED) code = XML_IO_ECANCELED; -#endif -#ifdef ECHILD - else if (errno == ECHILD) code = XML_IO_ECHILD; -#endif -#ifdef EDEADLK - else if (errno == EDEADLK) code = XML_IO_EDEADLK; -#endif -#ifdef EDOM - else if (errno == EDOM) code = XML_IO_EDOM; -#endif -#ifdef EEXIST - else if (errno == EEXIST) code = XML_IO_EEXIST; -#endif -#ifdef EFAULT - else if (errno == EFAULT) code = XML_IO_EFAULT; -#endif -#ifdef EFBIG - else if (errno == EFBIG) code = XML_IO_EFBIG; -#endif -#ifdef EINPROGRESS - else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS; -#endif -#ifdef EINTR - else if (errno == EINTR) code = XML_IO_EINTR; -#endif -#ifdef EINVAL - else if (errno == EINVAL) code = XML_IO_EINVAL; -#endif -#ifdef EIO - else if (errno == EIO) code = XML_IO_EIO; -#endif -#ifdef EISDIR - else if (errno == EISDIR) code = XML_IO_EISDIR; -#endif -#ifdef EMFILE - else if (errno == EMFILE) code = XML_IO_EMFILE; -#endif -#ifdef EMLINK - else if (errno == EMLINK) code = XML_IO_EMLINK; -#endif -#ifdef EMSGSIZE - else if (errno == EMSGSIZE) code = XML_IO_EMSGSIZE; -#endif -#ifdef ENAMETOOLONG - else if (errno == ENAMETOOLONG) code = XML_IO_ENAMETOOLONG; -#endif -#ifdef ENFILE - else if (errno == ENFILE) code = XML_IO_ENFILE; -#endif -#ifdef ENODEV - else if (errno == ENODEV) code = XML_IO_ENODEV; -#endif -#ifdef ENOENT - else if (errno == ENOENT) code = XML_IO_ENOENT; -#endif -#ifdef ENOEXEC - else if (errno == ENOEXEC) code = XML_IO_ENOEXEC; -#endif -#ifdef ENOLCK - else if (errno == ENOLCK) code = XML_IO_ENOLCK; -#endif -#ifdef ENOMEM - else if (errno == ENOMEM) code = XML_IO_ENOMEM; -#endif -#ifdef ENOSPC - else if (errno == ENOSPC) code = XML_IO_ENOSPC; -#endif -#ifdef ENOSYS - else if (errno == ENOSYS) code = XML_IO_ENOSYS; -#endif -#ifdef ENOTDIR - else if (errno == ENOTDIR) code = XML_IO_ENOTDIR; -#endif -#ifdef ENOTEMPTY - else if (errno == ENOTEMPTY) code = XML_IO_ENOTEMPTY; -#endif -#ifdef ENOTSUP - else if (errno == ENOTSUP) code = XML_IO_ENOTSUP; -#endif -#ifdef ENOTTY - else if (errno == ENOTTY) code = XML_IO_ENOTTY; -#endif -#ifdef ENXIO - else if (errno == ENXIO) code = XML_IO_ENXIO; -#endif -#ifdef EPERM - else if (errno == EPERM) code = XML_IO_EPERM; -#endif -#ifdef EPIPE - else if (errno == EPIPE) code = XML_IO_EPIPE; -#endif -#ifdef ERANGE - else if (errno == ERANGE) code = XML_IO_ERANGE; -#endif -#ifdef EROFS - else if (errno == EROFS) code = XML_IO_EROFS; -#endif -#ifdef ESPIPE - else if (errno == ESPIPE) code = XML_IO_ESPIPE; -#endif -#ifdef ESRCH - else if (errno == ESRCH) code = XML_IO_ESRCH; -#endif -#ifdef ETIMEDOUT - else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT; -#endif -#ifdef EXDEV - else if (errno == EXDEV) code = XML_IO_EXDEV; -#endif -#ifdef ENOTSOCK - else if (errno == ENOTSOCK) code = XML_IO_ENOTSOCK; -#endif -#ifdef EISCONN - else if (errno == EISCONN) code = XML_IO_EISCONN; -#endif -#ifdef ECONNREFUSED - else if (errno == ECONNREFUSED) code = XML_IO_ECONNREFUSED; -#endif -#ifdef ETIMEDOUT - else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT; -#endif -#ifdef ENETUNREACH - else if (errno == ENETUNREACH) code = XML_IO_ENETUNREACH; -#endif -#ifdef EADDRINUSE - else if (errno == EADDRINUSE) code = XML_IO_EADDRINUSE; -#endif -#ifdef EINPROGRESS - else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS; -#endif -#ifdef EALREADY - else if (errno == EALREADY) code = XML_IO_EALREADY; -#endif -#ifdef EAFNOSUPPORT - else if (errno == EAFNOSUPPORT) code = XML_IO_EAFNOSUPPORT; -#endif - else code = XML_IO_UNKNOWN; -#endif /* HAVE_ERRNO_H */ - } - idx = 0; - if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN; - if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0; - - __xmlSimpleError(domain, code, NULL, IOerr[idx], extra); -} - -/** - * xmlIOErr: - * @code: the error number - * @extra: extra informations - * - * Handle an I/O error - */ -static void -xmlIOErr(int code, const char *extra) -{ - __xmlIOErr(XML_FROM_IO, code, extra); -} - -/** - * __xmlLoaderErr: - * @ctx: the parser context - * @extra: extra informations - * - * Handle a resource access error - */ -void -__xmlLoaderErr(void *ctx, const char *msg, const char *filename) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - void *data = NULL; - xmlErrorLevel level = XML_ERR_ERROR; - - if ((ctxt != NULL) && (ctxt->disableSAX != 0) && - (ctxt->instate == XML_PARSER_EOF)) - return; - if ((ctxt != NULL) && (ctxt->sax != NULL)) { - if (ctxt->validate) { - channel = ctxt->sax->error; - level = XML_ERR_ERROR; - } else { - channel = ctxt->sax->warning; - level = XML_ERR_WARNING; - } - if (ctxt->sax->initialized == XML_SAX2_MAGIC) - schannel = ctxt->sax->serror; - data = ctxt->userData; - } - __xmlRaiseError(schannel, channel, data, ctxt, NULL, XML_FROM_IO, - XML_IO_LOAD_ERROR, level, NULL, 0, - filename, NULL, NULL, 0, 0, - msg, filename); - -} - -/************************************************************************ - * * - * Tree memory error handler * - * * - ************************************************************************/ -/** - * xmlNormalizeWindowsPath: - * @path: the input file path - * - * This function is obsolete. Please see xmlURIFromPath in uri.c for - * a better solution. - * - * Returns a canonicalized version of the path - */ -xmlChar * -xmlNormalizeWindowsPath(const xmlChar *path) -{ - return xmlCanonicPath(path); -} - -/** - * xmlCleanupInputCallbacks: - * - * clears the entire input callback table. this includes the - * compiled-in I/O. - */ -void -xmlCleanupInputCallbacks(void) -{ - int i; - - if (!xmlInputCallbackInitialized) - return; - - for (i = xmlInputCallbackNr - 1; i >= 0; i--) { - xmlInputCallbackTable[i].matchcallback = NULL; - xmlInputCallbackTable[i].opencallback = NULL; - xmlInputCallbackTable[i].readcallback = NULL; - xmlInputCallbackTable[i].closecallback = NULL; - } - - xmlInputCallbackNr = 0; - xmlInputCallbackInitialized = 0; -} - -/** - * xmlPopInputCallbacks: - * - * Clear the top input callback from the input stack. this includes the - * compiled-in I/O. - * - * Returns the number of input callback registered or -1 in case of error. - */ -int -xmlPopInputCallbacks(void) -{ - if (!xmlInputCallbackInitialized) - return(-1); - - if (xmlInputCallbackNr <= 0) - return(-1); - - xmlInputCallbackNr--; - xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = NULL; - xmlInputCallbackTable[xmlInputCallbackNr].opencallback = NULL; - xmlInputCallbackTable[xmlInputCallbackNr].readcallback = NULL; - xmlInputCallbackTable[xmlInputCallbackNr].closecallback = NULL; - - return(xmlInputCallbackNr); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlCleanupOutputCallbacks: - * - * clears the entire output callback table. this includes the - * compiled-in I/O callbacks. - */ -void -xmlCleanupOutputCallbacks(void) -{ - int i; - - if (!xmlOutputCallbackInitialized) - return; - - for (i = xmlOutputCallbackNr - 1; i >= 0; i--) { - xmlOutputCallbackTable[i].matchcallback = NULL; - xmlOutputCallbackTable[i].opencallback = NULL; - xmlOutputCallbackTable[i].writecallback = NULL; - xmlOutputCallbackTable[i].closecallback = NULL; - } - - xmlOutputCallbackNr = 0; - xmlOutputCallbackInitialized = 0; -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/************************************************************************ - * * - * Standard I/O for file accesses * - * * - ************************************************************************/ - -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - -/** - * xmlWrapOpenUtf8: - * @path: the path in utf-8 encoding - * @mode: type of access (0 - read, 1 - write) - * - * function opens the file specified by @path - * - */ -static FILE* -xmlWrapOpenUtf8(const char *path,int mode) -{ - FILE *fd = NULL; - wchar_t *wPath; - - wPath = __xmlIOWin32UTF8ToWChar(path); - if(wPath) - { - fd = _wfopen(wPath, mode ? L"wb" : L"rb"); - xmlFree(wPath); - } - /* maybe path in native encoding */ - if(fd == NULL) - fd = fopen(path, mode ? "wb" : "rb"); - - return fd; -} - -/** - * xmlWrapStatUtf8: - * @path: the path in utf-8 encoding - * @info: structure that stores results - * - * function obtains information about the file or directory - * - */ -static int -xmlWrapStatUtf8(const char *path,struct stat *info) -{ -#ifdef HAVE_STAT - int retval = -1; - wchar_t *wPath; - - wPath = __xmlIOWin32UTF8ToWChar(path); - if (wPath) - { - retval = _wstat(wPath,info); - xmlFree(wPath); - } - /* maybe path in native encoding */ - if(retval < 0) - retval = stat(path,info); - return retval; -#else - return -1; -#endif -} - -/** - * xmlWrapOpenNative: - * @path: the path - * @mode: type of access (0 - read, 1 - write) - * - * function opens the file specified by @path - * - */ -static FILE* -xmlWrapOpenNative(const char *path,int mode) -{ - return fopen(path,mode ? "wb" : "rb"); -} - -/** - * xmlWrapStatNative: - * @path: the path - * @info: structure that stores results - * - * function obtains information about the file or directory - * - */ -static int -xmlWrapStatNative(const char *path,struct stat *info) -{ -#ifdef HAVE_STAT - return stat(path,info); -#else - return -1; -#endif -} - -typedef int (* xmlWrapStatFunc) (const char *f, struct stat *s); -static xmlWrapStatFunc xmlWrapStat = xmlWrapStatNative; -typedef FILE* (* xmlWrapOpenFunc)(const char *f,int mode); -static xmlWrapOpenFunc xmlWrapOpen = xmlWrapOpenNative; - -/** - * xmlInitPlatformSpecificIo: - * - * Initialize platform specific features. - */ -static void -xmlInitPlatformSpecificIo(void) -{ - static int xmlPlatformIoInitialized = 0; - OSVERSIONINFO osvi; - - if(xmlPlatformIoInitialized) - return; - - osvi.dwOSVersionInfoSize = sizeof(osvi); - - if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) { - xmlWrapStat = xmlWrapStatUtf8; - xmlWrapOpen = xmlWrapOpenUtf8; - } else { - xmlWrapStat = xmlWrapStatNative; - xmlWrapOpen = xmlWrapOpenNative; - } - - xmlPlatformIoInitialized = 1; - return; -} - -#endif - -/** - * xmlCheckFilename: - * @path: the path to check - * - * function checks to see if @path is a valid source - * (file, socket...) for XML. - * - * if stat is not available on the target machine, - * returns 1. if stat fails, returns 0 (if calling - * stat on the filename fails, it can't be right). - * if stat succeeds and the file is a directory, - * returns 2. otherwise returns 1. - */ - -int -xmlCheckFilename (const char *path) -{ -#ifdef HAVE_STAT - struct stat stat_buffer; -#endif - if (path == NULL) - return(0); - -#ifdef HAVE_STAT -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - if (xmlWrapStat(path, &stat_buffer) == -1) - return 0; -#else - if (stat(path, &stat_buffer) == -1) - return 0; -#endif -#ifdef S_ISDIR - if (S_ISDIR(stat_buffer.st_mode)) - return 2; -#endif -#endif /* HAVE_STAT */ - return 1; -} - -static int -xmlNop(void) { - return(0); -} - -/** - * xmlFdRead: - * @context: the I/O context - * @buffer: where to drop data - * @len: number of bytes to read - * - * Read @len bytes to @buffer from the I/O channel. - * - * Returns the number of bytes written - */ -static int -xmlFdRead (void * context, char * buffer, int len) { - int ret; - - ret = read((int) (long) context, &buffer[0], len); - if (ret < 0) xmlIOErr(0, "read()"); - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlFdWrite: - * @context: the I/O context - * @buffer: where to get data - * @len: number of bytes to write - * - * Write @len bytes from @buffer to the I/O channel. - * - * Returns the number of bytes written - */ -static int -xmlFdWrite (void * context, const char * buffer, int len) { - int ret = 0; - - if (len > 0) { - ret = write((int) (long) context, &buffer[0], len); - if (ret < 0) xmlIOErr(0, "write()"); - } - return(ret); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlFdClose: - * @context: the I/O context - * - * Close an I/O channel - * - * Returns 0 in case of success and error code otherwise - */ -static int -xmlFdClose (void * context) { - int ret; - ret = close((int) (long) context); - if (ret < 0) xmlIOErr(0, "close()"); - return(ret); -} - -/** - * xmlFileMatch: - * @filename: the URI for matching - * - * input from FILE * - * - * Returns 1 if matches, 0 otherwise - */ -int -xmlFileMatch (const char *filename ATTRIBUTE_UNUSED) { - return(1); -} - -/** - * xmlFileOpen_real: - * @filename: the URI for matching - * - * input from FILE *, supports compressed input - * if @filename is " " then the standard input is used - * - * Returns an I/O context or NULL in case of error - */ -static void * -xmlFileOpen_real (const char *filename) { - const char *path = NULL; - FILE *fd; - - if (filename == NULL) - return(NULL); - - if (!strcmp(filename, "-")) { - fd = stdin; - return((void *) fd); - } - - if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &filename[17]; -#else - path = &filename[16]; -#endif - else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &filename[8]; -#else - path = &filename[7]; -#endif - } else - path = filename; - - if (path == NULL) - return(NULL); - if (!xmlCheckFilename(path)) - return(NULL); - -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - fd = xmlWrapOpen(path, 0); -#else - fd = fopen(path, "r"); -#endif /* WIN32 */ - if (fd == NULL) xmlIOErr(0, path); - return((void *) fd); -} - -/** - * xmlFileOpen: - * @filename: the URI for matching - * - * Wrapper around xmlFileOpen_real that try it with an unescaped - * version of @filename, if this fails fallback to @filename - * - * Returns a handler or NULL in case or failure - */ -void * -xmlFileOpen (const char *filename) { - char *unescaped; - void *retval; - - unescaped = xmlURIUnescapeString(filename, 0, NULL); - if (unescaped != NULL) { - retval = xmlFileOpen_real(unescaped); - xmlFree(unescaped); - } else { - retval = xmlFileOpen_real(filename); - } - return retval; -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlFileOpenW: - * @filename: the URI for matching - * - * output to from FILE *, - * if @filename is "-" then the standard output is used - * - * Returns an I/O context or NULL in case of error - */ -static void * -xmlFileOpenW (const char *filename) { - const char *path = NULL; - FILE *fd; - - if (!strcmp(filename, "-")) { - fd = stdout; - return((void *) fd); - } - - if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &filename[17]; -#else - path = &filename[16]; -#endif - else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &filename[8]; -#else - path = &filename[7]; -#endif - } else - path = filename; - - if (path == NULL) - return(NULL); - -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - fd = xmlWrapOpen(path, 1); -#else - fd = fopen(path, "wb"); -#endif /* WIN32 */ - - if (fd == NULL) xmlIOErr(0, path); - return((void *) fd); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlFileRead: - * @context: the I/O context - * @buffer: where to drop data - * @len: number of bytes to write - * - * Read @len bytes to @buffer from the I/O channel. - * - * Returns the number of bytes written or < 0 in case of failure - */ -int -xmlFileRead (void * context, char * buffer, int len) { - int ret; - if ((context == NULL) || (buffer == NULL)) - return(-1); - ret = fread(&buffer[0], 1, len, (FILE *) context); - if (ret < 0) xmlIOErr(0, "fread()"); - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlFileWrite: - * @context: the I/O context - * @buffer: where to drop data - * @len: number of bytes to write - * - * Write @len bytes from @buffer to the I/O channel. - * - * Returns the number of bytes written - */ -static int -xmlFileWrite (void * context, const char * buffer, int len) { - int items; - - if ((context == NULL) || (buffer == NULL)) - return(-1); - items = fwrite(&buffer[0], len, 1, (FILE *) context); - if ((items == 0) && (ferror((FILE *) context))) { - xmlIOErr(0, "fwrite()"); - return(-1); - } - return(items * len); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlFileClose: - * @context: the I/O context - * - * Close an I/O channel - * - * Returns 0 or -1 in case of error - */ -int -xmlFileClose (void * context) { - FILE *fil; - int ret; - - if (context == NULL) - return(-1); - fil = (FILE *) context; - if ((fil == stdout) || (fil == stderr)) { - ret = fflush(fil); - if (ret < 0) - xmlIOErr(0, "fflush()"); - return(0); - } - if (fil == stdin) - return(0); - ret = ( fclose((FILE *) context) == EOF ) ? -1 : 0; - if (ret < 0) - xmlIOErr(0, "fclose()"); - return(ret); -} - -/** - * xmlFileFlush: - * @context: the I/O context - * - * Flush an I/O channel - */ -static int -xmlFileFlush (void * context) { - int ret; - - if (context == NULL) - return(-1); - ret = ( fflush((FILE *) context) == EOF ) ? -1 : 0; - if (ret < 0) - xmlIOErr(0, "fflush()"); - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlBufferWrite: - * @context: the xmlBuffer - * @buffer: the data to write - * @len: number of bytes to write - * - * Write @len bytes from @buffer to the xml buffer - * - * Returns the number of bytes written - */ -static int -xmlBufferWrite (void * context, const char * buffer, int len) { - int ret; - - ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len); - if (ret != 0) - return(-1); - return(len); -} -#endif - -#ifdef HAVE_ZLIB_H -/************************************************************************ - * * - * I/O for compressed file accesses * - * * - ************************************************************************/ -/** - * xmlGzfileMatch: - * @filename: the URI for matching - * - * input from compressed file test - * - * Returns 1 if matches, 0 otherwise - */ -static int -xmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) { - return(1); -} - -/** - * xmlGzfileOpen_real: - * @filename: the URI for matching - * - * input from compressed file open - * if @filename is " " then the standard input is used - * - * Returns an I/O context or NULL in case of error - */ -static void * -xmlGzfileOpen_real (const char *filename) { - const char *path = NULL; - gzFile fd; - - if (!strcmp(filename, "-")) { - fd = gzdopen(dup(0), "rb"); - return((void *) fd); - } - - if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &filename[17]; -#else - path = &filename[16]; -#endif - else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &filename[8]; -#else - path = &filename[7]; -#endif - } else - path = filename; - - if (path == NULL) - return(NULL); - if (!xmlCheckFilename(path)) - return(NULL); - - fd = gzopen(path, "rb"); - return((void *) fd); -} - -/** - * xmlGzfileOpen: - * @filename: the URI for matching - * - * Wrapper around xmlGzfileOpen if the open fais, it will - * try to unescape @filename - */ -static void * -xmlGzfileOpen (const char *filename) { - char *unescaped; - void *retval; - - retval = xmlGzfileOpen_real(filename); - if (retval == NULL) { - unescaped = xmlURIUnescapeString(filename, 0, NULL); - if (unescaped != NULL) { - retval = xmlGzfileOpen_real(unescaped); - } - xmlFree(unescaped); - } - return retval; -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlGzfileOpenW: - * @filename: the URI for matching - * @compression: the compression factor (0 - 9 included) - * - * input from compressed file open - * if @filename is " " then the standard input is used - * - * Returns an I/O context or NULL in case of error - */ -static void * -xmlGzfileOpenW (const char *filename, int compression) { - const char *path = NULL; - char mode[15]; - gzFile fd; - - snprintf(mode, sizeof(mode), "wb%d", compression); - if (!strcmp(filename, "-")) { - fd = gzdopen(dup(1), mode); - return((void *) fd); - } - - if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &filename[17]; -#else - path = &filename[16]; -#endif - else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &filename[8]; -#else - path = &filename[7]; -#endif - } else - path = filename; - - if (path == NULL) - return(NULL); - - fd = gzopen(path, mode); - return((void *) fd); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlGzfileRead: - * @context: the I/O context - * @buffer: where to drop data - * @len: number of bytes to write - * - * Read @len bytes to @buffer from the compressed I/O channel. - * - * Returns the number of bytes written - */ -static int -xmlGzfileRead (void * context, char * buffer, int len) { - int ret; - - ret = gzread((gzFile) context, &buffer[0], len); - if (ret < 0) xmlIOErr(0, "gzread()"); - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlGzfileWrite: - * @context: the I/O context - * @buffer: where to drop data - * @len: number of bytes to write - * - * Write @len bytes from @buffer to the compressed I/O channel. - * - * Returns the number of bytes written - */ -static int -xmlGzfileWrite (void * context, const char * buffer, int len) { - int ret; - - ret = gzwrite((gzFile) context, (char *) &buffer[0], len); - if (ret < 0) xmlIOErr(0, "gzwrite()"); - return(ret); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlGzfileClose: - * @context: the I/O context - * - * Close a compressed I/O channel - */ -static int -xmlGzfileClose (void * context) { - int ret; - - ret = (gzclose((gzFile) context) == Z_OK ) ? 0 : -1; - if (ret < 0) xmlIOErr(0, "gzclose()"); - return(ret); -} -#endif /* HAVE_ZLIB_H */ - -#ifdef LIBXML_HTTP_ENABLED -/************************************************************************ - * * - * I/O for HTTP file accesses * - * * - ************************************************************************/ - -#ifdef LIBXML_OUTPUT_ENABLED -typedef struct xmlIOHTTPWriteCtxt_ -{ - int compression; - - char * uri; - - void * doc_buff; - -} xmlIOHTTPWriteCtxt, *xmlIOHTTPWriteCtxtPtr; - -#ifdef HAVE_ZLIB_H - -#define DFLT_WBITS ( -15 ) -#define DFLT_MEM_LVL ( 8 ) -#define GZ_MAGIC1 ( 0x1f ) -#define GZ_MAGIC2 ( 0x8b ) -#define LXML_ZLIB_OS_CODE ( 0x03 ) -#define INIT_HTTP_BUFF_SIZE ( 32768 ) -#define DFLT_ZLIB_RATIO ( 5 ) - -/* -** Data structure and functions to work with sending compressed data -** via HTTP. -*/ - -typedef struct xmlZMemBuff_ -{ - unsigned long size; - unsigned long crc; - - unsigned char * zbuff; - z_stream zctrl; - -} xmlZMemBuff, *xmlZMemBuffPtr; - -/** - * append_reverse_ulong - * @buff: Compressed memory buffer - * @data: Unsigned long to append - * - * Append a unsigned long in reverse byte order to the end of the - * memory buffer. - */ -static void -append_reverse_ulong( xmlZMemBuff * buff, unsigned long data ) { - - int idx; - - if ( buff == NULL ) - return; - - /* - ** This is plagiarized from putLong in gzio.c (zlib source) where - ** the number "4" is hardcoded. If zlib is ever patched to - ** support 64 bit file sizes, this code would need to be patched - ** as well. - */ - - for ( idx = 0; idx < 4; idx++ ) { - *buff->zctrl.next_out = ( data & 0xff ); - data >>= 8; - buff->zctrl.next_out++; - } - - return; -} - -/** - * - * xmlFreeZMemBuff - * @buff: The memory buffer context to clear - * - * Release all the resources associated with the compressed memory buffer. - */ -static void -xmlFreeZMemBuff( xmlZMemBuffPtr buff ) { - -#ifdef DEBUG_HTTP - int z_err; -#endif - - if ( buff == NULL ) - return; - - xmlFree( buff->zbuff ); -#ifdef DEBUG_HTTP - z_err = deflateEnd( &buff->zctrl ); - if ( z_err != Z_OK ) - xmlGenericError( xmlGenericErrorContext, - "xmlFreeZMemBuff: Error releasing zlib context: %d\n", - z_err ); -#else - deflateEnd( &buff->zctrl ); -#endif - - xmlFree( buff ); - return; -} - -/** - * xmlCreateZMemBuff - *@compression: Compression value to use - * - * Create a memory buffer to hold the compressed XML document. The - * compressed document in memory will end up being identical to what - * would be created if gzopen/gzwrite/gzclose were being used to - * write the document to disk. The code for the header/trailer data to - * the compression is plagiarized from the zlib source files. - */ -static void * -xmlCreateZMemBuff( int compression ) { - - int z_err; - int hdr_lgth; - xmlZMemBuffPtr buff = NULL; - - if ( ( compression < 1 ) || ( compression > 9 ) ) - return ( NULL ); - - /* Create the control and data areas */ - - buff = xmlMalloc( sizeof( xmlZMemBuff ) ); - if ( buff == NULL ) { - xmlIOErrMemory("creating buffer context"); - return ( NULL ); - } - - (void)memset( buff, 0, sizeof( xmlZMemBuff ) ); - buff->size = INIT_HTTP_BUFF_SIZE; - buff->zbuff = xmlMalloc( buff->size ); - if ( buff->zbuff == NULL ) { - xmlFreeZMemBuff( buff ); - xmlIOErrMemory("creating buffer"); - return ( NULL ); - } - - z_err = deflateInit2( &buff->zctrl, compression, Z_DEFLATED, - DFLT_WBITS, DFLT_MEM_LVL, Z_DEFAULT_STRATEGY ); - if ( z_err != Z_OK ) { - xmlChar msg[500]; - xmlFreeZMemBuff( buff ); - buff = NULL; - xmlStrPrintf(msg, 500, - (const xmlChar *) "xmlCreateZMemBuff: %s %d\n", - "Error initializing compression context. ZLIB error:", - z_err ); - xmlIOErr(XML_IO_WRITE, (const char *) msg); - return ( NULL ); - } - - /* Set the header data. The CRC will be needed for the trailer */ - buff->crc = crc32( 0L, NULL, 0 ); - hdr_lgth = snprintf( (char *)buff->zbuff, buff->size, - "%c%c%c%c%c%c%c%c%c%c", - GZ_MAGIC1, GZ_MAGIC2, Z_DEFLATED, - 0, 0, 0, 0, 0, 0, LXML_ZLIB_OS_CODE ); - buff->zctrl.next_out = buff->zbuff + hdr_lgth; - buff->zctrl.avail_out = buff->size - hdr_lgth; - - return ( buff ); -} - -/** - * xmlZMemBuffExtend - * @buff: Buffer used to compress and consolidate data. - * @ext_amt: Number of bytes to extend the buffer. - * - * Extend the internal buffer used to store the compressed data by the - * specified amount. - * - * Returns 0 on success or -1 on failure to extend the buffer. On failure - * the original buffer still exists at the original size. - */ -static int -xmlZMemBuffExtend( xmlZMemBuffPtr buff, size_t ext_amt ) { - - int rc = -1; - size_t new_size; - size_t cur_used; - - unsigned char * tmp_ptr = NULL; - - if ( buff == NULL ) - return ( -1 ); - - else if ( ext_amt == 0 ) - return ( 0 ); - - cur_used = buff->zctrl.next_out - buff->zbuff; - new_size = buff->size + ext_amt; - -#ifdef DEBUG_HTTP - if ( cur_used > new_size ) - xmlGenericError( xmlGenericErrorContext, - "xmlZMemBuffExtend: %s\n%s %d bytes.\n", - "Buffer overwrite detected during compressed memory", - "buffer extension. Overflowed by", - (cur_used - new_size ) ); -#endif - - tmp_ptr = xmlRealloc( buff->zbuff, new_size ); - if ( tmp_ptr != NULL ) { - rc = 0; - buff->size = new_size; - buff->zbuff = tmp_ptr; - buff->zctrl.next_out = tmp_ptr + cur_used; - buff->zctrl.avail_out = new_size - cur_used; - } - else { - xmlChar msg[500]; - xmlStrPrintf(msg, 500, - (const xmlChar *) "xmlZMemBuffExtend: %s %lu bytes.\n", - "Allocation failure extending output buffer to", - new_size ); - xmlIOErr(XML_IO_WRITE, (const char *) msg); - } - - return ( rc ); -} - -/** - * xmlZMemBuffAppend - * @buff: Buffer used to compress and consolidate data - * @src: Uncompressed source content to append to buffer - * @len: Length of source data to append to buffer - * - * Compress and append data to the internal buffer. The data buffer - * will be expanded if needed to store the additional data. - * - * Returns the number of bytes appended to the buffer or -1 on error. - */ -static int -xmlZMemBuffAppend( xmlZMemBuffPtr buff, const char * src, int len ) { - - int z_err; - size_t min_accept; - - if ( ( buff == NULL ) || ( src == NULL ) ) - return ( -1 ); - - buff->zctrl.avail_in = len; - buff->zctrl.next_in = (unsigned char *)src; - while ( buff->zctrl.avail_in > 0 ) { - /* - ** Extend the buffer prior to deflate call if a reasonable amount - ** of output buffer space is not available. - */ - min_accept = buff->zctrl.avail_in / DFLT_ZLIB_RATIO; - if ( buff->zctrl.avail_out <= min_accept ) { - if ( xmlZMemBuffExtend( buff, buff->size ) == -1 ) - return ( -1 ); - } - - z_err = deflate( &buff->zctrl, Z_NO_FLUSH ); - if ( z_err != Z_OK ) { - xmlChar msg[500]; - xmlStrPrintf(msg, 500, - (const xmlChar *) "xmlZMemBuffAppend: %s %d %s - %d", - "Compression error while appending", - len, "bytes to buffer. ZLIB error", z_err ); - xmlIOErr(XML_IO_WRITE, (const char *) msg); - return ( -1 ); - } - } - - buff->crc = crc32( buff->crc, (unsigned char *)src, len ); - - return ( len ); -} - -/** - * xmlZMemBuffGetContent - * @buff: Compressed memory content buffer - * @data_ref: Pointer reference to point to compressed content - * - * Flushes the compression buffers, appends gzip file trailers and - * returns the compressed content and length of the compressed data. - * NOTE: The gzip trailer code here is plagiarized from zlib source. - * - * Returns the length of the compressed data or -1 on error. - */ -static int -xmlZMemBuffGetContent( xmlZMemBuffPtr buff, char ** data_ref ) { - - int zlgth = -1; - int z_err; - - if ( ( buff == NULL ) || ( data_ref == NULL ) ) - return ( -1 ); - - /* Need to loop until compression output buffers are flushed */ - - do - { - z_err = deflate( &buff->zctrl, Z_FINISH ); - if ( z_err == Z_OK ) { - /* In this case Z_OK means more buffer space needed */ - - if ( xmlZMemBuffExtend( buff, buff->size ) == -1 ) - return ( -1 ); - } - } - while ( z_err == Z_OK ); - - /* If the compression state is not Z_STREAM_END, some error occurred */ - - if ( z_err == Z_STREAM_END ) { - - /* Need to append the gzip data trailer */ - - if ( buff->zctrl.avail_out < ( 2 * sizeof( unsigned long ) ) ) { - if ( xmlZMemBuffExtend(buff, (2 * sizeof(unsigned long))) == -1 ) - return ( -1 ); - } - - /* - ** For whatever reason, the CRC and length data are pushed out - ** in reverse byte order. So a memcpy can't be used here. - */ - - append_reverse_ulong( buff, buff->crc ); - append_reverse_ulong( buff, buff->zctrl.total_in ); - - zlgth = buff->zctrl.next_out - buff->zbuff; - *data_ref = (char *)buff->zbuff; - } - - else { - xmlChar msg[500]; - xmlStrPrintf(msg, 500, - (const xmlChar *) "xmlZMemBuffGetContent: %s - %d\n", - "Error flushing zlib buffers. Error code", z_err ); - xmlIOErr(XML_IO_WRITE, (const char *) msg); - } - - return ( zlgth ); -} -#endif /* LIBXML_OUTPUT_ENABLED */ -#endif /* HAVE_ZLIB_H */ - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlFreeHTTPWriteCtxt - * @ctxt: Context to cleanup - * - * Free allocated memory and reclaim system resources. - * - * No return value. - */ -static void -xmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt ) -{ - if ( ctxt->uri != NULL ) - xmlFree( ctxt->uri ); - - if ( ctxt->doc_buff != NULL ) { - -#ifdef HAVE_ZLIB_H - if ( ctxt->compression > 0 ) { - xmlFreeZMemBuff( ctxt->doc_buff ); - } - else -#endif - { - xmlOutputBufferClose( ctxt->doc_buff ); - } - } - - xmlFree( ctxt ); - return; -} -#endif /* LIBXML_OUTPUT_ENABLED */ - - -/** - * xmlIOHTTPMatch: - * @filename: the URI for matching - * - * check if the URI matches an HTTP one - * - * Returns 1 if matches, 0 otherwise - */ -int -xmlIOHTTPMatch (const char *filename) { - if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "http://", 7)) - return(1); - return(0); -} - -/** - * xmlIOHTTPOpen: - * @filename: the URI for matching - * - * open an HTTP I/O channel - * - * Returns an I/O context or NULL in case of error - */ -void * -xmlIOHTTPOpen (const char *filename) { - return(xmlNanoHTTPOpen(filename, NULL)); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlIOHTTPOpenW: - * @post_uri: The destination URI for the document - * @compression: The compression desired for the document. - * - * Open a temporary buffer to collect the document for a subsequent HTTP POST - * request. Non-static as is called from the output buffer creation routine. - * - * Returns an I/O context or NULL in case of error. - */ - -void * -xmlIOHTTPOpenW(const char *post_uri, int compression) -{ - - xmlIOHTTPWriteCtxtPtr ctxt = NULL; - - if (post_uri == NULL) - return (NULL); - - ctxt = xmlMalloc(sizeof(xmlIOHTTPWriteCtxt)); - if (ctxt == NULL) { - xmlIOErrMemory("creating HTTP output context"); - return (NULL); - } - - (void) memset(ctxt, 0, sizeof(xmlIOHTTPWriteCtxt)); - - ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri); - if (ctxt->uri == NULL) { - xmlIOErrMemory("copying URI"); - xmlFreeHTTPWriteCtxt(ctxt); - return (NULL); - } - - /* - * ** Since the document length is required for an HTTP post, - * ** need to put the document into a buffer. A memory buffer - * ** is being used to avoid pushing the data to disk and back. - */ - -#ifdef HAVE_ZLIB_H - if ((compression > 0) && (compression <= 9)) { - - ctxt->compression = compression; - ctxt->doc_buff = xmlCreateZMemBuff(compression); - } else -#endif - { - /* Any character conversions should have been done before this */ - - ctxt->doc_buff = xmlAllocOutputBuffer(NULL); - } - - if (ctxt->doc_buff == NULL) { - xmlFreeHTTPWriteCtxt(ctxt); - ctxt = NULL; - } - - return (ctxt); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlIOHTTPDfltOpenW - * @post_uri: The destination URI for this document. - * - * Calls xmlIOHTTPOpenW with no compression to set up for a subsequent - * HTTP post command. This function should generally not be used as - * the open callback is short circuited in xmlOutputBufferCreateFile. - * - * Returns a pointer to the new IO context. - */ -static void * -xmlIOHTTPDfltOpenW( const char * post_uri ) { - return ( xmlIOHTTPOpenW( post_uri, 0 ) ); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlIOHTTPRead: - * @context: the I/O context - * @buffer: where to drop data - * @len: number of bytes to write - * - * Read @len bytes to @buffer from the I/O channel. - * - * Returns the number of bytes written - */ -int -xmlIOHTTPRead(void * context, char * buffer, int len) { - if ((buffer == NULL) || (len < 0)) return(-1); - return(xmlNanoHTTPRead(context, &buffer[0], len)); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlIOHTTPWrite - * @context: previously opened writing context - * @buffer: data to output to temporary buffer - * @len: bytes to output - * - * Collect data from memory buffer into a temporary file for later - * processing. - * - * Returns number of bytes written. - */ - -static int -xmlIOHTTPWrite( void * context, const char * buffer, int len ) { - - xmlIOHTTPWriteCtxtPtr ctxt = context; - - if ( ( ctxt == NULL ) || ( ctxt->doc_buff == NULL ) || ( buffer == NULL ) ) - return ( -1 ); - - if ( len > 0 ) { - - /* Use gzwrite or fwrite as previously setup in the open call */ - -#ifdef HAVE_ZLIB_H - if ( ctxt->compression > 0 ) - len = xmlZMemBuffAppend( ctxt->doc_buff, buffer, len ); - - else -#endif - len = xmlOutputBufferWrite( ctxt->doc_buff, len, buffer ); - - if ( len < 0 ) { - xmlChar msg[500]; - xmlStrPrintf(msg, 500, - (const xmlChar *) "xmlIOHTTPWrite: %s\n%s '%s'.\n", - "Error appending to internal buffer.", - "Error sending document to URI", - ctxt->uri ); - xmlIOErr(XML_IO_WRITE, (const char *) msg); - } - } - - return ( len ); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - - -/** - * xmlIOHTTPClose: - * @context: the I/O context - * - * Close an HTTP I/O channel - * - * Returns 0 - */ -int -xmlIOHTTPClose (void * context) { - xmlNanoHTTPClose(context); - return 0; -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlIOHTTCloseWrite - * @context: The I/O context - * @http_mthd: The HTTP method to be used when sending the data - * - * Close the transmit HTTP I/O channel and actually send the data. - */ -static int -xmlIOHTTPCloseWrite( void * context, const char * http_mthd ) { - - int close_rc = -1; - int http_rtn = 0; - int content_lgth = 0; - xmlIOHTTPWriteCtxtPtr ctxt = context; - - char * http_content = NULL; - char * content_encoding = NULL; - char * content_type = (char *) "text/xml"; - void * http_ctxt = NULL; - - if ( ( ctxt == NULL ) || ( http_mthd == NULL ) ) - return ( -1 ); - - /* Retrieve the content from the appropriate buffer */ - -#ifdef HAVE_ZLIB_H - - if ( ctxt->compression > 0 ) { - content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content ); - content_encoding = (char *) "Content-Encoding: gzip"; - } - else -#endif - { - /* Pull the data out of the memory output buffer */ - - xmlOutputBufferPtr dctxt = ctxt->doc_buff; - http_content = (char *)dctxt->buffer->content; - content_lgth = dctxt->buffer->use; - } - - if ( http_content == NULL ) { - xmlChar msg[500]; - xmlStrPrintf(msg, 500, - (const xmlChar *) "xmlIOHTTPCloseWrite: %s '%s' %s '%s'.\n", - "Error retrieving content.\nUnable to", - http_mthd, "data to URI", ctxt->uri ); - xmlIOErr(XML_IO_WRITE, (const char *) msg); - } - - else { - - http_ctxt = xmlNanoHTTPMethod( ctxt->uri, http_mthd, http_content, - &content_type, content_encoding, - content_lgth ); - - if ( http_ctxt != NULL ) { -#ifdef DEBUG_HTTP - /* If testing/debugging - dump reply with request content */ - - FILE * tst_file = NULL; - char buffer[ 4096 ]; - char * dump_name = NULL; - int avail; - - xmlGenericError( xmlGenericErrorContext, - "xmlNanoHTTPCloseWrite: HTTP %s to\n%s returned %d.\n", - http_mthd, ctxt->uri, - xmlNanoHTTPReturnCode( http_ctxt ) ); - - /* - ** Since either content or reply may be gzipped, - ** dump them to separate files instead of the - ** standard error context. - */ - - dump_name = tempnam( NULL, "lxml" ); - if ( dump_name != NULL ) { - (void)snprintf( buffer, sizeof(buffer), "%s.content", dump_name ); - - tst_file = fopen( buffer, "wb" ); - if ( tst_file != NULL ) { - xmlGenericError( xmlGenericErrorContext, - "Transmitted content saved in file: %s\n", buffer ); - - fwrite( http_content, sizeof( char ), - content_lgth, tst_file ); - fclose( tst_file ); - } - - (void)snprintf( buffer, sizeof(buffer), "%s.reply", dump_name ); - tst_file = fopen( buffer, "wb" ); - if ( tst_file != NULL ) { - xmlGenericError( xmlGenericErrorContext, - "Reply content saved in file: %s\n", buffer ); - - - while ( (avail = xmlNanoHTTPRead( http_ctxt, - buffer, sizeof( buffer ) )) > 0 ) { - - fwrite( buffer, sizeof( char ), avail, tst_file ); - } - - fclose( tst_file ); - } - - free( dump_name ); - } -#endif /* DEBUG_HTTP */ - - http_rtn = xmlNanoHTTPReturnCode( http_ctxt ); - if ( ( http_rtn >= 200 ) && ( http_rtn < 300 ) ) - close_rc = 0; - else { - xmlChar msg[500]; - xmlStrPrintf(msg, 500, - (const xmlChar *) "xmlIOHTTPCloseWrite: HTTP '%s' of %d %s\n'%s' %s %d\n", - http_mthd, content_lgth, - "bytes to URI", ctxt->uri, - "failed. HTTP return code:", http_rtn ); - xmlIOErr(XML_IO_WRITE, (const char *) msg); - } - - xmlNanoHTTPClose( http_ctxt ); - xmlFree( content_type ); - } - } - - /* Final cleanups */ - - xmlFreeHTTPWriteCtxt( ctxt ); - - return ( close_rc ); -} - -/** - * xmlIOHTTPClosePut - * - * @context: The I/O context - * - * Close the transmit HTTP I/O channel and actually send data using a PUT - * HTTP method. - */ -static int -xmlIOHTTPClosePut( void * ctxt ) { - return ( xmlIOHTTPCloseWrite( ctxt, "PUT" ) ); -} - - -/** - * xmlIOHTTPClosePost - * - * @context: The I/O context - * - * Close the transmit HTTP I/O channel and actually send data using a POST - * HTTP method. - */ -static int -xmlIOHTTPClosePost( void * ctxt ) { - return ( xmlIOHTTPCloseWrite( ctxt, "POST" ) ); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -#endif /* LIBXML_HTTP_ENABLED */ - -#ifdef LIBXML_FTP_ENABLED -/************************************************************************ - * * - * I/O for FTP file accesses * - * * - ************************************************************************/ -/** - * xmlIOFTPMatch: - * @filename: the URI for matching - * - * check if the URI matches an FTP one - * - * Returns 1 if matches, 0 otherwise - */ -int -xmlIOFTPMatch (const char *filename) { - if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "ftp://", 6)) - return(1); - return(0); -} - -/** - * xmlIOFTPOpen: - * @filename: the URI for matching - * - * open an FTP I/O channel - * - * Returns an I/O context or NULL in case of error - */ -void * -xmlIOFTPOpen (const char *filename) { - return(xmlNanoFTPOpen(filename)); -} - -/** - * xmlIOFTPRead: - * @context: the I/O context - * @buffer: where to drop data - * @len: number of bytes to write - * - * Read @len bytes to @buffer from the I/O channel. - * - * Returns the number of bytes written - */ -int -xmlIOFTPRead(void * context, char * buffer, int len) { - if ((buffer == NULL) || (len < 0)) return(-1); - return(xmlNanoFTPRead(context, &buffer[0], len)); -} - -/** - * xmlIOFTPClose: - * @context: the I/O context - * - * Close an FTP I/O channel - * - * Returns 0 - */ -int -xmlIOFTPClose (void * context) { - return ( xmlNanoFTPClose(context) ); -} -#endif /* LIBXML_FTP_ENABLED */ - - -/** - * xmlRegisterInputCallbacks: - * @matchFunc: the xmlInputMatchCallback - * @openFunc: the xmlInputOpenCallback - * @readFunc: the xmlInputReadCallback - * @closeFunc: the xmlInputCloseCallback - * - * Register a new set of I/O callback for handling parser input. - * - * Returns the registered handler number or -1 in case of error - */ -int -xmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc, - xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc, - xmlInputCloseCallback closeFunc) { - if (xmlInputCallbackNr >= MAX_INPUT_CALLBACK) { - return(-1); - } - xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = matchFunc; - xmlInputCallbackTable[xmlInputCallbackNr].opencallback = openFunc; - xmlInputCallbackTable[xmlInputCallbackNr].readcallback = readFunc; - xmlInputCallbackTable[xmlInputCallbackNr].closecallback = closeFunc; - xmlInputCallbackInitialized = 1; - return(xmlInputCallbackNr++); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlRegisterOutputCallbacks: - * @matchFunc: the xmlOutputMatchCallback - * @openFunc: the xmlOutputOpenCallback - * @writeFunc: the xmlOutputWriteCallback - * @closeFunc: the xmlOutputCloseCallback - * - * Register a new set of I/O callback for handling output. - * - * Returns the registered handler number or -1 in case of error - */ -int -xmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc, - xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc, - xmlOutputCloseCallback closeFunc) { - if (xmlOutputCallbackNr >= MAX_INPUT_CALLBACK) { - return(-1); - } - xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = matchFunc; - xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = openFunc; - xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = writeFunc; - xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = closeFunc; - xmlOutputCallbackInitialized = 1; - return(xmlOutputCallbackNr++); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlRegisterDefaultInputCallbacks: - * - * Registers the default compiled-in I/O handlers. - */ -void -xmlRegisterDefaultInputCallbacks(void) { - if (xmlInputCallbackInitialized) - return; - -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - xmlInitPlatformSpecificIo(); -#endif - - xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen, - xmlFileRead, xmlFileClose); -#ifdef HAVE_ZLIB_H - xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen, - xmlGzfileRead, xmlGzfileClose); -#endif /* HAVE_ZLIB_H */ - -#ifdef LIBXML_HTTP_ENABLED - xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen, - xmlIOHTTPRead, xmlIOHTTPClose); -#endif /* LIBXML_HTTP_ENABLED */ - -#ifdef LIBXML_FTP_ENABLED - xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen, - xmlIOFTPRead, xmlIOFTPClose); -#endif /* LIBXML_FTP_ENABLED */ - xmlInputCallbackInitialized = 1; -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlRegisterDefaultOutputCallbacks: - * - * Registers the default compiled-in I/O handlers. - */ -void -xmlRegisterDefaultOutputCallbacks (void) { - if (xmlOutputCallbackInitialized) - return; - -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - xmlInitPlatformSpecificIo(); -#endif - - xmlRegisterOutputCallbacks(xmlFileMatch, xmlFileOpenW, - xmlFileWrite, xmlFileClose); - -#ifdef LIBXML_HTTP_ENABLED - xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW, - xmlIOHTTPWrite, xmlIOHTTPClosePut); -#endif - -/********************************* - No way a-priori to distinguish between gzipped files from - uncompressed ones except opening if existing then closing - and saving with same compression ratio ... a pain. - -#ifdef HAVE_ZLIB_H - xmlRegisterOutputCallbacks(xmlGzfileMatch, xmlGzfileOpen, - xmlGzfileWrite, xmlGzfileClose); -#endif - - Nor FTP PUT .... -#ifdef LIBXML_FTP_ENABLED - xmlRegisterOutputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen, - xmlIOFTPWrite, xmlIOFTPClose); -#endif - **********************************/ - xmlOutputCallbackInitialized = 1; -} - -#ifdef LIBXML_HTTP_ENABLED -/** - * xmlRegisterHTTPPostCallbacks: - * - * By default, libxml submits HTTP output requests using the "PUT" method. - * Calling this method changes the HTTP output method to use the "POST" - * method instead. - * - */ -void -xmlRegisterHTTPPostCallbacks( void ) { - - /* Register defaults if not done previously */ - - if ( xmlOutputCallbackInitialized == 0 ) - xmlRegisterDefaultOutputCallbacks( ); - - xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW, - xmlIOHTTPWrite, xmlIOHTTPClosePost); - return; -} -#endif -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlAllocParserInputBuffer: - * @enc: the charset encoding if known - * - * Create a buffered parser input for progressive parsing - * - * Returns the new parser input or NULL - */ -xmlParserInputBufferPtr -xmlAllocParserInputBuffer(xmlCharEncoding enc) { - xmlParserInputBufferPtr ret; - - ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); - if (ret == NULL) { - xmlIOErrMemory("creating input buffer"); - return(NULL); - } - memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); - ret->buffer = xmlBufferCreateSize(2 * xmlDefaultBufferSize); - if (ret->buffer == NULL) { - xmlFree(ret); - return(NULL); - } - ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT; - ret->encoder = xmlGetCharEncodingHandler(enc); - if (ret->encoder != NULL) - ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize); - else - ret->raw = NULL; - ret->readcallback = NULL; - ret->closecallback = NULL; - ret->context = NULL; - ret->compressed = -1; - ret->rawconsumed = 0; - - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlAllocOutputBuffer: - * @encoder: the encoding converter or NULL - * - * Create a buffered parser output - * - * Returns the new parser output or NULL - */ -xmlOutputBufferPtr -xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) { - xmlOutputBufferPtr ret; - - ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); - if (ret == NULL) { - xmlIOErrMemory("creating output buffer"); - return(NULL); - } - memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); - ret->buffer = xmlBufferCreate(); - if (ret->buffer == NULL) { - xmlFree(ret); - return(NULL); - } - ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT; - ret->encoder = encoder; - if (encoder != NULL) { - ret->conv = xmlBufferCreateSize(4000); - /* - * This call is designed to initiate the encoder state - */ - xmlCharEncOutFunc(encoder, ret->conv, NULL); - } else - ret->conv = NULL; - ret->writecallback = NULL; - ret->closecallback = NULL; - ret->context = NULL; - ret->written = 0; - - return(ret); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlFreeParserInputBuffer: - * @in: a buffered parser input - * - * Free up the memory used by a buffered parser input - */ -void -xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) { - if (in == NULL) return; - - if (in->raw) { - xmlBufferFree(in->raw); - in->raw = NULL; - } - if (in->encoder != NULL) { - xmlCharEncCloseFunc(in->encoder); - } - if (in->closecallback != NULL) { - in->closecallback(in->context); - } - if (in->buffer != NULL) { - xmlBufferFree(in->buffer); - in->buffer = NULL; - } - - xmlFree(in); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlOutputBufferClose: - * @out: a buffered output - * - * flushes and close the output I/O channel - * and free up all the associated resources - * - * Returns the number of byte written or -1 in case of error. - */ -int -xmlOutputBufferClose(xmlOutputBufferPtr out) -{ - int written; - int err_rc = 0; - - if (out == NULL) - return (-1); - if (out->writecallback != NULL) - xmlOutputBufferFlush(out); - if (out->closecallback != NULL) { - err_rc = out->closecallback(out->context); - } - written = out->written; - if (out->conv) { - xmlBufferFree(out->conv); - out->conv = NULL; - } - if (out->encoder != NULL) { - xmlCharEncCloseFunc(out->encoder); - } - if (out->buffer != NULL) { - xmlBufferFree(out->buffer); - out->buffer = NULL; - } - - if (out->error) - err_rc = -1; - xmlFree(out); - return ((err_rc == 0) ? written : err_rc); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -xmlParserInputBufferPtr -__xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { - xmlParserInputBufferPtr ret; - int i = 0; - void *context = NULL; - - if (xmlInputCallbackInitialized == 0) - xmlRegisterDefaultInputCallbacks(); - - if (URI == NULL) return(NULL); - - /* - * Try to find one of the input accept method accepting that scheme - * Go in reverse to give precedence to user defined handlers. - */ - if (context == NULL) { - for (i = xmlInputCallbackNr - 1;i >= 0;i--) { - if ((xmlInputCallbackTable[i].matchcallback != NULL) && - (xmlInputCallbackTable[i].matchcallback(URI) != 0)) { - context = xmlInputCallbackTable[i].opencallback(URI); - if (context != NULL) { - break; - } - } - } - } - if (context == NULL) { - return(NULL); - } - - /* - * Allocate the Input buffer front-end. - */ - ret = xmlAllocParserInputBuffer(enc); - if (ret != NULL) { - ret->context = context; - ret->readcallback = xmlInputCallbackTable[i].readcallback; - ret->closecallback = xmlInputCallbackTable[i].closecallback; -#ifdef HAVE_ZLIB_H - if ((xmlInputCallbackTable[i].opencallback == xmlGzfileOpen) && - (strcmp(URI, "-") != 0)) { -#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1230 - ret->compressed = !gzdirect(context); -#else - if (((z_stream *)context)->avail_in > 4) { - char *cptr, buff4[4]; - cptr = (char *) ((z_stream *)context)->next_in; - if (gzread(context, buff4, 4) == 4) { - if (strncmp(buff4, cptr, 4) == 0) - ret->compressed = 0; - else - ret->compressed = 1; - gzrewind(context); - } - } -#endif - } -#endif - } - else - xmlInputCallbackTable[i].closecallback (context); - - return(ret); -} - -/** - * xmlParserInputBufferCreateFilename: - * @URI: a C string containing the URI or filename - * @enc: the charset encoding if known - * - * Create a buffered parser input for the progressive parsing of a file - * If filename is "-' then we use stdin as the input. - * Automatic support for ZLIB/Compress compressed document is provided - * by default if found at compile-time. - * Do an encoding check if enc == XML_CHAR_ENCODING_NONE - * - * Returns the new parser input or NULL - */ -xmlParserInputBufferPtr -xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { - if ((xmlParserInputBufferCreateFilenameValue)) { - return xmlParserInputBufferCreateFilenameValue(URI, enc); - } - return __xmlParserInputBufferCreateFilename(URI, enc); -} - -#ifdef LIBXML_OUTPUT_ENABLED -xmlOutputBufferPtr -__xmlOutputBufferCreateFilename(const char *URI, - xmlCharEncodingHandlerPtr encoder, - int compression ATTRIBUTE_UNUSED) { - xmlOutputBufferPtr ret; - xmlURIPtr puri; - int i = 0; - void *context = NULL; - char *unescaped = NULL; -#ifdef HAVE_ZLIB_H - int is_file_uri = 1; -#endif - - if (xmlOutputCallbackInitialized == 0) - xmlRegisterDefaultOutputCallbacks(); - - if (URI == NULL) return(NULL); - - puri = xmlParseURI(URI); - if (puri != NULL) { -#ifdef HAVE_ZLIB_H - if ((puri->scheme != NULL) && - (!xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file"))) - is_file_uri = 0; -#endif - /* - * try to limit the damages of the URI unescaping code. - */ - if ((puri->scheme == NULL) || - (xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file"))) - unescaped = xmlURIUnescapeString(URI, 0, NULL); - xmlFreeURI(puri); - } - - /* - * Try to find one of the output accept method accepting that scheme - * Go in reverse to give precedence to user defined handlers. - * try with an unescaped version of the URI - */ - if (unescaped != NULL) { -#ifdef HAVE_ZLIB_H - if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) { - context = xmlGzfileOpenW(unescaped, compression); - if (context != NULL) { - ret = xmlAllocOutputBuffer(encoder); - if (ret != NULL) { - ret->context = context; - ret->writecallback = xmlGzfileWrite; - ret->closecallback = xmlGzfileClose; - } - xmlFree(unescaped); - return(ret); - } - } -#endif - for (i = xmlOutputCallbackNr - 1;i >= 0;i--) { - if ((xmlOutputCallbackTable[i].matchcallback != NULL) && - (xmlOutputCallbackTable[i].matchcallback(unescaped) != 0)) { -#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H) - /* Need to pass compression parameter into HTTP open calls */ - if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch) - context = xmlIOHTTPOpenW(unescaped, compression); - else -#endif - context = xmlOutputCallbackTable[i].opencallback(unescaped); - if (context != NULL) - break; - } - } - xmlFree(unescaped); - } - - /* - * If this failed try with a non-escaped URI this may be a strange - * filename - */ - if (context == NULL) { -#ifdef HAVE_ZLIB_H - if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) { - context = xmlGzfileOpenW(URI, compression); - if (context != NULL) { - ret = xmlAllocOutputBuffer(encoder); - if (ret != NULL) { - ret->context = context; - ret->writecallback = xmlGzfileWrite; - ret->closecallback = xmlGzfileClose; - } - return(ret); - } - } -#endif - for (i = xmlOutputCallbackNr - 1;i >= 0;i--) { - if ((xmlOutputCallbackTable[i].matchcallback != NULL) && - (xmlOutputCallbackTable[i].matchcallback(URI) != 0)) { -#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H) - /* Need to pass compression parameter into HTTP open calls */ - if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch) - context = xmlIOHTTPOpenW(URI, compression); - else -#endif - context = xmlOutputCallbackTable[i].opencallback(URI); - if (context != NULL) - break; - } - } - } - - if (context == NULL) { - return(NULL); - } - - /* - * Allocate the Output buffer front-end. - */ - ret = xmlAllocOutputBuffer(encoder); - if (ret != NULL) { - ret->context = context; - ret->writecallback = xmlOutputCallbackTable[i].writecallback; - ret->closecallback = xmlOutputCallbackTable[i].closecallback; - } - return(ret); -} - -/** - * xmlOutputBufferCreateFilename: - * @URI: a C string containing the URI or filename - * @encoder: the encoding converter or NULL - * @compression: the compression ration (0 none, 9 max). - * - * Create a buffered output for the progressive saving of a file - * If filename is "-' then we use stdout as the output. - * Automatic support for ZLIB/Compress compressed document is provided - * by default if found at compile-time. - * TODO: currently if compression is set, the library only support - * writing to a local file. - * - * Returns the new output or NULL - */ -xmlOutputBufferPtr -xmlOutputBufferCreateFilename(const char *URI, - xmlCharEncodingHandlerPtr encoder, - int compression ATTRIBUTE_UNUSED) { - if ((xmlOutputBufferCreateFilenameValue)) { - return xmlOutputBufferCreateFilenameValue(URI, encoder, compression); - } - return __xmlOutputBufferCreateFilename(URI, encoder, compression); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlParserInputBufferCreateFile: - * @file: a FILE* - * @enc: the charset encoding if known - * - * Create a buffered parser input for the progressive parsing of a FILE * - * buffered C I/O - * - * Returns the new parser input or NULL - */ -xmlParserInputBufferPtr -xmlParserInputBufferCreateFile(FILE *file, xmlCharEncoding enc) { - xmlParserInputBufferPtr ret; - - if (xmlInputCallbackInitialized == 0) - xmlRegisterDefaultInputCallbacks(); - - if (file == NULL) return(NULL); - - ret = xmlAllocParserInputBuffer(enc); - if (ret != NULL) { - ret->context = file; - ret->readcallback = xmlFileRead; - ret->closecallback = xmlFileFlush; - } - - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlOutputBufferCreateFile: - * @file: a FILE* - * @encoder: the encoding converter or NULL - * - * Create a buffered output for the progressive saving to a FILE * - * buffered C I/O - * - * Returns the new parser output or NULL - */ -xmlOutputBufferPtr -xmlOutputBufferCreateFile(FILE *file, xmlCharEncodingHandlerPtr encoder) { - xmlOutputBufferPtr ret; - - if (xmlOutputCallbackInitialized == 0) - xmlRegisterDefaultOutputCallbacks(); - - if (file == NULL) return(NULL); - - ret = xmlAllocOutputBuffer(encoder); - if (ret != NULL) { - ret->context = file; - ret->writecallback = xmlFileWrite; - ret->closecallback = xmlFileFlush; - } - - return(ret); -} - -/** - * xmlOutputBufferCreateBuffer: - * @buffer: a xmlBufferPtr - * @encoder: the encoding converter or NULL - * - * Create a buffered output for the progressive saving to a xmlBuffer - * - * Returns the new parser output or NULL - */ -xmlOutputBufferPtr -xmlOutputBufferCreateBuffer(xmlBufferPtr buffer, - xmlCharEncodingHandlerPtr encoder) { - xmlOutputBufferPtr ret; - - if (buffer == NULL) return(NULL); - - ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback) - xmlBufferWrite, - (xmlOutputCloseCallback) - NULL, (void *) buffer, encoder); - - return(ret); -} - -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlParserInputBufferCreateFd: - * @fd: a file descriptor number - * @enc: the charset encoding if known - * - * Create a buffered parser input for the progressive parsing for the input - * from a file descriptor - * - * Returns the new parser input or NULL - */ -xmlParserInputBufferPtr -xmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) { - xmlParserInputBufferPtr ret; - - if (fd < 0) return(NULL); - - ret = xmlAllocParserInputBuffer(enc); - if (ret != NULL) { - ret->context = (void *) (long) fd; - ret->readcallback = xmlFdRead; - ret->closecallback = xmlFdClose; - } - - return(ret); -} - -/** - * xmlParserInputBufferCreateMem: - * @mem: the memory input - * @size: the length of the memory block - * @enc: the charset encoding if known - * - * Create a buffered parser input for the progressive parsing for the input - * from a memory area. - * - * Returns the new parser input or NULL - */ -xmlParserInputBufferPtr -xmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) { - xmlParserInputBufferPtr ret; - int errcode; - - if (size <= 0) return(NULL); - if (mem == NULL) return(NULL); - - ret = xmlAllocParserInputBuffer(enc); - if (ret != NULL) { - ret->context = (void *) mem; - ret->readcallback = (xmlInputReadCallback) xmlNop; - ret->closecallback = NULL; - errcode = xmlBufferAdd(ret->buffer, (const xmlChar *) mem, size); - if (errcode != 0) { - xmlFree(ret); - return(NULL); - } - } - - return(ret); -} - -/** - * xmlParserInputBufferCreateStatic: - * @mem: the memory input - * @size: the length of the memory block - * @enc: the charset encoding if known - * - * Create a buffered parser input for the progressive parsing for the input - * from an immutable memory area. This will not copy the memory area to - * the buffer, but the memory is expected to be available until the end of - * the parsing, this is useful for example when using mmap'ed file. - * - * Returns the new parser input or NULL - */ -xmlParserInputBufferPtr -xmlParserInputBufferCreateStatic(const char *mem, int size, - xmlCharEncoding enc) { - xmlParserInputBufferPtr ret; - - if (size <= 0) return(NULL); - if (mem == NULL) return(NULL); - - ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); - if (ret == NULL) { - xmlIOErrMemory("creating input buffer"); - return(NULL); - } - memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); - ret->buffer = xmlBufferCreateStatic((void *)mem, (size_t) size); - if (ret->buffer == NULL) { - xmlFree(ret); - return(NULL); - } - ret->encoder = xmlGetCharEncodingHandler(enc); - if (ret->encoder != NULL) - ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize); - else - ret->raw = NULL; - ret->compressed = -1; - ret->context = (void *) mem; - ret->readcallback = NULL; - ret->closecallback = NULL; - - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlOutputBufferCreateFd: - * @fd: a file descriptor number - * @encoder: the encoding converter or NULL - * - * Create a buffered output for the progressive saving - * to a file descriptor - * - * Returns the new parser output or NULL - */ -xmlOutputBufferPtr -xmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) { - xmlOutputBufferPtr ret; - - if (fd < 0) return(NULL); - - ret = xmlAllocOutputBuffer(encoder); - if (ret != NULL) { - ret->context = (void *) (long) fd; - ret->writecallback = xmlFdWrite; - ret->closecallback = NULL; - } - - return(ret); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlParserInputBufferCreateIO: - * @ioread: an I/O read function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @enc: the charset encoding if known - * - * Create a buffered parser input for the progressive parsing for the input - * from an I/O handler - * - * Returns the new parser input or NULL - */ -xmlParserInputBufferPtr -xmlParserInputBufferCreateIO(xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, void *ioctx, xmlCharEncoding enc) { - xmlParserInputBufferPtr ret; - - if (ioread == NULL) return(NULL); - - ret = xmlAllocParserInputBuffer(enc); - if (ret != NULL) { - ret->context = (void *) ioctx; - ret->readcallback = ioread; - ret->closecallback = ioclose; - } - - return(ret); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlOutputBufferCreateIO: - * @iowrite: an I/O write function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @encoder: the charset encoding if known - * - * Create a buffered output for the progressive saving - * to an I/O handler - * - * Returns the new parser output or NULL - */ -xmlOutputBufferPtr -xmlOutputBufferCreateIO(xmlOutputWriteCallback iowrite, - xmlOutputCloseCallback ioclose, void *ioctx, - xmlCharEncodingHandlerPtr encoder) { - xmlOutputBufferPtr ret; - - if (iowrite == NULL) return(NULL); - - ret = xmlAllocOutputBuffer(encoder); - if (ret != NULL) { - ret->context = (void *) ioctx; - ret->writecallback = iowrite; - ret->closecallback = ioclose; - } - - return(ret); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlParserInputBufferCreateFilenameDefault: - * @func: function pointer to the new ParserInputBufferCreateFilenameFunc - * - * Registers a callback for URI input file handling - * - * Returns the old value of the registration function - */ -xmlParserInputBufferCreateFilenameFunc -xmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func) -{ - xmlParserInputBufferCreateFilenameFunc old = xmlParserInputBufferCreateFilenameValue; - if (old == NULL) { - old = __xmlParserInputBufferCreateFilename; - } - - xmlParserInputBufferCreateFilenameValue = func; - return(old); -} - -/** - * xmlOutputBufferCreateFilenameDefault: - * @func: function pointer to the new OutputBufferCreateFilenameFunc - * - * Registers a callback for URI output file handling - * - * Returns the old value of the registration function - */ -xmlOutputBufferCreateFilenameFunc -xmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func) -{ - xmlOutputBufferCreateFilenameFunc old = xmlOutputBufferCreateFilenameValue; -#ifdef LIBXML_OUTPUT_ENABLED - if (old == NULL) { - old = __xmlOutputBufferCreateFilename; - } -#endif - xmlOutputBufferCreateFilenameValue = func; - return(old); -} - -/** - * xmlParserInputBufferPush: - * @in: a buffered parser input - * @len: the size in bytes of the array. - * @buf: an char array - * - * Push the content of the arry in the input buffer - * This routine handle the I18N transcoding to internal UTF-8 - * This is used when operating the parser in progressive (push) mode. - * - * Returns the number of chars read and stored in the buffer, or -1 - * in case of error. - */ -int -xmlParserInputBufferPush(xmlParserInputBufferPtr in, - int len, const char *buf) { - int nbchars = 0; - int ret; - - if (len < 0) return(0); - if ((in == NULL) || (in->error)) return(-1); - if (in->encoder != NULL) { - unsigned int use; - - /* - * Store the data in the incoming raw buffer - */ - if (in->raw == NULL) { - in->raw = xmlBufferCreate(); - } - ret = xmlBufferAdd(in->raw, (const xmlChar *) buf, len); - if (ret != 0) - return(-1); - - /* - * convert as much as possible to the parser reading buffer. - */ - use = in->raw->use; - nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); - if (nbchars < 0) { - xmlIOErr(XML_IO_ENCODER, NULL); - in->error = XML_IO_ENCODER; - return(-1); - } - in->rawconsumed += (use - in->raw->use); - } else { - nbchars = len; - ret = xmlBufferAdd(in->buffer, (xmlChar *) buf, nbchars); - if (ret != 0) - return(-1); - } -#ifdef DEBUG_INPUT - xmlGenericError(xmlGenericErrorContext, - "I/O: pushed %d chars, buffer %d/%d\n", - nbchars, in->buffer->use, in->buffer->size); -#endif - return(nbchars); -} - -/** - * endOfInput: - * - * When reading from an Input channel indicated end of file or error - * don't reread from it again. - */ -static int -endOfInput (void * context ATTRIBUTE_UNUSED, - char * buffer ATTRIBUTE_UNUSED, - int len ATTRIBUTE_UNUSED) { - return(0); -} - -/** - * xmlParserInputBufferGrow: - * @in: a buffered parser input - * @len: indicative value of the amount of chars to read - * - * Grow up the content of the input buffer, the old data are preserved - * This routine handle the I18N transcoding to internal UTF-8 - * This routine is used when operating the parser in normal (pull) mode - * - * TODO: one should be able to remove one extra copy by copying directly - * onto in->buffer or in->raw - * - * Returns the number of chars read and stored in the buffer, or -1 - * in case of error. - */ -int -xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { - char *buffer = NULL; - int res = 0; - int nbchars = 0; - int buffree; - unsigned int needSize; - - if ((in == NULL) || (in->error)) return(-1); - if ((len <= MINLEN) && (len != 4)) - len = MINLEN; - - buffree = in->buffer->size - in->buffer->use; - if (buffree <= 0) { - xmlIOErr(XML_IO_BUFFER_FULL, NULL); - in->error = XML_IO_BUFFER_FULL; - return(-1); - } - - needSize = in->buffer->use + len + 1; - if (needSize > in->buffer->size){ - if (!xmlBufferResize(in->buffer, needSize)){ - xmlIOErrMemory("growing input buffer"); - in->error = XML_ERR_NO_MEMORY; - return(-1); - } - } - buffer = (char *)&in->buffer->content[in->buffer->use]; - - /* - * Call the read method for this I/O type. - */ - if (in->readcallback != NULL) { - res = in->readcallback(in->context, &buffer[0], len); - if (res <= 0) - in->readcallback = endOfInput; - } else { - xmlIOErr(XML_IO_NO_INPUT, NULL); - in->error = XML_IO_NO_INPUT; - return(-1); - } - if (res < 0) { - return(-1); - } - len = res; - if (in->encoder != NULL) { - unsigned int use; - - /* - * Store the data in the incoming raw buffer - */ - if (in->raw == NULL) { - in->raw = xmlBufferCreate(); - } - res = xmlBufferAdd(in->raw, (const xmlChar *) buffer, len); - if (res != 0) - return(-1); - - /* - * convert as much as possible to the parser reading buffer. - */ - use = in->raw->use; - nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); - if (nbchars < 0) { - xmlIOErr(XML_IO_ENCODER, NULL); - in->error = XML_IO_ENCODER; - return(-1); - } - in->rawconsumed += (use - in->raw->use); - } else { - nbchars = len; - in->buffer->use += nbchars; - buffer[nbchars] = 0; - } -#ifdef DEBUG_INPUT - xmlGenericError(xmlGenericErrorContext, - "I/O: read %d chars, buffer %d/%d\n", - nbchars, in->buffer->use, in->buffer->size); -#endif - return(nbchars); -} - -/** - * xmlParserInputBufferRead: - * @in: a buffered parser input - * @len: indicative value of the amount of chars to read - * - * Refresh the content of the input buffer, the old data are considered - * consumed - * This routine handle the I18N transcoding to internal UTF-8 - * - * Returns the number of chars read and stored in the buffer, or -1 - * in case of error. - */ -int -xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) { - if ((in == NULL) || (in->error)) return(-1); - if (in->readcallback != NULL) - return(xmlParserInputBufferGrow(in, len)); - else if ((in->buffer != NULL) && - (in->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) - return(0); - else - return(-1); -} - -#ifdef LIBXML_OUTPUT_ENABLED -/** - * xmlOutputBufferWrite: - * @out: a buffered parser output - * @len: the size in bytes of the array. - * @buf: an char array - * - * Write the content of the array in the output I/O buffer - * This routine handle the I18N transcoding from internal UTF-8 - * The buffer is lossless, i.e. will store in case of partial - * or delayed writes. - * - * Returns the number of chars immediately written, or -1 - * in case of error. - */ -int -xmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) { - int nbchars = 0; /* number of chars to output to I/O */ - int ret; /* return from function call */ - int written = 0; /* number of char written to I/O so far */ - int chunk; /* number of byte curreent processed from buf */ - - if ((out == NULL) || (out->error)) return(-1); - if (len < 0) return(0); - if (out->error) return(-1); - - do { - chunk = len; - if (chunk > 4 * MINLEN) - chunk = 4 * MINLEN; - - /* - * first handle encoding stuff. - */ - if (out->encoder != NULL) { - /* - * Store the data in the incoming raw buffer - */ - if (out->conv == NULL) { - out->conv = xmlBufferCreate(); - } - ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk); - if (ret != 0) - return(-1); - - if ((out->buffer->use < MINLEN) && (chunk == len)) - goto done; - - /* - * convert as much as possible to the parser reading buffer. - */ - ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); - if ((ret < 0) && (ret != -3)) { - xmlIOErr(XML_IO_ENCODER, NULL); - out->error = XML_IO_ENCODER; - return(-1); - } - nbchars = out->conv->use; - } else { - ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk); - if (ret != 0) - return(-1); - nbchars = out->buffer->use; - } - buf += chunk; - len -= chunk; - - if ((nbchars < MINLEN) && (len <= 0)) - goto done; - - if (out->writecallback) { - /* - * second write the stuff to the I/O channel - */ - if (out->encoder != NULL) { - ret = out->writecallback(out->context, - (const char *)out->conv->content, nbchars); - if (ret >= 0) - xmlBufferShrink(out->conv, ret); - } else { - ret = out->writecallback(out->context, - (const char *)out->buffer->content, nbchars); - if (ret >= 0) - xmlBufferShrink(out->buffer, ret); - } - if (ret < 0) { - xmlIOErr(XML_IO_WRITE, NULL); - out->error = XML_IO_WRITE; - return(ret); - } - out->written += ret; - } - written += nbchars; - } while (len > 0); - -done: -#ifdef DEBUG_INPUT - xmlGenericError(xmlGenericErrorContext, - "I/O: wrote %d chars\n", written); -#endif - return(written); -} - -/** - * xmlEscapeContent: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of unescaped UTF-8 bytes - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and escape them. - * Returns 0 if success, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -static int -xmlEscapeContent(unsigned char* out, int *outlen, - const xmlChar* in, int *inlen) { - unsigned char* outstart = out; - const unsigned char* base = in; - unsigned char* outend = out + *outlen; - const unsigned char* inend; - - inend = in + (*inlen); - - while ((in < inend) && (out < outend)) { - if (*in == '<') { - if (outend - out < 4) break; - *out++ = '&'; - *out++ = 'l'; - *out++ = 't'; - *out++ = ';'; - } else if (*in == '>') { - if (outend - out < 4) break; - *out++ = '&'; - *out++ = 'g'; - *out++ = 't'; - *out++ = ';'; - } else if (*in == '&') { - if (outend - out < 5) break; - *out++ = '&'; - *out++ = 'a'; - *out++ = 'm'; - *out++ = 'p'; - *out++ = ';'; - } else if (*in == '\r') { - if (outend - out < 5) break; - *out++ = '&'; - *out++ = '#'; - *out++ = '1'; - *out++ = '3'; - *out++ = ';'; - } else { - *out++ = (unsigned char) *in; - } - ++in; - } - *outlen = out - outstart; - *inlen = in - base; - return(0); -} - -/** - * xmlOutputBufferWriteEscape: - * @out: a buffered parser output - * @str: a zero terminated UTF-8 string - * @escaping: an optional escaping function (or NULL) - * - * Write the content of the string in the output I/O buffer - * This routine escapes the caracters and then handle the I18N - * transcoding from internal UTF-8 - * The buffer is lossless, i.e. will store in case of partial - * or delayed writes. - * - * Returns the number of chars immediately written, or -1 - * in case of error. - */ -int -xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str, - xmlCharEncodingOutputFunc escaping) { - int nbchars = 0; /* number of chars to output to I/O */ - int ret; /* return from function call */ - int written = 0; /* number of char written to I/O so far */ - int oldwritten=0;/* loop guard */ - int chunk; /* number of byte currently processed from str */ - int len; /* number of bytes in str */ - int cons; /* byte from str consumed */ - - if ((out == NULL) || (out->error) || (str == NULL) || - (out->buffer == NULL) || - (out->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) return(-1); - len = strlen((const char *)str); - if (len < 0) return(0); - if (out->error) return(-1); - if (escaping == NULL) escaping = xmlEscapeContent; - - do { - oldwritten = written; - - /* - * how many bytes to consume and how many bytes to store. - */ - cons = len; - chunk = (out->buffer->size - out->buffer->use) - 1; - - /* - * first handle encoding stuff. - */ - if (out->encoder != NULL) { - /* - * Store the data in the incoming raw buffer - */ - if (out->conv == NULL) { - out->conv = xmlBufferCreate(); - } - ret = escaping(out->buffer->content + out->buffer->use , - &chunk, str, &cons); - if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ - return(-1); - out->buffer->use += chunk; - out->buffer->content[out->buffer->use] = 0; - - if ((out->buffer->use < MINLEN) && (cons == len)) - goto done; - - /* - * convert as much as possible to the output buffer. - */ - ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); - if ((ret < 0) && (ret != -3)) { - xmlIOErr(XML_IO_ENCODER, NULL); - out->error = XML_IO_ENCODER; - return(-1); - } - nbchars = out->conv->use; - } else { - ret = escaping(out->buffer->content + out->buffer->use , - &chunk, str, &cons); - if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ - return(-1); - out->buffer->use += chunk; - out->buffer->content[out->buffer->use] = 0; - nbchars = out->buffer->use; - } - str += cons; - len -= cons; - - if ((nbchars < MINLEN) && (len <= 0)) - goto done; - - if (out->writecallback) { - /* - * second write the stuff to the I/O channel - */ - if (out->encoder != NULL) { - ret = out->writecallback(out->context, - (const char *)out->conv->content, nbchars); - if (ret >= 0) - xmlBufferShrink(out->conv, ret); - } else { - ret = out->writecallback(out->context, - (const char *)out->buffer->content, nbchars); - if (ret >= 0) - xmlBufferShrink(out->buffer, ret); - } - if (ret < 0) { - xmlIOErr(XML_IO_WRITE, NULL); - out->error = XML_IO_WRITE; - return(ret); - } - out->written += ret; - } else if (out->buffer->size - out->buffer->use < MINLEN) { - xmlBufferResize(out->buffer, out->buffer->size + MINLEN); - } - written += nbchars; - } while ((len > 0) && (oldwritten != written)); - -done: -#ifdef DEBUG_INPUT - xmlGenericError(xmlGenericErrorContext, - "I/O: wrote %d chars\n", written); -#endif - return(written); -} - -/** - * xmlOutputBufferWriteString: - * @out: a buffered parser output - * @str: a zero terminated C string - * - * Write the content of the string in the output I/O buffer - * This routine handle the I18N transcoding from internal UTF-8 - * The buffer is lossless, i.e. will store in case of partial - * or delayed writes. - * - * Returns the number of chars immediately written, or -1 - * in case of error. - */ -int -xmlOutputBufferWriteString(xmlOutputBufferPtr out, const char *str) { - int len; - - if ((out == NULL) || (out->error)) return(-1); - if (str == NULL) - return(-1); - len = strlen(str); - - if (len > 0) - return(xmlOutputBufferWrite(out, len, str)); - return(len); -} - -/** - * xmlOutputBufferFlush: - * @out: a buffered output - * - * flushes the output I/O channel - * - * Returns the number of byte written or -1 in case of error. - */ -int -xmlOutputBufferFlush(xmlOutputBufferPtr out) { - int nbchars = 0, ret = 0; - - if ((out == NULL) || (out->error)) return(-1); - /* - * first handle encoding stuff. - */ - if ((out->conv != NULL) && (out->encoder != NULL)) { - /* - * convert as much as possible to the parser reading buffer. - */ - nbchars = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); - if (nbchars < 0) { - xmlIOErr(XML_IO_ENCODER, NULL); - out->error = XML_IO_ENCODER; - return(-1); - } - } - - /* - * second flush the stuff to the I/O channel - */ - if ((out->conv != NULL) && (out->encoder != NULL) && - (out->writecallback != NULL)) { - ret = out->writecallback(out->context, - (const char *)out->conv->content, out->conv->use); - if (ret >= 0) - xmlBufferShrink(out->conv, ret); - } else if (out->writecallback != NULL) { - ret = out->writecallback(out->context, - (const char *)out->buffer->content, out->buffer->use); - if (ret >= 0) - xmlBufferShrink(out->buffer, ret); - } - if (ret < 0) { - xmlIOErr(XML_IO_FLUSH, NULL); - out->error = XML_IO_FLUSH; - return(ret); - } - out->written += ret; - -#ifdef DEBUG_INPUT - xmlGenericError(xmlGenericErrorContext, - "I/O: flushed %d chars\n", ret); -#endif - return(ret); -} -#endif /* LIBXML_OUTPUT_ENABLED */ - -/** - * xmlParserGetDirectory: - * @filename: the path to a file - * - * lookup the directory for that file - * - * Returns a new allocated string containing the directory, or NULL. - */ -char * -xmlParserGetDirectory(const char *filename) { - char *ret = NULL; - char dir[1024]; - char *cur; - char sep = '/'; - -#ifdef _WIN32_WCE /* easy way by now ... wince does not have dirs! */ - return NULL; -#endif - - if (xmlInputCallbackInitialized == 0) - xmlRegisterDefaultInputCallbacks(); - - if (filename == NULL) return(NULL); -#if defined(WIN32) && !defined(__CYGWIN__) - sep = '\\'; -#endif - - strncpy(dir, filename, 1023); - dir[1023] = 0; - cur = &dir[strlen(dir)]; - while (cur > dir) { - if (*cur == sep) break; - cur --; - } - if (*cur == sep) { - if (cur == dir) dir[1] = 0; - else *cur = 0; - ret = xmlMemStrdup(dir); - } else { - if (getcwd(dir, 1024) != NULL) { - dir[1023] = 0; - ret = xmlMemStrdup(dir); - } - } - return(ret); -} - -/**************************************************************** - * * - * External entities loading * - * * - ****************************************************************/ - -/** - * xmlCheckHTTPInput: - * @ctxt: an XML parser context - * @ret: an XML parser input - * - * Check an input in case it was created from an HTTP stream, in that - * case it will handle encoding and update of the base URL in case of - * redirection. It also checks for HTTP errors in which case the input - * is cleanly freed up and an appropriate error is raised in context - * - * Returns the input or NULL in case of HTTP error. - */ -xmlParserInputPtr -xmlCheckHTTPInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr ret) { -#ifdef LIBXML_HTTP_ENABLED - if ((ret != NULL) && (ret->buf != NULL) && - (ret->buf->readcallback == xmlIOHTTPRead) && - (ret->buf->context != NULL)) { - const char *encoding; - const char *redir; - const char *mime; - int code; - - code = xmlNanoHTTPReturnCode(ret->buf->context); - if (code >= 400) { - /* fatal error */ - if (ret->filename != NULL) - __xmlLoaderErr(ctxt, "failed to load HTTP resource \"%s\"\n", - (const char *) ret->filename); - else - __xmlLoaderErr(ctxt, "failed to load HTTP resource\n", NULL); - xmlFreeInputStream(ret); - ret = NULL; - } else { - - mime = xmlNanoHTTPMimeType(ret->buf->context); - if ((xmlStrstr(BAD_CAST mime, BAD_CAST "/xml")) || - (xmlStrstr(BAD_CAST mime, BAD_CAST "+xml"))) { - encoding = xmlNanoHTTPEncoding(ret->buf->context); - if (encoding != NULL) { - xmlCharEncodingHandlerPtr handler; - - handler = xmlFindCharEncodingHandler(encoding); - if (handler != NULL) { - xmlSwitchInputEncoding(ctxt, ret, handler); - } else { - __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING, - "Unknown encoding %s", - BAD_CAST encoding, NULL); - } - if (ret->encoding == NULL) - ret->encoding = xmlStrdup(BAD_CAST encoding); - } -#if 0 - } else if (xmlStrstr(BAD_CAST mime, BAD_CAST "html")) { -#endif - } - redir = xmlNanoHTTPRedir(ret->buf->context); - if (redir != NULL) { - if (ret->filename != NULL) - xmlFree((xmlChar *) ret->filename); - if (ret->directory != NULL) { - xmlFree((xmlChar *) ret->directory); - ret->directory = NULL; - } - ret->filename = - (char *) xmlStrdup((const xmlChar *) redir); - } - } - } -#else - (void)ctxt; -#endif - return(ret); -} - -static int xmlNoNetExists(const char *URL) { - const char *path; - - if (URL == NULL) - return(0); - - if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file://localhost/", 17)) -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &URL[17]; -#else - path = &URL[16]; -#endif - else if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file:///", 8)) { -#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) - path = &URL[8]; -#else - path = &URL[7]; -#endif - } else - path = URL; - - return xmlCheckFilename(path); -} - -#ifdef LIBXML_CATALOG_ENABLED - -/** - * xmlResolveResourceFromCatalog: - * @URL: the URL for the entity to load - * @ID: the System ID for the entity to load - * @ctxt: the context in which the entity is called or NULL - * - * Resolves the URL and ID against the appropriate catalog. - * This function is used by xmlDefaultExternalEntityLoader and - * xmlNoNetExternalEntityLoader. - * - * Returns a new allocated URL, or NULL. - */ -xmlChar * -xmlResolveResourceFromCatalog(const char *URL, const char *ID, - xmlParserCtxtPtr ctxt) { - xmlChar *resource = NULL; - xmlCatalogAllow pref; - - /* - * If the resource doesn't exists as a file, - * try to load it from the resource pointed in the catalogs - */ - pref = xmlCatalogGetDefaults(); - - if ((pref != XML_CATA_ALLOW_NONE) && (!xmlNoNetExists(URL))) { - /* - * Do a local lookup - */ - if ((ctxt != NULL) && (ctxt->catalogs != NULL) && - ((pref == XML_CATA_ALLOW_ALL) || - (pref == XML_CATA_ALLOW_DOCUMENT))) { - resource = xmlCatalogLocalResolve(ctxt->catalogs, - (const xmlChar *)ID, - (const xmlChar *)URL); - } - /* - * Try a global lookup - */ - if ((resource == NULL) && - ((pref == XML_CATA_ALLOW_ALL) || - (pref == XML_CATA_ALLOW_GLOBAL))) { - resource = xmlCatalogResolve((const xmlChar *)ID, - (const xmlChar *)URL); - } - if ((resource == NULL) && (URL != NULL)) - resource = xmlStrdup((const xmlChar *) URL); - - /* - * TODO: do an URI lookup on the reference - */ - if ((resource != NULL) && (!xmlNoNetExists((const char *)resource))) { - xmlChar *tmp = NULL; - - if ((ctxt != NULL) && (ctxt->catalogs != NULL) && - ((pref == XML_CATA_ALLOW_ALL) || - (pref == XML_CATA_ALLOW_DOCUMENT))) { - tmp = xmlCatalogLocalResolveURI(ctxt->catalogs, resource); - } - if ((tmp == NULL) && - ((pref == XML_CATA_ALLOW_ALL) || - (pref == XML_CATA_ALLOW_GLOBAL))) { - tmp = xmlCatalogResolveURI(resource); - } - - if (tmp != NULL) { - xmlFree(resource); - resource = tmp; - } - } - } - - return resource; -} - -#endif - -/** - * xmlDefaultExternalEntityLoader: - * @URL: the URL for the entity to load - * @ID: the System ID for the entity to load - * @ctxt: the context in which the entity is called or NULL - * - * By default we don't load external entitites, yet. - * - * Returns a new allocated xmlParserInputPtr, or NULL. - */ -static xmlParserInputPtr -xmlDefaultExternalEntityLoader(const char *URL, const char *ID, - xmlParserCtxtPtr ctxt) -{ - xmlParserInputPtr ret = NULL; - xmlChar *resource = NULL; - -#ifdef DEBUG_EXTERNAL_ENTITIES - xmlGenericError(xmlGenericErrorContext, - "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL); -#endif - if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) { - int options = ctxt->options; - - ctxt->options -= XML_PARSE_NONET; - ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); - ctxt->options = options; - return(ret); - } -#ifdef LIBXML_CATALOG_ENABLED - resource = xmlResolveResourceFromCatalog(URL, ID, ctxt); -#endif - - if (resource == NULL) - resource = (xmlChar *) URL; - - if (resource == NULL) { - if (ID == NULL) - ID = "NULL"; - __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", ID); - return (NULL); - } - ret = xmlNewInputFromFile(ctxt, (const char *) resource); - if ((resource != NULL) && (resource != (xmlChar *) URL)) - xmlFree(resource); - return (ret); -} - -static xmlExternalEntityLoader xmlCurrentExternalEntityLoader = - xmlDefaultExternalEntityLoader; - -/** - * xmlSetExternalEntityLoader: - * @f: the new entity resolver function - * - * Changes the defaultexternal entity resolver function for the application - */ -void -xmlSetExternalEntityLoader(xmlExternalEntityLoader f) { - xmlCurrentExternalEntityLoader = f; -} - -/** - * xmlGetExternalEntityLoader: - * - * Get the default external entity resolver function for the application - * - * Returns the xmlExternalEntityLoader function pointer - */ -xmlExternalEntityLoader -xmlGetExternalEntityLoader(void) { - return(xmlCurrentExternalEntityLoader); -} - -/** - * xmlLoadExternalEntity: - * @URL: the URL for the entity to load - * @ID: the Public ID for the entity to load - * @ctxt: the context in which the entity is called or NULL - * - * Load an external entity, note that the use of this function for - * unparsed entities may generate problems - * - * Returns the xmlParserInputPtr or NULL - */ -xmlParserInputPtr -xmlLoadExternalEntity(const char *URL, const char *ID, - xmlParserCtxtPtr ctxt) { - if ((URL != NULL) && (xmlNoNetExists(URL) == 0)) { - char *canonicFilename; - xmlParserInputPtr ret; - - canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL); - if (canonicFilename == NULL) { - xmlIOErrMemory("building canonical path\n"); - return(NULL); - } - - ret = xmlCurrentExternalEntityLoader(canonicFilename, ID, ctxt); - xmlFree(canonicFilename); - return(ret); - } - return(xmlCurrentExternalEntityLoader(URL, ID, ctxt)); -} - -/************************************************************************ - * * - * Disabling Network access * - * * - ************************************************************************/ - -/** - * xmlNoNetExternalEntityLoader: - * @URL: the URL for the entity to load - * @ID: the System ID for the entity to load - * @ctxt: the context in which the entity is called or NULL - * - * A specific entity loader disabling network accesses, though still - * allowing local catalog accesses for resolution. - * - * Returns a new allocated xmlParserInputPtr, or NULL. - */ -xmlParserInputPtr -xmlNoNetExternalEntityLoader(const char *URL, const char *ID, - xmlParserCtxtPtr ctxt) { - xmlParserInputPtr input = NULL; - xmlChar *resource = NULL; - -#ifdef LIBXML_CATALOG_ENABLED - resource = xmlResolveResourceFromCatalog(URL, ID, ctxt); -#endif - - if (resource == NULL) - resource = (xmlChar *) URL; - - if (resource != NULL) { - if ((!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "ftp://", 6)) || - (!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "http://", 7))) { - xmlIOErr(XML_IO_NETWORK_ATTEMPT, (const char *) resource); - if (resource != (xmlChar *) URL) - xmlFree(resource); - return(NULL); - } - } - input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt); - if (resource != (xmlChar *) URL) - xmlFree(resource); - return(input); -} - -#define bottom_xmlIO -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/xmlcatalog.c b/ThirdParty/libxml2/vtklibxml2/xmlcatalog.c deleted file mode 100644 index d7d90b193ee..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlcatalog.c +++ /dev/null @@ -1,617 +0,0 @@ -/* - * xmlcatalog.c : a small utility program to handle XML catalogs - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#include "libxml.h" - -#include <string.h> -#include <stdio.h> -#include <stdarg.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#ifdef HAVE_LIBREADLINE -#include <readline/readline.h> -#ifdef HAVE_LIBHISTORY -#include <readline/history.h> -#endif -#endif - -#include <libxml/xmlmemory.h> -#include <libxml/uri.h> -#include <libxml/catalog.h> -#include <libxml/parser.h> -#include <libxml/globals.h> - -#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) -static int shell = 0; -static int sgml = 0; -static int noout = 0; -static int create = 0; -static int add = 0; -static int del = 0; -static int convert = 0; -static int no_super_update = 0; -static int verbose = 0; -static char *filename = NULL; - - -#ifndef XML_SGML_DEFAULT_CATALOG -#define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog" -#endif - -/************************************************************************ - * * - * Shell Interface * - * * - ************************************************************************/ -/** - * xmlShellReadline: - * @prompt: the prompt value - * - * Read a string - * - * Returns a pointer to it or NULL on EOF the caller is expected to - * free the returned string. - */ -static char * -xmlShellReadline(const char *prompt) { -#ifdef HAVE_LIBREADLINE - char *line_read; - - /* Get a line from the user. */ - line_read = readline (prompt); - - /* If the line has any text in it, save it on the history. */ - if (line_read && *line_read) - add_history (line_read); - - return (line_read); -#else - char line_read[501]; - char *ret; - int len; - - if (prompt != NULL) - fprintf(stdout, "%s", prompt); - if (!fgets(line_read, 500, stdin)) - return(NULL); - line_read[500] = 0; - len = strlen(line_read); - ret = (char *) malloc(len + 1); - if (ret != NULL) { - memcpy (ret, line_read, len + 1); - } - return(ret); -#endif -} - -static void usershell(void) { - char *cmdline = NULL, *cur; - int nbargs; - char command[100]; - char arg[400]; - char *argv[20]; - int i, ret; - xmlChar *ans; - - while (1) { - cmdline = xmlShellReadline("> "); - if (cmdline == NULL) - return; - - /* - * Parse the command itself - */ - cur = cmdline; - nbargs = 0; - while ((*cur == ' ') || (*cur == '\t')) cur++; - i = 0; - while ((*cur != ' ') && (*cur != '\t') && - (*cur != '\n') && (*cur != '\r')) { - if (*cur == 0) - break; - command[i++] = *cur++; - } - command[i] = 0; - if (i == 0) { - free(cmdline); - continue; - } - nbargs++; - - /* - * Parse the argument string - */ - memset(arg, 0, sizeof(arg)); - while ((*cur == ' ') || (*cur == '\t')) cur++; - i = 0; - while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) { - if (*cur == 0) - break; - arg[i++] = *cur++; - } - arg[i] = 0; - if (i != 0) - nbargs++; - - /* - * Parse the arguments - */ - i = 0; - nbargs = 0; - cur = arg; - memset(argv, 0, sizeof(argv)); - while (*cur != 0) { - while ((*cur == ' ') || (*cur == '\t')) cur++; - if (*cur == '\'') { - cur++; - argv[i] = cur; - while ((*cur != 0) && (*cur != '\'')) cur++; - if (*cur == '\'') { - *cur = 0; - nbargs++; - i++; - cur++; - } - } else if (*cur == '"') { - cur++; - argv[i] = cur; - while ((*cur != 0) && (*cur != '"')) cur++; - if (*cur == '"') { - *cur = 0; - nbargs++; - i++; - cur++; - } - } else { - argv[i] = cur; - while ((*cur != 0) && (*cur != ' ') && (*cur != '\t')) - cur++; - *cur = 0; - nbargs++; - i++; - cur++; - } - } - - /* - * start interpreting the command - */ - if (!strcmp(command, "exit")) - break; - if (!strcmp(command, "quit")) - break; - if (!strcmp(command, "bye")) - break; - if (!strcmp(command, "public")) { - if (nbargs != 1) { - printf("public requires 1 arguments\n"); - } else { - ans = xmlCatalogResolvePublic((const xmlChar *) argv[0]); - if (ans == NULL) { - printf("No entry for PUBLIC %s\n", argv[0]); - } else { - printf("%s\n", (char *) ans); - xmlFree(ans); - } - } - } else if (!strcmp(command, "system")) { - if (nbargs != 1) { - printf("system requires 1 arguments\n"); - } else { - ans = xmlCatalogResolveSystem((const xmlChar *) argv[0]); - if (ans == NULL) { - printf("No entry for SYSTEM %s\n", argv[0]); - } else { - printf("%s\n", (char *) ans); - xmlFree(ans); - } - } - } else if (!strcmp(command, "add")) { - if (sgml) { - if ((nbargs != 3) && (nbargs != 2)) { - printf("add requires 2 or 3 arguments\n"); - } else { - if (argv[2] == NULL) - ret = xmlCatalogAdd(BAD_CAST argv[0], NULL, - BAD_CAST argv[1]); - else - ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1], - BAD_CAST argv[2]); - if (ret != 0) - printf("add command failed\n"); - } - } else { - if ((nbargs != 3) && (nbargs != 2)) { - printf("add requires 2 or 3 arguments\n"); - } else { - if (argv[2] == NULL) - ret = xmlCatalogAdd(BAD_CAST argv[0], NULL, - BAD_CAST argv[1]); - else - ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1], - BAD_CAST argv[2]); - if (ret != 0) - printf("add command failed\n"); - } - } - } else if (!strcmp(command, "del")) { - if (nbargs != 1) { - printf("del requires 1\n"); - } else { - ret = xmlCatalogRemove(BAD_CAST argv[0]); - if (ret <= 0) - printf("del command failed\n"); - - } - } else if (!strcmp(command, "resolve")) { - if (nbargs != 2) { - printf("resolve requires 2 arguments\n"); - } else { - ans = xmlCatalogResolve(BAD_CAST argv[0], - BAD_CAST argv[1]); - if (ans == NULL) { - printf("Resolver failed to find an answer\n"); - } else { - printf("%s\n", (char *) ans); - xmlFree(ans); - } - } - } else if (!strcmp(command, "dump")) { - if (nbargs != 0) { - printf("dump has no arguments\n"); - } else { - xmlCatalogDump(stdout); - } - } else if (!strcmp(command, "debug")) { - if (nbargs != 0) { - printf("debug has no arguments\n"); - } else { - verbose++; - xmlCatalogSetDebug(verbose); - } - } else if (!strcmp(command, "quiet")) { - if (nbargs != 0) { - printf("quiet has no arguments\n"); - } else { - if (verbose > 0) - verbose--; - xmlCatalogSetDebug(verbose); - } - } else { - if (strcmp(command, "help")) { - printf("Unrecognized command %s\n", command); - } - printf("Commands available:\n"); - printf("\tpublic PublicID: make a PUBLIC identifier lookup\n"); - printf("\tsystem SystemID: make a SYSTEM identifier lookup\n"); - printf("\tresolve PublicID SystemID: do a full resolver lookup\n"); - printf("\tadd 'type' 'orig' 'replace' : add an entry\n"); - printf("\tdel 'values' : remove values\n"); - printf("\tdump: print the current catalog state\n"); - printf("\tdebug: increase the verbosity level\n"); - printf("\tquiet: decrease the verbosity level\n"); - printf("\texit: quit the shell\n"); - } - free(cmdline); /* not xmlFree here ! */ - } -} - -/************************************************************************ - * * - * Main * - * * - ************************************************************************/ -static void usage(const char *name) { - /* split into 2 printf's to avoid overly long string (gcc warning) */ - printf("\ -Usage : %s [options] catalogfile entities...\n\ -\tParse the catalog file and query it for the entities\n\ -\t--sgml : handle SGML Super catalogs for --add and --del\n\ -\t--shell : run a shell allowing interactive queries\n\ -\t--create : create a new catalog\n\ -\t--add 'type' 'orig' 'replace' : add an XML entry\n\ -\t--add 'entry' : add an SGML entry\n", name); - printf("\ -\t--del 'values' : remove values\n\ -\t--noout: avoid dumping the result on stdout\n\ -\t used with --add or --del, it saves the catalog changes\n\ -\t and with --sgml it automatically updates the super catalog\n\ -\t--no-super-update: do not update the SGML super catalog\n\ -\t-v --verbose : provide debug informations\n"); -} -int main(int argc, char **argv) { - int i; - int ret; - int exit_value = 0; - - - if (argc <= 1) { - usage(argv[0]); - return(1); - } - - LIBXML_TEST_VERSION - for (i = 1; i < argc ; i++) { - if (!strcmp(argv[i], "-")) - break; - - if (argv[i][0] != '-') - break; - if ((!strcmp(argv[i], "-verbose")) || - (!strcmp(argv[i], "-v")) || - (!strcmp(argv[i], "--verbose"))) { - verbose++; - xmlCatalogSetDebug(verbose); - } else if ((!strcmp(argv[i], "-noout")) || - (!strcmp(argv[i], "--noout"))) { - noout = 1; - } else if ((!strcmp(argv[i], "-shell")) || - (!strcmp(argv[i], "--shell"))) { - shell++; - noout = 1; - } else if ((!strcmp(argv[i], "-sgml")) || - (!strcmp(argv[i], "--sgml"))) { - sgml++; - } else if ((!strcmp(argv[i], "-create")) || - (!strcmp(argv[i], "--create"))) { - create++; - } else if ((!strcmp(argv[i], "-convert")) || - (!strcmp(argv[i], "--convert"))) { - convert++; - } else if ((!strcmp(argv[i], "-no-super-update")) || - (!strcmp(argv[i], "--no-super-update"))) { - no_super_update++; - } else if ((!strcmp(argv[i], "-add")) || - (!strcmp(argv[i], "--add"))) { - if (sgml) - i += 2; - else - i += 3; - add++; - } else if ((!strcmp(argv[i], "-del")) || - (!strcmp(argv[i], "--del"))) { - i += 1; - del++; - } else { - fprintf(stderr, "Unknown option %s\n", argv[i]); - usage(argv[0]); - return(1); - } - } - - for (i = 1; i < argc; i++) { - if ((!strcmp(argv[i], "-add")) || - (!strcmp(argv[i], "--add"))) { - if (sgml) - i += 2; - else - i += 3; - continue; - } else if ((!strcmp(argv[i], "-del")) || - (!strcmp(argv[i], "--del"))) { - i += 1; - - /* No catalog entry specified */ - if (i == argc || (sgml && i + 1 == argc)) { - fprintf(stderr, "No catalog entry specified to remove from\n"); - usage (argv[0]); - return(1); - } - - continue; - } else if (argv[i][0] == '-') - continue; - filename = argv[i]; - ret = xmlLoadCatalog(argv[i]); - if ((ret < 0) && (create)) { - xmlCatalogAdd(BAD_CAST "catalog", BAD_CAST argv[i], NULL); - } - break; - } - - if (convert) - ret = xmlCatalogConvert(); - - if ((add) || (del)) { - for (i = 1; i < argc ; i++) { - if (!strcmp(argv[i], "-")) - break; - - if (argv[i][0] != '-') - continue; - if (strcmp(argv[i], "-add") && strcmp(argv[i], "--add") && - strcmp(argv[i], "-del") && strcmp(argv[i], "--del")) - continue; - - if (sgml) { - /* - * Maintenance of SGML catalogs. - */ - xmlCatalogPtr catal = NULL; - xmlCatalogPtr super = NULL; - - catal = xmlLoadSGMLSuperCatalog(argv[i + 1]); - - if ((!strcmp(argv[i], "-add")) || - (!strcmp(argv[i], "--add"))) { - if (catal == NULL) - catal = xmlNewCatalog(1); - xmlACatalogAdd(catal, BAD_CAST "CATALOG", - BAD_CAST argv[i + 2], NULL); - - if (!no_super_update) { - super = xmlLoadSGMLSuperCatalog(XML_SGML_DEFAULT_CATALOG); - if (super == NULL) - super = xmlNewCatalog(1); - - xmlACatalogAdd(super, BAD_CAST "CATALOG", - BAD_CAST argv[i + 1], NULL); - } - } else { - if (catal != NULL) - ret = xmlACatalogRemove(catal, BAD_CAST argv[i + 2]); - else - ret = -1; - if (ret < 0) { - fprintf(stderr, "Failed to remove entry from %s\n", - argv[i + 1]); - exit_value = 1; - } - if ((!no_super_update) && (noout) && (catal != NULL) && - (xmlCatalogIsEmpty(catal))) { - super = xmlLoadSGMLSuperCatalog( - XML_SGML_DEFAULT_CATALOG); - if (super != NULL) { - ret = xmlACatalogRemove(super, - BAD_CAST argv[i + 1]); - if (ret < 0) { - fprintf(stderr, - "Failed to remove entry from %s\n", - XML_SGML_DEFAULT_CATALOG); - exit_value = 1; - } - } - } - } - if (noout) { - FILE *out; - - if (xmlCatalogIsEmpty(catal)) { - remove(argv[i + 1]); - } else { - out = fopen(argv[i + 1], "w"); - if (out == NULL) { - fprintf(stderr, "could not open %s for saving\n", - argv[i + 1]); - exit_value = 2; - noout = 0; - } else { - xmlACatalogDump(catal, out); - fclose(out); - } - } - if (!no_super_update && super != NULL) { - if (xmlCatalogIsEmpty(super)) { - remove(XML_SGML_DEFAULT_CATALOG); - } else { - out = fopen(XML_SGML_DEFAULT_CATALOG, "w"); - if (out == NULL) { - fprintf(stderr, - "could not open %s for saving\n", - XML_SGML_DEFAULT_CATALOG); - exit_value = 2; - noout = 0; - } else { - - xmlACatalogDump(super, out); - fclose(out); - } - } - } - } else { - xmlACatalogDump(catal, stdout); - } - i += 2; - } else { - if ((!strcmp(argv[i], "-add")) || - (!strcmp(argv[i], "--add"))) { - if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0)) - ret = xmlCatalogAdd(BAD_CAST argv[i + 1], NULL, - BAD_CAST argv[i + 2]); - else - ret = xmlCatalogAdd(BAD_CAST argv[i + 1], - BAD_CAST argv[i + 2], - BAD_CAST argv[i + 3]); - if (ret != 0) { - printf("add command failed\n"); - exit_value = 3; - } - i += 3; - } else if ((!strcmp(argv[i], "-del")) || - (!strcmp(argv[i], "--del"))) { - ret = xmlCatalogRemove(BAD_CAST argv[i + 1]); - if (ret < 0) { - fprintf(stderr, "Failed to remove entry %s\n", - argv[i + 1]); - exit_value = 1; - } - i += 1; - } - } - } - - } else if (shell) { - usershell(); - } else { - for (i++; i < argc; i++) { - xmlURIPtr uri; - xmlChar *ans; - - uri = xmlParseURI(argv[i]); - if (uri == NULL) { - ans = xmlCatalogResolvePublic((const xmlChar *) argv[i]); - if (ans == NULL) { - printf("No entry for PUBLIC %s\n", argv[i]); - exit_value = 4; - } else { - printf("%s\n", (char *) ans); - xmlFree(ans); - } - } else { - xmlFreeURI(uri); - ans = xmlCatalogResolveSystem((const xmlChar *) argv[i]); - if (ans == NULL) { - printf("No entry for SYSTEM %s\n", argv[i]); - ans = xmlCatalogResolveURI ((const xmlChar *) argv[i]); - if (ans == NULL) { - printf ("No entry for URI %s\n", argv[i]); - exit_value = 4; - } else { - printf("%s\n", (char *) ans); - xmlFree (ans); - } - } else { - printf("%s\n", (char *) ans); - xmlFree(ans); - } - } - } - } - if ((!sgml) && ((add) || (del) || (create) || (convert))) { - if (noout && filename && *filename) { - FILE *out; - - out = fopen(filename, "w"); - if (out == NULL) { - fprintf(stderr, "could not open %s for saving\n", filename); - exit_value = 2; - noout = 0; - } else { - xmlCatalogDump(out); - } - } else { - xmlCatalogDump(stdout); - } - } - - /* - * Cleanup and check for memory leaks - */ - xmlCleanupParser(); - xmlMemoryDump(); - return(exit_value); -} -#else -int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { - fprintf(stderr, "libxml was not compiled with catalog and output support\n"); - return(1); -} -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/xmllint.c b/ThirdParty/libxml2/vtklibxml2/xmllint.c deleted file mode 100644 index 945e91fe5cc..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmllint.c +++ /dev/null @@ -1,3541 +0,0 @@ -/* - * xmllint.c : a small tester program for XML input. - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#include "libxml.h" - -#include <string.h> -#include <stdarg.h> -#include <assert.h> - -#if defined (_WIN32) && !defined(__CYGWIN__) -#if defined (_MSC_VER) || defined(__BORLANDC__) -#include <winsock2.h> -#pragma comment(lib, "ws2_32.lib") -#define gettimeofday(p1,p2) -#endif /* _MSC_VER */ -#endif /* _WIN32 */ - -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_TIME_H -#include <time.h> -#endif - -#ifdef __MINGW32__ -#define _WINSOCKAPI_ -#include <wsockcompat.h> -#include <winsock2.h> -#undef XML_SOCKLEN_T -#define XML_SOCKLEN_T unsigned int -#endif - -#ifdef HAVE_SYS_TIMEB_H -#include <sys/timeb.h> -#endif - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_SYS_MMAN_H -#include <sys/mman.h> -/* seems needed for Solaris */ -#ifndef MAP_FAILED -#define MAP_FAILED ((void *) -1) -#endif -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_LIBREADLINE -#include <readline/readline.h> -#ifdef HAVE_LIBHISTORY -#include <readline/history.h> -#endif -#endif - -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/HTMLparser.h> -#include <libxml/HTMLtree.h> -#include <libxml/tree.h> -#include <libxml/xpath.h> -#include <libxml/debugXML.h> -#include <libxml/xmlerror.h> -#ifdef LIBXML_XINCLUDE_ENABLED -#include <libxml/xinclude.h> -#endif -#ifdef LIBXML_CATALOG_ENABLED -#include <libxml/catalog.h> -#endif -#include <libxml/globals.h> -#include <libxml/xmlreader.h> -#ifdef LIBXML_SCHEMATRON_ENABLED -#include <libxml/schematron.h> -#endif -#ifdef LIBXML_SCHEMAS_ENABLED -#include <libxml/relaxng.h> -#include <libxml/xmlschemas.h> -#endif -#ifdef LIBXML_PATTERN_ENABLED -#include <libxml/pattern.h> -#endif -#ifdef LIBXML_C14N_ENABLED -#include <libxml/c14n.h> -#endif -#ifdef LIBXML_OUTPUT_ENABLED -#include <libxml/xmlsave.h> -#endif - -#ifndef XML_XML_DEFAULT_CATALOG -#define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog" -#endif - -typedef enum { - XMLLINT_RETURN_OK = 0, /* No error */ - XMLLINT_ERR_UNCLASS, /* Unclassified */ - XMLLINT_ERR_DTD, /* Error in DTD */ - XMLLINT_ERR_VALID, /* Validation error */ - XMLLINT_ERR_RDFILE, /* CtxtReadFile error */ - XMLLINT_ERR_SCHEMACOMP, /* Schema compilation */ - XMLLINT_ERR_OUT, /* Error writing output */ - XMLLINT_ERR_SCHEMAPAT, /* Error in schema pattern */ - XMLLINT_ERR_RDREGIS, /* Error in Reader registration */ - XMLLINT_ERR_MEM /* Out of memory error */ -} xmllintReturnCode; -#ifdef LIBXML_DEBUG_ENABLED -static int shell = 0; -static int debugent = 0; -#endif -static int debug = 0; -static int maxmem = 0; -#ifdef LIBXML_TREE_ENABLED -static int copy = 0; -#endif /* LIBXML_TREE_ENABLED */ -static int recovery = 0; -static int noent = 0; -static int noblanks = 0; -static int noout = 0; -static int nowrap = 0; -#ifdef LIBXML_OUTPUT_ENABLED -static int format = 0; -static const char *output = NULL; -static int compress = 0; -static int oldout = 0; -#endif /* LIBXML_OUTPUT_ENABLED */ -#ifdef LIBXML_VALID_ENABLED -static int valid = 0; -static int postvalid = 0; -static char * dtdvalid = NULL; -static char * dtdvalidfpi = NULL; -#endif -#ifdef LIBXML_SCHEMAS_ENABLED -static char * relaxng = NULL; -static xmlRelaxNGPtr relaxngschemas = NULL; -static char * schema = NULL; -static xmlSchemaPtr wxschemas = NULL; -#endif -#ifdef LIBXML_SCHEMATRON_ENABLED -static char * schematron = NULL; -static xmlSchematronPtr wxschematron = NULL; -#endif -static int repeat = 0; -static int insert = 0; -#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED) -static int html = 0; -static int xmlout = 0; -#endif -static int htmlout = 0; -#ifdef LIBXML_PUSH_ENABLED -static int push = 0; -#endif /* LIBXML_PUSH_ENABLED */ -#ifdef HAVE_SYS_MMAN_H -static int memory = 0; -#endif -static int testIO = 0; -static char *encoding = NULL; -#ifdef LIBXML_XINCLUDE_ENABLED -static int xinclude = 0; -#endif -static int dtdattrs = 0; -static int loaddtd = 0; -static xmllintReturnCode progresult = XMLLINT_RETURN_OK; -static int timing = 0; -static int generate = 0; -static int dropdtd = 0; -#ifdef LIBXML_CATALOG_ENABLED -static int catalogs = 0; -static int nocatalogs = 0; -#endif -#ifdef LIBXML_C14N_ENABLED -static int canonical = 0; -static int exc_canonical = 0; -#endif -#ifdef LIBXML_READER_ENABLED -static int stream = 0; -static int walker = 0; -#endif /* LIBXML_READER_ENABLED */ -static int chkregister = 0; -static int nbregister = 0; -#ifdef LIBXML_SAX1_ENABLED -static int sax1 = 0; -#endif /* LIBXML_SAX1_ENABLED */ -#ifdef LIBXML_PATTERN_ENABLED -static const char *pattern = NULL; -static xmlPatternPtr patternc = NULL; -static xmlStreamCtxtPtr patstream = NULL; -#endif -static int options = XML_PARSE_COMPACT; -static int sax = 0; - -/************************************************************************ - * * - * Entity loading control and customization. * - * * - ************************************************************************/ -#define MAX_PATHS 64 -static xmlChar *paths[MAX_PATHS + 1]; -static int nbpaths = 0; -static int load_trace = 0; - -static -void parsePath(const xmlChar *path) { - const xmlChar *cur; - - if (path == NULL) - return; - while (*path != 0) { - if (nbpaths >= MAX_PATHS) { - fprintf(stderr, "MAX_PATHS reached: too many paths\n"); - return; - } - cur = path; - while ((*cur == ' ') || (*cur == ':')) - cur++; - path = cur; - while ((*cur != 0) && (*cur != ' ') && (*cur != ':')) - cur++; - if (cur != path) { - paths[nbpaths] = xmlStrndup(path, cur - path); - if (paths[nbpaths] != NULL) - nbpaths++; - path = cur; - } - } -} - -static xmlExternalEntityLoader defaultEntityLoader = NULL; - -static xmlParserInputPtr -xmllintExternalEntityLoader(const char *URL, const char *ID, - xmlParserCtxtPtr ctxt) { - xmlParserInputPtr ret; - warningSAXFunc warning = NULL; - errorSAXFunc err = NULL; - - int i; - const char *lastsegment = URL; - const char *iter = URL; - - if (nbpaths > 0) { - while (*iter != 0) { - if (*iter == '/') - lastsegment = iter + 1; - iter++; - } - } - - if ((ctxt != NULL) && (ctxt->sax != NULL)) { - warning = ctxt->sax->warning; - err = ctxt->sax->error; - ctxt->sax->warning = NULL; - ctxt->sax->error = NULL; - } - - if (defaultEntityLoader != NULL) { - ret = defaultEntityLoader(URL, ID, ctxt); - if (ret != NULL) { - if (warning != NULL) - ctxt->sax->warning = warning; - if (err != NULL) - ctxt->sax->error = err; - if (load_trace) { - fprintf \ - (stderr, - "Loaded URL=\"%s\" ID=\"%s\"\n", - URL ? URL : "(null)", - ID ? ID : "(null)"); - } - return(ret); - } - } - for (i = 0;i < nbpaths;i++) { - xmlChar *newURL; - - newURL = xmlStrdup((const xmlChar *) paths[i]); - newURL = xmlStrcat(newURL, (const xmlChar *) "/"); - newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment); - if (newURL != NULL) { - ret = defaultEntityLoader((const char *)newURL, ID, ctxt); - if (ret != NULL) { - if (warning != NULL) - ctxt->sax->warning = warning; - if (err != NULL) - ctxt->sax->error = err; - if (load_trace) { - fprintf \ - (stderr, - "Loaded URL=\"%s\" ID=\"%s\"\n", - newURL, - ID ? ID : "(null)"); - } - xmlFree(newURL); - return(ret); - } - xmlFree(newURL); - } - } - if (err != NULL) - ctxt->sax->error = err; - if (warning != NULL) { - ctxt->sax->warning = warning; - if (URL != NULL) - warning(ctxt, "failed to load external entity \"%s\"\n", URL); - else if (ID != NULL) - warning(ctxt, "failed to load external entity \"%s\"\n", ID); - } - return(NULL); -} -/************************************************************************ - * * - * Memory allocation consumption debugging * - * * - ************************************************************************/ - -static void -OOM(void) -{ - fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem); - progresult = XMLLINT_ERR_MEM; -} - -static void -myFreeFunc(void *mem) -{ - xmlMemFree(mem); -} -static void * -myMallocFunc(size_t size) -{ - void *ret; - - ret = xmlMemMalloc(size); - if (ret != NULL) { - if (xmlMemUsed() > maxmem) { - OOM(); - xmlMemFree(ret); - return (NULL); - } - } - return (ret); -} -static void * -myReallocFunc(void *mem, size_t size) -{ - void *ret; - - ret = xmlMemRealloc(mem, size); - if (ret != NULL) { - if (xmlMemUsed() > maxmem) { - OOM(); - xmlMemFree(ret); - return (NULL); - } - } - return (ret); -} -static char * -myStrdupFunc(const char *str) -{ - char *ret; - - ret = xmlMemoryStrdup(str); - if (ret != NULL) { - if (xmlMemUsed() > maxmem) { - OOM(); - xmlFree(ret); - return (NULL); - } - } - return (ret); -} -/************************************************************************ - * * - * Internal timing routines to remove the necessity to have * - * unix-specific function calls. * - * * - ************************************************************************/ - -#ifndef HAVE_GETTIMEOFDAY -#ifdef HAVE_SYS_TIMEB_H -#ifdef HAVE_SYS_TIME_H -#ifdef HAVE_FTIME - -static int -my_gettimeofday(struct timeval *tvp, void *tzp) -{ - struct timeb timebuffer; - - ftime(&timebuffer); - if (tvp) { - tvp->tv_sec = timebuffer.time; - tvp->tv_usec = timebuffer.millitm * 1000L; - } - return (0); -} -#define HAVE_GETTIMEOFDAY 1 -#define gettimeofday my_gettimeofday - -#endif /* HAVE_FTIME */ -#endif /* HAVE_SYS_TIME_H */ -#endif /* HAVE_SYS_TIMEB_H */ -#endif /* !HAVE_GETTIMEOFDAY */ - -#if defined(HAVE_GETTIMEOFDAY) -static struct timeval begin, end; - -/* - * startTimer: call where you want to start timing - */ -static void -startTimer(void) -{ - gettimeofday(&begin, NULL); -} - -/* - * endTimer: call where you want to stop timing and to print out a - * message about the timing performed; format is a printf - * type argument - */ -static void XMLCDECL -endTimer(const char *fmt, ...) -{ - long msec; - va_list ap; - - gettimeofday(&end, NULL); - msec = end.tv_sec - begin.tv_sec; - msec *= 1000; - msec += (end.tv_usec - begin.tv_usec) / 1000; - -#ifndef HAVE_STDARG_H -#error "endTimer required stdarg functions" -#endif - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - fprintf(stderr, " took %ld ms\n", msec); -} -#elif defined(HAVE_TIME_H) -/* - * No gettimeofday function, so we have to make do with calling clock. - * This is obviously less accurate, but there's little we can do about - * that. - */ -#ifndef CLOCKS_PER_SEC -#define CLOCKS_PER_SEC 100 -#endif - -static clock_t begin, end; -static void -startTimer(void) -{ - begin = clock(); -} -static void XMLCDECL -endTimer(const char *fmt, ...) -{ - long msec; - va_list ap; - - end = clock(); - msec = ((end - begin) * 1000) / CLOCKS_PER_SEC; - -#ifndef HAVE_STDARG_H -#error "endTimer required stdarg functions" -#endif - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - fprintf(stderr, " took %ld ms\n", msec); -} -#else - -/* - * We don't have a gettimeofday or time.h, so we just don't do timing - */ -static void -startTimer(void) -{ - /* - * Do nothing - */ -} -static void XMLCDECL -endTimer(char *format, ...) -{ - /* - * We cannot do anything because we don't have a timing function - */ -#ifdef HAVE_STDARG_H - va_start(ap, format); - vfprintf(stderr, format, ap); - va_end(ap); - fprintf(stderr, " was not timed\n", msec); -#else - /* We don't have gettimeofday, time or stdarg.h, what crazy world is - * this ?! - */ -#endif -} -#endif -/************************************************************************ - * * - * HTML output * - * * - ************************************************************************/ -static char buffer[50000]; - -static void -xmlHTMLEncodeSend(void) { - char *result; - - result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer); - if (result) { - xmlGenericError(xmlGenericErrorContext, "%s", result); - xmlFree(result); - } - buffer[0] = 0; -} - -/** - * xmlHTMLPrintFileInfo: - * @input: an xmlParserInputPtr input - * - * Displays the associated file and line informations for the current input - */ - -static void -xmlHTMLPrintFileInfo(xmlParserInputPtr input) { - int len; - xmlGenericError(xmlGenericErrorContext, "<p>"); - - len = strlen(buffer); - if (input != NULL) { - if (input->filename) { - snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename, - input->line); - } else { - snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line); - } - } - xmlHTMLEncodeSend(); -} - -/** - * xmlHTMLPrintFileContext: - * @input: an xmlParserInputPtr input - * - * Displays current context within the input content for error tracking - */ - -static void -xmlHTMLPrintFileContext(xmlParserInputPtr input) { - const xmlChar *cur, *base; - int len; - int n; - - if (input == NULL) return; - xmlGenericError(xmlGenericErrorContext, "<pre>\n"); - cur = input->cur; - base = input->base; - while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) { - cur--; - } - n = 0; - while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r')) - cur--; - if ((*cur == '\n') || (*cur == '\r')) cur++; - base = cur; - n = 0; - while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) { - len = strlen(buffer); - snprintf(&buffer[len], sizeof(buffer) - len, "%c", - (unsigned char) *cur++); - n++; - } - len = strlen(buffer); - snprintf(&buffer[len], sizeof(buffer) - len, "\n"); - cur = input->cur; - while ((*cur == '\n') || (*cur == '\r')) - cur--; - n = 0; - while ((cur != base) && (n++ < 80)) { - len = strlen(buffer); - snprintf(&buffer[len], sizeof(buffer) - len, " "); - base++; - } - len = strlen(buffer); - snprintf(&buffer[len], sizeof(buffer) - len, "^\n"); - xmlHTMLEncodeSend(); - xmlGenericError(xmlGenericErrorContext, "</pre>"); -} - -/** - * xmlHTMLError: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format an error messages, gives file, line, position and - * extra parameters. - */ -static void XMLCDECL -xmlHTMLError(void *ctx, const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr input; - va_list args; - int len; - - buffer[0] = 0; - input = ctxt->input; - if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { - input = ctxt->inputTab[ctxt->inputNr - 2]; - } - - xmlHTMLPrintFileInfo(input); - - xmlGenericError(xmlGenericErrorContext, "<b>error</b>: "); - va_start(args, msg); - len = strlen(buffer); - vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args); - va_end(args); - xmlHTMLEncodeSend(); - xmlGenericError(xmlGenericErrorContext, "</p>\n"); - - xmlHTMLPrintFileContext(input); - xmlHTMLEncodeSend(); -} - -/** - * xmlHTMLWarning: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a warning messages, gives file, line, position and - * extra parameters. - */ -static void XMLCDECL -xmlHTMLWarning(void *ctx, const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr input; - va_list args; - int len; - - buffer[0] = 0; - input = ctxt->input; - if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { - input = ctxt->inputTab[ctxt->inputNr - 2]; - } - - - xmlHTMLPrintFileInfo(input); - - xmlGenericError(xmlGenericErrorContext, "<b>warning</b>: "); - va_start(args, msg); - len = strlen(buffer); - vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args); - va_end(args); - xmlHTMLEncodeSend(); - xmlGenericError(xmlGenericErrorContext, "</p>\n"); - - xmlHTMLPrintFileContext(input); - xmlHTMLEncodeSend(); -} - -/** - * xmlHTMLValidityError: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format an validity error messages, gives file, - * line, position and extra parameters. - */ -static void XMLCDECL -xmlHTMLValidityError(void *ctx, const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr input; - va_list args; - int len; - - buffer[0] = 0; - input = ctxt->input; - if ((input->filename == NULL) && (ctxt->inputNr > 1)) - input = ctxt->inputTab[ctxt->inputNr - 2]; - - xmlHTMLPrintFileInfo(input); - - xmlGenericError(xmlGenericErrorContext, "<b>validity error</b>: "); - len = strlen(buffer); - va_start(args, msg); - vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args); - va_end(args); - xmlHTMLEncodeSend(); - xmlGenericError(xmlGenericErrorContext, "</p>\n"); - - xmlHTMLPrintFileContext(input); - xmlHTMLEncodeSend(); - progresult = XMLLINT_ERR_VALID; -} - -/** - * xmlHTMLValidityWarning: - * @ctx: an XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a validity warning messages, gives file, line, - * position and extra parameters. - */ -static void XMLCDECL -xmlHTMLValidityWarning(void *ctx, const char *msg, ...) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlParserInputPtr input; - va_list args; - int len; - - buffer[0] = 0; - input = ctxt->input; - if ((input->filename == NULL) && (ctxt->inputNr > 1)) - input = ctxt->inputTab[ctxt->inputNr - 2]; - - xmlHTMLPrintFileInfo(input); - - xmlGenericError(xmlGenericErrorContext, "<b>validity warning</b>: "); - va_start(args, msg); - len = strlen(buffer); - vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args); - va_end(args); - xmlHTMLEncodeSend(); - xmlGenericError(xmlGenericErrorContext, "</p>\n"); - - xmlHTMLPrintFileContext(input); - xmlHTMLEncodeSend(); -} - -/************************************************************************ - * * - * Shell Interface * - * * - ************************************************************************/ -#ifdef LIBXML_DEBUG_ENABLED -#ifdef LIBXML_XPATH_ENABLED -/** - * xmlShellReadline: - * @prompt: the prompt value - * - * Read a string - * - * Returns a pointer to it or NULL on EOF the caller is expected to - * free the returned string. - */ -static char * -xmlShellReadline(char *prompt) { -#ifdef HAVE_LIBREADLINE - char *line_read; - - /* Get a line from the user. */ - line_read = readline (prompt); - - /* If the line has any text in it, save it on the history. */ - if (line_read && *line_read) - add_history (line_read); - - return (line_read); -#else - char line_read[501]; - char *ret; - int len; - - if (prompt != NULL) - fprintf(stdout, "%s", prompt); - if (!fgets(line_read, 500, stdin)) - return(NULL); - line_read[500] = 0; - len = strlen(line_read); - ret = (char *) malloc(len + 1); - if (ret != NULL) { - memcpy (ret, line_read, len + 1); - } - return(ret); -#endif -} -#endif /* LIBXML_XPATH_ENABLED */ -#endif /* LIBXML_DEBUG_ENABLED */ - -/************************************************************************ - * * - * I/O Interfaces * - * * - ************************************************************************/ - -static int myRead(FILE *f, char * buf, int len) { - return(fread(buf, 1, len, f)); -} -static void myClose(FILE *f) { - if (f != stdin) { - fclose(f); - } -} - -/************************************************************************ - * * - * SAX based tests * - * * - ************************************************************************/ - -/* - * empty SAX block - */ -static xmlSAXHandler emptySAXHandlerStruct = { - NULL, /* internalSubset */ - NULL, /* isStandalone */ - NULL, /* hasInternalSubset */ - NULL, /* hasExternalSubset */ - NULL, /* resolveEntity */ - NULL, /* getEntity */ - NULL, /* entityDecl */ - NULL, /* notationDecl */ - NULL, /* attributeDecl */ - NULL, /* elementDecl */ - NULL, /* unparsedEntityDecl */ - NULL, /* setDocumentLocator */ - NULL, /* startDocument */ - NULL, /* endDocument */ - NULL, /* startElement */ - NULL, /* endElement */ - NULL, /* reference */ - NULL, /* characters */ - NULL, /* ignorableWhitespace */ - NULL, /* processingInstruction */ - NULL, /* comment */ - NULL, /* xmlParserWarning */ - NULL, /* xmlParserError */ - NULL, /* xmlParserError */ - NULL, /* getParameterEntity */ - NULL, /* cdataBlock; */ - NULL, /* externalSubset; */ - XML_SAX2_MAGIC, - NULL, - NULL, /* startElementNs */ - NULL, /* endElementNs */ - NULL /* xmlStructuredErrorFunc */ -}; - -static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct; -extern xmlSAXHandlerPtr debugSAXHandler; -static int callbacks; - -/** - * isStandaloneDebug: - * @ctxt: An XML parser context - * - * Is this document tagged standalone ? - * - * Returns 1 if true - */ -static int -isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (noout) - return(0); - fprintf(stdout, "SAX.isStandalone()\n"); - return(0); -} - -/** - * hasInternalSubsetDebug: - * @ctxt: An XML parser context - * - * Does this document has an internal subset - * - * Returns 1 if true - */ -static int -hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (noout) - return(0); - fprintf(stdout, "SAX.hasInternalSubset()\n"); - return(0); -} - -/** - * hasExternalSubsetDebug: - * @ctxt: An XML parser context - * - * Does this document has an external subset - * - * Returns 1 if true - */ -static int -hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (noout) - return(0); - fprintf(stdout, "SAX.hasExternalSubset()\n"); - return(0); -} - -/** - * internalSubsetDebug: - * @ctxt: An XML parser context - * - * Does this document has an internal subset - */ -static void -internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.internalSubset(%s,", name); - if (ExternalID == NULL) - fprintf(stdout, " ,"); - else - fprintf(stdout, " %s,", ExternalID); - if (SystemID == NULL) - fprintf(stdout, " )\n"); - else - fprintf(stdout, " %s)\n", SystemID); -} - -/** - * externalSubsetDebug: - * @ctxt: An XML parser context - * - * Does this document has an external subset - */ -static void -externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.externalSubset(%s,", name); - if (ExternalID == NULL) - fprintf(stdout, " ,"); - else - fprintf(stdout, " %s,", ExternalID); - if (SystemID == NULL) - fprintf(stdout, " )\n"); - else - fprintf(stdout, " %s)\n", SystemID); -} - -/** - * resolveEntityDebug: - * @ctxt: An XML parser context - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * Special entity resolver, better left to the parser, it has - * more context than the application layer. - * The default behaviour is to NOT resolve the entities, in that case - * the ENTITY_REF nodes are built in the structure (and the parameter - * values). - * - * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. - */ -static xmlParserInputPtr -resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId) -{ - callbacks++; - if (noout) - return(NULL); - /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ - - - fprintf(stdout, "SAX.resolveEntity("); - if (publicId != NULL) - fprintf(stdout, "%s", (char *)publicId); - else - fprintf(stdout, " "); - if (systemId != NULL) - fprintf(stdout, ", %s)\n", (char *)systemId); - else - fprintf(stdout, ", )\n"); - return(NULL); -} - -/** - * getEntityDebug: - * @ctxt: An XML parser context - * @name: The entity name - * - * Get an entity by name - * - * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. - */ -static xmlEntityPtr -getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) -{ - callbacks++; - if (noout) - return(NULL); - fprintf(stdout, "SAX.getEntity(%s)\n", name); - return(NULL); -} - -/** - * getParameterEntityDebug: - * @ctxt: An XML parser context - * @name: The entity name - * - * Get a parameter entity by name - * - * Returns the xmlParserInputPtr - */ -static xmlEntityPtr -getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) -{ - callbacks++; - if (noout) - return(NULL); - fprintf(stdout, "SAX.getParameterEntity(%s)\n", name); - return(NULL); -} - - -/** - * entityDeclDebug: - * @ctxt: An XML parser context - * @name: the entity name - * @type: the entity type - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @content: the entity value (without processing). - * - * An entity definition has been parsed - */ -static void -entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, - const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) -{ -const xmlChar *nullstr = BAD_CAST "(null)"; - /* not all libraries handle printing null pointers nicely */ - if (publicId == NULL) - publicId = nullstr; - if (systemId == NULL) - systemId = nullstr; - if (content == NULL) - content = (xmlChar *)nullstr; - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n", - name, type, publicId, systemId, content); -} - -/** - * attributeDeclDebug: - * @ctxt: An XML parser context - * @name: the attribute name - * @type: the attribute type - * - * An attribute definition has been parsed - */ -static void -attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem, - const xmlChar * name, int type, int def, - const xmlChar * defaultValue, xmlEnumerationPtr tree) -{ - callbacks++; - if (noout) - return; - if (defaultValue == NULL) - fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n", - elem, name, type, def); - else - fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n", - elem, name, type, def, defaultValue); - xmlFreeEnumeration(tree); -} - -/** - * elementDeclDebug: - * @ctxt: An XML parser context - * @name: the element name - * @type: the element type - * @content: the element value (without processing). - * - * An element definition has been parsed - */ -static void -elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, - xmlElementContentPtr content ATTRIBUTE_UNUSED) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n", - name, type); -} - -/** - * notationDeclDebug: - * @ctxt: An XML parser context - * @name: The name of the notation - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * - * What to do when a notation declaration has been parsed. - */ -static void -notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, - const xmlChar *publicId, const xmlChar *systemId) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n", - (char *) name, (char *) publicId, (char *) systemId); -} - -/** - * unparsedEntityDeclDebug: - * @ctxt: An XML parser context - * @name: The name of the entity - * @publicId: The public ID of the entity - * @systemId: The system ID of the entity - * @notationName: the name of the notation - * - * What to do when an unparsed entity declaration is parsed - */ -static void -unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, - const xmlChar *publicId, const xmlChar *systemId, - const xmlChar *notationName) -{ -const xmlChar *nullstr = BAD_CAST "(null)"; - - if (publicId == NULL) - publicId = nullstr; - if (systemId == NULL) - systemId = nullstr; - if (notationName == NULL) - notationName = nullstr; - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n", - (char *) name, (char *) publicId, (char *) systemId, - (char *) notationName); -} - -/** - * setDocumentLocatorDebug: - * @ctxt: An XML parser context - * @loc: A SAX Locator - * - * Receive the document locator at startup, actually xmlDefaultSAXLocator - * Everything is available on the context, so this is useless in our case. - */ -static void -setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.setDocumentLocator()\n"); -} - -/** - * startDocumentDebug: - * @ctxt: An XML parser context - * - * called when the document start being processed. - */ -static void -startDocumentDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.startDocument()\n"); -} - -/** - * endDocumentDebug: - * @ctxt: An XML parser context - * - * called when the document end has been detected. - */ -static void -endDocumentDebug(void *ctx ATTRIBUTE_UNUSED) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.endDocument()\n"); -} - -/** - * startElementDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when an opening tag has been processed. - */ -static void -startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts) -{ - int i; - - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.startElement(%s", (char *) name); - if (atts != NULL) { - for (i = 0;(atts[i] != NULL);i++) { - fprintf(stdout, ", %s='", atts[i++]); - if (atts[i] != NULL) - fprintf(stdout, "%s'", atts[i]); - } - } - fprintf(stdout, ")\n"); -} - -/** - * endElementDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when the end of an element has been detected. - */ -static void -endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.endElement(%s)\n", (char *) name); -} - -/** - * charactersDebug: - * @ctxt: An XML parser context - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some chars from the parser. - * Question: how much at a time ??? - */ -static void -charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) -{ - char out[40]; - int i; - - callbacks++; - if (noout) - return; - for (i = 0;(i<len) && (i < 30);i++) - out[i] = ch[i]; - out[i] = 0; - - fprintf(stdout, "SAX.characters(%s, %d)\n", out, len); -} - -/** - * referenceDebug: - * @ctxt: An XML parser context - * @name: The entity name - * - * called when an entity reference is detected. - */ -static void -referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.reference(%s)\n", name); -} - -/** - * ignorableWhitespaceDebug: - * @ctxt: An XML parser context - * @ch: a xmlChar string - * @start: the first char in the string - * @len: the number of xmlChar - * - * receiving some ignorable whitespaces from the parser. - * Question: how much at a time ??? - */ -static void -ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) -{ - char out[40]; - int i; - - callbacks++; - if (noout) - return; - for (i = 0;(i<len) && (i < 30);i++) - out[i] = ch[i]; - out[i] = 0; - fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", out, len); -} - -/** - * processingInstructionDebug: - * @ctxt: An XML parser context - * @target: the target name - * @data: the PI data's - * @len: the number of xmlChar - * - * A processing instruction has been parsed. - */ -static void -processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target, - const xmlChar *data) -{ - callbacks++; - if (noout) - return; - if (data != NULL) - fprintf(stdout, "SAX.processingInstruction(%s, %s)\n", - (char *) target, (char *) data); - else - fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n", - (char *) target); -} - -/** - * cdataBlockDebug: - * @ctx: the user data (XML parser context) - * @value: The pcdata content - * @len: the block length - * - * called when a pcdata block has been parsed - */ -static void -cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.pcdata(%.20s, %d)\n", - (char *) value, len); -} - -/** - * commentDebug: - * @ctxt: An XML parser context - * @value: the comment content - * - * A comment has been parsed. - */ -static void -commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.comment(%s)\n", value); -} - -/** - * warningDebug: - * @ctxt: An XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a warning messages, gives file, line, position and - * extra parameters. - */ -static void XMLCDECL -warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) -{ - va_list args; - - callbacks++; - if (noout) - return; - va_start(args, msg); - fprintf(stdout, "SAX.warning: "); - vfprintf(stdout, msg, args); - va_end(args); -} - -/** - * errorDebug: - * @ctxt: An XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a error messages, gives file, line, position and - * extra parameters. - */ -static void XMLCDECL -errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) -{ - va_list args; - - callbacks++; - if (noout) - return; - va_start(args, msg); - fprintf(stdout, "SAX.error: "); - vfprintf(stdout, msg, args); - va_end(args); -} - -/** - * fatalErrorDebug: - * @ctxt: An XML parser context - * @msg: the message to display/transmit - * @...: extra parameters for the message display - * - * Display and format a fatalError messages, gives file, line, position and - * extra parameters. - */ -static void XMLCDECL -fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) -{ - va_list args; - - callbacks++; - if (noout) - return; - va_start(args, msg); - fprintf(stdout, "SAX.fatalError: "); - vfprintf(stdout, msg, args); - va_end(args); -} - -static xmlSAXHandler debugSAXHandlerStruct = { - internalSubsetDebug, - isStandaloneDebug, - hasInternalSubsetDebug, - hasExternalSubsetDebug, - resolveEntityDebug, - getEntityDebug, - entityDeclDebug, - notationDeclDebug, - attributeDeclDebug, - elementDeclDebug, - unparsedEntityDeclDebug, - setDocumentLocatorDebug, - startDocumentDebug, - endDocumentDebug, - startElementDebug, - endElementDebug, - referenceDebug, - charactersDebug, - ignorableWhitespaceDebug, - processingInstructionDebug, - commentDebug, - warningDebug, - errorDebug, - fatalErrorDebug, - getParameterEntityDebug, - cdataBlockDebug, - externalSubsetDebug, - 1, - NULL, - NULL, - NULL, - NULL -}; - -xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct; - -/* - * SAX2 specific callbacks - */ -/** - * startElementNsDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when an opening tag has been processed. - */ -static void -startElementNsDebug(void *ctx ATTRIBUTE_UNUSED, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI, - int nb_namespaces, - const xmlChar **namespaces, - int nb_attributes, - int nb_defaulted, - const xmlChar **attributes) -{ - int i; - - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.startElementNs(%s", (char *) localname); - if (prefix == NULL) - fprintf(stdout, ", NULL"); - else - fprintf(stdout, ", %s", (char *) prefix); - if (URI == NULL) - fprintf(stdout, ", NULL"); - else - fprintf(stdout, ", '%s'", (char *) URI); - fprintf(stdout, ", %d", nb_namespaces); - - if (namespaces != NULL) { - for (i = 0;i < nb_namespaces * 2;i++) { - fprintf(stdout, ", xmlns"); - if (namespaces[i] != NULL) - fprintf(stdout, ":%s", namespaces[i]); - i++; - fprintf(stdout, "='%s'", namespaces[i]); - } - } - fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted); - if (attributes != NULL) { - for (i = 0;i < nb_attributes * 5;i += 5) { - if (attributes[i + 1] != NULL) - fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]); - else - fprintf(stdout, ", %s='", attributes[i]); - fprintf(stdout, "%.4s...', %d", attributes[i + 3], - (int)(attributes[i + 4] - attributes[i + 3])); - } - } - fprintf(stdout, ")\n"); -} - -/** - * endElementDebug: - * @ctxt: An XML parser context - * @name: The element name - * - * called when the end of an element has been detected. - */ -static void -endElementNsDebug(void *ctx ATTRIBUTE_UNUSED, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI) -{ - callbacks++; - if (noout) - return; - fprintf(stdout, "SAX.endElementNs(%s", (char *) localname); - if (prefix == NULL) - fprintf(stdout, ", NULL"); - else - fprintf(stdout, ", %s", (char *) prefix); - if (URI == NULL) - fprintf(stdout, ", NULL)\n"); - else - fprintf(stdout, ", '%s')\n", (char *) URI); -} - -static xmlSAXHandler debugSAX2HandlerStruct = { - internalSubsetDebug, - isStandaloneDebug, - hasInternalSubsetDebug, - hasExternalSubsetDebug, - resolveEntityDebug, - getEntityDebug, - entityDeclDebug, - notationDeclDebug, - attributeDeclDebug, - elementDeclDebug, - unparsedEntityDeclDebug, - setDocumentLocatorDebug, - startDocumentDebug, - endDocumentDebug, - NULL, - NULL, - referenceDebug, - charactersDebug, - ignorableWhitespaceDebug, - processingInstructionDebug, - commentDebug, - warningDebug, - errorDebug, - fatalErrorDebug, - getParameterEntityDebug, - cdataBlockDebug, - externalSubsetDebug, - XML_SAX2_MAGIC, - NULL, - startElementNsDebug, - endElementNsDebug, - NULL -}; - -static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct; - -static void -testSAX(const char *filename) { - xmlSAXHandlerPtr handler; - const char *user_data = "user_data"; /* mostly for debugging */ - xmlParserInputBufferPtr buf = NULL; - xmlParserInputPtr inputStream; - xmlParserCtxtPtr ctxt = NULL; - xmlSAXHandlerPtr old_sax = NULL; - - callbacks = 0; - - if (noout) { - handler = emptySAXHandler; -#ifdef LIBXML_SAX1_ENABLED - } else if (sax1) { - handler = debugSAXHandler; -#endif - } else { - handler = debugSAX2Handler; - } - - /* - * it's not the simplest code but the most generic in term of I/O - */ - buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); - if (buf == NULL) { - goto error; - } - -#ifdef LIBXML_SCHEMAS_ENABLED - if (wxschemas != NULL) { - int ret; - xmlSchemaValidCtxtPtr vctxt; - - vctxt = xmlSchemaNewValidCtxt(wxschemas); - xmlSchemaSetValidErrors(vctxt, - (xmlSchemaValidityErrorFunc) fprintf, - (xmlSchemaValidityWarningFunc) fprintf, - stderr); - - ret = xmlSchemaValidateStream(vctxt, buf, 0, handler, - (void *)user_data); - if (repeat == 0) { - if (ret == 0) { - fprintf(stderr, "%s validates\n", filename); - } else if (ret > 0) { - fprintf(stderr, "%s fails to validate\n", filename); - progresult = XMLLINT_ERR_VALID; - } else { - fprintf(stderr, "%s validation generated an internal error\n", - filename); - progresult = XMLLINT_ERR_VALID; - } - } - xmlSchemaFreeValidCtxt(vctxt); - } else -#endif - { - /* - * Create the parser context amd hook the input - */ - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) { - xmlFreeParserInputBuffer(buf); - goto error; - } - old_sax = ctxt->sax; - ctxt->sax = handler; - ctxt->userData = (void *) user_data; - inputStream = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE); - if (inputStream == NULL) { - xmlFreeParserInputBuffer(buf); - goto error; - } - inputPush(ctxt, inputStream); - - /* do the parsing */ - xmlParseDocument(ctxt); - - if (ctxt->myDoc != NULL) { - fprintf(stderr, "SAX generated a doc !\n"); - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - } - -error: - if (ctxt != NULL) { - ctxt->sax = old_sax; - xmlFreeParserCtxt(ctxt); - } -} - -/************************************************************************ - * * - * Stream Test processing * - * * - ************************************************************************/ -#ifdef LIBXML_READER_ENABLED -static void processNode(xmlTextReaderPtr reader) { - const xmlChar *name, *value; - int type, empty; - - type = xmlTextReaderNodeType(reader); - empty = xmlTextReaderIsEmptyElement(reader); - - if (debug) { - name = xmlTextReaderConstName(reader); - if (name == NULL) - name = BAD_CAST "--"; - - value = xmlTextReaderConstValue(reader); - - - printf("%d %d %s %d %d", - xmlTextReaderDepth(reader), - type, - name, - empty, - xmlTextReaderHasValue(reader)); - if (value == NULL) - printf("\n"); - else { - printf(" %s\n", value); - } - } -#ifdef LIBXML_PATTERN_ENABLED - if (patternc) { - xmlChar *path = NULL; - int match = -1; - - if (type == XML_READER_TYPE_ELEMENT) { - /* do the check only on element start */ - match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader)); - - if (match) { - path = xmlGetNodePath(xmlTextReaderCurrentNode(reader)); - printf("Node %s matches pattern %s\n", path, pattern); - } - } - if (patstream != NULL) { - int ret; - - if (type == XML_READER_TYPE_ELEMENT) { - ret = xmlStreamPush(patstream, - xmlTextReaderConstLocalName(reader), - xmlTextReaderConstNamespaceUri(reader)); - if (ret < 0) { - fprintf(stderr, "xmlStreamPush() failure\n"); - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } else if (ret != match) { - if (path == NULL) { - path = xmlGetNodePath( - xmlTextReaderCurrentNode(reader)); - } - fprintf(stderr, - "xmlPatternMatch and xmlStreamPush disagree\n"); - fprintf(stderr, - " pattern %s node %s\n", - pattern, path); - } - - - } - if ((type == XML_READER_TYPE_END_ELEMENT) || - ((type == XML_READER_TYPE_ELEMENT) && (empty))) { - ret = xmlStreamPop(patstream); - if (ret < 0) { - fprintf(stderr, "xmlStreamPop() failure\n"); - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } - } - } - if (path != NULL) - xmlFree(path); - } -#endif -} - -static void streamFile(char *filename) { - xmlTextReaderPtr reader; - int ret; -#ifdef HAVE_SYS_MMAN_H - int fd = -1; - struct stat info; - const char *base = NULL; - xmlParserInputBufferPtr input = NULL; - - if (memory) { - if (stat(filename, &info) < 0) - return; - if ((fd = open(filename, O_RDONLY)) < 0) - return; - base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; - if (base == (void *) MAP_FAILED) - return; - - reader = xmlReaderForMemory(base, info.st_size, filename, - NULL, options); - } else -#endif - reader = xmlReaderForFile(filename, NULL, options); -#ifdef LIBXML_PATTERN_ENABLED - if (pattern != NULL) { - patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL); - if (patternc == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Pattern %s failed to compile\n", pattern); - progresult = XMLLINT_ERR_SCHEMAPAT; - pattern = NULL; - } - } - if (patternc != NULL) { - patstream = xmlPatternGetStreamCtxt(patternc); - if (patstream != NULL) { - ret = xmlStreamPush(patstream, NULL, NULL); - if (ret < 0) { - fprintf(stderr, "xmlStreamPush() failure\n"); - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } - } - } -#endif - - - if (reader != NULL) { -#ifdef LIBXML_VALID_ENABLED - if (valid) - xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1); - else -#endif /* LIBXML_VALID_ENABLED */ - xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1); -#ifdef LIBXML_SCHEMAS_ENABLED - if (relaxng != NULL) { - if ((timing) && (!repeat)) { - startTimer(); - } - ret = xmlTextReaderRelaxNGValidate(reader, relaxng); - if (ret < 0) { - xmlGenericError(xmlGenericErrorContext, - "Relax-NG schema %s failed to compile\n", relaxng); - progresult = XMLLINT_ERR_SCHEMACOMP; - relaxng = NULL; - } - if ((timing) && (!repeat)) { - endTimer("Compiling the schemas"); - } - } - if (schema != NULL) { - if ((timing) && (!repeat)) { - startTimer(); - } - ret = xmlTextReaderSchemaValidate(reader, schema); - if (ret < 0) { - xmlGenericError(xmlGenericErrorContext, - "XSD schema %s failed to compile\n", schema); - progresult = XMLLINT_ERR_SCHEMACOMP; - schema = NULL; - } - if ((timing) && (!repeat)) { - endTimer("Compiling the schemas"); - } - } -#endif - - /* - * Process all nodes in sequence - */ - if ((timing) && (!repeat)) { - startTimer(); - } - ret = xmlTextReaderRead(reader); - while (ret == 1) { - if ((debug) -#ifdef LIBXML_PATTERN_ENABLED - || (patternc) -#endif - ) - processNode(reader); - ret = xmlTextReaderRead(reader); - } - if ((timing) && (!repeat)) { -#ifdef LIBXML_SCHEMAS_ENABLED - if (relaxng != NULL) - endTimer("Parsing and validating"); - else -#endif -#ifdef LIBXML_VALID_ENABLED - if (valid) - endTimer("Parsing and validating"); - else -#endif - endTimer("Parsing"); - } - -#ifdef LIBXML_VALID_ENABLED - if (valid) { - if (xmlTextReaderIsValid(reader) != 1) { - xmlGenericError(xmlGenericErrorContext, - "Document %s does not validate\n", filename); - progresult = XMLLINT_ERR_VALID; - } - } -#endif /* LIBXML_VALID_ENABLED */ -#ifdef LIBXML_SCHEMAS_ENABLED - if ((relaxng != NULL) || (schema != NULL)) { - if (xmlTextReaderIsValid(reader) != 1) { - fprintf(stderr, "%s fails to validate\n", filename); - progresult = XMLLINT_ERR_VALID; - } else { - fprintf(stderr, "%s validates\n", filename); - } - } -#endif - /* - * Done, cleanup and status - */ - xmlFreeTextReader(reader); - if (ret != 0) { - fprintf(stderr, "%s : failed to parse\n", filename); - progresult = XMLLINT_ERR_UNCLASS; - } - } else { - fprintf(stderr, "Unable to open %s\n", filename); - progresult = XMLLINT_ERR_UNCLASS; - } -#ifdef LIBXML_PATTERN_ENABLED - if (patstream != NULL) { - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } -#endif -#ifdef HAVE_SYS_MMAN_H - if (memory) { - xmlFreeParserInputBuffer(input); - munmap((char *) base, info.st_size); - close(fd); - } -#endif -} - -static void walkDoc(xmlDocPtr doc) { - xmlTextReaderPtr reader; - int ret; - -#ifdef LIBXML_PATTERN_ENABLED - xmlNodePtr root; - const xmlChar *namespaces[22]; - int i; - xmlNsPtr ns; - - root = xmlDocGetRootElement(doc); - for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) { - namespaces[i++] = ns->href; - namespaces[i++] = ns->prefix; - } - namespaces[i++] = NULL; - namespaces[i++] = NULL; - - if (pattern != NULL) { - patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict, - 0, &namespaces[0]); - if (patternc == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Pattern %s failed to compile\n", pattern); - progresult = XMLLINT_ERR_SCHEMAPAT; - pattern = NULL; - } - } - if (patternc != NULL) { - patstream = xmlPatternGetStreamCtxt(patternc); - if (patstream != NULL) { - ret = xmlStreamPush(patstream, NULL, NULL); - if (ret < 0) { - fprintf(stderr, "xmlStreamPush() failure\n"); - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } - } - } -#endif /* LIBXML_PATTERN_ENABLED */ - reader = xmlReaderWalker(doc); - if (reader != NULL) { - if ((timing) && (!repeat)) { - startTimer(); - } - ret = xmlTextReaderRead(reader); - while (ret == 1) { - if ((debug) -#ifdef LIBXML_PATTERN_ENABLED - || (patternc) -#endif - ) - processNode(reader); - ret = xmlTextReaderRead(reader); - } - if ((timing) && (!repeat)) { - endTimer("walking through the doc"); - } - xmlFreeTextReader(reader); - if (ret != 0) { - fprintf(stderr, "failed to walk through the doc\n"); - progresult = XMLLINT_ERR_UNCLASS; - } - } else { - fprintf(stderr, "Failed to crate a reader from the document\n"); - progresult = XMLLINT_ERR_UNCLASS; - } -#ifdef LIBXML_PATTERN_ENABLED - if (patstream != NULL) { - xmlFreeStreamCtxt(patstream); - patstream = NULL; - } -#endif -} -#endif /* LIBXML_READER_ENABLED */ - -/************************************************************************ - * * - * Tree Test processing * - * * - ************************************************************************/ -static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) { - xmlDocPtr doc = NULL; -#ifdef LIBXML_TREE_ENABLED - xmlDocPtr tmp; -#endif /* LIBXML_TREE_ENABLED */ - - if ((timing) && (!repeat)) - startTimer(); - - -#ifdef LIBXML_TREE_ENABLED - if (filename == NULL) { - if (generate) { - xmlNodePtr n; - - doc = xmlNewDoc(BAD_CAST "1.0"); - n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL); - xmlNodeSetContent(n, BAD_CAST "abc"); - xmlDocSetRootElement(doc, n); - } - } -#endif /* LIBXML_TREE_ENABLED */ -#ifdef LIBXML_HTML_ENABLED -#ifdef LIBXML_PUSH_ENABLED - else if ((html) && (push)) { - FILE *f; - -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - f = fopen(filename, "rb"); -#else - f = fopen(filename, "r"); -#endif - if (f != NULL) { - int res, size = 3; - char chars[4096]; - htmlParserCtxtPtr ctxt; - - /* if (repeat) */ - size = 4096; - res = fread(chars, 1, 4, f); - if (res > 0) { - ctxt = htmlCreatePushParserCtxt(NULL, NULL, - chars, res, filename, XML_CHAR_ENCODING_NONE); - while ((res = fread(chars, 1, size, f)) > 0) { - htmlParseChunk(ctxt, chars, res, 0); - } - htmlParseChunk(ctxt, chars, 0, 1); - doc = ctxt->myDoc; - htmlFreeParserCtxt(ctxt); - } - fclose(f); - } - } -#endif /* LIBXML_PUSH_ENABLED */ -#ifdef HAVE_SYS_MMAN_H - else if ((html) && (memory)) { - int fd; - struct stat info; - const char *base; - if (stat(filename, &info) < 0) - return; - if ((fd = open(filename, O_RDONLY)) < 0) - return; - base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; - if (base == (void *) MAP_FAILED) - return; - - doc = htmlReadMemory((char *) base, info.st_size, filename, - NULL, options); - - munmap((char *) base, info.st_size); - close(fd); - } -#endif - else if (html) { - doc = htmlReadFile(filename, NULL, options); - } -#endif /* LIBXML_HTML_ENABLED */ - else { -#ifdef LIBXML_PUSH_ENABLED - /* - * build an XML tree from a string; - */ - if (push) { - FILE *f; - - /* '-' Usually means stdin -<sven@zen.org> */ - if ((filename[0] == '-') && (filename[1] == 0)) { - f = stdin; - } else { -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - f = fopen(filename, "rb"); -#else - f = fopen(filename, "r"); -#endif - } - if (f != NULL) { - int ret; - int res, size = 1024; - char chars[1024]; - xmlParserCtxtPtr ctxt; - - /* if (repeat) size = 1024; */ - res = fread(chars, 1, 4, f); - if (res > 0) { - ctxt = xmlCreatePushParserCtxt(NULL, NULL, - chars, res, filename); - xmlCtxtUseOptions(ctxt, options); - while ((res = fread(chars, 1, size, f)) > 0) { - xmlParseChunk(ctxt, chars, res, 0); - } - xmlParseChunk(ctxt, chars, 0, 1); - doc = ctxt->myDoc; - ret = ctxt->wellFormed; - xmlFreeParserCtxt(ctxt); - if (!ret) { - xmlFreeDoc(doc); - doc = NULL; - } - } - } - } else -#endif /* LIBXML_PUSH_ENABLED */ - if (testIO) { - if ((filename[0] == '-') && (filename[1] == 0)) { - doc = xmlReadFd(0, NULL, NULL, options); - } else { - FILE *f; - -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - f = fopen(filename, "rb"); -#else - f = fopen(filename, "r"); -#endif - if (f != NULL) { - if (rectxt == NULL) - doc = xmlReadIO((xmlInputReadCallback) myRead, - (xmlInputCloseCallback) myClose, f, - filename, NULL, options); - else - doc = xmlCtxtReadIO(rectxt, - (xmlInputReadCallback) myRead, - (xmlInputCloseCallback) myClose, f, - filename, NULL, options); - } else - doc = NULL; - } - } else if (htmlout) { - xmlParserCtxtPtr ctxt; - - if (rectxt == NULL) - ctxt = xmlNewParserCtxt(); - else - ctxt = rectxt; - if (ctxt == NULL) { - doc = NULL; - } else { - ctxt->sax->error = xmlHTMLError; - ctxt->sax->warning = xmlHTMLWarning; - ctxt->vctxt.error = xmlHTMLValidityError; - ctxt->vctxt.warning = xmlHTMLValidityWarning; - - doc = xmlCtxtReadFile(ctxt, filename, NULL, options); - - if (rectxt == NULL) - xmlFreeParserCtxt(ctxt); - } -#ifdef HAVE_SYS_MMAN_H - } else if (memory) { - int fd; - struct stat info; - const char *base; - if (stat(filename, &info) < 0) - return; - if ((fd = open(filename, O_RDONLY)) < 0) - return; - base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; - if (base == (void *) MAP_FAILED) - return; - - if (rectxt == NULL) - doc = xmlReadMemory((char *) base, info.st_size, - filename, NULL, options); - else - doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size, - filename, NULL, options); - - munmap((char *) base, info.st_size); - close(fd); -#endif -#ifdef LIBXML_VALID_ENABLED - } else if (valid) { - xmlParserCtxtPtr ctxt = NULL; - - if (rectxt == NULL) - ctxt = xmlNewParserCtxt(); - else - ctxt = rectxt; - if (ctxt == NULL) { - doc = NULL; - } else { - doc = xmlCtxtReadFile(ctxt, filename, NULL, options); - - if (ctxt->valid == 0) - progresult = XMLLINT_ERR_RDFILE; - if (rectxt == NULL) - xmlFreeParserCtxt(ctxt); - } -#endif /* LIBXML_VALID_ENABLED */ - } else { - if (rectxt != NULL) - doc = xmlCtxtReadFile(rectxt, filename, NULL, options); - else { -#ifdef LIBXML_SAX1_ENABLED - if (sax1) - doc = xmlParseFile(filename); - else -#endif /* LIBXML_SAX1_ENABLED */ - doc = xmlReadFile(filename, NULL, options); - } - } - } - - /* - * If we don't have a document we might as well give up. Do we - * want an error message here? <sven@zen.org> */ - if (doc == NULL) { - progresult = XMLLINT_ERR_UNCLASS; - return; - } - - if ((timing) && (!repeat)) { - endTimer("Parsing"); - } - - /* - * Remove DOCTYPE nodes - */ - if (dropdtd) { - xmlDtdPtr dtd; - - dtd = xmlGetIntSubset(doc); - if (dtd != NULL) { - xmlUnlinkNode((xmlNodePtr)dtd); - xmlFreeDtd(dtd); - } - } - -#ifdef LIBXML_XINCLUDE_ENABLED - if (xinclude) { - if ((timing) && (!repeat)) { - startTimer(); - } - if (xmlXIncludeProcessFlags(doc, options) < 0) - progresult = XMLLINT_ERR_UNCLASS; - if ((timing) && (!repeat)) { - endTimer("Xinclude processing"); - } - } -#endif - -#ifdef LIBXML_DEBUG_ENABLED -#ifdef LIBXML_XPATH_ENABLED - /* - * shell interaction - */ - if (shell) { - xmlXPathOrderDocElems(doc); - xmlShell(doc, filename, xmlShellReadline, stdout); - } -#endif -#endif - -#ifdef LIBXML_TREE_ENABLED - /* - * test intermediate copy if needed. - */ - if (copy) { - tmp = doc; - if (timing) { - startTimer(); - } - doc = xmlCopyDoc(doc, 1); - if (timing) { - endTimer("Copying"); - } - if (timing) { - startTimer(); - } - xmlFreeDoc(tmp); - if (timing) { - endTimer("Freeing original"); - } - } -#endif /* LIBXML_TREE_ENABLED */ - -#ifdef LIBXML_VALID_ENABLED - if ((insert) && (!html)) { - const xmlChar* list[256]; - int nb, i; - xmlNodePtr node; - - if (doc->children != NULL) { - node = doc->children; - while ((node != NULL) && (node->last == NULL)) node = node->next; - if (node != NULL) { - nb = xmlValidGetValidElements(node->last, NULL, list, 256); - if (nb < 0) { - fprintf(stderr, "could not get valid list of elements\n"); - } else if (nb == 0) { - fprintf(stderr, "No element can be inserted under root\n"); - } else { - fprintf(stderr, "%d element types can be inserted under root:\n", - nb); - for (i = 0;i < nb;i++) { - fprintf(stderr, "%s\n", (char *) list[i]); - } - } - } - } - }else -#endif /* LIBXML_VALID_ENABLED */ -#ifdef LIBXML_READER_ENABLED - if (walker) { - walkDoc(doc); - } -#endif /* LIBXML_READER_ENABLED */ -#ifdef LIBXML_OUTPUT_ENABLED - if (noout == 0) { - int ret; - - /* - * print it. - */ -#ifdef LIBXML_DEBUG_ENABLED - if (!debug) { -#endif - if ((timing) && (!repeat)) { - startTimer(); - } -#ifdef LIBXML_HTML_ENABLED - if ((html) && (!xmlout)) { - if (compress) { - htmlSaveFile(output ? output : "-", doc); - } - else if (encoding != NULL) { - if ( format ) { - htmlSaveFileFormat(output ? output : "-", doc, encoding, 1); - } - else { - htmlSaveFileFormat(output ? output : "-", doc, encoding, 0); - } - } - else if (format) { - htmlSaveFileFormat(output ? output : "-", doc, NULL, 1); - } - else { - FILE *out; - if (output == NULL) - out = stdout; - else { - out = fopen(output,"wb"); - } - if (out != NULL) { - if (htmlDocDump(out, doc) < 0) - progresult = XMLLINT_ERR_OUT; - - if (output != NULL) - fclose(out); - } else { - fprintf(stderr, "failed to open %s\n", output); - progresult = XMLLINT_ERR_OUT; - } - } - if ((timing) && (!repeat)) { - endTimer("Saving"); - } - } else -#endif -#ifdef LIBXML_C14N_ENABLED - if (canonical) { - xmlChar *result = NULL; - int size; - - size = xmlC14NDocDumpMemory(doc, NULL, 0, NULL, 1, &result); - if (size >= 0) { - write(1, result, size); - xmlFree(result); - } else { - fprintf(stderr, "Failed to canonicalize\n"); - progresult = XMLLINT_ERR_OUT; - } - } else - if (exc_canonical) { - xmlChar *result = NULL; - int size; - - size = xmlC14NDocDumpMemory(doc, NULL, 1, NULL, 1, &result); - if (size >= 0) { - write(1, result, size); - xmlFree(result); - } else { - fprintf(stderr, "Failed to canonicalize\n"); - progresult = XMLLINT_ERR_OUT; - } - } else -#endif -#ifdef HAVE_SYS_MMAN_H - if (memory) { - xmlChar *result; - int len; - - if (encoding != NULL) { - if ( format ) { - xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1); - } else { - xmlDocDumpMemoryEnc(doc, &result, &len, encoding); - } - } else { - if (format) - xmlDocDumpFormatMemory(doc, &result, &len, 1); - else - xmlDocDumpMemory(doc, &result, &len); - } - if (result == NULL) { - fprintf(stderr, "Failed to save\n"); - progresult = XMLLINT_ERR_OUT; - } else { - write(1, result, len); - xmlFree(result); - } - - } else -#endif /* HAVE_SYS_MMAN_H */ - if (compress) { - xmlSaveFile(output ? output : "-", doc); - } else if (oldout) { - if (encoding != NULL) { - if ( format ) { - ret = xmlSaveFormatFileEnc(output ? output : "-", doc, - encoding, 1); - } - else { - ret = xmlSaveFileEnc(output ? output : "-", doc, - encoding); - } - if (ret < 0) { - fprintf(stderr, "failed save to %s\n", - output ? output : "-"); - progresult = XMLLINT_ERR_OUT; - } - } else if (format) { - ret = xmlSaveFormatFile(output ? output : "-", doc, 1); - if (ret < 0) { - fprintf(stderr, "failed save to %s\n", - output ? output : "-"); - progresult = XMLLINT_ERR_OUT; - } - } else { - FILE *out; - if (output == NULL) - out = stdout; - else { - out = fopen(output,"wb"); - } - if (out != NULL) { - if (xmlDocDump(out, doc) < 0) - progresult = XMLLINT_ERR_OUT; - - if (output != NULL) - fclose(out); - } else { - fprintf(stderr, "failed to open %s\n", output); - progresult = XMLLINT_ERR_OUT; - } - } - } else { - xmlSaveCtxtPtr ctxt; - int saveOpts = 0; - - if (format) - saveOpts |= XML_SAVE_FORMAT; - - if (output == NULL) - ctxt = xmlSaveToFd(1, encoding, saveOpts); - else - ctxt = xmlSaveToFilename(output, encoding, saveOpts); - - if (ctxt != NULL) { - if (xmlSaveDoc(ctxt, doc) < 0) { - fprintf(stderr, "failed save to %s\n", - output ? output : "-"); - progresult = XMLLINT_ERR_OUT; - } - xmlSaveClose(ctxt); - } else { - progresult = XMLLINT_ERR_OUT; - } - } - if ((timing) && (!repeat)) { - endTimer("Saving"); - } -#ifdef LIBXML_DEBUG_ENABLED - } else { - FILE *out; - if (output == NULL) - out = stdout; - else { - out = fopen(output,"wb"); - } - if (out != NULL) { - xmlDebugDumpDocument(out, doc); - - if (output != NULL) - fclose(out); - } else { - fprintf(stderr, "failed to open %s\n", output); - progresult = XMLLINT_ERR_OUT; - } - } -#endif - } -#endif /* LIBXML_OUTPUT_ENABLED */ - -#ifdef LIBXML_VALID_ENABLED - /* - * A posteriori validation test - */ - if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) { - xmlDtdPtr dtd; - - if ((timing) && (!repeat)) { - startTimer(); - } - if (dtdvalid != NULL) - dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid); - else - dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL); - if ((timing) && (!repeat)) { - endTimer("Parsing DTD"); - } - if (dtd == NULL) { - if (dtdvalid != NULL) - xmlGenericError(xmlGenericErrorContext, - "Could not parse DTD %s\n", dtdvalid); - else - xmlGenericError(xmlGenericErrorContext, - "Could not parse DTD %s\n", dtdvalidfpi); - progresult = XMLLINT_ERR_DTD; - } else { - xmlValidCtxtPtr cvp; - - if ((cvp = xmlNewValidCtxt()) == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Couldn't allocate validation context\n"); - exit(-1); - } - cvp->userData = (void *) stderr; - cvp->error = (xmlValidityErrorFunc) fprintf; - cvp->warning = (xmlValidityWarningFunc) fprintf; - - if ((timing) && (!repeat)) { - startTimer(); - } - if (!xmlValidateDtd(cvp, doc, dtd)) { - if (dtdvalid != NULL) - xmlGenericError(xmlGenericErrorContext, - "Document %s does not validate against %s\n", - filename, dtdvalid); - else - xmlGenericError(xmlGenericErrorContext, - "Document %s does not validate against %s\n", - filename, dtdvalidfpi); - progresult = XMLLINT_ERR_VALID; - } - if ((timing) && (!repeat)) { - endTimer("Validating against DTD"); - } - xmlFreeValidCtxt(cvp); - xmlFreeDtd(dtd); - } - } else if (postvalid) { - xmlValidCtxtPtr cvp; - - if ((cvp = xmlNewValidCtxt()) == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Couldn't allocate validation context\n"); - exit(-1); - } - - if ((timing) && (!repeat)) { - startTimer(); - } - cvp->userData = (void *) stderr; - cvp->error = (xmlValidityErrorFunc) fprintf; - cvp->warning = (xmlValidityWarningFunc) fprintf; - if (!xmlValidateDocument(cvp, doc)) { - xmlGenericError(xmlGenericErrorContext, - "Document %s does not validate\n", filename); - progresult = XMLLINT_ERR_VALID; - } - if ((timing) && (!repeat)) { - endTimer("Validating"); - } - xmlFreeValidCtxt(cvp); - } -#endif /* LIBXML_VALID_ENABLED */ -#ifdef LIBXML_SCHEMATRON_ENABLED - if (wxschematron != NULL) { - xmlSchematronValidCtxtPtr ctxt; - int ret; - int flag; - - if ((timing) && (!repeat)) { - startTimer(); - } - - if (debug) - flag = XML_SCHEMATRON_OUT_XML; - else - flag = XML_SCHEMATRON_OUT_TEXT; - if (noout) - flag |= XML_SCHEMATRON_OUT_QUIET; - ctxt = xmlSchematronNewValidCtxt(wxschematron, flag); -#if 0 - xmlSchematronSetValidErrors(ctxt, - (xmlSchematronValidityErrorFunc) fprintf, - (xmlSchematronValidityWarningFunc) fprintf, - stderr); -#endif - ret = xmlSchematronValidateDoc(ctxt, doc); - if (ret == 0) { - fprintf(stderr, "%s validates\n", filename); - } else if (ret > 0) { - fprintf(stderr, "%s fails to validate\n", filename); - progresult = XMLLINT_ERR_VALID; - } else { - fprintf(stderr, "%s validation generated an internal error\n", - filename); - progresult = XMLLINT_ERR_VALID; - } - xmlSchematronFreeValidCtxt(ctxt); - if ((timing) && (!repeat)) { - endTimer("Validating"); - } - } -#endif -#ifdef LIBXML_SCHEMAS_ENABLED - if (relaxngschemas != NULL) { - xmlRelaxNGValidCtxtPtr ctxt; - int ret; - - if ((timing) && (!repeat)) { - startTimer(); - } - - ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas); - xmlRelaxNGSetValidErrors(ctxt, - (xmlRelaxNGValidityErrorFunc) fprintf, - (xmlRelaxNGValidityWarningFunc) fprintf, - stderr); - ret = xmlRelaxNGValidateDoc(ctxt, doc); - if (ret == 0) { - fprintf(stderr, "%s validates\n", filename); - } else if (ret > 0) { - fprintf(stderr, "%s fails to validate\n", filename); - progresult = XMLLINT_ERR_VALID; - } else { - fprintf(stderr, "%s validation generated an internal error\n", - filename); - progresult = XMLLINT_ERR_VALID; - } - xmlRelaxNGFreeValidCtxt(ctxt); - if ((timing) && (!repeat)) { - endTimer("Validating"); - } - } else if (wxschemas != NULL) { - xmlSchemaValidCtxtPtr ctxt; - int ret; - - if ((timing) && (!repeat)) { - startTimer(); - } - - ctxt = xmlSchemaNewValidCtxt(wxschemas); - xmlSchemaSetValidErrors(ctxt, - (xmlSchemaValidityErrorFunc) fprintf, - (xmlSchemaValidityWarningFunc) fprintf, - stderr); - ret = xmlSchemaValidateDoc(ctxt, doc); - if (ret == 0) { - fprintf(stderr, "%s validates\n", filename); - } else if (ret > 0) { - fprintf(stderr, "%s fails to validate\n", filename); - progresult = XMLLINT_ERR_VALID; - } else { - fprintf(stderr, "%s validation generated an internal error\n", - filename); - progresult = XMLLINT_ERR_VALID; - } - xmlSchemaFreeValidCtxt(ctxt); - if ((timing) && (!repeat)) { - endTimer("Validating"); - } - } -#endif - -#ifdef LIBXML_DEBUG_ENABLED - if ((debugent) && (!html)) - xmlDebugDumpEntities(stderr, doc); -#endif - - /* - * free it. - */ - if ((timing) && (!repeat)) { - startTimer(); - } - xmlFreeDoc(doc); - if ((timing) && (!repeat)) { - endTimer("Freeing"); - } -} - -/************************************************************************ - * * - * Usage and Main * - * * - ************************************************************************/ - -static void showVersion(const char *name) { - fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion); - fprintf(stderr, " compiled with: "); - if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads "); - if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree "); - if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output "); - if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push "); - if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader "); - if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns "); - if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer "); - if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 "); - if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP "); - if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP "); - if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid "); - if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML "); - if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy "); - if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N "); - if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog "); - if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath "); - if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer "); - if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude "); - if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv "); - if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X "); - if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode "); - if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps "); - if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata "); - if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr "); - if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas "); - if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron "); - if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules "); - if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug "); - if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug "); - if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug "); - if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib "); - fprintf(stderr, "\n"); -} - -static void usage(const char *name) { - printf("Usage : %s [options] XMLfiles ...\n", name); -#ifdef LIBXML_OUTPUT_ENABLED - printf("\tParse the XML files and output the result of the parsing\n"); -#else - printf("\tParse the XML files\n"); -#endif /* LIBXML_OUTPUT_ENABLED */ - printf("\t--version : display the version of the XML library used\n"); -#ifdef LIBXML_DEBUG_ENABLED - printf("\t--debug : dump a debug tree of the in-memory document\n"); - printf("\t--shell : run a navigating shell\n"); - printf("\t--debugent : debug the entities defined in the document\n"); -#else -#ifdef LIBXML_READER_ENABLED - printf("\t--debug : dump the nodes content when using --stream\n"); -#endif /* LIBXML_READER_ENABLED */ -#endif -#ifdef LIBXML_TREE_ENABLED - printf("\t--copy : used to test the internal copy implementation\n"); -#endif /* LIBXML_TREE_ENABLED */ - printf("\t--recover : output what was parsable on broken XML documents\n"); - printf("\t--noent : substitute entity references by their value\n"); - printf("\t--noout : don't output the result tree\n"); - printf("\t--path 'paths': provide a set of paths for resources\n"); - printf("\t--load-trace : print trace of all external entites loaded\n"); - printf("\t--nonet : refuse to fetch DTDs or entities over network\n"); - printf("\t--nocompact : do not generate compact text nodes\n"); - printf("\t--htmlout : output results as HTML\n"); - printf("\t--nowrap : do not put HTML doc wrapper\n"); -#ifdef LIBXML_VALID_ENABLED - printf("\t--valid : validate the document in addition to std well-formed check\n"); - printf("\t--postvalid : do a posteriori validation, i.e after parsing\n"); - printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n"); - printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n"); -#endif /* LIBXML_VALID_ENABLED */ - printf("\t--timing : print some timings\n"); - printf("\t--output file or -o file: save to a given file\n"); - printf("\t--repeat : repeat 100 times, for timing or profiling\n"); - printf("\t--insert : ad-hoc test for valid insertions\n"); -#ifdef LIBXML_OUTPUT_ENABLED -#ifdef HAVE_ZLIB_H - printf("\t--compress : turn on gzip compression of output\n"); -#endif -#endif /* LIBXML_OUTPUT_ENABLED */ -#ifdef LIBXML_HTML_ENABLED - printf("\t--html : use the HTML parser\n"); - printf("\t--xmlout : force to use the XML serializer when using --html\n"); -#endif -#ifdef LIBXML_PUSH_ENABLED - printf("\t--push : use the push mode of the parser\n"); -#endif /* LIBXML_PUSH_ENABLED */ -#ifdef HAVE_SYS_MMAN_H - printf("\t--memory : parse from memory\n"); -#endif - printf("\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n"); - printf("\t--nowarning : do not emit warnings from parser/validator\n"); - printf("\t--noblanks : drop (ignorable?) blanks spaces\n"); - printf("\t--nocdata : replace cdata section with text nodes\n"); -#ifdef LIBXML_OUTPUT_ENABLED - printf("\t--format : reformat/reindent the input\n"); - printf("\t--encode encoding : output in the given encoding\n"); - printf("\t--dropdtd : remove the DOCTYPE of the input docs\n"); -#endif /* LIBXML_OUTPUT_ENABLED */ - printf("\t--c14n : save in W3C canonical format (with comments)\n"); - printf("\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n"); -#ifdef LIBXML_C14N_ENABLED -#endif /* LIBXML_C14N_ENABLED */ - printf("\t--nsclean : remove redundant namespace declarations\n"); - printf("\t--testIO : test user I/O support\n"); -#ifdef LIBXML_CATALOG_ENABLED - printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n"); - printf("\t otherwise XML Catalogs starting from \n"); - printf("\t %s are activated by default\n", XML_XML_DEFAULT_CATALOG); - printf("\t--nocatalogs: deactivate all catalogs\n"); -#endif - printf("\t--auto : generate a small doc on the fly\n"); -#ifdef LIBXML_XINCLUDE_ENABLED - printf("\t--xinclude : do XInclude processing\n"); - printf("\t--noxincludenode : same but do not generate XInclude nodes\n"); -#endif - printf("\t--loaddtd : fetch external DTD\n"); - printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n"); -#ifdef LIBXML_READER_ENABLED - printf("\t--stream : use the streaming interface to process very large files\n"); - printf("\t--walker : create a reader and walk though the resulting doc\n"); -#endif /* LIBXML_READER_ENABLED */ -#ifdef LIBXML_PATTERN_ENABLED - printf("\t--pattern pattern_value : test the pattern support\n"); -#endif - printf("\t--chkregister : verify the node registration code\n"); -#ifdef LIBXML_SCHEMAS_ENABLED - printf("\t--relaxng schema : do RelaxNG validation against the schema\n"); - printf("\t--schema schema : do validation against the WXS schema\n"); -#endif -#ifdef LIBXML_SCHEMATRON_ENABLED - printf("\t--schematron schema : do validation against a schematron\n"); -#endif -#ifdef LIBXML_SAX1_ENABLED - printf("\t--sax1: use the old SAX1 interfaces for processing\n"); -#endif - printf("\t--sax: do not build a tree but work just at the SAX level\n"); - - printf("\nLibxml project home page: http://xmlsoft.org/\n"); - printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n"); -} - -static void registerNode(xmlNodePtr node) -{ - node->_private = malloc(sizeof(long)); - *(long*)node->_private = (long) 0x81726354; - nbregister++; -} - -static void deregisterNode(xmlNodePtr node) -{ - assert(node->_private != NULL); - assert(*(long*)node->_private == (long) 0x81726354); - free(node->_private); - nbregister--; -} - -int -main(int argc, char **argv) { - int i, acount; - int files = 0; - int version = 0; - const char* indent; - - if (argc <= 1) { - usage(argv[0]); - return(1); - } - LIBXML_TEST_VERSION - for (i = 1; i < argc ; i++) { - if (!strcmp(argv[i], "-")) - break; - - if (argv[i][0] != '-') - continue; - if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) - debug++; - else -#ifdef LIBXML_DEBUG_ENABLED - if ((!strcmp(argv[i], "-shell")) || - (!strcmp(argv[i], "--shell"))) { - shell++; - noout = 1; - } else -#endif -#ifdef LIBXML_TREE_ENABLED - if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy"))) - copy++; - else -#endif /* LIBXML_TREE_ENABLED */ - if ((!strcmp(argv[i], "-recover")) || - (!strcmp(argv[i], "--recover"))) { - recovery++; - options |= XML_PARSE_RECOVER; - } else if ((!strcmp(argv[i], "-noent")) || - (!strcmp(argv[i], "--noent"))) { - noent++; - options |= XML_PARSE_NOENT; - } else if ((!strcmp(argv[i], "-nsclean")) || - (!strcmp(argv[i], "--nsclean"))) { - options |= XML_PARSE_NSCLEAN; - } else if ((!strcmp(argv[i], "-nocdata")) || - (!strcmp(argv[i], "--nocdata"))) { - options |= XML_PARSE_NOCDATA; - } else if ((!strcmp(argv[i], "-nodict")) || - (!strcmp(argv[i], "--nodict"))) { - options |= XML_PARSE_NODICT; - } else if ((!strcmp(argv[i], "-version")) || - (!strcmp(argv[i], "--version"))) { - showVersion(argv[0]); - version = 1; - } else if ((!strcmp(argv[i], "-noout")) || - (!strcmp(argv[i], "--noout"))) - noout++; -#ifdef LIBXML_OUTPUT_ENABLED - else if ((!strcmp(argv[i], "-o")) || - (!strcmp(argv[i], "-output")) || - (!strcmp(argv[i], "--output"))) { - i++; - output = argv[i]; - } -#endif /* LIBXML_OUTPUT_ENABLED */ - else if ((!strcmp(argv[i], "-htmlout")) || - (!strcmp(argv[i], "--htmlout"))) - htmlout++; - else if ((!strcmp(argv[i], "-nowrap")) || - (!strcmp(argv[i], "--nowrap"))) - nowrap++; -#ifdef LIBXML_HTML_ENABLED - else if ((!strcmp(argv[i], "-html")) || - (!strcmp(argv[i], "--html"))) { - html++; - } - else if ((!strcmp(argv[i], "-xmlout")) || - (!strcmp(argv[i], "--xmlout"))) { - xmlout++; - } -#endif /* LIBXML_HTML_ENABLED */ - else if ((!strcmp(argv[i], "-loaddtd")) || - (!strcmp(argv[i], "--loaddtd"))) { - loaddtd++; - options |= XML_PARSE_DTDLOAD; - } else if ((!strcmp(argv[i], "-dtdattr")) || - (!strcmp(argv[i], "--dtdattr"))) { - loaddtd++; - dtdattrs++; - options |= XML_PARSE_DTDATTR; - } -#ifdef LIBXML_VALID_ENABLED - else if ((!strcmp(argv[i], "-valid")) || - (!strcmp(argv[i], "--valid"))) { - valid++; - options |= XML_PARSE_DTDVALID; - } else if ((!strcmp(argv[i], "-postvalid")) || - (!strcmp(argv[i], "--postvalid"))) { - postvalid++; - loaddtd++; - options |= XML_PARSE_DTDLOAD; - } else if ((!strcmp(argv[i], "-dtdvalid")) || - (!strcmp(argv[i], "--dtdvalid"))) { - i++; - dtdvalid = argv[i]; - loaddtd++; - options |= XML_PARSE_DTDLOAD; - } else if ((!strcmp(argv[i], "-dtdvalidfpi")) || - (!strcmp(argv[i], "--dtdvalidfpi"))) { - i++; - dtdvalidfpi = argv[i]; - loaddtd++; - options |= XML_PARSE_DTDLOAD; - } -#endif /* LIBXML_VALID_ENABLED */ - else if ((!strcmp(argv[i], "-dropdtd")) || - (!strcmp(argv[i], "--dropdtd"))) - dropdtd++; - else if ((!strcmp(argv[i], "-insert")) || - (!strcmp(argv[i], "--insert"))) - insert++; - else if ((!strcmp(argv[i], "-timing")) || - (!strcmp(argv[i], "--timing"))) - timing++; - else if ((!strcmp(argv[i], "-auto")) || - (!strcmp(argv[i], "--auto"))) - generate++; - else if ((!strcmp(argv[i], "-repeat")) || - (!strcmp(argv[i], "--repeat"))) { - if (repeat) - repeat *= 10; - else - repeat = 100; - } -#ifdef LIBXML_PUSH_ENABLED - else if ((!strcmp(argv[i], "-push")) || - (!strcmp(argv[i], "--push"))) - push++; -#endif /* LIBXML_PUSH_ENABLED */ -#ifdef HAVE_SYS_MMAN_H - else if ((!strcmp(argv[i], "-memory")) || - (!strcmp(argv[i], "--memory"))) - memory++; -#endif - else if ((!strcmp(argv[i], "-testIO")) || - (!strcmp(argv[i], "--testIO"))) - testIO++; -#ifdef LIBXML_XINCLUDE_ENABLED - else if ((!strcmp(argv[i], "-xinclude")) || - (!strcmp(argv[i], "--xinclude"))) { - xinclude++; - options |= XML_PARSE_XINCLUDE; - } - else if ((!strcmp(argv[i], "-noxincludenode")) || - (!strcmp(argv[i], "--noxincludenode"))) { - xinclude++; - options |= XML_PARSE_XINCLUDE; - options |= XML_PARSE_NOXINCNODE; - } -#endif -#ifdef LIBXML_OUTPUT_ENABLED -#ifdef HAVE_ZLIB_H - else if ((!strcmp(argv[i], "-compress")) || - (!strcmp(argv[i], "--compress"))) { - compress++; - xmlSetCompressMode(9); - } -#endif -#endif /* LIBXML_OUTPUT_ENABLED */ - else if ((!strcmp(argv[i], "-nowarning")) || - (!strcmp(argv[i], "--nowarning"))) { - xmlGetWarningsDefaultValue = 0; - xmlPedanticParserDefault(0); - options |= XML_PARSE_NOWARNING; - } - else if ((!strcmp(argv[i], "-pedantic")) || - (!strcmp(argv[i], "--pedantic"))) { - xmlGetWarningsDefaultValue = 1; - xmlPedanticParserDefault(1); - options |= XML_PARSE_PEDANTIC; - } -#ifdef LIBXML_DEBUG_ENABLED - else if ((!strcmp(argv[i], "-debugent")) || - (!strcmp(argv[i], "--debugent"))) { - debugent++; - xmlParserDebugEntities = 1; - } -#endif -#ifdef LIBXML_C14N_ENABLED - else if ((!strcmp(argv[i], "-c14n")) || - (!strcmp(argv[i], "--c14n"))) { - canonical++; - options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD; - } - else if ((!strcmp(argv[i], "-exc-c14n")) || - (!strcmp(argv[i], "--exc-c14n"))) { - exc_canonical++; - options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD; - } -#endif -#ifdef LIBXML_CATALOG_ENABLED - else if ((!strcmp(argv[i], "-catalogs")) || - (!strcmp(argv[i], "--catalogs"))) { - catalogs++; - } else if ((!strcmp(argv[i], "-nocatalogs")) || - (!strcmp(argv[i], "--nocatalogs"))) { - nocatalogs++; - } -#endif - else if ((!strcmp(argv[i], "-encode")) || - (!strcmp(argv[i], "--encode"))) { - i++; - encoding = argv[i]; - /* - * OK it's for testing purposes - */ - xmlAddEncodingAlias("UTF-8", "DVEnc"); - } - else if ((!strcmp(argv[i], "-noblanks")) || - (!strcmp(argv[i], "--noblanks"))) { - noblanks++; - xmlKeepBlanksDefault(0); - } - else if ((!strcmp(argv[i], "-maxmem")) || - (!strcmp(argv[i], "--maxmem"))) { - i++; - if (sscanf(argv[i], "%d", &maxmem) == 1) { - xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc, - myStrdupFunc); - } else { - maxmem = 0; - } - } - else if ((!strcmp(argv[i], "-format")) || - (!strcmp(argv[i], "--format"))) { - noblanks++; -#ifdef LIBXML_OUTPUT_ENABLED - format++; -#endif /* LIBXML_OUTPUT_ENABLED */ - xmlKeepBlanksDefault(0); - } -#ifdef LIBXML_READER_ENABLED - else if ((!strcmp(argv[i], "-stream")) || - (!strcmp(argv[i], "--stream"))) { - stream++; - } - else if ((!strcmp(argv[i], "-walker")) || - (!strcmp(argv[i], "--walker"))) { - walker++; - noout++; - } -#endif /* LIBXML_READER_ENABLED */ -#ifdef LIBXML_SAX1_ENABLED - else if ((!strcmp(argv[i], "-sax1")) || - (!strcmp(argv[i], "--sax1"))) { - sax1++; - } -#endif /* LIBXML_SAX1_ENABLED */ - else if ((!strcmp(argv[i], "-sax")) || - (!strcmp(argv[i], "--sax"))) { - sax++; - } - else if ((!strcmp(argv[i], "-chkregister")) || - (!strcmp(argv[i], "--chkregister"))) { - chkregister++; -#ifdef LIBXML_SCHEMAS_ENABLED - } else if ((!strcmp(argv[i], "-relaxng")) || - (!strcmp(argv[i], "--relaxng"))) { - i++; - relaxng = argv[i]; - noent++; - options |= XML_PARSE_NOENT; - } else if ((!strcmp(argv[i], "-schema")) || - (!strcmp(argv[i], "--schema"))) { - i++; - schema = argv[i]; - noent++; -#endif -#ifdef LIBXML_SCHEMATRON_ENABLED - } else if ((!strcmp(argv[i], "-schematron")) || - (!strcmp(argv[i], "--schematron"))) { - i++; - schematron = argv[i]; - noent++; -#endif - } else if ((!strcmp(argv[i], "-nonet")) || - (!strcmp(argv[i], "--nonet"))) { - options |= XML_PARSE_NONET; - xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader); - } else if ((!strcmp(argv[i], "-nocompact")) || - (!strcmp(argv[i], "--nocompact"))) { - options &= ~XML_PARSE_COMPACT; - } else if ((!strcmp(argv[i], "-load-trace")) || - (!strcmp(argv[i], "--load-trace"))) { - load_trace++; - } else if ((!strcmp(argv[i], "-path")) || - (!strcmp(argv[i], "--path"))) { - i++; - parsePath(BAD_CAST argv[i]); -#ifdef LIBXML_PATTERN_ENABLED - } else if ((!strcmp(argv[i], "-pattern")) || - (!strcmp(argv[i], "--pattern"))) { - i++; - pattern = argv[i]; -#endif - } else { - fprintf(stderr, "Unknown option %s\n", argv[i]); - usage(argv[0]); - return(1); - } - } - -#ifdef LIBXML_CATALOG_ENABLED - if (nocatalogs == 0) { - if (catalogs) { - const char *catal; - - catal = getenv("SGML_CATALOG_FILES"); - if (catal != NULL) { - xmlLoadCatalogs(catal); - } else { - fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n"); - } - } - } -#endif - -#ifdef LIBXML_SAX1_ENABLED - if (sax1) - xmlSAXDefaultVersion(1); - else - xmlSAXDefaultVersion(2); -#endif /* LIBXML_SAX1_ENABLED */ - - if (chkregister) { - xmlRegisterNodeDefault(registerNode); - xmlDeregisterNodeDefault(deregisterNode); - } - - indent = getenv("XMLLINT_INDENT"); - if(indent != NULL) { - xmlTreeIndentString = indent; - } - - - defaultEntityLoader = xmlGetExternalEntityLoader(); - xmlSetExternalEntityLoader(xmllintExternalEntityLoader); - - xmlLineNumbersDefault(1); - if (loaddtd != 0) - xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS; - if (dtdattrs) - xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS; - if (noent != 0) xmlSubstituteEntitiesDefault(1); -#ifdef LIBXML_VALID_ENABLED - if (valid != 0) xmlDoValidityCheckingDefaultValue = 1; -#endif /* LIBXML_VALID_ENABLED */ - if ((htmlout) && (!nowrap)) { - xmlGenericError(xmlGenericErrorContext, - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n"); - xmlGenericError(xmlGenericErrorContext, - "\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n"); - xmlGenericError(xmlGenericErrorContext, - "<html><head><title>%s output</title></head>\n", - argv[0]); - xmlGenericError(xmlGenericErrorContext, - "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n", - argv[0]); - } - -#ifdef LIBXML_SCHEMATRON_ENABLED - if ((schematron != NULL) && (sax == 0) -#ifdef LIBXML_READER_ENABLED - && (stream == 0) -#endif /* LIBXML_READER_ENABLED */ - ) { - xmlSchematronParserCtxtPtr ctxt; - - /* forces loading the DTDs */ - xmlLoadExtDtdDefaultValue |= 1; - options |= XML_PARSE_DTDLOAD; - if (timing) { - startTimer(); - } - ctxt = xmlSchematronNewParserCtxt(schematron); -#if 0 - xmlSchematronSetParserErrors(ctxt, - (xmlSchematronValidityErrorFunc) fprintf, - (xmlSchematronValidityWarningFunc) fprintf, - stderr); -#endif - wxschematron = xmlSchematronParse(ctxt); - if (wxschematron == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Schematron schema %s failed to compile\n", schematron); - progresult = XMLLINT_ERR_SCHEMACOMP; - schematron = NULL; - } - xmlSchematronFreeParserCtxt(ctxt); - if (timing) { - endTimer("Compiling the schemas"); - } - } -#endif -#ifdef LIBXML_SCHEMAS_ENABLED - if ((relaxng != NULL) && (sax == 0) -#ifdef LIBXML_READER_ENABLED - && (stream == 0) -#endif /* LIBXML_READER_ENABLED */ - ) { - xmlRelaxNGParserCtxtPtr ctxt; - - /* forces loading the DTDs */ - xmlLoadExtDtdDefaultValue |= 1; - options |= XML_PARSE_DTDLOAD; - if (timing) { - startTimer(); - } - ctxt = xmlRelaxNGNewParserCtxt(relaxng); - xmlRelaxNGSetParserErrors(ctxt, - (xmlRelaxNGValidityErrorFunc) fprintf, - (xmlRelaxNGValidityWarningFunc) fprintf, - stderr); - relaxngschemas = xmlRelaxNGParse(ctxt); - if (relaxngschemas == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Relax-NG schema %s failed to compile\n", relaxng); - progresult = XMLLINT_ERR_SCHEMACOMP; - relaxng = NULL; - } - xmlRelaxNGFreeParserCtxt(ctxt); - if (timing) { - endTimer("Compiling the schemas"); - } - } else if ((schema != NULL) -#ifdef LIBXML_READER_ENABLED - && (stream == 0) -#endif - ) { - xmlSchemaParserCtxtPtr ctxt; - - if (timing) { - startTimer(); - } - ctxt = xmlSchemaNewParserCtxt(schema); - xmlSchemaSetParserErrors(ctxt, - (xmlSchemaValidityErrorFunc) fprintf, - (xmlSchemaValidityWarningFunc) fprintf, - stderr); - wxschemas = xmlSchemaParse(ctxt); - if (wxschemas == NULL) { - xmlGenericError(xmlGenericErrorContext, - "WXS schema %s failed to compile\n", schema); - progresult = XMLLINT_ERR_SCHEMACOMP; - schema = NULL; - } - xmlSchemaFreeParserCtxt(ctxt); - if (timing) { - endTimer("Compiling the schemas"); - } - } -#endif /* LIBXML_SCHEMAS_ENABLED */ -#ifdef LIBXML_PATTERN_ENABLED - if ((pattern != NULL) -#ifdef LIBXML_READER_ENABLED - && (walker == 0) -#endif - ) { - patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL); - if (patternc == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Pattern %s failed to compile\n", pattern); - progresult = XMLLINT_ERR_SCHEMAPAT; - pattern = NULL; - } - } -#endif /* LIBXML_PATTERN_ENABLED */ - for (i = 1; i < argc ; i++) { - if ((!strcmp(argv[i], "-encode")) || - (!strcmp(argv[i], "--encode"))) { - i++; - continue; - } else if ((!strcmp(argv[i], "-o")) || - (!strcmp(argv[i], "-output")) || - (!strcmp(argv[i], "--output"))) { - i++; - continue; - } -#ifdef LIBXML_VALID_ENABLED - if ((!strcmp(argv[i], "-dtdvalid")) || - (!strcmp(argv[i], "--dtdvalid"))) { - i++; - continue; - } - if ((!strcmp(argv[i], "-path")) || - (!strcmp(argv[i], "--path"))) { - i++; - continue; - } - if ((!strcmp(argv[i], "-dtdvalidfpi")) || - (!strcmp(argv[i], "--dtdvalidfpi"))) { - i++; - continue; - } -#endif /* LIBXML_VALID_ENABLED */ - if ((!strcmp(argv[i], "-relaxng")) || - (!strcmp(argv[i], "--relaxng"))) { - i++; - continue; - } - if ((!strcmp(argv[i], "-maxmem")) || - (!strcmp(argv[i], "--maxmem"))) { - i++; - continue; - } - if ((!strcmp(argv[i], "-schema")) || - (!strcmp(argv[i], "--schema"))) { - i++; - continue; - } - if ((!strcmp(argv[i], "-schematron")) || - (!strcmp(argv[i], "--schematron"))) { - i++; - continue; - } -#ifdef LIBXML_PATTERN_ENABLED - if ((!strcmp(argv[i], "-pattern")) || - (!strcmp(argv[i], "--pattern"))) { - i++; - continue; - } -#endif - if ((timing) && (repeat)) - startTimer(); - /* Remember file names. "-" means stdin. <sven@zen.org> */ - if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) { - if (repeat) { - xmlParserCtxtPtr ctxt = NULL; - - for (acount = 0;acount < repeat;acount++) { -#ifdef LIBXML_READER_ENABLED - if (stream != 0) { - streamFile(argv[i]); - } else { -#endif /* LIBXML_READER_ENABLED */ - if (sax) { - testSAX(argv[i]); - } else { - if (ctxt == NULL) - ctxt = xmlNewParserCtxt(); - parseAndPrintFile(argv[i], ctxt); - } -#ifdef LIBXML_READER_ENABLED - } -#endif /* LIBXML_READER_ENABLED */ - } - if (ctxt != NULL) - xmlFreeParserCtxt(ctxt); - } else { - nbregister = 0; - -#ifdef LIBXML_READER_ENABLED - if (stream != 0) - streamFile(argv[i]); - else -#endif /* LIBXML_READER_ENABLED */ - if (sax) { - testSAX(argv[i]); - } else { - parseAndPrintFile(argv[i], NULL); - } - - if ((chkregister) && (nbregister != 0)) { - fprintf(stderr, "Registration count off: %d\n", nbregister); - progresult = XMLLINT_ERR_RDREGIS; - } - } - files ++; - if ((timing) && (repeat)) { - endTimer("%d iterations", repeat); - } - } - } - if (generate) - parseAndPrintFile(NULL, NULL); - if ((htmlout) && (!nowrap)) { - xmlGenericError(xmlGenericErrorContext, "</body></html>\n"); - } - if ((files == 0) && (!generate) && (version == 0)) { - usage(argv[0]); - } -#ifdef LIBXML_SCHEMATRON_ENABLED - if (wxschematron != NULL) - xmlSchematronFree(wxschematron); -#endif -#ifdef LIBXML_SCHEMAS_ENABLED - if (relaxngschemas != NULL) - xmlRelaxNGFree(relaxngschemas); - if (wxschemas != NULL) - xmlSchemaFree(wxschemas); - xmlRelaxNGCleanupTypes(); -#endif -#ifdef LIBXML_PATTERN_ENABLED - if (patternc != NULL) - xmlFreePattern(patternc); -#endif - xmlCleanupParser(); - xmlMemoryDump(); - - return(progresult); -} - diff --git a/ThirdParty/libxml2/vtklibxml2/xmlmemory.c b/ThirdParty/libxml2/vtklibxml2/xmlmemory.c deleted file mode 100644 index c0c91bfe731..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlmemory.c +++ /dev/null @@ -1,1044 +0,0 @@ -/* - * xmlmemory.c: libxml memory allocator wrapper. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif - -#ifdef HAVE_TIME_H -#include <time.h> -#endif - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#else -#ifdef HAVE_MALLOC_H -#include <malloc.h> -#endif -#endif - -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif - -/* #define DEBUG_MEMORY */ - -/** - * MEM_LIST: - * - * keep track of all allocated blocks for error reporting - * Always build the memory list ! - */ -#ifdef DEBUG_MEMORY_LOCATION -#ifndef MEM_LIST -#define MEM_LIST /* keep a list of all the allocated memory blocks */ -#endif -#endif - -#include <libxml/globals.h> /* must come before xmlmemory.h */ -#include <libxml/xmlmemory.h> -#include <libxml/xmlerror.h> -#include <libxml/threads.h> - -static int xmlMemInitialized = 0; -static unsigned long debugMemSize = 0; -static unsigned long debugMemBlocks = 0; -static unsigned long debugMaxMemSize = 0; -static xmlMutexPtr xmlMemMutex = NULL; - -void xmlMallocBreakpoint(void); - -/************************************************************************ - * * - * Macros, variables and associated types * - * * - ************************************************************************/ - -#if !defined(LIBXML_THREAD_ENABLED) && !defined(LIBXML_THREAD_ALLOC_ENABLED) -#ifdef xmlMalloc -#undef xmlMalloc -#endif -#ifdef xmlRealloc -#undef xmlRealloc -#endif -#ifdef xmlMemStrdup -#undef xmlMemStrdup -#endif -#endif - -/* - * Each of the blocks allocated begin with a header containing informations - */ - -#define MEMTAG 0x5aa5 - -#define MALLOC_TYPE 1 -#define REALLOC_TYPE 2 -#define STRDUP_TYPE 3 -#define MALLOC_ATOMIC_TYPE 4 -#define REALLOC_ATOMIC_TYPE 5 - -typedef struct memnod { - unsigned int mh_tag; - unsigned int mh_type; - unsigned long mh_number; - size_t mh_size; -#ifdef MEM_LIST - struct memnod *mh_next; - struct memnod *mh_prev; -#endif - const char *mh_file; - unsigned int mh_line; -} MEMHDR; - - -#ifdef SUN4 -#define ALIGN_SIZE 16 -#else -#define ALIGN_SIZE sizeof(double) -#endif -#define HDR_SIZE sizeof(MEMHDR) -#define RESERVE_SIZE (((HDR_SIZE + (ALIGN_SIZE-1)) \ - / ALIGN_SIZE ) * ALIGN_SIZE) - - -#define CLIENT_2_HDR(a) ((MEMHDR *) (((char *) (a)) - RESERVE_SIZE)) -#define HDR_2_CLIENT(a) ((void *) (((char *) (a)) + RESERVE_SIZE)) - - -static unsigned int block=0; -static unsigned int xmlMemStopAtBlock = 0; -static void *xmlMemTraceBlockAt = NULL; -#ifdef MEM_LIST -static MEMHDR *memlist = NULL; -#endif - -static void debugmem_tag_error(void *addr); -#ifdef MEM_LIST -static void debugmem_list_add(MEMHDR *); -static void debugmem_list_delete(MEMHDR *); -#endif -#define Mem_Tag_Err(a) debugmem_tag_error(a); - -#ifndef TEST_POINT -#define TEST_POINT -#endif - -/** - * xmlMallocBreakpoint: - * - * Breakpoint to use in conjunction with xmlMemStopAtBlock. When the block - * number reaches the specified value this function is called. One need to add a breakpoint - * to it to get the context in which the given block is allocated. - */ - -void -xmlMallocBreakpoint(void) { - xmlGenericError(xmlGenericErrorContext, - "xmlMallocBreakpoint reached on block %d\n", xmlMemStopAtBlock); -} - -/** - * xmlMallocLoc: - * @size: an int specifying the size in byte to allocate. - * @file: the file name or NULL - * @line: the line number - * - * a malloc() equivalent, with logging of the allocation info. - * - * Returns a pointer to the allocated area or NULL in case of lack of memory. - */ - -void * -xmlMallocLoc(size_t size, const char * file, int line) -{ - MEMHDR *p; - void *ret; - - if (!xmlMemInitialized) xmlInitMemory(); -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "Malloc(%d)\n",size); -#endif - - TEST_POINT - - p = (MEMHDR *) malloc(RESERVE_SIZE+size); - - if (!p) { - xmlGenericError(xmlGenericErrorContext, - "xmlMallocLoc : Out of free space\n"); - xmlMemoryDump(); - return(NULL); - } - p->mh_tag = MEMTAG; - p->mh_size = size; - p->mh_type = MALLOC_TYPE; - p->mh_file = file; - p->mh_line = line; - xmlMutexLock(xmlMemMutex); - p->mh_number = ++block; - debugMemSize += size; - debugMemBlocks++; - if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; -#ifdef MEM_LIST - debugmem_list_add(p); -#endif - xmlMutexUnlock(xmlMemMutex); - -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "Malloc(%d) Ok\n",size); -#endif - - if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); - - ret = HDR_2_CLIENT(p); - - if (xmlMemTraceBlockAt == ret) { - xmlGenericError(xmlGenericErrorContext, - "%p : Malloc(%d) Ok\n", xmlMemTraceBlockAt, size); - xmlMallocBreakpoint(); - } - - TEST_POINT - - return(ret); -} - -/** - * xmlMallocAtomicLoc: - * @size: an int specifying the size in byte to allocate. - * @file: the file name or NULL - * @line: the line number - * - * a malloc() equivalent, with logging of the allocation info. - * - * Returns a pointer to the allocated area or NULL in case of lack of memory. - */ - -void * -xmlMallocAtomicLoc(size_t size, const char * file, int line) -{ - MEMHDR *p; - void *ret; - - if (!xmlMemInitialized) xmlInitMemory(); -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "Malloc(%d)\n",size); -#endif - - TEST_POINT - - p = (MEMHDR *) malloc(RESERVE_SIZE+size); - - if (!p) { - xmlGenericError(xmlGenericErrorContext, - "xmlMallocLoc : Out of free space\n"); - xmlMemoryDump(); - return(NULL); - } - p->mh_tag = MEMTAG; - p->mh_size = size; - p->mh_type = MALLOC_ATOMIC_TYPE; - p->mh_file = file; - p->mh_line = line; - xmlMutexLock(xmlMemMutex); - p->mh_number = ++block; - debugMemSize += size; - debugMemBlocks++; - if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; -#ifdef MEM_LIST - debugmem_list_add(p); -#endif - xmlMutexUnlock(xmlMemMutex); - -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "Malloc(%d) Ok\n",size); -#endif - - if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); - - ret = HDR_2_CLIENT(p); - - if (xmlMemTraceBlockAt == ret) { - xmlGenericError(xmlGenericErrorContext, - "%p : Malloc(%d) Ok\n", xmlMemTraceBlockAt, size); - xmlMallocBreakpoint(); - } - - TEST_POINT - - return(ret); -} -/** - * xmlMemMalloc: - * @size: an int specifying the size in byte to allocate. - * - * a malloc() equivalent, with logging of the allocation info. - * - * Returns a pointer to the allocated area or NULL in case of lack of memory. - */ - -void * -xmlMemMalloc(size_t size) -{ - return(xmlMallocLoc(size, "none", 0)); -} - -/** - * xmlReallocLoc: - * @ptr: the initial memory block pointer - * @size: an int specifying the size in byte to allocate. - * @file: the file name or NULL - * @line: the line number - * - * a realloc() equivalent, with logging of the allocation info. - * - * Returns a pointer to the allocated area or NULL in case of lack of memory. - */ - -void * -xmlReallocLoc(void *ptr,size_t size, const char * file, int line) -{ - MEMHDR *p; - unsigned long number; -#ifdef DEBUG_MEMORY - size_t oldsize; -#endif - - if (ptr == NULL) - return(xmlMallocLoc(size, file, line)); - - if (!xmlMemInitialized) xmlInitMemory(); - TEST_POINT - - p = CLIENT_2_HDR(ptr); - number = p->mh_number; - if (xmlMemStopAtBlock == number) xmlMallocBreakpoint(); - if (p->mh_tag != MEMTAG) { - Mem_Tag_Err(p); - goto error; - } - p->mh_tag = ~MEMTAG; - xmlMutexLock(xmlMemMutex); - debugMemSize -= p->mh_size; - debugMemBlocks--; -#ifdef DEBUG_MEMORY - oldsize = p->mh_size; -#endif -#ifdef MEM_LIST - debugmem_list_delete(p); -#endif - xmlMutexUnlock(xmlMemMutex); - - p = (MEMHDR *) realloc(p,RESERVE_SIZE+size); - if (!p) { - goto error; - } - if (xmlMemTraceBlockAt == ptr) { - xmlGenericError(xmlGenericErrorContext, - "%p : Realloced(%d -> %d) Ok\n", - xmlMemTraceBlockAt, p->mh_size, size); - xmlMallocBreakpoint(); - } - p->mh_tag = MEMTAG; - p->mh_number = number; - p->mh_type = REALLOC_TYPE; - p->mh_size = size; - p->mh_file = file; - p->mh_line = line; - xmlMutexLock(xmlMemMutex); - debugMemSize += size; - debugMemBlocks++; - if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; -#ifdef MEM_LIST - debugmem_list_add(p); -#endif - xmlMutexUnlock(xmlMemMutex); - - TEST_POINT - -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "Realloced(%d to %d) Ok\n", oldsize, size); -#endif - return(HDR_2_CLIENT(p)); - -error: - return(NULL); -} - -/** - * xmlMemRealloc: - * @ptr: the initial memory block pointer - * @size: an int specifying the size in byte to allocate. - * - * a realloc() equivalent, with logging of the allocation info. - * - * Returns a pointer to the allocated area or NULL in case of lack of memory. - */ - -void * -xmlMemRealloc(void *ptr,size_t size) { - return(xmlReallocLoc(ptr, size, "none", 0)); -} - -/** - * xmlMemFree: - * @ptr: the memory block pointer - * - * a free() equivalent, with error checking. - */ -void -xmlMemFree(void *ptr) -{ - MEMHDR *p; - char *target; -#ifdef DEBUG_MEMORY - size_t size; -#endif - - if (ptr == (void *) -1) { - xmlGenericError(xmlGenericErrorContext, - "trying to free pointer from freed area\n"); - goto error; - } - - if (xmlMemTraceBlockAt == ptr) { - xmlGenericError(xmlGenericErrorContext, - "%p : Freed()\n", xmlMemTraceBlockAt); - xmlMallocBreakpoint(); - } - - TEST_POINT - - target = (char *) ptr; - - p = CLIENT_2_HDR(ptr); - if (p->mh_tag != MEMTAG) { - Mem_Tag_Err(p); - goto error; - } - if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); - p->mh_tag = ~MEMTAG; - memset(target, -1, p->mh_size); - xmlMutexLock(xmlMemMutex); - debugMemSize -= p->mh_size; - debugMemBlocks--; -#ifdef DEBUG_MEMORY - size = p->mh_size; -#endif -#ifdef MEM_LIST - debugmem_list_delete(p); -#endif - xmlMutexUnlock(xmlMemMutex); - - free(p); - - TEST_POINT - -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "Freed(%d) Ok\n", size); -#endif - - return; - -error: - xmlGenericError(xmlGenericErrorContext, - "xmlMemFree(%lX) error\n", (unsigned long) ptr); - xmlMallocBreakpoint(); - return; -} - -/** - * xmlMemStrdupLoc: - * @str: the initial string pointer - * @file: the file name or NULL - * @line: the line number - * - * a strdup() equivalent, with logging of the allocation info. - * - * Returns a pointer to the new string or NULL if allocation error occurred. - */ - -char * -xmlMemStrdupLoc(const char *str, const char *file, int line) -{ - char *s; - size_t size = strlen(str) + 1; - MEMHDR *p; - - if (!xmlMemInitialized) xmlInitMemory(); - TEST_POINT - - p = (MEMHDR *) malloc(RESERVE_SIZE+size); - if (!p) { - goto error; - } - p->mh_tag = MEMTAG; - p->mh_size = size; - p->mh_type = STRDUP_TYPE; - p->mh_file = file; - p->mh_line = line; - xmlMutexLock(xmlMemMutex); - p->mh_number = ++block; - debugMemSize += size; - debugMemBlocks++; - if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; -#ifdef MEM_LIST - debugmem_list_add(p); -#endif - xmlMutexUnlock(xmlMemMutex); - - s = (char *) HDR_2_CLIENT(p); - - if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); - - if (s != NULL) - strcpy(s,str); - else - goto error; - - TEST_POINT - - if (xmlMemTraceBlockAt == s) { - xmlGenericError(xmlGenericErrorContext, - "%p : Strdup() Ok\n", xmlMemTraceBlockAt); - xmlMallocBreakpoint(); - } - - return(s); - -error: - return(NULL); -} - -/** - * xmlMemoryStrdup: - * @str: the initial string pointer - * - * a strdup() equivalent, with logging of the allocation info. - * - * Returns a pointer to the new string or NULL if allocation error occurred. - */ - -char * -xmlMemoryStrdup(const char *str) { - return(xmlMemStrdupLoc(str, "none", 0)); -} - -/** - * xmlMemUsed: - * - * Provides the amount of memory currently allocated - * - * Returns an int representing the amount of memory allocated. - */ - -int -xmlMemUsed(void) { - return(debugMemSize); -} - -/** - * xmlMemBlocks: - * - * Provides the number of memory areas currently allocated - * - * Returns an int representing the number of blocks - */ - -int -xmlMemBlocks(void) { - return(debugMemBlocks); -} - -#ifdef MEM_LIST -/** - * xmlMemContentShow: - * @fp: a FILE descriptor used as the output file - * @p: a memory block header - * - * tries to show some content from the memory block - */ - -static void -xmlMemContentShow(FILE *fp, MEMHDR *p) -{ - int i,j,k,len = p->mh_size; - const char *buf = (const char *) HDR_2_CLIENT(p); - - if (p == NULL) { - fprintf(fp, " NULL"); - return; - } - - for (i = 0;i < len;i++) { - if (buf[i] == 0) break; - if (!isprint((unsigned char) buf[i])) break; - } - if ((i < 4) && ((buf[i] != 0) || (i == 0))) { - if (len >= 4) { - MEMHDR *q; - void *cur; - - for (j = 0;(j < len -3) && (j < 40);j += 4) { - cur = *((void **) &buf[j]); - q = CLIENT_2_HDR(cur); - p = memlist; - k = 0; - while (p != NULL) { - if (p == q) break; - p = p->mh_next; - if (k++ > 100) break; - } - if ((p != NULL) && (p == q)) { - fprintf(fp, " pointer to #%lu at index %d", - p->mh_number, j); - return; - } - } - } - } else if ((i == 0) && (buf[i] == 0)) { - fprintf(fp," null"); - } else { - if (buf[i] == 0) fprintf(fp," \"%.25s\"", buf); - else { - fprintf(fp," ["); - for (j = 0;j < i;j++) - fprintf(fp,"%c", buf[j]); - fprintf(fp,"]"); - } - } -} -#endif - -/** - * xmlMemDisplay: - * @fp: a FILE descriptor used as the output file, if NULL, the result is - * written to the file .memorylist - * - * show in-extenso the memory blocks allocated - */ - -void -xmlMemDisplay(FILE *fp) -{ -#ifdef MEM_LIST - MEMHDR *p; - unsigned idx; - int nb = 0; -#if defined(HAVE_LOCALTIME) && defined(HAVE_STRFTIME) - time_t currentTime; - char buf[500]; - struct tm * tstruct; -#endif -#endif - FILE *old_fp = fp; - - if (fp == NULL) { - fp = fopen(".memorylist", "w"); - if (fp == NULL) - return; - } - -#ifdef MEM_LIST -#if defined(HAVE_LOCALTIME) && defined(HAVE_STRFTIME) - currentTime = time(NULL); - tstruct = localtime(¤tTime); - strftime(buf, sizeof(buf) - 1, "%I:%M:%S %p", tstruct); - fprintf(fp," %s\n\n", buf); -#endif - - - fprintf(fp," MEMORY ALLOCATED : %lu, MAX was %lu\n", - debugMemSize, debugMaxMemSize); - fprintf(fp,"BLOCK NUMBER SIZE TYPE\n"); - idx = 0; - xmlMutexLock(xmlMemMutex); - p = memlist; - while (p) { - fprintf(fp,"%-5u %6lu %6lu ",idx++,p->mh_number, - (unsigned long)p->mh_size); - switch (p->mh_type) { - case STRDUP_TYPE:fprintf(fp,"strdup() in ");break; - case MALLOC_TYPE:fprintf(fp,"malloc() in ");break; - case REALLOC_TYPE:fprintf(fp,"realloc() in ");break; - case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break; - case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break; - default: - fprintf(fp,"Unknown memory block, may be corrupted"); - xmlMutexUnlock(xmlMemMutex); - if (old_fp == NULL) - fclose(fp); - return; - } - if (p->mh_file != NULL) fprintf(fp,"%s(%u)", p->mh_file, p->mh_line); - if (p->mh_tag != MEMTAG) - fprintf(fp," INVALID"); - nb++; - if (nb < 100) - xmlMemContentShow(fp, p); - else - fprintf(fp," skip"); - - fprintf(fp,"\n"); - p = p->mh_next; - } - xmlMutexUnlock(xmlMemMutex); -#else - fprintf(fp,"Memory list not compiled (MEM_LIST not defined !)\n"); -#endif - if (old_fp == NULL) - fclose(fp); -} - -#ifdef MEM_LIST - -static void debugmem_list_add(MEMHDR *p) -{ - p->mh_next = memlist; - p->mh_prev = NULL; - if (memlist) memlist->mh_prev = p; - memlist = p; -#ifdef MEM_LIST_DEBUG - if (stderr) - Mem_Display(stderr); -#endif -} - -static void debugmem_list_delete(MEMHDR *p) -{ - if (p->mh_next) - p->mh_next->mh_prev = p->mh_prev; - if (p->mh_prev) - p->mh_prev->mh_next = p->mh_next; - else memlist = p->mh_next; -#ifdef MEM_LIST_DEBUG - if (stderr) - Mem_Display(stderr); -#endif -} - -#endif - -/* - * debugmem_tag_error: - * - * internal error function. - */ - -static void debugmem_tag_error(void *p) -{ - xmlGenericError(xmlGenericErrorContext, - "Memory tag error occurs :%p \n\t bye\n", p); -#ifdef MEM_LIST - if (stderr) - xmlMemDisplay(stderr); -#endif -} - -#ifdef MEM_LIST -static FILE *xmlMemoryDumpFile = NULL; -#endif - -/** - * xmlMemShow: - * @fp: a FILE descriptor used as the output file - * @nr: number of entries to dump - * - * show a show display of the memory allocated, and dump - * the @nr last allocated areas which were not freed - */ - -void -xmlMemShow(FILE *fp, int nr ATTRIBUTE_UNUSED) -{ -#ifdef MEM_LIST - MEMHDR *p; -#endif - - if (fp != NULL) - fprintf(fp," MEMORY ALLOCATED : %lu, MAX was %lu\n", - debugMemSize, debugMaxMemSize); -#ifdef MEM_LIST - xmlMutexLock(xmlMemMutex); - if (nr > 0) { - fprintf(fp,"NUMBER SIZE TYPE WHERE\n"); - p = memlist; - while ((p) && nr > 0) { - fprintf(fp,"%6lu %6lu ",p->mh_number,(unsigned long)p->mh_size); - switch (p->mh_type) { - case STRDUP_TYPE:fprintf(fp,"strdup() in ");break; - case MALLOC_TYPE:fprintf(fp,"malloc() in ");break; - case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break; - case REALLOC_TYPE:fprintf(fp,"realloc() in ");break; - case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break; - default:fprintf(fp," ??? in ");break; - } - if (p->mh_file != NULL) - fprintf(fp,"%s(%u)", p->mh_file, p->mh_line); - if (p->mh_tag != MEMTAG) - fprintf(fp," INVALID"); - xmlMemContentShow(fp, p); - fprintf(fp,"\n"); - nr--; - p = p->mh_next; - } - } - xmlMutexUnlock(xmlMemMutex); -#endif /* MEM_LIST */ -} - -/** - * xmlMemoryDump: - * - * Dump in-extenso the memory blocks allocated to the file .memorylist - */ - -void -xmlMemoryDump(void) -{ -#ifdef MEM_LIST - FILE *dump; - - if (debugMaxMemSize == 0) - return; - dump = fopen(".memdump", "w"); - if (dump == NULL) - xmlMemoryDumpFile = stderr; - else xmlMemoryDumpFile = dump; - - xmlMemDisplay(xmlMemoryDumpFile); - - if (dump != NULL) fclose(dump); -#endif /* MEM_LIST */ -} - - -/**************************************************************** - * * - * Initialization Routines * - * * - ****************************************************************/ - -/** - * xmlInitMemory: - * - * Initialize the memory layer. - * - * Returns 0 on success - */ -int -xmlInitMemory(void) -{ -#ifdef HAVE_STDLIB_H - char *breakpoint; -#endif -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "xmlInitMemory()\n"); -#endif - /* - This is really not good code (see Bug 130419). Suggestions for - improvement will be welcome! - */ - if (xmlMemInitialized) return(-1); - xmlMemInitialized = 1; - xmlMemMutex = xmlNewMutex(); - -#ifdef HAVE_STDLIB_H - breakpoint = getenv("XML_MEM_BREAKPOINT"); - if (breakpoint != NULL) { - sscanf(breakpoint, "%ud", &xmlMemStopAtBlock); - } -#endif -#ifdef HAVE_STDLIB_H - breakpoint = getenv("XML_MEM_TRACE"); - if (breakpoint != NULL) { - sscanf(breakpoint, "%p", &xmlMemTraceBlockAt); - } -#endif - -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "xmlInitMemory() Ok\n"); -#endif - return(0); -} - -/** - * xmlCleanupMemory: - * - * Free up all the memory allocated by the library for its own - * use. This should not be called by user level code. - */ -void -xmlCleanupMemory(void) { -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "xmlCleanupMemory()\n"); -#endif - if (xmlMemInitialized == 0) - return; - - xmlFreeMutex(xmlMemMutex); - xmlMemMutex = NULL; - xmlMemInitialized = 0; -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "xmlCleanupMemory() Ok\n"); -#endif -} - -/** - * xmlMemSetup: - * @freeFunc: the free() function to use - * @mallocFunc: the malloc() function to use - * @reallocFunc: the realloc() function to use - * @strdupFunc: the strdup() function to use - * - * Override the default memory access functions with a new set - * This has to be called before any other libxml routines ! - * - * Should this be blocked if there was already some allocations - * done ? - * - * Returns 0 on success - */ -int -xmlMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, - xmlReallocFunc reallocFunc, xmlStrdupFunc strdupFunc) { -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "xmlMemSetup()\n"); -#endif - if (freeFunc == NULL) - return(-1); - if (mallocFunc == NULL) - return(-1); - if (reallocFunc == NULL) - return(-1); - if (strdupFunc == NULL) - return(-1); - xmlFree = freeFunc; - xmlMalloc = mallocFunc; - xmlMallocAtomic = mallocFunc; - xmlRealloc = reallocFunc; - xmlMemStrdup = strdupFunc; -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "xmlMemSetup() Ok\n"); -#endif - return(0); -} - -/** - * xmlMemGet: - * @freeFunc: place to save the free() function in use - * @mallocFunc: place to save the malloc() function in use - * @reallocFunc: place to save the realloc() function in use - * @strdupFunc: place to save the strdup() function in use - * - * Provides the memory access functions set currently in use - * - * Returns 0 on success - */ -int -xmlMemGet(xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc, - xmlReallocFunc *reallocFunc, xmlStrdupFunc *strdupFunc) { - if (freeFunc != NULL) *freeFunc = xmlFree; - if (mallocFunc != NULL) *mallocFunc = xmlMalloc; - if (reallocFunc != NULL) *reallocFunc = xmlRealloc; - if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup; - return(0); -} - -/** - * xmlGcMemSetup: - * @freeFunc: the free() function to use - * @mallocFunc: the malloc() function to use - * @mallocAtomicFunc: the malloc() function to use for atomic allocations - * @reallocFunc: the realloc() function to use - * @strdupFunc: the strdup() function to use - * - * Override the default memory access functions with a new set - * This has to be called before any other libxml routines ! - * The mallocAtomicFunc is specialized for atomic block - * allocations (i.e. of areas useful for garbage collected memory allocators - * - * Should this be blocked if there was already some allocations - * done ? - * - * Returns 0 on success - */ -int -xmlGcMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, - xmlMallocFunc mallocAtomicFunc, xmlReallocFunc reallocFunc, - xmlStrdupFunc strdupFunc) { -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "xmlGcMemSetup()\n"); -#endif - if (freeFunc == NULL) - return(-1); - if (mallocFunc == NULL) - return(-1); - if (mallocAtomicFunc == NULL) - return(-1); - if (reallocFunc == NULL) - return(-1); - if (strdupFunc == NULL) - return(-1); - xmlFree = freeFunc; - xmlMalloc = mallocFunc; - xmlMallocAtomic = mallocAtomicFunc; - xmlRealloc = reallocFunc; - xmlMemStrdup = strdupFunc; -#ifdef DEBUG_MEMORY - xmlGenericError(xmlGenericErrorContext, - "xmlGcMemSetup() Ok\n"); -#endif - return(0); -} - -/** - * xmlGcMemGet: - * @freeFunc: place to save the free() function in use - * @mallocFunc: place to save the malloc() function in use - * @mallocAtomicFunc: place to save the atomic malloc() function in use - * @reallocFunc: place to save the realloc() function in use - * @strdupFunc: place to save the strdup() function in use - * - * Provides the memory access functions set currently in use - * The mallocAtomicFunc is specialized for atomic block - * allocations (i.e. of areas useful for garbage collected memory allocators - * - * Returns 0 on success - */ -int -xmlGcMemGet(xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc, - xmlMallocFunc *mallocAtomicFunc, xmlReallocFunc *reallocFunc, - xmlStrdupFunc *strdupFunc) { - if (freeFunc != NULL) *freeFunc = xmlFree; - if (mallocFunc != NULL) *mallocFunc = xmlMalloc; - if (mallocAtomicFunc != NULL) *mallocAtomicFunc = xmlMallocAtomic; - if (reallocFunc != NULL) *reallocFunc = xmlRealloc; - if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup; - return(0); -} - -#define bottom_xmlmemory -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/xmlmodule.c b/ThirdParty/libxml2/vtklibxml2/xmlmodule.c deleted file mode 100644 index fa51821a89f..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlmodule.c +++ /dev/null @@ -1,445 +0,0 @@ -/* - * xmlmodule.c : basic API for dynamic module loading added 2.6.17 - * - * See Copyright for the status of this software. - * - * joelwreed@comcast.net - * - * http://www.fortran-2000.com/ArnaudRecipes/sharedlib.html - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/xmlerror.h> -#include <libxml/xmlmodule.h> -#include <libxml/globals.h> - -#ifdef LIBXML_MODULES_ENABLED - -struct _xmlModule { - unsigned char *name; - void *handle; -}; - -static void *xmlModulePlatformOpen(const char *name); -static int xmlModulePlatformClose(void *handle); -static int xmlModulePlatformSymbol(void *handle, const char *name, void **result); - -/************************************************************************ - * * - * module memory error handler * - * * - ************************************************************************/ - -/** - * xmlModuleErrMemory: - * @extra: extra information - * - * Handle an out of memory condition - */ -static void -xmlModuleErrMemory(xmlModulePtr module, const char *extra) -{ - const char *name = NULL; - - if (module != NULL) { - name = (const char *) module->name; - } - - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, - name, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); -} - -/** - * xmlModuleOpen: - * @name: the module name - * @options: a set of xmlModuleOption - * - * Opens a module/shared library given its name or path - * TODO: options are not yet implemented. - * - * Returns a handle for the module or NULL in case of error - */ -xmlModulePtr -xmlModuleOpen(const char *name, int options ATTRIBUTE_UNUSED) -{ - xmlModulePtr module; - - module = (xmlModulePtr) xmlMalloc(sizeof(xmlModule)); - if (module == NULL) { - xmlModuleErrMemory(NULL, "creating module"); - return (NULL); - } - - memset(module, 0, sizeof(xmlModule)); - - module->handle = xmlModulePlatformOpen(name); - - if (module->handle == NULL) { - xmlFree(module); - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, - XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, - name, NULL, 0, 0, "failed to open %s\n", name); - return(NULL); - } - - module->name = xmlStrdup((const xmlChar *) name); - return (module); -} - -/** - * xmlModuleSymbol: - * @module: the module - * @name: the name of the symbol - * @symbol: the resulting symbol address - * - * Lookup for a symbol address in the given module - * - * Returns 0 if the symbol was found, or -1 in case of error - */ -int -xmlModuleSymbol(xmlModulePtr module, const char *name, void **symbol) -{ - int rc = -1; - - if ((NULL == module) || (symbol == NULL)) { - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, - XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, - NULL, NULL, 0, 0, "null parameter\n"); - return rc; - } - - rc = xmlModulePlatformSymbol(module->handle, name, symbol); - - if (rc == -1) { - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, - XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, - name, NULL, 0, 0, - "failed to find symbol: %s\n", - (name == NULL ? "NULL" : name)); - return rc; - } - - return rc; -} - -/** - * xmlModuleClose: - * @module: the module handle - * - * The close operations unload the associated module and free the - * data associated to the module. - * - * Returns 0 in case of success, -1 in case of argument error and -2 - * if the module could not be closed/unloaded. - */ -int -xmlModuleClose(xmlModulePtr module) -{ - int rc; - - if (NULL == module) { - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, - XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, 0, - NULL, NULL, 0, 0, "null module pointer\n"); - return -1; - } - - rc = xmlModulePlatformClose(module->handle); - - if (rc != 0) { - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, - XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, 0, - (const char *) module->name, NULL, 0, 0, - "failed to close: %s\n", module->name); - return -2; - } - - rc = xmlModuleFree(module); - return (rc); -} - -/** - * xmlModuleFree: - * @module: the module handle - * - * The free operations free the data associated to the module - * but does not unload the associated shared library which may still - * be in use. - * - * Returns 0 in case of success, -1 in case of argument error - */ -int -xmlModuleFree(xmlModulePtr module) -{ - if (NULL == module) { - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, - XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, NULL, - NULL, NULL, 0, 0, "null module pointer\n"); - return -1; - } - - xmlFree(module->name); - xmlFree(module); - - return (0); -} - -#ifdef HAVE_DLOPEN -#ifdef HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#ifndef RTLD_GLOBAL /* For Tru64 UNIX 4.0 */ -#define RTLD_GLOBAL 0 -#endif - -/** - * xmlModulePlatformOpen: - * @name: path to the module - * - * returns a handle on success, and zero on error. - */ - -static void * -xmlModulePlatformOpen(const char *name) -{ - return dlopen(name, RTLD_GLOBAL | RTLD_NOW); -} - -/* - * xmlModulePlatformClose: - * @handle: handle to the module - * - * returns 0 on success, and non-zero on error. - */ - -static int -xmlModulePlatformClose(void *handle) -{ - return dlclose(handle); -} - -/* - * xmlModulePlatformSymbol: - * http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html - * returns 0 on success and the loaded symbol in result, and -1 on error. - */ - -static int -xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) -{ - *symbol = dlsym(handle, name); - if (dlerror() != NULL) { - return -1; - } - return 0; -} - -#else /* ! HAVE_DLOPEN */ - -#ifdef HAVE_SHLLOAD /* HAVE_SHLLOAD */ -#ifdef HAVE_DL_H -#include <dl.h> -#endif -/* - * xmlModulePlatformOpen: - * returns a handle on success, and zero on error. - */ - -static void * -xmlModulePlatformOpen(const char *name) -{ - return shl_load(name, BIND_IMMEDIATE, 0L); -} - -/* - * xmlModulePlatformClose: - * returns 0 on success, and non-zero on error. - */ - -static int -xmlModulePlatformClose(void *handle) -{ - return shl_unload(handle); -} - -/* - * xmlModulePlatformSymbol: - * http://docs.hp.com/en/B2355-90683/shl_load.3X.html - * returns 0 on success and the loaded symbol in result, and -1 on error. - */ - -static int -xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) -{ - int rc; - - errno = 0; - rc = shl_findsym((shl_t*)&handle, name, TYPE_UNDEFINED, symbol); - return rc; -} - -#endif /* HAVE_SHLLOAD */ -#endif /* ! HAVE_DLOPEN */ - -#if defined(_WIN32) && !defined(HAVE_DLOPEN) - -#include <windows.h> - -/* - * xmlModulePlatformOpen: - * returns a handle on success, and zero on error. - */ - -static void * -xmlModulePlatformOpen(const char *name) -{ - return LoadLibrary(name); -} - -/* - * xmlModulePlatformClose: - * returns 0 on success, and non-zero on error. - */ - -static int -xmlModulePlatformClose(void *handle) -{ - int rc; - - rc = FreeLibrary(handle); - return (0 == rc); -} - -/* - * xmlModulePlatformSymbol: - * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocaddress.asp - * returns 0 on success and the loaded symbol in result, and -1 on error. - */ - -static int -xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) -{ - *symbol = GetProcAddress(handle, name); - return (NULL == *symbol) ? -1 : 0; -} - -#endif /* _WIN32 */ - -#ifdef HAVE_BEOS - -#include <kernel/image.h> - -/* - * xmlModulePlatformOpen: - * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html - * returns a handle on success, and zero on error. - */ - -static void * -xmlModulePlatformOpen(const char *name) -{ - return (void *) load_add_on(name); -} - -/* - * xmlModulePlatformClose: - * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html - * returns 0 on success, and non-zero on error. - */ - -static int -xmlModulePlatformClose(void *handle) -{ - status_t rc; - - rc = unload_add_on((image_id) handle); - - if (rc == B_OK) - return 0; - else - return -1; -} - -/* - * xmlModulePlatformSymbol: - * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html - * returns 0 on success and the loaded symbol in result, and -1 on error. - */ - -static int -xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) -{ - status_t rc; - - rc = get_image_symbol((image_id) handle, name, B_SYMBOL_TYPE_ANY, symbol); - - return (rc == B_OK) ? 0 : -1; -} - -#endif /* HAVE_BEOS */ - -#ifdef HAVE_OS2 - -#include <os2.h> - -/* - * xmlModulePlatformOpen: - * os2 api info: http://www.edm2.com/os2api/Dos/DosLoadModule.html - * returns a handle on success, and zero on error. - */ - -static void * -xmlModulePlatformOpen(const char *name) -{ - char errbuf[256]; - void *handle; - int rc; - - rc = DosLoadModule(errbuf, sizeof(errbuf) - 1, name, &handle); - - if (rc) - return 0; - else - return (handle); -} - -/* - * xmlModulePlatformClose: - * os2 api info: http://www.edm2.com/os2api/Dos/DosFreeModule.html - * returns 0 on success, and non-zero on error. - */ - -static int -xmlModulePlatformClose(void *handle) -{ - return DosFreeModule(handle); -} - -/* - * xmlModulePlatformSymbol: - * os2 api info: http://www.edm2.com/os2api/Dos/DosQueryProcAddr.html - * returns 0 on success and the loaded symbol in result, and -1 on error. - */ - -static int -xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) -{ - int rc; - - rc = DosQueryProcAddr(handle, 0, name, symbol); - - return (rc == NO_ERROR) ? 0 : -1; -} - -#endif /* HAVE_OS2 */ - -#define bottom_xmlmodule -#include "elfgcchack.h" -#endif /* LIBXML_MODULES_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/xmlreader.c b/ThirdParty/libxml2/vtklibxml2/xmlreader.c deleted file mode 100644 index 18ec2692817..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlreader.c +++ /dev/null @@ -1,5659 +0,0 @@ -/* - * xmlreader.c: implements the xmlTextReader streaming node API - * - * NOTE: - * XmlTextReader.Normalization Property won't be supported, since - * it makes the parser non compliant to the XML recommendation - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -/* - * TODOs: - * - XML Schemas validation - */ -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_READER_ENABLED -#include <string.h> /* for memset() only ! */ -#include <stdarg.h> - -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#include <libxml/xmlmemory.h> -#include <libxml/xmlIO.h> -#include <libxml/xmlreader.h> -#include <libxml/parserInternals.h> -#ifdef LIBXML_SCHEMAS_ENABLED -#include <libxml/relaxng.h> -#include <libxml/xmlschemas.h> -#endif -#include <libxml/uri.h> -#ifdef LIBXML_XINCLUDE_ENABLED -#include <libxml/xinclude.h> -#endif -#ifdef LIBXML_PATTERN_ENABLED -#include <libxml/pattern.h> -#endif - -/* #define DEBUG_CALLBACKS */ -/* #define DEBUG_READER */ - -/** - * TODO: - * - * macro to flag unimplemented blocks - */ -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -#ifdef DEBUG_READER -#define DUMP_READER xmlTextReaderDebug(reader); -#else -#define DUMP_READER -#endif - -#define CHUNK_SIZE 512 -/************************************************************************ - * * - * The parser: maps the Text Reader API on top of the existing * - * parsing routines building a tree * - * * - ************************************************************************/ - -#define XML_TEXTREADER_INPUT 1 -#define XML_TEXTREADER_CTXT 2 - -typedef enum { - XML_TEXTREADER_NONE = -1, - XML_TEXTREADER_START= 0, - XML_TEXTREADER_ELEMENT= 1, - XML_TEXTREADER_END= 2, - XML_TEXTREADER_EMPTY= 3, - XML_TEXTREADER_BACKTRACK= 4, - XML_TEXTREADER_DONE= 5, - XML_TEXTREADER_ERROR= 6 -} xmlTextReaderState; - -typedef enum { - XML_TEXTREADER_NOT_VALIDATE = 0, - XML_TEXTREADER_VALIDATE_DTD = 1, - XML_TEXTREADER_VALIDATE_RNG = 2, - XML_TEXTREADER_VALIDATE_XSD = 4 -} xmlTextReaderValidate; - -struct _xmlTextReader { - int mode; /* the parsing mode */ - xmlDocPtr doc; /* when walking an existing doc */ - xmlTextReaderValidate validate;/* is there any validation */ - int allocs; /* what structure were deallocated */ - xmlTextReaderState state; - xmlParserCtxtPtr ctxt; /* the parser context */ - xmlSAXHandlerPtr sax; /* the parser SAX callbacks */ - xmlParserInputBufferPtr input; /* the input */ - startElementSAXFunc startElement;/* initial SAX callbacks */ - endElementSAXFunc endElement; /* idem */ - startElementNsSAX2Func startElementNs;/* idem */ - endElementNsSAX2Func endElementNs; /* idem */ - charactersSAXFunc characters; - cdataBlockSAXFunc cdataBlock; - unsigned int base; /* base of the segment in the input */ - unsigned int cur; /* current position in the input */ - xmlNodePtr node; /* current node */ - xmlNodePtr curnode;/* current attribute node */ - int depth; /* depth of the current node */ - xmlNodePtr faketext;/* fake xmlNs chld */ - int preserve;/* preserve the resulting document */ - xmlBufferPtr buffer; /* used to return const xmlChar * */ - xmlDictPtr dict; /* the context dictionnary */ - - /* entity stack when traversing entities content */ - xmlNodePtr ent; /* Current Entity Ref Node */ - int entNr; /* Depth of the entities stack */ - int entMax; /* Max depth of the entities stack */ - xmlNodePtr *entTab; /* array of entities */ - - /* error handling */ - xmlTextReaderErrorFunc errorFunc; /* callback function */ - void *errorFuncArg; /* callback function user argument */ - -#ifdef LIBXML_SCHEMAS_ENABLED - /* Handling of RelaxNG validation */ - xmlRelaxNGPtr rngSchemas; /* The Relax NG schemas */ - xmlRelaxNGValidCtxtPtr rngValidCtxt;/* The Relax NG validation context */ - int rngValidErrors;/* The number of errors detected */ - xmlNodePtr rngFullNode; /* the node if RNG not progressive */ - /* Handling of Schemas validation */ - xmlSchemaPtr xsdSchemas; /* The Schemas schemas */ - xmlSchemaValidCtxtPtr xsdValidCtxt;/* The Schemas validation context */ - int xsdPreserveCtxt; /* 1 if the context was provided by the user */ - int xsdValidErrors;/* The number of errors detected */ - xmlSchemaSAXPlugPtr xsdPlug; /* the schemas plug in SAX pipeline */ -#endif -#ifdef LIBXML_XINCLUDE_ENABLED - /* Handling of XInclude processing */ - int xinclude; /* is xinclude asked for */ - const xmlChar * xinclude_name; /* the xinclude name from dict */ - xmlXIncludeCtxtPtr xincctxt; /* the xinclude context */ - int in_xinclude; /* counts for xinclude */ -#endif -#ifdef LIBXML_PATTERN_ENABLED - int patternNr; /* number of preserve patterns */ - int patternMax; /* max preserve patterns */ - xmlPatternPtr *patternTab; /* array of preserve patterns */ -#endif - int preserves; /* level of preserves */ - int parserFlags; /* the set of options set */ - /* Structured error handling */ - xmlStructuredErrorFunc sErrorFunc; /* callback function */ -}; - -#define NODE_IS_EMPTY 0x1 -#define NODE_IS_PRESERVED 0x2 -#define NODE_IS_SPRESERVED 0x4 - -/** - * CONSTSTR: - * - * Macro used to return an interned string - */ -#define CONSTSTR(str) xmlDictLookup(reader->dict, (str), -1) -#define CONSTQSTR(p, str) xmlDictQLookup(reader->dict, (p), (str)) - -static int xmlTextReaderReadTree(xmlTextReaderPtr reader); -static int xmlTextReaderNextTree(xmlTextReaderPtr reader); - -/************************************************************************ - * * - * Our own version of the freeing routines as we recycle nodes * - * * - ************************************************************************/ -/** - * DICT_FREE: - * @str: a string - * - * Free a string if it is not owned by the "dict" dictionnary in the - * current scope - */ -#define DICT_FREE(str) \ - if ((str) && ((!dict) || \ - (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ - xmlFree((char *)(str)); - -static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur); -static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur); - -/** - * xmlFreeID: - * @not: A id - * - * Deallocate the memory used by an id definition - */ -static void -xmlFreeID(xmlIDPtr id) { - xmlDictPtr dict = NULL; - - if (id == NULL) return; - - if (id->doc != NULL) - dict = id->doc->dict; - - if (id->value != NULL) - DICT_FREE(id->value) - xmlFree(id); -} - -/** - * xmlTextReaderRemoveID: - * @doc: the document - * @attr: the attribute - * - * Remove the given attribute from the ID table maintained internally. - * - * Returns -1 if the lookup failed and 0 otherwise - */ -static int -xmlTextReaderRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { - xmlIDTablePtr table; - xmlIDPtr id; - xmlChar *ID; - - if (doc == NULL) return(-1); - if (attr == NULL) return(-1); - table = (xmlIDTablePtr) doc->ids; - if (table == NULL) - return(-1); - - if (attr == NULL) - return(-1); - ID = xmlNodeListGetString(doc, attr->children, 1); - if (ID == NULL) - return(-1); - id = xmlHashLookup(table, ID); - xmlFree(ID); - if (id == NULL || id->attr != attr) { - return(-1); - } - id->name = attr->name; - id->attr = NULL; - return(0); -} - -/** - * xmlTextReaderFreeProp: - * @reader: the xmlTextReaderPtr used - * @cur: the node - * - * Free a node. - */ -static void -xmlTextReaderFreeProp(xmlTextReaderPtr reader, xmlAttrPtr cur) { - xmlDictPtr dict; - - dict = reader->ctxt->dict; - if (cur == NULL) return; - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue((xmlNodePtr) cur); - - /* Check for ID removal -> leading to invalid references ! */ - if ((cur->parent != NULL) && (cur->parent->doc != NULL) && - ((cur->parent->doc->intSubset != NULL) || - (cur->parent->doc->extSubset != NULL))) { - if (xmlIsID(cur->parent->doc, cur->parent, cur)) - xmlTextReaderRemoveID(cur->parent->doc, cur); - } - if (cur->children != NULL) - xmlTextReaderFreeNodeList(reader, cur->children); - - DICT_FREE(cur->name); - if ((reader != NULL) && (reader->ctxt != NULL) && - (reader->ctxt->freeAttrsNr < 100)) { - cur->next = reader->ctxt->freeAttrs; - reader->ctxt->freeAttrs = cur; - reader->ctxt->freeAttrsNr++; - } else { - xmlFree(cur); - } -} - -/** - * xmlTextReaderFreePropList: - * @reader: the xmlTextReaderPtr used - * @cur: the first property in the list - * - * Free a property and all its siblings, all the children are freed too. - */ -static void -xmlTextReaderFreePropList(xmlTextReaderPtr reader, xmlAttrPtr cur) { - xmlAttrPtr next; - if (cur == NULL) return; - while (cur != NULL) { - next = cur->next; - xmlTextReaderFreeProp(reader, cur); - cur = next; - } -} - -/** - * xmlTextReaderFreeNodeList: - * @reader: the xmlTextReaderPtr used - * @cur: the first node in the list - * - * Free a node and all its siblings, this is a recursive behaviour, all - * the children are freed too. - */ -static void -xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur) { - xmlNodePtr next; - xmlDictPtr dict; - - dict = reader->ctxt->dict; - if (cur == NULL) return; - if (cur->type == XML_NAMESPACE_DECL) { - xmlFreeNsList((xmlNsPtr) cur); - return; - } - if ((cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - xmlFreeDoc((xmlDocPtr) cur); - return; - } - while (cur != NULL) { - next = cur->next; - /* unroll to speed up freeing the document */ - if (cur->type != XML_DTD_NODE) { - - if ((cur->children != NULL) && - (cur->type != XML_ENTITY_REF_NODE)) { - if (cur->children->parent == cur) - xmlTextReaderFreeNodeList(reader, cur->children); - cur->children = NULL; - } - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue(cur); - - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) && - (cur->properties != NULL)) - xmlTextReaderFreePropList(reader, cur->properties); - if ((cur->content != (xmlChar *) &(cur->properties)) && - (cur->type != XML_ELEMENT_NODE) && - (cur->type != XML_XINCLUDE_START) && - (cur->type != XML_XINCLUDE_END) && - (cur->type != XML_ENTITY_REF_NODE)) { - DICT_FREE(cur->content); - } - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) && - (cur->nsDef != NULL)) - xmlFreeNsList(cur->nsDef); - - /* - * we don't free element names here they are interned now - */ - if ((cur->type != XML_TEXT_NODE) && - (cur->type != XML_COMMENT_NODE)) - DICT_FREE(cur->name); - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_TEXT_NODE)) && - (reader != NULL) && (reader->ctxt != NULL) && - (reader->ctxt->freeElemsNr < 100)) { - cur->next = reader->ctxt->freeElems; - reader->ctxt->freeElems = cur; - reader->ctxt->freeElemsNr++; - } else { - xmlFree(cur); - } - } - cur = next; - } -} - -/** - * xmlTextReaderFreeNode: - * @reader: the xmlTextReaderPtr used - * @cur: the node - * - * Free a node, this is a recursive behaviour, all the children are freed too. - * This doesn't unlink the child from the list, use xmlUnlinkNode() first. - */ -static void -xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur) { - xmlDictPtr dict; - - dict = reader->ctxt->dict; - if (cur->type == XML_DTD_NODE) { - xmlFreeDtd((xmlDtdPtr) cur); - return; - } - if (cur->type == XML_NAMESPACE_DECL) { - xmlFreeNs((xmlNsPtr) cur); - return; - } - if (cur->type == XML_ATTRIBUTE_NODE) { - xmlTextReaderFreeProp(reader, (xmlAttrPtr) cur); - return; - } - - if ((cur->children != NULL) && - (cur->type != XML_ENTITY_REF_NODE)) { - if (cur->children->parent == cur) - xmlTextReaderFreeNodeList(reader, cur->children); - cur->children = NULL; - } - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue(cur); - - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) && - (cur->properties != NULL)) - xmlTextReaderFreePropList(reader, cur->properties); - if ((cur->content != (xmlChar *) &(cur->properties)) && - (cur->type != XML_ELEMENT_NODE) && - (cur->type != XML_XINCLUDE_START) && - (cur->type != XML_XINCLUDE_END) && - (cur->type != XML_ENTITY_REF_NODE)) { - DICT_FREE(cur->content); - } - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_XINCLUDE_START) || - (cur->type == XML_XINCLUDE_END)) && - (cur->nsDef != NULL)) - xmlFreeNsList(cur->nsDef); - - /* - * we don't free names here they are interned now - */ - if ((cur->type != XML_TEXT_NODE) && - (cur->type != XML_COMMENT_NODE)) - DICT_FREE(cur->name); - - if (((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_TEXT_NODE)) && - (reader != NULL) && (reader->ctxt != NULL) && - (reader->ctxt->freeElemsNr < 100)) { - cur->next = reader->ctxt->freeElems; - reader->ctxt->freeElems = cur; - reader->ctxt->freeElemsNr++; - } else { - xmlFree(cur); - } -} - -/** - * xmlTextReaderFreeIDTable: - * @table: An id table - * - * Deallocate the memory used by an ID hash table. - */ -static void -xmlTextReaderFreeIDTable(xmlIDTablePtr table) { - xmlHashFree(table, (xmlHashDeallocator) xmlFreeID); -} - -/** - * xmlTextReaderFreeDoc: - * @reader: the xmlTextReaderPtr used - * @cur: pointer to the document - * - * Free up all the structures used by a document, tree included. - */ -static void -xmlTextReaderFreeDoc(xmlTextReaderPtr reader, xmlDocPtr cur) { - xmlDtdPtr extSubset, intSubset; - - if (cur == NULL) return; - - if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) - xmlDeregisterNodeDefaultValue((xmlNodePtr) cur); - - /* - * Do this before freeing the children list to avoid ID lookups - */ - if (cur->ids != NULL) xmlTextReaderFreeIDTable((xmlIDTablePtr) cur->ids); - cur->ids = NULL; - if (cur->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) cur->refs); - cur->refs = NULL; - extSubset = cur->extSubset; - intSubset = cur->intSubset; - if (intSubset == extSubset) - extSubset = NULL; - if (extSubset != NULL) { - xmlUnlinkNode((xmlNodePtr) cur->extSubset); - cur->extSubset = NULL; - xmlFreeDtd(extSubset); - } - if (intSubset != NULL) { - xmlUnlinkNode((xmlNodePtr) cur->intSubset); - cur->intSubset = NULL; - xmlFreeDtd(intSubset); - } - - if (cur->children != NULL) xmlTextReaderFreeNodeList(reader, cur->children); - - if (cur->version != NULL) xmlFree((char *) cur->version); - if (cur->name != NULL) xmlFree((char *) cur->name); - if (cur->encoding != NULL) xmlFree((char *) cur->encoding); - if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs); - if (cur->URL != NULL) xmlFree((char *) cur->URL); - if (cur->dict != NULL) xmlDictFree(cur->dict); - - xmlFree(cur); -} - -/************************************************************************ - * * - * The reader core parser * - * * - ************************************************************************/ -#ifdef DEBUG_READER -static void -xmlTextReaderDebug(xmlTextReaderPtr reader) { - if ((reader == NULL) || (reader->ctxt == NULL)) { - fprintf(stderr, "xmlTextReader NULL\n"); - return; - } - fprintf(stderr, "xmlTextReader: state %d depth %d ", - reader->state, reader->depth); - if (reader->node == NULL) { - fprintf(stderr, "node = NULL\n"); - } else { - fprintf(stderr, "node %s\n", reader->node->name); - } - fprintf(stderr, " input: base %d, cur %d, depth %d: ", - reader->base, reader->cur, reader->ctxt->nodeNr); - if (reader->input->buffer == NULL) { - fprintf(stderr, "buffer is NULL\n"); - } else { -#ifdef LIBXML_DEBUG_ENABLED - xmlDebugDumpString(stderr, - &reader->input->buffer->content[reader->cur]); -#endif - fprintf(stderr, "\n"); - } -} -#endif - -/** - * xmlTextReaderEntPush: - * @reader: the xmlTextReaderPtr used - * @value: the entity reference node - * - * Pushes a new entity reference node on top of the entities stack - * - * Returns 0 in case of error, the index in the stack otherwise - */ -static int -xmlTextReaderEntPush(xmlTextReaderPtr reader, xmlNodePtr value) -{ - if (reader->entMax <= 0) { - reader->entMax = 10; - reader->entTab = (xmlNodePtr *) xmlMalloc(reader->entMax * - sizeof(reader->entTab[0])); - if (reader->entTab == NULL) { - xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); - return (0); - } - } - if (reader->entNr >= reader->entMax) { - reader->entMax *= 2; - reader->entTab = - (xmlNodePtr *) xmlRealloc(reader->entTab, - reader->entMax * - sizeof(reader->entTab[0])); - if (reader->entTab == NULL) { - xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); - return (0); - } - } - reader->entTab[reader->entNr] = value; - reader->ent = value; - return (reader->entNr++); -} - -/** - * xmlTextReaderEntPop: - * @reader: the xmlTextReaderPtr used - * - * Pops the top element entity from the entities stack - * - * Returns the entity just removed - */ -static xmlNodePtr -xmlTextReaderEntPop(xmlTextReaderPtr reader) -{ - xmlNodePtr ret; - - if (reader->entNr <= 0) - return (NULL); - reader->entNr--; - if (reader->entNr > 0) - reader->ent = reader->entTab[reader->entNr - 1]; - else - reader->ent = NULL; - ret = reader->entTab[reader->entNr]; - reader->entTab[reader->entNr] = NULL; - return (ret); -} - -/** - * xmlTextReaderStartElement: - * @ctx: the user data (XML parser context) - * @fullname: The element name, including namespace prefix - * @atts: An array of name/value attributes pairs, NULL terminated - * - * called when an opening tag has been processed. - */ -static void -xmlTextReaderStartElement(void *ctx, const xmlChar *fullname, - const xmlChar **atts) { - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlTextReaderPtr reader = ctxt->_private; - -#ifdef DEBUG_CALLBACKS - printf("xmlTextReaderStartElement(%s)\n", fullname); -#endif - if ((reader != NULL) && (reader->startElement != NULL)) { - reader->startElement(ctx, fullname, atts); - if ((ctxt->node != NULL) && (ctxt->input != NULL) && - (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') && - (ctxt->input->cur[1] == '>')) - ctxt->node->extra = NODE_IS_EMPTY; - } - if (reader != NULL) - reader->state = XML_TEXTREADER_ELEMENT; -} - -/** - * xmlTextReaderEndElement: - * @ctx: the user data (XML parser context) - * @fullname: The element name, including namespace prefix - * - * called when an ending tag has been processed. - */ -static void -xmlTextReaderEndElement(void *ctx, const xmlChar *fullname) { - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlTextReaderPtr reader = ctxt->_private; - -#ifdef DEBUG_CALLBACKS - printf("xmlTextReaderEndElement(%s)\n", fullname); -#endif - if ((reader != NULL) && (reader->endElement != NULL)) { - reader->endElement(ctx, fullname); - } -} - -/** - * xmlTextReaderStartElementNs: - * @ctx: the user data (XML parser context) - * @localname: the local name of the element - * @prefix: the element namespace prefix if available - * @URI: the element namespace name if available - * @nb_namespaces: number of namespace definitions on that node - * @namespaces: pointer to the array of prefix/URI pairs namespace definitions - * @nb_attributes: the number of attributes on that node - * nb_defaulted: the number of defaulted attributes. - * @attributes: pointer to the array of (localname/prefix/URI/value/end) - * attribute values. - * - * called when an opening tag has been processed. - */ -static void -xmlTextReaderStartElementNs(void *ctx, - const xmlChar *localname, - const xmlChar *prefix, - const xmlChar *URI, - int nb_namespaces, - const xmlChar **namespaces, - int nb_attributes, - int nb_defaulted, - const xmlChar **attributes) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlTextReaderPtr reader = ctxt->_private; - -#ifdef DEBUG_CALLBACKS - printf("xmlTextReaderStartElementNs(%s)\n", localname); -#endif - if ((reader != NULL) && (reader->startElementNs != NULL)) { - reader->startElementNs(ctx, localname, prefix, URI, nb_namespaces, - namespaces, nb_attributes, nb_defaulted, - attributes); - if ((ctxt->node != NULL) && (ctxt->input != NULL) && - (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') && - (ctxt->input->cur[1] == '>')) - ctxt->node->extra = NODE_IS_EMPTY; - } - if (reader != NULL) - reader->state = XML_TEXTREADER_ELEMENT; -} - -/** - * xmlTextReaderEndElementNs: - * @ctx: the user data (XML parser context) - * @localname: the local name of the element - * @prefix: the element namespace prefix if available - * @URI: the element namespace name if available - * - * called when an ending tag has been processed. - */ -static void -xmlTextReaderEndElementNs(void *ctx, - const xmlChar * localname, - const xmlChar * prefix, - const xmlChar * URI) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlTextReaderPtr reader = ctxt->_private; - -#ifdef DEBUG_CALLBACKS - printf("xmlTextReaderEndElementNs(%s)\n", localname); -#endif - if ((reader != NULL) && (reader->endElementNs != NULL)) { - reader->endElementNs(ctx, localname, prefix, URI); - } -} - - -/** - * xmlTextReaderCharacters: - * @ctx: the user data (XML parser context) - * @ch: a xmlChar string - * @len: the number of xmlChar - * - * receiving some chars from the parser. - */ -static void -xmlTextReaderCharacters(void *ctx, const xmlChar *ch, int len) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlTextReaderPtr reader = ctxt->_private; - -#ifdef DEBUG_CALLBACKS - printf("xmlTextReaderCharacters()\n"); -#endif - if ((reader != NULL) && (reader->characters != NULL)) { - reader->characters(ctx, ch, len); - } -} - -/** - * xmlTextReaderCDataBlock: - * @ctx: the user data (XML parser context) - * @value: The pcdata content - * @len: the block length - * - * called when a pcdata block has been parsed - */ -static void -xmlTextReaderCDataBlock(void *ctx, const xmlChar *ch, int len) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlTextReaderPtr reader = ctxt->_private; - -#ifdef DEBUG_CALLBACKS - printf("xmlTextReaderCDataBlock()\n"); -#endif - if ((reader != NULL) && (reader->cdataBlock != NULL)) { - reader->cdataBlock(ctx, ch, len); - } -} - -/** - * xmlTextReaderPushData: - * @reader: the xmlTextReaderPtr used - * - * Push data down the progressive parser until a significant callback - * got raised. - * - * Returns -1 in case of failure, 0 otherwise - */ -static int -xmlTextReaderPushData(xmlTextReaderPtr reader) { - xmlBufferPtr inbuf; - int val, s; - xmlTextReaderState oldstate; - - if ((reader->input == NULL) || (reader->input->buffer == NULL)) - return(-1); - - oldstate = reader->state; - reader->state = XML_TEXTREADER_NONE; - inbuf = reader->input->buffer; - - while (reader->state == XML_TEXTREADER_NONE) { - if (inbuf->use < reader->cur + CHUNK_SIZE) { - /* - * Refill the buffer unless we are at the end of the stream - */ - if (reader->mode != XML_TEXTREADER_MODE_EOF) { - val = xmlParserInputBufferRead(reader->input, 4096); - if ((val == 0) && - (inbuf->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) { - if (inbuf->use == reader->cur) { - reader->mode = XML_TEXTREADER_MODE_EOF; - reader->state = oldstate; - } - } else if (val < 0) { - reader->mode = XML_TEXTREADER_MODE_EOF; - reader->state = oldstate; - if ((oldstate != XML_TEXTREADER_START) || - (reader->ctxt->myDoc != NULL)) - return(val); - } else if (val == 0) { - /* mark the end of the stream and process the remains */ - reader->mode = XML_TEXTREADER_MODE_EOF; - break; - } - - } else - break; - } - /* - * parse by block of CHUNK_SIZE bytes, various tests show that - * it's the best tradeoff at least on a 1.2GH Duron - */ - if (inbuf->use >= reader->cur + CHUNK_SIZE) { - val = xmlParseChunk(reader->ctxt, - (const char *) &inbuf->content[reader->cur], - CHUNK_SIZE, 0); - reader->cur += CHUNK_SIZE; - if ((val != 0) || (reader->ctxt->wellFormed == 0)) - return(-1); - } else { - s = inbuf->use - reader->cur; - val = xmlParseChunk(reader->ctxt, - (const char *) &inbuf->content[reader->cur], - s, 0); - reader->cur += s; - if ((val != 0) || (reader->ctxt->wellFormed == 0)) - return(-1); - break; - } - } - - /* - * Discard the consumed input when needed and possible - */ - if (reader->mode == XML_TEXTREADER_MODE_INTERACTIVE) { - if (inbuf->alloc != XML_BUFFER_ALLOC_IMMUTABLE) { - if ((reader->cur >= 4096) && - (inbuf->use - reader->cur <= CHUNK_SIZE)) { - val = xmlBufferShrink(inbuf, reader->cur); - if (val >= 0) { - reader->cur -= val; - } - } - } - } - - /* - * At the end of the stream signal that the work is done to the Push - * parser. - */ - else if (reader->mode == XML_TEXTREADER_MODE_EOF) { - if (reader->mode != XML_TEXTREADER_DONE) { - s = inbuf->use - reader->cur; - val = xmlParseChunk(reader->ctxt, - (const char *) &inbuf->content[reader->cur], - s, 1); - reader->cur = inbuf->use; - reader->mode = XML_TEXTREADER_DONE; - if ((val != 0) || (reader->ctxt->wellFormed == 0)) - return(-1); - } - } - reader->state = oldstate; - return(0); -} - -#ifdef LIBXML_REGEXP_ENABLED -/** - * xmlTextReaderValidatePush: - * @reader: the xmlTextReaderPtr used - * - * Push the current node for validation - */ -static void -xmlTextReaderValidatePush(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) { - xmlNodePtr node = reader->node; - -#ifdef LIBXML_VALID_ENABLED - if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && - (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { - if ((node->ns == NULL) || (node->ns->prefix == NULL)) { - reader->ctxt->valid &= xmlValidatePushElement(&reader->ctxt->vctxt, - reader->ctxt->myDoc, node, node->name); - } else { - /* TODO use the BuildQName interface */ - xmlChar *qname; - - qname = xmlStrdup(node->ns->prefix); - qname = xmlStrcat(qname, BAD_CAST ":"); - qname = xmlStrcat(qname, node->name); - reader->ctxt->valid &= xmlValidatePushElement(&reader->ctxt->vctxt, - reader->ctxt->myDoc, node, qname); - if (qname != NULL) - xmlFree(qname); - } - } -#endif /* LIBXML_VALID_ENABLED */ -#ifdef LIBXML_SCHEMAS_ENABLED - if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && - (reader->rngValidCtxt != NULL)) { - int ret; - - if (reader->rngFullNode != NULL) return; - ret = xmlRelaxNGValidatePushElement(reader->rngValidCtxt, - reader->ctxt->myDoc, - node); - if (ret == 0) { - /* - * this element requires a full tree - */ - node = xmlTextReaderExpand(reader); - if (node == NULL) { -printf("Expand failed !\n"); - ret = -1; - } else { - ret = xmlRelaxNGValidateFullElement(reader->rngValidCtxt, - reader->ctxt->myDoc, - node); - reader->rngFullNode = node; - } - } - if (ret != 1) - reader->rngValidErrors++; - } -#endif -} - -/** - * xmlTextReaderValidateCData: - * @reader: the xmlTextReaderPtr used - * @data: pointer to the CData - * @len: length of the CData block in bytes. - * - * Push some CData for validation - */ -static void -xmlTextReaderValidateCData(xmlTextReaderPtr reader, - const xmlChar *data, int len) { -#ifdef LIBXML_VALID_ENABLED - if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && - (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { - reader->ctxt->valid &= xmlValidatePushCData(&reader->ctxt->vctxt, - data, len); - } -#endif /* LIBXML_VALID_ENABLED */ -#ifdef LIBXML_SCHEMAS_ENABLED - if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && - (reader->rngValidCtxt != NULL)) { - int ret; - - if (reader->rngFullNode != NULL) return; - ret = xmlRelaxNGValidatePushCData(reader->rngValidCtxt, data, len); - if (ret != 1) - reader->rngValidErrors++; - } -#endif -} - -/** - * xmlTextReaderValidatePop: - * @reader: the xmlTextReaderPtr used - * - * Pop the current node from validation - */ -static void -xmlTextReaderValidatePop(xmlTextReaderPtr reader) { - xmlNodePtr node = reader->node; - -#ifdef LIBXML_VALID_ENABLED - if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && - (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { - if ((node->ns == NULL) || (node->ns->prefix == NULL)) { - reader->ctxt->valid &= xmlValidatePopElement(&reader->ctxt->vctxt, - reader->ctxt->myDoc, node, node->name); - } else { - /* TODO use the BuildQName interface */ - xmlChar *qname; - - qname = xmlStrdup(node->ns->prefix); - qname = xmlStrcat(qname, BAD_CAST ":"); - qname = xmlStrcat(qname, node->name); - reader->ctxt->valid &= xmlValidatePopElement(&reader->ctxt->vctxt, - reader->ctxt->myDoc, node, qname); - if (qname != NULL) - xmlFree(qname); - } - } -#endif /* LIBXML_VALID_ENABLED */ -#ifdef LIBXML_SCHEMAS_ENABLED - if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && - (reader->rngValidCtxt != NULL)) { - int ret; - - if (reader->rngFullNode != NULL) { - if (node == reader->rngFullNode) - reader->rngFullNode = NULL; - return; - } - ret = xmlRelaxNGValidatePopElement(reader->rngValidCtxt, - reader->ctxt->myDoc, - node); - if (ret != 1) - reader->rngValidErrors++; - } -#endif -} - -/** - * xmlTextReaderValidateEntity: - * @reader: the xmlTextReaderPtr used - * - * Handle the validation when an entity reference is encountered and - * entity substitution is not activated. As a result the parser interface - * must walk through the entity and do the validation calls - */ -static void -xmlTextReaderValidateEntity(xmlTextReaderPtr reader) { - xmlNodePtr oldnode = reader->node; - xmlNodePtr node = reader->node; - xmlParserCtxtPtr ctxt = reader->ctxt; - - do { - if (node->type == XML_ENTITY_REF_NODE) { - /* - * Case where the underlying tree is not availble, lookup the entity - * and walk it. - */ - if ((node->children == NULL) && (ctxt->sax != NULL) && - (ctxt->sax->getEntity != NULL)) { - node->children = (xmlNodePtr) - ctxt->sax->getEntity(ctxt, node->name); - } - - if ((node->children != NULL) && - (node->children->type == XML_ENTITY_DECL) && - (node->children->children != NULL)) { - xmlTextReaderEntPush(reader, node); - node = node->children->children; - continue; - } else { - /* - * The error has probably be raised already. - */ - if (node == oldnode) - break; - node = node->next; - } -#ifdef LIBXML_REGEXP_ENABLED - } else if (node->type == XML_ELEMENT_NODE) { - reader->node = node; - xmlTextReaderValidatePush(reader); - } else if ((node->type == XML_TEXT_NODE) || - (node->type == XML_CDATA_SECTION_NODE)) { - xmlTextReaderValidateCData(reader, node->content, - xmlStrlen(node->content)); -#endif - } - - /* - * go to next node - */ - if (node->children != NULL) { - node = node->children; - continue; - } else if (node->type == XML_ELEMENT_NODE) { - xmlTextReaderValidatePop(reader); - } - if (node->next != NULL) { - node = node->next; - continue; - } - do { - node = node->parent; - if (node->type == XML_ELEMENT_NODE) { - xmlNodePtr tmp; - if (reader->entNr == 0) { - while ((tmp = node->last) != NULL) { - if ((tmp->extra & NODE_IS_PRESERVED) == 0) { - xmlUnlinkNode(tmp); - xmlTextReaderFreeNode(reader, tmp); - } else - break; - } - } - reader->node = node; - xmlTextReaderValidatePop(reader); - } - if ((node->type == XML_ENTITY_DECL) && - (reader->ent != NULL) && (reader->ent->children == node)) { - node = xmlTextReaderEntPop(reader); - } - if (node == oldnode) - break; - if (node->next != NULL) { - node = node->next; - break; - } - } while ((node != NULL) && (node != oldnode)); - } while ((node != NULL) && (node != oldnode)); - reader->node = oldnode; -} -#endif /* LIBXML_REGEXP_ENABLED */ - - -/** - * xmlTextReaderGetSuccessor: - * @cur: the current node - * - * Get the successor of a node if available. - * - * Returns the successor node or NULL - */ -static xmlNodePtr -xmlTextReaderGetSuccessor(xmlNodePtr cur) { - if (cur == NULL) return(NULL) ; /* ERROR */ - if (cur->next != NULL) return(cur->next) ; - do { - cur = cur->parent; - if (cur == NULL) break; - if (cur->next != NULL) return(cur->next); - } while (cur != NULL); - return(cur); -} - -/** - * xmlTextReaderDoExpand: - * @reader: the xmlTextReaderPtr used - * - * Makes sure that the current node is fully read as well as all its - * descendant. It means the full DOM subtree must be available at the - * end of the call. - * - * Returns 1 if the node was expanded successfully, 0 if there is no more - * nodes to read, or -1 in case of error - */ -static int -xmlTextReaderDoExpand(xmlTextReaderPtr reader) { - int val; - - if ((reader == NULL) || (reader->node == NULL) || (reader->ctxt == NULL)) - return(-1); - do { - if (reader->ctxt->instate == XML_PARSER_EOF) return(1); - - if (xmlTextReaderGetSuccessor(reader->node) != NULL) - return(1); - if (reader->ctxt->nodeNr < reader->depth) - return(1); - if (reader->mode == XML_TEXTREADER_MODE_EOF) - return(1); - val = xmlTextReaderPushData(reader); - if (val < 0) - return(-1); - } while(reader->mode != XML_TEXTREADER_MODE_EOF); - return(1); -} - -/** - * xmlTextReaderCollectSiblings: - * @node: the first child - * - * Traverse depth-first through all sibling nodes and their children - * nodes and concatenate their content. This is an auxiliary function - * to xmlTextReaderReadString. - * - * Returns a string containing the content, or NULL in case of error. - */ -static xmlChar * -xmlTextReaderCollectSiblings(xmlNodePtr node) -{ - xmlBufferPtr buffer; - xmlChar *ret; - - buffer = xmlBufferCreate(); - if (buffer == NULL) - return NULL; - - for ( ; node != NULL; node = node->next) { - switch (node->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - xmlBufferCat(buffer, node->content); - break; - case XML_ELEMENT_NODE: { - xmlChar *tmp; - - tmp = xmlTextReaderCollectSiblings(node->children); - xmlBufferCat(buffer, tmp); - xmlFree(tmp); - break; - } - default: - break; - } - } - ret = buffer->content; - buffer->content = NULL; - xmlBufferFree(buffer); - return(ret); -} - -/** - * xmlTextReaderRead: - * @reader: the xmlTextReaderPtr used - * - * Moves the position of the current instance to the next node in - * the stream, exposing its properties. - * - * Returns 1 if the node was read successfully, 0 if there is no more - * nodes to read, or -1 in case of error - */ -int -xmlTextReaderRead(xmlTextReaderPtr reader) { - int val, olddepth = 0; - xmlTextReaderState oldstate = XML_TEXTREADER_START; - xmlNodePtr oldnode = NULL; - - - if (reader == NULL) - return(-1); - reader->curnode = NULL; - if (reader->doc != NULL) - return(xmlTextReaderReadTree(reader)); - if (reader->ctxt == NULL) - return(-1); - if (reader->ctxt->wellFormed != 1) - return(-1); - -#ifdef DEBUG_READER - fprintf(stderr, "\nREAD "); - DUMP_READER -#endif - if (reader->mode == XML_TEXTREADER_MODE_INITIAL) { - reader->mode = XML_TEXTREADER_MODE_INTERACTIVE; - /* - * Initial state - */ - do { - val = xmlTextReaderPushData(reader); - if (val < 0) - return(-1); - } while ((reader->ctxt->node == NULL) && - ((reader->mode != XML_TEXTREADER_MODE_EOF) && - (reader->mode != XML_TEXTREADER_DONE))); - if (reader->ctxt->node == NULL) { - if (reader->ctxt->myDoc != NULL) { - reader->node = reader->ctxt->myDoc->children; - } - if (reader->node == NULL) - return(-1); - reader->state = XML_TEXTREADER_ELEMENT; - } else { - if (reader->ctxt->myDoc != NULL) { - reader->node = reader->ctxt->myDoc->children; - } - if (reader->node == NULL) - reader->node = reader->ctxt->nodeTab[0]; - reader->state = XML_TEXTREADER_ELEMENT; - } - reader->depth = 0; - reader->ctxt->parseMode = XML_PARSE_READER; - goto node_found; - } - oldstate = reader->state; - olddepth = reader->ctxt->nodeNr; - oldnode = reader->node; - -get_next_node: - if (reader->node == NULL) { - if (reader->mode == XML_TEXTREADER_DONE) - return(0); - else - return(-1); - } - - /* - * If we are not backtracking on ancestors or examined nodes, - * that the parser didn't finished or that we arent at the end - * of stream, continue processing. - */ - while ((reader->node != NULL) && (reader->node->next == NULL) && - (reader->ctxt->nodeNr == olddepth) && - ((oldstate == XML_TEXTREADER_BACKTRACK) || - (reader->node->children == NULL) || - (reader->node->type == XML_ENTITY_REF_NODE) || - ((reader->node->children != NULL) && - (reader->node->children->type == XML_TEXT_NODE) && - (reader->node->children->next == NULL)) || - (reader->node->type == XML_DTD_NODE) || - (reader->node->type == XML_DOCUMENT_NODE) || - (reader->node->type == XML_HTML_DOCUMENT_NODE)) && - ((reader->ctxt->node == NULL) || - (reader->ctxt->node == reader->node) || - (reader->ctxt->node == reader->node->parent)) && - (reader->ctxt->instate != XML_PARSER_EOF)) { - val = xmlTextReaderPushData(reader); - if (val < 0) - return(-1); - if (reader->node == NULL) - goto node_end; - } - if (oldstate != XML_TEXTREADER_BACKTRACK) { - if ((reader->node->children != NULL) && - (reader->node->type != XML_ENTITY_REF_NODE) && - (reader->node->type != XML_XINCLUDE_START) && - (reader->node->type != XML_DTD_NODE)) { - reader->node = reader->node->children; - reader->depth++; - reader->state = XML_TEXTREADER_ELEMENT; - goto node_found; - } - } - if (reader->node->next != NULL) { - if ((oldstate == XML_TEXTREADER_ELEMENT) && - (reader->node->type == XML_ELEMENT_NODE) && - (reader->node->children == NULL) && - ((reader->node->extra & NODE_IS_EMPTY) == 0) -#ifdef LIBXML_XINCLUDE_ENABLED - && (reader->in_xinclude <= 0) -#endif - ) { - reader->state = XML_TEXTREADER_END; - goto node_found; - } -#ifdef LIBXML_REGEXP_ENABLED - if ((reader->validate) && - (reader->node->type == XML_ELEMENT_NODE)) - xmlTextReaderValidatePop(reader); -#endif /* LIBXML_REGEXP_ENABLED */ - if ((reader->preserves > 0) && - (reader->node->extra & NODE_IS_SPRESERVED)) - reader->preserves--; - reader->node = reader->node->next; - reader->state = XML_TEXTREADER_ELEMENT; - - /* - * Cleanup of the old node - */ - if ((reader->preserves == 0) && -#ifdef LIBXML_XINCLUDE_ENABLED - (reader->in_xinclude == 0) && -#endif - (reader->entNr == 0) && - (reader->node->prev != NULL) && - (reader->node->prev->type != XML_DTD_NODE) && - (reader->entNr == 0)) { - xmlNodePtr tmp = reader->node->prev; - if ((tmp->extra & NODE_IS_PRESERVED) == 0) { - xmlUnlinkNode(tmp); - xmlTextReaderFreeNode(reader, tmp); - } - } - - goto node_found; - } - if ((oldstate == XML_TEXTREADER_ELEMENT) && - (reader->node->type == XML_ELEMENT_NODE) && - (reader->node->children == NULL) && - ((reader->node->extra & NODE_IS_EMPTY) == 0)) {; - reader->state = XML_TEXTREADER_END; - goto node_found; - } -#ifdef LIBXML_REGEXP_ENABLED - if ((reader->validate) && (reader->node->type == XML_ELEMENT_NODE)) - xmlTextReaderValidatePop(reader); -#endif /* LIBXML_REGEXP_ENABLED */ - if ((reader->preserves > 0) && - (reader->node->extra & NODE_IS_SPRESERVED)) - reader->preserves--; - reader->node = reader->node->parent; - if ((reader->node == NULL) || - (reader->node->type == XML_DOCUMENT_NODE) || -#ifdef LIBXML_DOCB_ENABLED - (reader->node->type == XML_DOCB_DOCUMENT_NODE) || -#endif - (reader->node->type == XML_HTML_DOCUMENT_NODE)) { - if (reader->mode != XML_TEXTREADER_DONE) { - val = xmlParseChunk(reader->ctxt, "", 0, 1); - reader->mode = XML_TEXTREADER_DONE; - if (val != 0) - return(-1); - } - reader->node = NULL; - reader->depth = -1; - - /* - * Cleanup of the old node - */ - if ((reader->preserves == 0) && -#ifdef LIBXML_XINCLUDE_ENABLED - (reader->in_xinclude == 0) && -#endif - (reader->entNr == 0) && - (oldnode->type != XML_DTD_NODE) && - ((oldnode->extra & NODE_IS_PRESERVED) == 0) && - (reader->entNr == 0)) { - xmlUnlinkNode(oldnode); - xmlTextReaderFreeNode(reader, oldnode); - } - - goto node_end; - } - if ((reader->preserves == 0) && -#ifdef LIBXML_XINCLUDE_ENABLED - (reader->in_xinclude == 0) && -#endif - (reader->entNr == 0) && - (reader->node->last != NULL) && - ((reader->node->last->extra & NODE_IS_PRESERVED) == 0)) { - xmlNodePtr tmp = reader->node->last; - xmlUnlinkNode(tmp); - xmlTextReaderFreeNode(reader, tmp); - } - reader->depth--; - reader->state = XML_TEXTREADER_BACKTRACK; - -node_found: - DUMP_READER - - /* - * If we are in the middle of a piece of CDATA make sure it's finished - */ - if ((reader->node != NULL) && - (reader->node->next == NULL) && - ((reader->node->type == XML_TEXT_NODE) || - (reader->node->type == XML_CDATA_SECTION_NODE))) { - if (xmlTextReaderExpand(reader) == NULL) - return -1; - } - -#ifdef LIBXML_XINCLUDE_ENABLED - /* - * Handle XInclude if asked for - */ - if ((reader->xinclude) && (reader->node != NULL) && - (reader->node->type == XML_ELEMENT_NODE) && - (reader->node->ns != NULL) && - ((xmlStrEqual(reader->node->ns->href, XINCLUDE_NS)) || - (xmlStrEqual(reader->node->ns->href, XINCLUDE_OLD_NS)))) { - if (reader->xincctxt == NULL) { - reader->xincctxt = xmlXIncludeNewContext(reader->ctxt->myDoc); - xmlXIncludeSetFlags(reader->xincctxt, - reader->parserFlags & (~XML_PARSE_NOXINCNODE)); - } - /* - * expand that node and process it - */ - if (xmlTextReaderExpand(reader) == NULL) - return -1; - xmlXIncludeProcessNode(reader->xincctxt, reader->node); - } - if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_START)) { - reader->in_xinclude++; - goto get_next_node; - } - if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_END)) { - reader->in_xinclude--; - goto get_next_node; - } -#endif - /* - * Handle entities enter and exit when in entity replacement mode - */ - if ((reader->node != NULL) && - (reader->node->type == XML_ENTITY_REF_NODE) && - (reader->ctxt != NULL) && (reader->ctxt->replaceEntities == 1)) { - /* - * Case where the underlying tree is not availble, lookup the entity - * and walk it. - */ - if ((reader->node->children == NULL) && (reader->ctxt->sax != NULL) && - (reader->ctxt->sax->getEntity != NULL)) { - reader->node->children = (xmlNodePtr) - reader->ctxt->sax->getEntity(reader->ctxt, reader->node->name); - } - - if ((reader->node->children != NULL) && - (reader->node->children->type == XML_ENTITY_DECL) && - (reader->node->children->children != NULL)) { - xmlTextReaderEntPush(reader, reader->node); - reader->node = reader->node->children->children; - } -#ifdef LIBXML_REGEXP_ENABLED - } else if ((reader->node != NULL) && - (reader->node->type == XML_ENTITY_REF_NODE) && - (reader->ctxt != NULL) && (reader->validate)) { - xmlTextReaderValidateEntity(reader); -#endif /* LIBXML_REGEXP_ENABLED */ - } - if ((reader->node != NULL) && - (reader->node->type == XML_ENTITY_DECL) && - (reader->ent != NULL) && (reader->ent->children == reader->node)) { - reader->node = xmlTextReaderEntPop(reader); - reader->depth++; - goto get_next_node; - } -#ifdef LIBXML_REGEXP_ENABLED - if ((reader->validate) && (reader->node != NULL)) { - xmlNodePtr node = reader->node; - - if ((node->type == XML_ELEMENT_NODE) && - ((reader->state != XML_TEXTREADER_END) && - (reader->state != XML_TEXTREADER_BACKTRACK))) { - xmlTextReaderValidatePush(reader); - } else if ((node->type == XML_TEXT_NODE) || - (node->type == XML_CDATA_SECTION_NODE)) { - xmlTextReaderValidateCData(reader, node->content, - xmlStrlen(node->content)); - } - } -#endif /* LIBXML_REGEXP_ENABLED */ -#ifdef LIBXML_PATTERN_ENABLED - if ((reader->patternNr > 0) && (reader->state != XML_TEXTREADER_END) && - (reader->state != XML_TEXTREADER_BACKTRACK)) { - int i; - for (i = 0;i < reader->patternNr;i++) { - if (xmlPatternMatch(reader->patternTab[i], reader->node) == 1) { - xmlTextReaderPreserve(reader); - break; - } - } - } -#endif /* LIBXML_PATTERN_ENABLED */ -#ifdef LIBXML_SCHEMAS_ENABLED - if ((reader->validate == XML_TEXTREADER_VALIDATE_XSD) && - (reader->xsdValidErrors == 0) && - (reader->xsdValidCtxt != NULL)) { - reader->xsdValidErrors = !xmlSchemaIsValid(reader->xsdValidCtxt); - } -#endif /* LIBXML_PATTERN_ENABLED */ - return(1); -node_end: - reader->mode = XML_TEXTREADER_DONE; - return(0); -} - -/** - * xmlTextReaderReadState: - * @reader: the xmlTextReaderPtr used - * - * Gets the read state of the reader. - * - * Returns the state value, or -1 in case of error - */ -int -xmlTextReaderReadState(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - return(reader->mode); -} - -/** - * xmlTextReaderExpand: - * @reader: the xmlTextReaderPtr used - * - * Reads the contents of the current node and the full subtree. It then makes - * the subtree available until the next xmlTextReaderRead() call - * - * Returns a node pointer valid until the next xmlTextReaderRead() call - * or NULL in case of error. - */ -xmlNodePtr -xmlTextReaderExpand(xmlTextReaderPtr reader) { - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->doc != NULL) - return(reader->node); - if (reader->ctxt == NULL) - return(NULL); - if (xmlTextReaderDoExpand(reader) < 0) - return(NULL); - return(reader->node); -} - -/** - * xmlTextReaderNext: - * @reader: the xmlTextReaderPtr used - * - * Skip to the node following the current one in document order while - * avoiding the subtree if any. - * - * Returns 1 if the node was read successfully, 0 if there is no more - * nodes to read, or -1 in case of error - */ -int -xmlTextReaderNext(xmlTextReaderPtr reader) { - int ret; - xmlNodePtr cur; - - if (reader == NULL) - return(-1); - if (reader->doc != NULL) - return(xmlTextReaderNextTree(reader)); - cur = reader->node; - if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE)) - return(xmlTextReaderRead(reader)); - if (reader->state == XML_TEXTREADER_END || reader->state == XML_TEXTREADER_BACKTRACK) - return(xmlTextReaderRead(reader)); - if (cur->extra & NODE_IS_EMPTY) - return(xmlTextReaderRead(reader)); - do { - ret = xmlTextReaderRead(reader); - if (ret != 1) - return(ret); - } while (reader->node != cur); - return(xmlTextReaderRead(reader)); -} - -#ifdef LIBXML_WRITER_ENABLED -/** - * xmlTextReaderReadInnerXml: - * @reader: the xmlTextReaderPtr used - * - * Reads the contents of the current node, including child nodes and markup. - * - * Returns a string containing the XML content, or NULL if the current node - * is neither an element nor attribute, or has no child nodes. The - * string must be deallocated by the caller. - */ -xmlChar * -xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) -{ - xmlChar *resbuf; - xmlNodePtr node, cur_node; - xmlBufferPtr buff, buff2; - xmlDocPtr doc; - - if (xmlTextReaderExpand(reader) == NULL) { - return NULL; - } - doc = reader->doc; - buff = xmlBufferCreate(); - for (cur_node = reader->node->children; cur_node != NULL; - cur_node = cur_node->next) { - node = xmlDocCopyNode(cur_node, doc, 1); - buff2 = xmlBufferCreate(); - if (xmlNodeDump(buff2, doc, node, 0, 0) == -1) { - xmlFreeNode(node); - xmlBufferFree(buff2); - xmlBufferFree(buff); - return NULL; - } - xmlBufferCat(buff, buff2->content); - xmlFreeNode(node); - xmlBufferFree(buff2); - } - resbuf = buff->content; - buff->content = NULL; - - xmlBufferFree(buff); - return resbuf; -} -#endif - -#ifdef LIBXML_WRITER_ENABLED -/** - * xmlTextReaderReadOuterXml: - * @reader: the xmlTextReaderPtr used - * - * Reads the contents of the current node, including child nodes and markup. - * - * Returns a string containing the XML content, or NULL if the current node - * is neither an element nor attribute, or has no child nodes. The - * string must be deallocated by the caller. - */ -xmlChar * -xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) -{ - xmlChar *resbuf; - xmlNodePtr node; - xmlBufferPtr buff; - xmlDocPtr doc; - - node = reader->node; - doc = reader->doc; - if (xmlTextReaderExpand(reader) == NULL) { - return NULL; - } - node = xmlDocCopyNode(node, doc, 1); - buff = xmlBufferCreate(); - if (xmlNodeDump(buff, doc, node, 0, 0) == -1) { - xmlFreeNode(node); - xmlBufferFree(buff); - return NULL; - } - - resbuf = buff->content; - buff->content = NULL; - - xmlFreeNode(node); - xmlBufferFree(buff); - return resbuf; -} -#endif - -/** - * xmlTextReaderReadString: - * @reader: the xmlTextReaderPtr used - * - * Reads the contents of an element or a text node as a string. - * - * Returns a string containing the contents of the Element or Text node, - * or NULL if the reader is positioned on any other type of node. - * The string must be deallocated by the caller. - */ -xmlChar * -xmlTextReaderReadString(xmlTextReaderPtr reader) -{ - xmlNodePtr node; - - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - - node = (reader->curnode != NULL) ? reader->curnode : reader->node; - switch (node->type) { - case XML_TEXT_NODE: - if (node->content != NULL) - return(xmlStrdup(node->content)); - break; - case XML_ELEMENT_NODE: - if (xmlTextReaderDoExpand(reader) != -1) { - return xmlTextReaderCollectSiblings(node->children); - } - case XML_ATTRIBUTE_NODE: - TODO - break; - default: - break; - } - return(NULL); -} - -#if 0 -/** - * xmlTextReaderReadBase64: - * @reader: the xmlTextReaderPtr used - * @array: a byte array to store the content. - * @offset: the zero-based index into array where the method should - * begin to write. - * @len: the number of bytes to write. - * - * Reads and decodes the Base64 encoded contents of an element and - * stores the result in a byte buffer. - * - * Returns the number of bytes written to array, or zero if the current - * instance is not positioned on an element or -1 in case of error. - */ -int -xmlTextReaderReadBase64(xmlTextReaderPtr reader, - unsigned char *array ATTRIBUTE_UNUSED, - int offset ATTRIBUTE_UNUSED, - int len ATTRIBUTE_UNUSED) { - if ((reader == NULL) || (reader->ctxt == NULL)) - return(-1); - if (reader->ctxt->wellFormed != 1) - return(-1); - - if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE)) - return(0); - TODO - return(0); -} - -/** - * xmlTextReaderReadBinHex: - * @reader: the xmlTextReaderPtr used - * @array: a byte array to store the content. - * @offset: the zero-based index into array where the method should - * begin to write. - * @len: the number of bytes to write. - * - * Reads and decodes the BinHex encoded contents of an element and - * stores the result in a byte buffer. - * - * Returns the number of bytes written to array, or zero if the current - * instance is not positioned on an element or -1 in case of error. - */ -int -xmlTextReaderReadBinHex(xmlTextReaderPtr reader, - unsigned char *array ATTRIBUTE_UNUSED, - int offset ATTRIBUTE_UNUSED, - int len ATTRIBUTE_UNUSED) { - if ((reader == NULL) || (reader->ctxt == NULL)) - return(-1); - if (reader->ctxt->wellFormed != 1) - return(-1); - - if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE)) - return(0); - TODO - return(0); -} -#endif - -/************************************************************************ - * * - * Operating on a preparsed tree * - * * - ************************************************************************/ -static int -xmlTextReaderNextTree(xmlTextReaderPtr reader) -{ - if (reader == NULL) - return(-1); - - if (reader->state == XML_TEXTREADER_END) - return(0); - - if (reader->node == NULL) { - if (reader->doc->children == NULL) { - reader->state = XML_TEXTREADER_END; - return(0); - } - - reader->node = reader->doc->children; - reader->state = XML_TEXTREADER_START; - return(1); - } - - if (reader->state != XML_TEXTREADER_BACKTRACK) { - if (reader->node->children != 0) { - reader->node = reader->node->children; - reader->depth++; - reader->state = XML_TEXTREADER_START; - return(1); - } - - if ((reader->node->type == XML_ELEMENT_NODE) || - (reader->node->type == XML_ATTRIBUTE_NODE)) { - reader->state = XML_TEXTREADER_BACKTRACK; - return(1); - } - } - - if (reader->node->next != 0) { - reader->node = reader->node->next; - reader->state = XML_TEXTREADER_START; - return(1); - } - - if (reader->node->parent != 0) { - if (reader->node->parent->type == XML_DOCUMENT_NODE) { - reader->state = XML_TEXTREADER_END; - return(0); - } - - reader->node = reader->node->parent; - reader->depth--; - reader->state = XML_TEXTREADER_BACKTRACK; - return(1); - } - - reader->state = XML_TEXTREADER_END; - - return(1); -} - -/** - * xmlTextReaderReadTree: - * @reader: the xmlTextReaderPtr used - * - * Moves the position of the current instance to the next node in - * the stream, exposing its properties. - * - * Returns 1 if the node was read successfully, 0 if there is no more - * nodes to read, or -1 in case of error - */ -static int -xmlTextReaderReadTree(xmlTextReaderPtr reader) { - if (reader->state == XML_TEXTREADER_END) - return(0); - -next_node: - if (reader->node == NULL) { - if (reader->doc->children == NULL) { - reader->state = XML_TEXTREADER_END; - return(0); - } - - reader->node = reader->doc->children; - reader->state = XML_TEXTREADER_START; - goto found_node; - } - - if ((reader->state != XML_TEXTREADER_BACKTRACK) && - (reader->node->type != XML_DTD_NODE) && - (reader->node->type != XML_XINCLUDE_START) && - (reader->node->type != XML_ENTITY_REF_NODE)) { - if (reader->node->children != NULL) { - reader->node = reader->node->children; - reader->depth++; - reader->state = XML_TEXTREADER_START; - goto found_node; - } - - if (reader->node->type == XML_ATTRIBUTE_NODE) { - reader->state = XML_TEXTREADER_BACKTRACK; - goto found_node; - } - } - - if (reader->node->next != NULL) { - reader->node = reader->node->next; - reader->state = XML_TEXTREADER_START; - goto found_node; - } - - if (reader->node->parent != NULL) { - if ((reader->node->parent->type == XML_DOCUMENT_NODE) || - (reader->node->parent->type == XML_HTML_DOCUMENT_NODE)) { - reader->state = XML_TEXTREADER_END; - return(0); - } - - reader->node = reader->node->parent; - reader->depth--; - reader->state = XML_TEXTREADER_BACKTRACK; - goto found_node; - } - - reader->state = XML_TEXTREADER_END; - -found_node: - if ((reader->node->type == XML_XINCLUDE_START) || - (reader->node->type == XML_XINCLUDE_END)) - goto next_node; - - return(1); -} - -/** - * xmlTextReaderNextSibling: - * @reader: the xmlTextReaderPtr used - * - * Skip to the node following the current one in document order while - * avoiding the subtree if any. - * Currently implemented only for Readers built on a document - * - * Returns 1 if the node was read successfully, 0 if there is no more - * nodes to read, or -1 in case of error - */ -int -xmlTextReaderNextSibling(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - if (reader->doc == NULL) { - /* TODO */ - return(-1); - } - - if (reader->state == XML_TEXTREADER_END) - return(0); - - if (reader->node == NULL) - return(xmlTextReaderNextTree(reader)); - - if (reader->node->next != NULL) { - reader->node = reader->node->next; - reader->state = XML_TEXTREADER_START; - return(1); - } - - return(0); -} - -/************************************************************************ - * * - * Constructor and destructors * - * * - ************************************************************************/ -/** - * xmlNewTextReader: - * @input: the xmlParserInputBufferPtr used to read data - * @URI: the URI information for the source if available - * - * Create an xmlTextReader structure fed with @input - * - * Returns the new xmlTextReaderPtr or NULL in case of error - */ -xmlTextReaderPtr -xmlNewTextReader(xmlParserInputBufferPtr input, const char *URI) { - xmlTextReaderPtr ret; - - if (input == NULL) - return(NULL); - ret = xmlMalloc(sizeof(xmlTextReader)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlNewTextReader : malloc failed\n"); - return(NULL); - } - memset(ret, 0, sizeof(xmlTextReader)); - ret->doc = NULL; - ret->entTab = NULL; - ret->entMax = 0; - ret->entNr = 0; - ret->input = input; - ret->buffer = xmlBufferCreateSize(100); - if (ret->buffer == NULL) { - xmlFree(ret); - xmlGenericError(xmlGenericErrorContext, - "xmlNewTextReader : malloc failed\n"); - return(NULL); - } - ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); - if (ret->sax == NULL) { - xmlBufferFree(ret->buffer); - xmlFree(ret); - xmlGenericError(xmlGenericErrorContext, - "xmlNewTextReader : malloc failed\n"); - return(NULL); - } - xmlSAXVersion(ret->sax, 2); - ret->startElement = ret->sax->startElement; - ret->sax->startElement = xmlTextReaderStartElement; - ret->endElement = ret->sax->endElement; - ret->sax->endElement = xmlTextReaderEndElement; -#ifdef LIBXML_SAX1_ENABLED - if (ret->sax->initialized == XML_SAX2_MAGIC) { -#endif /* LIBXML_SAX1_ENABLED */ - ret->startElementNs = ret->sax->startElementNs; - ret->sax->startElementNs = xmlTextReaderStartElementNs; - ret->endElementNs = ret->sax->endElementNs; - ret->sax->endElementNs = xmlTextReaderEndElementNs; -#ifdef LIBXML_SAX1_ENABLED - } else { - ret->startElementNs = NULL; - ret->endElementNs = NULL; - } -#endif /* LIBXML_SAX1_ENABLED */ - ret->characters = ret->sax->characters; - ret->sax->characters = xmlTextReaderCharacters; - ret->sax->ignorableWhitespace = xmlTextReaderCharacters; - ret->cdataBlock = ret->sax->cdataBlock; - ret->sax->cdataBlock = xmlTextReaderCDataBlock; - - ret->mode = XML_TEXTREADER_MODE_INITIAL; - ret->node = NULL; - ret->curnode = NULL; - if (ret->input->buffer->use < 4) { - xmlParserInputBufferRead(input, 4); - } - if (ret->input->buffer->use >= 4) { - ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, - (const char *) ret->input->buffer->content, 4, URI); - ret->base = 0; - ret->cur = 4; - } else { - ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI); - ret->base = 0; - ret->cur = 0; - } - - if (ret->ctxt == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlNewTextReader : malloc failed\n"); - xmlBufferFree(ret->buffer); - xmlFree(ret->sax); - xmlFree(ret); - return(NULL); - } - ret->ctxt->parseMode = XML_PARSE_READER; - ret->ctxt->_private = ret; - ret->ctxt->linenumbers = 1; - ret->ctxt->dictNames = 1; - ret->allocs = XML_TEXTREADER_CTXT; - /* - * use the parser dictionnary to allocate all elements and attributes names - */ - ret->ctxt->docdict = 1; - ret->dict = ret->ctxt->dict; -#ifdef LIBXML_XINCLUDE_ENABLED - ret->xinclude = 0; -#endif -#ifdef LIBXML_PATTERN_ENABLED - ret->patternMax = 0; - ret->patternTab = NULL; -#endif - return(ret); -} - -/** - * xmlNewTextReaderFilename: - * @URI: the URI of the resource to process - * - * Create an xmlTextReader structure fed with the resource at @URI - * - * Returns the new xmlTextReaderPtr or NULL in case of error - */ -xmlTextReaderPtr -xmlNewTextReaderFilename(const char *URI) { - xmlParserInputBufferPtr input; - xmlTextReaderPtr ret; - char *directory = NULL; - - input = xmlParserInputBufferCreateFilename(URI, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return(NULL); - ret = xmlNewTextReader(input, URI); - if (ret == NULL) { - xmlFreeParserInputBuffer(input); - return(NULL); - } - ret->allocs |= XML_TEXTREADER_INPUT; - if (ret->ctxt->directory == NULL) - directory = xmlParserGetDirectory(URI); - if ((ret->ctxt->directory == NULL) && (directory != NULL)) - ret->ctxt->directory = (char *) xmlStrdup((xmlChar *) directory); - if (directory != NULL) - xmlFree(directory); - return(ret); -} - -/** - * xmlFreeTextReader: - * @reader: the xmlTextReaderPtr - * - * Deallocate all the resources associated to the reader - */ -void -xmlFreeTextReader(xmlTextReaderPtr reader) { - if (reader == NULL) - return; -#ifdef LIBXML_SCHEMAS_ENABLED - if (reader->rngSchemas != NULL) { - xmlRelaxNGFree(reader->rngSchemas); - reader->rngSchemas = NULL; - } - if (reader->rngValidCtxt != NULL) { - xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); - reader->rngValidCtxt = NULL; - } - if (reader->xsdPlug != NULL) { - xmlSchemaSAXUnplug(reader->xsdPlug); - reader->xsdPlug = NULL; - } - if (reader->xsdValidCtxt != NULL) { - if (! reader->xsdPreserveCtxt) - xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); - reader->xsdValidCtxt = NULL; - } - if (reader->xsdSchemas != NULL) { - xmlSchemaFree(reader->xsdSchemas); - reader->xsdSchemas = NULL; - } -#endif -#ifdef LIBXML_XINCLUDE_ENABLED - if (reader->xincctxt != NULL) - xmlXIncludeFreeContext(reader->xincctxt); -#endif -#ifdef LIBXML_PATTERN_ENABLED - if (reader->patternTab != NULL) { - int i; - for (i = 0;i < reader->patternNr;i++) { - if (reader->patternTab[i] != NULL) - xmlFreePattern(reader->patternTab[i]); - } - xmlFree(reader->patternTab); - } -#endif - if (reader->ctxt != NULL) { - if (reader->dict == reader->ctxt->dict) - reader->dict = NULL; - if (reader->ctxt->myDoc != NULL) { - if (reader->preserve == 0) - xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); - reader->ctxt->myDoc = NULL; - } - if ((reader->ctxt->vctxt.vstateTab != NULL) && - (reader->ctxt->vctxt.vstateMax > 0)){ - xmlFree(reader->ctxt->vctxt.vstateTab); - reader->ctxt->vctxt.vstateTab = NULL; - reader->ctxt->vctxt.vstateMax = 0; - } - if (reader->allocs & XML_TEXTREADER_CTXT) - xmlFreeParserCtxt(reader->ctxt); - } - if (reader->sax != NULL) - xmlFree(reader->sax); - if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) - xmlFreeParserInputBuffer(reader->input); - if (reader->faketext != NULL) { - xmlFreeNode(reader->faketext); - } - if (reader->buffer != NULL) - xmlBufferFree(reader->buffer); - if (reader->entTab != NULL) - xmlFree(reader->entTab); - if (reader->dict != NULL) - xmlDictFree(reader->dict); - xmlFree(reader); -} - -/************************************************************************ - * * - * Methods for XmlTextReader * - * * - ************************************************************************/ -/** - * xmlTextReaderClose: - * @reader: the xmlTextReaderPtr used - * - * This method releases any resources allocated by the current instance - * changes the state to Closed and close any underlying input. - * - * Returns 0 or -1 in case of error - */ -int -xmlTextReaderClose(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - reader->node = NULL; - reader->curnode = NULL; - reader->mode = XML_TEXTREADER_MODE_CLOSED; - if (reader->ctxt != NULL) { - xmlStopParser(reader->ctxt); - if (reader->ctxt->myDoc != NULL) { - if (reader->preserve == 0) - xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); - reader->ctxt->myDoc = NULL; - } - } - if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) { - xmlFreeParserInputBuffer(reader->input); - reader->allocs -= XML_TEXTREADER_INPUT; - } - return(0); -} - -/** - * xmlTextReaderGetAttributeNo: - * @reader: the xmlTextReaderPtr used - * @no: the zero-based index of the attribute relative to the containing element - * - * Provides the value of the attribute with the specified index relative - * to the containing element. - * - * Returns a string containing the value of the specified attribute, or NULL - * in case of error. The string must be deallocated by the caller. - */ -xmlChar * -xmlTextReaderGetAttributeNo(xmlTextReaderPtr reader, int no) { - xmlChar *ret; - int i; - xmlAttrPtr cur; - xmlNsPtr ns; - - if (reader == NULL) - return(NULL); - if (reader->node == NULL) - return(NULL); - if (reader->curnode != NULL) - return(NULL); - /* TODO: handle the xmlDecl */ - if (reader->node->type != XML_ELEMENT_NODE) - return(NULL); - - ns = reader->node->nsDef; - for (i = 0;(i < no) && (ns != NULL);i++) { - ns = ns->next; - } - if (ns != NULL) - return(xmlStrdup(ns->href)); - - cur = reader->node->properties; - if (cur == NULL) - return(NULL); - for (;i < no;i++) { - cur = cur->next; - if (cur == NULL) - return(NULL); - } - /* TODO walk the DTD if present */ - - ret = xmlNodeListGetString(reader->node->doc, cur->children, 1); - if (ret == NULL) return(xmlStrdup((xmlChar *)"")); - return(ret); -} - -/** - * xmlTextReaderGetAttribute: - * @reader: the xmlTextReaderPtr used - * @name: the qualified name of the attribute. - * - * Provides the value of the attribute with the specified qualified name. - * - * Returns a string containing the value of the specified attribute, or NULL - * in case of error. The string must be deallocated by the caller. - */ -xmlChar * -xmlTextReaderGetAttribute(xmlTextReaderPtr reader, const xmlChar *name) { - xmlChar *prefix = NULL; - xmlChar *localname; - xmlNsPtr ns; - xmlChar *ret = NULL; - - if ((reader == NULL) || (name == NULL)) - return(NULL); - if (reader->node == NULL) - return(NULL); - if (reader->curnode != NULL) - return(NULL); - - /* TODO: handle the xmlDecl */ - if (reader->node->type != XML_ELEMENT_NODE) - return(NULL); - - localname = xmlSplitQName2(name, &prefix); - if (localname == NULL) { - /* - * Namespace default decl - */ - if (xmlStrEqual(name, BAD_CAST "xmlns")) { - ns = reader->node->nsDef; - while (ns != NULL) { - if (ns->prefix == NULL) { - return(xmlStrdup(ns->href)); - } - ns = ns->next; - } - return NULL; - } - return(xmlGetNoNsProp(reader->node, name)); - } - - /* - * Namespace default decl - */ - if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { - ns = reader->node->nsDef; - while (ns != NULL) { - if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) { - ret = xmlStrdup(ns->href); - break; - } - ns = ns->next; - } - } else { - ns = xmlSearchNs(reader->node->doc, reader->node, prefix); - if (ns != NULL) - ret = xmlGetNsProp(reader->node, localname, ns->href); - } - - xmlFree(localname); - if (prefix != NULL) - xmlFree(prefix); - return(ret); -} - - -/** - * xmlTextReaderGetAttributeNs: - * @reader: the xmlTextReaderPtr used - * @localName: the local name of the attribute. - * @namespaceURI: the namespace URI of the attribute. - * - * Provides the value of the specified attribute - * - * Returns a string containing the value of the specified attribute, or NULL - * in case of error. The string must be deallocated by the caller. - */ -xmlChar * -xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName, - const xmlChar *namespaceURI) { - xmlChar *prefix = NULL; - xmlNsPtr ns; - - if ((reader == NULL) || (localName == NULL)) - return(NULL); - if (reader->node == NULL) - return(NULL); - if (reader->curnode != NULL) - return(NULL); - - /* TODO: handle the xmlDecl */ - if (reader->node->type != XML_ELEMENT_NODE) - return(NULL); - - if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { - if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { - prefix = BAD_CAST localName; - } - ns = reader->node->nsDef; - while (ns != NULL) { - if ((prefix == NULL && ns->prefix == NULL) || - ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) { - return xmlStrdup(ns->href); - } - ns = ns->next; - } - return NULL; - } - - return(xmlGetNsProp(reader->node, localName, namespaceURI)); -} - -/** - * xmlTextReaderGetRemainder: - * @reader: the xmlTextReaderPtr used - * - * Method to get the remainder of the buffered XML. this method stops the - * parser, set its state to End Of File and return the input stream with - * what is left that the parser did not use. - * - * The implementation is not good, the parser certainly procgressed past - * what's left in reader->input, and there is an allocation problem. Best - * would be to rewrite it differently. - * - * Returns the xmlParserInputBufferPtr attached to the XML or NULL - * in case of error. - */ -xmlParserInputBufferPtr -xmlTextReaderGetRemainder(xmlTextReaderPtr reader) { - xmlParserInputBufferPtr ret = NULL; - - if (reader == NULL) - return(NULL); - if (reader->node == NULL) - return(NULL); - - reader->node = NULL; - reader->curnode = NULL; - reader->mode = XML_TEXTREADER_MODE_EOF; - if (reader->ctxt != NULL) { - xmlStopParser(reader->ctxt); - if (reader->ctxt->myDoc != NULL) { - if (reader->preserve == 0) - xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); - reader->ctxt->myDoc = NULL; - } - } - if (reader->allocs & XML_TEXTREADER_INPUT) { - ret = reader->input; - reader->input = NULL; - reader->allocs -= XML_TEXTREADER_INPUT; - } else { - /* - * Hum, one may need to duplicate the data structure because - * without reference counting the input may be freed twice: - * - by the layer which allocated it. - * - by the layer to which would have been returned to. - */ - TODO - return(NULL); - } - return(ret); -} - -/** - * xmlTextReaderLookupNamespace: - * @reader: the xmlTextReaderPtr used - * @prefix: the prefix whose namespace URI is to be resolved. To return - * the default namespace, specify NULL - * - * Resolves a namespace prefix in the scope of the current element. - * - * Returns a string containing the namespace URI to which the prefix maps - * or NULL in case of error. The string must be deallocated by the caller. - */ -xmlChar * -xmlTextReaderLookupNamespace(xmlTextReaderPtr reader, const xmlChar *prefix) { - xmlNsPtr ns; - - if (reader == NULL) - return(NULL); - if (reader->node == NULL) - return(NULL); - - ns = xmlSearchNs(reader->node->doc, reader->node, prefix); - if (ns == NULL) - return(NULL); - return(xmlStrdup(ns->href)); -} - -/** - * xmlTextReaderMoveToAttributeNo: - * @reader: the xmlTextReaderPtr used - * @no: the zero-based index of the attribute relative to the containing - * element. - * - * Moves the position of the current instance to the attribute with - * the specified index relative to the containing element. - * - * Returns 1 in case of success, -1 in case of error, 0 if not found - */ -int -xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, int no) { - int i; - xmlAttrPtr cur; - xmlNsPtr ns; - - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(-1); - /* TODO: handle the xmlDecl */ - if (reader->node->type != XML_ELEMENT_NODE) - return(-1); - - reader->curnode = NULL; - - ns = reader->node->nsDef; - for (i = 0;(i < no) && (ns != NULL);i++) { - ns = ns->next; - } - if (ns != NULL) { - reader->curnode = (xmlNodePtr) ns; - return(1); - } - - cur = reader->node->properties; - if (cur == NULL) - return(0); - for (;i < no;i++) { - cur = cur->next; - if (cur == NULL) - return(0); - } - /* TODO walk the DTD if present */ - - reader->curnode = (xmlNodePtr) cur; - return(1); -} - -/** - * xmlTextReaderMoveToAttribute: - * @reader: the xmlTextReaderPtr used - * @name: the qualified name of the attribute. - * - * Moves the position of the current instance to the attribute with - * the specified qualified name. - * - * Returns 1 in case of success, -1 in case of error, 0 if not found - */ -int -xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader, const xmlChar *name) { - xmlChar *prefix = NULL; - xmlChar *localname; - xmlNsPtr ns; - xmlAttrPtr prop; - - if ((reader == NULL) || (name == NULL)) - return(-1); - if (reader->node == NULL) - return(-1); - - /* TODO: handle the xmlDecl */ - if (reader->node->type != XML_ELEMENT_NODE) - return(0); - - localname = xmlSplitQName2(name, &prefix); - if (localname == NULL) { - /* - * Namespace default decl - */ - if (xmlStrEqual(name, BAD_CAST "xmlns")) { - ns = reader->node->nsDef; - while (ns != NULL) { - if (ns->prefix == NULL) { - reader->curnode = (xmlNodePtr) ns; - return(1); - } - ns = ns->next; - } - return(0); - } - - prop = reader->node->properties; - while (prop != NULL) { - /* - * One need to have - * - same attribute names - * - and the attribute carrying that namespace - */ - if ((xmlStrEqual(prop->name, name)) && - ((prop->ns == NULL) || (prop->ns->prefix == NULL))) { - reader->curnode = (xmlNodePtr) prop; - return(1); - } - prop = prop->next; - } - return(0); - } - - /* - * Namespace default decl - */ - if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { - ns = reader->node->nsDef; - while (ns != NULL) { - if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) { - reader->curnode = (xmlNodePtr) ns; - goto found; - } - ns = ns->next; - } - goto not_found; - } - prop = reader->node->properties; - while (prop != NULL) { - /* - * One need to have - * - same attribute names - * - and the attribute carrying that namespace - */ - if ((xmlStrEqual(prop->name, localname)) && - (prop->ns != NULL) && (xmlStrEqual(prop->ns->prefix, prefix))) { - reader->curnode = (xmlNodePtr) prop; - goto found; - } - prop = prop->next; - } -not_found: - if (localname != NULL) - xmlFree(localname); - if (prefix != NULL) - xmlFree(prefix); - return(0); - -found: - if (localname != NULL) - xmlFree(localname); - if (prefix != NULL) - xmlFree(prefix); - return(1); -} - -/** - * xmlTextReaderMoveToAttributeNs: - * @reader: the xmlTextReaderPtr used - * @localName: the local name of the attribute. - * @namespaceURI: the namespace URI of the attribute. - * - * Moves the position of the current instance to the attribute with the - * specified local name and namespace URI. - * - * Returns 1 in case of success, -1 in case of error, 0 if not found - */ -int -xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader, - const xmlChar *localName, const xmlChar *namespaceURI) { - xmlAttrPtr prop; - xmlNodePtr node; - xmlNsPtr ns; - xmlChar *prefix = NULL; - - if ((reader == NULL) || (localName == NULL) || (namespaceURI == NULL)) - return(-1); - if (reader->node == NULL) - return(-1); - if (reader->node->type != XML_ELEMENT_NODE) - return(0); - node = reader->node; - - if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { - if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { - prefix = BAD_CAST localName; - } - ns = reader->node->nsDef; - while (ns != NULL) { - if ((prefix == NULL && ns->prefix == NULL) || - ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) { - reader->curnode = (xmlNodePtr) ns; - return(1); - } - ns = ns->next; - } - return(0); - } - - prop = node->properties; - while (prop != NULL) { - /* - * One need to have - * - same attribute names - * - and the attribute carrying that namespace - */ - if (xmlStrEqual(prop->name, localName) && - ((prop->ns != NULL) && - (xmlStrEqual(prop->ns->href, namespaceURI)))) { - reader->curnode = (xmlNodePtr) prop; - return(1); - } - prop = prop->next; - } - return(0); -} - -/** - * xmlTextReaderMoveToFirstAttribute: - * @reader: the xmlTextReaderPtr used - * - * Moves the position of the current instance to the first attribute - * associated with the current node. - * - * Returns 1 in case of success, -1 in case of error, 0 if not found - */ -int -xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(-1); - if (reader->node->type != XML_ELEMENT_NODE) - return(0); - - if (reader->node->nsDef != NULL) { - reader->curnode = (xmlNodePtr) reader->node->nsDef; - return(1); - } - if (reader->node->properties != NULL) { - reader->curnode = (xmlNodePtr) reader->node->properties; - return(1); - } - return(0); -} - -/** - * xmlTextReaderMoveToNextAttribute: - * @reader: the xmlTextReaderPtr used - * - * Moves the position of the current instance to the next attribute - * associated with the current node. - * - * Returns 1 in case of success, -1 in case of error, 0 if not found - */ -int -xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(-1); - if (reader->node->type != XML_ELEMENT_NODE) - return(0); - if (reader->curnode == NULL) - return(xmlTextReaderMoveToFirstAttribute(reader)); - - if (reader->curnode->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) reader->curnode; - if (ns->next != NULL) { - reader->curnode = (xmlNodePtr) ns->next; - return(1); - } - if (reader->node->properties != NULL) { - reader->curnode = (xmlNodePtr) reader->node->properties; - return(1); - } - return(0); - } else if ((reader->curnode->type == XML_ATTRIBUTE_NODE) && - (reader->curnode->next != NULL)) { - reader->curnode = reader->curnode->next; - return(1); - } - return(0); -} - -/** - * xmlTextReaderMoveToElement: - * @reader: the xmlTextReaderPtr used - * - * Moves the position of the current instance to the node that - * contains the current Attribute node. - * - * Returns 1 in case of success, -1 in case of error, 0 if not moved - */ -int -xmlTextReaderMoveToElement(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(-1); - if (reader->node->type != XML_ELEMENT_NODE) - return(0); - if (reader->curnode != NULL) { - reader->curnode = NULL; - return(1); - } - return(0); -} - -/** - * xmlTextReaderReadAttributeValue: - * @reader: the xmlTextReaderPtr used - * - * Parses an attribute value into one or more Text and EntityReference nodes. - * - * Returns 1 in case of success, 0 if the reader was not positionned on an - * ttribute node or all the attribute values have been read, or -1 - * in case of error. - */ -int -xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(-1); - if (reader->curnode == NULL) - return(0); - if (reader->curnode->type == XML_ATTRIBUTE_NODE) { - if (reader->curnode->children == NULL) - return(0); - reader->curnode = reader->curnode->children; - } else if (reader->curnode->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) reader->curnode; - - if (reader->faketext == NULL) { - reader->faketext = xmlNewDocText(reader->node->doc, - ns->href); - } else { - if ((reader->faketext->content != NULL) && - (reader->faketext->content != - (xmlChar *) &(reader->faketext->properties))) - xmlFree(reader->faketext->content); - reader->faketext->content = xmlStrdup(ns->href); - } - reader->curnode = reader->faketext; - } else { - if (reader->curnode->next == NULL) - return(0); - reader->curnode = reader->curnode->next; - } - return(1); -} - -/** - * xmlTextReaderConstEncoding: - * @reader: the xmlTextReaderPtr used - * - * Determine the encoding of the document being read. - * - * Returns a string containing the encoding of the document or NULL in - * case of error. The string is deallocated with the reader. - */ -const xmlChar * -xmlTextReaderConstEncoding(xmlTextReaderPtr reader) { - xmlDocPtr doc = NULL; - if (reader == NULL) - return(NULL); - if (reader->doc != NULL) - doc = reader->doc; - else if (reader->ctxt != NULL) - doc = reader->ctxt->myDoc; - if (doc == NULL) - return(NULL); - - if (doc->encoding == NULL) - return(NULL); - else - return(CONSTSTR(doc->encoding)); -} - - -/************************************************************************ - * * - * Acces API to the current node * - * * - ************************************************************************/ -/** - * xmlTextReaderAttributeCount: - * @reader: the xmlTextReaderPtr used - * - * Provides the number of attributes of the current node - * - * Returns 0 i no attributes, -1 in case of error or the attribute count - */ -int -xmlTextReaderAttributeCount(xmlTextReaderPtr reader) { - int ret; - xmlAttrPtr attr; - xmlNsPtr ns; - xmlNodePtr node; - - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(0); - - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - - if (node->type != XML_ELEMENT_NODE) - return(0); - if ((reader->state == XML_TEXTREADER_END) || - (reader->state == XML_TEXTREADER_BACKTRACK)) - return(0); - ret = 0; - attr = node->properties; - while (attr != NULL) { - ret++; - attr = attr->next; - } - ns = node->nsDef; - while (ns != NULL) { - ret++; - ns = ns->next; - } - return(ret); -} - -/** - * xmlTextReaderNodeType: - * @reader: the xmlTextReaderPtr used - * - * Get the node type of the current node - * Reference: - * http://dotgnu.org/pnetlib-doc/System/Xml/XmlNodeType.html - * - * Returns the xmlNodeType of the current node or -1 in case of error - */ -int -xmlTextReaderNodeType(xmlTextReaderPtr reader) { - xmlNodePtr node; - - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(XML_READER_TYPE_NONE); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - switch (node->type) { - case XML_ELEMENT_NODE: - if ((reader->state == XML_TEXTREADER_END) || - (reader->state == XML_TEXTREADER_BACKTRACK)) - return(XML_READER_TYPE_END_ELEMENT); - return(XML_READER_TYPE_ELEMENT); - case XML_NAMESPACE_DECL: - case XML_ATTRIBUTE_NODE: - return(XML_READER_TYPE_ATTRIBUTE); - case XML_TEXT_NODE: - if (xmlIsBlankNode(reader->node)) { - if (xmlNodeGetSpacePreserve(reader->node)) - return(XML_READER_TYPE_SIGNIFICANT_WHITESPACE); - else - return(XML_READER_TYPE_WHITESPACE); - } else { - return(XML_READER_TYPE_TEXT); - } - case XML_CDATA_SECTION_NODE: - return(XML_READER_TYPE_CDATA); - case XML_ENTITY_REF_NODE: - return(XML_READER_TYPE_ENTITY_REFERENCE); - case XML_ENTITY_NODE: - return(XML_READER_TYPE_ENTITY); - case XML_PI_NODE: - return(XML_READER_TYPE_PROCESSING_INSTRUCTION); - case XML_COMMENT_NODE: - return(XML_READER_TYPE_COMMENT); - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return(XML_READER_TYPE_DOCUMENT); - case XML_DOCUMENT_FRAG_NODE: - return(XML_READER_TYPE_DOCUMENT_FRAGMENT); - case XML_NOTATION_NODE: - return(XML_READER_TYPE_NOTATION); - case XML_DOCUMENT_TYPE_NODE: - case XML_DTD_NODE: - return(XML_READER_TYPE_DOCUMENT_TYPE); - - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - return(XML_READER_TYPE_NONE); - } - return(-1); -} - -/** - * xmlTextReaderIsEmptyElement: - * @reader: the xmlTextReaderPtr used - * - * Check if the current node is empty - * - * Returns 1 if empty, 0 if not and -1 in case of error - */ -int -xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader) { - if ((reader == NULL) || (reader->node == NULL)) - return(-1); - if (reader->node->type != XML_ELEMENT_NODE) - return(0); - if (reader->curnode != NULL) - return(0); - if (reader->node->children != NULL) - return(0); - if (reader->state == XML_TEXTREADER_END) - return(0); - if (reader->doc != NULL) - return(1); -#ifdef LIBXML_XINCLUDE_ENABLED - if (reader->in_xinclude > 0) - return(1); -#endif - return((reader->node->extra & NODE_IS_EMPTY) != 0); -} - -/** - * xmlTextReaderLocalName: - * @reader: the xmlTextReaderPtr used - * - * The local name of the node. - * - * Returns the local name or NULL if not available - */ -xmlChar * -xmlTextReaderLocalName(xmlTextReaderPtr reader) { - xmlNodePtr node; - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - if (node->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) node; - if (ns->prefix == NULL) - return(xmlStrdup(BAD_CAST "xmlns")); - else - return(xmlStrdup(ns->prefix)); - } - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE)) - return(xmlTextReaderName(reader)); - return(xmlStrdup(node->name)); -} - -/** - * xmlTextReaderConstLocalName: - * @reader: the xmlTextReaderPtr used - * - * The local name of the node. - * - * Returns the local name or NULL if not available, the - * string will be deallocated with the reader. - */ -const xmlChar * -xmlTextReaderConstLocalName(xmlTextReaderPtr reader) { - xmlNodePtr node; - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - if (node->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) node; - if (ns->prefix == NULL) - return(CONSTSTR(BAD_CAST "xmlns")); - else - return(ns->prefix); - } - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE)) - return(xmlTextReaderConstName(reader)); - return(node->name); -} - -/** - * xmlTextReaderName: - * @reader: the xmlTextReaderPtr used - * - * The qualified name of the node, equal to Prefix :LocalName. - * - * Returns the local name or NULL if not available - */ -xmlChar * -xmlTextReaderName(xmlTextReaderPtr reader) { - xmlNodePtr node; - xmlChar *ret; - - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - switch (node->type) { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - if ((node->ns == NULL) || - (node->ns->prefix == NULL)) - return(xmlStrdup(node->name)); - - ret = xmlStrdup(node->ns->prefix); - ret = xmlStrcat(ret, BAD_CAST ":"); - ret = xmlStrcat(ret, node->name); - return(ret); - case XML_TEXT_NODE: - return(xmlStrdup(BAD_CAST "#text")); - case XML_CDATA_SECTION_NODE: - return(xmlStrdup(BAD_CAST "#cdata-section")); - case XML_ENTITY_NODE: - case XML_ENTITY_REF_NODE: - return(xmlStrdup(node->name)); - case XML_PI_NODE: - return(xmlStrdup(node->name)); - case XML_COMMENT_NODE: - return(xmlStrdup(BAD_CAST "#comment")); - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return(xmlStrdup(BAD_CAST "#document")); - case XML_DOCUMENT_FRAG_NODE: - return(xmlStrdup(BAD_CAST "#document-fragment")); - case XML_NOTATION_NODE: - return(xmlStrdup(node->name)); - case XML_DOCUMENT_TYPE_NODE: - case XML_DTD_NODE: - return(xmlStrdup(node->name)); - case XML_NAMESPACE_DECL: { - xmlNsPtr ns = (xmlNsPtr) node; - - ret = xmlStrdup(BAD_CAST "xmlns"); - if (ns->prefix == NULL) - return(ret); - ret = xmlStrcat(ret, BAD_CAST ":"); - ret = xmlStrcat(ret, ns->prefix); - return(ret); - } - - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - return(NULL); - } - return(NULL); -} - -/** - * xmlTextReaderConstName: - * @reader: the xmlTextReaderPtr used - * - * The qualified name of the node, equal to Prefix :LocalName. - * - * Returns the local name or NULL if not available, the string is - * deallocated with the reader. - */ -const xmlChar * -xmlTextReaderConstName(xmlTextReaderPtr reader) { - xmlNodePtr node; - - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - switch (node->type) { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - if ((node->ns == NULL) || - (node->ns->prefix == NULL)) - return(node->name); - return(CONSTQSTR(node->ns->prefix, node->name)); - case XML_TEXT_NODE: - return(CONSTSTR(BAD_CAST "#text")); - case XML_CDATA_SECTION_NODE: - return(CONSTSTR(BAD_CAST "#cdata-section")); - case XML_ENTITY_NODE: - case XML_ENTITY_REF_NODE: - return(CONSTSTR(node->name)); - case XML_PI_NODE: - return(CONSTSTR(node->name)); - case XML_COMMENT_NODE: - return(CONSTSTR(BAD_CAST "#comment")); - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return(CONSTSTR(BAD_CAST "#document")); - case XML_DOCUMENT_FRAG_NODE: - return(CONSTSTR(BAD_CAST "#document-fragment")); - case XML_NOTATION_NODE: - return(CONSTSTR(node->name)); - case XML_DOCUMENT_TYPE_NODE: - case XML_DTD_NODE: - return(CONSTSTR(node->name)); - case XML_NAMESPACE_DECL: { - xmlNsPtr ns = (xmlNsPtr) node; - - if (ns->prefix == NULL) - return(CONSTSTR(BAD_CAST "xmlns")); - return(CONSTQSTR(BAD_CAST "xmlns", ns->prefix)); - } - - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - return(NULL); - } - return(NULL); -} - -/** - * xmlTextReaderPrefix: - * @reader: the xmlTextReaderPtr used - * - * A shorthand reference to the namespace associated with the node. - * - * Returns the prefix or NULL if not available - */ -xmlChar * -xmlTextReaderPrefix(xmlTextReaderPtr reader) { - xmlNodePtr node; - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - if (node->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) node; - if (ns->prefix == NULL) - return(NULL); - return(xmlStrdup(BAD_CAST "xmlns")); - } - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE)) - return(NULL); - if ((node->ns != NULL) && (node->ns->prefix != NULL)) - return(xmlStrdup(node->ns->prefix)); - return(NULL); -} - -/** - * xmlTextReaderConstPrefix: - * @reader: the xmlTextReaderPtr used - * - * A shorthand reference to the namespace associated with the node. - * - * Returns the prefix or NULL if not available, the string is deallocated - * with the reader. - */ -const xmlChar * -xmlTextReaderConstPrefix(xmlTextReaderPtr reader) { - xmlNodePtr node; - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - if (node->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) node; - if (ns->prefix == NULL) - return(NULL); - return(CONSTSTR(BAD_CAST "xmlns")); - } - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE)) - return(NULL); - if ((node->ns != NULL) && (node->ns->prefix != NULL)) - return(CONSTSTR(node->ns->prefix)); - return(NULL); -} - -/** - * xmlTextReaderNamespaceUri: - * @reader: the xmlTextReaderPtr used - * - * The URI defining the namespace associated with the node. - * - * Returns the namespace URI or NULL if not available - */ -xmlChar * -xmlTextReaderNamespaceUri(xmlTextReaderPtr reader) { - xmlNodePtr node; - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - if (node->type == XML_NAMESPACE_DECL) - return(xmlStrdup(BAD_CAST "http://www.w3.org/2000/xmlns/")); - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE)) - return(NULL); - if (node->ns != NULL) - return(xmlStrdup(node->ns->href)); - return(NULL); -} - -/** - * xmlTextReaderConstNamespaceUri: - * @reader: the xmlTextReaderPtr used - * - * The URI defining the namespace associated with the node. - * - * Returns the namespace URI or NULL if not available, the string - * will be deallocated with the reader - */ -const xmlChar * -xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader) { - xmlNodePtr node; - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - if (node->type == XML_NAMESPACE_DECL) - return(CONSTSTR(BAD_CAST "http://www.w3.org/2000/xmlns/")); - if ((node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE)) - return(NULL); - if (node->ns != NULL) - return(CONSTSTR(node->ns->href)); - return(NULL); -} - -/** - * xmlTextReaderBaseUri: - * @reader: the xmlTextReaderPtr used - * - * The base URI of the node. - * - * Returns the base URI or NULL if not available - */ -xmlChar * -xmlTextReaderBaseUri(xmlTextReaderPtr reader) { - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - return(xmlNodeGetBase(NULL, reader->node)); -} - -/** - * xmlTextReaderConstBaseUri: - * @reader: the xmlTextReaderPtr used - * - * The base URI of the node. - * - * Returns the base URI or NULL if not available, the string - * will be deallocated with the reader - */ -const xmlChar * -xmlTextReaderConstBaseUri(xmlTextReaderPtr reader) { - xmlChar *tmp; - const xmlChar *ret; - - if ((reader == NULL) || (reader->node == NULL)) - return(NULL); - tmp = xmlNodeGetBase(NULL, reader->node); - if (tmp == NULL) - return(NULL); - ret = CONSTSTR(tmp); - xmlFree(tmp); - return(ret); -} - -/** - * xmlTextReaderDepth: - * @reader: the xmlTextReaderPtr used - * - * The depth of the node in the tree. - * - * Returns the depth or -1 in case of error - */ -int -xmlTextReaderDepth(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(0); - - if (reader->curnode != NULL) { - if ((reader->curnode->type == XML_ATTRIBUTE_NODE) || - (reader->curnode->type == XML_NAMESPACE_DECL)) - return(reader->depth + 1); - return(reader->depth + 2); - } - return(reader->depth); -} - -/** - * xmlTextReaderHasAttributes: - * @reader: the xmlTextReaderPtr used - * - * Whether the node has attributes. - * - * Returns 1 if true, 0 if false, and -1 in case or error - */ -int -xmlTextReaderHasAttributes(xmlTextReaderPtr reader) { - xmlNodePtr node; - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(0); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - - if ((node->type == XML_ELEMENT_NODE) && - ((node->properties != NULL) || (node->nsDef != NULL))) - return(1); - /* TODO: handle the xmlDecl */ - return(0); -} - -/** - * xmlTextReaderHasValue: - * @reader: the xmlTextReaderPtr used - * - * Whether the node can have a text value. - * - * Returns 1 if true, 0 if false, and -1 in case or error - */ -int -xmlTextReaderHasValue(xmlTextReaderPtr reader) { - xmlNodePtr node; - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(0); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - - switch (node->type) { - case XML_ATTRIBUTE_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_NAMESPACE_DECL: - return(1); - default: - break; - } - return(0); -} - -/** - * xmlTextReaderValue: - * @reader: the xmlTextReaderPtr used - * - * Provides the text value of the node if present - * - * Returns the string or NULL if not available. The result must be deallocated - * with xmlFree() - */ -xmlChar * -xmlTextReaderValue(xmlTextReaderPtr reader) { - xmlNodePtr node; - if (reader == NULL) - return(NULL); - if (reader->node == NULL) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - - switch (node->type) { - case XML_NAMESPACE_DECL: - return(xmlStrdup(((xmlNsPtr) node)->href)); - case XML_ATTRIBUTE_NODE:{ - xmlAttrPtr attr = (xmlAttrPtr) node; - - if (attr->parent != NULL) - return (xmlNodeListGetString - (attr->parent->doc, attr->children, 1)); - else - return (xmlNodeListGetString(NULL, attr->children, 1)); - break; - } - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - if (node->content != NULL) - return (xmlStrdup(node->content)); - default: - break; - } - return(NULL); -} - -/** - * xmlTextReaderConstValue: - * @reader: the xmlTextReaderPtr used - * - * Provides the text value of the node if present - * - * Returns the string or NULL if not available. The result will be - * deallocated on the next Read() operation. - */ -const xmlChar * -xmlTextReaderConstValue(xmlTextReaderPtr reader) { - xmlNodePtr node; - if (reader == NULL) - return(NULL); - if (reader->node == NULL) - return(NULL); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - - switch (node->type) { - case XML_NAMESPACE_DECL: - return(((xmlNsPtr) node)->href); - case XML_ATTRIBUTE_NODE:{ - xmlAttrPtr attr = (xmlAttrPtr) node; - - if ((attr->children != NULL) && - (attr->children->type == XML_TEXT_NODE) && - (attr->children->next == NULL)) - return(attr->children->content); - else { - if (reader->buffer == NULL) - reader->buffer = xmlBufferCreateSize(100); - if (reader->buffer == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlTextReaderSetup : malloc failed\n"); - return (NULL); - } - reader->buffer->use = 0; - xmlNodeBufGetContent(reader->buffer, node); - return(reader->buffer->content); - } - break; - } - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - return(node->content); - default: - break; - } - return(NULL); -} - -/** - * xmlTextReaderIsDefault: - * @reader: the xmlTextReaderPtr used - * - * Whether an Attribute node was generated from the default value - * defined in the DTD or schema. - * - * Returns 0 if not defaulted, 1 if defaulted, and -1 in case of error - */ -int -xmlTextReaderIsDefault(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - return(0); -} - -/** - * xmlTextReaderQuoteChar: - * @reader: the xmlTextReaderPtr used - * - * The quotation mark character used to enclose the value of an attribute. - * - * Returns " or ' and -1 in case of error - */ -int -xmlTextReaderQuoteChar(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - /* TODO maybe lookup the attribute value for " first */ - return((int) '"'); -} - -/** - * xmlTextReaderXmlLang: - * @reader: the xmlTextReaderPtr used - * - * The xml:lang scope within which the node resides. - * - * Returns the xml:lang value or NULL if none exists. - */ -xmlChar * -xmlTextReaderXmlLang(xmlTextReaderPtr reader) { - if (reader == NULL) - return(NULL); - if (reader->node == NULL) - return(NULL); - return(xmlNodeGetLang(reader->node)); -} - -/** - * xmlTextReaderConstXmlLang: - * @reader: the xmlTextReaderPtr used - * - * The xml:lang scope within which the node resides. - * - * Returns the xml:lang value or NULL if none exists. - */ -const xmlChar * -xmlTextReaderConstXmlLang(xmlTextReaderPtr reader) { - xmlChar *tmp; - const xmlChar *ret; - - if (reader == NULL) - return(NULL); - if (reader->node == NULL) - return(NULL); - tmp = xmlNodeGetLang(reader->node); - if (tmp == NULL) - return(NULL); - ret = CONSTSTR(tmp); - xmlFree(tmp); - return(ret); -} - -/** - * xmlTextReaderConstString: - * @reader: the xmlTextReaderPtr used - * @str: the string to intern. - * - * Get an interned string from the reader, allows for example to - * speedup string name comparisons - * - * Returns an interned copy of the string or NULL in case of error. The - * string will be deallocated with the reader. - */ -const xmlChar * -xmlTextReaderConstString(xmlTextReaderPtr reader, const xmlChar *str) { - if (reader == NULL) - return(NULL); - return(CONSTSTR(str)); -} - -/** - * xmlTextReaderNormalization: - * @reader: the xmlTextReaderPtr used - * - * The value indicating whether to normalize white space and attribute values. - * Since attribute value and end of line normalizations are a MUST in the XML - * specification only the value true is accepted. The broken bahaviour of - * accepting out of range character entities like � is of course not - * supported either. - * - * Returns 1 or -1 in case of error. - */ -int -xmlTextReaderNormalization(xmlTextReaderPtr reader) { - if (reader == NULL) - return(-1); - return(1); -} - -/************************************************************************ - * * - * Extensions to the base APIs * - * * - ************************************************************************/ - -/** - * xmlTextReaderSetParserProp: - * @reader: the xmlTextReaderPtr used - * @prop: the xmlParserProperties to set - * @value: usually 0 or 1 to (de)activate it - * - * Change the parser processing behaviour by changing some of its internal - * properties. Note that some properties can only be changed before any - * read has been done. - * - * Returns 0 if the call was successful, or -1 in case of error - */ -int -xmlTextReaderSetParserProp(xmlTextReaderPtr reader, int prop, int value) { - xmlParserProperties p = (xmlParserProperties) prop; - xmlParserCtxtPtr ctxt; - - if ((reader == NULL) || (reader->ctxt == NULL)) - return(-1); - ctxt = reader->ctxt; - - switch (p) { - case XML_PARSER_LOADDTD: - if (value != 0) { - if (ctxt->loadsubset == 0) { - if (reader->mode != XML_TEXTREADER_MODE_INITIAL) - return(-1); - ctxt->loadsubset = XML_DETECT_IDS; - } - } else { - ctxt->loadsubset = 0; - } - return(0); - case XML_PARSER_DEFAULTATTRS: - if (value != 0) { - ctxt->loadsubset |= XML_COMPLETE_ATTRS; - } else { - if (ctxt->loadsubset & XML_COMPLETE_ATTRS) - ctxt->loadsubset -= XML_COMPLETE_ATTRS; - } - return(0); - case XML_PARSER_VALIDATE: - if (value != 0) { - ctxt->validate = 1; - reader->validate = XML_TEXTREADER_VALIDATE_DTD; - } else { - ctxt->validate = 0; - } - return(0); - case XML_PARSER_SUBST_ENTITIES: - if (value != 0) { - ctxt->replaceEntities = 1; - } else { - ctxt->replaceEntities = 0; - } - return(0); - } - return(-1); -} - -/** - * xmlTextReaderGetParserProp: - * @reader: the xmlTextReaderPtr used - * @prop: the xmlParserProperties to get - * - * Read the parser internal property. - * - * Returns the value, usually 0 or 1, or -1 in case of error. - */ -int -xmlTextReaderGetParserProp(xmlTextReaderPtr reader, int prop) { - xmlParserProperties p = (xmlParserProperties) prop; - xmlParserCtxtPtr ctxt; - - if ((reader == NULL) || (reader->ctxt == NULL)) - return(-1); - ctxt = reader->ctxt; - - switch (p) { - case XML_PARSER_LOADDTD: - if ((ctxt->loadsubset != 0) || (ctxt->validate != 0)) - return(1); - return(0); - case XML_PARSER_DEFAULTATTRS: - if (ctxt->loadsubset & XML_COMPLETE_ATTRS) - return(1); - return(0); - case XML_PARSER_VALIDATE: - return(reader->validate); - case XML_PARSER_SUBST_ENTITIES: - return(ctxt->replaceEntities); - } - return(-1); -} - - -/** - * xmlTextReaderGetParserLineNumber: - * @reader: the user data (XML reader context) - * - * Provide the line number of the current parsing point. - * - * Returns an int or 0 if not available - */ -int -xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader) -{ - if ((reader == NULL) || (reader->ctxt == NULL) || - (reader->ctxt->input == NULL)) { - return (0); - } - return (reader->ctxt->input->line); -} - -/** - * xmlTextReaderGetParserColumnNumber: - * @reader: the user data (XML reader context) - * - * Provide the column number of the current parsing point. - * - * Returns an int or 0 if not available - */ -int -xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader) -{ - if ((reader == NULL) || (reader->ctxt == NULL) || - (reader->ctxt->input == NULL)) { - return (0); - } - return (reader->ctxt->input->col); -} - -/** - * xmlTextReaderCurrentNode: - * @reader: the xmlTextReaderPtr used - * - * Hacking interface allowing to get the xmlNodePtr correponding to the - * current node being accessed by the xmlTextReader. This is dangerous - * because the underlying node may be destroyed on the next Reads. - * - * Returns the xmlNodePtr or NULL in case of error. - */ -xmlNodePtr -xmlTextReaderCurrentNode(xmlTextReaderPtr reader) { - if (reader == NULL) - return(NULL); - - if (reader->curnode != NULL) - return(reader->curnode); - return(reader->node); -} - -/** - * xmlTextReaderPreserve: - * @reader: the xmlTextReaderPtr used - * - * This tells the XML Reader to preserve the current node. - * The caller must also use xmlTextReaderCurrentDoc() to - * keep an handle on the resulting document once parsing has finished - * - * Returns the xmlNodePtr or NULL in case of error. - */ -xmlNodePtr -xmlTextReaderPreserve(xmlTextReaderPtr reader) { - xmlNodePtr cur, parent; - - if (reader == NULL) - return(NULL); - - if (reader->curnode != NULL) - cur = reader->curnode; - else - cur = reader->node; - if (cur == NULL) - return(NULL); - - if ((cur->type != XML_DOCUMENT_NODE) && (cur->type != XML_DTD_NODE)) { - cur->extra |= NODE_IS_PRESERVED; - cur->extra |= NODE_IS_SPRESERVED; - } - reader->preserves++; - - parent = cur->parent;; - while (parent != NULL) { - if (parent->type == XML_ELEMENT_NODE) - parent->extra |= NODE_IS_PRESERVED; - parent = parent->parent; - } - return(cur); -} - -#ifdef LIBXML_PATTERN_ENABLED -/** - * xmlTextReaderPreservePattern: - * @reader: the xmlTextReaderPtr used - * @pattern: an XPath subset pattern - * @namespaces: the prefix definitions, array of [URI, prefix] or NULL - * - * This tells the XML Reader to preserve all nodes matched by the - * pattern. The caller must also use xmlTextReaderCurrentDoc() to - * keep an handle on the resulting document once parsing has finished - * - * Returns a positive number in case of success and -1 in case of error - */ -int -xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern, - const xmlChar **namespaces) -{ - xmlPatternPtr comp; - - if ((reader == NULL) || (pattern == NULL)) - return(-1); - - comp = xmlPatterncompile(pattern, reader->dict, 0, namespaces); - if (comp == NULL) - return(-1); - - if (reader->patternMax <= 0) { - reader->patternMax = 4; - reader->patternTab = (xmlPatternPtr *) xmlMalloc(reader->patternMax * - sizeof(reader->patternTab[0])); - if (reader->patternTab == NULL) { - xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); - return (-1); - } - } - if (reader->patternNr >= reader->patternMax) { - xmlPatternPtr *tmp; - reader->patternMax *= 2; - tmp = (xmlPatternPtr *) xmlRealloc(reader->patternTab, - reader->patternMax * - sizeof(reader->patternTab[0])); - if (tmp == NULL) { - xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); - reader->patternMax /= 2; - return (-1); - } - reader->patternTab = tmp; - } - reader->patternTab[reader->patternNr] = comp; - return(reader->patternNr++); -} -#endif - -/** - * xmlTextReaderCurrentDoc: - * @reader: the xmlTextReaderPtr used - * - * Hacking interface allowing to get the xmlDocPtr correponding to the - * current document being accessed by the xmlTextReader. - * NOTE: as a result of this call, the reader will not destroy the - * associated XML document and calling xmlFreeDoc() on the result - * is needed once the reader parsing has finished. - * - * Returns the xmlDocPtr or NULL in case of error. - */ -xmlDocPtr -xmlTextReaderCurrentDoc(xmlTextReaderPtr reader) { - if (reader == NULL) - return(NULL); - if (reader->doc != NULL) - return(reader->doc); - if ((reader == NULL) || (reader->ctxt == NULL) || - (reader->ctxt->myDoc == NULL)) - return(NULL); - - reader->preserve = 1; - return(reader->ctxt->myDoc); -} - -#ifdef LIBXML_SCHEMAS_ENABLED - -static char * -xmlTextReaderBuildMessage(const char *msg, va_list ap); - -static void XMLCDECL -xmlTextReaderValidityError(void *ctxt, const char *msg, ...); - -static void XMLCDECL -xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...); - -static void XMLCDECL xmlTextReaderValidityErrorRelay(void *ctx, const char *msg, ...) -{ - xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; - char * str; - va_list ap; - - va_start(ap,msg); - str = xmlTextReaderBuildMessage(msg,ap); - if (!reader->errorFunc) { - xmlTextReaderValidityError(ctx, "%s", str); - } else { - reader->errorFunc(reader->errorFuncArg, str, XML_PARSER_SEVERITY_VALIDITY_ERROR, NULL /* locator */); - } - if (str != NULL) - xmlFree(str); - va_end(ap); -} - -static void XMLCDECL xmlTextReaderValidityWarningRelay(void *ctx, const char *msg, ...) -{ - xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; - char * str; - va_list ap; - - va_start(ap,msg); - str = xmlTextReaderBuildMessage(msg,ap); - if (!reader->errorFunc) { - xmlTextReaderValidityWarning(ctx, "%s", str); - } else { - reader->errorFunc(reader->errorFuncArg, str, XML_PARSER_SEVERITY_VALIDITY_WARNING, NULL /* locator */); - } - if (str != NULL) - xmlFree(str); - va_end(ap); -} - -static void -xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error); - -static void xmlTextReaderValidityStructuredRelay(void * userData, xmlErrorPtr error) -{ - xmlTextReaderPtr reader = (xmlTextReaderPtr) userData; - - if (reader->sErrorFunc) { - reader->sErrorFunc(reader->errorFuncArg, error); - } else { - xmlTextReaderStructuredError(reader, error); - } -} - -/** - * xmlTextReaderRelaxNGSetSchema: - * @reader: the xmlTextReaderPtr used - * @schema: a precompiled RelaxNG schema - * - * Use RelaxNG to validate the document as it is processed. - * Activation is only possible before the first Read(). - * if @schema is NULL, then RelaxNG validation is desactivated. - @ The @schema should not be freed until the reader is deallocated - * or its use has been deactivated. - * - * Returns 0 in case the RelaxNG validation could be (des)activated and - * -1 in case of error. - */ -int -xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema) { - if (reader == NULL) - return(-1); - if (schema == NULL) { - if (reader->rngSchemas != NULL) { - xmlRelaxNGFree(reader->rngSchemas); - reader->rngSchemas = NULL; - } - if (reader->rngValidCtxt != NULL) { - xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); - reader->rngValidCtxt = NULL; - } - return(0); - } - if (reader->mode != XML_TEXTREADER_MODE_INITIAL) - return(-1); - if (reader->rngSchemas != NULL) { - xmlRelaxNGFree(reader->rngSchemas); - reader->rngSchemas = NULL; - } - if (reader->rngValidCtxt != NULL) { - xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); - reader->rngValidCtxt = NULL; - } - reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(schema); - if (reader->rngValidCtxt == NULL) - return(-1); - if (reader->errorFunc != NULL) { - xmlRelaxNGSetValidErrors(reader->rngValidCtxt, - xmlTextReaderValidityErrorRelay, - xmlTextReaderValidityWarningRelay, - reader); - } - if (reader->sErrorFunc != NULL) { - xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, - xmlTextReaderValidityStructuredRelay, - reader); - } - reader->rngValidErrors = 0; - reader->rngFullNode = NULL; - reader->validate = XML_TEXTREADER_VALIDATE_RNG; - return(0); -} - -/** - * xmlTextReaderSetSchema: - * @reader: the xmlTextReaderPtr used - * @schema: a precompiled Schema schema - * - * Use XSD Schema to validate the document as it is processed. - * Activation is only possible before the first Read(). - * if @schema is NULL, then Schema validation is desactivated. - @ The @schema should not be freed until the reader is deallocated - * or its use has been deactivated. - * - * Returns 0 in case the Schema validation could be (des)activated and - * -1 in case of error. - */ -int -xmlTextReaderSetSchema(xmlTextReaderPtr reader, xmlSchemaPtr schema) { - if (reader == NULL) - return(-1); - if (schema == NULL) { - if (reader->xsdPlug != NULL) { - xmlSchemaSAXUnplug(reader->xsdPlug); - reader->xsdPlug = NULL; - } - if (reader->xsdValidCtxt != NULL) { - if (! reader->xsdPreserveCtxt) - xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); - reader->xsdValidCtxt = NULL; - } - reader->xsdPreserveCtxt = 0; - if (reader->xsdSchemas != NULL) { - xmlSchemaFree(reader->xsdSchemas); - reader->xsdSchemas = NULL; - } - return(0); - } - if (reader->mode != XML_TEXTREADER_MODE_INITIAL) - return(-1); - if (reader->xsdPlug != NULL) { - xmlSchemaSAXUnplug(reader->xsdPlug); - reader->xsdPlug = NULL; - } - if (reader->xsdValidCtxt != NULL) { - if (! reader->xsdPreserveCtxt) - xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); - reader->xsdValidCtxt = NULL; - } - reader->xsdPreserveCtxt = 0; - if (reader->xsdSchemas != NULL) { - xmlSchemaFree(reader->xsdSchemas); - reader->xsdSchemas = NULL; - } - reader->xsdValidCtxt = xmlSchemaNewValidCtxt(schema); - if (reader->xsdValidCtxt == NULL) { - xmlSchemaFree(reader->xsdSchemas); - reader->xsdSchemas = NULL; - return(-1); - } - reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, - &(reader->ctxt->sax), - &(reader->ctxt->userData)); - if (reader->xsdPlug == NULL) { - xmlSchemaFree(reader->xsdSchemas); - reader->xsdSchemas = NULL; - xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); - reader->xsdValidCtxt = NULL; - return(-1); - } - if (reader->errorFunc != NULL) { - xmlSchemaSetValidErrors(reader->xsdValidCtxt, - xmlTextReaderValidityErrorRelay, - xmlTextReaderValidityWarningRelay, - reader); - } - if (reader->sErrorFunc != NULL) { - xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, - xmlTextReaderValidityStructuredRelay, - reader); - } - reader->xsdValidErrors = 0; - reader->validate = XML_TEXTREADER_VALIDATE_XSD; - return(0); -} - -/** - * xmlTextReaderRelaxNGValidate: - * @reader: the xmlTextReaderPtr used - * @rng: the path to a RelaxNG schema or NULL - * - * Use RelaxNG to validate the document as it is processed. - * Activation is only possible before the first Read(). - * if @rng is NULL, then RelaxNG validation is desactivated. - * - * Returns 0 in case the RelaxNG validation could be (des)activated and - * -1 in case of error. - */ -int -xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) { - xmlRelaxNGParserCtxtPtr ctxt; - - if (reader == NULL) - return(-1); - - if (rng == NULL) { - if (reader->rngValidCtxt != NULL) { - xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); - reader->rngValidCtxt = NULL; - } - if (reader->rngSchemas != NULL) { - xmlRelaxNGFree(reader->rngSchemas); - reader->rngSchemas = NULL; - } - return(0); - } - if (reader->mode != XML_TEXTREADER_MODE_INITIAL) - return(-1); - if (reader->rngSchemas != NULL) { - xmlRelaxNGFree(reader->rngSchemas); - reader->rngSchemas = NULL; - } - if (reader->rngValidCtxt != NULL) { - xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); - reader->rngValidCtxt = NULL; - } - ctxt = xmlRelaxNGNewParserCtxt(rng); - if (reader->errorFunc != NULL) { - xmlRelaxNGSetParserErrors(ctxt, - xmlTextReaderValidityErrorRelay, - xmlTextReaderValidityWarningRelay, - reader); - } - if (reader->sErrorFunc != NULL) { - xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, - xmlTextReaderValidityStructuredRelay, - reader); - } - reader->rngSchemas = xmlRelaxNGParse(ctxt); - xmlRelaxNGFreeParserCtxt(ctxt); - if (reader->rngSchemas == NULL) - return(-1); - reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas); - if (reader->rngValidCtxt == NULL) { - xmlRelaxNGFree(reader->rngSchemas); - reader->rngSchemas = NULL; - return(-1); - } - if (reader->errorFunc != NULL) { - xmlRelaxNGSetValidErrors(reader->rngValidCtxt, - xmlTextReaderValidityErrorRelay, - xmlTextReaderValidityWarningRelay, - reader); - } - if (reader->sErrorFunc != NULL) { - xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, - xmlTextReaderValidityStructuredRelay, - reader); - } - reader->rngValidErrors = 0; - reader->rngFullNode = NULL; - reader->validate = XML_TEXTREADER_VALIDATE_RNG; - return(0); -} - -/** - * xmlTextReaderSchemaValidateInternal: - * @reader: the xmlTextReaderPtr used - * @xsd: the path to a W3C XSD schema or NULL - * @ctxt: the XML Schema validation context or NULL - * @options: options (not used yet) - * - * Validate the document as it is processed using XML Schema. - * Activation is only possible before the first Read(). - * If both @xsd and @ctxt are NULL then XML Schema validation is deactivated. - * - * Returns 0 in case the schemas validation could be (de)activated and - * -1 in case of error. - */ -static int -xmlTextReaderSchemaValidateInternal(xmlTextReaderPtr reader, - const char *xsd, - xmlSchemaValidCtxtPtr ctxt, - int options ATTRIBUTE_UNUSED) -{ - if (reader == NULL) - return(-1); - - if ((xsd != NULL) && (ctxt != NULL)) - return(-1); - - if (((xsd != NULL) || (ctxt != NULL)) && - ((reader->mode != XML_TEXTREADER_MODE_INITIAL) || - (reader->ctxt == NULL))) - return(-1); - - /* Cleanup previous validation stuff. */ - if (reader->xsdPlug != NULL) { - xmlSchemaSAXUnplug(reader->xsdPlug); - reader->xsdPlug = NULL; - } - if (reader->xsdValidCtxt != NULL) { - if (! reader->xsdPreserveCtxt) - xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); - reader->xsdValidCtxt = NULL; - } - reader->xsdPreserveCtxt = 0; - if (reader->xsdSchemas != NULL) { - xmlSchemaFree(reader->xsdSchemas); - reader->xsdSchemas = NULL; - } - - if ((xsd == NULL) && (ctxt == NULL)) { - /* We just want to deactivate the validation, so get out. */ - return(0); - } - - if (xsd != NULL) { - xmlSchemaParserCtxtPtr pctxt; - /* Parse the schema and create validation environment. */ - pctxt = xmlSchemaNewParserCtxt(xsd); - if (reader->errorFunc != NULL) { - xmlSchemaSetParserErrors(pctxt, - xmlTextReaderValidityErrorRelay, - xmlTextReaderValidityWarningRelay, - reader); - } - reader->xsdSchemas = xmlSchemaParse(pctxt); - xmlSchemaFreeParserCtxt(pctxt); - if (reader->xsdSchemas == NULL) - return(-1); - reader->xsdValidCtxt = xmlSchemaNewValidCtxt(reader->xsdSchemas); - if (reader->xsdValidCtxt == NULL) { - xmlSchemaFree(reader->xsdSchemas); - reader->xsdSchemas = NULL; - return(-1); - } - reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, - &(reader->ctxt->sax), - &(reader->ctxt->userData)); - if (reader->xsdPlug == NULL) { - xmlSchemaFree(reader->xsdSchemas); - reader->xsdSchemas = NULL; - xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); - reader->xsdValidCtxt = NULL; - return(-1); - } - } else { - /* Use the given validation context. */ - reader->xsdValidCtxt = ctxt; - reader->xsdPreserveCtxt = 1; - reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, - &(reader->ctxt->sax), - &(reader->ctxt->userData)); - if (reader->xsdPlug == NULL) { - reader->xsdValidCtxt = NULL; - reader->xsdPreserveCtxt = 0; - return(-1); - } - } - /* - * Redirect the validation context's error channels to use - * the reader channels. - * TODO: In case the user provides the validation context we - * could make this redirection optional. - */ - if (reader->errorFunc != NULL) { - xmlSchemaSetValidErrors(reader->xsdValidCtxt, - xmlTextReaderValidityErrorRelay, - xmlTextReaderValidityWarningRelay, - reader); - } - if (reader->sErrorFunc != NULL) { - xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, - xmlTextReaderValidityStructuredRelay, - reader); - } - reader->xsdValidErrors = 0; - reader->validate = XML_TEXTREADER_VALIDATE_XSD; - return(0); -} - -/** - * xmlTextReaderSchemaValidateCtxt: - * @reader: the xmlTextReaderPtr used - * @ctxt: the XML Schema validation context or NULL - * @options: options (not used yet) - * - * Use W3C XSD schema context to validate the document as it is processed. - * Activation is only possible before the first Read(). - * If @ctxt is NULL, then XML Schema validation is deactivated. - * - * Returns 0 in case the schemas validation could be (de)activated and - * -1 in case of error. - */ -int -xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader, - xmlSchemaValidCtxtPtr ctxt, - int options) -{ - return(xmlTextReaderSchemaValidateInternal(reader, NULL, ctxt, options)); -} - -/** - * xmlTextReaderSchemaValidate: - * @reader: the xmlTextReaderPtr used - * @xsd: the path to a W3C XSD schema or NULL - * - * Use W3C XSD schema to validate the document as it is processed. - * Activation is only possible before the first Read(). - * If @xsd is NULL, then XML Schema validation is deactivated. - * - * Returns 0 in case the schemas validation could be (de)activated and - * -1 in case of error. - */ -int -xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd) -{ - return(xmlTextReaderSchemaValidateInternal(reader, xsd, NULL, 0)); -} -#endif - -/** - * xmlTextReaderIsNamespaceDecl: - * @reader: the xmlTextReaderPtr used - * - * Determine whether the current node is a namespace declaration - * rather than a regular attribute. - * - * Returns 1 if the current node is a namespace declaration, 0 if it - * is a regular attribute or other type of node, or -1 in case of - * error. - */ -int -xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader) { - xmlNodePtr node; - if (reader == NULL) - return(-1); - if (reader->node == NULL) - return(-1); - if (reader->curnode != NULL) - node = reader->curnode; - else - node = reader->node; - - if (XML_NAMESPACE_DECL == node->type) - return(1); - else - return(0); -} - -/** - * xmlTextReaderConstXmlVersion: - * @reader: the xmlTextReaderPtr used - * - * Determine the XML version of the document being read. - * - * Returns a string containing the XML version of the document or NULL - * in case of error. The string is deallocated with the reader. - */ -const xmlChar * -xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader) { - xmlDocPtr doc = NULL; - if (reader == NULL) - return(NULL); - if (reader->doc != NULL) - doc = reader->doc; - else if (reader->ctxt != NULL) - doc = reader->ctxt->myDoc; - if (doc == NULL) - return(NULL); - - if (doc->version == NULL) - return(NULL); - else - return(CONSTSTR(doc->version)); -} - -/** - * xmlTextReaderStandalone: - * @reader: the xmlTextReaderPtr used - * - * Determine the standalone status of the document being read. - * - * Returns 1 if the document was declared to be standalone, 0 if it - * was declared to be not standalone, or -1 if the document did not - * specify its standalone status or in case of error. - */ -int -xmlTextReaderStandalone(xmlTextReaderPtr reader) { - xmlDocPtr doc = NULL; - if (reader == NULL) - return(-1); - if (reader->doc != NULL) - doc = reader->doc; - else if (reader->ctxt != NULL) - doc = reader->ctxt->myDoc; - if (doc == NULL) - return(-1); - - return(doc->standalone); -} - -/************************************************************************ - * * - * Error Handling Extensions * - * * - ************************************************************************/ - -/* helper to build a xmlMalloc'ed string from a format and va_list */ -static char * -xmlTextReaderBuildMessage(const char *msg, va_list ap) { - int size; - int chars; - char *larger; - char *str; - - str = (char *) xmlMallocAtomic(150); - if (str == NULL) { - xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); - return NULL; - } - - size = 150; - - while (1) { - chars = vsnprintf(str, size, msg, ap); - if ((chars > -1) && (chars < size)) - break; - if (chars > -1) - size += chars + 1; - else - size += 100; - if ((larger = (char *) xmlRealloc(str, size)) == NULL) { - xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); - xmlFree(str); - return NULL; - } - str = larger; - } - - return str; -} - -/** - * xmlTextReaderLocatorLineNumber: - * @locator: the xmlTextReaderLocatorPtr used - * - * Obtain the line number for the given locator. - * - * Returns the line number or -1 in case of error. - */ -int -xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator) { - /* we know that locator is a xmlParserCtxtPtr */ - xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator; - int ret = -1; - - if (locator == NULL) - return(-1); - if (ctx->node != NULL) { - ret = xmlGetLineNo(ctx->node); - } - else { - /* inspired from error.c */ - xmlParserInputPtr input; - input = ctx->input; - if ((input->filename == NULL) && (ctx->inputNr > 1)) - input = ctx->inputTab[ctx->inputNr - 2]; - if (input != NULL) { - ret = input->line; - } - else { - ret = -1; - } - } - - return ret; -} - -/** - * xmlTextReaderLocatorBaseURI: - * @locator: the xmlTextReaderLocatorPtr used - * - * Obtain the base URI for the given locator. - * - * Returns the base URI or NULL in case of error. - */ -xmlChar * -xmlTextReaderLocatorBaseURI(xmlTextReaderLocatorPtr locator) { - /* we know that locator is a xmlParserCtxtPtr */ - xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator; - xmlChar *ret = NULL; - - if (locator == NULL) - return(NULL); - if (ctx->node != NULL) { - ret = xmlNodeGetBase(NULL,ctx->node); - } - else { - /* inspired from error.c */ - xmlParserInputPtr input; - input = ctx->input; - if ((input->filename == NULL) && (ctx->inputNr > 1)) - input = ctx->inputTab[ctx->inputNr - 2]; - if (input != NULL) { - ret = xmlStrdup(BAD_CAST input->filename); - } - else { - ret = NULL; - } - } - - return ret; -} - -static void -xmlTextReaderGenericError(void *ctxt, xmlParserSeverities severity, char *str) { - xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)ctxt; - xmlTextReaderPtr reader = (xmlTextReaderPtr)ctx->_private; - - if (str != NULL) { - if (reader->errorFunc) - reader->errorFunc(reader->errorFuncArg, - str, - severity, - (xmlTextReaderLocatorPtr)ctx); - xmlFree(str); - } -} - -static void -xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error) { - xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) ctxt; - xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx->_private; - - if (error && reader->sErrorFunc) { - reader->sErrorFunc(reader->errorFuncArg, - (xmlErrorPtr) error); - } -} - -static void XMLCDECL -xmlTextReaderError(void *ctxt, const char *msg, ...) { - va_list ap; - - va_start(ap,msg); - xmlTextReaderGenericError(ctxt, - XML_PARSER_SEVERITY_ERROR, - xmlTextReaderBuildMessage(msg,ap)); - va_end(ap); - -} - -static void XMLCDECL -xmlTextReaderWarning(void *ctxt, const char *msg, ...) { - va_list ap; - - va_start(ap,msg); - xmlTextReaderGenericError(ctxt, - XML_PARSER_SEVERITY_WARNING, - xmlTextReaderBuildMessage(msg,ap)); - va_end(ap); -} - -static void XMLCDECL -xmlTextReaderValidityError(void *ctxt, const char *msg, ...) { - va_list ap; - int len = xmlStrlen((const xmlChar *) msg); - - if ((len > 1) && (msg[len - 2] != ':')) { - /* - * some callbacks only report locator information: - * skip them (mimicking behaviour in error.c) - */ - va_start(ap,msg); - xmlTextReaderGenericError(ctxt, - XML_PARSER_SEVERITY_VALIDITY_ERROR, - xmlTextReaderBuildMessage(msg,ap)); - va_end(ap); - } -} - -static void XMLCDECL -xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...) { - va_list ap; - int len = xmlStrlen((const xmlChar *) msg); - - if ((len != 0) && (msg[len - 1] != ':')) { - /* - * some callbacks only report locator information: - * skip them (mimicking behaviour in error.c) - */ - va_start(ap,msg); - xmlTextReaderGenericError(ctxt, - XML_PARSER_SEVERITY_VALIDITY_WARNING, - xmlTextReaderBuildMessage(msg,ap)); - va_end(ap); - } -} - -/** - * xmlTextReaderSetErrorHandler: - * @reader: the xmlTextReaderPtr used - * @f: the callback function to call on error and warnings - * @arg: a user argument to pass to the callback function - * - * Register a callback function that will be called on error and warnings. - * - * If @f is NULL, the default error and warning handlers are restored. - */ -void -xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, - xmlTextReaderErrorFunc f, - void *arg) { - if (f != NULL) { - reader->ctxt->sax->error = xmlTextReaderError; - reader->ctxt->sax->serror = NULL; - reader->ctxt->vctxt.error = xmlTextReaderValidityError; - reader->ctxt->sax->warning = xmlTextReaderWarning; - reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; - reader->errorFunc = f; - reader->sErrorFunc = NULL; - reader->errorFuncArg = arg; -#ifdef LIBXML_SCHEMAS_ENABLED - if (reader->rngValidCtxt) { - xmlRelaxNGSetValidErrors(reader->rngValidCtxt, - xmlTextReaderValidityErrorRelay, - xmlTextReaderValidityWarningRelay, - reader); - xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, reader); - } - if (reader->xsdValidCtxt) { - xmlSchemaSetValidErrors(reader->xsdValidCtxt, - xmlTextReaderValidityErrorRelay, - xmlTextReaderValidityWarningRelay, - reader); - xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, reader); - } -#endif - } - else { - /* restore defaults */ - reader->ctxt->sax->error = xmlParserError; - reader->ctxt->vctxt.error = xmlParserValidityError; - reader->ctxt->sax->warning = xmlParserWarning; - reader->ctxt->vctxt.warning = xmlParserValidityWarning; - reader->errorFunc = NULL; - reader->sErrorFunc = NULL; - reader->errorFuncArg = NULL; -#ifdef LIBXML_SCHEMAS_ENABLED - if (reader->rngValidCtxt) { - xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, reader); - xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, reader); - } - if (reader->xsdValidCtxt) { - xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, reader); - xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, reader); - } -#endif - } -} - -/** -* xmlTextReaderSetStructuredErrorHandler: - * @reader: the xmlTextReaderPtr used - * @f: the callback function to call on error and warnings - * @arg: a user argument to pass to the callback function - * - * Register a callback function that will be called on error and warnings. - * - * If @f is NULL, the default error and warning handlers are restored. - */ -void -xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, - xmlStructuredErrorFunc f, - void *arg) { - if (f != NULL) { - reader->ctxt->sax->error = NULL; - reader->ctxt->sax->serror = xmlTextReaderStructuredError; - reader->ctxt->vctxt.error = xmlTextReaderValidityError; - reader->ctxt->sax->warning = xmlTextReaderWarning; - reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; - reader->sErrorFunc = f; - reader->errorFunc = NULL; - reader->errorFuncArg = arg; -#ifdef LIBXML_SCHEMAS_ENABLED - if (reader->rngValidCtxt) { - xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, reader); - xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, - xmlTextReaderValidityStructuredRelay, - reader); - } - if (reader->xsdValidCtxt) { - xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, reader); - xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, - xmlTextReaderValidityStructuredRelay, - reader); - } -#endif - } - else { - /* restore defaults */ - reader->ctxt->sax->error = xmlParserError; - reader->ctxt->sax->serror = NULL; - reader->ctxt->vctxt.error = xmlParserValidityError; - reader->ctxt->sax->warning = xmlParserWarning; - reader->ctxt->vctxt.warning = xmlParserValidityWarning; - reader->errorFunc = NULL; - reader->sErrorFunc = NULL; - reader->errorFuncArg = NULL; -#ifdef LIBXML_SCHEMAS_ENABLED - if (reader->rngValidCtxt) { - xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, reader); - xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, reader); - } - if (reader->xsdValidCtxt) { - xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, reader); - xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, reader); - } -#endif - } -} - -/** - * xmlTextReaderIsValid: - * @reader: the xmlTextReaderPtr used - * - * Retrieve the validity status from the parser context - * - * Returns the flag value 1 if valid, 0 if no, and -1 in case of error - */ -int -xmlTextReaderIsValid(xmlTextReaderPtr reader) { - if (reader == NULL) return(-1); -#ifdef LIBXML_SCHEMAS_ENABLED - if (reader->validate == XML_TEXTREADER_VALIDATE_RNG) - return(reader->rngValidErrors == 0); - if (reader->validate == XML_TEXTREADER_VALIDATE_XSD) - return(reader->xsdValidErrors == 0); -#endif - if ((reader->ctxt != NULL) && (reader->ctxt->validate == 1)) - return(reader->ctxt->valid); - return(0); -} - -/** - * xmlTextReaderGetErrorHandler: - * @reader: the xmlTextReaderPtr used - * @f: the callback function or NULL is no callback has been registered - * @arg: a user argument - * - * Retrieve the error callback function and user argument. - */ -void -xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, - xmlTextReaderErrorFunc *f, - void **arg) { - if (f != NULL) *f = reader->errorFunc; - if (arg != NULL) *arg = reader->errorFuncArg; -} - - -/************************************************************************ - * * - * New set (2.6.0) of simpler and more flexible APIs * - * * - ************************************************************************/ - -/** - * xmlTextReaderSetup: - * @reader: an XML reader - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * @reuse: keep the context for reuse - * - * Setup an XML reader with new options - * - * Returns 0 in case of success and -1 in case of error. - */ -static int -xmlTextReaderSetup(xmlTextReaderPtr reader, - xmlParserInputBufferPtr input, const char *URL, - const char *encoding, int options) -{ - if (reader == NULL) - return (-1); - - /* - * we force the generation of compact text nodes on the reader - * since usr applications should never modify the tree - */ - options |= XML_PARSE_COMPACT; - - reader->doc = NULL; - reader->entNr = 0; - reader->parserFlags = options; - reader->validate = XML_TEXTREADER_NOT_VALIDATE; - if ((input != NULL) && (reader->input != NULL) && - (reader->allocs & XML_TEXTREADER_INPUT)) { - xmlFreeParserInputBuffer(reader->input); - reader->input = NULL; - reader->allocs -= XML_TEXTREADER_INPUT; - } - if (input != NULL) { - reader->input = input; - reader->allocs |= XML_TEXTREADER_INPUT; - } - if (reader->buffer == NULL) - reader->buffer = xmlBufferCreateSize(100); - if (reader->buffer == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlTextReaderSetup : malloc failed\n"); - return (-1); - } - if (reader->sax == NULL) - reader->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); - if (reader->sax == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlTextReaderSetup : malloc failed\n"); - return (-1); - } - xmlSAXVersion(reader->sax, 2); - reader->startElement = reader->sax->startElement; - reader->sax->startElement = xmlTextReaderStartElement; - reader->endElement = reader->sax->endElement; - reader->sax->endElement = xmlTextReaderEndElement; -#ifdef LIBXML_SAX1_ENABLED - if (reader->sax->initialized == XML_SAX2_MAGIC) { -#endif /* LIBXML_SAX1_ENABLED */ - reader->startElementNs = reader->sax->startElementNs; - reader->sax->startElementNs = xmlTextReaderStartElementNs; - reader->endElementNs = reader->sax->endElementNs; - reader->sax->endElementNs = xmlTextReaderEndElementNs; -#ifdef LIBXML_SAX1_ENABLED - } else { - reader->startElementNs = NULL; - reader->endElementNs = NULL; - } -#endif /* LIBXML_SAX1_ENABLED */ - reader->characters = reader->sax->characters; - reader->sax->characters = xmlTextReaderCharacters; - reader->sax->ignorableWhitespace = xmlTextReaderCharacters; - reader->cdataBlock = reader->sax->cdataBlock; - reader->sax->cdataBlock = xmlTextReaderCDataBlock; - - reader->mode = XML_TEXTREADER_MODE_INITIAL; - reader->node = NULL; - reader->curnode = NULL; - if (input != NULL) { - if (reader->input->buffer->use < 4) { - xmlParserInputBufferRead(input, 4); - } - if (reader->ctxt == NULL) { - if (reader->input->buffer->use >= 4) { - reader->ctxt = xmlCreatePushParserCtxt(reader->sax, NULL, - (const char *) reader->input->buffer->content, 4, URL); - reader->base = 0; - reader->cur = 4; - } else { - reader->ctxt = - xmlCreatePushParserCtxt(reader->sax, NULL, NULL, 0, URL); - reader->base = 0; - reader->cur = 0; - } - } else { - xmlParserInputPtr inputStream; - xmlParserInputBufferPtr buf; - xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; - - xmlCtxtReset(reader->ctxt); - buf = xmlAllocParserInputBuffer(enc); - if (buf == NULL) return(-1); - inputStream = xmlNewInputStream(reader->ctxt); - if (inputStream == NULL) { - xmlFreeParserInputBuffer(buf); - return(-1); - } - - if (URL == NULL) - inputStream->filename = NULL; - else - inputStream->filename = (char *) - xmlCanonicPath((const xmlChar *) URL); - inputStream->buf = buf; - inputStream->base = inputStream->buf->buffer->content; - inputStream->cur = inputStream->buf->buffer->content; - inputStream->end = - &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; - - inputPush(reader->ctxt, inputStream); - reader->cur = 0; - } - if (reader->ctxt == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlTextReaderSetup : malloc failed\n"); - return (-1); - } - } - if (reader->dict != NULL) { - if (reader->ctxt->dict != NULL) { - if (reader->dict != reader->ctxt->dict) { - xmlDictFree(reader->dict); - reader->dict = reader->ctxt->dict; - } - } else { - reader->ctxt->dict = reader->dict; - } - } else { - if (reader->ctxt->dict == NULL) - reader->ctxt->dict = xmlDictCreate(); - reader->dict = reader->ctxt->dict; - } - reader->ctxt->_private = reader; - reader->ctxt->linenumbers = 1; - reader->ctxt->dictNames = 1; - /* - * use the parser dictionnary to allocate all elements and attributes names - */ - reader->ctxt->docdict = 1; - reader->ctxt->parseMode = XML_PARSE_READER; - -#ifdef LIBXML_XINCLUDE_ENABLED - if (reader->xincctxt != NULL) { - xmlXIncludeFreeContext(reader->xincctxt); - reader->xincctxt = NULL; - } - if (options & XML_PARSE_XINCLUDE) { - reader->xinclude = 1; - reader->xinclude_name = xmlDictLookup(reader->dict, XINCLUDE_NODE, -1); - options -= XML_PARSE_XINCLUDE; - } else - reader->xinclude = 0; - reader->in_xinclude = 0; -#endif -#ifdef LIBXML_PATTERN_ENABLED - if (reader->patternTab == NULL) { - reader->patternNr = 0; - reader->patternMax = 0; - } - while (reader->patternNr > 0) { - reader->patternNr--; - if (reader->patternTab[reader->patternNr] != NULL) { - xmlFreePattern(reader->patternTab[reader->patternNr]); - reader->patternTab[reader->patternNr] = NULL; - } - } -#endif - - if (options & XML_PARSE_DTDVALID) - reader->validate = XML_TEXTREADER_VALIDATE_DTD; - - xmlCtxtUseOptions(reader->ctxt, options); - if (encoding != NULL) { - xmlCharEncodingHandlerPtr hdlr; - - hdlr = xmlFindCharEncodingHandler(encoding); - if (hdlr != NULL) - xmlSwitchToEncoding(reader->ctxt, hdlr); - } - if ((URL != NULL) && (reader->ctxt->input != NULL) && - (reader->ctxt->input->filename == NULL)) - reader->ctxt->input->filename = (char *) - xmlStrdup((const xmlChar *) URL); - - reader->doc = NULL; - - return (0); -} - -/** - * xmlTextReaderByteConsumed: - * @reader: an XML reader - * - * This function provides the current index of the parser used - * by the reader, relative to the start of the current entity. - * This function actually just wraps a call to xmlBytesConsumed() - * for the parser context associated with the reader. - * See xmlBytesConsumed() for more information. - * - * Returns the index in bytes from the beginning of the entity or -1 - * in case the index could not be computed. - */ -long -xmlTextReaderByteConsumed(xmlTextReaderPtr reader) { - if ((reader == NULL) || (reader->ctxt == NULL)) - return(-1); - return(xmlByteConsumed(reader->ctxt)); -} - - -/** - * xmlReaderWalker: - * @doc: a preparsed document - * - * Create an xmltextReader for a preparsed document. - * - * Returns the new reader or NULL in case of error. - */ -xmlTextReaderPtr -xmlReaderWalker(xmlDocPtr doc) -{ - xmlTextReaderPtr ret; - - if (doc == NULL) - return(NULL); - - ret = xmlMalloc(sizeof(xmlTextReader)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlNewTextReader : malloc failed\n"); - return(NULL); - } - memset(ret, 0, sizeof(xmlTextReader)); - ret->entNr = 0; - ret->input = NULL; - ret->mode = XML_TEXTREADER_MODE_INITIAL; - ret->node = NULL; - ret->curnode = NULL; - ret->base = 0; - ret->cur = 0; - ret->allocs = XML_TEXTREADER_CTXT; - ret->doc = doc; - ret->state = XML_TEXTREADER_START; - ret->dict = xmlDictCreate(); - return(ret); -} - -/** - * xmlReaderForDoc: - * @cur: a pointer to a zero terminated string - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * Create an xmltextReader for an XML in-memory document. - * The parsing flags @options are a combination of xmlParserOption. - * - * Returns the new reader or NULL in case of error. - */ -xmlTextReaderPtr -xmlReaderForDoc(const xmlChar * cur, const char *URL, const char *encoding, - int options) -{ - int len; - - if (cur == NULL) - return (NULL); - len = xmlStrlen(cur); - - return (xmlReaderForMemory - ((const char *) cur, len, URL, encoding, options)); -} - -/** - * xmlReaderForFile: - * @filename: a file or URL - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML file from the filesystem or the network. - * The parsing flags @options are a combination of xmlParserOption. - * - * Returns the new reader or NULL in case of error. - */ -xmlTextReaderPtr -xmlReaderForFile(const char *filename, const char *encoding, int options) -{ - xmlTextReaderPtr reader; - - reader = xmlNewTextReaderFilename(filename); - if (reader == NULL) - return (NULL); - xmlTextReaderSetup(reader, NULL, NULL, encoding, options); - return (reader); -} - -/** - * xmlReaderForMemory: - * @buffer: a pointer to a char array - * @size: the size of the array - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * Create an xmltextReader for an XML in-memory document. - * The parsing flags @options are a combination of xmlParserOption. - * - * Returns the new reader or NULL in case of error. - */ -xmlTextReaderPtr -xmlReaderForMemory(const char *buffer, int size, const char *URL, - const char *encoding, int options) -{ - xmlTextReaderPtr reader; - xmlParserInputBufferPtr buf; - - buf = xmlParserInputBufferCreateStatic(buffer, size, - XML_CHAR_ENCODING_NONE); - if (buf == NULL) { - return (NULL); - } - reader = xmlNewTextReader(buf, URL); - if (reader == NULL) { - xmlFreeParserInputBuffer(buf); - return (NULL); - } - reader->allocs |= XML_TEXTREADER_INPUT; - xmlTextReaderSetup(reader, NULL, URL, encoding, options); - return (reader); -} - -/** - * xmlReaderForFd: - * @fd: an open file descriptor - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * Create an xmltextReader for an XML from a file descriptor. - * The parsing flags @options are a combination of xmlParserOption. - * NOTE that the file descriptor will not be closed when the - * reader is closed or reset. - * - * Returns the new reader or NULL in case of error. - */ -xmlTextReaderPtr -xmlReaderForFd(int fd, const char *URL, const char *encoding, int options) -{ - xmlTextReaderPtr reader; - xmlParserInputBufferPtr input; - - if (fd < 0) - return (NULL); - - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - input->closecallback = NULL; - reader = xmlNewTextReader(input, URL); - if (reader == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - reader->allocs |= XML_TEXTREADER_INPUT; - xmlTextReaderSetup(reader, NULL, URL, encoding, options); - return (reader); -} - -/** - * xmlReaderForIO: - * @ioread: an I/O read function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * Create an xmltextReader for an XML document from I/O functions and source. - * The parsing flags @options are a combination of xmlParserOption. - * - * Returns the new reader or NULL in case of error. - */ -xmlTextReaderPtr -xmlReaderForIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, - void *ioctx, const char *URL, const char *encoding, - int options) -{ - xmlTextReaderPtr reader; - xmlParserInputBufferPtr input; - - if (ioread == NULL) - return (NULL); - - input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); - reader = xmlNewTextReader(input, URL); - if (reader == NULL) { - xmlFreeParserInputBuffer(input); - return (NULL); - } - reader->allocs |= XML_TEXTREADER_INPUT; - xmlTextReaderSetup(reader, NULL, URL, encoding, options); - return (reader); -} - -/** - * xmlReaderNewWalker: - * @reader: an XML reader - * @doc: a preparsed document - * - * Setup an xmltextReader to parse a preparsed XML document. - * This reuses the existing @reader xmlTextReader. - * - * Returns 0 in case of success and -1 in case of error - */ -int -xmlReaderNewWalker(xmlTextReaderPtr reader, xmlDocPtr doc) -{ - if (doc == NULL) - return (-1); - if (reader == NULL) - return (-1); - - if (reader->input != NULL) { - xmlFreeParserInputBuffer(reader->input); - } - if (reader->ctxt != NULL) { - xmlCtxtReset(reader->ctxt); - } - - reader->entNr = 0; - reader->input = NULL; - reader->mode = XML_TEXTREADER_MODE_INITIAL; - reader->node = NULL; - reader->curnode = NULL; - reader->base = 0; - reader->cur = 0; - reader->allocs = XML_TEXTREADER_CTXT; - reader->doc = doc; - reader->state = XML_TEXTREADER_START; - if (reader->dict == NULL) { - if ((reader->ctxt != NULL) && (reader->ctxt->dict != NULL)) - reader->dict = reader->ctxt->dict; - else - reader->dict = xmlDictCreate(); - } - return(0); -} - -/** - * xmlReaderNewDoc: - * @reader: an XML reader - * @cur: a pointer to a zero terminated string - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * Setup an xmltextReader to parse an XML in-memory document. - * The parsing flags @options are a combination of xmlParserOption. - * This reuses the existing @reader xmlTextReader. - * - * Returns 0 in case of success and -1 in case of error - */ -int -xmlReaderNewDoc(xmlTextReaderPtr reader, const xmlChar * cur, - const char *URL, const char *encoding, int options) -{ - - int len; - - if (cur == NULL) - return (-1); - if (reader == NULL) - return (-1); - - len = xmlStrlen(cur); - return (xmlReaderNewMemory(reader, (const char *)cur, len, - URL, encoding, options)); -} - -/** - * xmlReaderNewFile: - * @reader: an XML reader - * @filename: a file or URL - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * parse an XML file from the filesystem or the network. - * The parsing flags @options are a combination of xmlParserOption. - * This reuses the existing @reader xmlTextReader. - * - * Returns 0 in case of success and -1 in case of error - */ -int -xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename, - const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - - if (filename == NULL) - return (-1); - if (reader == NULL) - return (-1); - - input = - xmlParserInputBufferCreateFilename(filename, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (-1); - return (xmlTextReaderSetup(reader, input, filename, encoding, options)); -} - -/** - * xmlReaderNewMemory: - * @reader: an XML reader - * @buffer: a pointer to a char array - * @size: the size of the array - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * Setup an xmltextReader to parse an XML in-memory document. - * The parsing flags @options are a combination of xmlParserOption. - * This reuses the existing @reader xmlTextReader. - * - * Returns 0 in case of success and -1 in case of error - */ -int -xmlReaderNewMemory(xmlTextReaderPtr reader, const char *buffer, int size, - const char *URL, const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - - if (reader == NULL) - return (-1); - if (buffer == NULL) - return (-1); - - input = xmlParserInputBufferCreateStatic(buffer, size, - XML_CHAR_ENCODING_NONE); - if (input == NULL) { - return (-1); - } - return (xmlTextReaderSetup(reader, input, URL, encoding, options)); -} - -/** - * xmlReaderNewFd: - * @reader: an XML reader - * @fd: an open file descriptor - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * Setup an xmltextReader to parse an XML from a file descriptor. - * NOTE that the file descriptor will not be closed when the - * reader is closed or reset. - * The parsing flags @options are a combination of xmlParserOption. - * This reuses the existing @reader xmlTextReader. - * - * Returns 0 in case of success and -1 in case of error - */ -int -xmlReaderNewFd(xmlTextReaderPtr reader, int fd, - const char *URL, const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - - if (fd < 0) - return (-1); - if (reader == NULL) - return (-1); - - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (-1); - input->closecallback = NULL; - return (xmlTextReaderSetup(reader, input, URL, encoding, options)); -} - -/** - * xmlReaderNewIO: - * @reader: an XML reader - * @ioread: an I/O read function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @URL: the base URL to use for the document - * @encoding: the document encoding, or NULL - * @options: a combination of xmlParserOption - * - * Setup an xmltextReader to parse an XML document from I/O functions - * and source. - * The parsing flags @options are a combination of xmlParserOption. - * This reuses the existing @reader xmlTextReader. - * - * Returns 0 in case of success and -1 in case of error - */ -int -xmlReaderNewIO(xmlTextReaderPtr reader, xmlInputReadCallback ioread, - xmlInputCloseCallback ioclose, void *ioctx, - const char *URL, const char *encoding, int options) -{ - xmlParserInputBufferPtr input; - - if (ioread == NULL) - return (-1); - if (reader == NULL) - return (-1); - - input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (-1); - return (xmlTextReaderSetup(reader, input, URL, encoding, options)); -} -/************************************************************************ - * * - * Utilities * - * * - ************************************************************************/ -#ifdef NOT_USED_YET -/** - * xmlBase64Decode: - * @in: the input buffer - * @inlen: the size of the input (in), the size read from it (out) - * @to: the output buffer - * @tolen: the size of the output (in), the size written to (out) - * - * Base64 decoder, reads from @in and save in @to - * TODO: tell jody when this is actually exported - * - * Returns 0 if all the input was consumer, 1 if the Base64 end was reached, - * 2 if there wasn't enough space on the output or -1 in case of error. - */ -static int -xmlBase64Decode(const unsigned char *in, unsigned long *inlen, - unsigned char *to, unsigned long *tolen) { - unsigned long incur; /* current index in in[] */ - unsigned long inblk; /* last block index in in[] */ - unsigned long outcur; /* current index in out[] */ - unsigned long inmax; /* size of in[] */ - unsigned long outmax; /* size of out[] */ - unsigned char cur; /* the current value read from in[] */ - unsigned char intmp[4], outtmp[4]; /* temporary buffers for the convert */ - int nbintmp; /* number of byte in intmp[] */ - int is_ignore; /* cur should be ignored */ - int is_end = 0; /* the end of the base64 was found */ - int retval = 1; - int i; - - if ((in == NULL) || (inlen == NULL) || (to == NULL) || (tolen == NULL)) - return(-1); - - incur = 0; - inblk = 0; - outcur = 0; - inmax = *inlen; - outmax = *tolen; - nbintmp = 0; - - while (1) { - if (incur >= inmax) - break; - cur = in[incur++]; - is_ignore = 0; - if ((cur >= 'A') && (cur <= 'Z')) - cur = cur - 'A'; - else if ((cur >= 'a') && (cur <= 'z')) - cur = cur - 'a' + 26; - else if ((cur >= '0') && (cur <= '9')) - cur = cur - '0' + 52; - else if (cur == '+') - cur = 62; - else if (cur == '/') - cur = 63; - else if (cur == '.') - cur = 0; - else if (cur == '=') /*no op , end of the base64 stream */ - is_end = 1; - else { - is_ignore = 1; - if (nbintmp == 0) - inblk = incur; - } - - if (!is_ignore) { - int nbouttmp = 3; - int is_break = 0; - - if (is_end) { - if (nbintmp == 0) - break; - if ((nbintmp == 1) || (nbintmp == 2)) - nbouttmp = 1; - else - nbouttmp = 2; - nbintmp = 3; - is_break = 1; - } - intmp[nbintmp++] = cur; - /* - * if intmp is full, push the 4byte sequence as a 3 byte - * sequence out - */ - if (nbintmp == 4) { - nbintmp = 0; - outtmp[0] = (intmp[0] << 2) | ((intmp[1] & 0x30) >> 4); - outtmp[1] = - ((intmp[1] & 0x0F) << 4) | ((intmp[2] & 0x3C) >> 2); - outtmp[2] = ((intmp[2] & 0x03) << 6) | (intmp[3] & 0x3F); - if (outcur + 3 >= outmax) { - retval = 2; - break; - } - - for (i = 0; i < nbouttmp; i++) - to[outcur++] = outtmp[i]; - inblk = incur; - } - - if (is_break) { - retval = 0; - break; - } - } - } - - *tolen = outcur; - *inlen = inblk; - return (retval); -} - -/* - * Test routine for the xmlBase64Decode function - */ -#if 0 -int main(int argc, char **argv) { - char *input = " VW4 gcGV0 \n aXQgdGVzdCAuCg== "; - char output[100]; - char output2[100]; - char output3[100]; - unsigned long inlen = strlen(input); - unsigned long outlen = 100; - int ret; - unsigned long cons, tmp, tmp2, prod; - - /* - * Direct - */ - ret = xmlBase64Decode(input, &inlen, output, &outlen); - - output[outlen] = 0; - printf("ret: %d, inlen: %ld , outlen: %ld, output: '%s'\n", ret, inlen, outlen, output); - - /* - * output chunking - */ - cons = 0; - prod = 0; - while (cons < inlen) { - tmp = 5; - tmp2 = inlen - cons; - - printf("%ld %ld\n", cons, prod); - ret = xmlBase64Decode(&input[cons], &tmp2, &output2[prod], &tmp); - cons += tmp2; - prod += tmp; - printf("%ld %ld\n", cons, prod); - } - output2[outlen] = 0; - printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, prod, output2); - - /* - * input chunking - */ - cons = 0; - prod = 0; - while (cons < inlen) { - tmp = 100 - prod; - tmp2 = inlen - cons; - if (tmp2 > 5) - tmp2 = 5; - - printf("%ld %ld\n", cons, prod); - ret = xmlBase64Decode(&input[cons], &tmp2, &output3[prod], &tmp); - cons += tmp2; - prod += tmp; - printf("%ld %ld\n", cons, prod); - } - output3[outlen] = 0; - printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, prod, output3); - return(0); - -} -#endif -#endif /* NOT_USED_YET */ -#define bottom_xmlreader -#include "elfgcchack.h" -#endif /* LIBXML_READER_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/xmlregexp.c b/ThirdParty/libxml2/vtklibxml2/xmlregexp.c deleted file mode 100644 index e6f71e9029a..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlregexp.c +++ /dev/null @@ -1,7959 +0,0 @@ -/* - * regexp.c: generic and extensible Regular Expression engine - * - * Basically designed with the purpose of compiling regexps for - * the variety of validation/shemas mechanisms now available in - * XML related specifications these include: - * - XML-1.0 DTD validation - * - XML Schemas structure part 1 - * - XML Schemas Datatypes part 2 especially Appendix F - * - RELAX-NG/TREX i.e. the counter proposal - * - * See Copyright for the status of this software. - * - * Daniel Veillard <veillard@redhat.com> - */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_REGEXP_ENABLED - -/* #define DEBUG_ERR */ - -#include <stdio.h> -#include <string.h> -#ifdef HAVE_LIMITS_H -#include <limits.h> -#endif - -#include <libxml/tree.h> -#include <libxml/parserInternals.h> -#include <libxml/xmlregexp.h> -#include <libxml/xmlautomata.h> -#include <libxml/xmlunicode.h> - -#ifndef INT_MAX -#define INT_MAX 123456789 /* easy to flag and big enough for our needs */ -#endif - -/* #define DEBUG_REGEXP_GRAPH */ -/* #define DEBUG_REGEXP_EXEC */ -/* #define DEBUG_PUSH */ -/* #define DEBUG_COMPACTION */ - -#define MAX_PUSH 10000000 - -#define ERROR(str) \ - ctxt->error = XML_REGEXP_COMPILE_ERROR; \ - xmlRegexpErrCompile(ctxt, str); -#define NEXT ctxt->cur++ -#define CUR (*(ctxt->cur)) -#define NXT(index) (ctxt->cur[index]) - -#define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l) -#define NEXTL(l) ctxt->cur += l; -#define XML_REG_STRING_SEPARATOR '|' - -/** - * TODO: - * - * macro to flag unimplemented blocks - */ -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -/************************************************************************ - * * - * Datatypes and structures * - * * - ************************************************************************/ - -/* - * Note: the order of the enums below is significant, do not shuffle - */ -typedef enum { - XML_REGEXP_EPSILON = 1, - XML_REGEXP_CHARVAL, - XML_REGEXP_RANGES, - XML_REGEXP_SUBREG, /* used for () sub regexps */ - XML_REGEXP_STRING, - XML_REGEXP_ANYCHAR, /* . */ - XML_REGEXP_ANYSPACE, /* \s */ - XML_REGEXP_NOTSPACE, /* \S */ - XML_REGEXP_INITNAME, /* \l */ - XML_REGEXP_NOTINITNAME, /* \L */ - XML_REGEXP_NAMECHAR, /* \c */ - XML_REGEXP_NOTNAMECHAR, /* \C */ - XML_REGEXP_DECIMAL, /* \d */ - XML_REGEXP_NOTDECIMAL, /* \D */ - XML_REGEXP_REALCHAR, /* \w */ - XML_REGEXP_NOTREALCHAR, /* \W */ - XML_REGEXP_LETTER = 100, - XML_REGEXP_LETTER_UPPERCASE, - XML_REGEXP_LETTER_LOWERCASE, - XML_REGEXP_LETTER_TITLECASE, - XML_REGEXP_LETTER_MODIFIER, - XML_REGEXP_LETTER_OTHERS, - XML_REGEXP_MARK, - XML_REGEXP_MARK_NONSPACING, - XML_REGEXP_MARK_SPACECOMBINING, - XML_REGEXP_MARK_ENCLOSING, - XML_REGEXP_NUMBER, - XML_REGEXP_NUMBER_DECIMAL, - XML_REGEXP_NUMBER_LETTER, - XML_REGEXP_NUMBER_OTHERS, - XML_REGEXP_PUNCT, - XML_REGEXP_PUNCT_CONNECTOR, - XML_REGEXP_PUNCT_DASH, - XML_REGEXP_PUNCT_OPEN, - XML_REGEXP_PUNCT_CLOSE, - XML_REGEXP_PUNCT_INITQUOTE, - XML_REGEXP_PUNCT_FINQUOTE, - XML_REGEXP_PUNCT_OTHERS, - XML_REGEXP_SEPAR, - XML_REGEXP_SEPAR_SPACE, - XML_REGEXP_SEPAR_LINE, - XML_REGEXP_SEPAR_PARA, - XML_REGEXP_SYMBOL, - XML_REGEXP_SYMBOL_MATH, - XML_REGEXP_SYMBOL_CURRENCY, - XML_REGEXP_SYMBOL_MODIFIER, - XML_REGEXP_SYMBOL_OTHERS, - XML_REGEXP_OTHER, - XML_REGEXP_OTHER_CONTROL, - XML_REGEXP_OTHER_FORMAT, - XML_REGEXP_OTHER_PRIVATE, - XML_REGEXP_OTHER_NA, - XML_REGEXP_BLOCK_NAME -} xmlRegAtomType; - -typedef enum { - XML_REGEXP_QUANT_EPSILON = 1, - XML_REGEXP_QUANT_ONCE, - XML_REGEXP_QUANT_OPT, - XML_REGEXP_QUANT_MULT, - XML_REGEXP_QUANT_PLUS, - XML_REGEXP_QUANT_ONCEONLY, - XML_REGEXP_QUANT_ALL, - XML_REGEXP_QUANT_RANGE -} xmlRegQuantType; - -typedef enum { - XML_REGEXP_START_STATE = 1, - XML_REGEXP_FINAL_STATE, - XML_REGEXP_TRANS_STATE, - XML_REGEXP_SINK_STATE -} xmlRegStateType; - -typedef enum { - XML_REGEXP_MARK_NORMAL = 0, - XML_REGEXP_MARK_START, - XML_REGEXP_MARK_VISITED -} xmlRegMarkedType; - -typedef struct _xmlRegRange xmlRegRange; -typedef xmlRegRange *xmlRegRangePtr; - -struct _xmlRegRange { - int neg; /* 0 normal, 1 not, 2 exclude */ - xmlRegAtomType type; - int start; - int end; - xmlChar *blockName; -}; - -typedef struct _xmlRegAtom xmlRegAtom; -typedef xmlRegAtom *xmlRegAtomPtr; - -typedef struct _xmlAutomataState xmlRegState; -typedef xmlRegState *xmlRegStatePtr; - -struct _xmlRegAtom { - int no; - xmlRegAtomType type; - xmlRegQuantType quant; - int min; - int max; - - void *valuep; - void *valuep2; - int neg; - int codepoint; - xmlRegStatePtr start; - xmlRegStatePtr stop; - int maxRanges; - int nbRanges; - xmlRegRangePtr *ranges; - void *data; -}; - -typedef struct _xmlRegCounter xmlRegCounter; -typedef xmlRegCounter *xmlRegCounterPtr; - -struct _xmlRegCounter { - int min; - int max; -}; - -typedef struct _xmlRegTrans xmlRegTrans; -typedef xmlRegTrans *xmlRegTransPtr; - -struct _xmlRegTrans { - xmlRegAtomPtr atom; - int to; - int counter; - int count; - int nd; -}; - -struct _xmlAutomataState { - xmlRegStateType type; - xmlRegMarkedType mark; - xmlRegMarkedType reached; - int no; - int maxTrans; - int nbTrans; - xmlRegTrans *trans; - /* knowing states ponting to us can speed things up */ - int maxTransTo; - int nbTransTo; - int *transTo; -}; - -typedef struct _xmlAutomata xmlRegParserCtxt; -typedef xmlRegParserCtxt *xmlRegParserCtxtPtr; - -struct _xmlAutomata { - xmlChar *string; - xmlChar *cur; - - int error; - int neg; - - xmlRegStatePtr start; - xmlRegStatePtr end; - xmlRegStatePtr state; - - xmlRegAtomPtr atom; - - int maxAtoms; - int nbAtoms; - xmlRegAtomPtr *atoms; - - int maxStates; - int nbStates; - xmlRegStatePtr *states; - - int maxCounters; - int nbCounters; - xmlRegCounter *counters; - - int determinist; - int negs; -}; - -struct _xmlRegexp { - xmlChar *string; - int nbStates; - xmlRegStatePtr *states; - int nbAtoms; - xmlRegAtomPtr *atoms; - int nbCounters; - xmlRegCounter *counters; - int determinist; - /* - * That's the compact form for determinists automatas - */ - int nbstates; - int *compact; - void **transdata; - int nbstrings; - xmlChar **stringMap; -}; - -typedef struct _xmlRegExecRollback xmlRegExecRollback; -typedef xmlRegExecRollback *xmlRegExecRollbackPtr; - -struct _xmlRegExecRollback { - xmlRegStatePtr state;/* the current state */ - int index; /* the index in the input stack */ - int nextbranch; /* the next transition to explore in that state */ - int *counts; /* save the automata state if it has some */ -}; - -typedef struct _xmlRegInputToken xmlRegInputToken; -typedef xmlRegInputToken *xmlRegInputTokenPtr; - -struct _xmlRegInputToken { - xmlChar *value; - void *data; -}; - -struct _xmlRegExecCtxt { - int status; /* execution status != 0 indicate an error */ - int determinist; /* did we find an indeterministic behaviour */ - xmlRegexpPtr comp; /* the compiled regexp */ - xmlRegExecCallbacks callback; - void *data; - - xmlRegStatePtr state;/* the current state */ - int transno; /* the current transition on that state */ - int transcount; /* the number of chars in char counted transitions */ - - /* - * A stack of rollback states - */ - int maxRollbacks; - int nbRollbacks; - xmlRegExecRollback *rollbacks; - - /* - * The state of the automata if any - */ - int *counts; - - /* - * The input stack - */ - int inputStackMax; - int inputStackNr; - int index; - int *charStack; - const xmlChar *inputString; /* when operating on characters */ - xmlRegInputTokenPtr inputStack;/* when operating on strings */ - - /* - * error handling - */ - int errStateNo; /* the error state number */ - xmlRegStatePtr errState; /* the error state */ - xmlChar *errString; /* the string raising the error */ - int *errCounts; /* counters at the error state */ - int nbPush; -}; - -#define REGEXP_ALL_COUNTER 0x123456 -#define REGEXP_ALL_LAX_COUNTER 0x123457 - -static void xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top); -static void xmlRegFreeState(xmlRegStatePtr state); -static void xmlRegFreeAtom(xmlRegAtomPtr atom); -static int xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr); -static int xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint); -static int xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, - int neg, int start, int end, const xmlChar *blockName); - -/************************************************************************ - * * - * Regexp memory error handler * - * * - ************************************************************************/ -/** - * xmlRegexpErrMemory: - * @extra: extra information - * - * Handle an out of memory condition - */ -static void -xmlRegexpErrMemory(xmlRegParserCtxtPtr ctxt, const char *extra) -{ - const char *regexp = NULL; - if (ctxt != NULL) { - regexp = (const char *) ctxt->string; - ctxt->error = XML_ERR_NO_MEMORY; - } - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, - regexp, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); -} - -/** - * xmlRegexpErrCompile: - * @extra: extra information - * - * Handle a compilation failure - */ -static void -xmlRegexpErrCompile(xmlRegParserCtxtPtr ctxt, const char *extra) -{ - const char *regexp = NULL; - int idx = 0; - - if (ctxt != NULL) { - regexp = (const char *) ctxt->string; - idx = ctxt->cur - ctxt->string; - ctxt->error = XML_REGEXP_COMPILE_ERROR; - } - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, - XML_REGEXP_COMPILE_ERROR, XML_ERR_FATAL, NULL, 0, extra, - regexp, NULL, idx, 0, - "failed to compile: %s\n", extra); -} - -/************************************************************************ - * * - * Allocation/Deallocation * - * * - ************************************************************************/ - -static int xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt); -/** - * xmlRegEpxFromParse: - * @ctxt: the parser context used to build it - * - * Allocate a new regexp and fill it with the result from the parser - * - * Returns the new regexp or NULL in case of error - */ -static xmlRegexpPtr -xmlRegEpxFromParse(xmlRegParserCtxtPtr ctxt) { - xmlRegexpPtr ret; - - ret = (xmlRegexpPtr) xmlMalloc(sizeof(xmlRegexp)); - if (ret == NULL) { - xmlRegexpErrMemory(ctxt, "compiling regexp"); - return(NULL); - } - memset(ret, 0, sizeof(xmlRegexp)); - ret->string = ctxt->string; - ret->nbStates = ctxt->nbStates; - ret->states = ctxt->states; - ret->nbAtoms = ctxt->nbAtoms; - ret->atoms = ctxt->atoms; - ret->nbCounters = ctxt->nbCounters; - ret->counters = ctxt->counters; - ret->determinist = ctxt->determinist; - if (ret->determinist == -1) { - xmlRegexpIsDeterminist(ret); - } - - if ((ret->determinist != 0) && - (ret->nbCounters == 0) && - (ctxt->negs == 0) && - (ret->atoms != NULL) && - (ret->atoms[0] != NULL) && - (ret->atoms[0]->type == XML_REGEXP_STRING)) { - int i, j, nbstates = 0, nbatoms = 0; - int *stateRemap; - int *stringRemap; - int *transitions; - void **transdata; - xmlChar **stringMap; - xmlChar *value; - - /* - * Switch to a compact representation - * 1/ counting the effective number of states left - * 2/ counting the unique number of atoms, and check that - * they are all of the string type - * 3/ build a table state x atom for the transitions - */ - - stateRemap = xmlMalloc(ret->nbStates * sizeof(int)); - if (stateRemap == NULL) { - xmlRegexpErrMemory(ctxt, "compiling regexp"); - xmlFree(ret); - return(NULL); - } - for (i = 0;i < ret->nbStates;i++) { - if (ret->states[i] != NULL) { - stateRemap[i] = nbstates; - nbstates++; - } else { - stateRemap[i] = -1; - } - } -#ifdef DEBUG_COMPACTION - printf("Final: %d states\n", nbstates); -#endif - stringMap = xmlMalloc(ret->nbAtoms * sizeof(char *)); - if (stringMap == NULL) { - xmlRegexpErrMemory(ctxt, "compiling regexp"); - xmlFree(stateRemap); - xmlFree(ret); - return(NULL); - } - stringRemap = xmlMalloc(ret->nbAtoms * sizeof(int)); - if (stringRemap == NULL) { - xmlRegexpErrMemory(ctxt, "compiling regexp"); - xmlFree(stringMap); - xmlFree(stateRemap); - xmlFree(ret); - return(NULL); - } - for (i = 0;i < ret->nbAtoms;i++) { - if ((ret->atoms[i]->type == XML_REGEXP_STRING) && - (ret->atoms[i]->quant == XML_REGEXP_QUANT_ONCE)) { - value = ret->atoms[i]->valuep; - for (j = 0;j < nbatoms;j++) { - if (xmlStrEqual(stringMap[j], value)) { - stringRemap[i] = j; - break; - } - } - if (j >= nbatoms) { - stringRemap[i] = nbatoms; - stringMap[nbatoms] = xmlStrdup(value); - if (stringMap[nbatoms] == NULL) { - for (i = 0;i < nbatoms;i++) - xmlFree(stringMap[i]); - xmlFree(stringRemap); - xmlFree(stringMap); - xmlFree(stateRemap); - xmlFree(ret); - return(NULL); - } - nbatoms++; - } - } else { - xmlFree(stateRemap); - xmlFree(stringRemap); - for (i = 0;i < nbatoms;i++) - xmlFree(stringMap[i]); - xmlFree(stringMap); - xmlFree(ret); - return(NULL); - } - } -#ifdef DEBUG_COMPACTION - printf("Final: %d atoms\n", nbatoms); -#endif - transitions = (int *) xmlMalloc((nbstates + 1) * - (nbatoms + 1) * sizeof(int)); - if (transitions == NULL) { - xmlFree(stateRemap); - xmlFree(stringRemap); - xmlFree(stringMap); - xmlFree(ret); - return(NULL); - } - memset(transitions, 0, (nbstates + 1) * (nbatoms + 1) * sizeof(int)); - - /* - * Allocate the transition table. The first entry for each - * state corresponds to the state type. - */ - transdata = NULL; - - for (i = 0;i < ret->nbStates;i++) { - int stateno, atomno, targetno, prev; - xmlRegStatePtr state; - xmlRegTransPtr trans; - - stateno = stateRemap[i]; - if (stateno == -1) - continue; - state = ret->states[i]; - - transitions[stateno * (nbatoms + 1)] = state->type; - - for (j = 0;j < state->nbTrans;j++) { - trans = &(state->trans[j]); - if ((trans->to == -1) || (trans->atom == NULL)) - continue; - atomno = stringRemap[trans->atom->no]; - if ((trans->atom->data != NULL) && (transdata == NULL)) { - transdata = (void **) xmlMalloc(nbstates * nbatoms * - sizeof(void *)); - if (transdata != NULL) - memset(transdata, 0, - nbstates * nbatoms * sizeof(void *)); - else { - xmlRegexpErrMemory(ctxt, "compiling regexp"); - break; - } - } - targetno = stateRemap[trans->to]; - /* - * if the same atom can generate transitions to 2 different - * states then it means the automata is not determinist and - * the compact form can't be used ! - */ - prev = transitions[stateno * (nbatoms + 1) + atomno + 1]; - if (prev != 0) { - if (prev != targetno + 1) { - ret->determinist = 0; -#ifdef DEBUG_COMPACTION - printf("Indet: state %d trans %d, atom %d to %d : %d to %d\n", - i, j, trans->atom->no, trans->to, atomno, targetno); - printf(" previous to is %d\n", prev); -#endif - if (transdata != NULL) - xmlFree(transdata); - xmlFree(transitions); - xmlFree(stateRemap); - xmlFree(stringRemap); - for (i = 0;i < nbatoms;i++) - xmlFree(stringMap[i]); - xmlFree(stringMap); - goto not_determ; - } - } else { -#if 0 - printf("State %d trans %d: atom %d to %d : %d to %d\n", - i, j, trans->atom->no, trans->to, atomno, targetno); -#endif - transitions[stateno * (nbatoms + 1) + atomno + 1] = - targetno + 1; /* to avoid 0 */ - if (transdata != NULL) - transdata[stateno * nbatoms + atomno] = - trans->atom->data; - } - } - } - ret->determinist = 1; -#ifdef DEBUG_COMPACTION - /* - * Debug - */ - for (i = 0;i < nbstates;i++) { - for (j = 0;j < nbatoms + 1;j++) { - printf("%02d ", transitions[i * (nbatoms + 1) + j]); - } - printf("\n"); - } - printf("\n"); -#endif - /* - * Cleanup of the old data - */ - if (ret->states != NULL) { - for (i = 0;i < ret->nbStates;i++) - xmlRegFreeState(ret->states[i]); - xmlFree(ret->states); - } - ret->states = NULL; - ret->nbStates = 0; - if (ret->atoms != NULL) { - for (i = 0;i < ret->nbAtoms;i++) - xmlRegFreeAtom(ret->atoms[i]); - xmlFree(ret->atoms); - } - ret->atoms = NULL; - ret->nbAtoms = 0; - - ret->compact = transitions; - ret->transdata = transdata; - ret->stringMap = stringMap; - ret->nbstrings = nbatoms; - ret->nbstates = nbstates; - xmlFree(stateRemap); - xmlFree(stringRemap); - } -not_determ: - ctxt->string = NULL; - ctxt->nbStates = 0; - ctxt->states = NULL; - ctxt->nbAtoms = 0; - ctxt->atoms = NULL; - ctxt->nbCounters = 0; - ctxt->counters = NULL; - return(ret); -} - -/** - * xmlRegNewParserCtxt: - * @string: the string to parse - * - * Allocate a new regexp parser context - * - * Returns the new context or NULL in case of error - */ -static xmlRegParserCtxtPtr -xmlRegNewParserCtxt(const xmlChar *string) { - xmlRegParserCtxtPtr ret; - - ret = (xmlRegParserCtxtPtr) xmlMalloc(sizeof(xmlRegParserCtxt)); - if (ret == NULL) - return(NULL); - memset(ret, 0, sizeof(xmlRegParserCtxt)); - if (string != NULL) - ret->string = xmlStrdup(string); - ret->cur = ret->string; - ret->neg = 0; - ret->negs = 0; - ret->error = 0; - ret->determinist = -1; - return(ret); -} - -/** - * xmlRegNewRange: - * @ctxt: the regexp parser context - * @neg: is that negative - * @type: the type of range - * @start: the start codepoint - * @end: the end codepoint - * - * Allocate a new regexp range - * - * Returns the new range or NULL in case of error - */ -static xmlRegRangePtr -xmlRegNewRange(xmlRegParserCtxtPtr ctxt, - int neg, xmlRegAtomType type, int start, int end) { - xmlRegRangePtr ret; - - ret = (xmlRegRangePtr) xmlMalloc(sizeof(xmlRegRange)); - if (ret == NULL) { - xmlRegexpErrMemory(ctxt, "allocating range"); - return(NULL); - } - ret->neg = neg; - ret->type = type; - ret->start = start; - ret->end = end; - return(ret); -} - -/** - * xmlRegFreeRange: - * @range: the regexp range - * - * Free a regexp range - */ -static void -xmlRegFreeRange(xmlRegRangePtr range) { - if (range == NULL) - return; - - if (range->blockName != NULL) - xmlFree(range->blockName); - xmlFree(range); -} - -/** - * xmlRegNewAtom: - * @ctxt: the regexp parser context - * @type: the type of atom - * - * Allocate a new regexp range - * - * Returns the new atom or NULL in case of error - */ -static xmlRegAtomPtr -xmlRegNewAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomType type) { - xmlRegAtomPtr ret; - - ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); - if (ret == NULL) { - xmlRegexpErrMemory(ctxt, "allocating atom"); - return(NULL); - } - memset(ret, 0, sizeof(xmlRegAtom)); - ret->type = type; - ret->quant = XML_REGEXP_QUANT_ONCE; - ret->min = 0; - ret->max = 0; - return(ret); -} - -/** - * xmlRegFreeAtom: - * @atom: the regexp atom - * - * Free a regexp atom - */ -static void -xmlRegFreeAtom(xmlRegAtomPtr atom) { - int i; - - if (atom == NULL) - return; - - for (i = 0;i < atom->nbRanges;i++) - xmlRegFreeRange(atom->ranges[i]); - if (atom->ranges != NULL) - xmlFree(atom->ranges); - if ((atom->type == XML_REGEXP_STRING) && (atom->valuep != NULL)) - xmlFree(atom->valuep); - if ((atom->type == XML_REGEXP_STRING) && (atom->valuep2 != NULL)) - xmlFree(atom->valuep2); - if ((atom->type == XML_REGEXP_BLOCK_NAME) && (atom->valuep != NULL)) - xmlFree(atom->valuep); - xmlFree(atom); -} - -static xmlRegStatePtr -xmlRegNewState(xmlRegParserCtxtPtr ctxt) { - xmlRegStatePtr ret; - - ret = (xmlRegStatePtr) xmlMalloc(sizeof(xmlRegState)); - if (ret == NULL) { - xmlRegexpErrMemory(ctxt, "allocating state"); - return(NULL); - } - memset(ret, 0, sizeof(xmlRegState)); - ret->type = XML_REGEXP_TRANS_STATE; - ret->mark = XML_REGEXP_MARK_NORMAL; - return(ret); -} - -/** - * xmlRegFreeState: - * @state: the regexp state - * - * Free a regexp state - */ -static void -xmlRegFreeState(xmlRegStatePtr state) { - if (state == NULL) - return; - - if (state->trans != NULL) - xmlFree(state->trans); - if (state->transTo != NULL) - xmlFree(state->transTo); - xmlFree(state); -} - -/** - * xmlRegFreeParserCtxt: - * @ctxt: the regexp parser context - * - * Free a regexp parser context - */ -static void -xmlRegFreeParserCtxt(xmlRegParserCtxtPtr ctxt) { - int i; - if (ctxt == NULL) - return; - - if (ctxt->string != NULL) - xmlFree(ctxt->string); - if (ctxt->states != NULL) { - for (i = 0;i < ctxt->nbStates;i++) - xmlRegFreeState(ctxt->states[i]); - xmlFree(ctxt->states); - } - if (ctxt->atoms != NULL) { - for (i = 0;i < ctxt->nbAtoms;i++) - xmlRegFreeAtom(ctxt->atoms[i]); - xmlFree(ctxt->atoms); - } - if (ctxt->counters != NULL) - xmlFree(ctxt->counters); - xmlFree(ctxt); -} - -/************************************************************************ - * * - * Display of Data structures * - * * - ************************************************************************/ - -static void -xmlRegPrintAtomType(FILE *output, xmlRegAtomType type) { - switch (type) { - case XML_REGEXP_EPSILON: - fprintf(output, "epsilon "); break; - case XML_REGEXP_CHARVAL: - fprintf(output, "charval "); break; - case XML_REGEXP_RANGES: - fprintf(output, "ranges "); break; - case XML_REGEXP_SUBREG: - fprintf(output, "subexpr "); break; - case XML_REGEXP_STRING: - fprintf(output, "string "); break; - case XML_REGEXP_ANYCHAR: - fprintf(output, "anychar "); break; - case XML_REGEXP_ANYSPACE: - fprintf(output, "anyspace "); break; - case XML_REGEXP_NOTSPACE: - fprintf(output, "notspace "); break; - case XML_REGEXP_INITNAME: - fprintf(output, "initname "); break; - case XML_REGEXP_NOTINITNAME: - fprintf(output, "notinitname "); break; - case XML_REGEXP_NAMECHAR: - fprintf(output, "namechar "); break; - case XML_REGEXP_NOTNAMECHAR: - fprintf(output, "notnamechar "); break; - case XML_REGEXP_DECIMAL: - fprintf(output, "decimal "); break; - case XML_REGEXP_NOTDECIMAL: - fprintf(output, "notdecimal "); break; - case XML_REGEXP_REALCHAR: - fprintf(output, "realchar "); break; - case XML_REGEXP_NOTREALCHAR: - fprintf(output, "notrealchar "); break; - case XML_REGEXP_LETTER: - fprintf(output, "LETTER "); break; - case XML_REGEXP_LETTER_UPPERCASE: - fprintf(output, "LETTER_UPPERCASE "); break; - case XML_REGEXP_LETTER_LOWERCASE: - fprintf(output, "LETTER_LOWERCASE "); break; - case XML_REGEXP_LETTER_TITLECASE: - fprintf(output, "LETTER_TITLECASE "); break; - case XML_REGEXP_LETTER_MODIFIER: - fprintf(output, "LETTER_MODIFIER "); break; - case XML_REGEXP_LETTER_OTHERS: - fprintf(output, "LETTER_OTHERS "); break; - case XML_REGEXP_MARK: - fprintf(output, "MARK "); break; - case XML_REGEXP_MARK_NONSPACING: - fprintf(output, "MARK_NONSPACING "); break; - case XML_REGEXP_MARK_SPACECOMBINING: - fprintf(output, "MARK_SPACECOMBINING "); break; - case XML_REGEXP_MARK_ENCLOSING: - fprintf(output, "MARK_ENCLOSING "); break; - case XML_REGEXP_NUMBER: - fprintf(output, "NUMBER "); break; - case XML_REGEXP_NUMBER_DECIMAL: - fprintf(output, "NUMBER_DECIMAL "); break; - case XML_REGEXP_NUMBER_LETTER: - fprintf(output, "NUMBER_LETTER "); break; - case XML_REGEXP_NUMBER_OTHERS: - fprintf(output, "NUMBER_OTHERS "); break; - case XML_REGEXP_PUNCT: - fprintf(output, "PUNCT "); break; - case XML_REGEXP_PUNCT_CONNECTOR: - fprintf(output, "PUNCT_CONNECTOR "); break; - case XML_REGEXP_PUNCT_DASH: - fprintf(output, "PUNCT_DASH "); break; - case XML_REGEXP_PUNCT_OPEN: - fprintf(output, "PUNCT_OPEN "); break; - case XML_REGEXP_PUNCT_CLOSE: - fprintf(output, "PUNCT_CLOSE "); break; - case XML_REGEXP_PUNCT_INITQUOTE: - fprintf(output, "PUNCT_INITQUOTE "); break; - case XML_REGEXP_PUNCT_FINQUOTE: - fprintf(output, "PUNCT_FINQUOTE "); break; - case XML_REGEXP_PUNCT_OTHERS: - fprintf(output, "PUNCT_OTHERS "); break; - case XML_REGEXP_SEPAR: - fprintf(output, "SEPAR "); break; - case XML_REGEXP_SEPAR_SPACE: - fprintf(output, "SEPAR_SPACE "); break; - case XML_REGEXP_SEPAR_LINE: - fprintf(output, "SEPAR_LINE "); break; - case XML_REGEXP_SEPAR_PARA: - fprintf(output, "SEPAR_PARA "); break; - case XML_REGEXP_SYMBOL: - fprintf(output, "SYMBOL "); break; - case XML_REGEXP_SYMBOL_MATH: - fprintf(output, "SYMBOL_MATH "); break; - case XML_REGEXP_SYMBOL_CURRENCY: - fprintf(output, "SYMBOL_CURRENCY "); break; - case XML_REGEXP_SYMBOL_MODIFIER: - fprintf(output, "SYMBOL_MODIFIER "); break; - case XML_REGEXP_SYMBOL_OTHERS: - fprintf(output, "SYMBOL_OTHERS "); break; - case XML_REGEXP_OTHER: - fprintf(output, "OTHER "); break; - case XML_REGEXP_OTHER_CONTROL: - fprintf(output, "OTHER_CONTROL "); break; - case XML_REGEXP_OTHER_FORMAT: - fprintf(output, "OTHER_FORMAT "); break; - case XML_REGEXP_OTHER_PRIVATE: - fprintf(output, "OTHER_PRIVATE "); break; - case XML_REGEXP_OTHER_NA: - fprintf(output, "OTHER_NA "); break; - case XML_REGEXP_BLOCK_NAME: - fprintf(output, "BLOCK "); break; - } -} - -static void -xmlRegPrintQuantType(FILE *output, xmlRegQuantType type) { - switch (type) { - case XML_REGEXP_QUANT_EPSILON: - fprintf(output, "epsilon "); break; - case XML_REGEXP_QUANT_ONCE: - fprintf(output, "once "); break; - case XML_REGEXP_QUANT_OPT: - fprintf(output, "? "); break; - case XML_REGEXP_QUANT_MULT: - fprintf(output, "* "); break; - case XML_REGEXP_QUANT_PLUS: - fprintf(output, "+ "); break; - case XML_REGEXP_QUANT_RANGE: - fprintf(output, "range "); break; - case XML_REGEXP_QUANT_ONCEONLY: - fprintf(output, "onceonly "); break; - case XML_REGEXP_QUANT_ALL: - fprintf(output, "all "); break; - } -} -static void -xmlRegPrintRange(FILE *output, xmlRegRangePtr range) { - fprintf(output, " range: "); - if (range->neg) - fprintf(output, "negative "); - xmlRegPrintAtomType(output, range->type); - fprintf(output, "%c - %c\n", range->start, range->end); -} - -static void -xmlRegPrintAtom(FILE *output, xmlRegAtomPtr atom) { - fprintf(output, " atom: "); - if (atom == NULL) { - fprintf(output, "NULL\n"); - return; - } - if (atom->neg) - fprintf(output, "not "); - xmlRegPrintAtomType(output, atom->type); - xmlRegPrintQuantType(output, atom->quant); - if (atom->quant == XML_REGEXP_QUANT_RANGE) - fprintf(output, "%d-%d ", atom->min, atom->max); - if (atom->type == XML_REGEXP_STRING) - fprintf(output, "'%s' ", (char *) atom->valuep); - if (atom->type == XML_REGEXP_CHARVAL) - fprintf(output, "char %c\n", atom->codepoint); - else if (atom->type == XML_REGEXP_RANGES) { - int i; - fprintf(output, "%d entries\n", atom->nbRanges); - for (i = 0; i < atom->nbRanges;i++) - xmlRegPrintRange(output, atom->ranges[i]); - } else if (atom->type == XML_REGEXP_SUBREG) { - fprintf(output, "start %d end %d\n", atom->start->no, atom->stop->no); - } else { - fprintf(output, "\n"); - } -} - -static void -xmlRegPrintTrans(FILE *output, xmlRegTransPtr trans) { - fprintf(output, " trans: "); - if (trans == NULL) { - fprintf(output, "NULL\n"); - return; - } - if (trans->to < 0) { - fprintf(output, "removed\n"); - return; - } - if (trans->nd != 0) { - if (trans->nd == 2) - fprintf(output, "last not determinist, "); - else - fprintf(output, "not determinist, "); - } - if (trans->counter >= 0) { - fprintf(output, "counted %d, ", trans->counter); - } - if (trans->count == REGEXP_ALL_COUNTER) { - fprintf(output, "all transition, "); - } else if (trans->count >= 0) { - fprintf(output, "count based %d, ", trans->count); - } - if (trans->atom == NULL) { - fprintf(output, "epsilon to %d\n", trans->to); - return; - } - if (trans->atom->type == XML_REGEXP_CHARVAL) - fprintf(output, "char %c ", trans->atom->codepoint); - fprintf(output, "atom %d, to %d\n", trans->atom->no, trans->to); -} - -static void -xmlRegPrintState(FILE *output, xmlRegStatePtr state) { - int i; - - fprintf(output, " state: "); - if (state == NULL) { - fprintf(output, "NULL\n"); - return; - } - if (state->type == XML_REGEXP_START_STATE) - fprintf(output, "START "); - if (state->type == XML_REGEXP_FINAL_STATE) - fprintf(output, "FINAL "); - - fprintf(output, "%d, %d transitions:\n", state->no, state->nbTrans); - for (i = 0;i < state->nbTrans; i++) { - xmlRegPrintTrans(output, &(state->trans[i])); - } -} - -#ifdef DEBUG_REGEXP_GRAPH -static void -xmlRegPrintCtxt(FILE *output, xmlRegParserCtxtPtr ctxt) { - int i; - - fprintf(output, " ctxt: "); - if (ctxt == NULL) { - fprintf(output, "NULL\n"); - return; - } - fprintf(output, "'%s' ", ctxt->string); - if (ctxt->error) - fprintf(output, "error "); - if (ctxt->neg) - fprintf(output, "neg "); - fprintf(output, "\n"); - fprintf(output, "%d atoms:\n", ctxt->nbAtoms); - for (i = 0;i < ctxt->nbAtoms; i++) { - fprintf(output, " %02d ", i); - xmlRegPrintAtom(output, ctxt->atoms[i]); - } - if (ctxt->atom != NULL) { - fprintf(output, "current atom:\n"); - xmlRegPrintAtom(output, ctxt->atom); - } - fprintf(output, "%d states:", ctxt->nbStates); - if (ctxt->start != NULL) - fprintf(output, " start: %d", ctxt->start->no); - if (ctxt->end != NULL) - fprintf(output, " end: %d", ctxt->end->no); - fprintf(output, "\n"); - for (i = 0;i < ctxt->nbStates; i++) { - xmlRegPrintState(output, ctxt->states[i]); - } - fprintf(output, "%d counters:\n", ctxt->nbCounters); - for (i = 0;i < ctxt->nbCounters; i++) { - fprintf(output, " %d: min %d max %d\n", i, ctxt->counters[i].min, - ctxt->counters[i].max); - } -} -#endif - -/************************************************************************ - * * - * Finite Automata structures manipulations * - * * - ************************************************************************/ - -static void -xmlRegAtomAddRange(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom, - int neg, xmlRegAtomType type, int start, int end, - xmlChar *blockName) { - xmlRegRangePtr range; - - if (atom == NULL) { - ERROR("add range: atom is NULL"); - return; - } - if (atom->type != XML_REGEXP_RANGES) { - ERROR("add range: atom is not ranges"); - return; - } - if (atom->maxRanges == 0) { - atom->maxRanges = 4; - atom->ranges = (xmlRegRangePtr *) xmlMalloc(atom->maxRanges * - sizeof(xmlRegRangePtr)); - if (atom->ranges == NULL) { - xmlRegexpErrMemory(ctxt, "adding ranges"); - atom->maxRanges = 0; - return; - } - } else if (atom->nbRanges >= atom->maxRanges) { - xmlRegRangePtr *tmp; - atom->maxRanges *= 2; - tmp = (xmlRegRangePtr *) xmlRealloc(atom->ranges, atom->maxRanges * - sizeof(xmlRegRangePtr)); - if (tmp == NULL) { - xmlRegexpErrMemory(ctxt, "adding ranges"); - atom->maxRanges /= 2; - return; - } - atom->ranges = tmp; - } - range = xmlRegNewRange(ctxt, neg, type, start, end); - if (range == NULL) - return; - range->blockName = blockName; - atom->ranges[atom->nbRanges++] = range; - -} - -static int -xmlRegGetCounter(xmlRegParserCtxtPtr ctxt) { - if (ctxt->maxCounters == 0) { - ctxt->maxCounters = 4; - ctxt->counters = (xmlRegCounter *) xmlMalloc(ctxt->maxCounters * - sizeof(xmlRegCounter)); - if (ctxt->counters == NULL) { - xmlRegexpErrMemory(ctxt, "allocating counter"); - ctxt->maxCounters = 0; - return(-1); - } - } else if (ctxt->nbCounters >= ctxt->maxCounters) { - xmlRegCounter *tmp; - ctxt->maxCounters *= 2; - tmp = (xmlRegCounter *) xmlRealloc(ctxt->counters, ctxt->maxCounters * - sizeof(xmlRegCounter)); - if (tmp == NULL) { - xmlRegexpErrMemory(ctxt, "allocating counter"); - ctxt->maxCounters /= 2; - return(-1); - } - ctxt->counters = tmp; - } - ctxt->counters[ctxt->nbCounters].min = -1; - ctxt->counters[ctxt->nbCounters].max = -1; - return(ctxt->nbCounters++); -} - -static int -xmlRegAtomPush(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { - if (atom == NULL) { - ERROR("atom push: atom is NULL"); - return(-1); - } - if (ctxt->maxAtoms == 0) { - ctxt->maxAtoms = 4; - ctxt->atoms = (xmlRegAtomPtr *) xmlMalloc(ctxt->maxAtoms * - sizeof(xmlRegAtomPtr)); - if (ctxt->atoms == NULL) { - xmlRegexpErrMemory(ctxt, "pushing atom"); - ctxt->maxAtoms = 0; - return(-1); - } - } else if (ctxt->nbAtoms >= ctxt->maxAtoms) { - xmlRegAtomPtr *tmp; - ctxt->maxAtoms *= 2; - tmp = (xmlRegAtomPtr *) xmlRealloc(ctxt->atoms, ctxt->maxAtoms * - sizeof(xmlRegAtomPtr)); - if (tmp == NULL) { - xmlRegexpErrMemory(ctxt, "allocating counter"); - ctxt->maxAtoms /= 2; - return(-1); - } - ctxt->atoms = tmp; - } - atom->no = ctxt->nbAtoms; - ctxt->atoms[ctxt->nbAtoms++] = atom; - return(0); -} - -static void -xmlRegStateAddTransTo(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr target, - int from) { - if (target->maxTransTo == 0) { - target->maxTransTo = 8; - target->transTo = (int *) xmlMalloc(target->maxTransTo * - sizeof(int)); - if (target->transTo == NULL) { - xmlRegexpErrMemory(ctxt, "adding transition"); - target->maxTransTo = 0; - return; - } - } else if (target->nbTransTo >= target->maxTransTo) { - int *tmp; - target->maxTransTo *= 2; - tmp = (int *) xmlRealloc(target->transTo, target->maxTransTo * - sizeof(int)); - if (tmp == NULL) { - xmlRegexpErrMemory(ctxt, "adding transition"); - target->maxTransTo /= 2; - return; - } - target->transTo = tmp; - } - target->transTo[target->nbTransTo] = from; - target->nbTransTo++; -} - -static void -xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, - xmlRegAtomPtr atom, xmlRegStatePtr target, - int counter, int count) { - - int nrtrans; - - if (state == NULL) { - ERROR("add state: state is NULL"); - return; - } - if (target == NULL) { - ERROR("add state: target is NULL"); - return; - } - /* - * Other routines follow the philosophy 'When in doubt, add a transition' - * so we check here whether such a transition is already present and, if - * so, silently ignore this request. - */ - - for (nrtrans = state->nbTrans - 1; nrtrans >= 0; nrtrans--) { - xmlRegTransPtr trans = &(state->trans[nrtrans]); - if ((trans->atom == atom) && - (trans->to == target->no) && - (trans->counter == counter) && - (trans->count == count)) { -#ifdef DEBUG_REGEXP_GRAPH - printf("Ignoring duplicate transition from %d to %d\n", - state->no, target->no); -#endif - return; - } - } - - if (state->maxTrans == 0) { - state->maxTrans = 8; - state->trans = (xmlRegTrans *) xmlMalloc(state->maxTrans * - sizeof(xmlRegTrans)); - if (state->trans == NULL) { - xmlRegexpErrMemory(ctxt, "adding transition"); - state->maxTrans = 0; - return; - } - } else if (state->nbTrans >= state->maxTrans) { - xmlRegTrans *tmp; - state->maxTrans *= 2; - tmp = (xmlRegTrans *) xmlRealloc(state->trans, state->maxTrans * - sizeof(xmlRegTrans)); - if (tmp == NULL) { - xmlRegexpErrMemory(ctxt, "adding transition"); - state->maxTrans /= 2; - return; - } - state->trans = tmp; - } -#ifdef DEBUG_REGEXP_GRAPH - printf("Add trans from %d to %d ", state->no, target->no); - if (count == REGEXP_ALL_COUNTER) - printf("all transition\n"); - else if (count >= 0) - printf("count based %d\n", count); - else if (counter >= 0) - printf("counted %d\n", counter); - else if (atom == NULL) - printf("epsilon transition\n"); - else if (atom != NULL) - xmlRegPrintAtom(stdout, atom); -#endif - - state->trans[state->nbTrans].atom = atom; - state->trans[state->nbTrans].to = target->no; - state->trans[state->nbTrans].counter = counter; - state->trans[state->nbTrans].count = count; - state->trans[state->nbTrans].nd = 0; - state->nbTrans++; - xmlRegStateAddTransTo(ctxt, target, state->no); -} - -static int -xmlRegStatePush(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state) { - if (state == NULL) return(-1); - if (ctxt->maxStates == 0) { - ctxt->maxStates = 4; - ctxt->states = (xmlRegStatePtr *) xmlMalloc(ctxt->maxStates * - sizeof(xmlRegStatePtr)); - if (ctxt->states == NULL) { - xmlRegexpErrMemory(ctxt, "adding state"); - ctxt->maxStates = 0; - return(-1); - } - } else if (ctxt->nbStates >= ctxt->maxStates) { - xmlRegStatePtr *tmp; - ctxt->maxStates *= 2; - tmp = (xmlRegStatePtr *) xmlRealloc(ctxt->states, ctxt->maxStates * - sizeof(xmlRegStatePtr)); - if (tmp == NULL) { - xmlRegexpErrMemory(ctxt, "adding state"); - ctxt->maxStates /= 2; - return(-1); - } - ctxt->states = tmp; - } - state->no = ctxt->nbStates; - ctxt->states[ctxt->nbStates++] = state; - return(0); -} - -/** - * xmlFAGenerateAllTransition: - * @ctxt: a regexp parser context - * @from: the from state - * @to: the target state or NULL for building a new one - * @lax: - * - */ -static void -xmlFAGenerateAllTransition(xmlRegParserCtxtPtr ctxt, - xmlRegStatePtr from, xmlRegStatePtr to, - int lax) { - if (to == NULL) { - to = xmlRegNewState(ctxt); - xmlRegStatePush(ctxt, to); - ctxt->state = to; - } - if (lax) - xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_LAX_COUNTER); - else - xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_COUNTER); -} - -/** - * xmlFAGenerateEpsilonTransition: - * @ctxt: a regexp parser context - * @from: the from state - * @to: the target state or NULL for building a new one - * - */ -static void -xmlFAGenerateEpsilonTransition(xmlRegParserCtxtPtr ctxt, - xmlRegStatePtr from, xmlRegStatePtr to) { - if (to == NULL) { - to = xmlRegNewState(ctxt); - xmlRegStatePush(ctxt, to); - ctxt->state = to; - } - xmlRegStateAddTrans(ctxt, from, NULL, to, -1, -1); -} - -/** - * xmlFAGenerateCountedEpsilonTransition: - * @ctxt: a regexp parser context - * @from: the from state - * @to: the target state or NULL for building a new one - * counter: the counter for that transition - * - */ -static void -xmlFAGenerateCountedEpsilonTransition(xmlRegParserCtxtPtr ctxt, - xmlRegStatePtr from, xmlRegStatePtr to, int counter) { - if (to == NULL) { - to = xmlRegNewState(ctxt); - xmlRegStatePush(ctxt, to); - ctxt->state = to; - } - xmlRegStateAddTrans(ctxt, from, NULL, to, counter, -1); -} - -/** - * xmlFAGenerateCountedTransition: - * @ctxt: a regexp parser context - * @from: the from state - * @to: the target state or NULL for building a new one - * counter: the counter for that transition - * - */ -static void -xmlFAGenerateCountedTransition(xmlRegParserCtxtPtr ctxt, - xmlRegStatePtr from, xmlRegStatePtr to, int counter) { - if (to == NULL) { - to = xmlRegNewState(ctxt); - xmlRegStatePush(ctxt, to); - ctxt->state = to; - } - xmlRegStateAddTrans(ctxt, from, NULL, to, -1, counter); -} - -/** - * xmlFAGenerateTransitions: - * @ctxt: a regexp parser context - * @from: the from state - * @to: the target state or NULL for building a new one - * @atom: the atom generating the transition - * - * Returns 0 if success and -1 in case of error. - */ -static int -xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, - xmlRegStatePtr to, xmlRegAtomPtr atom) { - if (atom == NULL) { - ERROR("genrate transition: atom == NULL"); - return(-1); - } - if (atom->type == XML_REGEXP_SUBREG) { - /* - * this is a subexpression handling one should not need to - * create a new node except for XML_REGEXP_QUANT_RANGE. - */ - if (xmlRegAtomPush(ctxt, atom) < 0) { - return(-1); - } - if ((to != NULL) && (atom->stop != to) && - (atom->quant != XML_REGEXP_QUANT_RANGE)) { - /* - * Generate an epsilon transition to link to the target - */ - xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); -#ifdef DV - } else if ((to == NULL) && (atom->quant != XML_REGEXP_QUANT_RANGE) && - (atom->quant != XML_REGEXP_QUANT_ONCE)) { - to = xmlRegNewState(ctxt); - xmlRegStatePush(ctxt, to); - ctxt->state = to; - xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); -#endif - } - switch (atom->quant) { - case XML_REGEXP_QUANT_OPT: - atom->quant = XML_REGEXP_QUANT_ONCE; - /* - * transition done to the state after end of atom. - * 1. set transition from atom start to new state - * 2. set transition from atom end to this state. - */ - xmlFAGenerateEpsilonTransition(ctxt, atom->start, 0); - xmlFAGenerateEpsilonTransition(ctxt, atom->stop, ctxt->state); - break; - case XML_REGEXP_QUANT_MULT: - atom->quant = XML_REGEXP_QUANT_ONCE; - xmlFAGenerateEpsilonTransition(ctxt, atom->start, atom->stop); - xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); - break; - case XML_REGEXP_QUANT_PLUS: - atom->quant = XML_REGEXP_QUANT_ONCE; - xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); - break; - case XML_REGEXP_QUANT_RANGE: { - int counter; - xmlRegStatePtr newstate; - - /* - * This one is nasty: - * 1/ if range has minOccurs == 0, create a new state - * and create epsilon transitions from atom->start - * to atom->stop, as well as atom->start to the new - * state - * 2/ register a new counter - * 3/ register an epsilon transition associated to - * this counter going from atom->stop to atom->start - * 4/ create a new state - * 5/ generate a counted transition from atom->stop to - * that state - */ - if (atom->min == 0) { - xmlFAGenerateEpsilonTransition(ctxt, atom->start, - atom->stop); - newstate = xmlRegNewState(ctxt); - xmlRegStatePush(ctxt, newstate); - ctxt->state = newstate; - xmlFAGenerateEpsilonTransition(ctxt, atom->start, - newstate); - } - counter = xmlRegGetCounter(ctxt); - ctxt->counters[counter].min = atom->min - 1; - ctxt->counters[counter].max = atom->max - 1; - atom->min = 0; - atom->max = 0; - atom->quant = XML_REGEXP_QUANT_ONCE; - if (to != NULL) { - newstate = to; - } else { - newstate = xmlRegNewState(ctxt); - xmlRegStatePush(ctxt, newstate); - } - ctxt->state = newstate; - xmlFAGenerateCountedTransition(ctxt, atom->stop, - newstate, counter); - - /* - * first check count and if OK jump forward; - * if checking fail increment count and jump back - */ - xmlFAGenerateCountedEpsilonTransition(ctxt, atom->stop, - atom->start, counter); - } - default: - break; - } - return(0); - } - if ((atom->min == 0) && (atom->max == 0) && - (atom->quant == XML_REGEXP_QUANT_RANGE)) { - /* - * we can discard the atom and generate an epsilon transition instead - */ - if (to == NULL) { - to = xmlRegNewState(ctxt); - if (to != NULL) - xmlRegStatePush(ctxt, to); - else { - return(-1); - } - } - xmlFAGenerateEpsilonTransition(ctxt, from, to); - ctxt->state = to; - xmlRegFreeAtom(atom); - return(0); - } - if (to == NULL) { - to = xmlRegNewState(ctxt); - if (to != NULL) - xmlRegStatePush(ctxt, to); - else { - return(-1); - } - } - if (xmlRegAtomPush(ctxt, atom) < 0) { - return(-1); - } - xmlRegStateAddTrans(ctxt, from, atom, to, -1, -1); - ctxt->state = to; - switch (atom->quant) { - case XML_REGEXP_QUANT_OPT: - atom->quant = XML_REGEXP_QUANT_ONCE; - xmlFAGenerateEpsilonTransition(ctxt, from, to); - break; - case XML_REGEXP_QUANT_MULT: - atom->quant = XML_REGEXP_QUANT_ONCE; - xmlFAGenerateEpsilonTransition(ctxt, from, to); - xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); - break; - case XML_REGEXP_QUANT_PLUS: - atom->quant = XML_REGEXP_QUANT_ONCE; - xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); - break; - default: - break; - } - return(0); -} - -/** - * xmlFAReduceEpsilonTransitions: - * @ctxt: a regexp parser context - * @fromnr: the from state - * @tonr: the to state - * @counter: should that transition be associated to a counted - * - */ -static void -xmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, - int tonr, int counter) { - int transnr; - xmlRegStatePtr from; - xmlRegStatePtr to; - -#ifdef DEBUG_REGEXP_GRAPH - printf("xmlFAReduceEpsilonTransitions(%d, %d)\n", fromnr, tonr); -#endif - from = ctxt->states[fromnr]; - if (from == NULL) - return; - to = ctxt->states[tonr]; - if (to == NULL) - return; - if ((to->mark == XML_REGEXP_MARK_START) || - (to->mark == XML_REGEXP_MARK_VISITED)) - return; - - to->mark = XML_REGEXP_MARK_VISITED; - if (to->type == XML_REGEXP_FINAL_STATE) { -#ifdef DEBUG_REGEXP_GRAPH - printf("State %d is final, so %d becomes final\n", tonr, fromnr); -#endif - from->type = XML_REGEXP_FINAL_STATE; - } - for (transnr = 0;transnr < to->nbTrans;transnr++) { - if (to->trans[transnr].to < 0) - continue; - if (to->trans[transnr].atom == NULL) { - /* - * Don't remove counted transitions - * Don't loop either - */ - if (to->trans[transnr].to != fromnr) { - if (to->trans[transnr].count >= 0) { - int newto = to->trans[transnr].to; - - xmlRegStateAddTrans(ctxt, from, NULL, - ctxt->states[newto], - -1, to->trans[transnr].count); - } else { -#ifdef DEBUG_REGEXP_GRAPH - printf("Found epsilon trans %d from %d to %d\n", - transnr, tonr, to->trans[transnr].to); -#endif - if (to->trans[transnr].counter >= 0) { - xmlFAReduceEpsilonTransitions(ctxt, fromnr, - to->trans[transnr].to, - to->trans[transnr].counter); - } else { - xmlFAReduceEpsilonTransitions(ctxt, fromnr, - to->trans[transnr].to, - counter); - } - } - } - } else { - int newto = to->trans[transnr].to; - - if (to->trans[transnr].counter >= 0) { - xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, - ctxt->states[newto], - to->trans[transnr].counter, -1); - } else { - xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, - ctxt->states[newto], counter, -1); - } - } - } - to->mark = XML_REGEXP_MARK_NORMAL; -} - -/** - * xmlFAEliminateSimpleEpsilonTransitions: - * @ctxt: a regexp parser context - * - * Eliminating general epsilon transitions can get costly in the general - * algorithm due to the large amount of generated new transitions and - * associated comparisons. However for simple epsilon transition used just - * to separate building blocks when generating the automata this can be - * reduced to state elimination: - * - if there exists an epsilon from X to Y - * - if there is no other transition from X - * then X and Y are semantically equivalent and X can be eliminated - * If X is the start state then make Y the start state, else replace the - * target of all transitions to X by transitions to Y. - */ -static void -xmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { - int statenr, i, j, newto; - xmlRegStatePtr state, tmp; - - for (statenr = 0;statenr < ctxt->nbStates;statenr++) { - state = ctxt->states[statenr]; - if (state == NULL) - continue; - if (state->nbTrans != 1) - continue; - /* is the only transition out a basic transition */ - if ((state->trans[0].atom == NULL) && - (state->trans[0].to >= 0) && - (state->trans[0].to != statenr) && - (state->trans[0].counter < 0) && - (state->trans[0].count < 0)) { - newto = state->trans[0].to; - - if (state->type == XML_REGEXP_START_STATE) { -#ifdef DEBUG_REGEXP_GRAPH - printf("Found simple epsilon trans from start %d to %d\n", - statenr, newto); -#endif - } else { -#ifdef DEBUG_REGEXP_GRAPH - printf("Found simple epsilon trans from %d to %d\n", - statenr, newto); -#endif - for (i = 0;i < state->nbTransTo;i++) { - tmp = ctxt->states[state->transTo[i]]; - for (j = 0;j < tmp->nbTrans;j++) { - if (tmp->trans[j].to == statenr) { - tmp->trans[j].to = newto; -#ifdef DEBUG_REGEXP_GRAPH - printf("Changed transition %d on %d to go to %d\n", - j, tmp->no, newto); -#endif - xmlRegStateAddTransTo(ctxt, ctxt->states[newto], - tmp->no); - } - } - } -#if 0 - for (i = 0;i < ctxt->nbStates;i++) { - tmp = ctxt->states[i]; - for (j = 0;j < tmp->nbTrans;j++) { - if (tmp->trans[j].to == statenr) { - tmp->trans[j].to = newto; -#ifdef DEBUG_REGEXP_GRAPH - printf("Changed transition %d on %d to go to %d\n", - j, tmp->no, newto); -#endif - } - } - } -#endif - if (state->type == XML_REGEXP_FINAL_STATE) - ctxt->states[newto]->type = XML_REGEXP_FINAL_STATE; - /* eliminate the transition completely */ - state->nbTrans = 0; - - - } - - } - } -} -/** - * xmlFAEliminateEpsilonTransitions: - * @ctxt: a regexp parser context - * - */ -static void -xmlFAEliminateEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { - int statenr, transnr; - xmlRegStatePtr state; - int has_epsilon; - - if (ctxt->states == NULL) return; - - xmlFAEliminateSimpleEpsilonTransitions(ctxt); - - has_epsilon = 0; - - /* - * build the completed transitions bypassing the epsilons - * Use a marking algorithm to avoid loops - * mark sink states too. - */ - for (statenr = 0;statenr < ctxt->nbStates;statenr++) { - state = ctxt->states[statenr]; - if (state == NULL) - continue; - if ((state->nbTrans == 0) && - (state->type != XML_REGEXP_FINAL_STATE)) { - state->type = XML_REGEXP_SINK_STATE; - } - for (transnr = 0;transnr < state->nbTrans;transnr++) { - if ((state->trans[transnr].atom == NULL) && - (state->trans[transnr].to >= 0)) { - if (state->trans[transnr].to == statenr) { - state->trans[transnr].to = -1; -#ifdef DEBUG_REGEXP_GRAPH - printf("Removed loopback epsilon trans %d on %d\n", - transnr, statenr); -#endif - } else if (state->trans[transnr].count < 0) { - int newto = state->trans[transnr].to; - -#ifdef DEBUG_REGEXP_GRAPH - printf("Found epsilon trans %d from %d to %d\n", - transnr, statenr, newto); -#endif - state->mark = XML_REGEXP_MARK_START; - has_epsilon = 1; - xmlFAReduceEpsilonTransitions(ctxt, statenr, - newto, state->trans[transnr].counter); - state->mark = XML_REGEXP_MARK_NORMAL; -#ifdef DEBUG_REGEXP_GRAPH - } else { - printf("Found counted transition %d on %d\n", - transnr, statenr); -#endif - } - } - } - } - /* - * Eliminate the epsilon transitions - */ - if (has_epsilon) { - for (statenr = 0;statenr < ctxt->nbStates;statenr++) { - state = ctxt->states[statenr]; - if (state == NULL) - continue; - for (transnr = 0;transnr < state->nbTrans;transnr++) { - xmlRegTransPtr trans = &(state->trans[transnr]); - if ((trans->atom == NULL) && - (trans->count < 0) && - (trans->to >= 0)) { - trans->to = -1; - } - } - } - } - - /* - * Use this pass to detect unreachable states too - */ - for (statenr = 0;statenr < ctxt->nbStates;statenr++) { - state = ctxt->states[statenr]; - if (state != NULL) - state->reached = XML_REGEXP_MARK_NORMAL; - } - state = ctxt->states[0]; - if (state != NULL) - state->reached = XML_REGEXP_MARK_START; - while (state != NULL) { - xmlRegStatePtr target = NULL; - state->reached = XML_REGEXP_MARK_VISITED; - /* - * Mark all states reachable from the current reachable state - */ - for (transnr = 0;transnr < state->nbTrans;transnr++) { - if ((state->trans[transnr].to >= 0) && - ((state->trans[transnr].atom != NULL) || - (state->trans[transnr].count >= 0))) { - int newto = state->trans[transnr].to; - - if (ctxt->states[newto] == NULL) - continue; - if (ctxt->states[newto]->reached == XML_REGEXP_MARK_NORMAL) { - ctxt->states[newto]->reached = XML_REGEXP_MARK_START; - target = ctxt->states[newto]; - } - } - } - - /* - * find the next accessible state not explored - */ - if (target == NULL) { - for (statenr = 1;statenr < ctxt->nbStates;statenr++) { - state = ctxt->states[statenr]; - if ((state != NULL) && (state->reached == - XML_REGEXP_MARK_START)) { - target = state; - break; - } - } - } - state = target; - } - for (statenr = 0;statenr < ctxt->nbStates;statenr++) { - state = ctxt->states[statenr]; - if ((state != NULL) && (state->reached == XML_REGEXP_MARK_NORMAL)) { -#ifdef DEBUG_REGEXP_GRAPH - printf("Removed unreachable state %d\n", statenr); -#endif - xmlRegFreeState(state); - ctxt->states[statenr] = NULL; - } - } - -} - -static int -xmlFACompareRanges(xmlRegRangePtr range1, xmlRegRangePtr range2) { - int ret = 0; - - if ((range1->type == XML_REGEXP_RANGES) || - (range2->type == XML_REGEXP_RANGES) || - (range2->type == XML_REGEXP_SUBREG) || - (range1->type == XML_REGEXP_SUBREG) || - (range1->type == XML_REGEXP_STRING) || - (range2->type == XML_REGEXP_STRING)) - return(-1); - - /* put them in order */ - if (range1->type > range2->type) { - xmlRegRangePtr tmp; - - tmp = range1; - range1 = range2; - range2 = tmp; - } - if ((range1->type == XML_REGEXP_ANYCHAR) || - (range2->type == XML_REGEXP_ANYCHAR)) { - ret = 1; - } else if ((range1->type == XML_REGEXP_EPSILON) || - (range2->type == XML_REGEXP_EPSILON)) { - return(0); - } else if (range1->type == range2->type) { - if ((range1->type != XML_REGEXP_CHARVAL) || - (range1->end < range2->start) || - (range2->end < range1->start)) - ret = 1; - else - ret = 0; - } else if (range1->type == XML_REGEXP_CHARVAL) { - int codepoint; - int neg = 0; - - /* - * just check all codepoints in the range for acceptance, - * this is usually way cheaper since done only once at - * compilation than testing over and over at runtime or - * pushing too many states when evaluating. - */ - if (((range1->neg == 0) && (range2->neg != 0)) || - ((range1->neg != 0) && (range2->neg == 0))) - neg = 1; - - for (codepoint = range1->start;codepoint <= range1->end ;codepoint++) { - ret = xmlRegCheckCharacterRange(range2->type, codepoint, - 0, range2->start, range2->end, - range2->blockName); - if (ret < 0) - return(-1); - if (((neg == 1) && (ret == 0)) || - ((neg == 0) && (ret == 1))) - return(1); - } - return(0); - } else if ((range1->type == XML_REGEXP_BLOCK_NAME) || - (range2->type == XML_REGEXP_BLOCK_NAME)) { - if (range1->type == range2->type) { - ret = xmlStrEqual(range1->blockName, range2->blockName); - } else { - /* - * comparing a block range with anything else is way - * too costly, and maintaining the table is like too much - * memory too, so let's force the automata to save state - * here. - */ - return(1); - } - } else if ((range1->type < XML_REGEXP_LETTER) || - (range2->type < XML_REGEXP_LETTER)) { - if ((range1->type == XML_REGEXP_ANYSPACE) && - (range2->type == XML_REGEXP_NOTSPACE)) - ret = 0; - else if ((range1->type == XML_REGEXP_INITNAME) && - (range2->type == XML_REGEXP_NOTINITNAME)) - ret = 0; - else if ((range1->type == XML_REGEXP_NAMECHAR) && - (range2->type == XML_REGEXP_NOTNAMECHAR)) - ret = 0; - else if ((range1->type == XML_REGEXP_DECIMAL) && - (range2->type == XML_REGEXP_NOTDECIMAL)) - ret = 0; - else if ((range1->type == XML_REGEXP_REALCHAR) && - (range2->type == XML_REGEXP_NOTREALCHAR)) - ret = 0; - else { - /* same thing to limit complexity */ - return(1); - } - } else { - ret = 0; - /* range1->type < range2->type here */ - switch (range1->type) { - case XML_REGEXP_LETTER: - /* all disjoint except in the subgroups */ - if ((range2->type == XML_REGEXP_LETTER_UPPERCASE) || - (range2->type == XML_REGEXP_LETTER_LOWERCASE) || - (range2->type == XML_REGEXP_LETTER_TITLECASE) || - (range2->type == XML_REGEXP_LETTER_MODIFIER) || - (range2->type == XML_REGEXP_LETTER_OTHERS)) - ret = 1; - break; - case XML_REGEXP_MARK: - if ((range2->type == XML_REGEXP_MARK_NONSPACING) || - (range2->type == XML_REGEXP_MARK_SPACECOMBINING) || - (range2->type == XML_REGEXP_MARK_ENCLOSING)) - ret = 1; - break; - case XML_REGEXP_NUMBER: - if ((range2->type == XML_REGEXP_NUMBER_DECIMAL) || - (range2->type == XML_REGEXP_NUMBER_LETTER) || - (range2->type == XML_REGEXP_NUMBER_OTHERS)) - ret = 1; - break; - case XML_REGEXP_PUNCT: - if ((range2->type == XML_REGEXP_PUNCT_CONNECTOR) || - (range2->type == XML_REGEXP_PUNCT_DASH) || - (range2->type == XML_REGEXP_PUNCT_OPEN) || - (range2->type == XML_REGEXP_PUNCT_CLOSE) || - (range2->type == XML_REGEXP_PUNCT_INITQUOTE) || - (range2->type == XML_REGEXP_PUNCT_FINQUOTE) || - (range2->type == XML_REGEXP_PUNCT_OTHERS)) - ret = 1; - break; - case XML_REGEXP_SEPAR: - if ((range2->type == XML_REGEXP_SEPAR_SPACE) || - (range2->type == XML_REGEXP_SEPAR_LINE) || - (range2->type == XML_REGEXP_SEPAR_PARA)) - ret = 1; - break; - case XML_REGEXP_SYMBOL: - if ((range2->type == XML_REGEXP_SYMBOL_MATH) || - (range2->type == XML_REGEXP_SYMBOL_CURRENCY) || - (range2->type == XML_REGEXP_SYMBOL_MODIFIER) || - (range2->type == XML_REGEXP_SYMBOL_OTHERS)) - ret = 1; - break; - case XML_REGEXP_OTHER: - if ((range2->type == XML_REGEXP_OTHER_CONTROL) || - (range2->type == XML_REGEXP_OTHER_FORMAT) || - (range2->type == XML_REGEXP_OTHER_PRIVATE)) - ret = 1; - break; - default: - if ((range2->type >= XML_REGEXP_LETTER) && - (range2->type < XML_REGEXP_BLOCK_NAME)) - ret = 0; - else { - /* safety net ! */ - return(1); - } - } - } - if (((range1->neg == 0) && (range2->neg != 0)) || - ((range1->neg != 0) && (range2->neg == 0))) - ret = !ret; - return(1); -} - -/** - * xmlFACompareAtomTypes: - * @type1: an atom type - * @type2: an atom type - * - * Compares two atoms type to check whether they intersect in some ways, - * this is used by xmlFACompareAtoms only - * - * Returns 1 if they may intersect and 0 otherwise - */ -static int -xmlFACompareAtomTypes(xmlRegAtomType type1, xmlRegAtomType type2) { - if ((type1 == XML_REGEXP_EPSILON) || - (type1 == XML_REGEXP_CHARVAL) || - (type1 == XML_REGEXP_RANGES) || - (type1 == XML_REGEXP_SUBREG) || - (type1 == XML_REGEXP_STRING) || - (type1 == XML_REGEXP_ANYCHAR)) - return(1); - if ((type2 == XML_REGEXP_EPSILON) || - (type2 == XML_REGEXP_CHARVAL) || - (type2 == XML_REGEXP_RANGES) || - (type2 == XML_REGEXP_SUBREG) || - (type2 == XML_REGEXP_STRING) || - (type2 == XML_REGEXP_ANYCHAR)) - return(1); - - if (type1 == type2) return(1); - - /* simplify subsequent compares by making sure type1 < type2 */ - if (type1 > type2) { - xmlRegAtomType tmp = type1; - type1 = type2; - type2 = tmp; - } - switch (type1) { - case XML_REGEXP_ANYSPACE: /* \s */ - /* can't be a letter, number, mark, pontuation, symbol */ - if ((type2 == XML_REGEXP_NOTSPACE) || - ((type2 >= XML_REGEXP_LETTER) && - (type2 <= XML_REGEXP_LETTER_OTHERS)) || - ((type2 >= XML_REGEXP_NUMBER) && - (type2 <= XML_REGEXP_NUMBER_OTHERS)) || - ((type2 >= XML_REGEXP_MARK) && - (type2 <= XML_REGEXP_MARK_ENCLOSING)) || - ((type2 >= XML_REGEXP_PUNCT) && - (type2 <= XML_REGEXP_PUNCT_OTHERS)) || - ((type2 >= XML_REGEXP_SYMBOL) && - (type2 <= XML_REGEXP_SYMBOL_OTHERS)) - ) return(0); - break; - case XML_REGEXP_NOTSPACE: /* \S */ - break; - case XML_REGEXP_INITNAME: /* \l */ - /* can't be a number, mark, separator, pontuation, symbol or other */ - if ((type2 == XML_REGEXP_NOTINITNAME) || - ((type2 >= XML_REGEXP_NUMBER) && - (type2 <= XML_REGEXP_NUMBER_OTHERS)) || - ((type2 >= XML_REGEXP_MARK) && - (type2 <= XML_REGEXP_MARK_ENCLOSING)) || - ((type2 >= XML_REGEXP_SEPAR) && - (type2 <= XML_REGEXP_SEPAR_PARA)) || - ((type2 >= XML_REGEXP_PUNCT) && - (type2 <= XML_REGEXP_PUNCT_OTHERS)) || - ((type2 >= XML_REGEXP_SYMBOL) && - (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || - ((type2 >= XML_REGEXP_OTHER) && - (type2 <= XML_REGEXP_OTHER_NA)) - ) return(0); - break; - case XML_REGEXP_NOTINITNAME: /* \L */ - break; - case XML_REGEXP_NAMECHAR: /* \c */ - /* can't be a mark, separator, pontuation, symbol or other */ - if ((type2 == XML_REGEXP_NOTNAMECHAR) || - ((type2 >= XML_REGEXP_MARK) && - (type2 <= XML_REGEXP_MARK_ENCLOSING)) || - ((type2 >= XML_REGEXP_PUNCT) && - (type2 <= XML_REGEXP_PUNCT_OTHERS)) || - ((type2 >= XML_REGEXP_SEPAR) && - (type2 <= XML_REGEXP_SEPAR_PARA)) || - ((type2 >= XML_REGEXP_SYMBOL) && - (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || - ((type2 >= XML_REGEXP_OTHER) && - (type2 <= XML_REGEXP_OTHER_NA)) - ) return(0); - break; - case XML_REGEXP_NOTNAMECHAR: /* \C */ - break; - case XML_REGEXP_DECIMAL: /* \d */ - /* can't be a letter, mark, separator, pontuation, symbol or other */ - if ((type2 == XML_REGEXP_NOTDECIMAL) || - (type2 == XML_REGEXP_REALCHAR) || - ((type2 >= XML_REGEXP_LETTER) && - (type2 <= XML_REGEXP_LETTER_OTHERS)) || - ((type2 >= XML_REGEXP_MARK) && - (type2 <= XML_REGEXP_MARK_ENCLOSING)) || - ((type2 >= XML_REGEXP_PUNCT) && - (type2 <= XML_REGEXP_PUNCT_OTHERS)) || - ((type2 >= XML_REGEXP_SEPAR) && - (type2 <= XML_REGEXP_SEPAR_PARA)) || - ((type2 >= XML_REGEXP_SYMBOL) && - (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || - ((type2 >= XML_REGEXP_OTHER) && - (type2 <= XML_REGEXP_OTHER_NA)) - )return(0); - break; - case XML_REGEXP_NOTDECIMAL: /* \D */ - break; - case XML_REGEXP_REALCHAR: /* \w */ - /* can't be a mark, separator, pontuation, symbol or other */ - if ((type2 == XML_REGEXP_NOTDECIMAL) || - ((type2 >= XML_REGEXP_MARK) && - (type2 <= XML_REGEXP_MARK_ENCLOSING)) || - ((type2 >= XML_REGEXP_PUNCT) && - (type2 <= XML_REGEXP_PUNCT_OTHERS)) || - ((type2 >= XML_REGEXP_SEPAR) && - (type2 <= XML_REGEXP_SEPAR_PARA)) || - ((type2 >= XML_REGEXP_SYMBOL) && - (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || - ((type2 >= XML_REGEXP_OTHER) && - (type2 <= XML_REGEXP_OTHER_NA)) - )return(0); - break; - case XML_REGEXP_NOTREALCHAR: /* \W */ - break; - /* - * at that point we know both type 1 and type2 are from - * character categories are ordered and are different, - * it becomes simple because this is a partition - */ - case XML_REGEXP_LETTER: - if (type2 <= XML_REGEXP_LETTER_OTHERS) - return(1); - return(0); - case XML_REGEXP_LETTER_UPPERCASE: - case XML_REGEXP_LETTER_LOWERCASE: - case XML_REGEXP_LETTER_TITLECASE: - case XML_REGEXP_LETTER_MODIFIER: - case XML_REGEXP_LETTER_OTHERS: - return(0); - case XML_REGEXP_MARK: - if (type2 <= XML_REGEXP_MARK_ENCLOSING) - return(1); - return(0); - case XML_REGEXP_MARK_NONSPACING: - case XML_REGEXP_MARK_SPACECOMBINING: - case XML_REGEXP_MARK_ENCLOSING: - return(0); - case XML_REGEXP_NUMBER: - if (type2 <= XML_REGEXP_NUMBER_OTHERS) - return(1); - return(0); - case XML_REGEXP_NUMBER_DECIMAL: - case XML_REGEXP_NUMBER_LETTER: - case XML_REGEXP_NUMBER_OTHERS: - return(0); - case XML_REGEXP_PUNCT: - if (type2 <= XML_REGEXP_PUNCT_OTHERS) - return(1); - return(0); - case XML_REGEXP_PUNCT_CONNECTOR: - case XML_REGEXP_PUNCT_DASH: - case XML_REGEXP_PUNCT_OPEN: - case XML_REGEXP_PUNCT_CLOSE: - case XML_REGEXP_PUNCT_INITQUOTE: - case XML_REGEXP_PUNCT_FINQUOTE: - case XML_REGEXP_PUNCT_OTHERS: - return(0); - case XML_REGEXP_SEPAR: - if (type2 <= XML_REGEXP_SEPAR_PARA) - return(1); - return(0); - case XML_REGEXP_SEPAR_SPACE: - case XML_REGEXP_SEPAR_LINE: - case XML_REGEXP_SEPAR_PARA: - return(0); - case XML_REGEXP_SYMBOL: - if (type2 <= XML_REGEXP_SYMBOL_OTHERS) - return(1); - return(0); - case XML_REGEXP_SYMBOL_MATH: - case XML_REGEXP_SYMBOL_CURRENCY: - case XML_REGEXP_SYMBOL_MODIFIER: - case XML_REGEXP_SYMBOL_OTHERS: - return(0); - case XML_REGEXP_OTHER: - if (type2 <= XML_REGEXP_OTHER_NA) - return(1); - return(0); - case XML_REGEXP_OTHER_CONTROL: - case XML_REGEXP_OTHER_FORMAT: - case XML_REGEXP_OTHER_PRIVATE: - case XML_REGEXP_OTHER_NA: - return(0); - default: - break; - } - return(1); -} - -/** - * xmlFAEqualAtoms: - * @atom1: an atom - * @atom2: an atom - * - * Compares two atoms to check whether they are the same exactly - * this is used to remove equivalent transitions - * - * Returns 1 if same and 0 otherwise - */ -static int -xmlFAEqualAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2) { - int ret = 0; - - if (atom1 == atom2) - return(1); - if ((atom1 == NULL) || (atom2 == NULL)) - return(0); - - if (atom1->type != atom2->type) - return(0); - switch (atom1->type) { - case XML_REGEXP_EPSILON: - ret = 0; - break; - case XML_REGEXP_STRING: - ret = xmlStrEqual((xmlChar *)atom1->valuep, - (xmlChar *)atom2->valuep); - break; - case XML_REGEXP_CHARVAL: - ret = (atom1->codepoint == atom2->codepoint); - break; - case XML_REGEXP_RANGES: - /* too hard to do in the general case */ - ret = 0; - default: - break; - } - return(ret); -} - -/** - * xmlFACompareAtoms: - * @atom1: an atom - * @atom2: an atom - * - * Compares two atoms to check whether they intersect in some ways, - * this is used by xmlFAComputesDeterminism and xmlFARecurseDeterminism only - * - * Returns 1 if yes and 0 otherwise - */ -static int -xmlFACompareAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2) { - int ret = 1; - - if (atom1 == atom2) - return(1); - if ((atom1 == NULL) || (atom2 == NULL)) - return(0); - - if ((atom1->type == XML_REGEXP_ANYCHAR) || - (atom2->type == XML_REGEXP_ANYCHAR)) - return(1); - - if (atom1->type > atom2->type) { - xmlRegAtomPtr tmp; - tmp = atom1; - atom1 = atom2; - atom2 = tmp; - } - if (atom1->type != atom2->type) { - ret = xmlFACompareAtomTypes(atom1->type, atom2->type); - /* if they can't intersect at the type level break now */ - if (ret == 0) - return(0); - } - switch (atom1->type) { - case XML_REGEXP_STRING: - ret = xmlRegStrEqualWildcard((xmlChar *)atom1->valuep, - (xmlChar *)atom2->valuep); - break; - case XML_REGEXP_EPSILON: - goto not_determinist; - case XML_REGEXP_CHARVAL: - if (atom2->type == XML_REGEXP_CHARVAL) { - ret = (atom1->codepoint == atom2->codepoint); - } else { - ret = xmlRegCheckCharacter(atom2, atom1->codepoint); - if (ret < 0) - ret = 1; - } - break; - case XML_REGEXP_RANGES: - if (atom2->type == XML_REGEXP_RANGES) { - int i, j, res; - xmlRegRangePtr r1, r2; - - /* - * need to check that none of the ranges eventually matches - */ - for (i = 0;i < atom1->nbRanges;i++) { - for (j = 0;j < atom2->nbRanges;j++) { - r1 = atom1->ranges[i]; - r2 = atom2->ranges[j]; - res = xmlFACompareRanges(r1, r2); - if (res == 1) { - ret = 1; - goto done; - } - } - } - ret = 0; - } - break; - default: - goto not_determinist; - } -done: - if (atom1->neg != atom2->neg) { - ret = !ret; - } - if (ret == 0) - return(0); -not_determinist: - return(1); -} - -/** - * xmlFARecurseDeterminism: - * @ctxt: a regexp parser context - * - * Check whether the associated regexp is determinist, - * should be called after xmlFAEliminateEpsilonTransitions() - * - */ -static int -xmlFARecurseDeterminism(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, - int to, xmlRegAtomPtr atom) { - int ret = 1; - int res; - int transnr, nbTrans; - xmlRegTransPtr t1; - - if (state == NULL) - return(ret); - /* - * don't recurse on transitions potentially added in the course of - * the elimination. - */ - nbTrans = state->nbTrans; - for (transnr = 0;transnr < nbTrans;transnr++) { - t1 = &(state->trans[transnr]); - /* - * check transitions conflicting with the one looked at - */ - if (t1->atom == NULL) { - if (t1->to == -1) - continue; - res = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], - to, atom); - if (res == 0) { - ret = 0; - /* t1->nd = 1; */ - } - continue; - } - if (t1->to != to) - continue; - if (xmlFACompareAtoms(t1->atom, atom)) { - ret = 0; - /* mark the transition as non-deterministic */ - t1->nd = 1; - } - } - return(ret); -} - -/** - * xmlFAComputesDeterminism: - * @ctxt: a regexp parser context - * - * Check whether the associated regexp is determinist, - * should be called after xmlFAEliminateEpsilonTransitions() - * - */ -static int -xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt) { - int statenr, transnr; - xmlRegStatePtr state; - xmlRegTransPtr t1, t2, last; - int i; - int ret = 1; - -#ifdef DEBUG_REGEXP_GRAPH - printf("xmlFAComputesDeterminism\n"); - xmlRegPrintCtxt(stdout, ctxt); -#endif - if (ctxt->determinist != -1) - return(ctxt->determinist); - - /* - * First cleanup the automata removing cancelled transitions - */ - for (statenr = 0;statenr < ctxt->nbStates;statenr++) { - state = ctxt->states[statenr]; - if (state == NULL) - continue; - if (state->nbTrans < 2) - continue; - for (transnr = 0;transnr < state->nbTrans;transnr++) { - t1 = &(state->trans[transnr]); - /* - * Determinism checks in case of counted or all transitions - * will have to be handled separately - */ - if (t1->atom == NULL) { - /* t1->nd = 1; */ - continue; - } - if (t1->to == -1) /* eliminated */ - continue; - for (i = 0;i < transnr;i++) { - t2 = &(state->trans[i]); - if (t2->to == -1) /* eliminated */ - continue; - if (t2->atom != NULL) { - if (t1->to == t2->to) { - if (xmlFAEqualAtoms(t1->atom, t2->atom)) - t2->to = -1; /* eliminated */ - } - } - } - } - } - - /* - * Check for all states that there aren't 2 transitions - * with the same atom and a different target. - */ - for (statenr = 0;statenr < ctxt->nbStates;statenr++) { - state = ctxt->states[statenr]; - if (state == NULL) - continue; - if (state->nbTrans < 2) - continue; - last = NULL; - for (transnr = 0;transnr < state->nbTrans;transnr++) { - t1 = &(state->trans[transnr]); - /* - * Determinism checks in case of counted or all transitions - * will have to be handled separately - */ - if (t1->atom == NULL) { - continue; - } - if (t1->to == -1) /* eliminated */ - continue; - for (i = 0;i < transnr;i++) { - t2 = &(state->trans[i]); - if (t2->to == -1) /* eliminated */ - continue; - if (t2->atom != NULL) { - /* not determinist ! */ - if (xmlFACompareAtoms(t1->atom, t2->atom)) { - ret = 0; - /* mark the transitions as non-deterministic ones */ - t1->nd = 1; - t2->nd = 1; - last = t1; - } - } else if (t1->to != -1) { - /* - * do the closure in case of remaining specific - * epsilon transitions like choices or all - */ - ret = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], - t2->to, t2->atom); - /* don't shortcut the computation so all non deterministic - transition get marked down - if (ret == 0) - return(0); - */ - if (ret == 0) { - t1->nd = 1; - /* t2->nd = 1; */ - last = t1; - } - } - } - /* don't shortcut the computation so all non deterministic - transition get marked down - if (ret == 0) - break; */ - } - - /* - * mark specifically the last non-deterministic transition - * from a state since there is no need to set-up rollback - * from it - */ - if (last != NULL) { - last->nd = 2; - } - - /* don't shortcut the computation so all non deterministic - transition get marked down - if (ret == 0) - break; */ - } - - ctxt->determinist = ret; - return(ret); -} - -/************************************************************************ - * * - * Routines to check input against transition atoms * - * * - ************************************************************************/ - -static int -xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, int neg, - int start, int end, const xmlChar *blockName) { - int ret = 0; - - switch (type) { - case XML_REGEXP_STRING: - case XML_REGEXP_SUBREG: - case XML_REGEXP_RANGES: - case XML_REGEXP_EPSILON: - return(-1); - case XML_REGEXP_ANYCHAR: - ret = ((codepoint != '\n') && (codepoint != '\r')); - break; - case XML_REGEXP_CHARVAL: - ret = ((codepoint >= start) && (codepoint <= end)); - break; - case XML_REGEXP_NOTSPACE: - neg = !neg; - case XML_REGEXP_ANYSPACE: - ret = ((codepoint == '\n') || (codepoint == '\r') || - (codepoint == '\t') || (codepoint == ' ')); - break; - case XML_REGEXP_NOTINITNAME: - neg = !neg; - case XML_REGEXP_INITNAME: - ret = (IS_LETTER(codepoint) || - (codepoint == '_') || (codepoint == ':')); - break; - case XML_REGEXP_NOTNAMECHAR: - neg = !neg; - case XML_REGEXP_NAMECHAR: - ret = (IS_LETTER(codepoint) || IS_DIGIT(codepoint) || - (codepoint == '.') || (codepoint == '-') || - (codepoint == '_') || (codepoint == ':') || - IS_COMBINING(codepoint) || IS_EXTENDER(codepoint)); - break; - case XML_REGEXP_NOTDECIMAL: - neg = !neg; - case XML_REGEXP_DECIMAL: - ret = xmlUCSIsCatNd(codepoint); - break; - case XML_REGEXP_REALCHAR: - neg = !neg; - case XML_REGEXP_NOTREALCHAR: - ret = xmlUCSIsCatP(codepoint); - if (ret == 0) - ret = xmlUCSIsCatZ(codepoint); - if (ret == 0) - ret = xmlUCSIsCatC(codepoint); - break; - case XML_REGEXP_LETTER: - ret = xmlUCSIsCatL(codepoint); - break; - case XML_REGEXP_LETTER_UPPERCASE: - ret = xmlUCSIsCatLu(codepoint); - break; - case XML_REGEXP_LETTER_LOWERCASE: - ret = xmlUCSIsCatLl(codepoint); - break; - case XML_REGEXP_LETTER_TITLECASE: - ret = xmlUCSIsCatLt(codepoint); - break; - case XML_REGEXP_LETTER_MODIFIER: - ret = xmlUCSIsCatLm(codepoint); - break; - case XML_REGEXP_LETTER_OTHERS: - ret = xmlUCSIsCatLo(codepoint); - break; - case XML_REGEXP_MARK: - ret = xmlUCSIsCatM(codepoint); - break; - case XML_REGEXP_MARK_NONSPACING: - ret = xmlUCSIsCatMn(codepoint); - break; - case XML_REGEXP_MARK_SPACECOMBINING: - ret = xmlUCSIsCatMc(codepoint); - break; - case XML_REGEXP_MARK_ENCLOSING: - ret = xmlUCSIsCatMe(codepoint); - break; - case XML_REGEXP_NUMBER: - ret = xmlUCSIsCatN(codepoint); - break; - case XML_REGEXP_NUMBER_DECIMAL: - ret = xmlUCSIsCatNd(codepoint); - break; - case XML_REGEXP_NUMBER_LETTER: - ret = xmlUCSIsCatNl(codepoint); - break; - case XML_REGEXP_NUMBER_OTHERS: - ret = xmlUCSIsCatNo(codepoint); - break; - case XML_REGEXP_PUNCT: - ret = xmlUCSIsCatP(codepoint); - break; - case XML_REGEXP_PUNCT_CONNECTOR: - ret = xmlUCSIsCatPc(codepoint); - break; - case XML_REGEXP_PUNCT_DASH: - ret = xmlUCSIsCatPd(codepoint); - break; - case XML_REGEXP_PUNCT_OPEN: - ret = xmlUCSIsCatPs(codepoint); - break; - case XML_REGEXP_PUNCT_CLOSE: - ret = xmlUCSIsCatPe(codepoint); - break; - case XML_REGEXP_PUNCT_INITQUOTE: - ret = xmlUCSIsCatPi(codepoint); - break; - case XML_REGEXP_PUNCT_FINQUOTE: - ret = xmlUCSIsCatPf(codepoint); - break; - case XML_REGEXP_PUNCT_OTHERS: - ret = xmlUCSIsCatPo(codepoint); - break; - case XML_REGEXP_SEPAR: - ret = xmlUCSIsCatZ(codepoint); - break; - case XML_REGEXP_SEPAR_SPACE: - ret = xmlUCSIsCatZs(codepoint); - break; - case XML_REGEXP_SEPAR_LINE: - ret = xmlUCSIsCatZl(codepoint); - break; - case XML_REGEXP_SEPAR_PARA: - ret = xmlUCSIsCatZp(codepoint); - break; - case XML_REGEXP_SYMBOL: - ret = xmlUCSIsCatS(codepoint); - break; - case XML_REGEXP_SYMBOL_MATH: - ret = xmlUCSIsCatSm(codepoint); - break; - case XML_REGEXP_SYMBOL_CURRENCY: - ret = xmlUCSIsCatSc(codepoint); - break; - case XML_REGEXP_SYMBOL_MODIFIER: - ret = xmlUCSIsCatSk(codepoint); - break; - case XML_REGEXP_SYMBOL_OTHERS: - ret = xmlUCSIsCatSo(codepoint); - break; - case XML_REGEXP_OTHER: - ret = xmlUCSIsCatC(codepoint); - break; - case XML_REGEXP_OTHER_CONTROL: - ret = xmlUCSIsCatCc(codepoint); - break; - case XML_REGEXP_OTHER_FORMAT: - ret = xmlUCSIsCatCf(codepoint); - break; - case XML_REGEXP_OTHER_PRIVATE: - ret = xmlUCSIsCatCo(codepoint); - break; - case XML_REGEXP_OTHER_NA: - /* ret = xmlUCSIsCatCn(codepoint); */ - /* Seems it doesn't exist anymore in recent Unicode releases */ - ret = 0; - break; - case XML_REGEXP_BLOCK_NAME: - ret = xmlUCSIsBlock(codepoint, (const char *) blockName); - break; - } - if (neg) - return(!ret); - return(ret); -} - -static int -xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint) { - int i, ret = 0; - xmlRegRangePtr range; - - if ((atom == NULL) || (!IS_CHAR(codepoint))) - return(-1); - - switch (atom->type) { - case XML_REGEXP_SUBREG: - case XML_REGEXP_EPSILON: - return(-1); - case XML_REGEXP_CHARVAL: - return(codepoint == atom->codepoint); - case XML_REGEXP_RANGES: { - int accept = 0; - - for (i = 0;i < atom->nbRanges;i++) { - range = atom->ranges[i]; - if (range->neg == 2) { - ret = xmlRegCheckCharacterRange(range->type, codepoint, - 0, range->start, range->end, - range->blockName); - if (ret != 0) - return(0); /* excluded char */ - } else if (range->neg) { - ret = xmlRegCheckCharacterRange(range->type, codepoint, - 0, range->start, range->end, - range->blockName); - if (ret == 0) - accept = 1; - else - return(0); - } else { - ret = xmlRegCheckCharacterRange(range->type, codepoint, - 0, range->start, range->end, - range->blockName); - if (ret != 0) - accept = 1; /* might still be excluded */ - } - } - return(accept); - } - case XML_REGEXP_STRING: - printf("TODO: XML_REGEXP_STRING\n"); - return(-1); - case XML_REGEXP_ANYCHAR: - case XML_REGEXP_ANYSPACE: - case XML_REGEXP_NOTSPACE: - case XML_REGEXP_INITNAME: - case XML_REGEXP_NOTINITNAME: - case XML_REGEXP_NAMECHAR: - case XML_REGEXP_NOTNAMECHAR: - case XML_REGEXP_DECIMAL: - case XML_REGEXP_NOTDECIMAL: - case XML_REGEXP_REALCHAR: - case XML_REGEXP_NOTREALCHAR: - case XML_REGEXP_LETTER: - case XML_REGEXP_LETTER_UPPERCASE: - case XML_REGEXP_LETTER_LOWERCASE: - case XML_REGEXP_LETTER_TITLECASE: - case XML_REGEXP_LETTER_MODIFIER: - case XML_REGEXP_LETTER_OTHERS: - case XML_REGEXP_MARK: - case XML_REGEXP_MARK_NONSPACING: - case XML_REGEXP_MARK_SPACECOMBINING: - case XML_REGEXP_MARK_ENCLOSING: - case XML_REGEXP_NUMBER: - case XML_REGEXP_NUMBER_DECIMAL: - case XML_REGEXP_NUMBER_LETTER: - case XML_REGEXP_NUMBER_OTHERS: - case XML_REGEXP_PUNCT: - case XML_REGEXP_PUNCT_CONNECTOR: - case XML_REGEXP_PUNCT_DASH: - case XML_REGEXP_PUNCT_OPEN: - case XML_REGEXP_PUNCT_CLOSE: - case XML_REGEXP_PUNCT_INITQUOTE: - case XML_REGEXP_PUNCT_FINQUOTE: - case XML_REGEXP_PUNCT_OTHERS: - case XML_REGEXP_SEPAR: - case XML_REGEXP_SEPAR_SPACE: - case XML_REGEXP_SEPAR_LINE: - case XML_REGEXP_SEPAR_PARA: - case XML_REGEXP_SYMBOL: - case XML_REGEXP_SYMBOL_MATH: - case XML_REGEXP_SYMBOL_CURRENCY: - case XML_REGEXP_SYMBOL_MODIFIER: - case XML_REGEXP_SYMBOL_OTHERS: - case XML_REGEXP_OTHER: - case XML_REGEXP_OTHER_CONTROL: - case XML_REGEXP_OTHER_FORMAT: - case XML_REGEXP_OTHER_PRIVATE: - case XML_REGEXP_OTHER_NA: - case XML_REGEXP_BLOCK_NAME: - ret = xmlRegCheckCharacterRange(atom->type, codepoint, 0, 0, 0, - (const xmlChar *)atom->valuep); - if (atom->neg) - ret = !ret; - break; - } - return(ret); -} - -/************************************************************************ - * * - * Saving and restoring state of an execution context * - * * - ************************************************************************/ - -#ifdef DEBUG_REGEXP_EXEC -static void -xmlFARegDebugExec(xmlRegExecCtxtPtr exec) { - printf("state: %d:%d:idx %d", exec->state->no, exec->transno, exec->index); - if (exec->inputStack != NULL) { - int i; - printf(": "); - for (i = 0;(i < 3) && (i < exec->inputStackNr);i++) - printf("%s ", exec->inputStack[exec->inputStackNr - (i + 1)]); - } else { - printf(": %s", &(exec->inputString[exec->index])); - } - printf("\n"); -} -#endif - -static void -xmlFARegExecSave(xmlRegExecCtxtPtr exec) { -#ifdef DEBUG_REGEXP_EXEC - printf("saving "); - exec->transno++; - xmlFARegDebugExec(exec); - exec->transno--; -#endif -#ifdef MAX_PUSH - if (exec->nbPush > MAX_PUSH) { - return; - } - exec->nbPush++; -#endif - - if (exec->maxRollbacks == 0) { - exec->maxRollbacks = 4; - exec->rollbacks = (xmlRegExecRollback *) xmlMalloc(exec->maxRollbacks * - sizeof(xmlRegExecRollback)); - if (exec->rollbacks == NULL) { - xmlRegexpErrMemory(NULL, "saving regexp"); - exec->maxRollbacks = 0; - return; - } - memset(exec->rollbacks, 0, - exec->maxRollbacks * sizeof(xmlRegExecRollback)); - } else if (exec->nbRollbacks >= exec->maxRollbacks) { - xmlRegExecRollback *tmp; - int len = exec->maxRollbacks; - - exec->maxRollbacks *= 2; - tmp = (xmlRegExecRollback *) xmlRealloc(exec->rollbacks, - exec->maxRollbacks * sizeof(xmlRegExecRollback)); - if (tmp == NULL) { - xmlRegexpErrMemory(NULL, "saving regexp"); - exec->maxRollbacks /= 2; - return; - } - exec->rollbacks = tmp; - tmp = &exec->rollbacks[len]; - memset(tmp, 0, (exec->maxRollbacks - len) * sizeof(xmlRegExecRollback)); - } - exec->rollbacks[exec->nbRollbacks].state = exec->state; - exec->rollbacks[exec->nbRollbacks].index = exec->index; - exec->rollbacks[exec->nbRollbacks].nextbranch = exec->transno + 1; - if (exec->comp->nbCounters > 0) { - if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { - exec->rollbacks[exec->nbRollbacks].counts = (int *) - xmlMalloc(exec->comp->nbCounters * sizeof(int)); - if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { - xmlRegexpErrMemory(NULL, "saving regexp"); - exec->status = -5; - return; - } - } - memcpy(exec->rollbacks[exec->nbRollbacks].counts, exec->counts, - exec->comp->nbCounters * sizeof(int)); - } - exec->nbRollbacks++; -} - -static void -xmlFARegExecRollBack(xmlRegExecCtxtPtr exec) { - if (exec->nbRollbacks <= 0) { - exec->status = -1; -#ifdef DEBUG_REGEXP_EXEC - printf("rollback failed on empty stack\n"); -#endif - return; - } - exec->nbRollbacks--; - exec->state = exec->rollbacks[exec->nbRollbacks].state; - exec->index = exec->rollbacks[exec->nbRollbacks].index; - exec->transno = exec->rollbacks[exec->nbRollbacks].nextbranch; - if (exec->comp->nbCounters > 0) { - if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { - fprintf(stderr, "exec save: allocation failed"); - exec->status = -6; - return; - } - memcpy(exec->counts, exec->rollbacks[exec->nbRollbacks].counts, - exec->comp->nbCounters * sizeof(int)); - } - -#ifdef DEBUG_REGEXP_EXEC - printf("restored "); - xmlFARegDebugExec(exec); -#endif -} - -/************************************************************************ - * * - * Verifier, running an input against a compiled regexp * - * * - ************************************************************************/ - -static int -xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { - xmlRegExecCtxt execval; - xmlRegExecCtxtPtr exec = &execval; - int ret, codepoint = 0, len, deter; - - exec->inputString = content; - exec->index = 0; - exec->nbPush = 0; - exec->determinist = 1; - exec->maxRollbacks = 0; - exec->nbRollbacks = 0; - exec->rollbacks = NULL; - exec->status = 0; - exec->comp = comp; - exec->state = comp->states[0]; - exec->transno = 0; - exec->transcount = 0; - exec->inputStack = NULL; - exec->inputStackMax = 0; - if (comp->nbCounters > 0) { - exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int)); - if (exec->counts == NULL) { - xmlRegexpErrMemory(NULL, "running regexp"); - return(-1); - } - memset(exec->counts, 0, comp->nbCounters * sizeof(int)); - } else - exec->counts = NULL; - while ((exec->status == 0) && - ((exec->inputString[exec->index] != 0) || - (exec->state->type != XML_REGEXP_FINAL_STATE))) { - xmlRegTransPtr trans; - xmlRegAtomPtr atom; - - /* - * If end of input on non-terminal state, rollback, however we may - * still have epsilon like transition for counted transitions - * on counters, in that case don't break too early. Additionally, - * if we are working on a range like "AB{0,2}", where B is not present, - * we don't want to break. - */ - len = 1; - if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) { - /* - * if there is a transition, we must check if - * atom allows minOccurs of 0 - */ - if (exec->transno < exec->state->nbTrans) { - trans = &exec->state->trans[exec->transno]; - if (trans->to >=0) { - atom = trans->atom; - if (!((atom->min == 0) && (atom->max > 0))) - goto rollback; - } - } else - goto rollback; - } - - exec->transcount = 0; - for (;exec->transno < exec->state->nbTrans;exec->transno++) { - trans = &exec->state->trans[exec->transno]; - if (trans->to < 0) - continue; - atom = trans->atom; - ret = 0; - deter = 1; - if (trans->count >= 0) { - int count; - xmlRegCounterPtr counter; - - if (exec->counts == NULL) { - exec->status = -1; - goto error; - } - /* - * A counted transition. - */ - - count = exec->counts[trans->count]; - counter = &exec->comp->counters[trans->count]; -#ifdef DEBUG_REGEXP_EXEC - printf("testing count %d: val %d, min %d, max %d\n", - trans->count, count, counter->min, counter->max); -#endif - ret = ((count >= counter->min) && (count <= counter->max)); - if ((ret) && (counter->min != counter->max)) - deter = 0; - } else if (atom == NULL) { - fprintf(stderr, "epsilon transition left at runtime\n"); - exec->status = -2; - break; - } else if (exec->inputString[exec->index] != 0) { - codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); - ret = xmlRegCheckCharacter(atom, codepoint); - if ((ret == 1) && (atom->min >= 0) && (atom->max > 0)) { - xmlRegStatePtr to = comp->states[trans->to]; - - /* - * this is a multiple input sequence - * If there is a counter associated increment it now. - * before potentially saving and rollback - */ - if (trans->counter >= 0) { - if (exec->counts == NULL) { - exec->status = -1; - goto error; - } -#ifdef DEBUG_REGEXP_EXEC - printf("Increasing count %d\n", trans->counter); -#endif - exec->counts[trans->counter]++; - } - if (exec->state->nbTrans > exec->transno + 1) { - xmlFARegExecSave(exec); - } - exec->transcount = 1; - do { - /* - * Try to progress as much as possible on the input - */ - if (exec->transcount == atom->max) { - break; - } - exec->index += len; - /* - * End of input: stop here - */ - if (exec->inputString[exec->index] == 0) { - exec->index -= len; - break; - } - if (exec->transcount >= atom->min) { - int transno = exec->transno; - xmlRegStatePtr state = exec->state; - - /* - * The transition is acceptable save it - */ - exec->transno = -1; /* trick */ - exec->state = to; - xmlFARegExecSave(exec); - exec->transno = transno; - exec->state = state; - } - codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), - len); - ret = xmlRegCheckCharacter(atom, codepoint); - exec->transcount++; - } while (ret == 1); - if (exec->transcount < atom->min) - ret = 0; - - /* - * If the last check failed but one transition was found - * possible, rollback - */ - if (ret < 0) - ret = 0; - if (ret == 0) { - goto rollback; - } - if (trans->counter >= 0) { - if (exec->counts == NULL) { - exec->status = -1; - goto error; - } -#ifdef DEBUG_REGEXP_EXEC - printf("Decreasing count %d\n", trans->counter); -#endif - exec->counts[trans->counter]--; - } - } else if ((ret == 0) && (atom->min == 0) && (atom->max > 0)) { - /* - * we don't match on the codepoint, but minOccurs of 0 - * says that's ok. Setting len to 0 inhibits stepping - * over the codepoint. - */ - exec->transcount = 1; - len = 0; - ret = 1; - } - } else if ((atom->min == 0) && (atom->max > 0)) { - /* another spot to match when minOccurs is 0 */ - exec->transcount = 1; - len = 0; - ret = 1; - } - if (ret == 1) { - if ((trans->nd == 1) || - ((trans->count >= 0) && (deter == 0) && - (exec->state->nbTrans > exec->transno + 1))) { -#ifdef DEBUG_REGEXP_EXEC - if (trans->nd == 1) - printf("Saving on nd transition atom %d for %c at %d\n", - trans->atom->no, codepoint, exec->index); - else - printf("Saving on counted transition count %d for %c at %d\n", - trans->count, codepoint, exec->index); -#endif - xmlFARegExecSave(exec); - } - if (trans->counter >= 0) { - if (exec->counts == NULL) { - exec->status = -1; - goto error; - } -#ifdef DEBUG_REGEXP_EXEC - printf("Increasing count %d\n", trans->counter); -#endif - exec->counts[trans->counter]++; - } - if ((trans->count >= 0) && - (trans->count < REGEXP_ALL_COUNTER)) { - if (exec->counts == NULL) { - exec->status = -1; - goto error; - } -#ifdef DEBUG_REGEXP_EXEC - printf("resetting count %d on transition\n", - trans->count); -#endif - exec->counts[trans->count] = 0; - } -#ifdef DEBUG_REGEXP_EXEC - printf("entering state %d\n", trans->to); -#endif - exec->state = comp->states[trans->to]; - exec->transno = 0; - if (trans->atom != NULL) { - exec->index += len; - } - goto progress; - } else if (ret < 0) { - exec->status = -4; - break; - } - } - if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { -rollback: - /* - * Failed to find a way out - */ - exec->determinist = 0; -#ifdef DEBUG_REGEXP_EXEC - printf("rollback from state %d on %d:%c\n", exec->state->no, - codepoint,codepoint); -#endif - xmlFARegExecRollBack(exec); - } -progress: - continue; - } -error: - if (exec->rollbacks != NULL) { - if (exec->counts != NULL) { - int i; - - for (i = 0;i < exec->maxRollbacks;i++) - if (exec->rollbacks[i].counts != NULL) - xmlFree(exec->rollbacks[i].counts); - } - xmlFree(exec->rollbacks); - } - if (exec->counts != NULL) - xmlFree(exec->counts); - if (exec->status == 0) - return(1); - if (exec->status == -1) { - if (exec->nbPush > MAX_PUSH) - return(-1); - return(0); - } - return(exec->status); -} - -/************************************************************************ - * * - * Progressive interface to the verifier one atom at a time * - * * - ************************************************************************/ -#ifdef DEBUG_ERR -static void testerr(xmlRegExecCtxtPtr exec); -#endif - -/** - * xmlRegNewExecCtxt: - * @comp: a precompiled regular expression - * @callback: a callback function used for handling progresses in the - * automata matching phase - * @data: the context data associated to the callback in this context - * - * Build a context used for progressive evaluation of a regexp. - * - * Returns the new context - */ -xmlRegExecCtxtPtr -xmlRegNewExecCtxt(xmlRegexpPtr comp, xmlRegExecCallbacks callback, void *data) { - xmlRegExecCtxtPtr exec; - - if (comp == NULL) - return(NULL); - if ((comp->compact == NULL) && (comp->states == NULL)) - return(NULL); - exec = (xmlRegExecCtxtPtr) xmlMalloc(sizeof(xmlRegExecCtxt)); - if (exec == NULL) { - xmlRegexpErrMemory(NULL, "creating execution context"); - return(NULL); - } - memset(exec, 0, sizeof(xmlRegExecCtxt)); - exec->inputString = NULL; - exec->index = 0; - exec->determinist = 1; - exec->maxRollbacks = 0; - exec->nbRollbacks = 0; - exec->rollbacks = NULL; - exec->status = 0; - exec->comp = comp; - if (comp->compact == NULL) - exec->state = comp->states[0]; - exec->transno = 0; - exec->transcount = 0; - exec->callback = callback; - exec->data = data; - if (comp->nbCounters > 0) { - /* - * For error handling, exec->counts is allocated twice the size - * the second half is used to store the data in case of rollback - */ - exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int) - * 2); - if (exec->counts == NULL) { - xmlRegexpErrMemory(NULL, "creating execution context"); - xmlFree(exec); - return(NULL); - } - memset(exec->counts, 0, comp->nbCounters * sizeof(int) * 2); - exec->errCounts = &exec->counts[comp->nbCounters]; - } else { - exec->counts = NULL; - exec->errCounts = NULL; - } - exec->inputStackMax = 0; - exec->inputStackNr = 0; - exec->inputStack = NULL; - exec->errStateNo = -1; - exec->errString = NULL; - exec->nbPush = 0; - return(exec); -} - -/** - * xmlRegFreeExecCtxt: - * @exec: a regular expression evaulation context - * - * Free the structures associated to a regular expression evaulation context. - */ -void -xmlRegFreeExecCtxt(xmlRegExecCtxtPtr exec) { - if (exec == NULL) - return; - - if (exec->rollbacks != NULL) { - if (exec->counts != NULL) { - int i; - - for (i = 0;i < exec->maxRollbacks;i++) - if (exec->rollbacks[i].counts != NULL) - xmlFree(exec->rollbacks[i].counts); - } - xmlFree(exec->rollbacks); - } - if (exec->counts != NULL) - xmlFree(exec->counts); - if (exec->inputStack != NULL) { - int i; - - for (i = 0;i < exec->inputStackNr;i++) { - if (exec->inputStack[i].value != NULL) - xmlFree(exec->inputStack[i].value); - } - xmlFree(exec->inputStack); - } - if (exec->errString != NULL) - xmlFree(exec->errString); - xmlFree(exec); -} - -static void -xmlFARegExecSaveInputString(xmlRegExecCtxtPtr exec, const xmlChar *value, - void *data) { -#ifdef DEBUG_PUSH - printf("saving value: %d:%s\n", exec->inputStackNr, value); -#endif - if (exec->inputStackMax == 0) { - exec->inputStackMax = 4; - exec->inputStack = (xmlRegInputTokenPtr) - xmlMalloc(exec->inputStackMax * sizeof(xmlRegInputToken)); - if (exec->inputStack == NULL) { - xmlRegexpErrMemory(NULL, "pushing input string"); - exec->inputStackMax = 0; - return; - } - } else if (exec->inputStackNr + 1 >= exec->inputStackMax) { - xmlRegInputTokenPtr tmp; - - exec->inputStackMax *= 2; - tmp = (xmlRegInputTokenPtr) xmlRealloc(exec->inputStack, - exec->inputStackMax * sizeof(xmlRegInputToken)); - if (tmp == NULL) { - xmlRegexpErrMemory(NULL, "pushing input string"); - exec->inputStackMax /= 2; - return; - } - exec->inputStack = tmp; - } - exec->inputStack[exec->inputStackNr].value = xmlStrdup(value); - exec->inputStack[exec->inputStackNr].data = data; - exec->inputStackNr++; - exec->inputStack[exec->inputStackNr].value = NULL; - exec->inputStack[exec->inputStackNr].data = NULL; -} - -/** - * xmlRegStrEqualWildcard: - * @expStr: the string to be evaluated - * @valStr: the validation string - * - * Checks if both strings are equal or have the same content. "*" - * can be used as a wildcard in @valStr; "|" is used as a seperator of - * substrings in both @expStr and @valStr. - * - * Returns 1 if the comparison is satisfied and the number of substrings - * is equal, 0 otherwise. - */ - -static int -xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr) { - if (expStr == valStr) return(1); - if (expStr == NULL) return(0); - if (valStr == NULL) return(0); - do { - /* - * Eval if we have a wildcard for the current item. - */ - if (*expStr != *valStr) { - /* if one of them starts with a wildcard make valStr be it */ - if (*valStr == '*') { - const xmlChar *tmp; - - tmp = valStr; - valStr = expStr; - expStr = tmp; - } - if ((*valStr != 0) && (*expStr != 0) && (*expStr++ == '*')) { - do { - if (*valStr == XML_REG_STRING_SEPARATOR) - break; - valStr++; - } while (*valStr != 0); - continue; - } else - return(0); - } - expStr++; - valStr++; - } while (*valStr != 0); - if (*expStr != 0) - return (0); - else - return (1); -} - -/** - * xmlRegCompactPushString: - * @exec: a regexp execution context - * @comp: the precompiled exec with a compact table - * @value: a string token input - * @data: data associated to the token to reuse in callbacks - * - * Push one input token in the execution context - * - * Returns: 1 if the regexp reached a final state, 0 if non-final, and - * a negative value in case of error. - */ -static int -xmlRegCompactPushString(xmlRegExecCtxtPtr exec, - xmlRegexpPtr comp, - const xmlChar *value, - void *data) { - int state = exec->index; - int i, target; - - if ((comp == NULL) || (comp->compact == NULL) || (comp->stringMap == NULL)) - return(-1); - - if (value == NULL) { - /* - * are we at a final state ? - */ - if (comp->compact[state * (comp->nbstrings + 1)] == - XML_REGEXP_FINAL_STATE) - return(1); - return(0); - } - -#ifdef DEBUG_PUSH - printf("value pushed: %s\n", value); -#endif - - /* - * Examine all outside transitions from current state - */ - for (i = 0;i < comp->nbstrings;i++) { - target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; - if ((target > 0) && (target <= comp->nbstates)) { - target--; /* to avoid 0 */ - if (xmlRegStrEqualWildcard(comp->stringMap[i], value)) { - exec->index = target; - if ((exec->callback != NULL) && (comp->transdata != NULL)) { - exec->callback(exec->data, value, - comp->transdata[state * comp->nbstrings + i], data); - } -#ifdef DEBUG_PUSH - printf("entering state %d\n", target); -#endif - if (comp->compact[target * (comp->nbstrings + 1)] == - XML_REGEXP_SINK_STATE) - goto error; - - if (comp->compact[target * (comp->nbstrings + 1)] == - XML_REGEXP_FINAL_STATE) - return(1); - return(0); - } - } - } - /* - * Failed to find an exit transition out from current state for the - * current token - */ -#ifdef DEBUG_PUSH - printf("failed to find a transition for %s on state %d\n", value, state); -#endif -error: - if (exec->errString != NULL) - xmlFree(exec->errString); - exec->errString = xmlStrdup(value); - exec->errStateNo = state; - exec->status = -1; -#ifdef DEBUG_ERR - testerr(exec); -#endif - return(-1); -} - -/** - * xmlRegExecPushStringInternal: - * @exec: a regexp execution context or NULL to indicate the end - * @value: a string token input - * @data: data associated to the token to reuse in callbacks - * @compound: value was assembled from 2 strings - * - * Push one input token in the execution context - * - * Returns: 1 if the regexp reached a final state, 0 if non-final, and - * a negative value in case of error. - */ -static int -xmlRegExecPushStringInternal(xmlRegExecCtxtPtr exec, const xmlChar *value, - void *data, int compound) { - xmlRegTransPtr trans; - xmlRegAtomPtr atom; - int ret; - int final = 0; - int progress = 1; - - if (exec == NULL) - return(-1); - if (exec->comp == NULL) - return(-1); - if (exec->status != 0) - return(exec->status); - - if (exec->comp->compact != NULL) - return(xmlRegCompactPushString(exec, exec->comp, value, data)); - - if (value == NULL) { - if (exec->state->type == XML_REGEXP_FINAL_STATE) - return(1); - final = 1; - } - -#ifdef DEBUG_PUSH - printf("value pushed: %s\n", value); -#endif - /* - * If we have an active rollback stack push the new value there - * and get back to where we were left - */ - if ((value != NULL) && (exec->inputStackNr > 0)) { - xmlFARegExecSaveInputString(exec, value, data); - value = exec->inputStack[exec->index].value; - data = exec->inputStack[exec->index].data; -#ifdef DEBUG_PUSH - printf("value loaded: %s\n", value); -#endif - } - - while ((exec->status == 0) && - ((value != NULL) || - ((final == 1) && - (exec->state->type != XML_REGEXP_FINAL_STATE)))) { - - /* - * End of input on non-terminal state, rollback, however we may - * still have epsilon like transition for counted transitions - * on counters, in that case don't break too early. - */ - if ((value == NULL) && (exec->counts == NULL)) - goto rollback; - - exec->transcount = 0; - for (;exec->transno < exec->state->nbTrans;exec->transno++) { - trans = &exec->state->trans[exec->transno]; - if (trans->to < 0) - continue; - atom = trans->atom; - ret = 0; - if (trans->count == REGEXP_ALL_LAX_COUNTER) { - int i; - int count; - xmlRegTransPtr t; - xmlRegCounterPtr counter; - - ret = 0; - -#ifdef DEBUG_PUSH - printf("testing all lax %d\n", trans->count); -#endif - /* - * Check all counted transitions from the current state - */ - if ((value == NULL) && (final)) { - ret = 1; - } else if (value != NULL) { - for (i = 0;i < exec->state->nbTrans;i++) { - t = &exec->state->trans[i]; - if ((t->counter < 0) || (t == trans)) - continue; - counter = &exec->comp->counters[t->counter]; - count = exec->counts[t->counter]; - if ((count < counter->max) && - (t->atom != NULL) && - (xmlStrEqual(value, t->atom->valuep))) { - ret = 0; - break; - } - if ((count >= counter->min) && - (count < counter->max) && - (t->atom != NULL) && - (xmlStrEqual(value, t->atom->valuep))) { - ret = 1; - break; - } - } - } - } else if (trans->count == REGEXP_ALL_COUNTER) { - int i; - int count; - xmlRegTransPtr t; - xmlRegCounterPtr counter; - - ret = 1; - -#ifdef DEBUG_PUSH - printf("testing all %d\n", trans->count); -#endif - /* - * Check all counted transitions from the current state - */ - for (i = 0;i < exec->state->nbTrans;i++) { - t = &exec->state->trans[i]; - if ((t->counter < 0) || (t == trans)) - continue; - counter = &exec->comp->counters[t->counter]; - count = exec->counts[t->counter]; - if ((count < counter->min) || (count > counter->max)) { - ret = 0; - break; - } - } - } else if (trans->count >= 0) { - int count; - xmlRegCounterPtr counter; - - /* - * A counted transition. - */ - - count = exec->counts[trans->count]; - counter = &exec->comp->counters[trans->count]; -#ifdef DEBUG_PUSH - printf("testing count %d: val %d, min %d, max %d\n", - trans->count, count, counter->min, counter->max); -#endif - ret = ((count >= counter->min) && (count <= counter->max)); - } else if (atom == NULL) { - fprintf(stderr, "epsilon transition left at runtime\n"); - exec->status = -2; - break; - } else if (value != NULL) { - ret = xmlRegStrEqualWildcard(atom->valuep, value); - if (atom->neg) { - ret = !ret; - if (!compound) - ret = 0; - } - if ((ret == 1) && (trans->counter >= 0)) { - xmlRegCounterPtr counter; - int count; - - count = exec->counts[trans->counter]; - counter = &exec->comp->counters[trans->counter]; - if (count >= counter->max) - ret = 0; - } - - if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { - xmlRegStatePtr to = exec->comp->states[trans->to]; - - /* - * this is a multiple input sequence - */ - if (exec->state->nbTrans > exec->transno + 1) { - if (exec->inputStackNr <= 0) { - xmlFARegExecSaveInputString(exec, value, data); - } - xmlFARegExecSave(exec); - } - exec->transcount = 1; - do { - /* - * Try to progress as much as possible on the input - */ - if (exec->transcount == atom->max) { - break; - } - exec->index++; - value = exec->inputStack[exec->index].value; - data = exec->inputStack[exec->index].data; -#ifdef DEBUG_PUSH - printf("value loaded: %s\n", value); -#endif - - /* - * End of input: stop here - */ - if (value == NULL) { - exec->index --; - break; - } - if (exec->transcount >= atom->min) { - int transno = exec->transno; - xmlRegStatePtr state = exec->state; - - /* - * The transition is acceptable save it - */ - exec->transno = -1; /* trick */ - exec->state = to; - if (exec->inputStackNr <= 0) { - xmlFARegExecSaveInputString(exec, value, data); - } - xmlFARegExecSave(exec); - exec->transno = transno; - exec->state = state; - } - ret = xmlStrEqual(value, atom->valuep); - exec->transcount++; - } while (ret == 1); - if (exec->transcount < atom->min) - ret = 0; - - /* - * If the last check failed but one transition was found - * possible, rollback - */ - if (ret < 0) - ret = 0; - if (ret == 0) { - goto rollback; - } - } - } - if (ret == 1) { - if ((exec->callback != NULL) && (atom != NULL) && - (data != NULL)) { - exec->callback(exec->data, atom->valuep, - atom->data, data); - } - if (exec->state->nbTrans > exec->transno + 1) { - if (exec->inputStackNr <= 0) { - xmlFARegExecSaveInputString(exec, value, data); - } - xmlFARegExecSave(exec); - } - if (trans->counter >= 0) { -#ifdef DEBUG_PUSH - printf("Increasing count %d\n", trans->counter); -#endif - exec->counts[trans->counter]++; - } - if ((trans->count >= 0) && - (trans->count < REGEXP_ALL_COUNTER)) { -#ifdef DEBUG_REGEXP_EXEC - printf("resetting count %d on transition\n", - trans->count); -#endif - exec->counts[trans->count] = 0; - } -#ifdef DEBUG_PUSH - printf("entering state %d\n", trans->to); -#endif - if ((exec->comp->states[trans->to] != NULL) && - (exec->comp->states[trans->to]->type == - XML_REGEXP_SINK_STATE)) { - /* - * entering a sink state, save the current state as error - * state. - */ - if (exec->errString != NULL) - xmlFree(exec->errString); - exec->errString = xmlStrdup(value); - exec->errState = exec->state; - memcpy(exec->errCounts, exec->counts, - exec->comp->nbCounters * sizeof(int)); - } - exec->state = exec->comp->states[trans->to]; - exec->transno = 0; - if (trans->atom != NULL) { - if (exec->inputStack != NULL) { - exec->index++; - if (exec->index < exec->inputStackNr) { - value = exec->inputStack[exec->index].value; - data = exec->inputStack[exec->index].data; -#ifdef DEBUG_PUSH - printf("value loaded: %s\n", value); -#endif - } else { - value = NULL; - data = NULL; -#ifdef DEBUG_PUSH - printf("end of input\n"); -#endif - } - } else { - value = NULL; - data = NULL; -#ifdef DEBUG_PUSH - printf("end of input\n"); -#endif - } - } - goto progress; - } else if (ret < 0) { - exec->status = -4; - break; - } - } - if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { -rollback: - /* - * if we didn't yet rollback on the current input - * store the current state as the error state. - */ - if ((progress) && (exec->state != NULL) && - (exec->state->type != XML_REGEXP_SINK_STATE)) { - progress = 0; - if (exec->errString != NULL) - xmlFree(exec->errString); - exec->errString = xmlStrdup(value); - exec->errState = exec->state; - memcpy(exec->errCounts, exec->counts, - exec->comp->nbCounters * sizeof(int)); - } - - /* - * Failed to find a way out - */ - exec->determinist = 0; - xmlFARegExecRollBack(exec); - if (exec->status == 0) { - value = exec->inputStack[exec->index].value; - data = exec->inputStack[exec->index].data; -#ifdef DEBUG_PUSH - printf("value loaded: %s\n", value); -#endif - } - } - continue; -progress: - progress = 1; - continue; - } - if (exec->status == 0) { - return(exec->state->type == XML_REGEXP_FINAL_STATE); - } -#ifdef DEBUG_ERR - if (exec->status < 0) { - testerr(exec); - } -#endif - return(exec->status); -} - -/** - * xmlRegExecPushString: - * @exec: a regexp execution context or NULL to indicate the end - * @value: a string token input - * @data: data associated to the token to reuse in callbacks - * - * Push one input token in the execution context - * - * Returns: 1 if the regexp reached a final state, 0 if non-final, and - * a negative value in case of error. - */ -int -xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, - void *data) { - return(xmlRegExecPushStringInternal(exec, value, data, 0)); -} - -/** - * xmlRegExecPushString2: - * @exec: a regexp execution context or NULL to indicate the end - * @value: the first string token input - * @value2: the second string token input - * @data: data associated to the token to reuse in callbacks - * - * Push one input token in the execution context - * - * Returns: 1 if the regexp reached a final state, 0 if non-final, and - * a negative value in case of error. - */ -int -xmlRegExecPushString2(xmlRegExecCtxtPtr exec, const xmlChar *value, - const xmlChar *value2, void *data) { - xmlChar buf[150]; - int lenn, lenp, ret; - xmlChar *str; - - if (exec == NULL) - return(-1); - if (exec->comp == NULL) - return(-1); - if (exec->status != 0) - return(exec->status); - - if (value2 == NULL) - return(xmlRegExecPushString(exec, value, data)); - - lenn = strlen((char *) value2); - lenp = strlen((char *) value); - - if (150 < lenn + lenp + 2) { - str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); - if (str == NULL) { - exec->status = -1; - return(-1); - } - } else { - str = buf; - } - memcpy(&str[0], value, lenp); - str[lenp] = XML_REG_STRING_SEPARATOR; - memcpy(&str[lenp + 1], value2, lenn); - str[lenn + lenp + 1] = 0; - - if (exec->comp->compact != NULL) - ret = xmlRegCompactPushString(exec, exec->comp, str, data); - else - ret = xmlRegExecPushStringInternal(exec, str, data, 1); - - if (str != buf) - xmlFree(str); - return(ret); -} - -/** - * xmlRegExecGetValues: - * @exec: a regexp execution context - * @err: error extraction or normal one - * @nbval: pointer to the number of accepted values IN/OUT - * @nbneg: return number of negative transitions - * @values: pointer to the array of acceptable values - * @terminal: return value if this was a terminal state - * - * Extract informations from the regexp execution, internal routine to - * implement xmlRegExecNextValues() and xmlRegExecErrInfo() - * - * Returns: 0 in case of success or -1 in case of error. - */ -static int -xmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, - int *nbval, int *nbneg, - xmlChar **values, int *terminal) { - int maxval; - int nb = 0; - - if ((exec == NULL) || (nbval == NULL) || (nbneg == NULL) || - (values == NULL) || (*nbval <= 0)) - return(-1); - - maxval = *nbval; - *nbval = 0; - *nbneg = 0; - if ((exec->comp != NULL) && (exec->comp->compact != NULL)) { - xmlRegexpPtr comp; - int target, i, state; - - comp = exec->comp; - - if (err) { - if (exec->errStateNo == -1) return(-1); - state = exec->errStateNo; - } else { - state = exec->index; - } - if (terminal != NULL) { - if (comp->compact[state * (comp->nbstrings + 1)] == - XML_REGEXP_FINAL_STATE) - *terminal = 1; - else - *terminal = 0; - } - for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { - target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; - if ((target > 0) && (target <= comp->nbstates) && - (comp->compact[(target - 1) * (comp->nbstrings + 1)] != - XML_REGEXP_SINK_STATE)) { - values[nb++] = comp->stringMap[i]; - (*nbval)++; - } - } - for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { - target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; - if ((target > 0) && (target <= comp->nbstates) && - (comp->compact[(target - 1) * (comp->nbstrings + 1)] == - XML_REGEXP_SINK_STATE)) { - values[nb++] = comp->stringMap[i]; - (*nbneg)++; - } - } - } else { - int transno; - xmlRegTransPtr trans; - xmlRegAtomPtr atom; - xmlRegStatePtr state; - - if (terminal != NULL) { - if (exec->state->type == XML_REGEXP_FINAL_STATE) - *terminal = 1; - else - *terminal = 0; - } - - if (err) { - if (exec->errState == NULL) return(-1); - state = exec->errState; - } else { - if (exec->state == NULL) return(-1); - state = exec->state; - } - for (transno = 0; - (transno < state->nbTrans) && (nb < maxval); - transno++) { - trans = &state->trans[transno]; - if (trans->to < 0) - continue; - atom = trans->atom; - if ((atom == NULL) || (atom->valuep == NULL)) - continue; - if (trans->count == REGEXP_ALL_LAX_COUNTER) { - /* this should not be reached but ... */ - TODO; - } else if (trans->count == REGEXP_ALL_COUNTER) { - /* this should not be reached but ... */ - TODO; - } else if (trans->counter >= 0) { - xmlRegCounterPtr counter = NULL; - int count; - - if (err) - count = exec->errCounts[trans->counter]; - else - count = exec->counts[trans->counter]; - if (exec->comp != NULL) - counter = &exec->comp->counters[trans->counter]; - if ((counter == NULL) || (count < counter->max)) { - if (atom->neg) - values[nb++] = (xmlChar *) atom->valuep2; - else - values[nb++] = (xmlChar *) atom->valuep; - (*nbval)++; - } - } else { - if ((exec->comp->states[trans->to] != NULL) && - (exec->comp->states[trans->to]->type != - XML_REGEXP_SINK_STATE)) { - if (atom->neg) - values[nb++] = (xmlChar *) atom->valuep2; - else - values[nb++] = (xmlChar *) atom->valuep; - (*nbval)++; - } - } - } - for (transno = 0; - (transno < state->nbTrans) && (nb < maxval); - transno++) { - trans = &state->trans[transno]; - if (trans->to < 0) - continue; - atom = trans->atom; - if ((atom == NULL) || (atom->valuep == NULL)) - continue; - if (trans->count == REGEXP_ALL_LAX_COUNTER) { - continue; - } else if (trans->count == REGEXP_ALL_COUNTER) { - continue; - } else if (trans->counter >= 0) { - continue; - } else { - if ((exec->comp->states[trans->to] != NULL) && - (exec->comp->states[trans->to]->type == - XML_REGEXP_SINK_STATE)) { - if (atom->neg) - values[nb++] = (xmlChar *) atom->valuep2; - else - values[nb++] = (xmlChar *) atom->valuep; - (*nbneg)++; - } - } - } - } - return(0); -} - -/** - * xmlRegExecNextValues: - * @exec: a regexp execution context - * @nbval: pointer to the number of accepted values IN/OUT - * @nbneg: return number of negative transitions - * @values: pointer to the array of acceptable values - * @terminal: return value if this was a terminal state - * - * Extract informations from the regexp execution, - * the parameter @values must point to an array of @nbval string pointers - * on return nbval will contain the number of possible strings in that - * state and the @values array will be updated with them. The string values - * returned will be freed with the @exec context and don't need to be - * deallocated. - * - * Returns: 0 in case of success or -1 in case of error. - */ -int -xmlRegExecNextValues(xmlRegExecCtxtPtr exec, int *nbval, int *nbneg, - xmlChar **values, int *terminal) { - return(xmlRegExecGetValues(exec, 0, nbval, nbneg, values, terminal)); -} - -/** - * xmlRegExecErrInfo: - * @exec: a regexp execution context generating an error - * @string: return value for the error string - * @nbval: pointer to the number of accepted values IN/OUT - * @nbneg: return number of negative transitions - * @values: pointer to the array of acceptable values - * @terminal: return value if this was a terminal state - * - * Extract error informations from the regexp execution, the parameter - * @string will be updated with the value pushed and not accepted, - * the parameter @values must point to an array of @nbval string pointers - * on return nbval will contain the number of possible strings in that - * state and the @values array will be updated with them. The string values - * returned will be freed with the @exec context and don't need to be - * deallocated. - * - * Returns: 0 in case of success or -1 in case of error. - */ -int -xmlRegExecErrInfo(xmlRegExecCtxtPtr exec, const xmlChar **string, - int *nbval, int *nbneg, xmlChar **values, int *terminal) { - if (exec == NULL) - return(-1); - if (string != NULL) { - if (exec->status != 0) - *string = exec->errString; - else - *string = NULL; - } - return(xmlRegExecGetValues(exec, 1, nbval, nbneg, values, terminal)); -} - -#ifdef DEBUG_ERR -static void testerr(xmlRegExecCtxtPtr exec) { - const xmlChar *string; - xmlChar *values[5]; - int nb = 5; - int nbneg; - int terminal; - xmlRegExecErrInfo(exec, &string, &nb, &nbneg, &values[0], &terminal); -} -#endif - -#if 0 -static int -xmlRegExecPushChar(xmlRegExecCtxtPtr exec, int UCS) { - xmlRegTransPtr trans; - xmlRegAtomPtr atom; - int ret; - int codepoint, len; - - if (exec == NULL) - return(-1); - if (exec->status != 0) - return(exec->status); - - while ((exec->status == 0) && - ((exec->inputString[exec->index] != 0) || - (exec->state->type != XML_REGEXP_FINAL_STATE))) { - - /* - * End of input on non-terminal state, rollback, however we may - * still have epsilon like transition for counted transitions - * on counters, in that case don't break too early. - */ - if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) - goto rollback; - - exec->transcount = 0; - for (;exec->transno < exec->state->nbTrans;exec->transno++) { - trans = &exec->state->trans[exec->transno]; - if (trans->to < 0) - continue; - atom = trans->atom; - ret = 0; - if (trans->count >= 0) { - int count; - xmlRegCounterPtr counter; - - /* - * A counted transition. - */ - - count = exec->counts[trans->count]; - counter = &exec->comp->counters[trans->count]; -#ifdef DEBUG_REGEXP_EXEC - printf("testing count %d: val %d, min %d, max %d\n", - trans->count, count, counter->min, counter->max); -#endif - ret = ((count >= counter->min) && (count <= counter->max)); - } else if (atom == NULL) { - fprintf(stderr, "epsilon transition left at runtime\n"); - exec->status = -2; - break; - } else if (exec->inputString[exec->index] != 0) { - codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); - ret = xmlRegCheckCharacter(atom, codepoint); - if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { - xmlRegStatePtr to = exec->comp->states[trans->to]; - - /* - * this is a multiple input sequence - */ - if (exec->state->nbTrans > exec->transno + 1) { - xmlFARegExecSave(exec); - } - exec->transcount = 1; - do { - /* - * Try to progress as much as possible on the input - */ - if (exec->transcount == atom->max) { - break; - } - exec->index += len; - /* - * End of input: stop here - */ - if (exec->inputString[exec->index] == 0) { - exec->index -= len; - break; - } - if (exec->transcount >= atom->min) { - int transno = exec->transno; - xmlRegStatePtr state = exec->state; - - /* - * The transition is acceptable save it - */ - exec->transno = -1; /* trick */ - exec->state = to; - xmlFARegExecSave(exec); - exec->transno = transno; - exec->state = state; - } - codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), - len); - ret = xmlRegCheckCharacter(atom, codepoint); - exec->transcount++; - } while (ret == 1); - if (exec->transcount < atom->min) - ret = 0; - - /* - * If the last check failed but one transition was found - * possible, rollback - */ - if (ret < 0) - ret = 0; - if (ret == 0) { - goto rollback; - } - } - } - if (ret == 1) { - if (exec->state->nbTrans > exec->transno + 1) { - xmlFARegExecSave(exec); - } - /* - * restart count for expressions like this ((abc){2})* - */ - if (trans->count >= 0) { -#ifdef DEBUG_REGEXP_EXEC - printf("Reset count %d\n", trans->count); -#endif - exec->counts[trans->count] = 0; - } - if (trans->counter >= 0) { -#ifdef DEBUG_REGEXP_EXEC - printf("Increasing count %d\n", trans->counter); -#endif - exec->counts[trans->counter]++; - } -#ifdef DEBUG_REGEXP_EXEC - printf("entering state %d\n", trans->to); -#endif - exec->state = exec->comp->states[trans->to]; - exec->transno = 0; - if (trans->atom != NULL) { - exec->index += len; - } - goto progress; - } else if (ret < 0) { - exec->status = -4; - break; - } - } - if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { -rollback: - /* - * Failed to find a way out - */ - exec->determinist = 0; - xmlFARegExecRollBack(exec); - } -progress: - continue; - } -} -#endif -/************************************************************************ - * * - * Parser for the Schemas Datatype Regular Expressions * - * http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#regexs * - * * - ************************************************************************/ - -/** - * xmlFAIsChar: - * @ctxt: a regexp parser context - * - * [10] Char ::= [^.\?*+()|#x5B#x5D] - */ -static int -xmlFAIsChar(xmlRegParserCtxtPtr ctxt) { - int cur; - int len; - - cur = CUR_SCHAR(ctxt->cur, len); - if ((cur == '.') || (cur == '\\') || (cur == '?') || - (cur == '*') || (cur == '+') || (cur == '(') || - (cur == ')') || (cur == '|') || (cur == 0x5B) || - (cur == 0x5D) || (cur == 0)) - return(-1); - return(cur); -} - -/** - * xmlFAParseCharProp: - * @ctxt: a regexp parser context - * - * [27] charProp ::= IsCategory | IsBlock - * [28] IsCategory ::= Letters | Marks | Numbers | Punctuation | - * Separators | Symbols | Others - * [29] Letters ::= 'L' [ultmo]? - * [30] Marks ::= 'M' [nce]? - * [31] Numbers ::= 'N' [dlo]? - * [32] Punctuation ::= 'P' [cdseifo]? - * [33] Separators ::= 'Z' [slp]? - * [34] Symbols ::= 'S' [mcko]? - * [35] Others ::= 'C' [cfon]? - * [36] IsBlock ::= 'Is' [a-zA-Z0-9#x2D]+ - */ -static void -xmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { - int cur; - xmlRegAtomType type = (xmlRegAtomType) 0; - xmlChar *blockName = NULL; - - cur = CUR; - if (cur == 'L') { - NEXT; - cur = CUR; - if (cur == 'u') { - NEXT; - type = XML_REGEXP_LETTER_UPPERCASE; - } else if (cur == 'l') { - NEXT; - type = XML_REGEXP_LETTER_LOWERCASE; - } else if (cur == 't') { - NEXT; - type = XML_REGEXP_LETTER_TITLECASE; - } else if (cur == 'm') { - NEXT; - type = XML_REGEXP_LETTER_MODIFIER; - } else if (cur == 'o') { - NEXT; - type = XML_REGEXP_LETTER_OTHERS; - } else { - type = XML_REGEXP_LETTER; - } - } else if (cur == 'M') { - NEXT; - cur = CUR; - if (cur == 'n') { - NEXT; - /* nonspacing */ - type = XML_REGEXP_MARK_NONSPACING; - } else if (cur == 'c') { - NEXT; - /* spacing combining */ - type = XML_REGEXP_MARK_SPACECOMBINING; - } else if (cur == 'e') { - NEXT; - /* enclosing */ - type = XML_REGEXP_MARK_ENCLOSING; - } else { - /* all marks */ - type = XML_REGEXP_MARK; - } - } else if (cur == 'N') { - NEXT; - cur = CUR; - if (cur == 'd') { - NEXT; - /* digital */ - type = XML_REGEXP_NUMBER_DECIMAL; - } else if (cur == 'l') { - NEXT; - /* letter */ - type = XML_REGEXP_NUMBER_LETTER; - } else if (cur == 'o') { - NEXT; - /* other */ - type = XML_REGEXP_NUMBER_OTHERS; - } else { - /* all numbers */ - type = XML_REGEXP_NUMBER; - } - } else if (cur == 'P') { - NEXT; - cur = CUR; - if (cur == 'c') { - NEXT; - /* connector */ - type = XML_REGEXP_PUNCT_CONNECTOR; - } else if (cur == 'd') { - NEXT; - /* dash */ - type = XML_REGEXP_PUNCT_DASH; - } else if (cur == 's') { - NEXT; - /* open */ - type = XML_REGEXP_PUNCT_OPEN; - } else if (cur == 'e') { - NEXT; - /* close */ - type = XML_REGEXP_PUNCT_CLOSE; - } else if (cur == 'i') { - NEXT; - /* initial quote */ - type = XML_REGEXP_PUNCT_INITQUOTE; - } else if (cur == 'f') { - NEXT; - /* final quote */ - type = XML_REGEXP_PUNCT_FINQUOTE; - } else if (cur == 'o') { - NEXT; - /* other */ - type = XML_REGEXP_PUNCT_OTHERS; - } else { - /* all punctuation */ - type = XML_REGEXP_PUNCT; - } - } else if (cur == 'Z') { - NEXT; - cur = CUR; - if (cur == 's') { - NEXT; - /* space */ - type = XML_REGEXP_SEPAR_SPACE; - } else if (cur == 'l') { - NEXT; - /* line */ - type = XML_REGEXP_SEPAR_LINE; - } else if (cur == 'p') { - NEXT; - /* paragraph */ - type = XML_REGEXP_SEPAR_PARA; - } else { - /* all separators */ - type = XML_REGEXP_SEPAR; - } - } else if (cur == 'S') { - NEXT; - cur = CUR; - if (cur == 'm') { - NEXT; - type = XML_REGEXP_SYMBOL_MATH; - /* math */ - } else if (cur == 'c') { - NEXT; - type = XML_REGEXP_SYMBOL_CURRENCY; - /* currency */ - } else if (cur == 'k') { - NEXT; - type = XML_REGEXP_SYMBOL_MODIFIER; - /* modifiers */ - } else if (cur == 'o') { - NEXT; - type = XML_REGEXP_SYMBOL_OTHERS; - /* other */ - } else { - /* all symbols */ - type = XML_REGEXP_SYMBOL; - } - } else if (cur == 'C') { - NEXT; - cur = CUR; - if (cur == 'c') { - NEXT; - /* control */ - type = XML_REGEXP_OTHER_CONTROL; - } else if (cur == 'f') { - NEXT; - /* format */ - type = XML_REGEXP_OTHER_FORMAT; - } else if (cur == 'o') { - NEXT; - /* private use */ - type = XML_REGEXP_OTHER_PRIVATE; - } else if (cur == 'n') { - NEXT; - /* not assigned */ - type = XML_REGEXP_OTHER_NA; - } else { - /* all others */ - type = XML_REGEXP_OTHER; - } - } else if (cur == 'I') { - const xmlChar *start; - NEXT; - cur = CUR; - if (cur != 's') { - ERROR("IsXXXX expected"); - return; - } - NEXT; - start = ctxt->cur; - cur = CUR; - if (((cur >= 'a') && (cur <= 'z')) || - ((cur >= 'A') && (cur <= 'Z')) || - ((cur >= '0') && (cur <= '9')) || - (cur == 0x2D)) { - NEXT; - cur = CUR; - while (((cur >= 'a') && (cur <= 'z')) || - ((cur >= 'A') && (cur <= 'Z')) || - ((cur >= '0') && (cur <= '9')) || - (cur == 0x2D)) { - NEXT; - cur = CUR; - } - } - type = XML_REGEXP_BLOCK_NAME; - blockName = xmlStrndup(start, ctxt->cur - start); - } else { - ERROR("Unknown char property"); - return; - } - if (ctxt->atom == NULL) { - ctxt->atom = xmlRegNewAtom(ctxt, type); - if (ctxt->atom != NULL) - ctxt->atom->valuep = blockName; - } else if (ctxt->atom->type == XML_REGEXP_RANGES) { - xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, - type, 0, 0, blockName); - } -} - -/** - * xmlFAParseCharClassEsc: - * @ctxt: a regexp parser context - * - * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc ) - * [24] SingleCharEsc ::= '\' [nrt\|.?*+(){}#x2D#x5B#x5D#x5E] - * [25] catEsc ::= '\p{' charProp '}' - * [26] complEsc ::= '\P{' charProp '}' - * [37] MultiCharEsc ::= '.' | ('\' [sSiIcCdDwW]) - */ -static void -xmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) { - int cur; - - if (CUR == '.') { - if (ctxt->atom == NULL) { - ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_ANYCHAR); - } else if (ctxt->atom->type == XML_REGEXP_RANGES) { - xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, - XML_REGEXP_ANYCHAR, 0, 0, NULL); - } - NEXT; - return; - } - if (CUR != '\\') { - ERROR("Escaped sequence: expecting \\"); - return; - } - NEXT; - cur = CUR; - if (cur == 'p') { - NEXT; - if (CUR != '{') { - ERROR("Expecting '{'"); - return; - } - NEXT; - xmlFAParseCharProp(ctxt); - if (CUR != '}') { - ERROR("Expecting '}'"); - return; - } - NEXT; - } else if (cur == 'P') { - NEXT; - if (CUR != '{') { - ERROR("Expecting '{'"); - return; - } - NEXT; - xmlFAParseCharProp(ctxt); - ctxt->atom->neg = 1; - if (CUR != '}') { - ERROR("Expecting '}'"); - return; - } - NEXT; - } else if ((cur == 'n') || (cur == 'r') || (cur == 't') || (cur == '\\') || - (cur == '|') || (cur == '.') || (cur == '?') || (cur == '*') || - (cur == '+') || (cur == '(') || (cur == ')') || (cur == '{') || - (cur == '}') || (cur == 0x2D) || (cur == 0x5B) || (cur == 0x5D) || - (cur == 0x5E)) { - if (ctxt->atom == NULL) { - ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); - if (ctxt->atom != NULL) { - switch (cur) { - case 'n': - ctxt->atom->codepoint = '\n'; - break; - case 'r': - ctxt->atom->codepoint = '\r'; - break; - case 't': - ctxt->atom->codepoint = '\t'; - break; - default: - ctxt->atom->codepoint = cur; - } - } - } else if (ctxt->atom->type == XML_REGEXP_RANGES) { - xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, - XML_REGEXP_CHARVAL, cur, cur, NULL); - } - NEXT; - } else if ((cur == 's') || (cur == 'S') || (cur == 'i') || (cur == 'I') || - (cur == 'c') || (cur == 'C') || (cur == 'd') || (cur == 'D') || - (cur == 'w') || (cur == 'W')) { - xmlRegAtomType type = XML_REGEXP_ANYSPACE; - - switch (cur) { - case 's': - type = XML_REGEXP_ANYSPACE; - break; - case 'S': - type = XML_REGEXP_NOTSPACE; - break; - case 'i': - type = XML_REGEXP_INITNAME; - break; - case 'I': - type = XML_REGEXP_NOTINITNAME; - break; - case 'c': - type = XML_REGEXP_NAMECHAR; - break; - case 'C': - type = XML_REGEXP_NOTNAMECHAR; - break; - case 'd': - type = XML_REGEXP_DECIMAL; - break; - case 'D': - type = XML_REGEXP_NOTDECIMAL; - break; - case 'w': - type = XML_REGEXP_REALCHAR; - break; - case 'W': - type = XML_REGEXP_NOTREALCHAR; - break; - } - NEXT; - if (ctxt->atom == NULL) { - ctxt->atom = xmlRegNewAtom(ctxt, type); - } else if (ctxt->atom->type == XML_REGEXP_RANGES) { - xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, - type, 0, 0, NULL); - } - } -} - -/** - * xmlFAParseCharRef: - * @ctxt: a regexp parser context - * - * [19] XmlCharRef ::= ( '&#' [0-9]+ ';' ) | (' &#x' [0-9a-fA-F]+ ';' ) - */ -static int -xmlFAParseCharRef(xmlRegParserCtxtPtr ctxt) { - int ret = 0, cur; - - if ((CUR != '&') || (NXT(1) != '#')) - return(-1); - NEXT; - NEXT; - cur = CUR; - if (cur == 'x') { - NEXT; - cur = CUR; - if (((cur >= '0') && (cur <= '9')) || - ((cur >= 'a') && (cur <= 'f')) || - ((cur >= 'A') && (cur <= 'F'))) { - while (((cur >= '0') && (cur <= '9')) || - ((cur >= 'a') && (cur <= 'f')) || - ((cur >= 'A') && (cur <= 'F'))) { - if ((cur >= '0') && (cur <= '9')) - ret = ret * 16 + cur - '0'; - else if ((cur >= 'a') && (cur <= 'f')) - ret = ret * 16 + 10 + (cur - 'a'); - else - ret = ret * 16 + 10 + (cur - 'A'); - NEXT; - cur = CUR; - } - } else { - ERROR("Char ref: expecting [0-9A-F]"); - return(-1); - } - } else { - if ((cur >= '0') && (cur <= '9')) { - while ((cur >= '0') && (cur <= '9')) { - ret = ret * 10 + cur - '0'; - NEXT; - cur = CUR; - } - } else { - ERROR("Char ref: expecting [0-9]"); - return(-1); - } - } - if (cur != ';') { - ERROR("Char ref: expecting ';'"); - return(-1); - } else { - NEXT; - } - return(ret); -} - -/** - * xmlFAParseCharRange: - * @ctxt: a regexp parser context - * - * [17] charRange ::= seRange | XmlCharRef | XmlCharIncDash - * [18] seRange ::= charOrEsc '-' charOrEsc - * [20] charOrEsc ::= XmlChar | SingleCharEsc - * [21] XmlChar ::= [^\#x2D#x5B#x5D] - * [22] XmlCharIncDash ::= [^\#x5B#x5D] - */ -static void -xmlFAParseCharRange(xmlRegParserCtxtPtr ctxt) { - int cur, len; - int start = -1; - int end = -1; - - if (CUR == '\0') { - ERROR("Expecting ']'"); - return; - } - - if ((CUR == '&') && (NXT(1) == '#')) { - end = start = xmlFAParseCharRef(ctxt); - xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, - XML_REGEXP_CHARVAL, start, end, NULL); - return; - } - cur = CUR; - if (cur == '\\') { - NEXT; - cur = CUR; - switch (cur) { - case 'n': start = 0xA; break; - case 'r': start = 0xD; break; - case 't': start = 0x9; break; - case '\\': case '|': case '.': case '-': case '^': case '?': - case '*': case '+': case '{': case '}': case '(': case ')': - case '[': case ']': - start = cur; break; - default: - ERROR("Invalid escape value"); - return; - } - end = start; - len = 1; - } else if ((cur != 0x5B) && (cur != 0x5D)) { - end = start = CUR_SCHAR(ctxt->cur, len); - } else { - ERROR("Expecting a char range"); - return; - } - NEXTL(len); - if (start == '-') { - return; - } - cur = CUR; - if ((cur != '-') || (NXT(1) == ']')) { - xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, - XML_REGEXP_CHARVAL, start, end, NULL); - return; - } - NEXT; - cur = CUR; - if (cur == '\\') { - NEXT; - cur = CUR; - switch (cur) { - case 'n': end = 0xA; break; - case 'r': end = 0xD; break; - case 't': end = 0x9; break; - case '\\': case '|': case '.': case '-': case '^': case '?': - case '*': case '+': case '{': case '}': case '(': case ')': - case '[': case ']': - end = cur; break; - default: - ERROR("Invalid escape value"); - return; - } - len = 1; - } else if ((cur != 0x5B) && (cur != 0x5D)) { - end = CUR_SCHAR(ctxt->cur, len); - } else { - ERROR("Expecting the end of a char range"); - return; - } - NEXTL(len); - /* TODO check that the values are acceptable character ranges for XML */ - if (end < start) { - ERROR("End of range is before start of range"); - } else { - xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, - XML_REGEXP_CHARVAL, start, end, NULL); - } - return; -} - -/** - * xmlFAParsePosCharGroup: - * @ctxt: a regexp parser context - * - * [14] posCharGroup ::= ( charRange | charClassEsc )+ - */ -static void -xmlFAParsePosCharGroup(xmlRegParserCtxtPtr ctxt) { - do { - if ((CUR == '\\') || (CUR == '.')) { - xmlFAParseCharClassEsc(ctxt); - } else { - xmlFAParseCharRange(ctxt); - } - } while ((CUR != ']') && (CUR != '^') && (CUR != '-') && - (CUR != 0) && (ctxt->error == 0)); -} - -/** - * xmlFAParseCharGroup: - * @ctxt: a regexp parser context - * - * [13] charGroup ::= posCharGroup | negCharGroup | charClassSub - * [15] negCharGroup ::= '^' posCharGroup - * [16] charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr - * [12] charClassExpr ::= '[' charGroup ']' - */ -static void -xmlFAParseCharGroup(xmlRegParserCtxtPtr ctxt) { - int n = ctxt->neg; - while ((CUR != ']') && (ctxt->error == 0)) { - if (CUR == '^') { - int neg = ctxt->neg; - - NEXT; - ctxt->neg = !ctxt->neg; - xmlFAParsePosCharGroup(ctxt); - ctxt->neg = neg; - } else if ((CUR == '-') && (NXT(1) == '[')) { - int neg = ctxt->neg; - ctxt->neg = 2; - NEXT; /* eat the '-' */ - NEXT; /* eat the '[' */ - xmlFAParseCharGroup(ctxt); - if (CUR == ']') { - NEXT; - } else { - ERROR("charClassExpr: ']' expected"); - break; - } - ctxt->neg = neg; - break; - } else if (CUR != ']') { - xmlFAParsePosCharGroup(ctxt); - } - } - ctxt->neg = n; -} - -/** - * xmlFAParseCharClass: - * @ctxt: a regexp parser context - * - * [11] charClass ::= charClassEsc | charClassExpr - * [12] charClassExpr ::= '[' charGroup ']' - */ -static void -xmlFAParseCharClass(xmlRegParserCtxtPtr ctxt) { - if (CUR == '[') { - NEXT; - ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_RANGES); - if (ctxt->atom == NULL) - return; - xmlFAParseCharGroup(ctxt); - if (CUR == ']') { - NEXT; - } else { - ERROR("xmlFAParseCharClass: ']' expected"); - } - } else { - xmlFAParseCharClassEsc(ctxt); - } -} - -/** - * xmlFAParseQuantExact: - * @ctxt: a regexp parser context - * - * [8] QuantExact ::= [0-9]+ - * - * Returns 0 if success or -1 in case of error - */ -static int -xmlFAParseQuantExact(xmlRegParserCtxtPtr ctxt) { - int ret = 0; - int ok = 0; - - while ((CUR >= '0') && (CUR <= '9')) { - ret = ret * 10 + (CUR - '0'); - ok = 1; - NEXT; - } - if (ok != 1) { - return(-1); - } - return(ret); -} - -/** - * xmlFAParseQuantifier: - * @ctxt: a regexp parser context - * - * [4] quantifier ::= [?*+] | ( '{' quantity '}' ) - * [5] quantity ::= quantRange | quantMin | QuantExact - * [6] quantRange ::= QuantExact ',' QuantExact - * [7] quantMin ::= QuantExact ',' - * [8] QuantExact ::= [0-9]+ - */ -static int -xmlFAParseQuantifier(xmlRegParserCtxtPtr ctxt) { - int cur; - - cur = CUR; - if ((cur == '?') || (cur == '*') || (cur == '+')) { - if (ctxt->atom != NULL) { - if (cur == '?') - ctxt->atom->quant = XML_REGEXP_QUANT_OPT; - else if (cur == '*') - ctxt->atom->quant = XML_REGEXP_QUANT_MULT; - else if (cur == '+') - ctxt->atom->quant = XML_REGEXP_QUANT_PLUS; - } - NEXT; - return(1); - } - if (cur == '{') { - int min = 0, max = 0; - - NEXT; - cur = xmlFAParseQuantExact(ctxt); - if (cur >= 0) - min = cur; - if (CUR == ',') { - NEXT; - if (CUR == '}') - max = INT_MAX; - else { - cur = xmlFAParseQuantExact(ctxt); - if (cur >= 0) - max = cur; - else { - ERROR("Improper quantifier"); - } - } - } - if (CUR == '}') { - NEXT; - } else { - ERROR("Unterminated quantifier"); - } - if (max == 0) - max = min; - if (ctxt->atom != NULL) { - ctxt->atom->quant = XML_REGEXP_QUANT_RANGE; - ctxt->atom->min = min; - ctxt->atom->max = max; - } - return(1); - } - return(0); -} - -/** - * xmlFAParseAtom: - * @ctxt: a regexp parser context - * - * [9] atom ::= Char | charClass | ( '(' regExp ')' ) - */ -static int -xmlFAParseAtom(xmlRegParserCtxtPtr ctxt) { - int codepoint, len; - - codepoint = xmlFAIsChar(ctxt); - if (codepoint > 0) { - ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); - if (ctxt->atom == NULL) - return(-1); - codepoint = CUR_SCHAR(ctxt->cur, len); - ctxt->atom->codepoint = codepoint; - NEXTL(len); - return(1); - } else if (CUR == '|') { - return(0); - } else if (CUR == 0) { - return(0); - } else if (CUR == ')') { - return(0); - } else if (CUR == '(') { - xmlRegStatePtr start, oldend; - - NEXT; - xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); - start = ctxt->state; - oldend = ctxt->end; - ctxt->end = NULL; - ctxt->atom = NULL; - xmlFAParseRegExp(ctxt, 0); - if (CUR == ')') { - NEXT; - } else { - ERROR("xmlFAParseAtom: expecting ')'"); - } - ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_SUBREG); - if (ctxt->atom == NULL) - return(-1); - ctxt->atom->start = start; - ctxt->atom->stop = ctxt->state; - ctxt->end = oldend; - return(1); - } else if ((CUR == '[') || (CUR == '\\') || (CUR == '.')) { - xmlFAParseCharClass(ctxt); - return(1); - } - return(0); -} - -/** - * xmlFAParsePiece: - * @ctxt: a regexp parser context - * - * [3] piece ::= atom quantifier? - */ -static int -xmlFAParsePiece(xmlRegParserCtxtPtr ctxt) { - int ret; - - ctxt->atom = NULL; - ret = xmlFAParseAtom(ctxt); - if (ret == 0) - return(0); - if (ctxt->atom == NULL) { - ERROR("internal: no atom generated"); - } - xmlFAParseQuantifier(ctxt); - return(1); -} - -/** - * xmlFAParseBranch: - * @ctxt: a regexp parser context - * @to: optional target to the end of the branch - * - * @to is used to optimize by removing duplicate path in automata - * in expressions like (a|b)(c|d) - * - * [2] branch ::= piece* - */ -static int -xmlFAParseBranch(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr to) { - xmlRegStatePtr previous; - int ret; - - previous = ctxt->state; - ret = xmlFAParsePiece(ctxt); - if (ret != 0) { - if (xmlFAGenerateTransitions(ctxt, previous, - (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) - return(-1); - previous = ctxt->state; - ctxt->atom = NULL; - } - while ((ret != 0) && (ctxt->error == 0)) { - ret = xmlFAParsePiece(ctxt); - if (ret != 0) { - if (xmlFAGenerateTransitions(ctxt, previous, - (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) - return(-1); - previous = ctxt->state; - ctxt->atom = NULL; - } - } - return(0); -} - -/** - * xmlFAParseRegExp: - * @ctxt: a regexp parser context - * @top: is this the top-level expression ? - * - * [1] regExp ::= branch ( '|' branch )* - */ -static void -xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) { - xmlRegStatePtr start, end; - - /* if not top start should have been generated by an epsilon trans */ - start = ctxt->state; - ctxt->end = NULL; - xmlFAParseBranch(ctxt, NULL); - if (top) { -#ifdef DEBUG_REGEXP_GRAPH - printf("State %d is final\n", ctxt->state->no); -#endif - ctxt->state->type = XML_REGEXP_FINAL_STATE; - } - if (CUR != '|') { - ctxt->end = ctxt->state; - return; - } - end = ctxt->state; - while ((CUR == '|') && (ctxt->error == 0)) { - NEXT; - ctxt->state = start; - ctxt->end = NULL; - xmlFAParseBranch(ctxt, end); - } - if (!top) { - ctxt->state = end; - ctxt->end = end; - } -} - -/************************************************************************ - * * - * The basic API * - * * - ************************************************************************/ - -/** - * xmlRegexpPrint: - * @output: the file for the output debug - * @regexp: the compiled regexp - * - * Print the content of the compiled regular expression - */ -void -xmlRegexpPrint(FILE *output, xmlRegexpPtr regexp) { - int i; - - if (output == NULL) - return; - fprintf(output, " regexp: "); - if (regexp == NULL) { - fprintf(output, "NULL\n"); - return; - } - fprintf(output, "'%s' ", regexp->string); - fprintf(output, "\n"); - fprintf(output, "%d atoms:\n", regexp->nbAtoms); - for (i = 0;i < regexp->nbAtoms; i++) { - fprintf(output, " %02d ", i); - xmlRegPrintAtom(output, regexp->atoms[i]); - } - fprintf(output, "%d states:", regexp->nbStates); - fprintf(output, "\n"); - for (i = 0;i < regexp->nbStates; i++) { - xmlRegPrintState(output, regexp->states[i]); - } - fprintf(output, "%d counters:\n", regexp->nbCounters); - for (i = 0;i < regexp->nbCounters; i++) { - fprintf(output, " %d: min %d max %d\n", i, regexp->counters[i].min, - regexp->counters[i].max); - } -} - -/** - * xmlRegexpCompile: - * @regexp: a regular expression string - * - * Parses a regular expression conforming to XML Schemas Part 2 Datatype - * Appendix F and builds an automata suitable for testing strings against - * that regular expression - * - * Returns the compiled expression or NULL in case of error - */ -xmlRegexpPtr -xmlRegexpCompile(const xmlChar *regexp) { - xmlRegexpPtr ret; - xmlRegParserCtxtPtr ctxt; - - ctxt = xmlRegNewParserCtxt(regexp); - if (ctxt == NULL) - return(NULL); - - /* initialize the parser */ - ctxt->end = NULL; - ctxt->start = ctxt->state = xmlRegNewState(ctxt); - xmlRegStatePush(ctxt, ctxt->start); - - /* parse the expression building an automata */ - xmlFAParseRegExp(ctxt, 1); - if (CUR != 0) { - ERROR("xmlFAParseRegExp: extra characters"); - } - ctxt->end = ctxt->state; - ctxt->start->type = XML_REGEXP_START_STATE; - ctxt->end->type = XML_REGEXP_FINAL_STATE; - - /* remove the Epsilon except for counted transitions */ - xmlFAEliminateEpsilonTransitions(ctxt); - - - if (ctxt->error != 0) { - xmlRegFreeParserCtxt(ctxt); - return(NULL); - } - ret = xmlRegEpxFromParse(ctxt); - xmlRegFreeParserCtxt(ctxt); - return(ret); -} - -/** - * xmlRegexpExec: - * @comp: the compiled regular expression - * @content: the value to check against the regular expression - * - * Check if the regular expression generates the value - * - * Returns 1 if it matches, 0 if not and a negative value in case of error - */ -int -xmlRegexpExec(xmlRegexpPtr comp, const xmlChar *content) { - if ((comp == NULL) || (content == NULL)) - return(-1); - return(xmlFARegExec(comp, content)); -} - -/** - * xmlRegexpIsDeterminist: - * @comp: the compiled regular expression - * - * Check if the regular expression is determinist - * - * Returns 1 if it yes, 0 if not and a negative value in case of error - */ -int -xmlRegexpIsDeterminist(xmlRegexpPtr comp) { - xmlAutomataPtr am; - int ret; - - if (comp == NULL) - return(-1); - if (comp->determinist != -1) - return(comp->determinist); - - am = xmlNewAutomata(); - if (am->states != NULL) { - int i; - - for (i = 0;i < am->nbStates;i++) - xmlRegFreeState(am->states[i]); - xmlFree(am->states); - } - am->nbAtoms = comp->nbAtoms; - am->atoms = comp->atoms; - am->nbStates = comp->nbStates; - am->states = comp->states; - am->determinist = -1; - ret = xmlFAComputesDeterminism(am); - am->atoms = NULL; - am->states = NULL; - xmlFreeAutomata(am); - return(ret); -} - -/** - * xmlRegFreeRegexp: - * @regexp: the regexp - * - * Free a regexp - */ -void -xmlRegFreeRegexp(xmlRegexpPtr regexp) { - int i; - if (regexp == NULL) - return; - - if (regexp->string != NULL) - xmlFree(regexp->string); - if (regexp->states != NULL) { - for (i = 0;i < regexp->nbStates;i++) - xmlRegFreeState(regexp->states[i]); - xmlFree(regexp->states); - } - if (regexp->atoms != NULL) { - for (i = 0;i < regexp->nbAtoms;i++) - xmlRegFreeAtom(regexp->atoms[i]); - xmlFree(regexp->atoms); - } - if (regexp->counters != NULL) - xmlFree(regexp->counters); - if (regexp->compact != NULL) - xmlFree(regexp->compact); - if (regexp->transdata != NULL) - xmlFree(regexp->transdata); - if (regexp->stringMap != NULL) { - for (i = 0; i < regexp->nbstrings;i++) - xmlFree(regexp->stringMap[i]); - xmlFree(regexp->stringMap); - } - - xmlFree(regexp); -} - -#ifdef LIBXML_AUTOMATA_ENABLED -/************************************************************************ - * * - * The Automata interface * - * * - ************************************************************************/ - -/** - * xmlNewAutomata: - * - * Create a new automata - * - * Returns the new object or NULL in case of failure - */ -xmlAutomataPtr -xmlNewAutomata(void) { - xmlAutomataPtr ctxt; - - ctxt = xmlRegNewParserCtxt(NULL); - if (ctxt == NULL) - return(NULL); - - /* initialize the parser */ - ctxt->end = NULL; - ctxt->start = ctxt->state = xmlRegNewState(ctxt); - if (ctxt->start == NULL) { - xmlFreeAutomata(ctxt); - return(NULL); - } - ctxt->start->type = XML_REGEXP_START_STATE; - if (xmlRegStatePush(ctxt, ctxt->start) < 0) { - xmlRegFreeState(ctxt->start); - xmlFreeAutomata(ctxt); - return(NULL); - } - - return(ctxt); -} - -/** - * xmlFreeAutomata: - * @am: an automata - * - * Free an automata - */ -void -xmlFreeAutomata(xmlAutomataPtr am) { - if (am == NULL) - return; - xmlRegFreeParserCtxt(am); -} - -/** - * xmlAutomataGetInitState: - * @am: an automata - * - * Initial state lookup - * - * Returns the initial state of the automata - */ -xmlAutomataStatePtr -xmlAutomataGetInitState(xmlAutomataPtr am) { - if (am == NULL) - return(NULL); - return(am->start); -} - -/** - * xmlAutomataSetFinalState: - * @am: an automata - * @state: a state in this automata - * - * Makes that state a final state - * - * Returns 0 or -1 in case of error - */ -int -xmlAutomataSetFinalState(xmlAutomataPtr am, xmlAutomataStatePtr state) { - if ((am == NULL) || (state == NULL)) - return(-1); - state->type = XML_REGEXP_FINAL_STATE; - return(0); -} - -/** - * xmlAutomataNewTransition: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @token: the input string associated to that transition - * @data: data passed to the callback function if the transition is activated - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds a transition from the @from state to the target state - * activated by the value of @token - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewTransition(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, const xmlChar *token, - void *data) { - xmlRegAtomPtr atom; - - if ((am == NULL) || (from == NULL) || (token == NULL)) - return(NULL); - atom = xmlRegNewAtom(am, XML_REGEXP_STRING); - if (atom == NULL) - return(NULL); - atom->data = data; - if (atom == NULL) - return(NULL); - atom->valuep = xmlStrdup(token); - - if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { - xmlRegFreeAtom(atom); - return(NULL); - } - if (to == NULL) - return(am->state); - return(to); -} - -/** - * xmlAutomataNewTransition2: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @token: the first input string associated to that transition - * @token2: the second input string associated to that transition - * @data: data passed to the callback function if the transition is activated - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds a transition from the @from state to the target state - * activated by the value of @token - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewTransition2(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, const xmlChar *token, - const xmlChar *token2, void *data) { - xmlRegAtomPtr atom; - - if ((am == NULL) || (from == NULL) || (token == NULL)) - return(NULL); - atom = xmlRegNewAtom(am, XML_REGEXP_STRING); - if (atom == NULL) - return(NULL); - atom->data = data; - if ((token2 == NULL) || (*token2 == 0)) { - atom->valuep = xmlStrdup(token); - } else { - int lenn, lenp; - xmlChar *str; - - lenn = strlen((char *) token2); - lenp = strlen((char *) token); - - str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); - if (str == NULL) { - xmlRegFreeAtom(atom); - return(NULL); - } - memcpy(&str[0], token, lenp); - str[lenp] = '|'; - memcpy(&str[lenp + 1], token2, lenn); - str[lenn + lenp + 1] = 0; - - atom->valuep = str; - } - - if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { - xmlRegFreeAtom(atom); - return(NULL); - } - if (to == NULL) - return(am->state); - return(to); -} - -/** - * xmlAutomataNewNegTrans: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @token: the first input string associated to that transition - * @token2: the second input string associated to that transition - * @data: data passed to the callback function if the transition is activated - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds a transition from the @from state to the target state - * activated by any value except (@token,@token2) - * Note that if @token2 is not NULL, then (X, NULL) won't match to follow - # the semantic of XSD ##other - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewNegTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, const xmlChar *token, - const xmlChar *token2, void *data) { - xmlRegAtomPtr atom; - xmlChar err_msg[200]; - - if ((am == NULL) || (from == NULL) || (token == NULL)) - return(NULL); - atom = xmlRegNewAtom(am, XML_REGEXP_STRING); - if (atom == NULL) - return(NULL); - atom->data = data; - atom->neg = 1; - if ((token2 == NULL) || (*token2 == 0)) { - atom->valuep = xmlStrdup(token); - } else { - int lenn, lenp; - xmlChar *str; - - lenn = strlen((char *) token2); - lenp = strlen((char *) token); - - str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); - if (str == NULL) { - xmlRegFreeAtom(atom); - return(NULL); - } - memcpy(&str[0], token, lenp); - str[lenp] = '|'; - memcpy(&str[lenp + 1], token2, lenn); - str[lenn + lenp + 1] = 0; - - atom->valuep = str; - } - snprintf((char *) err_msg, 199, "not %s", (const char *) atom->valuep); - err_msg[199] = 0; - atom->valuep2 = xmlStrdup(err_msg); - - if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { - xmlRegFreeAtom(atom); - return(NULL); - } - am->negs++; - if (to == NULL) - return(am->state); - return(to); -} - -/** - * xmlAutomataNewCountTrans2: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @token: the input string associated to that transition - * @token2: the second input string associated to that transition - * @min: the minimum successive occurences of token - * @max: the maximum successive occurences of token - * @data: data associated to the transition - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds a transition from the @from state to the target state - * activated by a succession of input of value @token and @token2 and - * whose number is between @min and @max - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewCountTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, const xmlChar *token, - const xmlChar *token2, - int min, int max, void *data) { - xmlRegAtomPtr atom; - int counter; - - if ((am == NULL) || (from == NULL) || (token == NULL)) - return(NULL); - if (min < 0) - return(NULL); - if ((max < min) || (max < 1)) - return(NULL); - atom = xmlRegNewAtom(am, XML_REGEXP_STRING); - if (atom == NULL) - return(NULL); - if ((token2 == NULL) || (*token2 == 0)) { - atom->valuep = xmlStrdup(token); - } else { - int lenn, lenp; - xmlChar *str; - - lenn = strlen((char *) token2); - lenp = strlen((char *) token); - - str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); - if (str == NULL) { - xmlRegFreeAtom(atom); - return(NULL); - } - memcpy(&str[0], token, lenp); - str[lenp] = '|'; - memcpy(&str[lenp + 1], token2, lenn); - str[lenn + lenp + 1] = 0; - - atom->valuep = str; - } - atom->data = data; - if (min == 0) - atom->min = 1; - else - atom->min = min; - atom->max = max; - - /* - * associate a counter to the transition. - */ - counter = xmlRegGetCounter(am); - am->counters[counter].min = min; - am->counters[counter].max = max; - - /* xmlFAGenerateTransitions(am, from, to, atom); */ - if (to == NULL) { - to = xmlRegNewState(am); - xmlRegStatePush(am, to); - } - xmlRegStateAddTrans(am, from, atom, to, counter, -1); - xmlRegAtomPush(am, atom); - am->state = to; - - if (to == NULL) - to = am->state; - if (to == NULL) - return(NULL); - if (min == 0) - xmlFAGenerateEpsilonTransition(am, from, to); - return(to); -} - -/** - * xmlAutomataNewCountTrans: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @token: the input string associated to that transition - * @min: the minimum successive occurences of token - * @max: the maximum successive occurences of token - * @data: data associated to the transition - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds a transition from the @from state to the target state - * activated by a succession of input of value @token and whose number - * is between @min and @max - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewCountTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, const xmlChar *token, - int min, int max, void *data) { - xmlRegAtomPtr atom; - int counter; - - if ((am == NULL) || (from == NULL) || (token == NULL)) - return(NULL); - if (min < 0) - return(NULL); - if ((max < min) || (max < 1)) - return(NULL); - atom = xmlRegNewAtom(am, XML_REGEXP_STRING); - if (atom == NULL) - return(NULL); - atom->valuep = xmlStrdup(token); - atom->data = data; - if (min == 0) - atom->min = 1; - else - atom->min = min; - atom->max = max; - - /* - * associate a counter to the transition. - */ - counter = xmlRegGetCounter(am); - am->counters[counter].min = min; - am->counters[counter].max = max; - - /* xmlFAGenerateTransitions(am, from, to, atom); */ - if (to == NULL) { - to = xmlRegNewState(am); - xmlRegStatePush(am, to); - } - xmlRegStateAddTrans(am, from, atom, to, counter, -1); - xmlRegAtomPush(am, atom); - am->state = to; - - if (to == NULL) - to = am->state; - if (to == NULL) - return(NULL); - if (min == 0) - xmlFAGenerateEpsilonTransition(am, from, to); - return(to); -} - -/** - * xmlAutomataNewOnceTrans2: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @token: the input string associated to that transition - * @token2: the second input string associated to that transition - * @min: the minimum successive occurences of token - * @max: the maximum successive occurences of token - * @data: data associated to the transition - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds a transition from the @from state to the target state - * activated by a succession of input of value @token and @token2 and whose - * number is between @min and @max, moreover that transition can only be - * crossed once. - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewOnceTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, const xmlChar *token, - const xmlChar *token2, - int min, int max, void *data) { - xmlRegAtomPtr atom; - int counter; - - if ((am == NULL) || (from == NULL) || (token == NULL)) - return(NULL); - if (min < 1) - return(NULL); - if ((max < min) || (max < 1)) - return(NULL); - atom = xmlRegNewAtom(am, XML_REGEXP_STRING); - if (atom == NULL) - return(NULL); - if ((token2 == NULL) || (*token2 == 0)) { - atom->valuep = xmlStrdup(token); - } else { - int lenn, lenp; - xmlChar *str; - - lenn = strlen((char *) token2); - lenp = strlen((char *) token); - - str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); - if (str == NULL) { - xmlRegFreeAtom(atom); - return(NULL); - } - memcpy(&str[0], token, lenp); - str[lenp] = '|'; - memcpy(&str[lenp + 1], token2, lenn); - str[lenn + lenp + 1] = 0; - - atom->valuep = str; - } - atom->data = data; - atom->quant = XML_REGEXP_QUANT_ONCEONLY; - atom->min = min; - atom->max = max; - /* - * associate a counter to the transition. - */ - counter = xmlRegGetCounter(am); - am->counters[counter].min = 1; - am->counters[counter].max = 1; - - /* xmlFAGenerateTransitions(am, from, to, atom); */ - if (to == NULL) { - to = xmlRegNewState(am); - xmlRegStatePush(am, to); - } - xmlRegStateAddTrans(am, from, atom, to, counter, -1); - xmlRegAtomPush(am, atom); - am->state = to; - return(to); -} - - - -/** - * xmlAutomataNewOnceTrans: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @token: the input string associated to that transition - * @min: the minimum successive occurences of token - * @max: the maximum successive occurences of token - * @data: data associated to the transition - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds a transition from the @from state to the target state - * activated by a succession of input of value @token and whose number - * is between @min and @max, moreover that transition can only be crossed - * once. - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewOnceTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, const xmlChar *token, - int min, int max, void *data) { - xmlRegAtomPtr atom; - int counter; - - if ((am == NULL) || (from == NULL) || (token == NULL)) - return(NULL); - if (min < 1) - return(NULL); - if ((max < min) || (max < 1)) - return(NULL); - atom = xmlRegNewAtom(am, XML_REGEXP_STRING); - if (atom == NULL) - return(NULL); - atom->valuep = xmlStrdup(token); - atom->data = data; - atom->quant = XML_REGEXP_QUANT_ONCEONLY; - atom->min = min; - atom->max = max; - /* - * associate a counter to the transition. - */ - counter = xmlRegGetCounter(am); - am->counters[counter].min = 1; - am->counters[counter].max = 1; - - /* xmlFAGenerateTransitions(am, from, to, atom); */ - if (to == NULL) { - to = xmlRegNewState(am); - xmlRegStatePush(am, to); - } - xmlRegStateAddTrans(am, from, atom, to, counter, -1); - xmlRegAtomPush(am, atom); - am->state = to; - return(to); -} - -/** - * xmlAutomataNewState: - * @am: an automata - * - * Create a new disconnected state in the automata - * - * Returns the new state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewState(xmlAutomataPtr am) { - xmlAutomataStatePtr to; - - if (am == NULL) - return(NULL); - to = xmlRegNewState(am); - xmlRegStatePush(am, to); - return(to); -} - -/** - * xmlAutomataNewEpsilon: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds an epsilon transition from the @from state to the - * target state - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewEpsilon(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to) { - if ((am == NULL) || (from == NULL)) - return(NULL); - xmlFAGenerateEpsilonTransition(am, from, to); - if (to == NULL) - return(am->state); - return(to); -} - -/** - * xmlAutomataNewAllTrans: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @lax: allow to transition if not all all transitions have been activated - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds a an ALL transition from the @from state to the - * target state. That transition is an epsilon transition allowed only when - * all transitions from the @from node have been activated. - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewAllTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, int lax) { - if ((am == NULL) || (from == NULL)) - return(NULL); - xmlFAGenerateAllTransition(am, from, to, lax); - if (to == NULL) - return(am->state); - return(to); -} - -/** - * xmlAutomataNewCounter: - * @am: an automata - * @min: the minimal value on the counter - * @max: the maximal value on the counter - * - * Create a new counter - * - * Returns the counter number or -1 in case of error - */ -int -xmlAutomataNewCounter(xmlAutomataPtr am, int min, int max) { - int ret; - - if (am == NULL) - return(-1); - - ret = xmlRegGetCounter(am); - if (ret < 0) - return(-1); - am->counters[ret].min = min; - am->counters[ret].max = max; - return(ret); -} - -/** - * xmlAutomataNewCountedTrans: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @counter: the counter associated to that transition - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds an epsilon transition from the @from state to the target state - * which will increment the counter provided - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewCountedTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, int counter) { - if ((am == NULL) || (from == NULL) || (counter < 0)) - return(NULL); - xmlFAGenerateCountedEpsilonTransition(am, from, to, counter); - if (to == NULL) - return(am->state); - return(to); -} - -/** - * xmlAutomataNewCounterTrans: - * @am: an automata - * @from: the starting point of the transition - * @to: the target point of the transition or NULL - * @counter: the counter associated to that transition - * - * If @to is NULL, this creates first a new target state in the automata - * and then adds an epsilon transition from the @from state to the target state - * which will be allowed only if the counter is within the right range. - * - * Returns the target state or NULL in case of error - */ -xmlAutomataStatePtr -xmlAutomataNewCounterTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, int counter) { - if ((am == NULL) || (from == NULL) || (counter < 0)) - return(NULL); - xmlFAGenerateCountedTransition(am, from, to, counter); - if (to == NULL) - return(am->state); - return(to); -} - -/** - * xmlAutomataCompile: - * @am: an automata - * - * Compile the automata into a Reg Exp ready for being executed. - * The automata should be free after this point. - * - * Returns the compiled regexp or NULL in case of error - */ -xmlRegexpPtr -xmlAutomataCompile(xmlAutomataPtr am) { - xmlRegexpPtr ret; - - if ((am == NULL) || (am->error != 0)) return(NULL); - xmlFAEliminateEpsilonTransitions(am); - /* xmlFAComputesDeterminism(am); */ - ret = xmlRegEpxFromParse(am); - - return(ret); -} - -/** - * xmlAutomataIsDeterminist: - * @am: an automata - * - * Checks if an automata is determinist. - * - * Returns 1 if true, 0 if not, and -1 in case of error - */ -int -xmlAutomataIsDeterminist(xmlAutomataPtr am) { - int ret; - - if (am == NULL) - return(-1); - - ret = xmlFAComputesDeterminism(am); - return(ret); -} -#endif /* LIBXML_AUTOMATA_ENABLED */ - -#ifdef LIBXML_EXPR_ENABLED -/************************************************************************ - * * - * Formal Expression handling code * - * * - ************************************************************************/ -/************************************************************************ - * * - * Expression handling context * - * * - ************************************************************************/ - -struct _xmlExpCtxt { - xmlDictPtr dict; - xmlExpNodePtr *table; - int size; - int nbElems; - int nb_nodes; - const char *expr; - const char *cur; - int nb_cons; - int tabSize; -}; - -/** - * xmlExpNewCtxt: - * @maxNodes: the maximum number of nodes - * @dict: optional dictionnary to use internally - * - * Creates a new context for manipulating expressions - * - * Returns the context or NULL in case of error - */ -xmlExpCtxtPtr -xmlExpNewCtxt(int maxNodes, xmlDictPtr dict) { - xmlExpCtxtPtr ret; - int size = 256; - - if (maxNodes <= 4096) - maxNodes = 4096; - - ret = (xmlExpCtxtPtr) xmlMalloc(sizeof(xmlExpCtxt)); - if (ret == NULL) - return(NULL); - memset(ret, 0, sizeof(xmlExpCtxt)); - ret->size = size; - ret->nbElems = 0; - ret->table = xmlMalloc(size * sizeof(xmlExpNodePtr)); - if (ret->table == NULL) { - xmlFree(ret); - return(NULL); - } - memset(ret->table, 0, size * sizeof(xmlExpNodePtr)); - if (dict == NULL) { - ret->dict = xmlDictCreate(); - if (ret->dict == NULL) { - xmlFree(ret->table); - xmlFree(ret); - return(NULL); - } - } else { - ret->dict = dict; - xmlDictReference(ret->dict); - } - return(ret); -} - -/** - * xmlExpFreeCtxt: - * @ctxt: an expression context - * - * Free an expression context - */ -void -xmlExpFreeCtxt(xmlExpCtxtPtr ctxt) { - if (ctxt == NULL) - return; - xmlDictFree(ctxt->dict); - if (ctxt->table != NULL) - xmlFree(ctxt->table); - xmlFree(ctxt); -} - -/************************************************************************ - * * - * Structure associated to an expression node * - * * - ************************************************************************/ -#define MAX_NODES 10000 - -/* #define DEBUG_DERIV */ - -/* - * TODO: - * - Wildcards - * - public API for creation - * - * Started - * - regression testing - * - * Done - * - split into module and test tool - * - memleaks - */ - -typedef enum { - XML_EXP_NILABLE = (1 << 0) -} xmlExpNodeInfo; - -#define IS_NILLABLE(node) ((node)->info & XML_EXP_NILABLE) - -struct _xmlExpNode { - unsigned char type;/* xmlExpNodeType */ - unsigned char info;/* OR of xmlExpNodeInfo */ - unsigned short key; /* the hash key */ - unsigned int ref; /* The number of references */ - int c_max; /* the maximum length it can consume */ - xmlExpNodePtr exp_left; - xmlExpNodePtr next;/* the next node in the hash table or free list */ - union { - struct { - int f_min; - int f_max; - } count; - struct { - xmlExpNodePtr f_right; - } children; - const xmlChar *f_str; - } field; -}; - -#define exp_min field.count.f_min -#define exp_max field.count.f_max -/* #define exp_left field.children.f_left */ -#define exp_right field.children.f_right -#define exp_str field.f_str - -static xmlExpNodePtr xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type); -static xmlExpNode forbiddenExpNode = { - XML_EXP_FORBID, 0, 0, 0, 0, NULL, NULL, {{ 0, 0}} -}; -xmlExpNodePtr forbiddenExp = &forbiddenExpNode; -static xmlExpNode emptyExpNode = { - XML_EXP_EMPTY, 1, 0, 0, 0, NULL, NULL, {{ 0, 0}} -}; -xmlExpNodePtr emptyExp = &emptyExpNode; - -/************************************************************************ - * * - * The custom hash table for unicity and canonicalization * - * of sub-expressions pointers * - * * - ************************************************************************/ -/* - * xmlExpHashNameComputeKey: - * Calculate the hash key for a token - */ -static unsigned short -xmlExpHashNameComputeKey(const xmlChar *name) { - unsigned short value = 0L; - char ch; - - if (name != NULL) { - value += 30 * (*name); - while ((ch = *name++) != 0) { - value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); - } - } - return (value); -} - -/* - * xmlExpHashComputeKey: - * Calculate the hash key for a compound expression - */ -static unsigned short -xmlExpHashComputeKey(xmlExpNodeType type, xmlExpNodePtr left, - xmlExpNodePtr right) { - unsigned long value; - unsigned short ret; - - switch (type) { - case XML_EXP_SEQ: - value = left->key; - value += right->key; - value *= 3; - ret = (unsigned short) value; - break; - case XML_EXP_OR: - value = left->key; - value += right->key; - value *= 7; - ret = (unsigned short) value; - break; - case XML_EXP_COUNT: - value = left->key; - value += right->key; - ret = (unsigned short) value; - break; - default: - ret = 0; - } - return(ret); -} - - -static xmlExpNodePtr -xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type) { - xmlExpNodePtr ret; - - if (ctxt->nb_nodes >= MAX_NODES) - return(NULL); - ret = (xmlExpNodePtr) xmlMalloc(sizeof(xmlExpNode)); - if (ret == NULL) - return(NULL); - memset(ret, 0, sizeof(xmlExpNode)); - ret->type = type; - ret->next = NULL; - ctxt->nb_nodes++; - ctxt->nb_cons++; - return(ret); -} - -/** - * xmlExpHashGetEntry: - * @table: the hash table - * - * Get the unique entry from the hash table. The entry is created if - * needed. @left and @right are consumed, i.e. their ref count will - * be decremented by the operation. - * - * Returns the pointer or NULL in case of error - */ -static xmlExpNodePtr -xmlExpHashGetEntry(xmlExpCtxtPtr ctxt, xmlExpNodeType type, - xmlExpNodePtr left, xmlExpNodePtr right, - const xmlChar *name, int min, int max) { - unsigned short kbase, key; - xmlExpNodePtr entry; - xmlExpNodePtr insert; - - if (ctxt == NULL) - return(NULL); - - /* - * Check for duplicate and insertion location. - */ - if (type == XML_EXP_ATOM) { - kbase = xmlExpHashNameComputeKey(name); - } else if (type == XML_EXP_COUNT) { - /* COUNT reduction rule 1 */ - /* a{1} -> a */ - if (min == max) { - if (min == 1) { - return(left); - } - if (min == 0) { - xmlExpFree(ctxt, left); - return(emptyExp); - } - } - if (min < 0) { - xmlExpFree(ctxt, left); - return(forbiddenExp); - } - if (max == -1) - kbase = min + 79; - else - kbase = max - min; - kbase += left->key; - } else if (type == XML_EXP_OR) { - /* Forbid reduction rules */ - if (left->type == XML_EXP_FORBID) { - xmlExpFree(ctxt, left); - return(right); - } - if (right->type == XML_EXP_FORBID) { - xmlExpFree(ctxt, right); - return(left); - } - - /* OR reduction rule 1 */ - /* a | a reduced to a */ - if (left == right) { - left->ref--; - return(left); - } - /* OR canonicalization rule 1 */ - /* linearize (a | b) | c into a | (b | c) */ - if ((left->type == XML_EXP_OR) && (right->type != XML_EXP_OR)) { - xmlExpNodePtr tmp = left; - left = right; - right = tmp; - } - /* OR reduction rule 2 */ - /* a | (a | b) and b | (a | b) are reduced to a | b */ - if (right->type == XML_EXP_OR) { - if ((left == right->exp_left) || - (left == right->exp_right)) { - xmlExpFree(ctxt, left); - return(right); - } - } - /* OR canonicalization rule 2 */ - /* linearize (a | b) | c into a | (b | c) */ - if (left->type == XML_EXP_OR) { - xmlExpNodePtr tmp; - - /* OR canonicalization rule 2 */ - if ((left->exp_right->type != XML_EXP_OR) && - (left->exp_right->key < left->exp_left->key)) { - tmp = left->exp_right; - left->exp_right = left->exp_left; - left->exp_left = tmp; - } - left->exp_right->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_right, right, - NULL, 0, 0); - left->exp_left->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_left, tmp, - NULL, 0, 0); - - xmlExpFree(ctxt, left); - return(tmp); - } - if (right->type == XML_EXP_OR) { - /* Ordering in the tree */ - /* C | (A | B) -> A | (B | C) */ - if (left->key > right->exp_right->key) { - xmlExpNodePtr tmp; - right->exp_right->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_right, - left, NULL, 0, 0); - right->exp_left->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, - tmp, NULL, 0, 0); - xmlExpFree(ctxt, right); - return(tmp); - } - /* Ordering in the tree */ - /* B | (A | C) -> A | (B | C) */ - if (left->key > right->exp_left->key) { - xmlExpNodePtr tmp; - right->exp_right->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, - right->exp_right, NULL, 0, 0); - right->exp_left->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, - tmp, NULL, 0, 0); - xmlExpFree(ctxt, right); - return(tmp); - } - } - /* we know both types are != XML_EXP_OR here */ - else if (left->key > right->key) { - xmlExpNodePtr tmp = left; - left = right; - right = tmp; - } - kbase = xmlExpHashComputeKey(type, left, right); - } else if (type == XML_EXP_SEQ) { - /* Forbid reduction rules */ - if (left->type == XML_EXP_FORBID) { - xmlExpFree(ctxt, right); - return(left); - } - if (right->type == XML_EXP_FORBID) { - xmlExpFree(ctxt, left); - return(right); - } - /* Empty reduction rules */ - if (right->type == XML_EXP_EMPTY) { - return(left); - } - if (left->type == XML_EXP_EMPTY) { - return(right); - } - kbase = xmlExpHashComputeKey(type, left, right); - } else - return(NULL); - - key = kbase % ctxt->size; - if (ctxt->table[key] != NULL) { - for (insert = ctxt->table[key]; insert != NULL; - insert = insert->next) { - if ((insert->key == kbase) && - (insert->type == type)) { - if (type == XML_EXP_ATOM) { - if (name == insert->exp_str) { - insert->ref++; - return(insert); - } - } else if (type == XML_EXP_COUNT) { - if ((insert->exp_min == min) && (insert->exp_max == max) && - (insert->exp_left == left)) { - insert->ref++; - left->ref--; - return(insert); - } - } else if ((insert->exp_left == left) && - (insert->exp_right == right)) { - insert->ref++; - left->ref--; - right->ref--; - return(insert); - } - } - } - } - - entry = xmlExpNewNode(ctxt, type); - if (entry == NULL) - return(NULL); - entry->key = kbase; - if (type == XML_EXP_ATOM) { - entry->exp_str = name; - entry->c_max = 1; - } else if (type == XML_EXP_COUNT) { - entry->exp_min = min; - entry->exp_max = max; - entry->exp_left = left; - if ((min == 0) || (IS_NILLABLE(left))) - entry->info |= XML_EXP_NILABLE; - if (max < 0) - entry->c_max = -1; - else - entry->c_max = max * entry->exp_left->c_max; - } else { - entry->exp_left = left; - entry->exp_right = right; - if (type == XML_EXP_OR) { - if ((IS_NILLABLE(left)) || (IS_NILLABLE(right))) - entry->info |= XML_EXP_NILABLE; - if ((entry->exp_left->c_max == -1) || - (entry->exp_right->c_max == -1)) - entry->c_max = -1; - else if (entry->exp_left->c_max > entry->exp_right->c_max) - entry->c_max = entry->exp_left->c_max; - else - entry->c_max = entry->exp_right->c_max; - } else { - if ((IS_NILLABLE(left)) && (IS_NILLABLE(right))) - entry->info |= XML_EXP_NILABLE; - if ((entry->exp_left->c_max == -1) || - (entry->exp_right->c_max == -1)) - entry->c_max = -1; - else - entry->c_max = entry->exp_left->c_max + entry->exp_right->c_max; - } - } - entry->ref = 1; - if (ctxt->table[key] != NULL) - entry->next = ctxt->table[key]; - - ctxt->table[key] = entry; - ctxt->nbElems++; - - return(entry); -} - -/** - * xmlExpFree: - * @ctxt: the expression context - * @exp: the expression - * - * Dereference the expression - */ -void -xmlExpFree(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp) { - if ((exp == NULL) || (exp == forbiddenExp) || (exp == emptyExp)) - return; - exp->ref--; - if (exp->ref == 0) { - unsigned short key; - - /* Unlink it first from the hash table */ - key = exp->key % ctxt->size; - if (ctxt->table[key] == exp) { - ctxt->table[key] = exp->next; - } else { - xmlExpNodePtr tmp; - - tmp = ctxt->table[key]; - while (tmp != NULL) { - if (tmp->next == exp) { - tmp->next = exp->next; - break; - } - tmp = tmp->next; - } - } - - if ((exp->type == XML_EXP_SEQ) || (exp->type == XML_EXP_OR)) { - xmlExpFree(ctxt, exp->exp_left); - xmlExpFree(ctxt, exp->exp_right); - } else if (exp->type == XML_EXP_COUNT) { - xmlExpFree(ctxt, exp->exp_left); - } - xmlFree(exp); - ctxt->nb_nodes--; - } -} - -/** - * xmlExpRef: - * @exp: the expression - * - * Increase the reference count of the expression - */ -void -xmlExpRef(xmlExpNodePtr exp) { - if (exp != NULL) - exp->ref++; -} - -/** - * xmlExpNewAtom: - * @ctxt: the expression context - * @name: the atom name - * @len: the atom name length in byte (or -1); - * - * Get the atom associated to this name from that context - * - * Returns the node or NULL in case of error - */ -xmlExpNodePtr -xmlExpNewAtom(xmlExpCtxtPtr ctxt, const xmlChar *name, int len) { - if ((ctxt == NULL) || (name == NULL)) - return(NULL); - name = xmlDictLookup(ctxt->dict, name, len); - if (name == NULL) - return(NULL); - return(xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, name, 0, 0)); -} - -/** - * xmlExpNewOr: - * @ctxt: the expression context - * @left: left expression - * @right: right expression - * - * Get the atom associated to the choice @left | @right - * Note that @left and @right are consumed in the operation, to keep - * an handle on them use xmlExpRef() and use xmlExpFree() to release them, - * this is true even in case of failure (unless ctxt == NULL). - * - * Returns the node or NULL in case of error - */ -xmlExpNodePtr -xmlExpNewOr(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { - if (ctxt == NULL) - return(NULL); - if ((left == NULL) || (right == NULL)) { - xmlExpFree(ctxt, left); - xmlExpFree(ctxt, right); - return(NULL); - } - return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, right, NULL, 0, 0)); -} - -/** - * xmlExpNewSeq: - * @ctxt: the expression context - * @left: left expression - * @right: right expression - * - * Get the atom associated to the sequence @left , @right - * Note that @left and @right are consumed in the operation, to keep - * an handle on them use xmlExpRef() and use xmlExpFree() to release them, - * this is true even in case of failure (unless ctxt == NULL). - * - * Returns the node or NULL in case of error - */ -xmlExpNodePtr -xmlExpNewSeq(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { - if (ctxt == NULL) - return(NULL); - if ((left == NULL) || (right == NULL)) { - xmlExpFree(ctxt, left); - xmlExpFree(ctxt, right); - return(NULL); - } - return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, left, right, NULL, 0, 0)); -} - -/** - * xmlExpNewRange: - * @ctxt: the expression context - * @subset: the expression to be repeated - * @min: the lower bound for the repetition - * @max: the upper bound for the repetition, -1 means infinite - * - * Get the atom associated to the range (@subset){@min, @max} - * Note that @subset is consumed in the operation, to keep - * an handle on it use xmlExpRef() and use xmlExpFree() to release it, - * this is true even in case of failure (unless ctxt == NULL). - * - * Returns the node or NULL in case of error - */ -xmlExpNodePtr -xmlExpNewRange(xmlExpCtxtPtr ctxt, xmlExpNodePtr subset, int min, int max) { - if (ctxt == NULL) - return(NULL); - if ((subset == NULL) || (min < 0) || (max < -1) || - ((max >= 0) && (min > max))) { - xmlExpFree(ctxt, subset); - return(NULL); - } - return(xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, subset, - NULL, NULL, min, max)); -} - -/************************************************************************ - * * - * Public API for operations on expressions * - * * - ************************************************************************/ - -static int -xmlExpGetLanguageInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, - const xmlChar**list, int len, int nb) { - int tmp, tmp2; -tail: - switch (exp->type) { - case XML_EXP_EMPTY: - return(0); - case XML_EXP_ATOM: - for (tmp = 0;tmp < nb;tmp++) - if (list[tmp] == exp->exp_str) - return(0); - if (nb >= len) - return(-2); - list[nb++] = exp->exp_str; - return(1); - case XML_EXP_COUNT: - exp = exp->exp_left; - goto tail; - case XML_EXP_SEQ: - case XML_EXP_OR: - tmp = xmlExpGetLanguageInt(ctxt, exp->exp_left, list, len, nb); - if (tmp < 0) - return(tmp); - tmp2 = xmlExpGetLanguageInt(ctxt, exp->exp_right, list, len, - nb + tmp); - if (tmp2 < 0) - return(tmp2); - return(tmp + tmp2); - } - return(-1); -} - -/** - * xmlExpGetLanguage: - * @ctxt: the expression context - * @exp: the expression - * @langList: where to store the tokens - * @len: the allocated length of @list - * - * Find all the strings used in @exp and store them in @list - * - * Returns the number of unique strings found, -1 in case of errors and - * -2 if there is more than @len strings - */ -int -xmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, - const xmlChar**langList, int len) { - if ((ctxt == NULL) || (exp == NULL) || (langList == NULL) || (len <= 0)) - return(-1); - return(xmlExpGetLanguageInt(ctxt, exp, langList, len, 0)); -} - -static int -xmlExpGetStartInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, - const xmlChar**list, int len, int nb) { - int tmp, tmp2; -tail: - switch (exp->type) { - case XML_EXP_FORBID: - return(0); - case XML_EXP_EMPTY: - return(0); - case XML_EXP_ATOM: - for (tmp = 0;tmp < nb;tmp++) - if (list[tmp] == exp->exp_str) - return(0); - if (nb >= len) - return(-2); - list[nb++] = exp->exp_str; - return(1); - case XML_EXP_COUNT: - exp = exp->exp_left; - goto tail; - case XML_EXP_SEQ: - tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); - if (tmp < 0) - return(tmp); - if (IS_NILLABLE(exp->exp_left)) { - tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, - nb + tmp); - if (tmp2 < 0) - return(tmp2); - tmp += tmp2; - } - return(tmp); - case XML_EXP_OR: - tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); - if (tmp < 0) - return(tmp); - tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, - nb + tmp); - if (tmp2 < 0) - return(tmp2); - return(tmp + tmp2); - } - return(-1); -} - -/** - * xmlExpGetStart: - * @ctxt: the expression context - * @exp: the expression - * @tokList: where to store the tokens - * @len: the allocated length of @list - * - * Find all the strings that appears at the start of the languages - * accepted by @exp and store them in @list. E.g. for (a, b) | c - * it will return the list [a, c] - * - * Returns the number of unique strings found, -1 in case of errors and - * -2 if there is more than @len strings - */ -int -xmlExpGetStart(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, - const xmlChar**tokList, int len) { - if ((ctxt == NULL) || (exp == NULL) || (tokList == NULL) || (len <= 0)) - return(-1); - return(xmlExpGetStartInt(ctxt, exp, tokList, len, 0)); -} - -/** - * xmlExpIsNillable: - * @exp: the expression - * - * Finds if the expression is nillable, i.e. if it accepts the empty sequqnce - * - * Returns 1 if nillable, 0 if not and -1 in case of error - */ -int -xmlExpIsNillable(xmlExpNodePtr exp) { - if (exp == NULL) - return(-1); - return(IS_NILLABLE(exp) != 0); -} - -static xmlExpNodePtr -xmlExpStringDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar *str) -{ - xmlExpNodePtr ret; - - switch (exp->type) { - case XML_EXP_EMPTY: - return(forbiddenExp); - case XML_EXP_FORBID: - return(forbiddenExp); - case XML_EXP_ATOM: - if (exp->exp_str == str) { -#ifdef DEBUG_DERIV - printf("deriv atom: equal => Empty\n"); -#endif - ret = emptyExp; - } else { -#ifdef DEBUG_DERIV - printf("deriv atom: mismatch => forbid\n"); -#endif - /* TODO wildcards here */ - ret = forbiddenExp; - } - return(ret); - case XML_EXP_OR: { - xmlExpNodePtr tmp; - -#ifdef DEBUG_DERIV - printf("deriv or: => or(derivs)\n"); -#endif - tmp = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); - if (tmp == NULL) { - return(NULL); - } - ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); - if (ret == NULL) { - xmlExpFree(ctxt, tmp); - return(NULL); - } - ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, - NULL, 0, 0); - return(ret); - } - case XML_EXP_SEQ: -#ifdef DEBUG_DERIV - printf("deriv seq: starting with left\n"); -#endif - ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); - if (ret == NULL) { - return(NULL); - } else if (ret == forbiddenExp) { - if (IS_NILLABLE(exp->exp_left)) { -#ifdef DEBUG_DERIV - printf("deriv seq: left failed but nillable\n"); -#endif - ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); - } - } else { -#ifdef DEBUG_DERIV - printf("deriv seq: left match => sequence\n"); -#endif - exp->exp_right->ref++; - ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, exp->exp_right, - NULL, 0, 0); - } - return(ret); - case XML_EXP_COUNT: { - int min, max; - xmlExpNodePtr tmp; - - if (exp->exp_max == 0) - return(forbiddenExp); - ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); - if (ret == NULL) - return(NULL); - if (ret == forbiddenExp) { -#ifdef DEBUG_DERIV - printf("deriv count: pattern mismatch => forbid\n"); -#endif - return(ret); - } - if (exp->exp_max == 1) - return(ret); - if (exp->exp_max < 0) /* unbounded */ - max = -1; - else - max = exp->exp_max - 1; - if (exp->exp_min > 0) - min = exp->exp_min - 1; - else - min = 0; - exp->exp_left->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, NULL, - NULL, min, max); - if (ret == emptyExp) { -#ifdef DEBUG_DERIV - printf("deriv count: match to empty => new count\n"); -#endif - return(tmp); - } -#ifdef DEBUG_DERIV - printf("deriv count: match => sequence with new count\n"); -#endif - return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, tmp, - NULL, 0, 0)); - } - } - return(NULL); -} - -/** - * xmlExpStringDerive: - * @ctxt: the expression context - * @exp: the expression - * @str: the string - * @len: the string len in bytes if available - * - * Do one step of Brzozowski derivation of the expression @exp with - * respect to the input string - * - * Returns the resulting expression or NULL in case of internal error - */ -xmlExpNodePtr -xmlExpStringDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, - const xmlChar *str, int len) { - const xmlChar *input; - - if ((exp == NULL) || (ctxt == NULL) || (str == NULL)) { - return(NULL); - } - /* - * check the string is in the dictionnary, if yes use an interned - * copy, otherwise we know it's not an acceptable input - */ - input = xmlDictExists(ctxt->dict, str, len); - if (input == NULL) { - return(forbiddenExp); - } - return(xmlExpStringDeriveInt(ctxt, exp, input)); -} - -static int -xmlExpCheckCard(xmlExpNodePtr exp, xmlExpNodePtr sub) { - int ret = 1; - - if (sub->c_max == -1) { - if (exp->c_max != -1) - ret = 0; - } else if ((exp->c_max >= 0) && (exp->c_max < sub->c_max)) { - ret = 0; - } -#if 0 - if ((IS_NILLABLE(sub)) && (!IS_NILLABLE(exp))) - ret = 0; -#endif - return(ret); -} - -static xmlExpNodePtr xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, - xmlExpNodePtr sub); -/** - * xmlExpDivide: - * @ctxt: the expressions context - * @exp: the englobing expression - * @sub: the subexpression - * @mult: the multiple expression - * @remain: the remain from the derivation of the multiple - * - * Check if exp is a multiple of sub, i.e. if there is a finite number n - * so that sub{n} subsume exp - * - * Returns the multiple value if successful, 0 if it is not a multiple - * and -1 in case of internel error. - */ - -static int -xmlExpDivide(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub, - xmlExpNodePtr *mult, xmlExpNodePtr *remain) { - int i; - xmlExpNodePtr tmp, tmp2; - - if (mult != NULL) *mult = NULL; - if (remain != NULL) *remain = NULL; - if (exp->c_max == -1) return(0); - if (IS_NILLABLE(exp) && (!IS_NILLABLE(sub))) return(0); - - for (i = 1;i <= exp->c_max;i++) { - sub->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, - sub, NULL, NULL, i, i); - if (tmp == NULL) { - return(-1); - } - if (!xmlExpCheckCard(tmp, exp)) { - xmlExpFree(ctxt, tmp); - continue; - } - tmp2 = xmlExpExpDeriveInt(ctxt, tmp, exp); - if (tmp2 == NULL) { - xmlExpFree(ctxt, tmp); - return(-1); - } - if ((tmp2 != forbiddenExp) && (IS_NILLABLE(tmp2))) { - if (remain != NULL) - *remain = tmp2; - else - xmlExpFree(ctxt, tmp2); - if (mult != NULL) - *mult = tmp; - else - xmlExpFree(ctxt, tmp); -#ifdef DEBUG_DERIV - printf("Divide succeeded %d\n", i); -#endif - return(i); - } - xmlExpFree(ctxt, tmp); - xmlExpFree(ctxt, tmp2); - } -#ifdef DEBUG_DERIV - printf("Divide failed\n"); -#endif - return(0); -} - -/** - * xmlExpExpDeriveInt: - * @ctxt: the expressions context - * @exp: the englobing expression - * @sub: the subexpression - * - * Try to do a step of Brzozowski derivation but at a higher level - * the input being a subexpression. - * - * Returns the resulting expression or NULL in case of internal error - */ -static xmlExpNodePtr -xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { - xmlExpNodePtr ret, tmp, tmp2, tmp3; - const xmlChar **tab; - int len, i; - - /* - * In case of equality and if the expression can only consume a finite - * amount, then the derivation is empty - */ - if ((exp == sub) && (exp->c_max >= 0)) { -#ifdef DEBUG_DERIV - printf("Equal(exp, sub) and finite -> Empty\n"); -#endif - return(emptyExp); - } - /* - * decompose sub sequence first - */ - if (sub->type == XML_EXP_EMPTY) { -#ifdef DEBUG_DERIV - printf("Empty(sub) -> Empty\n"); -#endif - exp->ref++; - return(exp); - } - if (sub->type == XML_EXP_SEQ) { -#ifdef DEBUG_DERIV - printf("Seq(sub) -> decompose\n"); -#endif - tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); - if (tmp == NULL) - return(NULL); - if (tmp == forbiddenExp) - return(tmp); - ret = xmlExpExpDeriveInt(ctxt, tmp, sub->exp_right); - xmlExpFree(ctxt, tmp); - return(ret); - } - if (sub->type == XML_EXP_OR) { -#ifdef DEBUG_DERIV - printf("Or(sub) -> decompose\n"); -#endif - tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); - if (tmp == forbiddenExp) - return(tmp); - if (tmp == NULL) - return(NULL); - ret = xmlExpExpDeriveInt(ctxt, exp, sub->exp_right); - if ((ret == NULL) || (ret == forbiddenExp)) { - xmlExpFree(ctxt, tmp); - return(ret); - } - return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, NULL, 0, 0)); - } - if (!xmlExpCheckCard(exp, sub)) { -#ifdef DEBUG_DERIV - printf("CheckCard(exp, sub) failed -> Forbid\n"); -#endif - return(forbiddenExp); - } - switch (exp->type) { - case XML_EXP_EMPTY: - if (sub == emptyExp) - return(emptyExp); -#ifdef DEBUG_DERIV - printf("Empty(exp) -> Forbid\n"); -#endif - return(forbiddenExp); - case XML_EXP_FORBID: -#ifdef DEBUG_DERIV - printf("Forbid(exp) -> Forbid\n"); -#endif - return(forbiddenExp); - case XML_EXP_ATOM: - if (sub->type == XML_EXP_ATOM) { - /* TODO: handle wildcards */ - if (exp->exp_str == sub->exp_str) { -#ifdef DEBUG_DERIV - printf("Atom match -> Empty\n"); -#endif - return(emptyExp); - } -#ifdef DEBUG_DERIV - printf("Atom mismatch -> Forbid\n"); -#endif - return(forbiddenExp); - } - if ((sub->type == XML_EXP_COUNT) && - (sub->exp_max == 1) && - (sub->exp_left->type == XML_EXP_ATOM)) { - /* TODO: handle wildcards */ - if (exp->exp_str == sub->exp_left->exp_str) { -#ifdef DEBUG_DERIV - printf("Atom match -> Empty\n"); -#endif - return(emptyExp); - } -#ifdef DEBUG_DERIV - printf("Atom mismatch -> Forbid\n"); -#endif - return(forbiddenExp); - } -#ifdef DEBUG_DERIV - printf("Compex exp vs Atom -> Forbid\n"); -#endif - return(forbiddenExp); - case XML_EXP_SEQ: - /* try to get the sequence consumed only if possible */ - if (xmlExpCheckCard(exp->exp_left, sub)) { - /* See if the sequence can be consumed directly */ -#ifdef DEBUG_DERIV - printf("Seq trying left only\n"); -#endif - ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); - if ((ret != forbiddenExp) && (ret != NULL)) { -#ifdef DEBUG_DERIV - printf("Seq trying left only worked\n"); -#endif - /* - * TODO: assumption here that we are determinist - * i.e. we won't get to a nillable exp left - * subset which could be matched by the right - * part too. - * e.g.: (a | b)+,(a | c) and 'a+,a' - */ - exp->exp_right->ref++; - return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, - exp->exp_right, NULL, 0, 0)); - } -#ifdef DEBUG_DERIV - } else { - printf("Seq: left too short\n"); -#endif - } - /* Try instead to decompose */ - if (sub->type == XML_EXP_COUNT) { - int min, max; - -#ifdef DEBUG_DERIV - printf("Seq: sub is a count\n"); -#endif - ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); - if (ret == NULL) - return(NULL); - if (ret != forbiddenExp) { -#ifdef DEBUG_DERIV - printf("Seq , Count match on left\n"); -#endif - if (sub->exp_max < 0) - max = -1; - else - max = sub->exp_max -1; - if (sub->exp_min > 0) - min = sub->exp_min -1; - else - min = 0; - exp->exp_right->ref++; - tmp = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, - exp->exp_right, NULL, 0, 0); - if (tmp == NULL) - return(NULL); - - sub->exp_left->ref++; - tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, - sub->exp_left, NULL, NULL, min, max); - if (tmp2 == NULL) { - xmlExpFree(ctxt, tmp); - return(NULL); - } - ret = xmlExpExpDeriveInt(ctxt, tmp, tmp2); - xmlExpFree(ctxt, tmp); - xmlExpFree(ctxt, tmp2); - return(ret); - } - } - /* we made no progress on structured operations */ - break; - case XML_EXP_OR: -#ifdef DEBUG_DERIV - printf("Or , trying both side\n"); -#endif - ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); - if (ret == NULL) - return(NULL); - tmp = xmlExpExpDeriveInt(ctxt, exp->exp_right, sub); - if (tmp == NULL) { - xmlExpFree(ctxt, ret); - return(NULL); - } - return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp, NULL, 0, 0)); - case XML_EXP_COUNT: { - int min, max; - - if (sub->type == XML_EXP_COUNT) { - /* - * Try to see if the loop is completely subsumed - */ - tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); - if (tmp == NULL) - return(NULL); - if (tmp == forbiddenExp) { - int mult; - -#ifdef DEBUG_DERIV - printf("Count, Count inner don't subsume\n"); -#endif - mult = xmlExpDivide(ctxt, sub->exp_left, exp->exp_left, - NULL, &tmp); - if (mult <= 0) { -#ifdef DEBUG_DERIV - printf("Count, Count not multiple => forbidden\n"); -#endif - return(forbiddenExp); - } - if (sub->exp_max == -1) { - max = -1; - if (exp->exp_max == -1) { - if (exp->exp_min <= sub->exp_min * mult) - min = 0; - else - min = exp->exp_min - sub->exp_min * mult; - } else { -#ifdef DEBUG_DERIV - printf("Count, Count finite can't subsume infinite\n"); -#endif - xmlExpFree(ctxt, tmp); - return(forbiddenExp); - } - } else { - if (exp->exp_max == -1) { -#ifdef DEBUG_DERIV - printf("Infinite loop consume mult finite loop\n"); -#endif - if (exp->exp_min > sub->exp_min * mult) { - max = -1; - min = exp->exp_min - sub->exp_min * mult; - } else { - max = -1; - min = 0; - } - } else { - if (exp->exp_max < sub->exp_max * mult) { -#ifdef DEBUG_DERIV - printf("loops max mult mismatch => forbidden\n"); -#endif - xmlExpFree(ctxt, tmp); - return(forbiddenExp); - } - if (sub->exp_max * mult > exp->exp_min) - min = 0; - else - min = exp->exp_min - sub->exp_max * mult; - max = exp->exp_max - sub->exp_max * mult; - } - } - } else if (!IS_NILLABLE(tmp)) { - /* - * TODO: loop here to try to grow if working on finite - * blocks. - */ -#ifdef DEBUG_DERIV - printf("Count, Count remain not nillable => forbidden\n"); -#endif - xmlExpFree(ctxt, tmp); - return(forbiddenExp); - } else if (sub->exp_max == -1) { - if (exp->exp_max == -1) { - if (exp->exp_min <= sub->exp_min) { -#ifdef DEBUG_DERIV - printf("Infinite loops Okay => COUNT(0,Inf)\n"); -#endif - max = -1; - min = 0; - } else { -#ifdef DEBUG_DERIV - printf("Infinite loops min => Count(X,Inf)\n"); -#endif - max = -1; - min = exp->exp_min - sub->exp_min; - } - } else if (exp->exp_min > sub->exp_min) { -#ifdef DEBUG_DERIV - printf("loops min mismatch 1 => forbidden ???\n"); -#endif - xmlExpFree(ctxt, tmp); - return(forbiddenExp); - } else { - max = -1; - min = 0; - } - } else { - if (exp->exp_max == -1) { -#ifdef DEBUG_DERIV - printf("Infinite loop consume finite loop\n"); -#endif - if (exp->exp_min > sub->exp_min) { - max = -1; - min = exp->exp_min - sub->exp_min; - } else { - max = -1; - min = 0; - } - } else { - if (exp->exp_max < sub->exp_max) { -#ifdef DEBUG_DERIV - printf("loops max mismatch => forbidden\n"); -#endif - xmlExpFree(ctxt, tmp); - return(forbiddenExp); - } - if (sub->exp_max > exp->exp_min) - min = 0; - else - min = exp->exp_min - sub->exp_max; - max = exp->exp_max - sub->exp_max; - } - } -#ifdef DEBUG_DERIV - printf("loops match => SEQ(COUNT())\n"); -#endif - exp->exp_left->ref++; - tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, - NULL, NULL, min, max); - if (tmp2 == NULL) { - return(NULL); - } - ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, - NULL, 0, 0); - return(ret); - } - tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); - if (tmp == NULL) - return(NULL); - if (tmp == forbiddenExp) { -#ifdef DEBUG_DERIV - printf("loop mismatch => forbidden\n"); -#endif - return(forbiddenExp); - } - if (exp->exp_min > 0) - min = exp->exp_min - 1; - else - min = 0; - if (exp->exp_max < 0) - max = -1; - else - max = exp->exp_max - 1; - -#ifdef DEBUG_DERIV - printf("loop match => SEQ(COUNT())\n"); -#endif - exp->exp_left->ref++; - tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, - NULL, NULL, min, max); - if (tmp2 == NULL) - return(NULL); - ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, - NULL, 0, 0); - return(ret); - } - } - -#ifdef DEBUG_DERIV - printf("Fallback to derivative\n"); -#endif - if (IS_NILLABLE(sub)) { - if (!(IS_NILLABLE(exp))) - return(forbiddenExp); - else - ret = emptyExp; - } else - ret = NULL; - /* - * here the structured derivation made no progress so - * we use the default token based derivation to force one more step - */ - if (ctxt->tabSize == 0) - ctxt->tabSize = 40; - - tab = (const xmlChar **) xmlMalloc(ctxt->tabSize * - sizeof(const xmlChar *)); - if (tab == NULL) { - return(NULL); - } - - /* - * collect all the strings accepted by the subexpression on input - */ - len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); - while (len < 0) { - const xmlChar **temp; - temp = (const xmlChar **) xmlRealloc((xmlChar **) tab, ctxt->tabSize * 2 * - sizeof(const xmlChar *)); - if (temp == NULL) { - xmlFree((xmlChar **) tab); - return(NULL); - } - tab = temp; - ctxt->tabSize *= 2; - len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); - } - for (i = 0;i < len;i++) { - tmp = xmlExpStringDeriveInt(ctxt, exp, tab[i]); - if ((tmp == NULL) || (tmp == forbiddenExp)) { - xmlExpFree(ctxt, ret); - xmlFree((xmlChar **) tab); - return(tmp); - } - tmp2 = xmlExpStringDeriveInt(ctxt, sub, tab[i]); - if ((tmp2 == NULL) || (tmp2 == forbiddenExp)) { - xmlExpFree(ctxt, tmp); - xmlExpFree(ctxt, ret); - xmlFree((xmlChar **) tab); - return(tmp); - } - tmp3 = xmlExpExpDeriveInt(ctxt, tmp, tmp2); - xmlExpFree(ctxt, tmp); - xmlExpFree(ctxt, tmp2); - - if ((tmp3 == NULL) || (tmp3 == forbiddenExp)) { - xmlExpFree(ctxt, ret); - xmlFree((xmlChar **) tab); - return(tmp3); - } - - if (ret == NULL) - ret = tmp3; - else { - ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp3, NULL, 0, 0); - if (ret == NULL) { - xmlFree((xmlChar **) tab); - return(NULL); - } - } - } - xmlFree((xmlChar **) tab); - return(ret); -} - -/** - * xmlExpExpDerive: - * @ctxt: the expressions context - * @exp: the englobing expression - * @sub: the subexpression - * - * Evaluates the expression resulting from @exp consuming a sub expression @sub - * Based on algebraic derivation and sometimes direct Brzozowski derivation - * it usually tatkes less than linear time and can handle expressions generating - * infinite languages. - * - * Returns the resulting expression or NULL in case of internal error, the - * result must be freed - */ -xmlExpNodePtr -xmlExpExpDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { - if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) - return(NULL); - - /* - * O(1) speedups - */ - if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { -#ifdef DEBUG_DERIV - printf("Sub nillable and not exp : can't subsume\n"); -#endif - return(forbiddenExp); - } - if (xmlExpCheckCard(exp, sub) == 0) { -#ifdef DEBUG_DERIV - printf("sub generate longuer sequances than exp : can't subsume\n"); -#endif - return(forbiddenExp); - } - return(xmlExpExpDeriveInt(ctxt, exp, sub)); -} - -/** - * xmlExpSubsume: - * @ctxt: the expressions context - * @exp: the englobing expression - * @sub: the subexpression - * - * Check whether @exp accepts all the languages accexpted by @sub - * the input being a subexpression. - * - * Returns 1 if true 0 if false and -1 in case of failure. - */ -int -xmlExpSubsume(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { - xmlExpNodePtr tmp; - - if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) - return(-1); - - /* - * TODO: speedup by checking the language of sub is a subset of the - * language of exp - */ - /* - * O(1) speedups - */ - if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { -#ifdef DEBUG_DERIV - printf("Sub nillable and not exp : can't subsume\n"); -#endif - return(0); - } - if (xmlExpCheckCard(exp, sub) == 0) { -#ifdef DEBUG_DERIV - printf("sub generate longuer sequances than exp : can't subsume\n"); -#endif - return(0); - } - tmp = xmlExpExpDeriveInt(ctxt, exp, sub); -#ifdef DEBUG_DERIV - printf("Result derivation :\n"); - PRINT_EXP(tmp); -#endif - if (tmp == NULL) - return(-1); - if (tmp == forbiddenExp) - return(0); - if (tmp == emptyExp) - return(1); - if ((tmp != NULL) && (IS_NILLABLE(tmp))) { - xmlExpFree(ctxt, tmp); - return(1); - } - xmlExpFree(ctxt, tmp); - return(0); -} - -/************************************************************************ - * * - * Parsing expression * - * * - ************************************************************************/ - -static xmlExpNodePtr xmlExpParseExpr(xmlExpCtxtPtr ctxt); - -#undef CUR -#define CUR (*ctxt->cur) -#undef NEXT -#define NEXT ctxt->cur++; -#undef IS_BLANK -#define IS_BLANK(c) ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) -#define SKIP_BLANKS while (IS_BLANK(*ctxt->cur)) ctxt->cur++; - -static int -xmlExpParseNumber(xmlExpCtxtPtr ctxt) { - int ret = 0; - - SKIP_BLANKS - if (CUR == '*') { - NEXT - return(-1); - } - if ((CUR < '0') || (CUR > '9')) - return(-1); - while ((CUR >= '0') && (CUR <= '9')) { - ret = ret * 10 + (CUR - '0'); - NEXT - } - return(ret); -} - -static xmlExpNodePtr -xmlExpParseOr(xmlExpCtxtPtr ctxt) { - const char *base; - xmlExpNodePtr ret; - const xmlChar *val; - - SKIP_BLANKS - base = ctxt->cur; - if (*ctxt->cur == '(') { - NEXT - ret = xmlExpParseExpr(ctxt); - SKIP_BLANKS - if (*ctxt->cur != ')') { - fprintf(stderr, "unbalanced '(' : %s\n", base); - xmlExpFree(ctxt, ret); - return(NULL); - } - NEXT; - SKIP_BLANKS - goto parse_quantifier; - } - while ((CUR != 0) && (!(IS_BLANK(CUR))) && (CUR != '(') && - (CUR != ')') && (CUR != '|') && (CUR != ',') && (CUR != '{') && - (CUR != '*') && (CUR != '+') && (CUR != '?') && (CUR != '}')) - NEXT; - val = xmlDictLookup(ctxt->dict, BAD_CAST base, ctxt->cur - base); - if (val == NULL) - return(NULL); - ret = xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, val, 0, 0); - if (ret == NULL) - return(NULL); - SKIP_BLANKS -parse_quantifier: - if (CUR == '{') { - int min, max; - - NEXT - min = xmlExpParseNumber(ctxt); - if (min < 0) { - xmlExpFree(ctxt, ret); - return(NULL); - } - SKIP_BLANKS - if (CUR == ',') { - NEXT - max = xmlExpParseNumber(ctxt); - SKIP_BLANKS - } else - max = min; - if (CUR != '}') { - xmlExpFree(ctxt, ret); - return(NULL); - } - NEXT - ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, - min, max); - SKIP_BLANKS - } else if (CUR == '?') { - NEXT - ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, - 0, 1); - SKIP_BLANKS - } else if (CUR == '+') { - NEXT - ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, - 1, -1); - SKIP_BLANKS - } else if (CUR == '*') { - NEXT - ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, - 0, -1); - SKIP_BLANKS - } - return(ret); -} - - -static xmlExpNodePtr -xmlExpParseSeq(xmlExpCtxtPtr ctxt) { - xmlExpNodePtr ret, right; - - ret = xmlExpParseOr(ctxt); - SKIP_BLANKS - while (CUR == '|') { - NEXT - right = xmlExpParseOr(ctxt); - if (right == NULL) { - xmlExpFree(ctxt, ret); - return(NULL); - } - ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, right, NULL, 0, 0); - if (ret == NULL) - return(NULL); - } - return(ret); -} - -static xmlExpNodePtr -xmlExpParseExpr(xmlExpCtxtPtr ctxt) { - xmlExpNodePtr ret, right; - - ret = xmlExpParseSeq(ctxt); - SKIP_BLANKS - while (CUR == ',') { - NEXT - right = xmlExpParseSeq(ctxt); - if (right == NULL) { - xmlExpFree(ctxt, ret); - return(NULL); - } - ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, right, NULL, 0, 0); - if (ret == NULL) - return(NULL); - } - return(ret); -} - -/** - * xmlExpParse: - * @ctxt: the expressions context - * @expr: the 0 terminated string - * - * Minimal parser for regexps, it understand the following constructs - * - string terminals - * - choice operator | - * - sequence operator , - * - subexpressions (...) - * - usual cardinality operators + * and ? - * - finite sequences { min, max } - * - infinite sequences { min, * } - * There is minimal checkings made especially no checking on strings values - * - * Returns a new expression or NULL in case of failure - */ -xmlExpNodePtr -xmlExpParse(xmlExpCtxtPtr ctxt, const char *expr) { - xmlExpNodePtr ret; - - ctxt->expr = expr; - ctxt->cur = expr; - - ret = xmlExpParseExpr(ctxt); - SKIP_BLANKS - if (*ctxt->cur != 0) { - xmlExpFree(ctxt, ret); - return(NULL); - } - return(ret); -} - -static void -xmlExpDumpInt(xmlBufferPtr buf, xmlExpNodePtr expr, int glob) { - xmlExpNodePtr c; - - if (expr == NULL) return; - if (glob) xmlBufferWriteChar(buf, "("); - switch (expr->type) { - case XML_EXP_EMPTY: - xmlBufferWriteChar(buf, "empty"); - break; - case XML_EXP_FORBID: - xmlBufferWriteChar(buf, "forbidden"); - break; - case XML_EXP_ATOM: - xmlBufferWriteCHAR(buf, expr->exp_str); - break; - case XML_EXP_SEQ: - c = expr->exp_left; - if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) - xmlExpDumpInt(buf, c, 1); - else - xmlExpDumpInt(buf, c, 0); - xmlBufferWriteChar(buf, " , "); - c = expr->exp_right; - if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) - xmlExpDumpInt(buf, c, 1); - else - xmlExpDumpInt(buf, c, 0); - break; - case XML_EXP_OR: - c = expr->exp_left; - if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) - xmlExpDumpInt(buf, c, 1); - else - xmlExpDumpInt(buf, c, 0); - xmlBufferWriteChar(buf, " | "); - c = expr->exp_right; - if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) - xmlExpDumpInt(buf, c, 1); - else - xmlExpDumpInt(buf, c, 0); - break; - case XML_EXP_COUNT: { - char rep[40]; - - c = expr->exp_left; - if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) - xmlExpDumpInt(buf, c, 1); - else - xmlExpDumpInt(buf, c, 0); - if ((expr->exp_min == 0) && (expr->exp_max == 1)) { - rep[0] = '?'; - rep[1] = 0; - } else if ((expr->exp_min == 0) && (expr->exp_max == -1)) { - rep[0] = '*'; - rep[1] = 0; - } else if ((expr->exp_min == 1) && (expr->exp_max == -1)) { - rep[0] = '+'; - rep[1] = 0; - } else if (expr->exp_max == expr->exp_min) { - snprintf(rep, 39, "{%d}", expr->exp_min); - } else if (expr->exp_max < 0) { - snprintf(rep, 39, "{%d,inf}", expr->exp_min); - } else { - snprintf(rep, 39, "{%d,%d}", expr->exp_min, expr->exp_max); - } - rep[39] = 0; - xmlBufferWriteChar(buf, rep); - break; - } - default: - fprintf(stderr, "Error in tree\n"); - } - if (glob) - xmlBufferWriteChar(buf, ")"); -} -/** - * xmlExpDump: - * @buf: a buffer to receive the output - * @expr: the compiled expression - * - * Serialize the expression as compiled to the buffer - */ -void -xmlExpDump(xmlBufferPtr buf, xmlExpNodePtr expr) { - if ((buf == NULL) || (expr == NULL)) - return; - xmlExpDumpInt(buf, expr, 0); -} - -/** - * xmlExpMaxToken: - * @expr: a compiled expression - * - * Indicate the maximum number of input a expression can accept - * - * Returns the maximum length or -1 in case of error - */ -int -xmlExpMaxToken(xmlExpNodePtr expr) { - if (expr == NULL) - return(-1); - return(expr->c_max); -} - -/** - * xmlExpCtxtNbNodes: - * @ctxt: an expression context - * - * Debugging facility provides the number of allocated nodes at a that point - * - * Returns the number of nodes in use or -1 in case of error - */ -int -xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt) { - if (ctxt == NULL) - return(-1); - return(ctxt->nb_nodes); -} - -/** - * xmlExpCtxtNbCons: - * @ctxt: an expression context - * - * Debugging facility provides the number of allocated nodes over lifetime - * - * Returns the number of nodes ever allocated or -1 in case of error - */ -int -xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt) { - if (ctxt == NULL) - return(-1); - return(ctxt->nb_cons); -} - -#endif /* LIBXML_EXPR_ENABLED */ -#define bottom_xmlregexp -#include "elfgcchack.h" -#endif /* LIBXML_REGEXP_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/xmlsave.c b/ThirdParty/libxml2/vtklibxml2/xmlsave.c deleted file mode 100644 index 682b35ee4d4..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlsave.c +++ /dev/null @@ -1,2406 +0,0 @@ -/* - * xmlsave.c: Implemetation of the document serializer - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/parserInternals.h> -#include <libxml/tree.h> -#include <libxml/xmlsave.h> - -#define MAX_INDENT 60 - -#include <libxml/HTMLtree.h> - -/************************************************************************ - * * - * XHTML detection * - * * - ************************************************************************/ -#define XHTML_STRICT_PUBLIC_ID BAD_CAST \ - "-//W3C//DTD XHTML 1.0 Strict//EN" -#define XHTML_STRICT_SYSTEM_ID BAD_CAST \ - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" -#define XHTML_FRAME_PUBLIC_ID BAD_CAST \ - "-//W3C//DTD XHTML 1.0 Frameset//EN" -#define XHTML_FRAME_SYSTEM_ID BAD_CAST \ - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd" -#define XHTML_TRANS_PUBLIC_ID BAD_CAST \ - "-//W3C//DTD XHTML 1.0 Transitional//EN" -#define XHTML_TRANS_SYSTEM_ID BAD_CAST \ - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" - -#define XHTML_NS_NAME BAD_CAST "http://www.w3.org/1999/xhtml" -/** - * xmlIsXHTML: - * @systemID: the system identifier - * @publicID: the public identifier - * - * Try to find if the document correspond to an XHTML DTD - * - * Returns 1 if true, 0 if not and -1 in case of error - */ -int -xmlIsXHTML(const xmlChar *systemID, const xmlChar *publicID) { - if ((systemID == NULL) && (publicID == NULL)) - return(-1); - if (publicID != NULL) { - if (xmlStrEqual(publicID, XHTML_STRICT_PUBLIC_ID)) return(1); - if (xmlStrEqual(publicID, XHTML_FRAME_PUBLIC_ID)) return(1); - if (xmlStrEqual(publicID, XHTML_TRANS_PUBLIC_ID)) return(1); - } - if (systemID != NULL) { - if (xmlStrEqual(systemID, XHTML_STRICT_SYSTEM_ID)) return(1); - if (xmlStrEqual(systemID, XHTML_FRAME_SYSTEM_ID)) return(1); - if (xmlStrEqual(systemID, XHTML_TRANS_SYSTEM_ID)) return(1); - } - return(0); -} - -#ifdef LIBXML_OUTPUT_ENABLED - -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -struct _xmlSaveCtxt { - void *_private; - int type; - int fd; - const xmlChar *filename; - const xmlChar *encoding; - xmlCharEncodingHandlerPtr handler; - xmlOutputBufferPtr buf; - xmlDocPtr doc; - int options; - int level; - int format; - char indent[MAX_INDENT + 1]; /* array for indenting output */ - int indent_nr; - int indent_size; - xmlCharEncodingOutputFunc escape; /* used for element content */ - xmlCharEncodingOutputFunc escapeAttr;/* used for attribute content */ -}; - -/************************************************************************ - * * - * Output error handlers * - * * - ************************************************************************/ -/** - * xmlSaveErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlSaveErrMemory(const char *extra) -{ - __xmlSimpleError(XML_FROM_OUTPUT, XML_ERR_NO_MEMORY, NULL, NULL, extra); -} - -/** - * xmlSaveErr: - * @code: the error number - * @node: the location of the error. - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlSaveErr(int code, xmlNodePtr node, const char *extra) -{ - const char *msg = NULL; - - switch(code) { - case XML_SAVE_NOT_UTF8: - msg = "string is not in UTF-8\n"; - break; - case XML_SAVE_CHAR_INVALID: - msg = "invalid character value\n"; - break; - case XML_SAVE_UNKNOWN_ENCODING: - msg = "unknown encoding %s\n"; - break; - case XML_SAVE_NO_DOCTYPE: - msg = "document has no DOCTYPE\n"; - break; - default: - msg = "unexpected error number\n"; - } - __xmlSimpleError(XML_FROM_OUTPUT, code, node, msg, extra); -} - -/************************************************************************ - * * - * Special escaping routines * - * * - ************************************************************************/ -static unsigned char * -xmlSerializeHexCharRef(unsigned char *out, int val) { - unsigned char *ptr; - - *out++ = '&'; - *out++ = '#'; - *out++ = 'x'; - if (val < 0x10) ptr = out; - else if (val < 0x100) ptr = out + 1; - else if (val < 0x1000) ptr = out + 2; - else if (val < 0x10000) ptr = out + 3; - else if (val < 0x100000) ptr = out + 4; - else ptr = out + 5; - out = ptr + 1; - while (val > 0) { - switch (val & 0xF) { - case 0: *ptr-- = '0'; break; - case 1: *ptr-- = '1'; break; - case 2: *ptr-- = '2'; break; - case 3: *ptr-- = '3'; break; - case 4: *ptr-- = '4'; break; - case 5: *ptr-- = '5'; break; - case 6: *ptr-- = '6'; break; - case 7: *ptr-- = '7'; break; - case 8: *ptr-- = '8'; break; - case 9: *ptr-- = '9'; break; - case 0xA: *ptr-- = 'A'; break; - case 0xB: *ptr-- = 'B'; break; - case 0xC: *ptr-- = 'C'; break; - case 0xD: *ptr-- = 'D'; break; - case 0xE: *ptr-- = 'E'; break; - case 0xF: *ptr-- = 'F'; break; - default: *ptr-- = '0'; break; - } - val >>= 4; - } - *out++ = ';'; - *out = 0; - return(out); -} - -/** - * xmlEscapeEntities: - * @out: a pointer to an array of bytes to store the result - * @outlen: the length of @out - * @in: a pointer to an array of unescaped UTF-8 bytes - * @inlen: the length of @in - * - * Take a block of UTF-8 chars in and escape them. Used when there is no - * encoding specified. - * - * Returns 0 if success, or -1 otherwise - * The value of @inlen after return is the number of octets consumed - * if the return value is positive, else unpredictable. - * The value of @outlen after return is the number of octets consumed. - */ -static int -xmlEscapeEntities(unsigned char* out, int *outlen, - const xmlChar* in, int *inlen) { - unsigned char* outstart = out; - const unsigned char* base = in; - unsigned char* outend = out + *outlen; - const unsigned char* inend; - int val; - - inend = in + (*inlen); - - while ((in < inend) && (out < outend)) { - if (*in == '<') { - if (outend - out < 4) break; - *out++ = '&'; - *out++ = 'l'; - *out++ = 't'; - *out++ = ';'; - in++; - continue; - } else if (*in == '>') { - if (outend - out < 4) break; - *out++ = '&'; - *out++ = 'g'; - *out++ = 't'; - *out++ = ';'; - in++; - continue; - } else if (*in == '&') { - if (outend - out < 5) break; - *out++ = '&'; - *out++ = 'a'; - *out++ = 'm'; - *out++ = 'p'; - *out++ = ';'; - in++; - continue; - } else if (((*in >= 0x20) && (*in < 0x80)) || - (*in == '\n') || (*in == '\t')) { - /* - * default case, just copy ! - */ - *out++ = *in++; - continue; - } else if (*in >= 0x80) { - /* - * We assume we have UTF-8 input. - */ - if (outend - out < 10) break; - - if (*in < 0xC0) { - xmlSaveErr(XML_SAVE_NOT_UTF8, NULL, NULL); - in++; - goto error; - } else if (*in < 0xE0) { - if (inend - in < 2) break; - val = (in[0]) & 0x1F; - val <<= 6; - val |= (in[1]) & 0x3F; - in += 2; - } else if (*in < 0xF0) { - if (inend - in < 3) break; - val = (in[0]) & 0x0F; - val <<= 6; - val |= (in[1]) & 0x3F; - val <<= 6; - val |= (in[2]) & 0x3F; - in += 3; - } else if (*in < 0xF8) { - if (inend - in < 4) break; - val = (in[0]) & 0x07; - val <<= 6; - val |= (in[1]) & 0x3F; - val <<= 6; - val |= (in[2]) & 0x3F; - val <<= 6; - val |= (in[3]) & 0x3F; - in += 4; - } else { - xmlSaveErr(XML_SAVE_CHAR_INVALID, NULL, NULL); - in++; - goto error; - } - if (!IS_CHAR(val)) { - xmlSaveErr(XML_SAVE_CHAR_INVALID, NULL, NULL); - in++; - goto error; - } - - /* - * We could do multiple things here. Just save as a char ref - */ - out = xmlSerializeHexCharRef(out, val); - } else if (IS_BYTE_CHAR(*in)) { - if (outend - out < 6) break; - out = xmlSerializeHexCharRef(out, *in++); - } else { - xmlGenericError(xmlGenericErrorContext, - "xmlEscapeEntities : char out of range\n"); - in++; - goto error; - } - } - *outlen = out - outstart; - *inlen = in - base; - return(0); -error: - *outlen = out - outstart; - *inlen = in - base; - return(-1); -} - -/************************************************************************ - * * - * Allocation and deallocation * - * * - ************************************************************************/ -/** - * xmlSaveCtxtInit: - * @ctxt: the saving context - * - * Initialize a saving context - */ -static void -xmlSaveCtxtInit(xmlSaveCtxtPtr ctxt) -{ - int i; - int len; - - if (ctxt == NULL) return; - if ((ctxt->encoding == NULL) && (ctxt->escape == NULL)) - ctxt->escape = xmlEscapeEntities; - len = xmlStrlen((xmlChar *)xmlTreeIndentString); - if ((xmlTreeIndentString == NULL) || (len == 0)) { - memset(&ctxt->indent[0], 0, MAX_INDENT + 1); - } else { - ctxt->indent_size = len; - ctxt->indent_nr = MAX_INDENT / ctxt->indent_size; - for (i = 0;i < ctxt->indent_nr;i++) - memcpy(&ctxt->indent[i * ctxt->indent_size], xmlTreeIndentString, - ctxt->indent_size); - ctxt->indent[ctxt->indent_nr * ctxt->indent_size] = 0; - } - - if (xmlSaveNoEmptyTags) { - ctxt->options |= XML_SAVE_NO_EMPTY; - } -} - -/** - * xmlFreeSaveCtxt: - * - * Free a saving context, destroying the ouptut in any remaining buffer - */ -static void -xmlFreeSaveCtxt(xmlSaveCtxtPtr ctxt) -{ - if (ctxt == NULL) return; - if (ctxt->encoding != NULL) - xmlFree((char *) ctxt->encoding); - if (ctxt->buf != NULL) - xmlOutputBufferClose(ctxt->buf); - xmlFree(ctxt); -} - -/** - * xmlNewSaveCtxt: - * - * Create a new saving context - * - * Returns the new structure or NULL in case of error - */ -static xmlSaveCtxtPtr -xmlNewSaveCtxt(const char *encoding, int options) -{ - xmlSaveCtxtPtr ret; - - ret = (xmlSaveCtxtPtr) xmlMalloc(sizeof(xmlSaveCtxt)); - if (ret == NULL) { - xmlSaveErrMemory("creating saving context"); - return ( NULL ); - } - memset(ret, 0, sizeof(xmlSaveCtxt)); - - if (encoding != NULL) { - ret->handler = xmlFindCharEncodingHandler(encoding); - if (ret->handler == NULL) { - xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding); - xmlFreeSaveCtxt(ret); - return(NULL); - } - ret->encoding = xmlStrdup((const xmlChar *)encoding); - ret->escape = NULL; - } - xmlSaveCtxtInit(ret); - - /* - * Use the options - */ - - /* Re-check this option as it may already have been set */ - if ((ret->options & XML_SAVE_NO_EMPTY) && ! (options & XML_SAVE_NO_EMPTY)) { - options |= XML_SAVE_NO_EMPTY; - } - - ret->options = options; - if (options & XML_SAVE_FORMAT) - ret->format = 1; - - return(ret); -} - -/************************************************************************ - * * - * Dumping XML tree content to a simple buffer * - * * - ************************************************************************/ -/** - * xmlAttrSerializeContent: - * @buf: the XML buffer output - * @doc: the document - * @attr: the attribute pointer - * - * Serialize the attribute in the buffer - */ -static void -xmlAttrSerializeContent(xmlOutputBufferPtr buf, xmlAttrPtr attr) -{ - xmlNodePtr children; - - children = attr->children; - while (children != NULL) { - switch (children->type) { - case XML_TEXT_NODE: - xmlAttrSerializeTxtContent(buf->buffer, attr->doc, - attr, children->content); - break; - case XML_ENTITY_REF_NODE: - xmlBufferAdd(buf->buffer, BAD_CAST "&", 1); - xmlBufferAdd(buf->buffer, children->name, - xmlStrlen(children->name)); - xmlBufferAdd(buf->buffer, BAD_CAST ";", 1); - break; - default: - /* should not happen unless we have a badly built tree */ - break; - } - children = children->next; - } -} - -/************************************************************************ - * * - * Dumping XML tree content to an I/O output buffer * - * * - ************************************************************************/ - -#ifdef LIBXML_HTML_ENABLED -static void -xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); -#endif -static void xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); -static void xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); -void xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur); -static int xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur); - -/** - * xmlNsDumpOutput: - * @buf: the XML buffer output - * @cur: a namespace - * - * Dump a local Namespace definition. - * Should be called in the context of attributes dumps. - */ -static void -xmlNsDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) { - if ((cur == NULL) || (buf == NULL)) return; - if ((cur->type == XML_LOCAL_NAMESPACE) && (cur->href != NULL)) { - if (xmlStrEqual(cur->prefix, BAD_CAST "xml")) - return; - - /* Within the context of an element attributes */ - if (cur->prefix != NULL) { - xmlOutputBufferWrite(buf, 7, " xmlns:"); - xmlOutputBufferWriteString(buf, (const char *)cur->prefix); - } else - xmlOutputBufferWrite(buf, 6, " xmlns"); - xmlOutputBufferWrite(buf, 1, "="); - xmlBufferWriteQuotedString(buf->buffer, cur->href); - } -} - -/** - * xmlNsListDumpOutput: - * @buf: the XML buffer output - * @cur: the first namespace - * - * Dump a list of local Namespace definitions. - * Should be called in the context of attributes dumps. - */ -void -xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) { - while (cur != NULL) { - xmlNsDumpOutput(buf, cur); - cur = cur->next; - } -} - -/** - * xmlDtdDumpOutput: - * @buf: the XML buffer output - * @dtd: the pointer to the DTD - * - * Dump the XML document DTD, if any. - */ -static void -xmlDtdDumpOutput(xmlSaveCtxtPtr ctxt, xmlDtdPtr dtd) { - xmlOutputBufferPtr buf; - int format, level; - xmlDocPtr doc; - - if (dtd == NULL) return; - if ((ctxt == NULL) || (ctxt->buf == NULL)) - return; - buf = ctxt->buf; - xmlOutputBufferWrite(buf, 10, "<!DOCTYPE "); - xmlOutputBufferWriteString(buf, (const char *)dtd->name); - if (dtd->ExternalID != NULL) { - xmlOutputBufferWrite(buf, 8, " PUBLIC "); - xmlBufferWriteQuotedString(buf->buffer, dtd->ExternalID); - xmlOutputBufferWrite(buf, 1, " "); - xmlBufferWriteQuotedString(buf->buffer, dtd->SystemID); - } else if (dtd->SystemID != NULL) { - xmlOutputBufferWrite(buf, 8, " SYSTEM "); - xmlBufferWriteQuotedString(buf->buffer, dtd->SystemID); - } - if ((dtd->entities == NULL) && (dtd->elements == NULL) && - (dtd->attributes == NULL) && (dtd->notations == NULL) && - (dtd->pentities == NULL)) { - xmlOutputBufferWrite(buf, 1, ">"); - return; - } - xmlOutputBufferWrite(buf, 3, " [\n"); - /* - * Dump the notations first they are not in the DTD children list - * Do this only on a standalone DTD or on the internal subset though. - */ - if ((dtd->notations != NULL) && ((dtd->doc == NULL) || - (dtd->doc->intSubset == dtd))) { - xmlDumpNotationTable(buf->buffer, (xmlNotationTablePtr) dtd->notations); - } - format = ctxt->format; - level = ctxt->level; - doc = ctxt->doc; - ctxt->format = 0; - ctxt->level = -1; - ctxt->doc = dtd->doc; - xmlNodeListDumpOutput(ctxt, dtd->children); - ctxt->format = format; - ctxt->level = level; - ctxt->doc = doc; - xmlOutputBufferWrite(buf, 2, "]>"); -} - -/** - * xmlAttrDumpOutput: - * @buf: the XML buffer output - * @cur: the attribute pointer - * - * Dump an XML attribute - */ -static void -xmlAttrDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { - xmlOutputBufferPtr buf; - - if (cur == NULL) return; - buf = ctxt->buf; - if (buf == NULL) return; - xmlOutputBufferWrite(buf, 1, " "); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWrite(buf, 1, ":"); - } - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWrite(buf, 2, "=\""); - xmlAttrSerializeContent(buf, cur); - xmlOutputBufferWrite(buf, 1, "\""); -} - -/** - * xmlAttrListDumpOutput: - * @buf: the XML buffer output - * @doc: the document - * @cur: the first attribute pointer - * @encoding: an optional encoding string - * - * Dump a list of XML attributes - */ -static void -xmlAttrListDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { - if (cur == NULL) return; - while (cur != NULL) { - xmlAttrDumpOutput(ctxt, cur); - cur = cur->next; - } -} - - - -/** - * xmlNodeListDumpOutput: - * @cur: the first node - * - * Dump an XML node list, recursive behaviour, children are printed too. - */ -static void -xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { - xmlOutputBufferPtr buf; - - if (cur == NULL) return; - buf = ctxt->buf; - while (cur != NULL) { - if ((ctxt->format) && (xmlIndentTreeOutput) && - (cur->type == XML_ELEMENT_NODE)) - xmlOutputBufferWrite(buf, ctxt->indent_size * - (ctxt->level > ctxt->indent_nr ? - ctxt->indent_nr : ctxt->level), - ctxt->indent); - xmlNodeDumpOutputInternal(ctxt, cur); - if (ctxt->format) { - xmlOutputBufferWrite(buf, 1, "\n"); - } - cur = cur->next; - } -} - -/** - * xmlNodeDumpOutputInternal: - * @cur: the current node - * - * Dump an XML node, recursive behaviour, children are printed too. - */ -static void -xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { - int format; - xmlNodePtr tmp; - xmlChar *start, *end; - xmlOutputBufferPtr buf; - - if (cur == NULL) return; - buf = ctxt->buf; - if (cur->type == XML_XINCLUDE_START) - return; - if (cur->type == XML_XINCLUDE_END) - return; - if ((cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - xmlDocContentDumpOutput(ctxt, (xmlDocPtr) cur); - return; - } - if (cur->type == XML_DTD_NODE) { - xmlDtdDumpOutput(ctxt, (xmlDtdPtr) cur); - return; - } - if (cur->type == XML_DOCUMENT_FRAG_NODE) { - xmlNodeListDumpOutput(ctxt, cur->children); - return; - } - if (cur->type == XML_ELEMENT_DECL) { - xmlDumpElementDecl(buf->buffer, (xmlElementPtr) cur); - return; - } - if (cur->type == XML_ATTRIBUTE_DECL) { - xmlDumpAttributeDecl(buf->buffer, (xmlAttributePtr) cur); - return; - } - if (cur->type == XML_ENTITY_DECL) { - xmlDumpEntityDecl(buf->buffer, (xmlEntityPtr) cur); - return; - } - if (cur->type == XML_TEXT_NODE) { - if (cur->content != NULL) { - if (cur->name != xmlStringTextNoenc) { - xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); - } else { - /* - * Disable escaping, needed for XSLT - */ - xmlOutputBufferWriteString(buf, (const char *) cur->content); - } - } - - return; - } - if (cur->type == XML_PI_NODE) { - if (cur->content != NULL) { - xmlOutputBufferWrite(buf, 2, "<?"); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - if (cur->content != NULL) { - xmlOutputBufferWrite(buf, 1, " "); - xmlOutputBufferWriteString(buf, (const char *)cur->content); - } - xmlOutputBufferWrite(buf, 2, "?>"); - } else { - xmlOutputBufferWrite(buf, 2, "<?"); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWrite(buf, 2, "?>"); - } - return; - } - if (cur->type == XML_COMMENT_NODE) { - if (cur->content != NULL) { - xmlOutputBufferWrite(buf, 4, "<!--"); - xmlOutputBufferWriteString(buf, (const char *)cur->content); - xmlOutputBufferWrite(buf, 3, "-->"); - } - return; - } - if (cur->type == XML_ENTITY_REF_NODE) { - xmlOutputBufferWrite(buf, 1, "&"); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWrite(buf, 1, ";"); - return; - } - if (cur->type == XML_CDATA_SECTION_NODE) { - if (cur->content == NULL) { - xmlOutputBufferWrite(buf, 12, "<![CDATA[]]>"); - } else { - start = end = cur->content; - while (*end != '\0') { - if ((*end == ']') && (*(end + 1) == ']') && - (*(end + 2) == '>')) { - end = end + 2; - xmlOutputBufferWrite(buf, 9, "<![CDATA["); - xmlOutputBufferWrite(buf, end - start, (const char *)start); - xmlOutputBufferWrite(buf, 3, "]]>"); - start = end; - } - end++; - } - if (start != end) { - xmlOutputBufferWrite(buf, 9, "<![CDATA["); - xmlOutputBufferWriteString(buf, (const char *)start); - xmlOutputBufferWrite(buf, 3, "]]>"); - } - } - return; - } - if (cur->type == XML_ATTRIBUTE_NODE) { - xmlAttrDumpOutput(ctxt, (xmlAttrPtr) cur); - return; - } - if (cur->type == XML_NAMESPACE_DECL) { - xmlNsDumpOutput(buf, (xmlNsPtr) cur); - return; - } - - format = ctxt->format; - if (format == 1) { - tmp = cur->children; - while (tmp != NULL) { - if ((tmp->type == XML_TEXT_NODE) || - (tmp->type == XML_CDATA_SECTION_NODE) || - (tmp->type == XML_ENTITY_REF_NODE)) { - ctxt->format = 0; - break; - } - tmp = tmp->next; - } - } - xmlOutputBufferWrite(buf, 1, "<"); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWrite(buf, 1, ":"); - } - - xmlOutputBufferWriteString(buf, (const char *)cur->name); - if (cur->nsDef) - xmlNsListDumpOutput(buf, cur->nsDef); - if (cur->properties != NULL) - xmlAttrListDumpOutput(ctxt, cur->properties); - - if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) && - (cur->children == NULL) && ((ctxt->options & XML_SAVE_NO_EMPTY) == 0)) { - xmlOutputBufferWrite(buf, 2, "/>"); - ctxt->format = format; - return; - } - xmlOutputBufferWrite(buf, 1, ">"); - if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { - xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); - } - if (cur->children != NULL) { - if (ctxt->format) xmlOutputBufferWrite(buf, 1, "\n"); - if (ctxt->level >= 0) ctxt->level++; - xmlNodeListDumpOutput(ctxt, cur->children); - if (ctxt->level > 0) ctxt->level--; - if ((xmlIndentTreeOutput) && (ctxt->format)) - xmlOutputBufferWrite(buf, ctxt->indent_size * - (ctxt->level > ctxt->indent_nr ? - ctxt->indent_nr : ctxt->level), - ctxt->indent); - } - xmlOutputBufferWrite(buf, 2, "</"); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWrite(buf, 1, ":"); - } - - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWrite(buf, 1, ">"); - ctxt->format = format; -} - -/** - * xmlDocContentDumpOutput: - * @cur: the document - * - * Dump an XML document. - */ -static int -xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur) { -#ifdef LIBXML_HTML_ENABLED - xmlDtdPtr dtd; - int is_xhtml = 0; -#endif - const xmlChar *oldenc = cur->encoding; - const xmlChar *oldctxtenc = ctxt->encoding; - const xmlChar *encoding = ctxt->encoding; - xmlCharEncodingOutputFunc oldescape = ctxt->escape; - xmlCharEncodingOutputFunc oldescapeAttr = ctxt->escapeAttr; - xmlOutputBufferPtr buf = ctxt->buf; - /*xmlCharEncodingHandlerPtr handler = NULL;*/ - xmlCharEncoding enc; - - xmlInitParser(); - - if (ctxt->encoding != NULL) { - cur->encoding = BAD_CAST ctxt->encoding; - } else if (cur->encoding != NULL) { - encoding = cur->encoding; - } else if (cur->charset != XML_CHAR_ENCODING_UTF8) { - encoding = (const xmlChar *) - xmlGetCharEncodingName((xmlCharEncoding) cur->charset); - } - - enc = xmlParseCharEncoding((const char*) encoding); - if ((encoding != NULL) && (oldctxtenc == NULL) && - (buf->encoder == NULL) && (buf->conv == NULL) && - ((ctxt->options & XML_SAVE_NO_DECL) == 0)) { - if ((enc != XML_CHAR_ENCODING_UTF8) && - (enc != XML_CHAR_ENCODING_NONE) && - (enc != XML_CHAR_ENCODING_ASCII)) { - /* - * we need to switch to this encoding but just for this document - * since we output the XMLDecl the conversion must be done to not - * generate not well formed documents. - */ - buf->encoder = xmlFindCharEncodingHandler((const char *)encoding); - if (buf->encoder == NULL) { - xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, - (const char *)encoding); - return(-1); - } - buf->conv = xmlBufferCreate(); - if (buf->conv == NULL) { - xmlCharEncCloseFunc(buf->encoder); - xmlSaveErrMemory("creating encoding buffer"); - return(-1); - } - /* - * initialize the state, e.g. if outputting a BOM - */ - xmlCharEncOutFunc(buf->encoder, buf->conv, NULL); - } - if (ctxt->escape == xmlEscapeEntities) - ctxt->escape = NULL; - if (ctxt->escapeAttr == xmlEscapeEntities) - ctxt->escapeAttr = NULL; - } - - - /* - * Save the XML declaration - */ - if ((ctxt->options & XML_SAVE_NO_DECL) == 0) { - xmlOutputBufferWrite(buf, 14, "<?xml version="); - if (cur->version != NULL) - xmlBufferWriteQuotedString(buf->buffer, cur->version); - else - xmlOutputBufferWrite(buf, 5, "\"1.0\""); - if (encoding != NULL) { - xmlOutputBufferWrite(buf, 10, " encoding="); - xmlBufferWriteQuotedString(buf->buffer, (xmlChar *) encoding); - } - switch (cur->standalone) { - case 0: - xmlOutputBufferWrite(buf, 16, " standalone=\"no\""); - break; - case 1: - xmlOutputBufferWrite(buf, 17, " standalone=\"yes\""); - break; - } - xmlOutputBufferWrite(buf, 3, "?>\n"); - } - -#ifdef LIBXML_HTML_ENABLED - if ((ctxt->options & XML_SAVE_NO_XHTML) == 0) { - dtd = xmlGetIntSubset(cur); - if (dtd != NULL) { - is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); - if (is_xhtml < 0) is_xhtml = 0; - } - } -#endif - if (cur->children != NULL) { - xmlNodePtr child = cur->children; - - while (child != NULL) { - ctxt->level = 0; -#ifdef LIBXML_HTML_ENABLED - if (is_xhtml) - xhtmlNodeDumpOutput(ctxt, child); - else -#endif - xmlNodeDumpOutputInternal(ctxt, child); - xmlOutputBufferWrite(buf, 1, "\n"); - child = child->next; - } - } - if (ctxt->encoding != NULL) - cur->encoding = oldenc; - - /* - * Restore the state of the saving context at the end of the document - */ - if ((encoding != NULL) && (oldctxtenc == NULL) && - ((ctxt->options & XML_SAVE_NO_DECL) == 0)) { - if ((enc != XML_CHAR_ENCODING_UTF8) && - (enc != XML_CHAR_ENCODING_NONE) && - (enc != XML_CHAR_ENCODING_ASCII)) { - xmlOutputBufferFlush(buf); - xmlCharEncCloseFunc(buf->encoder); - xmlBufferFree(buf->conv); - buf->encoder = NULL; - buf->conv = NULL; - } - ctxt->escape = oldescape; - ctxt->escapeAttr = oldescapeAttr; - } - return(0); -} - -#ifdef LIBXML_HTML_ENABLED -/************************************************************************ - * * - * Functions specific to XHTML serialization * - * * - ************************************************************************/ - -/** - * xhtmlIsEmpty: - * @node: the node - * - * Check if a node is an empty xhtml node - * - * Returns 1 if the node is an empty node, 0 if not and -1 in case of error - */ -static int -xhtmlIsEmpty(xmlNodePtr node) { - if (node == NULL) - return(-1); - if (node->type != XML_ELEMENT_NODE) - return(0); - if ((node->ns != NULL) && (!xmlStrEqual(node->ns->href, XHTML_NS_NAME))) - return(0); - if (node->children != NULL) - return(0); - switch (node->name[0]) { - case 'a': - if (xmlStrEqual(node->name, BAD_CAST "area")) - return(1); - return(0); - case 'b': - if (xmlStrEqual(node->name, BAD_CAST "br")) - return(1); - if (xmlStrEqual(node->name, BAD_CAST "base")) - return(1); - if (xmlStrEqual(node->name, BAD_CAST "basefont")) - return(1); - return(0); - case 'c': - if (xmlStrEqual(node->name, BAD_CAST "col")) - return(1); - return(0); - case 'f': - if (xmlStrEqual(node->name, BAD_CAST "frame")) - return(1); - return(0); - case 'h': - if (xmlStrEqual(node->name, BAD_CAST "hr")) - return(1); - return(0); - case 'i': - if (xmlStrEqual(node->name, BAD_CAST "img")) - return(1); - if (xmlStrEqual(node->name, BAD_CAST "input")) - return(1); - if (xmlStrEqual(node->name, BAD_CAST "isindex")) - return(1); - return(0); - case 'l': - if (xmlStrEqual(node->name, BAD_CAST "link")) - return(1); - return(0); - case 'm': - if (xmlStrEqual(node->name, BAD_CAST "meta")) - return(1); - return(0); - case 'p': - if (xmlStrEqual(node->name, BAD_CAST "param")) - return(1); - return(0); - } - return(0); -} - -/** - * xhtmlAttrListDumpOutput: - * @cur: the first attribute pointer - * - * Dump a list of XML attributes - */ -static void -xhtmlAttrListDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { - xmlAttrPtr xml_lang = NULL; - xmlAttrPtr lang = NULL; - xmlAttrPtr name = NULL; - xmlAttrPtr id = NULL; - xmlNodePtr parent; - xmlOutputBufferPtr buf; - - if (cur == NULL) return; - buf = ctxt->buf; - parent = cur->parent; - while (cur != NULL) { - if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "id"))) - id = cur; - else - if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "name"))) - name = cur; - else - if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "lang"))) - lang = cur; - else - if ((cur->ns != NULL) && (xmlStrEqual(cur->name, BAD_CAST "lang")) && - (xmlStrEqual(cur->ns->prefix, BAD_CAST "xml"))) - xml_lang = cur; - else if ((cur->ns == NULL) && - ((cur->children == NULL) || - (cur->children->content == NULL) || - (cur->children->content[0] == 0)) && - (htmlIsBooleanAttr(cur->name))) { - if (cur->children != NULL) - xmlFreeNode(cur->children); - cur->children = xmlNewText(cur->name); - if (cur->children != NULL) - cur->children->parent = (xmlNodePtr) cur; - } - xmlAttrDumpOutput(ctxt, cur); - cur = cur->next; - } - /* - * C.8 - */ - if ((name != NULL) && (id == NULL)) { - if ((parent != NULL) && (parent->name != NULL) && - ((xmlStrEqual(parent->name, BAD_CAST "a")) || - (xmlStrEqual(parent->name, BAD_CAST "p")) || - (xmlStrEqual(parent->name, BAD_CAST "div")) || - (xmlStrEqual(parent->name, BAD_CAST "img")) || - (xmlStrEqual(parent->name, BAD_CAST "map")) || - (xmlStrEqual(parent->name, BAD_CAST "applet")) || - (xmlStrEqual(parent->name, BAD_CAST "form")) || - (xmlStrEqual(parent->name, BAD_CAST "frame")) || - (xmlStrEqual(parent->name, BAD_CAST "iframe")))) { - xmlOutputBufferWrite(buf, 5, " id=\""); - xmlAttrSerializeContent(buf, name); - xmlOutputBufferWrite(buf, 1, "\""); - } - } - /* - * C.7. - */ - if ((lang != NULL) && (xml_lang == NULL)) { - xmlOutputBufferWrite(buf, 11, " xml:lang=\""); - xmlAttrSerializeContent(buf, lang); - xmlOutputBufferWrite(buf, 1, "\""); - } else - if ((xml_lang != NULL) && (lang == NULL)) { - xmlOutputBufferWrite(buf, 7, " lang=\""); - xmlAttrSerializeContent(buf, xml_lang); - xmlOutputBufferWrite(buf, 1, "\""); - } -} - -/** - * xhtmlNodeListDumpOutput: - * @buf: the XML buffer output - * @doc: the XHTML document - * @cur: the first node - * @level: the imbrication level for indenting - * @format: is formatting allowed - * @encoding: an optional encoding string - * - * Dump an XML node list, recursive behaviour, children are printed too. - * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 - * or xmlKeepBlanksDefault(0) was called - */ -static void -xhtmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { - xmlOutputBufferPtr buf; - - if (cur == NULL) return; - buf = ctxt->buf; - while (cur != NULL) { - if ((ctxt->format) && (xmlIndentTreeOutput) && - (cur->type == XML_ELEMENT_NODE)) - xmlOutputBufferWrite(buf, ctxt->indent_size * - (ctxt->level > ctxt->indent_nr ? - ctxt->indent_nr : ctxt->level), - ctxt->indent); - xhtmlNodeDumpOutput(ctxt, cur); - if (ctxt->format) { - xmlOutputBufferWrite(buf, 1, "\n"); - } - cur = cur->next; - } -} - -/** - * xhtmlNodeDumpOutput: - * @buf: the XML buffer output - * @doc: the XHTML document - * @cur: the current node - * @level: the imbrication level for indenting - * @format: is formatting allowed - * @encoding: an optional encoding string - * - * Dump an XHTML node, recursive behaviour, children are printed too. - */ -static void -xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { - int format, addmeta = 0; - xmlNodePtr tmp; - xmlChar *start, *end; - xmlOutputBufferPtr buf; - - if (cur == NULL) return; - if ((cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - xmlDocContentDumpOutput(ctxt, (xmlDocPtr) cur); - return; - } - if (cur->type == XML_XINCLUDE_START) - return; - if (cur->type == XML_XINCLUDE_END) - return; - if (cur->type == XML_DTD_NODE) { - xmlDtdDumpOutput(ctxt, (xmlDtdPtr) cur); - return; - } - if (cur->type == XML_DOCUMENT_FRAG_NODE) { - xhtmlNodeListDumpOutput(ctxt, cur->children); - return; - } - buf = ctxt->buf; - if (cur->type == XML_ELEMENT_DECL) { - xmlDumpElementDecl(buf->buffer, (xmlElementPtr) cur); - return; - } - if (cur->type == XML_ATTRIBUTE_DECL) { - xmlDumpAttributeDecl(buf->buffer, (xmlAttributePtr) cur); - return; - } - if (cur->type == XML_ENTITY_DECL) { - xmlDumpEntityDecl(buf->buffer, (xmlEntityPtr) cur); - return; - } - if (cur->type == XML_TEXT_NODE) { - if (cur->content != NULL) { - if ((cur->name == xmlStringText) || - (cur->name != xmlStringTextNoenc)) { - xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); - } else { - /* - * Disable escaping, needed for XSLT - */ - xmlOutputBufferWriteString(buf, (const char *) cur->content); - } - } - - return; - } - if (cur->type == XML_PI_NODE) { - if (cur->content != NULL) { - xmlOutputBufferWrite(buf, 2, "<?"); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - if (cur->content != NULL) { - xmlOutputBufferWrite(buf, 1, " "); - xmlOutputBufferWriteString(buf, (const char *)cur->content); - } - xmlOutputBufferWrite(buf, 2, "?>"); - } else { - xmlOutputBufferWrite(buf, 2, "<?"); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWrite(buf, 2, "?>"); - } - return; - } - if (cur->type == XML_COMMENT_NODE) { - if (cur->content != NULL) { - xmlOutputBufferWrite(buf, 4, "<!--"); - xmlOutputBufferWriteString(buf, (const char *)cur->content); - xmlOutputBufferWrite(buf, 3, "-->"); - } - return; - } - if (cur->type == XML_ENTITY_REF_NODE) { - xmlOutputBufferWrite(buf, 1, "&"); - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWrite(buf, 1, ";"); - return; - } - if (cur->type == XML_CDATA_SECTION_NODE) { - start = end = cur->content; - while (*end != '\0') { - if (*end == ']' && *(end + 1) == ']' && *(end + 2) == '>') { - end = end + 2; - xmlOutputBufferWrite(buf, 9, "<![CDATA["); - xmlOutputBufferWrite(buf, end - start, (const char *)start); - xmlOutputBufferWrite(buf, 3, "]]>"); - start = end; - } - end++; - } - if (start != end) { - xmlOutputBufferWrite(buf, 9, "<![CDATA["); - xmlOutputBufferWriteString(buf, (const char *)start); - xmlOutputBufferWrite(buf, 3, "]]>"); - } - return; - } - - format = ctxt->format; - if (format == 1) { - tmp = cur->children; - while (tmp != NULL) { - if ((tmp->type == XML_TEXT_NODE) || - (tmp->type == XML_ENTITY_REF_NODE)) { - format = 0; - break; - } - tmp = tmp->next; - } - } - xmlOutputBufferWrite(buf, 1, "<"); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWrite(buf, 1, ":"); - } - - xmlOutputBufferWriteString(buf, (const char *)cur->name); - if (cur->nsDef) - xmlNsListDumpOutput(buf, cur->nsDef); - if ((xmlStrEqual(cur->name, BAD_CAST "html") && - (cur->ns == NULL) && (cur->nsDef == NULL))) { - /* - * 3.1.1. Strictly Conforming Documents A.3.1.1 3/ - */ - xmlOutputBufferWriteString(buf, - " xmlns=\"http://www.w3.org/1999/xhtml\""); - } - if (cur->properties != NULL) - xhtmlAttrListDumpOutput(ctxt, cur->properties); - - if ((cur->type == XML_ELEMENT_NODE) && - (cur->parent != NULL) && - (cur->parent->parent == (xmlNodePtr) cur->doc) && - xmlStrEqual(cur->name, BAD_CAST"head") && - xmlStrEqual(cur->parent->name, BAD_CAST"html")) { - - tmp = cur->children; - while (tmp != NULL) { - if (xmlStrEqual(tmp->name, BAD_CAST"meta")) { - xmlChar *httpequiv; - - httpequiv = xmlGetProp(tmp, BAD_CAST"http-equiv"); - if (httpequiv != NULL) { - if (xmlStrcasecmp(httpequiv, BAD_CAST"Content-Type") == 0) { - xmlFree(httpequiv); - break; - } - xmlFree(httpequiv); - } - } - tmp = tmp->next; - } - if (tmp == NULL) - addmeta = 1; - } - - if ((cur->type == XML_ELEMENT_NODE) && (cur->children == NULL)) { - if (((cur->ns == NULL) || (cur->ns->prefix == NULL)) && - ((xhtmlIsEmpty(cur) == 1) && (addmeta == 0))) { - /* - * C.2. Empty Elements - */ - xmlOutputBufferWrite(buf, 3, " />"); - } else { - if (addmeta == 1) { - xmlOutputBufferWrite(buf, 1, ">"); - if (ctxt->format) { - xmlOutputBufferWrite(buf, 1, "\n"); - if (xmlIndentTreeOutput) - xmlOutputBufferWrite(buf, ctxt->indent_size * - (ctxt->level + 1 > ctxt->indent_nr ? - ctxt->indent_nr : ctxt->level + 1), ctxt->indent); - } - xmlOutputBufferWriteString(buf, - "<meta http-equiv=\"Content-Type\" content=\"text/html; charset="); - if (ctxt->encoding) { - xmlOutputBufferWriteString(buf, (const char *)ctxt->encoding); - } else { - xmlOutputBufferWrite(buf, 5, "UTF-8"); - } - xmlOutputBufferWrite(buf, 4, "\" />"); - if (ctxt->format) - xmlOutputBufferWrite(buf, 1, "\n"); - } else { - xmlOutputBufferWrite(buf, 1, ">"); - } - /* - * C.3. Element Minimization and Empty Element Content - */ - xmlOutputBufferWrite(buf, 2, "</"); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWrite(buf, 1, ":"); - } - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWrite(buf, 1, ">"); - } - return; - } - xmlOutputBufferWrite(buf, 1, ">"); - if (addmeta == 1) { - if (ctxt->format) { - xmlOutputBufferWrite(buf, 1, "\n"); - if (xmlIndentTreeOutput) - xmlOutputBufferWrite(buf, ctxt->indent_size * - (ctxt->level + 1 > ctxt->indent_nr ? - ctxt->indent_nr : ctxt->level + 1), ctxt->indent); - } - xmlOutputBufferWriteString(buf, - "<meta http-equiv=\"Content-Type\" content=\"text/html; charset="); - if (ctxt->encoding) { - xmlOutputBufferWriteString(buf, (const char *)ctxt->encoding); - } else { - xmlOutputBufferWrite(buf, 5, "UTF-8"); - } - xmlOutputBufferWrite(buf, 4, "\" />"); - } - if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { - xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); - } - -#if 0 - /* - * This was removed due to problems with HTML processors. - * See bug #345147. - */ - /* - * 4.8. Script and Style elements - */ - if ((cur->type == XML_ELEMENT_NODE) && - ((xmlStrEqual(cur->name, BAD_CAST "script")) || - (xmlStrEqual(cur->name, BAD_CAST "style"))) && - ((cur->ns == NULL) || - (xmlStrEqual(cur->ns->href, XHTML_NS_NAME)))) { - xmlNodePtr child = cur->children; - - while (child != NULL) { - if (child->type == XML_TEXT_NODE) { - if ((xmlStrchr(child->content, '<') == NULL) && - (xmlStrchr(child->content, '&') == NULL) && - (xmlStrstr(child->content, BAD_CAST "]]>") == NULL)) { - /* Nothing to escape, so just output as is... */ - /* FIXME: Should we do something about "--" also? */ - int level = ctxt->level; - int indent = ctxt->format; - - ctxt->level = 0; - ctxt->format = 0; - xmlOutputBufferWriteString(buf, (const char *) child->content); - /* (We cannot use xhtmlNodeDumpOutput() here because - * we wish to leave '>' unescaped!) */ - ctxt->level = level; - ctxt->format = indent; - } else { - /* We must use a CDATA section. Unfortunately, - * this will break CSS and JavaScript when read by - * a browser in HTML4-compliant mode. :-( */ - start = end = child->content; - while (*end != '\0') { - if (*end == ']' && - *(end + 1) == ']' && - *(end + 2) == '>') { - end = end + 2; - xmlOutputBufferWrite(buf, 9, "<![CDATA["); - xmlOutputBufferWrite(buf, end - start, - (const char *)start); - xmlOutputBufferWrite(buf, 3, "]]>"); - start = end; - } - end++; - } - if (start != end) { - xmlOutputBufferWrite(buf, 9, "<![CDATA["); - xmlOutputBufferWrite(buf, end - start, - (const char *)start); - xmlOutputBufferWrite(buf, 3, "]]>"); - } - } - } else { - int level = ctxt->level; - int indent = ctxt->format; - - ctxt->level = 0; - ctxt->format = 0; - xhtmlNodeDumpOutput(ctxt, child); - ctxt->level = level; - ctxt->format = indent; - } - child = child->next; - } - } -#endif - - if (cur->children != NULL) { - int indent = ctxt->format; - - if (format) xmlOutputBufferWrite(buf, 1, "\n"); - if (ctxt->level >= 0) ctxt->level++; - ctxt->format = format; - xhtmlNodeListDumpOutput(ctxt, cur->children); - if (ctxt->level > 0) ctxt->level--; - ctxt->format = indent; - if ((xmlIndentTreeOutput) && (format)) - xmlOutputBufferWrite(buf, ctxt->indent_size * - (ctxt->level > ctxt->indent_nr ? - ctxt->indent_nr : ctxt->level), - ctxt->indent); - } - xmlOutputBufferWrite(buf, 2, "</"); - if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { - xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); - xmlOutputBufferWrite(buf, 1, ":"); - } - - xmlOutputBufferWriteString(buf, (const char *)cur->name); - xmlOutputBufferWrite(buf, 1, ">"); -} -#endif - -/************************************************************************ - * * - * Public entry points * - * * - ************************************************************************/ - -/** - * xmlSaveToFd: - * @fd: a file descriptor number - * @encoding: the encoding name to use or NULL - * @options: a set of xmlSaveOptions - * - * Create a document saving context serializing to a file descriptor - * with the encoding and the options given. - * - * Returns a new serialization context or NULL in case of error. - */ -xmlSaveCtxtPtr -xmlSaveToFd(int fd, const char *encoding, int options) -{ - xmlSaveCtxtPtr ret; - - ret = xmlNewSaveCtxt(encoding, options); - if (ret == NULL) return(NULL); - ret->buf = xmlOutputBufferCreateFd(fd, ret->handler); - if (ret->buf == NULL) { - xmlFreeSaveCtxt(ret); - return(NULL); - } - return(ret); -} - -/** - * xmlSaveToFilename: - * @filename: a file name or an URL - * @encoding: the encoding name to use or NULL - * @options: a set of xmlSaveOptions - * - * Create a document saving context serializing to a filename or possibly - * to an URL (but this is less reliable) with the encoding and the options - * given. - * - * Returns a new serialization context or NULL in case of error. - */ -xmlSaveCtxtPtr -xmlSaveToFilename(const char *filename, const char *encoding, int options) -{ - xmlSaveCtxtPtr ret; - int compression = 0; /* TODO handle compression option */ - - ret = xmlNewSaveCtxt(encoding, options); - if (ret == NULL) return(NULL); - ret->buf = xmlOutputBufferCreateFilename(filename, ret->handler, - compression); - if (ret->buf == NULL) { - xmlFreeSaveCtxt(ret); - return(NULL); - } - return(ret); -} - -/** - * xmlSaveToBuffer: - * @buffer: a buffer - * @encoding: the encoding name to use or NULL - * @options: a set of xmlSaveOptions - * - * Create a document saving context serializing to a buffer - * with the encoding and the options given - * - * Returns a new serialization context or NULL in case of error. - */ - -xmlSaveCtxtPtr -xmlSaveToBuffer(xmlBufferPtr buffer, const char *encoding, int options) -{ - xmlSaveCtxtPtr ret; - xmlOutputBufferPtr out_buff; - xmlCharEncodingHandlerPtr handler; - - ret = xmlNewSaveCtxt(encoding, options); - if (ret == NULL) return(NULL); - - if (encoding != NULL) { - handler = xmlFindCharEncodingHandler(encoding); - if (handler == NULL) { - xmlFree(ret); - return(NULL); - } - } else - handler = NULL; - out_buff = xmlOutputBufferCreateBuffer(buffer, handler); - if (out_buff == NULL) { - xmlFree(ret); - if (handler) xmlCharEncCloseFunc(handler); - return(NULL); - } - - ret->buf = out_buff; - return(ret); -} - -/** - * xmlSaveToIO: - * @iowrite: an I/O write function - * @ioclose: an I/O close function - * @ioctx: an I/O handler - * @encoding: the encoding name to use or NULL - * @options: a set of xmlSaveOptions - * - * Create a document saving context serializing to a file descriptor - * with the encoding and the options given - * - * Returns a new serialization context or NULL in case of error. - */ -xmlSaveCtxtPtr -xmlSaveToIO(xmlOutputWriteCallback iowrite, - xmlOutputCloseCallback ioclose, - void *ioctx, const char *encoding, int options) -{ - xmlSaveCtxtPtr ret; - - ret = xmlNewSaveCtxt(encoding, options); - if (ret == NULL) return(NULL); - ret->buf = xmlOutputBufferCreateIO(iowrite, ioclose, ioctx, ret->handler); - if (ret->buf == NULL) { - xmlFreeSaveCtxt(ret); - return(NULL); - } - return(ret); -} - -/** - * xmlSaveDoc: - * @ctxt: a document saving context - * @doc: a document - * - * Save a full document to a saving context - * TODO: The function is not fully implemented yet as it does not return the - * byte count but 0 instead - * - * Returns the number of byte written or -1 in case of error - */ -long -xmlSaveDoc(xmlSaveCtxtPtr ctxt, xmlDocPtr doc) -{ - long ret = 0; - - if ((ctxt == NULL) || (doc == NULL)) return(-1); - if (xmlDocContentDumpOutput(ctxt, doc) < 0) - return(-1); - return(ret); -} - -/** - * xmlSaveTree: - * @ctxt: a document saving context - * @node: the top node of the subtree to save - * - * Save a subtree starting at the node parameter to a saving context - * TODO: The function is not fully implemented yet as it does not return the - * byte count but 0 instead - * - * Returns the number of byte written or -1 in case of error - */ -long -xmlSaveTree(xmlSaveCtxtPtr ctxt, xmlNodePtr node) -{ - long ret = 0; - - if ((ctxt == NULL) || (node == NULL)) return(-1); - xmlNodeDumpOutputInternal(ctxt, node); - return(ret); -} - -/** - * xmlSaveFlush: - * @ctxt: a document saving context - * - * Flush a document saving context, i.e. make sure that all bytes have - * been output. - * - * Returns the number of byte written or -1 in case of error. - */ -int -xmlSaveFlush(xmlSaveCtxtPtr ctxt) -{ - if (ctxt == NULL) return(-1); - if (ctxt->buf == NULL) return(-1); - return(xmlOutputBufferFlush(ctxt->buf)); -} - -/** - * xmlSaveClose: - * @ctxt: a document saving context - * - * Close a document saving context, i.e. make sure that all bytes have - * been output and free the associated data. - * - * Returns the number of byte written or -1 in case of error. - */ -int -xmlSaveClose(xmlSaveCtxtPtr ctxt) -{ - int ret; - - if (ctxt == NULL) return(-1); - ret = xmlSaveFlush(ctxt); - xmlFreeSaveCtxt(ctxt); - return(ret); -} - -/** - * xmlSaveSetEscape: - * @ctxt: a document saving context - * @escape: the escaping function - * - * Set a custom escaping function to be used for text in element content - * - * Returns 0 if successful or -1 in case of error. - */ -int -xmlSaveSetEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape) -{ - if (ctxt == NULL) return(-1); - ctxt->escape = escape; - return(0); -} - -/** - * xmlSaveSetAttrEscape: - * @ctxt: a document saving context - * @escape: the escaping function - * - * Set a custom escaping function to be used for text in attribute content - * - * Returns 0 if successful or -1 in case of error. - */ -int -xmlSaveSetAttrEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape) -{ - if (ctxt == NULL) return(-1); - ctxt->escapeAttr = escape; - return(0); -} - -/************************************************************************ - * * - * Public entry points based on buffers * - * * - ************************************************************************/ -/** - * xmlAttrSerializeTxtContent: - * @buf: the XML buffer output - * @doc: the document - * @attr: the attribute node - * @string: the text content - * - * Serialize text attribute values to an xml simple buffer - */ -void -xmlAttrSerializeTxtContent(xmlBufferPtr buf, xmlDocPtr doc, - xmlAttrPtr attr, const xmlChar * string) -{ - xmlChar *base, *cur; - - if (string == NULL) - return; - base = cur = (xmlChar *) string; - while (*cur != 0) { - if (*cur == '\n') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST " ", 5); - cur++; - base = cur; - } else if (*cur == '\r') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST " ", 5); - cur++; - base = cur; - } else if (*cur == '\t') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST "	", 4); - cur++; - base = cur; - } else if (*cur == '"') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST """, 6); - cur++; - base = cur; - } else if (*cur == '<') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST "<", 4); - cur++; - base = cur; - } else if (*cur == '>') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST ">", 4); - cur++; - base = cur; - } else if (*cur == '&') { - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - xmlBufferAdd(buf, BAD_CAST "&", 5); - cur++; - base = cur; - } else if ((*cur >= 0x80) && ((doc == NULL) || - (doc->encoding == NULL))) { - /* - * We assume we have UTF-8 content. - */ - unsigned char tmp[10]; - int val = 0, l = 1; - - if (base != cur) - xmlBufferAdd(buf, base, cur - base); - if (*cur < 0xC0) { - xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr, NULL); - if (doc != NULL) - doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); - xmlSerializeHexCharRef(tmp, *cur); - xmlBufferAdd(buf, (xmlChar *) tmp, -1); - cur++; - base = cur; - continue; - } else if (*cur < 0xE0) { - val = (cur[0]) & 0x1F; - val <<= 6; - val |= (cur[1]) & 0x3F; - l = 2; - } else if (*cur < 0xF0) { - val = (cur[0]) & 0x0F; - val <<= 6; - val |= (cur[1]) & 0x3F; - val <<= 6; - val |= (cur[2]) & 0x3F; - l = 3; - } else if (*cur < 0xF8) { - val = (cur[0]) & 0x07; - val <<= 6; - val |= (cur[1]) & 0x3F; - val <<= 6; - val |= (cur[2]) & 0x3F; - val <<= 6; - val |= (cur[3]) & 0x3F; - l = 4; - } - if ((l == 1) || (!IS_CHAR(val))) { - xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr, NULL); - if (doc != NULL) - doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); - - xmlSerializeHexCharRef(tmp, *cur); - xmlBufferAdd(buf, (xmlChar *) tmp, -1); - cur++; - base = cur; - continue; - } - /* - * We could do multiple things here. Just save - * as a char ref - */ - xmlSerializeHexCharRef(tmp, val); - xmlBufferAdd(buf, (xmlChar *) tmp, -1); - cur += l; - base = cur; - } else { - cur++; - } - } - if (base != cur) - xmlBufferAdd(buf, base, cur - base); -} - -/** - * xmlNodeDump: - * @buf: the XML buffer output - * @doc: the document - * @cur: the current node - * @level: the imbrication level for indenting - * @format: is formatting allowed - * - * Dump an XML node, recursive behaviour,children are printed too. - * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 - * or xmlKeepBlanksDefault(0) was called - * - * Returns the number of bytes written to the buffer or -1 in case of error - */ -int -xmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, - int format) -{ - unsigned int use; - int ret; - xmlOutputBufferPtr outbuf; - - xmlInitParser(); - - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNodeDump : node == NULL\n"); -#endif - return (-1); - } - if (buf == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlNodeDump : buf == NULL\n"); -#endif - return (-1); - } - outbuf = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); - if (outbuf == NULL) { - xmlSaveErrMemory("creating buffer"); - return (-1); - } - memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer)); - outbuf->buffer = buf; - outbuf->encoder = NULL; - outbuf->writecallback = NULL; - outbuf->closecallback = NULL; - outbuf->context = NULL; - outbuf->written = 0; - - use = buf->use; - xmlNodeDumpOutput(outbuf, doc, cur, level, format, NULL); - xmlFree(outbuf); - ret = buf->use - use; - return (ret); -} - -/** - * xmlElemDump: - * @f: the FILE * for the output - * @doc: the document - * @cur: the current node - * - * Dump an XML/HTML node, recursive behaviour, children are printed too. - */ -void -xmlElemDump(FILE * f, xmlDocPtr doc, xmlNodePtr cur) -{ - xmlOutputBufferPtr outbuf; - - xmlInitParser(); - - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlElemDump : cur == NULL\n"); -#endif - return; - } -#ifdef DEBUG_TREE - if (doc == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlElemDump : doc == NULL\n"); - } -#endif - - outbuf = xmlOutputBufferCreateFile(f, NULL); - if (outbuf == NULL) - return; - if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) { -#ifdef LIBXML_HTML_ENABLED - htmlNodeDumpOutput(outbuf, doc, cur, NULL); -#else - xmlSaveErr(XML_ERR_INTERNAL_ERROR, cur, "HTML support not compiled in\n"); -#endif /* LIBXML_HTML_ENABLED */ - } else - xmlNodeDumpOutput(outbuf, doc, cur, 0, 1, NULL); - xmlOutputBufferClose(outbuf); -} - -/************************************************************************ - * * - * Saving functions front-ends * - * * - ************************************************************************/ - -/** - * xmlNodeDumpOutput: - * @buf: the XML buffer output - * @doc: the document - * @cur: the current node - * @level: the imbrication level for indenting - * @format: is formatting allowed - * @encoding: an optional encoding string - * - * Dump an XML node, recursive behaviour, children are printed too. - * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 - * or xmlKeepBlanksDefault(0) was called - */ -void -xmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, - int level, int format, const char *encoding) -{ - xmlSaveCtxt ctxt; -#ifdef LIBXML_HTML_ENABLED - xmlDtdPtr dtd; - int is_xhtml = 0; -#endif - - xmlInitParser(); - - if ((buf == NULL) || (cur == NULL)) return; - - if (encoding == NULL) - encoding = "UTF-8"; - - memset(&ctxt, 0, sizeof(ctxt)); - ctxt.doc = doc; - ctxt.buf = buf; - ctxt.level = level; - ctxt.format = format; - ctxt.encoding = (const xmlChar *) encoding; - xmlSaveCtxtInit(&ctxt); - -#ifdef LIBXML_HTML_ENABLED - dtd = xmlGetIntSubset(doc); - if (dtd != NULL) { - is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); - if (is_xhtml < 0) - is_xhtml = 0; - } - - if (is_xhtml) - xhtmlNodeDumpOutput(&ctxt, cur); - else -#endif - xmlNodeDumpOutputInternal(&ctxt, cur); -} - -/** - * xmlDocDumpFormatMemoryEnc: - * @out_doc: Document to generate XML text from - * @doc_txt_ptr: Memory pointer for allocated XML text - * @doc_txt_len: Length of the generated XML text - * @txt_encoding: Character encoding to use when generating XML text - * @format: should formatting spaces been added - * - * Dump the current DOM tree into memory using the character encoding specified - * by the caller. Note it is up to the caller of this function to free the - * allocated memory with xmlFree(). - * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 - * or xmlKeepBlanksDefault(0) was called - */ - -void -xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, - int * doc_txt_len, const char * txt_encoding, - int format) { - xmlSaveCtxt ctxt; - int dummy = 0; - xmlOutputBufferPtr out_buff = NULL; - xmlCharEncodingHandlerPtr conv_hdlr = NULL; - - if (doc_txt_len == NULL) { - doc_txt_len = &dummy; /* Continue, caller just won't get length */ - } - - if (doc_txt_ptr == NULL) { - *doc_txt_len = 0; - return; - } - - *doc_txt_ptr = NULL; - *doc_txt_len = 0; - - if (out_doc == NULL) { - /* No document, no output */ - return; - } - - /* - * Validate the encoding value, if provided. - * This logic is copied from xmlSaveFileEnc. - */ - - if (txt_encoding == NULL) - txt_encoding = (const char *) out_doc->encoding; - if (txt_encoding != NULL) { - conv_hdlr = xmlFindCharEncodingHandler(txt_encoding); - if ( conv_hdlr == NULL ) { - xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, (xmlNodePtr) out_doc, - txt_encoding); - return; - } - } - - if ((out_buff = xmlAllocOutputBuffer(conv_hdlr)) == NULL ) { - xmlSaveErrMemory("creating buffer"); - return; - } - - memset(&ctxt, 0, sizeof(ctxt)); - ctxt.doc = out_doc; - ctxt.buf = out_buff; - ctxt.level = 0; - ctxt.format = format; - ctxt.encoding = (const xmlChar *) txt_encoding; - xmlSaveCtxtInit(&ctxt); - xmlDocContentDumpOutput(&ctxt, out_doc); - xmlOutputBufferFlush(out_buff); - if (out_buff->conv != NULL) { - *doc_txt_len = out_buff->conv->use; - *doc_txt_ptr = xmlStrndup(out_buff->conv->content, *doc_txt_len); - } else { - *doc_txt_len = out_buff->buffer->use; - *doc_txt_ptr = xmlStrndup(out_buff->buffer->content, *doc_txt_len); - } - (void)xmlOutputBufferClose(out_buff); - - if ((*doc_txt_ptr == NULL) && (*doc_txt_len > 0)) { - *doc_txt_len = 0; - xmlSaveErrMemory("creating output"); - } - - return; -} - -/** - * xmlDocDumpMemory: - * @cur: the document - * @mem: OUT: the memory pointer - * @size: OUT: the memory length - * - * Dump an XML document in memory and return the #xmlChar * and it's size - * in bytes. It's up to the caller to free the memory with xmlFree(). - * The resulting byte array is zero terminated, though the last 0 is not - * included in the returned size. - */ -void -xmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) { - xmlDocDumpFormatMemoryEnc(cur, mem, size, NULL, 0); -} - -/** - * xmlDocDumpFormatMemory: - * @cur: the document - * @mem: OUT: the memory pointer - * @size: OUT: the memory length - * @format: should formatting spaces been added - * - * - * Dump an XML document in memory and return the #xmlChar * and it's size. - * It's up to the caller to free the memory with xmlFree(). - * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 - * or xmlKeepBlanksDefault(0) was called - */ -void -xmlDocDumpFormatMemory(xmlDocPtr cur, xmlChar**mem, int *size, int format) { - xmlDocDumpFormatMemoryEnc(cur, mem, size, NULL, format); -} - -/** - * xmlDocDumpMemoryEnc: - * @out_doc: Document to generate XML text from - * @doc_txt_ptr: Memory pointer for allocated XML text - * @doc_txt_len: Length of the generated XML text - * @txt_encoding: Character encoding to use when generating XML text - * - * Dump the current DOM tree into memory using the character encoding specified - * by the caller. Note it is up to the caller of this function to free the - * allocated memory with xmlFree(). - */ - -void -xmlDocDumpMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, - int * doc_txt_len, const char * txt_encoding) { - xmlDocDumpFormatMemoryEnc(out_doc, doc_txt_ptr, doc_txt_len, - txt_encoding, 0); -} - -/** - * xmlDocFormatDump: - * @f: the FILE* - * @cur: the document - * @format: should formatting spaces been added - * - * Dump an XML document to an open FILE. - * - * returns: the number of bytes written or -1 in case of failure. - * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 - * or xmlKeepBlanksDefault(0) was called - */ -int -xmlDocFormatDump(FILE *f, xmlDocPtr cur, int format) { - xmlSaveCtxt ctxt; - xmlOutputBufferPtr buf; - const char * encoding; - xmlCharEncodingHandlerPtr handler = NULL; - int ret; - - if (cur == NULL) { -#ifdef DEBUG_TREE - xmlGenericError(xmlGenericErrorContext, - "xmlDocDump : document == NULL\n"); -#endif - return(-1); - } - encoding = (const char *) cur->encoding; - - if (encoding != NULL) { - handler = xmlFindCharEncodingHandler(encoding); - if (handler == NULL) { - xmlFree((char *) cur->encoding); - cur->encoding = NULL; - } - } - buf = xmlOutputBufferCreateFile(f, handler); - if (buf == NULL) return(-1); - memset(&ctxt, 0, sizeof(ctxt)); - ctxt.doc = cur; - ctxt.buf = buf; - ctxt.level = 0; - ctxt.format = format; - ctxt.encoding = (const xmlChar *) encoding; - xmlSaveCtxtInit(&ctxt); - xmlDocContentDumpOutput(&ctxt, cur); - - ret = xmlOutputBufferClose(buf); - return(ret); -} - -/** - * xmlDocDump: - * @f: the FILE* - * @cur: the document - * - * Dump an XML document to an open FILE. - * - * returns: the number of bytes written or -1 in case of failure. - */ -int -xmlDocDump(FILE *f, xmlDocPtr cur) { - return(xmlDocFormatDump (f, cur, 0)); -} - -/** - * xmlSaveFileTo: - * @buf: an output I/O buffer - * @cur: the document - * @encoding: the encoding if any assuming the I/O layer handles the trancoding - * - * Dump an XML document to an I/O buffer. - * Warning ! This call xmlOutputBufferClose() on buf which is not available - * after this call. - * - * returns: the number of bytes written or -1 in case of failure. - */ -int -xmlSaveFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding) { - xmlSaveCtxt ctxt; - int ret; - - if (buf == NULL) return(-1); - if (cur == NULL) { - xmlOutputBufferClose(buf); - return(-1); - } - memset(&ctxt, 0, sizeof(ctxt)); - ctxt.doc = cur; - ctxt.buf = buf; - ctxt.level = 0; - ctxt.format = 0; - ctxt.encoding = (const xmlChar *) encoding; - xmlSaveCtxtInit(&ctxt); - xmlDocContentDumpOutput(&ctxt, cur); - ret = xmlOutputBufferClose(buf); - return(ret); -} - -/** - * xmlSaveFormatFileTo: - * @buf: an output I/O buffer - * @cur: the document - * @encoding: the encoding if any assuming the I/O layer handles the trancoding - * @format: should formatting spaces been added - * - * Dump an XML document to an I/O buffer. - * Warning ! This call xmlOutputBufferClose() on buf which is not available - * after this call. - * - * returns: the number of bytes written or -1 in case of failure. - */ -int -xmlSaveFormatFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur, - const char *encoding, int format) -{ - xmlSaveCtxt ctxt; - int ret; - - if (buf == NULL) return(-1); - if ((cur == NULL) || - ((cur->type != XML_DOCUMENT_NODE) && - (cur->type != XML_HTML_DOCUMENT_NODE))) { - xmlOutputBufferClose(buf); - return(-1); - } - memset(&ctxt, 0, sizeof(ctxt)); - ctxt.doc = cur; - ctxt.buf = buf; - ctxt.level = 0; - ctxt.format = format; - ctxt.encoding = (const xmlChar *) encoding; - xmlSaveCtxtInit(&ctxt); - xmlDocContentDumpOutput(&ctxt, cur); - ret = xmlOutputBufferClose(buf); - return (ret); -} - -/** - * xmlSaveFormatFileEnc: - * @filename: the filename or URL to output - * @cur: the document being saved - * @encoding: the name of the encoding to use or NULL. - * @format: should formatting spaces be added. - * - * Dump an XML document to a file or an URL. - * - * Returns the number of bytes written or -1 in case of error. - * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 - * or xmlKeepBlanksDefault(0) was called - */ -int -xmlSaveFormatFileEnc( const char * filename, xmlDocPtr cur, - const char * encoding, int format ) { - xmlSaveCtxt ctxt; - xmlOutputBufferPtr buf; - xmlCharEncodingHandlerPtr handler = NULL; - int ret; - - if (cur == NULL) - return(-1); - - if (encoding == NULL) - encoding = (const char *) cur->encoding; - - if (encoding != NULL) { - - handler = xmlFindCharEncodingHandler(encoding); - if (handler == NULL) - return(-1); - } - -#ifdef HAVE_ZLIB_H - if (cur->compression < 0) cur->compression = xmlGetCompressMode(); -#endif - /* - * save the content to a temp buffer. - */ - buf = xmlOutputBufferCreateFilename(filename, handler, cur->compression); - if (buf == NULL) return(-1); - memset(&ctxt, 0, sizeof(ctxt)); - ctxt.doc = cur; - ctxt.buf = buf; - ctxt.level = 0; - ctxt.format = format; - ctxt.encoding = (const xmlChar *) encoding; - xmlSaveCtxtInit(&ctxt); - - xmlDocContentDumpOutput(&ctxt, cur); - - ret = xmlOutputBufferClose(buf); - return(ret); -} - - -/** - * xmlSaveFileEnc: - * @filename: the filename (or URL) - * @cur: the document - * @encoding: the name of an encoding (or NULL) - * - * Dump an XML document, converting it to the given encoding - * - * returns: the number of bytes written or -1 in case of failure. - */ -int -xmlSaveFileEnc(const char *filename, xmlDocPtr cur, const char *encoding) { - return ( xmlSaveFormatFileEnc( filename, cur, encoding, 0 ) ); -} - -/** - * xmlSaveFormatFile: - * @filename: the filename (or URL) - * @cur: the document - * @format: should formatting spaces been added - * - * Dump an XML document to a file. Will use compression if - * compiled in and enabled. If @filename is "-" the stdout file is - * used. If @format is set then the document will be indented on output. - * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 - * or xmlKeepBlanksDefault(0) was called - * - * returns: the number of bytes written or -1 in case of failure. - */ -int -xmlSaveFormatFile(const char *filename, xmlDocPtr cur, int format) { - return ( xmlSaveFormatFileEnc( filename, cur, NULL, format ) ); -} - -/** - * xmlSaveFile: - * @filename: the filename (or URL) - * @cur: the document - * - * Dump an XML document to a file. Will use compression if - * compiled in and enabled. If @filename is "-" the stdout file is - * used. - * returns: the number of bytes written or -1 in case of failure. - */ -int -xmlSaveFile(const char *filename, xmlDocPtr cur) { - return(xmlSaveFormatFileEnc(filename, cur, NULL, 0)); -} - -#endif /* LIBXML_OUTPUT_ENABLED */ - -#define bottom_xmlsave -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/xmlschemas.c b/ThirdParty/libxml2/vtklibxml2/xmlschemas.c deleted file mode 100644 index dd54e51064a..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlschemas.c +++ /dev/null @@ -1,28654 +0,0 @@ -/* - * schemas.c : implementation of the XML Schema handling and - * schema validity checking - * - * See Copyright for the status of this software. - * - * Daniel Veillard <veillard@redhat.com> - */ - -/* - * TODO: - * - when types are redefined in includes, check that all - * types in the redef list are equal - * -> need a type equality operation. - * - if we don't intend to use the schema for schemas, we - * need to validate all schema attributes (ref, type, name) - * against their types. - * - Eliminate item creation for: ?? - * - * URGENT TODO: - * - For xsi-driven schema acquisition, augment the IDCs after every - * acquisition episode (xmlSchemaAugmentIDC). - * - * NOTES: - * - Elimated item creation for: <restriction>, <extension>, - * <simpleContent>, <complexContent>, <list>, <union> - * - * PROBLEMS: - * - http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0337.html - * IDC XPath expression and chameleon includes: the targetNamespace is changed, so - * XPath will have trouble to resolve to this namespace, since not known. - * - * - * CONSTRAINTS: - * - * Schema Component Constraint: - * All Group Limited (cos-all-limited) - * Status: complete - * (1.2) - * In xmlSchemaGroupDefReferenceTermFixup() and - * (2) - * In xmlSchemaParseModelGroup() - * TODO: Actually this should go to component-level checks, - * but is done here due to performance. Move it to an other layer - * is schema construction via an API is implemented. - */ -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_SCHEMAS_ENABLED - -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/hash.h> -#include <libxml/uri.h> -#include <libxml/xmlschemas.h> -#include <libxml/schemasInternals.h> -#include <libxml/xmlschemastypes.h> -#include <libxml/xmlautomata.h> -#include <libxml/xmlregexp.h> -#include <libxml/dict.h> -#include <libxml/encoding.h> -#include <libxml/xmlIO.h> -#ifdef LIBXML_PATTERN_ENABLED -#include <libxml/pattern.h> -#endif -#ifdef LIBXML_READER_ENABLED -#include <libxml/xmlreader.h> -#endif - -/* #define DEBUG 1 */ - -/* #define DEBUG_CONTENT 1 */ - -/* #define DEBUG_TYPE 1 */ - -/* #define DEBUG_CONTENT_REGEXP 1 */ - -/* #define DEBUG_AUTOMATA 1 */ - -/* #define DEBUG_IDC */ - -/* #define DEBUG_IDC_NODE_TABLE */ - -/* #define WXS_ELEM_DECL_CONS_ENABLED */ - -#ifdef DEBUG_IDC - #ifndef DEBUG_IDC_NODE_TABLE - #define DEBUG_IDC_NODE_TABLE - #endif -#endif - -/* #define ENABLE_PARTICLE_RESTRICTION 1 */ - -#define ENABLE_REDEFINE - -/* #define ENABLE_NAMED_LOCALS */ - -/* #define ENABLE_IDC_NODE_TABLES_TEST */ - -#define DUMP_CONTENT_MODEL - -#ifdef LIBXML_READER_ENABLED -/* #define XML_SCHEMA_READER_ENABLED */ -#endif - -#define UNBOUNDED (1 << 30) -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -#define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##" - -/* - * The XML Schemas namespaces - */ -static const xmlChar *xmlSchemaNs = (const xmlChar *) - "http://www.w3.org/2001/XMLSchema"; - -static const xmlChar *xmlSchemaInstanceNs = (const xmlChar *) - "http://www.w3.org/2001/XMLSchema-instance"; - -static const xmlChar *xmlNamespaceNs = (const xmlChar *) - "http://www.w3.org/2000/xmlns/"; - -/* -* Come casting macros. -*/ -#define ACTXT_CAST (xmlSchemaAbstractCtxtPtr) -#define PCTXT_CAST (xmlSchemaParserCtxtPtr) -#define VCTXT_CAST (xmlSchemaValidCtxtPtr) -#define WXS_BASIC_CAST (xmlSchemaBasicItemPtr) -#define WXS_TREE_CAST (xmlSchemaTreeItemPtr) -#define WXS_PTC_CAST (xmlSchemaParticlePtr) -#define WXS_TYPE_CAST (xmlSchemaTypePtr) -#define WXS_ELEM_CAST (xmlSchemaElementPtr) -#define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr) -#define WXS_ATTR_CAST (xmlSchemaAttributePtr) -#define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr) -#define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr) -#define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr) -#define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr) -#define WXS_IDC_CAST (xmlSchemaIDCPtr) -#define WXS_QNAME_CAST (xmlSchemaQNameRefPtr) -#define WXS_LIST_CAST (xmlSchemaItemListPtr) - -/* -* Macros to query common properties of components. -*/ -#define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i)) - -#define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i)) -/* -* Macros for element declarations. -*/ -#define WXS_ELEM_TYPEDEF(e) (e)->subtypes - -#define WXS_SUBST_HEAD(item) (item)->refDecl -/* -* Macros for attribute declarations. -*/ -#define WXS_ATTR_TYPEDEF(a) (a)->subtypes -/* -* Macros for attribute uses. -*/ -#define WXS_ATTRUSE_DECL(au) WXS_ATTR_CAST (WXS_ATTR_USE_CAST (au))->attrDecl - -#define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au)) - -#define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name - -#define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace -/* -* Macros for attribute groups. -*/ -#define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) -#define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) -/* -* Macros for particles. -*/ -#define WXS_PARTICLE(p) WXS_PTC_CAST (p) - -#define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children - -#define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p)) - -#define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children -/* -* Macros for model groups definitions. -*/ -#define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children -/* -* Macros for model groups. -*/ -#define WXS_IS_MODEL_GROUP(i) \ - (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \ - ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \ - ((i)->type == XML_SCHEMA_TYPE_ALL)) - -#define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children -/* -* Macros for schema buckets. -*/ -#define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \ - ((t) == XML_SCHEMA_SCHEMA_REDEFINE)) - -#define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \ - ((t) == XML_SCHEMA_SCHEMA_IMPORT)) - -#define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b)) - -#define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b)) -/* -* Macros for complex/simple types. -*/ -#define WXS_IS_ANYTYPE(i) \ - (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \ - ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE)) - -#define WXS_IS_COMPLEX(i) \ - (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \ - ((i)->builtInType == XML_SCHEMAS_ANYTYPE)) - -#define WXS_IS_SIMPLE(item) \ - ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \ - ((item->type == XML_SCHEMA_TYPE_BASIC) && \ - (item->builtInType != XML_SCHEMAS_ANYTYPE))) - -#define WXS_IS_ANY_SIMPLE_TYPE(i) \ - (((i)->type == XML_SCHEMA_TYPE_BASIC) && \ - ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) - -#define WXS_IS_RESTRICTION(t) \ - ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION) - -#define WXS_IS_EXTENSION(t) \ - ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION) - -#define WXS_IS_TYPE_NOT_FIXED(i) \ - (((i)->type != XML_SCHEMA_TYPE_BASIC) && \ - (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0)) - -#define WXS_IS_TYPE_NOT_FIXED_1(item) \ - (((item)->type != XML_SCHEMA_TYPE_BASIC) && \ - (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0)) - -#define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) - -#define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0) -/* -* Macros for exclusively for complex types. -*/ -#define WXS_HAS_COMPLEX_CONTENT(item) \ - ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \ - (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \ - (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) - -#define WXS_HAS_SIMPLE_CONTENT(item) \ - ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \ - (item->contentType == XML_SCHEMA_CONTENT_BASIC)) - -#define WXS_HAS_MIXED_CONTENT(item) \ - (item->contentType == XML_SCHEMA_CONTENT_MIXED) - -#define WXS_EMPTIABLE(t) \ - (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes)) - -#define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes - -#define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes - -#define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t)) -/* -* Macros for exclusively for simple types. -*/ -#define WXS_LIST_ITEMTYPE(t) (t)->subtypes - -#define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC) - -#define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST) - -#define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION) -/* -* Misc parser context macros. -*/ -#define WXS_CONSTRUCTOR(ctx) (ctx)->constructor - -#define WXS_HAS_BUCKETS(ctx) \ -( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \ -(WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) ) - -#define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups - -#define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket - -#define WXS_SCHEMA(ctx) (ctx)->schema - -#define WXS_ADD_LOCAL(ctx, item) \ - xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item) - -#define WXS_ADD_GLOBAL(ctx, item) \ - xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item) - -#define WXS_ADD_PENDING(ctx, item) \ - xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item) -/* -* xmlSchemaItemList macros. -*/ -#define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0)) -/* -* Misc macros. -*/ -#define IS_SCHEMA(node, type) \ - ((node != NULL) && (node->ns != NULL) && \ - (xmlStrEqual(node->name, (const xmlChar *) type)) && \ - (xmlStrEqual(node->ns->href, xmlSchemaNs))) - -#define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; } - -/* -* Since we put the default/fixed values into the dict, we can -* use pointer comparison for those values. -* REMOVED: (xmlStrEqual((v1), (v2))) -*/ -#define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2)) - -#define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED) - -#define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0)) - -#define HFAILURE if (res == -1) goto exit_failure; - -#define HERROR if (res != 0) goto exit_error; - -#define HSTOP(ctx) if ((ctx)->stop) goto exit; -/* -* Some flags used for various schema constraints. -*/ -#define SUBSET_RESTRICTION 1<<0 -#define SUBSET_EXTENSION 1<<1 -#define SUBSET_SUBSTITUTION 1<<2 -#define SUBSET_LIST 1<<3 -#define SUBSET_UNION 1<<4 - -typedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo; -typedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr; - -typedef struct _xmlSchemaItemList xmlSchemaItemList; -typedef xmlSchemaItemList *xmlSchemaItemListPtr; -struct _xmlSchemaItemList { - void **items; /* used for dynamic addition of schemata */ - int nbItems; /* used for dynamic addition of schemata */ - int sizeItems; /* used for dynamic addition of schemata */ -}; - -#define XML_SCHEMA_CTXT_PARSER 1 -#define XML_SCHEMA_CTXT_VALIDATOR 2 - -typedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt; -typedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr; -struct _xmlSchemaAbstractCtxt { - int type; /* E.g. XML_SCHEMA_CTXT_VALIDATOR */ -}; - -typedef struct _xmlSchemaBucket xmlSchemaBucket; -typedef xmlSchemaBucket *xmlSchemaBucketPtr; - -#define XML_SCHEMA_SCHEMA_MAIN 0 -#define XML_SCHEMA_SCHEMA_IMPORT 1 -#define XML_SCHEMA_SCHEMA_INCLUDE 2 -#define XML_SCHEMA_SCHEMA_REDEFINE 3 - -/** - * xmlSchemaSchemaRelation: - * - * Used to create a graph of schema relationships. - */ -typedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation; -typedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr; -struct _xmlSchemaSchemaRelation { - xmlSchemaSchemaRelationPtr next; - int type; /* E.g. XML_SCHEMA_SCHEMA_IMPORT */ - const xmlChar *importNamespace; - xmlSchemaBucketPtr bucket; -}; - -#define XML_SCHEMA_BUCKET_MARKED 1<<0 -#define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1 - -struct _xmlSchemaBucket { - int type; - int flags; - const xmlChar *schemaLocation; - const xmlChar *origTargetNamespace; - const xmlChar *targetNamespace; - xmlDocPtr doc; - xmlSchemaSchemaRelationPtr relations; - int located; - int parsed; - int imported; - int preserveDoc; - xmlSchemaItemListPtr globals; /* Global components. */ - xmlSchemaItemListPtr locals; /* Local components. */ -}; - -/** - * xmlSchemaImport: - * (extends xmlSchemaBucket) - * - * Reflects a schema. Holds some information - * about the schema and its toplevel components. Duplicate - * toplevel components are not checked at this level. - */ -typedef struct _xmlSchemaImport xmlSchemaImport; -typedef xmlSchemaImport *xmlSchemaImportPtr; -struct _xmlSchemaImport { - int type; /* Main OR import OR include. */ - int flags; - const xmlChar *schemaLocation; /* The URI of the schema document. */ - /* For chameleon includes, @origTargetNamespace will be NULL */ - const xmlChar *origTargetNamespace; - /* - * For chameleon includes, @targetNamespace will be the - * targetNamespace of the including schema. - */ - const xmlChar *targetNamespace; - xmlDocPtr doc; /* The schema node-tree. */ - /* @relations will hold any included/imported/redefined schemas. */ - xmlSchemaSchemaRelationPtr relations; - int located; - int parsed; - int imported; - int preserveDoc; - xmlSchemaItemListPtr globals; - xmlSchemaItemListPtr locals; - /* The imported schema. */ - xmlSchemaPtr schema; -}; - -/* -* (extends xmlSchemaBucket) -*/ -typedef struct _xmlSchemaInclude xmlSchemaInclude; -typedef xmlSchemaInclude *xmlSchemaIncludePtr; -struct _xmlSchemaInclude { - int type; - int flags; - const xmlChar *schemaLocation; - const xmlChar *origTargetNamespace; - const xmlChar *targetNamespace; - xmlDocPtr doc; - xmlSchemaSchemaRelationPtr relations; - int located; - int parsed; - int imported; - int preserveDoc; - xmlSchemaItemListPtr globals; /* Global components. */ - xmlSchemaItemListPtr locals; /* Local components. */ - - /* The owning main or import schema bucket. */ - xmlSchemaImportPtr ownerImport; -}; - -/** - * xmlSchemaBasicItem: - * - * The abstract base type for schema components. - */ -typedef struct _xmlSchemaBasicItem xmlSchemaBasicItem; -typedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr; -struct _xmlSchemaBasicItem { - xmlSchemaTypeType type; -}; - -/** - * xmlSchemaAnnotItem: - * - * The abstract base type for annotated schema components. - * (Extends xmlSchemaBasicItem) - */ -typedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem; -typedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr; -struct _xmlSchemaAnnotItem { - xmlSchemaTypeType type; - xmlSchemaAnnotPtr annot; -}; - -/** - * xmlSchemaTreeItem: - * - * The abstract base type for tree-like structured schema components. - * (Extends xmlSchemaAnnotItem) - */ -typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; -typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; -struct _xmlSchemaTreeItem { - xmlSchemaTypeType type; - xmlSchemaAnnotPtr annot; - xmlSchemaTreeItemPtr next; - xmlSchemaTreeItemPtr children; -}; - - -#define XML_SCHEMA_ATTR_USE_FIXED 1<<0 -/** - * xmlSchemaAttributeUsePtr: - * - * The abstract base type for tree-like structured schema components. - * (Extends xmlSchemaTreeItem) - */ -typedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse; -typedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr; -struct _xmlSchemaAttributeUse { - xmlSchemaTypeType type; - xmlSchemaAnnotPtr annot; - xmlSchemaAttributeUsePtr next; /* The next attr. use. */ - /* - * The attr. decl. OR a QName-ref. to an attr. decl. OR - * a QName-ref. to an attribute group definition. - */ - xmlSchemaAttributePtr attrDecl; - - int flags; - xmlNodePtr node; - int occurs; /* required, optional */ - const xmlChar * defValue; - xmlSchemaValPtr defVal; -}; - -/** - * xmlSchemaAttributeUseProhibPtr: - * - * A helper component to reflect attribute prohibitions. - * (Extends xmlSchemaBasicItem) - */ -typedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib; -typedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr; -struct _xmlSchemaAttributeUseProhib { - xmlSchemaTypeType type; /* == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB */ - xmlNodePtr node; - const xmlChar *name; - const xmlChar *targetNamespace; - int isRef; -}; - -/** - * xmlSchemaRedef: - */ -typedef struct _xmlSchemaRedef xmlSchemaRedef; -typedef xmlSchemaRedef *xmlSchemaRedefPtr; -struct _xmlSchemaRedef { - xmlSchemaRedefPtr next; - xmlSchemaBasicItemPtr item; /* The redefining component. */ - xmlSchemaBasicItemPtr reference; /* The referencing component. */ - xmlSchemaBasicItemPtr target; /* The to-be-redefined component. */ - const xmlChar *refName; /* The name of the to-be-redefined component. */ - const xmlChar *refTargetNs; /* The target namespace of the - to-be-redefined comp. */ - xmlSchemaBucketPtr targetBucket; /* The redefined schema. */ -}; - -/** - * xmlSchemaConstructionCtxt: - */ -typedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt; -typedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr; -struct _xmlSchemaConstructionCtxt { - xmlSchemaPtr mainSchema; /* The main schema. */ - xmlSchemaBucketPtr mainBucket; /* The main schema bucket */ - xmlDictPtr dict; - xmlSchemaItemListPtr buckets; /* List of schema buckets. */ - /* xmlSchemaItemListPtr relations; */ /* List of schema relations. */ - xmlSchemaBucketPtr bucket; /* The current schema bucket */ - xmlSchemaItemListPtr pending; /* All Components of all schemas that - need to be fixed. */ - xmlHashTablePtr substGroups; - xmlSchemaRedefPtr redefs; - xmlSchemaRedefPtr lastRedef; -}; - -#define XML_SCHEMAS_PARSE_ERROR 1 -#define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT - -struct _xmlSchemaParserCtxt { - int type; - void *errCtxt; /* user specific error context */ - xmlSchemaValidityErrorFunc error; /* the callback in case of errors */ - xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */ - int err; - int nberrors; - xmlStructuredErrorFunc serror; - - xmlSchemaConstructionCtxtPtr constructor; - int ownsConstructor; /* TODO: Move this to parser *flags*. */ - - /* xmlSchemaPtr topschema; */ - /* xmlHashTablePtr namespaces; */ - - xmlSchemaPtr schema; /* The main schema in use */ - int counter; - - const xmlChar *URL; - xmlDocPtr doc; - int preserve; /* Whether the doc should be freed */ - - const char *buffer; - int size; - - /* - * Used to build complex element content models - */ - xmlAutomataPtr am; - xmlAutomataStatePtr start; - xmlAutomataStatePtr end; - xmlAutomataStatePtr state; - - xmlDictPtr dict; /* dictionnary for interned string names */ - xmlSchemaTypePtr ctxtType; /* The current context simple/complex type */ - int options; - xmlSchemaValidCtxtPtr vctxt; - int isS4S; - int isRedefine; - int xsiAssemble; - int stop; /* If the parser should stop; i.e. a critical error. */ - const xmlChar *targetNamespace; - xmlSchemaBucketPtr redefined; /* The schema to be redefined. */ - - xmlSchemaRedefPtr redef; /* Used for redefinitions. */ - int redefCounter; /* Used for redefinitions. */ - xmlSchemaItemListPtr attrProhibs; -}; - -/** - * xmlSchemaQNameRef: - * - * A component reference item (not a schema component) - * (Extends xmlSchemaBasicItem) - */ -typedef struct _xmlSchemaQNameRef xmlSchemaQNameRef; -typedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr; -struct _xmlSchemaQNameRef { - xmlSchemaTypeType type; - xmlSchemaBasicItemPtr item; /* The resolved referenced item. */ - xmlSchemaTypeType itemType; - const xmlChar *name; - const xmlChar *targetNamespace; - xmlNodePtr node; -}; - -/** - * xmlSchemaParticle: - * - * A particle component. - * (Extends xmlSchemaTreeItem) - */ -typedef struct _xmlSchemaParticle xmlSchemaParticle; -typedef xmlSchemaParticle *xmlSchemaParticlePtr; -struct _xmlSchemaParticle { - xmlSchemaTypeType type; - xmlSchemaAnnotPtr annot; - xmlSchemaTreeItemPtr next; /* next particle */ - xmlSchemaTreeItemPtr children; /* the "term" (e.g. a model group, - a group definition, a XML_SCHEMA_EXTRA_QNAMEREF (if a reference), - etc.) */ - int minOccurs; - int maxOccurs; - xmlNodePtr node; -}; - -/** - * xmlSchemaModelGroup: - * - * A model group component. - * (Extends xmlSchemaTreeItem) - */ -typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; -typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; -struct _xmlSchemaModelGroup { - xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_SEQUENCE, XML_SCHEMA_TYPE_CHOICE, XML_SCHEMA_TYPE_ALL */ - xmlSchemaAnnotPtr annot; - xmlSchemaTreeItemPtr next; /* not used */ - xmlSchemaTreeItemPtr children; /* first particle (OR "element decl" OR "wildcard") */ - xmlNodePtr node; -}; - -#define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0 -#define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1 -/** - * xmlSchemaModelGroupDef: - * - * A model group definition component. - * (Extends xmlSchemaTreeItem) - */ -typedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef; -typedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr; -struct _xmlSchemaModelGroupDef { - xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_GROUP */ - xmlSchemaAnnotPtr annot; - xmlSchemaTreeItemPtr next; /* not used */ - xmlSchemaTreeItemPtr children; /* the "model group" */ - const xmlChar *name; - const xmlChar *targetNamespace; - xmlNodePtr node; - int flags; -}; - -typedef struct _xmlSchemaIDC xmlSchemaIDC; -typedef xmlSchemaIDC *xmlSchemaIDCPtr; - -/** - * xmlSchemaIDCSelect: - * - * The identity-constraint "field" and "selector" item, holding the - * XPath expression. - */ -typedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect; -typedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr; -struct _xmlSchemaIDCSelect { - xmlSchemaIDCSelectPtr next; - xmlSchemaIDCPtr idc; - int index; /* an index position if significant for IDC key-sequences */ - const xmlChar *xpath; /* the XPath expression */ - void *xpathComp; /* the compiled XPath expression */ -}; - -/** - * xmlSchemaIDC: - * - * The identity-constraint definition component. - * (Extends xmlSchemaAnnotItem) - */ - -struct _xmlSchemaIDC { - xmlSchemaTypeType type; - xmlSchemaAnnotPtr annot; - xmlSchemaIDCPtr next; - xmlNodePtr node; - const xmlChar *name; - const xmlChar *targetNamespace; - xmlSchemaIDCSelectPtr selector; - xmlSchemaIDCSelectPtr fields; - int nbFields; - xmlSchemaQNameRefPtr ref; -}; - -/** - * xmlSchemaIDCAug: - * - * The augmented IDC information used for validation. - */ -typedef struct _xmlSchemaIDCAug xmlSchemaIDCAug; -typedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr; -struct _xmlSchemaIDCAug { - xmlSchemaIDCAugPtr next; /* next in a list */ - xmlSchemaIDCPtr def; /* the IDC definition */ - int keyrefDepth; /* the lowest tree level to which IDC - tables need to be bubbled upwards */ -}; - -/** - * xmlSchemaPSVIIDCKeySequence: - * - * The key sequence of a node table item. - */ -typedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey; -typedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr; -struct _xmlSchemaPSVIIDCKey { - xmlSchemaTypePtr type; - xmlSchemaValPtr val; -}; - -/** - * xmlSchemaPSVIIDCNode: - * - * The node table item of a node table. - */ -typedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode; -typedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr; -struct _xmlSchemaPSVIIDCNode { - xmlNodePtr node; - xmlSchemaPSVIIDCKeyPtr *keys; - int nodeLine; - int nodeQNameID; - -}; - -/** - * xmlSchemaPSVIIDCBinding: - * - * The identity-constraint binding item of the [identity-constraint table]. - */ -typedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding; -typedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr; -struct _xmlSchemaPSVIIDCBinding { - xmlSchemaPSVIIDCBindingPtr next; /* next binding of a specific node */ - xmlSchemaIDCPtr definition; /* the IDC definition */ - xmlSchemaPSVIIDCNodePtr *nodeTable; /* array of key-sequences */ - int nbNodes; /* number of entries in the node table */ - int sizeNodes; /* size of the node table */ - xmlSchemaItemListPtr dupls; -}; - - -#define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1 -#define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2 - -#define XPATH_STATE_OBJ_MATCHES -2 -#define XPATH_STATE_OBJ_BLOCKED -3 - -typedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher; -typedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr; - -/** - * xmlSchemaIDCStateObj: - * - * The state object used to evaluate XPath expressions. - */ -typedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj; -typedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr; -struct _xmlSchemaIDCStateObj { - int type; - xmlSchemaIDCStateObjPtr next; /* next if in a list */ - int depth; /* depth of creation */ - int *history; /* list of (depth, state-id) tuples */ - int nbHistory; - int sizeHistory; - xmlSchemaIDCMatcherPtr matcher; /* the correspondent field/selector - matcher */ - xmlSchemaIDCSelectPtr sel; - void *xpathCtxt; -}; - -#define IDC_MATCHER 0 - -/** - * xmlSchemaIDCMatcher: - * - * Used to evaluate IDC selectors (and fields). - */ -struct _xmlSchemaIDCMatcher { - int type; - int depth; /* the tree depth at creation time */ - xmlSchemaIDCMatcherPtr next; /* next in the list */ - xmlSchemaIDCMatcherPtr nextCached; /* next in the cache list */ - xmlSchemaIDCAugPtr aidc; /* the augmented IDC item */ - int idcType; - xmlSchemaPSVIIDCKeyPtr **keySeqs; /* the key-sequences of the target - elements */ - int sizeKeySeqs; - xmlSchemaItemListPtr targets; /* list of target-node - (xmlSchemaPSVIIDCNodePtr) entries */ -}; - -/* -* Element info flags. -*/ -#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES 1<<0 -#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1 -#define XML_SCHEMA_ELEM_INFO_NILLED 1<<2 -#define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE 1<<3 - -#define XML_SCHEMA_NODE_INFO_VALUE_NEEDED 1<<4 -#define XML_SCHEMA_ELEM_INFO_EMPTY 1<<5 -#define XML_SCHEMA_ELEM_INFO_HAS_CONTENT 1<<6 - -#define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT 1<<7 -#define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT 1<<8 -#define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED 1<<9 -#define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE 1<<10 - -/** - * xmlSchemaNodeInfo: - * - * Holds information of an element node. - */ -struct _xmlSchemaNodeInfo { - int nodeType; - xmlNodePtr node; - int nodeLine; - const xmlChar *localName; - const xmlChar *nsName; - const xmlChar *value; - xmlSchemaValPtr val; /* the pre-computed value if any */ - xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */ - - int flags; /* combination of node info flags */ - - int valNeeded; - int normVal; - - xmlSchemaElementPtr decl; /* the element/attribute declaration */ - int depth; - xmlSchemaPSVIIDCBindingPtr idcTable; /* the table of PSVI IDC bindings - for the scope element*/ - xmlSchemaIDCMatcherPtr idcMatchers; /* the IDC matchers for the scope - element */ - xmlRegExecCtxtPtr regexCtxt; - - const xmlChar **nsBindings; /* Namespace bindings on this element */ - int nbNsBindings; - int sizeNsBindings; - - int hasKeyrefs; - int appliedXPath; /* Indicates that an XPath has been applied. */ -}; - -#define XML_SCHEMAS_ATTR_UNKNOWN 1 -#define XML_SCHEMAS_ATTR_ASSESSED 2 -#define XML_SCHEMAS_ATTR_PROHIBITED 3 -#define XML_SCHEMAS_ATTR_ERR_MISSING 4 -#define XML_SCHEMAS_ATTR_INVALID_VALUE 5 -#define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6 -#define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7 -#define XML_SCHEMAS_ATTR_DEFAULT 8 -#define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9 -#define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10 -#define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11 -#define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12 -#define XML_SCHEMAS_ATTR_WILD_SKIP 13 -#define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14 -#define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15 -#define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16 -#define XML_SCHEMAS_ATTR_META 17 -/* -* @metaType values of xmlSchemaAttrInfo. -*/ -#define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1 -#define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2 -#define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3 -#define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4 -#define XML_SCHEMA_ATTR_INFO_META_XMLNS 5 - -typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo; -typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr; -struct _xmlSchemaAttrInfo { - int nodeType; - xmlNodePtr node; - int nodeLine; - const xmlChar *localName; - const xmlChar *nsName; - const xmlChar *value; - xmlSchemaValPtr val; /* the pre-computed value if any */ - xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */ - int flags; /* combination of node info flags */ - - xmlSchemaAttributePtr decl; /* the attribute declaration */ - xmlSchemaAttributeUsePtr use; /* the attribute use */ - int state; - int metaType; - const xmlChar *vcValue; /* the value constraint value */ - xmlSchemaNodeInfoPtr parent; -}; - - -#define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1 -/** - * xmlSchemaValidCtxt: - * - * A Schemas validation context - */ -struct _xmlSchemaValidCtxt { - int type; - void *errCtxt; /* user specific data block */ - xmlSchemaValidityErrorFunc error; /* the callback in case of errors */ - xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */ - xmlStructuredErrorFunc serror; - - xmlSchemaPtr schema; /* The schema in use */ - xmlDocPtr doc; - xmlParserInputBufferPtr input; - xmlCharEncoding enc; - xmlSAXHandlerPtr sax; - xmlParserCtxtPtr parserCtxt; - void *user_data; /* TODO: What is this for? */ - - int err; - int nberrors; - - xmlNodePtr node; - xmlNodePtr cur; - /* xmlSchemaTypePtr type; */ - - xmlRegExecCtxtPtr regexp; - xmlSchemaValPtr value; - - int valueWS; - int options; - xmlNodePtr validationRoot; - xmlSchemaParserCtxtPtr pctxt; - int xsiAssemble; - - int depth; - xmlSchemaNodeInfoPtr *elemInfos; /* array of element informations */ - int sizeElemInfos; - xmlSchemaNodeInfoPtr inode; /* the current element information */ - - xmlSchemaIDCAugPtr aidcs; /* a list of augmented IDC informations */ - - xmlSchemaIDCStateObjPtr xpathStates; /* first active state object. */ - xmlSchemaIDCStateObjPtr xpathStatePool; /* first stored state object. */ - xmlSchemaIDCMatcherPtr idcMatcherCache; /* Cache for IDC matcher objects. */ - - xmlSchemaPSVIIDCNodePtr *idcNodes; /* list of all IDC node-table entries*/ - int nbIdcNodes; - int sizeIdcNodes; - - xmlSchemaPSVIIDCKeyPtr *idcKeys; /* list of all IDC node-table entries */ - int nbIdcKeys; - int sizeIdcKeys; - - int flags; - - xmlDictPtr dict; - -#ifdef LIBXML_READER_ENABLED - xmlTextReaderPtr reader; -#endif - - xmlSchemaAttrInfoPtr *attrInfos; - int nbAttrInfos; - int sizeAttrInfos; - - int skipDepth; - xmlSchemaItemListPtr nodeQNames; - int hasKeyrefs; - int createIDCNodeTables; - int psviExposeIDCNodeTables; -}; - -/** - * xmlSchemaSubstGroup: - * - * - */ -typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup; -typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr; -struct _xmlSchemaSubstGroup { - xmlSchemaElementPtr head; - xmlSchemaItemListPtr members; -}; - -/************************************************************************ - * * - * Some predeclarations * - * * - ************************************************************************/ - -static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlNodePtr node); -static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlNodePtr node); -static int -xmlSchemaTypeFixup(xmlSchemaTypePtr type, - xmlSchemaAbstractCtxtPtr ctxt); -static const xmlChar * -xmlSchemaFacetTypeToString(xmlSchemaTypeType type); -static int -xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node); -static int -xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl, - xmlSchemaParserCtxtPtr ctxt); -static void -xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt); -static xmlSchemaWhitespaceValueType -xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type); -static xmlSchemaTreeItemPtr -xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node, xmlSchemaTypeType type, - int withParticle); -static const xmlChar * -xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item); -static xmlSchemaTypeLinkPtr -xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type); -static void -xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt, - const char *funcName, - const char *message); -static int -xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt, - xmlSchemaTypePtr type, - xmlSchemaTypePtr baseType, - int subset); -static void -xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl, - xmlSchemaParserCtxtPtr ctxt); -static void -xmlSchemaComponentListFree(xmlSchemaItemListPtr list); -static xmlSchemaQNameRefPtr -xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlNodePtr node); - -/************************************************************************ - * * - * Helper functions * - * * - ************************************************************************/ - -/** - * xmlSchemaItemTypeToStr: - * @type: the type of the schema item - * - * Returns the component name of a schema item. - */ -static const xmlChar * -xmlSchemaItemTypeToStr(xmlSchemaTypeType type) -{ - switch (type) { - case XML_SCHEMA_TYPE_BASIC: - return(BAD_CAST "simple type definition"); - case XML_SCHEMA_TYPE_SIMPLE: - return(BAD_CAST "simple type definition"); - case XML_SCHEMA_TYPE_COMPLEX: - return(BAD_CAST "complex type definition"); - case XML_SCHEMA_TYPE_ELEMENT: - return(BAD_CAST "element declaration"); - case XML_SCHEMA_TYPE_ATTRIBUTE_USE: - return(BAD_CAST "attribute use"); - case XML_SCHEMA_TYPE_ATTRIBUTE: - return(BAD_CAST "attribute declaration"); - case XML_SCHEMA_TYPE_GROUP: - return(BAD_CAST "model group definition"); - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - return(BAD_CAST "attribute group definition"); - case XML_SCHEMA_TYPE_NOTATION: - return(BAD_CAST "notation declaration"); - case XML_SCHEMA_TYPE_SEQUENCE: - return(BAD_CAST "model group (sequence)"); - case XML_SCHEMA_TYPE_CHOICE: - return(BAD_CAST "model group (choice)"); - case XML_SCHEMA_TYPE_ALL: - return(BAD_CAST "model group (all)"); - case XML_SCHEMA_TYPE_PARTICLE: - return(BAD_CAST "particle"); - case XML_SCHEMA_TYPE_IDC_UNIQUE: - return(BAD_CAST "unique identity-constraint"); - /* return(BAD_CAST "IDC (unique)"); */ - case XML_SCHEMA_TYPE_IDC_KEY: - return(BAD_CAST "key identity-constraint"); - /* return(BAD_CAST "IDC (key)"); */ - case XML_SCHEMA_TYPE_IDC_KEYREF: - return(BAD_CAST "keyref identity-constraint"); - /* return(BAD_CAST "IDC (keyref)"); */ - case XML_SCHEMA_TYPE_ANY: - return(BAD_CAST "wildcard (any)"); - case XML_SCHEMA_EXTRA_QNAMEREF: - return(BAD_CAST "[helper component] QName reference"); - case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: - return(BAD_CAST "[helper component] attribute use prohibition"); - default: - return(BAD_CAST "Not a schema component"); - } -} - -/** - * xmlSchemaGetComponentTypeStr: - * @type: the type of the schema item - * - * Returns the component name of a schema item. - */ -static const xmlChar * -xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item) -{ - switch (item->type) { - case XML_SCHEMA_TYPE_BASIC: - if (WXS_IS_COMPLEX(WXS_TYPE_CAST item)) - return(BAD_CAST "complex type definition"); - else - return(BAD_CAST "simple type definition"); - default: - return(xmlSchemaItemTypeToStr(item->type)); - } -} - -/** - * xmlSchemaGetComponentNode: - * @item: a schema component - * - * Returns node associated with the schema component. - * NOTE that such a node need not be available; plus, a component's - * node need not to reflect the component directly, since there is no - * one-to-one relationship between the XML Schema representation and - * the component representation. - */ -static xmlNodePtr -xmlSchemaGetComponentNode(xmlSchemaBasicItemPtr item) -{ - switch (item->type) { - case XML_SCHEMA_TYPE_ELEMENT: - return (((xmlSchemaElementPtr) item)->node); - case XML_SCHEMA_TYPE_ATTRIBUTE: - return (((xmlSchemaAttributePtr) item)->node); - case XML_SCHEMA_TYPE_COMPLEX: - case XML_SCHEMA_TYPE_SIMPLE: - return (((xmlSchemaTypePtr) item)->node); - case XML_SCHEMA_TYPE_ANY: - case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: - return (((xmlSchemaWildcardPtr) item)->node); - case XML_SCHEMA_TYPE_PARTICLE: - return (((xmlSchemaParticlePtr) item)->node); - case XML_SCHEMA_TYPE_SEQUENCE: - case XML_SCHEMA_TYPE_CHOICE: - case XML_SCHEMA_TYPE_ALL: - return (((xmlSchemaModelGroupPtr) item)->node); - case XML_SCHEMA_TYPE_GROUP: - return (((xmlSchemaModelGroupDefPtr) item)->node); - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - return (((xmlSchemaAttributeGroupPtr) item)->node); - case XML_SCHEMA_TYPE_IDC_UNIQUE: - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_KEYREF: - return (((xmlSchemaIDCPtr) item)->node); - case XML_SCHEMA_EXTRA_QNAMEREF: - return(((xmlSchemaQNameRefPtr) item)->node); - /* TODO: What to do with NOTATIONs? - case XML_SCHEMA_TYPE_NOTATION: - return (((xmlSchemaNotationPtr) item)->node); - */ - case XML_SCHEMA_TYPE_ATTRIBUTE_USE: - return (((xmlSchemaAttributeUsePtr) item)->node); - default: - return (NULL); - } -} - -#if 0 -/** - * xmlSchemaGetNextComponent: - * @item: a schema component - * - * Returns the next sibling of the schema component. - */ -static xmlSchemaBasicItemPtr -xmlSchemaGetNextComponent(xmlSchemaBasicItemPtr item) -{ - switch (item->type) { - case XML_SCHEMA_TYPE_ELEMENT: - return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr) item)->next); - case XML_SCHEMA_TYPE_ATTRIBUTE: - return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr) item)->next); - case XML_SCHEMA_TYPE_COMPLEX: - case XML_SCHEMA_TYPE_SIMPLE: - return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr) item)->next); - case XML_SCHEMA_TYPE_ANY: - case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: - return (NULL); - case XML_SCHEMA_TYPE_PARTICLE: - return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr) item)->next); - case XML_SCHEMA_TYPE_SEQUENCE: - case XML_SCHEMA_TYPE_CHOICE: - case XML_SCHEMA_TYPE_ALL: - return (NULL); - case XML_SCHEMA_TYPE_GROUP: - return (NULL); - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr) item)->next); - case XML_SCHEMA_TYPE_IDC_UNIQUE: - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_KEYREF: - return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr) item)->next); - default: - return (NULL); - } -} -#endif - - -/** - * xmlSchemaFormatQName: - * @buf: the string buffer - * @namespaceName: the namespace name - * @localName: the local name - * - * Returns the given QName in the format "{namespaceName}localName" or - * just "localName" if @namespaceName is NULL. - * - * Returns the localName if @namespaceName is NULL, a formatted - * string otherwise. - */ -static const xmlChar* -xmlSchemaFormatQName(xmlChar **buf, - const xmlChar *namespaceName, - const xmlChar *localName) -{ - FREE_AND_NULL(*buf) - if (namespaceName != NULL) { - *buf = xmlStrdup(BAD_CAST "{"); - *buf = xmlStrcat(*buf, namespaceName); - *buf = xmlStrcat(*buf, BAD_CAST "}"); - } - if (localName != NULL) { - if (namespaceName == NULL) - return(localName); - *buf = xmlStrcat(*buf, localName); - } else { - *buf = xmlStrcat(*buf, BAD_CAST "(NULL)"); - } - return ((const xmlChar *) *buf); -} - -static const xmlChar* -xmlSchemaFormatQNameNs(xmlChar **buf, xmlNsPtr ns, const xmlChar *localName) -{ - if (ns != NULL) - return (xmlSchemaFormatQName(buf, ns->href, localName)); - else - return (xmlSchemaFormatQName(buf, NULL, localName)); -} - -static const xmlChar * -xmlSchemaGetComponentName(xmlSchemaBasicItemPtr item) -{ - switch (item->type) { - case XML_SCHEMA_TYPE_ELEMENT: - return (((xmlSchemaElementPtr) item)->name); - case XML_SCHEMA_TYPE_ATTRIBUTE: - return (((xmlSchemaAttributePtr) item)->name); - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - return (((xmlSchemaAttributeGroupPtr) item)->name); - case XML_SCHEMA_TYPE_BASIC: - case XML_SCHEMA_TYPE_SIMPLE: - case XML_SCHEMA_TYPE_COMPLEX: - return (((xmlSchemaTypePtr) item)->name); - case XML_SCHEMA_TYPE_GROUP: - return (((xmlSchemaModelGroupDefPtr) item)->name); - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_UNIQUE: - case XML_SCHEMA_TYPE_IDC_KEYREF: - return (((xmlSchemaIDCPtr) item)->name); - case XML_SCHEMA_TYPE_ATTRIBUTE_USE: - if (WXS_ATTRUSE_DECL(item) != NULL) { - return(xmlSchemaGetComponentName( - WXS_BASIC_CAST WXS_ATTRUSE_DECL(item))); - } else - return(NULL); - case XML_SCHEMA_EXTRA_QNAMEREF: - return (((xmlSchemaQNameRefPtr) item)->name); - case XML_SCHEMA_TYPE_NOTATION: - return (((xmlSchemaNotationPtr) item)->name); - default: - /* - * Other components cannot have names. - */ - break; - } - return (NULL); -} - -#define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name -#define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace -/* -static const xmlChar * -xmlSchemaGetQNameRefName(void *ref) -{ - return(((xmlSchemaQNameRefPtr) ref)->name); -} - -static const xmlChar * -xmlSchemaGetQNameRefTargetNs(void *ref) -{ - return(((xmlSchemaQNameRefPtr) ref)->targetNamespace); -} -*/ - -static const xmlChar * -xmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr item) -{ - switch (item->type) { - case XML_SCHEMA_TYPE_ELEMENT: - return (((xmlSchemaElementPtr) item)->targetNamespace); - case XML_SCHEMA_TYPE_ATTRIBUTE: - return (((xmlSchemaAttributePtr) item)->targetNamespace); - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - return (((xmlSchemaAttributeGroupPtr) item)->targetNamespace); - case XML_SCHEMA_TYPE_BASIC: - return (BAD_CAST "http://www.w3.org/2001/XMLSchema"); - case XML_SCHEMA_TYPE_SIMPLE: - case XML_SCHEMA_TYPE_COMPLEX: - return (((xmlSchemaTypePtr) item)->targetNamespace); - case XML_SCHEMA_TYPE_GROUP: - return (((xmlSchemaModelGroupDefPtr) item)->targetNamespace); - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_UNIQUE: - case XML_SCHEMA_TYPE_IDC_KEYREF: - return (((xmlSchemaIDCPtr) item)->targetNamespace); - case XML_SCHEMA_TYPE_ATTRIBUTE_USE: - if (WXS_ATTRUSE_DECL(item) != NULL) { - return(xmlSchemaGetComponentTargetNs( - WXS_BASIC_CAST WXS_ATTRUSE_DECL(item))); - } - /* TODO: Will returning NULL break something? */ - break; - case XML_SCHEMA_EXTRA_QNAMEREF: - return (((xmlSchemaQNameRefPtr) item)->targetNamespace); - case XML_SCHEMA_TYPE_NOTATION: - return (((xmlSchemaNotationPtr) item)->targetNamespace); - default: - /* - * Other components cannot have names. - */ - break; - } - return (NULL); -} - -static const xmlChar* -xmlSchemaGetComponentQName(xmlChar **buf, - void *item) -{ - return (xmlSchemaFormatQName(buf, - xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr) item), - xmlSchemaGetComponentName((xmlSchemaBasicItemPtr) item))); -} - -static const xmlChar* -xmlSchemaGetComponentDesignation(xmlChar **buf, void *item) -{ - xmlChar *str = NULL; - - *buf = xmlStrcat(*buf, WXS_ITEM_TYPE_NAME(item)); - *buf = xmlStrcat(*buf, BAD_CAST " '"); - *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, - (xmlSchemaBasicItemPtr) item)); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - FREE_AND_NULL(str); - return(*buf); -} - -static const xmlChar* -xmlSchemaGetIDCDesignation(xmlChar **buf, xmlSchemaIDCPtr idc) -{ - return(xmlSchemaGetComponentDesignation(buf, idc)); -} - -/** - * xmlSchemaWildcardPCToString: - * @pc: the type of processContents - * - * Returns a string representation of the type of - * processContents. - */ -static const xmlChar * -xmlSchemaWildcardPCToString(int pc) -{ - switch (pc) { - case XML_SCHEMAS_ANY_SKIP: - return (BAD_CAST "skip"); - case XML_SCHEMAS_ANY_LAX: - return (BAD_CAST "lax"); - case XML_SCHEMAS_ANY_STRICT: - return (BAD_CAST "strict"); - default: - return (BAD_CAST "invalid process contents"); - } -} - -/** - * xmlSchemaGetCanonValueWhtspExt: - * @val: the precomputed value - * @retValue: the returned value - * @ws: the whitespace type of the value - * - * Get a the cononical representation of the value. - * The caller has to free the returned retValue. - * - * Returns 0 if the value could be built and -1 in case of - * API errors or if the value type is not supported yet. - */ -static int -xmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr val, - xmlSchemaWhitespaceValueType ws, - xmlChar **retValue) -{ - int list; - xmlSchemaValType valType; - const xmlChar *value, *value2 = NULL; - - - if ((retValue == NULL) || (val == NULL)) - return (-1); - list = xmlSchemaValueGetNext(val) ? 1 : 0; - *retValue = NULL; - do { - value = NULL; - valType = xmlSchemaGetValType(val); - switch (valType) { - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_NORMSTRING: - case XML_SCHEMAS_ANYSIMPLETYPE: - value = xmlSchemaValueGetAsString(val); - if (value != NULL) { - if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) - value2 = xmlSchemaCollapseString(value); - else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) - value2 = xmlSchemaWhiteSpaceReplace(value); - if (value2 != NULL) - value = value2; - } - break; - default: - if (xmlSchemaGetCanonValue(val, &value2) == -1) { - if (value2 != NULL) - xmlFree((xmlChar *) value2); - goto internal_error; - } - value = value2; - } - if (*retValue == NULL) - if (value == NULL) { - if (! list) - *retValue = xmlStrdup(BAD_CAST ""); - } else - *retValue = xmlStrdup(value); - else if (value != NULL) { - /* List. */ - *retValue = xmlStrcat((xmlChar *) *retValue, BAD_CAST " "); - *retValue = xmlStrcat((xmlChar *) *retValue, value); - } - FREE_AND_NULL(value2) - val = xmlSchemaValueGetNext(val); - } while (val != NULL); - - return (0); -internal_error: - if (*retValue != NULL) - xmlFree((xmlChar *) (*retValue)); - if (value2 != NULL) - xmlFree((xmlChar *) value2); - return (-1); -} - -/** - * xmlSchemaFormatItemForReport: - * @buf: the string buffer - * @itemDes: the designation of the item - * @itemName: the name of the item - * @item: the item as an object - * @itemNode: the node of the item - * @local: the local name - * @parsing: if the function is used during the parse - * - * Returns a representation of the given item used - * for error reports. - * - * The following order is used to build the resulting - * designation if the arguments are not NULL: - * 1a. If itemDes not NULL -> itemDes - * 1b. If (itemDes not NULL) and (itemName not NULL) - * -> itemDes + itemName - * 2. If the preceding was NULL and (item not NULL) -> item - * 3. If the preceding was NULL and (itemNode not NULL) -> itemNode - * - * If the itemNode is an attribute node, the name of the attribute - * will be appended to the result. - * - * Returns the formatted string and sets @buf to the resulting value. - */ -static xmlChar* -xmlSchemaFormatItemForReport(xmlChar **buf, - const xmlChar *itemDes, - xmlSchemaBasicItemPtr item, - xmlNodePtr itemNode) -{ - xmlChar *str = NULL; - int named = 1; - - if (*buf != NULL) { - xmlFree(*buf); - *buf = NULL; - } - - if (itemDes != NULL) { - *buf = xmlStrdup(itemDes); - } else if (item != NULL) { - switch (item->type) { - case XML_SCHEMA_TYPE_BASIC: { - xmlSchemaTypePtr type = WXS_TYPE_CAST item; - - if (WXS_IS_ATOMIC(type)) - *buf = xmlStrdup(BAD_CAST "atomic type 'xs:"); - else if (WXS_IS_LIST(type)) - *buf = xmlStrdup(BAD_CAST "list type 'xs:"); - else if (WXS_IS_UNION(type)) - *buf = xmlStrdup(BAD_CAST "union type 'xs:"); - else - *buf = xmlStrdup(BAD_CAST "simple type 'xs:"); - *buf = xmlStrcat(*buf, type->name); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - } - break; - case XML_SCHEMA_TYPE_SIMPLE: { - xmlSchemaTypePtr type = WXS_TYPE_CAST item; - - if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { - *buf = xmlStrdup(BAD_CAST""); - } else { - *buf = xmlStrdup(BAD_CAST "local "); - } - if (WXS_IS_ATOMIC(type)) - *buf = xmlStrcat(*buf, BAD_CAST "atomic type"); - else if (WXS_IS_LIST(type)) - *buf = xmlStrcat(*buf, BAD_CAST "list type"); - else if (WXS_IS_UNION(type)) - *buf = xmlStrcat(*buf, BAD_CAST "union type"); - else - *buf = xmlStrcat(*buf, BAD_CAST "simple type"); - if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { - *buf = xmlStrcat(*buf, BAD_CAST " '"); - *buf = xmlStrcat(*buf, type->name); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - } - } - break; - case XML_SCHEMA_TYPE_COMPLEX: { - xmlSchemaTypePtr type = WXS_TYPE_CAST item; - - if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) - *buf = xmlStrdup(BAD_CAST ""); - else - *buf = xmlStrdup(BAD_CAST "local "); - *buf = xmlStrcat(*buf, BAD_CAST "complex type"); - if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { - *buf = xmlStrcat(*buf, BAD_CAST " '"); - *buf = xmlStrcat(*buf, type->name); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - } - } - break; - case XML_SCHEMA_TYPE_ATTRIBUTE_USE: { - xmlSchemaAttributeUsePtr ause; - - ause = WXS_ATTR_USE_CAST item; - *buf = xmlStrdup(BAD_CAST "attribute use "); - if (WXS_ATTRUSE_DECL(ause) != NULL) { - *buf = xmlStrcat(*buf, BAD_CAST "'"); - *buf = xmlStrcat(*buf, - xmlSchemaGetComponentQName(&str, WXS_ATTRUSE_DECL(ause))); - FREE_AND_NULL(str) - *buf = xmlStrcat(*buf, BAD_CAST "'"); - } else { - *buf = xmlStrcat(*buf, BAD_CAST "(unknown)"); - } - } - break; - case XML_SCHEMA_TYPE_ATTRIBUTE: { - xmlSchemaAttributePtr attr; - - attr = (xmlSchemaAttributePtr) item; - *buf = xmlStrdup(BAD_CAST "attribute decl."); - *buf = xmlStrcat(*buf, BAD_CAST " '"); - *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, - attr->targetNamespace, attr->name)); - FREE_AND_NULL(str) - *buf = xmlStrcat(*buf, BAD_CAST "'"); - } - break; - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - xmlSchemaGetComponentDesignation(buf, item); - break; - case XML_SCHEMA_TYPE_ELEMENT: { - xmlSchemaElementPtr elem; - - elem = (xmlSchemaElementPtr) item; - *buf = xmlStrdup(BAD_CAST "element decl."); - *buf = xmlStrcat(*buf, BAD_CAST " '"); - *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, - elem->targetNamespace, elem->name)); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - } - break; - case XML_SCHEMA_TYPE_IDC_UNIQUE: - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_KEYREF: - if (item->type == XML_SCHEMA_TYPE_IDC_UNIQUE) - *buf = xmlStrdup(BAD_CAST "unique '"); - else if (item->type == XML_SCHEMA_TYPE_IDC_KEY) - *buf = xmlStrdup(BAD_CAST "key '"); - else - *buf = xmlStrdup(BAD_CAST "keyRef '"); - *buf = xmlStrcat(*buf, ((xmlSchemaIDCPtr) item)->name); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - break; - case XML_SCHEMA_TYPE_ANY: - case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: - *buf = xmlStrdup(xmlSchemaWildcardPCToString( - ((xmlSchemaWildcardPtr) item)->processContents)); - *buf = xmlStrcat(*buf, BAD_CAST " wildcard"); - break; - case XML_SCHEMA_FACET_MININCLUSIVE: - case XML_SCHEMA_FACET_MINEXCLUSIVE: - case XML_SCHEMA_FACET_MAXINCLUSIVE: - case XML_SCHEMA_FACET_MAXEXCLUSIVE: - case XML_SCHEMA_FACET_TOTALDIGITS: - case XML_SCHEMA_FACET_FRACTIONDIGITS: - case XML_SCHEMA_FACET_PATTERN: - case XML_SCHEMA_FACET_ENUMERATION: - case XML_SCHEMA_FACET_WHITESPACE: - case XML_SCHEMA_FACET_LENGTH: - case XML_SCHEMA_FACET_MAXLENGTH: - case XML_SCHEMA_FACET_MINLENGTH: - *buf = xmlStrdup(BAD_CAST "facet '"); - *buf = xmlStrcat(*buf, xmlSchemaFacetTypeToString(item->type)); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - break; - case XML_SCHEMA_TYPE_GROUP: { - *buf = xmlStrdup(BAD_CAST "model group def."); - *buf = xmlStrcat(*buf, BAD_CAST " '"); - *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item)); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - FREE_AND_NULL(str) - } - break; - case XML_SCHEMA_TYPE_SEQUENCE: - case XML_SCHEMA_TYPE_CHOICE: - case XML_SCHEMA_TYPE_ALL: - case XML_SCHEMA_TYPE_PARTICLE: - *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item)); - break; - case XML_SCHEMA_TYPE_NOTATION: { - *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item)); - *buf = xmlStrcat(*buf, BAD_CAST " '"); - *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item)); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - FREE_AND_NULL(str); - } - default: - named = 0; - } - } else - named = 0; - - if ((named == 0) && (itemNode != NULL)) { - xmlNodePtr elem; - - if (itemNode->type == XML_ATTRIBUTE_NODE) - elem = itemNode->parent; - else - elem = itemNode; - *buf = xmlStrdup(BAD_CAST "Element '"); - if (elem->ns != NULL) { - *buf = xmlStrcat(*buf, - xmlSchemaFormatQName(&str, elem->ns->href, elem->name)); - FREE_AND_NULL(str) - } else - *buf = xmlStrcat(*buf, elem->name); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - - } - if ((itemNode != NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) { - *buf = xmlStrcat(*buf, BAD_CAST ", attribute '"); - if (itemNode->ns != NULL) { - *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, - itemNode->ns->href, itemNode->name)); - FREE_AND_NULL(str) - } else - *buf = xmlStrcat(*buf, itemNode->name); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - } - FREE_AND_NULL(str) - - return (*buf); -} - -/** - * xmlSchemaFormatFacetEnumSet: - * @buf: the string buffer - * @type: the type holding the enumeration facets - * - * Builds a string consisting of all enumeration elements. - * - * Returns a string of all enumeration elements. - */ -static const xmlChar * -xmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt, - xmlChar **buf, xmlSchemaTypePtr type) -{ - xmlSchemaFacetPtr facet; - xmlSchemaWhitespaceValueType ws; - xmlChar *value = NULL; - int res, found = 0; - - if (*buf != NULL) - xmlFree(*buf); - *buf = NULL; - - do { - /* - * Use the whitespace type of the base type. - */ - ws = xmlSchemaGetWhiteSpaceFacetValue(type->baseType); - for (facet = type->facets; facet != NULL; facet = facet->next) { - if (facet->type != XML_SCHEMA_FACET_ENUMERATION) - continue; - found = 1; - res = xmlSchemaGetCanonValueWhtspExt(facet->val, - ws, &value); - if (res == -1) { - xmlSchemaInternalErr(actxt, - "xmlSchemaFormatFacetEnumSet", - "compute the canonical lexical representation"); - if (*buf != NULL) - xmlFree(*buf); - *buf = NULL; - return (NULL); - } - if (*buf == NULL) - *buf = xmlStrdup(BAD_CAST "'"); - else - *buf = xmlStrcat(*buf, BAD_CAST ", '"); - *buf = xmlStrcat(*buf, BAD_CAST value); - *buf = xmlStrcat(*buf, BAD_CAST "'"); - if (value != NULL) { - xmlFree((xmlChar *)value); - value = NULL; - } - } - /* - * The enumeration facet of a type restricts the enumeration - * facet of the ancestor type; i.e., such restricted enumerations - * do not belong to the set of the given type. Thus we break - * on the first found enumeration. - */ - if (found) - break; - type = type->baseType; - } while ((type != NULL) && (type->type != XML_SCHEMA_TYPE_BASIC)); - - return ((const xmlChar *) *buf); -} - -/************************************************************************ - * * - * Error functions * - * * - ************************************************************************/ - -#if 0 -static void -xmlSchemaErrMemory(const char *msg) -{ - __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL, - msg); -} -#endif - -static void -xmlSchemaPSimpleErr(const char *msg) -{ - __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL, - msg); -} - -/** - * xmlSchemaPErrMemory: - * @node: a context node - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt, - const char *extra, xmlNodePtr node) -{ - if (ctxt != NULL) - ctxt->nberrors++; - __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL, - extra); -} - -/** - * xmlSchemaPErr: - * @ctxt: the parsing context - * @node: the context node - * @error: the error code - * @msg: the error message - * @str1: extra data - * @str2: extra data - * - * Handle a parser error - */ -static void -xmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error, - const char *msg, const xmlChar * str1, const xmlChar * str2) -{ - xmlGenericErrorFunc channel = NULL; - xmlStructuredErrorFunc schannel = NULL; - void *data = NULL; - - if (ctxt != NULL) { - ctxt->nberrors++; - ctxt->err = error; - channel = ctxt->error; - data = ctxt->errCtxt; - schannel = ctxt->serror; - } - __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, - error, XML_ERR_ERROR, NULL, 0, - (const char *) str1, (const char *) str2, NULL, 0, 0, - msg, str1, str2); -} - -/** - * xmlSchemaPErr2: - * @ctxt: the parsing context - * @node: the context node - * @node: the current child - * @error: the error code - * @msg: the error message - * @str1: extra data - * @str2: extra data - * - * Handle a parser error - */ -static void -xmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, - xmlNodePtr child, int error, - const char *msg, const xmlChar * str1, const xmlChar * str2) -{ - if (child != NULL) - xmlSchemaPErr(ctxt, child, error, msg, str1, str2); - else - xmlSchemaPErr(ctxt, node, error, msg, str1, str2); -} - - -/** - * xmlSchemaPErrExt: - * @ctxt: the parsing context - * @node: the context node - * @error: the error code - * @strData1: extra data - * @strData2: extra data - * @strData3: extra data - * @msg: the message - * @str1: extra parameter for the message display - * @str2: extra parameter for the message display - * @str3: extra parameter for the message display - * @str4: extra parameter for the message display - * @str5: extra parameter for the message display - * - * Handle a parser error - */ -static void -xmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error, - const xmlChar * strData1, const xmlChar * strData2, - const xmlChar * strData3, const char *msg, const xmlChar * str1, - const xmlChar * str2, const xmlChar * str3, const xmlChar * str4, - const xmlChar * str5) -{ - - xmlGenericErrorFunc channel = NULL; - xmlStructuredErrorFunc schannel = NULL; - void *data = NULL; - - if (ctxt != NULL) { - ctxt->nberrors++; - ctxt->err = error; - channel = ctxt->error; - data = ctxt->errCtxt; - schannel = ctxt->serror; - } - __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, - error, XML_ERR_ERROR, NULL, 0, - (const char *) strData1, (const char *) strData2, - (const char *) strData3, 0, 0, msg, str1, str2, - str3, str4, str5); -} - -/************************************************************************ - * * - * Allround error functions * - * * - ************************************************************************/ - -/** - * xmlSchemaVTypeErrMemory: - * @node: a context node - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt, - const char *extra, xmlNodePtr node) -{ - if (ctxt != NULL) { - ctxt->nberrors++; - ctxt->err = XML_SCHEMAV_INTERNAL; - } - __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL, - extra); -} - -static void -xmlSchemaPSimpleInternalErr(xmlNodePtr node, - const char *msg, const xmlChar *str) -{ - __xmlSimpleError(XML_FROM_SCHEMASP, XML_SCHEMAP_INTERNAL, node, - msg, (const char *) str); -} - -#define WXS_ERROR_TYPE_ERROR 1 -#define WXS_ERROR_TYPE_WARNING 2 -/** - * xmlSchemaErr3: - * @ctxt: the validation context - * @node: the context node - * @error: the error code - * @msg: the error message - * @str1: extra data - * @str2: extra data - * @str3: extra data - * - * Handle a validation error - */ -static void -xmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt, - xmlErrorLevel errorLevel, - int error, xmlNodePtr node, int line, const char *msg, - const xmlChar *str1, const xmlChar *str2, - const xmlChar *str3, const xmlChar *str4) -{ - xmlStructuredErrorFunc schannel = NULL; - xmlGenericErrorFunc channel = NULL; - void *data = NULL; - - if (ctxt != NULL) { - if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) { - xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt; - const char *file = NULL; - if (errorLevel != XML_ERR_WARNING) { - vctxt->nberrors++; - vctxt->err = error; - channel = vctxt->error; - } else { - channel = vctxt->warning; - } - schannel = vctxt->serror; - data = vctxt->errCtxt; - - /* - * Error node. If we specify a line number, then - * do not channel any node to the error function. - */ - if (line == 0) { - if ((node == NULL) && - (vctxt->depth >= 0) && - (vctxt->inode != NULL)) { - node = vctxt->inode->node; - } - /* - * Get filename and line if no node-tree. - */ - if ((node == NULL) && - (vctxt->parserCtxt != NULL) && - (vctxt->parserCtxt->input != NULL)) { - file = vctxt->parserCtxt->input->filename; - line = vctxt->parserCtxt->input->line; - } - } else { - /* - * Override the given node's (if any) position - * and channel only the given line number. - */ - node = NULL; - /* - * Get filename. - */ - if (vctxt->doc != NULL) - file = (const char *) vctxt->doc->URL; - else if ((vctxt->parserCtxt != NULL) && - (vctxt->parserCtxt->input != NULL)) - file = vctxt->parserCtxt->input->filename; - } - __xmlRaiseError(schannel, channel, data, ctxt, - node, XML_FROM_SCHEMASV, - error, errorLevel, file, line, - (const char *) str1, (const char *) str2, - (const char *) str3, 0, 0, msg, str1, str2, str3, str4); - - } else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) { - xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt; - if (errorLevel != XML_ERR_WARNING) { - pctxt->nberrors++; - pctxt->err = error; - channel = pctxt->error; - } else { - channel = pctxt->warning; - } - schannel = pctxt->serror; - data = pctxt->errCtxt; - __xmlRaiseError(schannel, channel, data, ctxt, - node, XML_FROM_SCHEMASP, error, - errorLevel, NULL, 0, - (const char *) str1, (const char *) str2, - (const char *) str3, 0, 0, msg, str1, str2, str3, str4); - } else { - TODO - } - } -} - -/** - * xmlSchemaErr3: - * @ctxt: the validation context - * @node: the context node - * @error: the error code - * @msg: the error message - * @str1: extra data - * @str2: extra data - * @str3: extra data - * - * Handle a validation error - */ -static void -xmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt, - int error, xmlNodePtr node, const char *msg, - const xmlChar *str1, const xmlChar *str2, const xmlChar *str3) -{ - xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0, - msg, str1, str2, str3, NULL); -} - -static void -xmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt, - int error, xmlNodePtr node, const char *msg, - const xmlChar *str1, const xmlChar *str2, - const xmlChar *str3, const xmlChar *str4) -{ - xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0, - msg, str1, str2, str3, str4); -} - -static void -xmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt, - int error, xmlNodePtr node, const char *msg, - const xmlChar *str1, const xmlChar *str2) -{ - xmlSchemaErr4(actxt, error, node, msg, str1, str2, NULL, NULL); -} - -static xmlChar * -xmlSchemaFormatNodeForError(xmlChar ** msg, - xmlSchemaAbstractCtxtPtr actxt, - xmlNodePtr node) -{ - xmlChar *str = NULL; - - *msg = NULL; - if ((node != NULL) && - (node->type != XML_ELEMENT_NODE) && - (node->type != XML_ATTRIBUTE_NODE)) - { - /* - * Don't try to format other nodes than element and - * attribute nodes. - * Play save and return an empty string. - */ - *msg = xmlStrdup(BAD_CAST ""); - return(*msg); - } - if (node != NULL) { - /* - * Work on tree nodes. - */ - if (node->type == XML_ATTRIBUTE_NODE) { - xmlNodePtr elem = node->parent; - - *msg = xmlStrdup(BAD_CAST "Element '"); - if (elem->ns != NULL) - *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, - elem->ns->href, elem->name)); - else - *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, - NULL, elem->name)); - FREE_AND_NULL(str); - *msg = xmlStrcat(*msg, BAD_CAST "', "); - *msg = xmlStrcat(*msg, BAD_CAST "attribute '"); - } else { - *msg = xmlStrdup(BAD_CAST "Element '"); - } - if (node->ns != NULL) - *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, - node->ns->href, node->name)); - else - *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, - NULL, node->name)); - FREE_AND_NULL(str); - *msg = xmlStrcat(*msg, BAD_CAST "': "); - } else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) { - xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt; - /* - * Work on node infos. - */ - if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) { - xmlSchemaNodeInfoPtr ielem = - vctxt->elemInfos[vctxt->depth]; - - *msg = xmlStrdup(BAD_CAST "Element '"); - *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, - ielem->nsName, ielem->localName)); - FREE_AND_NULL(str); - *msg = xmlStrcat(*msg, BAD_CAST "', "); - *msg = xmlStrcat(*msg, BAD_CAST "attribute '"); - } else { - *msg = xmlStrdup(BAD_CAST "Element '"); - } - *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, - vctxt->inode->nsName, vctxt->inode->localName)); - FREE_AND_NULL(str); - *msg = xmlStrcat(*msg, BAD_CAST "': "); - } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) { - /* - * Hmm, no node while parsing? - * Return an empty string, in case NULL will break something. - */ - *msg = xmlStrdup(BAD_CAST ""); - } else { - TODO - return (NULL); - } - /* - * VAL TODO: The output of the given schema component is currently - * disabled. - */ -#if 0 - if ((type != NULL) && (xmlSchemaIsGlobalItem(type))) { - *msg = xmlStrcat(*msg, BAD_CAST " ["); - *msg = xmlStrcat(*msg, xmlSchemaFormatItemForReport(&str, - NULL, type, NULL, 0)); - FREE_AND_NULL(str) - *msg = xmlStrcat(*msg, BAD_CAST "]"); - } -#endif - return (*msg); -} - -static void -xmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt, - const char *funcName, - const char *message, - const xmlChar *str1, - const xmlChar *str2) -{ - xmlChar *msg = NULL; - - if (actxt == NULL) - return; - msg = xmlStrdup(BAD_CAST "Internal error: "); - msg = xmlStrcat(msg, BAD_CAST funcName); - msg = xmlStrcat(msg, BAD_CAST ", "); - msg = xmlStrcat(msg, BAD_CAST message); - msg = xmlStrcat(msg, BAD_CAST ".\n"); - - if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) - xmlSchemaErr(actxt, XML_SCHEMAV_INTERNAL, NULL, - (const char *) msg, str1, str2); - - else if (actxt->type == XML_SCHEMA_CTXT_PARSER) - xmlSchemaErr(actxt, XML_SCHEMAP_INTERNAL, NULL, - (const char *) msg, str1, str2); - - FREE_AND_NULL(msg) -} - -static void -xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt, - const char *funcName, - const char *message) -{ - xmlSchemaInternalErr2(actxt, funcName, message, NULL, NULL); -} - -#if 0 -static void -xmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt, - const char *funcName, - const char *message, - const xmlChar *str1, - const xmlChar *str2) -{ - xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName, message, - str1, str2); -} -#endif - -static void -xmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt, - xmlParserErrors error, - xmlNodePtr node, - xmlSchemaBasicItemPtr item, - const char *message, - const xmlChar *str1, const xmlChar *str2, - const xmlChar *str3, const xmlChar *str4) -{ - xmlChar *msg = NULL; - - if ((node == NULL) && (item != NULL) && - (actxt->type == XML_SCHEMA_CTXT_PARSER)) { - node = WXS_ITEM_NODE(item); - xmlSchemaFormatItemForReport(&msg, NULL, item, NULL); - msg = xmlStrcat(msg, BAD_CAST ": "); - } else - xmlSchemaFormatNodeForError(&msg, actxt, node); - msg = xmlStrcat(msg, (const xmlChar *) message); - msg = xmlStrcat(msg, BAD_CAST ".\n"); - xmlSchemaErr4(actxt, error, node, - (const char *) msg, str1, str2, str3, str4); - FREE_AND_NULL(msg) -} - -static void -xmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt, - xmlParserErrors error, - xmlNodePtr node, - xmlSchemaBasicItemPtr item, - const char *message, - const xmlChar *str1, - const xmlChar *str2) -{ - xmlSchemaCustomErr4(actxt, error, node, item, - message, str1, str2, NULL, NULL); -} - - - -static void -xmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt, - xmlParserErrors error, - xmlNodePtr node, - xmlSchemaTypePtr type ATTRIBUTE_UNUSED, - const char *message, - const xmlChar *str1, - const xmlChar *str2, - const xmlChar *str3) -{ - xmlChar *msg = NULL; - - xmlSchemaFormatNodeForError(&msg, actxt, node); - msg = xmlStrcat(msg, (const xmlChar *) message); - msg = xmlStrcat(msg, BAD_CAST ".\n"); - - /* URGENT TODO: Set the error code to something sane. */ - xmlSchemaErr4Line(actxt, XML_ERR_WARNING, error, node, 0, - (const char *) msg, str1, str2, str3, NULL); - - FREE_AND_NULL(msg) -} - - - -static void -xmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt, - xmlParserErrors error, - xmlSchemaPSVIIDCNodePtr idcNode, - xmlSchemaTypePtr type ATTRIBUTE_UNUSED, - const char *message, - const xmlChar *str1, - const xmlChar *str2) -{ - xmlChar *msg = NULL, *qname = NULL; - - msg = xmlStrdup(BAD_CAST "Element '%s': "); - msg = xmlStrcat(msg, (const xmlChar *) message); - msg = xmlStrcat(msg, BAD_CAST ".\n"); - xmlSchemaErr4Line(ACTXT_CAST vctxt, XML_ERR_ERROR, - error, NULL, idcNode->nodeLine, (const char *) msg, - xmlSchemaFormatQName(&qname, - vctxt->nodeQNames->items[idcNode->nodeQNameID +1], - vctxt->nodeQNames->items[idcNode->nodeQNameID]), - str1, str2, NULL); - FREE_AND_NULL(qname); - FREE_AND_NULL(msg); -} - -static int -xmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt, - xmlNodePtr node) -{ - if (node != NULL) - return (node->type); - if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) && - (((xmlSchemaValidCtxtPtr) actxt)->inode != NULL)) - return ( ((xmlSchemaValidCtxtPtr) actxt)->inode->nodeType); - return (-1); -} - -static int -xmlSchemaIsGlobalItem(xmlSchemaTypePtr item) -{ - switch (item->type) { - case XML_SCHEMA_TYPE_COMPLEX: - case XML_SCHEMA_TYPE_SIMPLE: - if (item->flags & XML_SCHEMAS_TYPE_GLOBAL) - return(1); - break; - case XML_SCHEMA_TYPE_GROUP: - return (1); - case XML_SCHEMA_TYPE_ELEMENT: - if ( ((xmlSchemaElementPtr) item)->flags & - XML_SCHEMAS_ELEM_GLOBAL) - return(1); - break; - case XML_SCHEMA_TYPE_ATTRIBUTE: - if ( ((xmlSchemaAttributePtr) item)->flags & - XML_SCHEMAS_ATTR_GLOBAL) - return(1); - break; - /* Note that attribute groups are always global. */ - default: - return(1); - } - return (0); -} - -static void -xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt, - xmlParserErrors error, - xmlNodePtr node, - const xmlChar *value, - xmlSchemaTypePtr type, - int displayValue) -{ - xmlChar *msg = NULL; - - xmlSchemaFormatNodeForError(&msg, actxt, node); - - if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) == - XML_ATTRIBUTE_NODE)) - msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of "); - else - msg = xmlStrcat(msg, BAD_CAST "The character content is not a valid " - "value of "); - - if (! xmlSchemaIsGlobalItem(type)) - msg = xmlStrcat(msg, BAD_CAST "the local "); - else - msg = xmlStrcat(msg, BAD_CAST "the "); - - if (WXS_IS_ATOMIC(type)) - msg = xmlStrcat(msg, BAD_CAST "atomic type"); - else if (WXS_IS_LIST(type)) - msg = xmlStrcat(msg, BAD_CAST "list type"); - else if (WXS_IS_UNION(type)) - msg = xmlStrcat(msg, BAD_CAST "union type"); - - if (xmlSchemaIsGlobalItem(type)) { - xmlChar *str = NULL; - msg = xmlStrcat(msg, BAD_CAST " '"); - if (type->builtInType != 0) { - msg = xmlStrcat(msg, BAD_CAST "xs:"); - msg = xmlStrcat(msg, type->name); - } else - msg = xmlStrcat(msg, - xmlSchemaFormatQName(&str, - type->targetNamespace, type->name)); - msg = xmlStrcat(msg, BAD_CAST "'"); - FREE_AND_NULL(str); - } - msg = xmlStrcat(msg, BAD_CAST ".\n"); - if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) == - XML_ATTRIBUTE_NODE)) - xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL); - else - xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); - FREE_AND_NULL(msg) -} - -static const xmlChar * -xmlSchemaFormatErrorNodeQName(xmlChar ** str, - xmlSchemaNodeInfoPtr ni, - xmlNodePtr node) -{ - if (node != NULL) { - if (node->ns != NULL) - return (xmlSchemaFormatQName(str, node->ns->href, node->name)); - else - return (xmlSchemaFormatQName(str, NULL, node->name)); - } else if (ni != NULL) - return (xmlSchemaFormatQName(str, ni->nsName, ni->localName)); - return (NULL); -} - -static void -xmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt, - xmlParserErrors error, - xmlSchemaAttrInfoPtr ni, - xmlNodePtr node) -{ - xmlChar *msg = NULL, *str = NULL; - - xmlSchemaFormatNodeForError(&msg, actxt, node); - msg = xmlStrcat(msg, BAD_CAST "The attribute '%s' is not allowed.\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, - xmlSchemaFormatErrorNodeQName(&str, (xmlSchemaNodeInfoPtr) ni, node), - NULL); - FREE_AND_NULL(str) - FREE_AND_NULL(msg) -} - -static void -xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt, - xmlParserErrors error, - xmlNodePtr node, - xmlSchemaTypePtr type ATTRIBUTE_UNUSED, - const char *message, - int nbval, - int nbneg, - xmlChar **values) -{ - xmlChar *str = NULL, *msg = NULL; - xmlChar *localName, *nsName; - const xmlChar *cur, *end; - int i; - - xmlSchemaFormatNodeForError(&msg, actxt, node); - msg = xmlStrcat(msg, (const xmlChar *) message); - msg = xmlStrcat(msg, BAD_CAST "."); - /* - * Note that is does not make sense to report that we have a - * wildcard here, since the wildcard might be unfolded into - * multiple transitions. - */ - if (nbval + nbneg > 0) { - if (nbval + nbneg > 1) { - str = xmlStrdup(BAD_CAST " Expected is one of ( "); - } else - str = xmlStrdup(BAD_CAST " Expected is ( "); - nsName = NULL; - - for (i = 0; i < nbval + nbneg; i++) { - cur = values[i]; - if (cur == NULL) - continue; - if ((cur[0] == 'n') && (cur[1] == 'o') && (cur[2] == 't') && - (cur[3] == ' ')) { - cur += 4; - str = xmlStrcat(str, BAD_CAST "##other"); - } - /* - * Get the local name. - */ - localName = NULL; - - end = cur; - if (*end == '*') { - localName = xmlStrdup(BAD_CAST "*"); - end++; - } else { - while ((*end != 0) && (*end != '|')) - end++; - localName = xmlStrncat(localName, BAD_CAST cur, end - cur); - } - if (*end != 0) { - end++; - /* - * Skip "*|*" if they come with negated expressions, since - * they represent the same negated wildcard. - */ - if ((nbneg == 0) || (*end != '*') || (*localName != '*')) { - /* - * Get the namespace name. - */ - cur = end; - if (*end == '*') { - nsName = xmlStrdup(BAD_CAST "{*}"); - } else { - while (*end != 0) - end++; - - if (i >= nbval) - nsName = xmlStrdup(BAD_CAST "{##other:"); - else - nsName = xmlStrdup(BAD_CAST "{"); - - nsName = xmlStrncat(nsName, BAD_CAST cur, end - cur); - nsName = xmlStrcat(nsName, BAD_CAST "}"); - } - str = xmlStrcat(str, BAD_CAST nsName); - FREE_AND_NULL(nsName) - } else { - FREE_AND_NULL(localName); - continue; - } - } - str = xmlStrcat(str, BAD_CAST localName); - FREE_AND_NULL(localName); - - if (i < nbval + nbneg -1) - str = xmlStrcat(str, BAD_CAST ", "); - } - str = xmlStrcat(str, BAD_CAST " ).\n"); - msg = xmlStrcat(msg, BAD_CAST str); - FREE_AND_NULL(str) - } else - msg = xmlStrcat(msg, BAD_CAST "\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); - xmlFree(msg); -} - -static void -xmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt, - xmlParserErrors error, - xmlNodePtr node, - const xmlChar *value, - unsigned long length, - xmlSchemaTypePtr type, - xmlSchemaFacetPtr facet, - const char *message, - const xmlChar *str1, - const xmlChar *str2) -{ - xmlChar *str = NULL, *msg = NULL; - xmlSchemaTypeType facetType; - int nodeType = xmlSchemaEvalErrorNodeType(actxt, node); - - xmlSchemaFormatNodeForError(&msg, actxt, node); - if (error == XML_SCHEMAV_CVC_ENUMERATION_VALID) { - facetType = XML_SCHEMA_FACET_ENUMERATION; - /* - * If enumerations are validated, one must not expect the - * facet to be given. - */ - } else - facetType = facet->type; - msg = xmlStrcat(msg, BAD_CAST "["); - msg = xmlStrcat(msg, BAD_CAST "facet '"); - msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facetType)); - msg = xmlStrcat(msg, BAD_CAST "'] "); - if (message == NULL) { - /* - * Use a default message. - */ - if ((facetType == XML_SCHEMA_FACET_LENGTH) || - (facetType == XML_SCHEMA_FACET_MINLENGTH) || - (facetType == XML_SCHEMA_FACET_MAXLENGTH)) { - - char len[25], actLen[25]; - - /* FIXME, TODO: What is the max expected string length of the - * this value? - */ - if (nodeType == XML_ATTRIBUTE_NODE) - msg = xmlStrcat(msg, BAD_CAST "The value '%s' has a length of '%s'; "); - else - msg = xmlStrcat(msg, BAD_CAST "The value has a length of '%s'; "); - - snprintf(len, 24, "%lu", xmlSchemaGetFacetValueAsULong(facet)); - snprintf(actLen, 24, "%lu", length); - - if (facetType == XML_SCHEMA_FACET_LENGTH) - msg = xmlStrcat(msg, - BAD_CAST "this differs from the allowed length of '%s'.\n"); - else if (facetType == XML_SCHEMA_FACET_MAXLENGTH) - msg = xmlStrcat(msg, - BAD_CAST "this exceeds the allowed maximum length of '%s'.\n"); - else if (facetType == XML_SCHEMA_FACET_MINLENGTH) - msg = xmlStrcat(msg, - BAD_CAST "this underruns the allowed minimum length of '%s'.\n"); - - if (nodeType == XML_ATTRIBUTE_NODE) - xmlSchemaErr3(actxt, error, node, (const char *) msg, - value, (const xmlChar *) actLen, (const xmlChar *) len); - else - xmlSchemaErr(actxt, error, node, (const char *) msg, - (const xmlChar *) actLen, (const xmlChar *) len); - - } else if (facetType == XML_SCHEMA_FACET_ENUMERATION) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not an element " - "of the set {%s}.\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, value, - xmlSchemaFormatFacetEnumSet(actxt, &str, type)); - } else if (facetType == XML_SCHEMA_FACET_PATTERN) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not accepted " - "by the pattern '%s'.\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, value, - facet->value); - } else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' is less than the " - "minimum value allowed ('%s').\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, value, - facet->value); - } else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' is greater than the " - "maximum value allowed ('%s').\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, value, - facet->value); - } else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be greater than " - "'%s'.\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, value, - facet->value); - } else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be less than " - "'%s'.\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, value, - facet->value); - } else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more " - "digits than are allowed ('%s').\n"); - xmlSchemaErr(actxt, error, node, (const char*) msg, value, - facet->value); - } else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more fractional " - "digits than are allowed ('%s').\n"); - xmlSchemaErr(actxt, error, node, (const char*) msg, value, - facet->value); - } else if (nodeType == XML_ATTRIBUTE_NODE) { - msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not facet-valid.\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL); - } else { - msg = xmlStrcat(msg, BAD_CAST "The value is not facet-valid.\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); - } - } else { - msg = xmlStrcat(msg, (const xmlChar *) message); - msg = xmlStrcat(msg, BAD_CAST ".\n"); - xmlSchemaErr(actxt, error, node, (const char *) msg, str1, str2); - } - FREE_AND_NULL(str) - xmlFree(msg); -} - -#define VERROR(err, type, msg) \ - xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL); - -#define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg); - -#define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg); -#define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg); - -#define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg); - - -/** - * xmlSchemaPMissingAttrErr: - * @ctxt: the schema validation context - * @ownerDes: the designation of the owner - * @ownerName: the name of the owner - * @ownerItem: the owner as a schema object - * @ownerElem: the owner as an element node - * @node: the parent element node of the missing attribute node - * @type: the corresponding type of the attribute node - * - * Reports an illegal attribute. - */ -static void -xmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaBasicItemPtr ownerItem, - xmlNodePtr ownerElem, - const char *name, - const char *message) -{ - xmlChar *des = NULL; - - xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); - - if (message != NULL) - xmlSchemaPErr(ctxt, ownerElem, error, "%s: %s.\n", BAD_CAST des, BAD_CAST message); - else - xmlSchemaPErr(ctxt, ownerElem, error, - "%s: The attribute '%s' is required but missing.\n", - BAD_CAST des, BAD_CAST name); - FREE_AND_NULL(des); -} - - -/** - * xmlSchemaPResCompAttrErr: - * @ctxt: the schema validation context - * @error: the error code - * @ownerDes: the designation of the owner - * @ownerItem: the owner as a schema object - * @ownerElem: the owner as an element node - * @name: the name of the attribute holding the QName - * @refName: the referenced local name - * @refURI: the referenced namespace URI - * @message: optional message - * - * Used to report QName attribute values that failed to resolve - * to schema components. - */ -static void -xmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaBasicItemPtr ownerItem, - xmlNodePtr ownerElem, - const char *name, - const xmlChar *refName, - const xmlChar *refURI, - xmlSchemaTypeType refType, - const char *refTypeStr) -{ - xmlChar *des = NULL, *strA = NULL; - - xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); - if (refTypeStr == NULL) - refTypeStr = (const char *) xmlSchemaItemTypeToStr(refType); - xmlSchemaPErrExt(ctxt, ownerElem, error, - NULL, NULL, NULL, - "%s, attribute '%s': The QName value '%s' does not resolve to a(n) " - "%s.\n", BAD_CAST des, BAD_CAST name, - xmlSchemaFormatQName(&strA, refURI, refName), - BAD_CAST refTypeStr, NULL); - FREE_AND_NULL(des) - FREE_AND_NULL(strA) -} - -/** - * xmlSchemaPCustomAttrErr: - * @ctxt: the schema parser context - * @error: the error code - * @ownerDes: the designation of the owner - * @ownerItem: the owner as a schema object - * @attr: the illegal attribute node - * - * Reports an illegal attribute during the parse. - */ -static void -xmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlChar **ownerDes, - xmlSchemaBasicItemPtr ownerItem, - xmlAttrPtr attr, - const char *msg) -{ - xmlChar *des = NULL; - - if (ownerDes == NULL) - xmlSchemaFormatItemForReport(&des, NULL, ownerItem, attr->parent); - else if (*ownerDes == NULL) { - xmlSchemaFormatItemForReport(ownerDes, NULL, ownerItem, attr->parent); - des = *ownerDes; - } else - des = *ownerDes; - if (attr == NULL) { - xmlSchemaPErrExt(ctxt, NULL, error, NULL, NULL, NULL, - "%s, attribute '%s': %s.\n", - BAD_CAST des, (const xmlChar *) "Unknown", - (const xmlChar *) msg, NULL, NULL); - } else { - xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL, - "%s, attribute '%s': %s.\n", - BAD_CAST des, attr->name, (const xmlChar *) msg, NULL, NULL); - } - if (ownerDes == NULL) - FREE_AND_NULL(des); -} - -/** - * xmlSchemaPIllegalAttrErr: - * @ctxt: the schema parser context - * @error: the error code - * @ownerDes: the designation of the attribute's owner - * @ownerItem: the attribute's owner item - * @attr: the illegal attribute node - * - * Reports an illegal attribute during the parse. - */ -static void -xmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaBasicItemPtr ownerComp ATTRIBUTE_UNUSED, - xmlAttrPtr attr) -{ - xmlChar *strA = NULL, *strB = NULL; - - xmlSchemaFormatNodeForError(&strA, ACTXT_CAST ctxt, attr->parent); - xmlSchemaErr4(ACTXT_CAST ctxt, error, (xmlNodePtr) attr, - "%sThe attribute '%s' is not allowed.\n", BAD_CAST strA, - xmlSchemaFormatQNameNs(&strB, attr->ns, attr->name), - NULL, NULL); - FREE_AND_NULL(strA); - FREE_AND_NULL(strB); -} - -/** - * xmlSchemaPCustomErr: - * @ctxt: the schema parser context - * @error: the error code - * @itemDes: the designation of the schema item - * @item: the schema item - * @itemElem: the node of the schema item - * @message: the error message - * @str1: an optional param for the error message - * @str2: an optional param for the error message - * @str3: an optional param for the error message - * - * Reports an error during parsing. - */ -static void -xmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaBasicItemPtr item, - xmlNodePtr itemElem, - const char *message, - const xmlChar *str1, - const xmlChar *str2, - const xmlChar *str3) -{ - xmlChar *des = NULL, *msg = NULL; - - xmlSchemaFormatItemForReport(&des, NULL, item, itemElem); - msg = xmlStrdup(BAD_CAST "%s: "); - msg = xmlStrcat(msg, (const xmlChar *) message); - msg = xmlStrcat(msg, BAD_CAST ".\n"); - if ((itemElem == NULL) && (item != NULL)) - itemElem = WXS_ITEM_NODE(item); - xmlSchemaPErrExt(ctxt, itemElem, error, NULL, NULL, NULL, - (const char *) msg, BAD_CAST des, str1, str2, str3, NULL); - FREE_AND_NULL(des); - FREE_AND_NULL(msg); -} - -/** - * xmlSchemaPCustomErr: - * @ctxt: the schema parser context - * @error: the error code - * @itemDes: the designation of the schema item - * @item: the schema item - * @itemElem: the node of the schema item - * @message: the error message - * @str1: the optional param for the error message - * - * Reports an error during parsing. - */ -static void -xmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaBasicItemPtr item, - xmlNodePtr itemElem, - const char *message, - const xmlChar *str1) -{ - xmlSchemaPCustomErrExt(ctxt, error, item, itemElem, message, - str1, NULL, NULL); -} - -/** - * xmlSchemaPAttrUseErr: - * @ctxt: the schema parser context - * @error: the error code - * @itemDes: the designation of the schema type - * @item: the schema type - * @itemElem: the node of the schema type - * @attr: the invalid schema attribute - * @message: the error message - * @str1: the optional param for the error message - * - * Reports an attribute use error during parsing. - */ -static void -xmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlNodePtr node, - xmlSchemaBasicItemPtr ownerItem, - const xmlSchemaAttributeUsePtr attruse, - const char *message, - const xmlChar *str1, const xmlChar *str2, - const xmlChar *str3,const xmlChar *str4) -{ - xmlChar *str = NULL, *msg = NULL; - - xmlSchemaFormatItemForReport(&msg, NULL, ownerItem, NULL); - msg = xmlStrcat(msg, BAD_CAST ", "); - msg = xmlStrcat(msg, - BAD_CAST xmlSchemaFormatItemForReport(&str, NULL, - WXS_BASIC_CAST attruse, NULL)); - FREE_AND_NULL(str); - msg = xmlStrcat(msg, BAD_CAST ": "); - msg = xmlStrcat(msg, (const xmlChar *) message); - msg = xmlStrcat(msg, BAD_CAST ".\n"); - xmlSchemaErr4(ACTXT_CAST ctxt, error, node, - (const char *) msg, str1, str2, str3, str4); - xmlFree(msg); -} - -/** - * xmlSchemaPIllegalFacetAtomicErr: - * @ctxt: the schema parser context - * @error: the error code - * @type: the schema type - * @baseType: the base type of type - * @facet: the illegal facet - * - * Reports an illegal facet for atomic simple types. - */ -static void -xmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaTypePtr type, - xmlSchemaTypePtr baseType, - xmlSchemaFacetPtr facet) -{ - xmlChar *des = NULL, *strT = NULL; - - xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, type->node); - xmlSchemaPErrExt(ctxt, type->node, error, NULL, NULL, NULL, - "%s: The facet '%s' is not allowed on types derived from the " - "type %s.\n", - BAD_CAST des, xmlSchemaFacetTypeToString(facet->type), - xmlSchemaFormatItemForReport(&strT, NULL, WXS_BASIC_CAST baseType, NULL), - NULL, NULL); - FREE_AND_NULL(des); - FREE_AND_NULL(strT); -} - -/** - * xmlSchemaPIllegalFacetListUnionErr: - * @ctxt: the schema parser context - * @error: the error code - * @itemDes: the designation of the schema item involved - * @item: the schema item involved - * @facet: the illegal facet - * - * Reports an illegal facet for <list> and <union>. - */ -static void -xmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaTypePtr type, - xmlSchemaFacetPtr facet) -{ - xmlChar *des = NULL; - - xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, - type->node); - xmlSchemaPErr(ctxt, type->node, error, - "%s: The facet '%s' is not allowed.\n", - BAD_CAST des, xmlSchemaFacetTypeToString(facet->type)); - FREE_AND_NULL(des); -} - -/** - * xmlSchemaPMutualExclAttrErr: - * @ctxt: the schema validation context - * @error: the error code - * @elemDes: the designation of the parent element node - * @attr: the bad attribute node - * @type: the corresponding type of the attribute node - * - * Reports an illegal attribute. - */ -static void -xmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaBasicItemPtr ownerItem, - xmlAttrPtr attr, - const char *name1, - const char *name2) -{ - xmlChar *des = NULL; - - xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST ownerItem, attr->parent); - xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL, - "%s: The attributes '%s' and '%s' are mutually exclusive.\n", - BAD_CAST des, BAD_CAST name1, BAD_CAST name2, NULL, NULL); - FREE_AND_NULL(des); -} - -/** - * xmlSchemaPSimpleTypeErr: - * @ctxt: the schema validation context - * @error: the error code - * @type: the type specifier - * @ownerDes: the designation of the owner - * @ownerItem: the schema object if existent - * @node: the validated node - * @value: the validated value - * - * Reports a simple type validation error. - * TODO: Should this report the value of an element as well? - */ -static void -xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaBasicItemPtr ownerItem ATTRIBUTE_UNUSED, - xmlNodePtr node, - xmlSchemaTypePtr type, - const char *expected, - const xmlChar *value, - const char *message, - const xmlChar *str1, - const xmlChar *str2) -{ - xmlChar *msg = NULL; - - xmlSchemaFormatNodeForError(&msg, ACTXT_CAST ctxt, node); - if (message == NULL) { - /* - * Use default messages. - */ - if (type != NULL) { - if (node->type == XML_ATTRIBUTE_NODE) - msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of "); - else - msg = xmlStrcat(msg, BAD_CAST "The character content is not a " - "valid value of "); - if (! xmlSchemaIsGlobalItem(type)) - msg = xmlStrcat(msg, BAD_CAST "the local "); - else - msg = xmlStrcat(msg, BAD_CAST "the "); - - if (WXS_IS_ATOMIC(type)) - msg = xmlStrcat(msg, BAD_CAST "atomic type"); - else if (WXS_IS_LIST(type)) - msg = xmlStrcat(msg, BAD_CAST "list type"); - else if (WXS_IS_UNION(type)) - msg = xmlStrcat(msg, BAD_CAST "union type"); - - if (xmlSchemaIsGlobalItem(type)) { - xmlChar *str = NULL; - msg = xmlStrcat(msg, BAD_CAST " '"); - if (type->builtInType != 0) { - msg = xmlStrcat(msg, BAD_CAST "xs:"); - msg = xmlStrcat(msg, type->name); - } else - msg = xmlStrcat(msg, - xmlSchemaFormatQName(&str, - type->targetNamespace, type->name)); - msg = xmlStrcat(msg, BAD_CAST "'."); - FREE_AND_NULL(str); - } - } else { - if (node->type == XML_ATTRIBUTE_NODE) - msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not valid."); - else - msg = xmlStrcat(msg, BAD_CAST "The character content is not " - "valid."); - } - if (expected) { - msg = xmlStrcat(msg, BAD_CAST " Expected is '"); - msg = xmlStrcat(msg, BAD_CAST expected); - msg = xmlStrcat(msg, BAD_CAST "'.\n"); - } else - msg = xmlStrcat(msg, BAD_CAST "\n"); - if (node->type == XML_ATTRIBUTE_NODE) - xmlSchemaPErr(ctxt, node, error, (const char *) msg, value, NULL); - else - xmlSchemaPErr(ctxt, node, error, (const char *) msg, NULL, NULL); - } else { - msg = xmlStrcat(msg, BAD_CAST message); - msg = xmlStrcat(msg, BAD_CAST ".\n"); - xmlSchemaPErrExt(ctxt, node, error, NULL, NULL, NULL, - (const char*) msg, str1, str2, NULL, NULL, NULL); - } - /* Cleanup. */ - FREE_AND_NULL(msg) -} - -/** - * xmlSchemaPContentErr: - * @ctxt: the schema parser context - * @error: the error code - * @onwerDes: the designation of the holder of the content - * @ownerItem: the owner item of the holder of the content - * @ownerElem: the node of the holder of the content - * @child: the invalid child node - * @message: the optional error message - * @content: the optional string describing the correct content - * - * Reports an error concerning the content of a schema element. - */ -static void -xmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt, - xmlParserErrors error, - xmlSchemaBasicItemPtr ownerItem, - xmlNodePtr ownerElem, - xmlNodePtr child, - const char *message, - const char *content) -{ - xmlChar *des = NULL; - - xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); - if (message != NULL) - xmlSchemaPErr2(ctxt, ownerElem, child, error, - "%s: %s.\n", - BAD_CAST des, BAD_CAST message); - else { - if (content != NULL) { - xmlSchemaPErr2(ctxt, ownerElem, child, error, - "%s: The content is not valid. Expected is %s.\n", - BAD_CAST des, BAD_CAST content); - } else { - xmlSchemaPErr2(ctxt, ownerElem, child, error, - "%s: The content is not valid.\n", - BAD_CAST des, NULL); - } - } - FREE_AND_NULL(des) -} - -/************************************************************************ - * * - * Streamable error functions * - * * - ************************************************************************/ - - - - -/************************************************************************ - * * - * Validation helper functions * - * * - ************************************************************************/ - - -/************************************************************************ - * * - * Allocation functions * - * * - ************************************************************************/ - -/** - * xmlSchemaNewSchemaForParserCtxt: - * @ctxt: a schema validation context - * - * Allocate a new Schema structure. - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlSchemaPtr -xmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt) -{ - xmlSchemaPtr ret; - - ret = (xmlSchemaPtr) xmlMalloc(sizeof(xmlSchema)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating schema", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchema)); - ret->dict = ctxt->dict; - xmlDictReference(ret->dict); - - return (ret); -} - -/** - * xmlSchemaNewFacet: - * - * Allocate a new Facet structure. - * - * Returns the newly allocated structure or NULL in case or error - */ -xmlSchemaFacetPtr -xmlSchemaNewFacet(void) -{ - xmlSchemaFacetPtr ret; - - ret = (xmlSchemaFacetPtr) xmlMalloc(sizeof(xmlSchemaFacet)); - if (ret == NULL) { - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaFacet)); - - return (ret); -} - -/** - * xmlSchemaNewAnnot: - * @ctxt: a schema validation context - * @node: a node - * - * Allocate a new annotation structure. - * - * Returns the newly allocated structure or NULL in case or error - */ -static xmlSchemaAnnotPtr -xmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlSchemaAnnotPtr ret; - - ret = (xmlSchemaAnnotPtr) xmlMalloc(sizeof(xmlSchemaAnnot)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating annotation", node); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaAnnot)); - ret->content = node; - return (ret); -} - -static xmlSchemaItemListPtr -xmlSchemaItemListCreate(void) -{ - xmlSchemaItemListPtr ret; - - ret = xmlMalloc(sizeof(xmlSchemaItemList)); - if (ret == NULL) { - xmlSchemaPErrMemory(NULL, - "allocating an item list structure", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaItemList)); - return (ret); -} - -static void -xmlSchemaItemListClear(xmlSchemaItemListPtr list) -{ - if (list->items != NULL) { - xmlFree(list->items); - list->items = NULL; - } - list->nbItems = 0; - list->sizeItems = 0; -} - -static int -xmlSchemaItemListAdd(xmlSchemaItemListPtr list, void *item) -{ - if (list->items == NULL) { - list->items = (void **) xmlMalloc( - 20 * sizeof(void *)); - if (list->items == NULL) { - xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); - return(-1); - } - list->sizeItems = 20; - } else if (list->sizeItems <= list->nbItems) { - list->sizeItems *= 2; - list->items = (void **) xmlRealloc(list->items, - list->sizeItems * sizeof(void *)); - if (list->items == NULL) { - xmlSchemaPErrMemory(NULL, "growing item list", NULL); - list->sizeItems = 0; - return(-1); - } - } - list->items[list->nbItems++] = item; - return(0); -} - -static int -xmlSchemaItemListAddSize(xmlSchemaItemListPtr list, - int initialSize, - void *item) -{ - if (list->items == NULL) { - if (initialSize <= 0) - initialSize = 1; - list->items = (void **) xmlMalloc( - initialSize * sizeof(void *)); - if (list->items == NULL) { - xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); - return(-1); - } - list->sizeItems = initialSize; - } else if (list->sizeItems <= list->nbItems) { - list->sizeItems *= 2; - list->items = (void **) xmlRealloc(list->items, - list->sizeItems * sizeof(void *)); - if (list->items == NULL) { - xmlSchemaPErrMemory(NULL, "growing item list", NULL); - list->sizeItems = 0; - return(-1); - } - } - list->items[list->nbItems++] = item; - return(0); -} - -static int -xmlSchemaItemListInsert(xmlSchemaItemListPtr list, void *item, int idx) -{ - if (list->items == NULL) { - list->items = (void **) xmlMalloc( - 20 * sizeof(void *)); - if (list->items == NULL) { - xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); - return(-1); - } - list->sizeItems = 20; - } else if (list->sizeItems <= list->nbItems) { - list->sizeItems *= 2; - list->items = (void **) xmlRealloc(list->items, - list->sizeItems * sizeof(void *)); - if (list->items == NULL) { - xmlSchemaPErrMemory(NULL, "growing item list", NULL); - list->sizeItems = 0; - return(-1); - } - } - /* - * Just append if the index is greater/equal than the item count. - */ - if (idx >= list->nbItems) { - list->items[list->nbItems++] = item; - } else { - int i; - for (i = list->nbItems; i > idx; i--) - list->items[i] = list->items[i-1]; - list->items[idx] = item; - list->nbItems++; - } - return(0); -} - -#if 0 /* enable if ever needed */ -static int -xmlSchemaItemListInsertSize(xmlSchemaItemListPtr list, - int initialSize, - void *item, - int idx) -{ - if (list->items == NULL) { - if (initialSize <= 0) - initialSize = 1; - list->items = (void **) xmlMalloc( - initialSize * sizeof(void *)); - if (list->items == NULL) { - xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); - return(-1); - } - list->sizeItems = initialSize; - } else if (list->sizeItems <= list->nbItems) { - list->sizeItems *= 2; - list->items = (void **) xmlRealloc(list->items, - list->sizeItems * sizeof(void *)); - if (list->items == NULL) { - xmlSchemaPErrMemory(NULL, "growing item list", NULL); - list->sizeItems = 0; - return(-1); - } - } - /* - * Just append if the index is greater/equal than the item count. - */ - if (idx >= list->nbItems) { - list->items[list->nbItems++] = item; - } else { - int i; - for (i = list->nbItems; i > idx; i--) - list->items[i] = list->items[i-1]; - list->items[idx] = item; - list->nbItems++; - } - return(0); -} -#endif - -static int -xmlSchemaItemListRemove(xmlSchemaItemListPtr list, int idx) -{ - int i; - if ((list->items == NULL) || (idx >= list->nbItems)) { - xmlSchemaPSimpleErr("Internal error: xmlSchemaItemListRemove, " - "index error.\n"); - return(-1); - } - - if (list->nbItems == 1) { - /* TODO: Really free the list? */ - xmlFree(list->items); - list->items = NULL; - list->nbItems = 0; - list->sizeItems = 0; - } else if (list->nbItems -1 == idx) { - list->nbItems--; - } else { - for (i = idx; i < list->nbItems -1; i++) - list->items[i] = list->items[i+1]; - list->nbItems--; - } - return(0); -} - -/** - * xmlSchemaItemListFree: - * @annot: a schema type structure - * - * Deallocate a annotation structure - */ -static void -xmlSchemaItemListFree(xmlSchemaItemListPtr list) -{ - if (list == NULL) - return; - if (list->items != NULL) - xmlFree(list->items); - xmlFree(list); -} - -static void -xmlSchemaBucketFree(xmlSchemaBucketPtr bucket) -{ - if (bucket == NULL) - return; - if (bucket->globals != NULL) { - xmlSchemaComponentListFree(bucket->globals); - xmlSchemaItemListFree(bucket->globals); - } - if (bucket->locals != NULL) { - xmlSchemaComponentListFree(bucket->locals); - xmlSchemaItemListFree(bucket->locals); - } - if (bucket->relations != NULL) { - xmlSchemaSchemaRelationPtr prev, cur = bucket->relations; - do { - prev = cur; - cur = cur->next; - xmlFree(prev); - } while (cur != NULL); - } - if ((! bucket->preserveDoc) && (bucket->doc != NULL)) { - xmlFreeDoc(bucket->doc); - } - if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) { - if (WXS_IMPBUCKET(bucket)->schema != NULL) - xmlSchemaFree(WXS_IMPBUCKET(bucket)->schema); - } - xmlFree(bucket); -} - -static xmlSchemaBucketPtr -xmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt, - int type, const xmlChar *targetNamespace) -{ - xmlSchemaBucketPtr ret; - int size; - xmlSchemaPtr mainSchema; - - if (WXS_CONSTRUCTOR(pctxt)->mainSchema == NULL) { - PERROR_INT("xmlSchemaBucketCreate", - "no main schema on constructor"); - return(NULL); - } - mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema; - /* Create the schema bucket. */ - if (WXS_IS_BUCKET_INCREDEF(type)) - size = sizeof(xmlSchemaInclude); - else - size = sizeof(xmlSchemaImport); - ret = (xmlSchemaBucketPtr) xmlMalloc(size); - if (ret == NULL) { - xmlSchemaPErrMemory(NULL, "allocating schema bucket", NULL); - return(NULL); - } - memset(ret, 0, size); - ret->targetNamespace = targetNamespace; - ret->type = type; - ret->globals = xmlSchemaItemListCreate(); - if (ret->globals == NULL) { - xmlFree(ret); - return(NULL); - } - ret->locals = xmlSchemaItemListCreate(); - if (ret->locals == NULL) { - xmlFree(ret); - return(NULL); - } - /* - * The following will assure that only the first bucket is marked as - * XML_SCHEMA_SCHEMA_MAIN and it points to the *main* schema. - * For each following import buckets an xmlSchema will be created. - * An xmlSchema will be created for every distinct targetNamespace. - * We assign the targetNamespace to the schemata here. - */ - if (! WXS_HAS_BUCKETS(pctxt)) { - if (WXS_IS_BUCKET_INCREDEF(type)) { - PERROR_INT("xmlSchemaBucketCreate", - "first bucket but it's an include or redefine"); - xmlSchemaBucketFree(ret); - return(NULL); - } - /* Force the type to be XML_SCHEMA_SCHEMA_MAIN. */ - ret->type = XML_SCHEMA_SCHEMA_MAIN; - /* Point to the *main* schema. */ - WXS_CONSTRUCTOR(pctxt)->mainBucket = ret; - WXS_IMPBUCKET(ret)->schema = mainSchema; - /* - * Ensure that the main schema gets a targetNamespace. - */ - mainSchema->targetNamespace = targetNamespace; - } else { - if (type == XML_SCHEMA_SCHEMA_MAIN) { - PERROR_INT("xmlSchemaBucketCreate", - "main bucket but it's not the first one"); - xmlSchemaBucketFree(ret); - return(NULL); - } else if (type == XML_SCHEMA_SCHEMA_IMPORT) { - /* - * Create a schema for imports and assign the - * targetNamespace. - */ - WXS_IMPBUCKET(ret)->schema = xmlSchemaNewSchema(pctxt); - if (WXS_IMPBUCKET(ret)->schema == NULL) { - xmlSchemaBucketFree(ret); - return(NULL); - } - WXS_IMPBUCKET(ret)->schema->targetNamespace = targetNamespace; - } - } - if (WXS_IS_BUCKET_IMPMAIN(type)) { - int res; - /* - * Imports go into the "schemasImports" slot of the main *schema*. - * Note that we create an import entry for the main schema as well; i.e., - * even if there's only one schema, we'll get an import. - */ - if (mainSchema->schemasImports == NULL) { - mainSchema->schemasImports = xmlHashCreateDict(5, - WXS_CONSTRUCTOR(pctxt)->dict); - if (mainSchema->schemasImports == NULL) { - xmlSchemaBucketFree(ret); - return(NULL); - } - } - if (targetNamespace == NULL) - res = xmlHashAddEntry(mainSchema->schemasImports, - XML_SCHEMAS_NO_NAMESPACE, ret); - else - res = xmlHashAddEntry(mainSchema->schemasImports, - targetNamespace, ret); - if (res != 0) { - PERROR_INT("xmlSchemaBucketCreate", - "failed to add the schema bucket to the hash"); - xmlSchemaBucketFree(ret); - return(NULL); - } - } else { - /* Set the @ownerImport of an include bucket. */ - if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type)) - WXS_INCBUCKET(ret)->ownerImport = - WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket); - else - WXS_INCBUCKET(ret)->ownerImport = - WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport; - - /* Includes got into the "includes" slot of the *main* schema. */ - if (mainSchema->includes == NULL) { - mainSchema->includes = xmlSchemaItemListCreate(); - if (mainSchema->includes == NULL) { - xmlSchemaBucketFree(ret); - return(NULL); - } - } - xmlSchemaItemListAdd(mainSchema->includes, ret); - } - /* - * Add to list of all buckets; this is used for lookup - * during schema construction time only. - */ - if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->buckets, ret) == -1) - return(NULL); - return(ret); -} - -static int -xmlSchemaAddItemSize(xmlSchemaItemListPtr *list, int initialSize, void *item) -{ - if (*list == NULL) { - *list = xmlSchemaItemListCreate(); - if (*list == NULL) - return(-1); - } - xmlSchemaItemListAddSize(*list, initialSize, item); - return(0); -} - -/** - * xmlSchemaFreeAnnot: - * @annot: a schema type structure - * - * Deallocate a annotation structure - */ -static void -xmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot) -{ - if (annot == NULL) - return; - if (annot->next == NULL) { - xmlFree(annot); - } else { - xmlSchemaAnnotPtr prev; - - do { - prev = annot; - annot = annot->next; - xmlFree(prev); - } while (annot != NULL); - } -} - -/** - * xmlSchemaFreeNotation: - * @schema: a schema notation structure - * - * Deallocate a Schema Notation structure. - */ -static void -xmlSchemaFreeNotation(xmlSchemaNotationPtr nota) -{ - if (nota == NULL) - return; - xmlFree(nota); -} - -/** - * xmlSchemaFreeAttribute: - * @attr: an attribute declaration - * - * Deallocates an attribute declaration structure. - */ -static void -xmlSchemaFreeAttribute(xmlSchemaAttributePtr attr) -{ - if (attr == NULL) - return; - if (attr->annot != NULL) - xmlSchemaFreeAnnot(attr->annot); - if (attr->defVal != NULL) - xmlSchemaFreeValue(attr->defVal); - xmlFree(attr); -} - -/** - * xmlSchemaFreeAttributeUse: - * @use: an attribute use - * - * Deallocates an attribute use structure. - */ -static void -xmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use) -{ - if (use == NULL) - return; - if (use->annot != NULL) - xmlSchemaFreeAnnot(use->annot); - if (use->defVal != NULL) - xmlSchemaFreeValue(use->defVal); - xmlFree(use); -} - -/** - * xmlSchemaFreeAttributeUseProhib: - * @prohib: an attribute use prohibition - * - * Deallocates an attribute use structure. - */ -static void -xmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib) -{ - if (prohib == NULL) - return; - xmlFree(prohib); -} - -/** - * xmlSchemaFreeWildcardNsSet: - * set: a schema wildcard namespace - * - * Deallocates a list of wildcard constraint structures. - */ -static void -xmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr set) -{ - xmlSchemaWildcardNsPtr next; - - while (set != NULL) { - next = set->next; - xmlFree(set); - set = next; - } -} - -/** - * xmlSchemaFreeWildcard: - * @wildcard: a wildcard structure - * - * Deallocates a wildcard structure. - */ -void -xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard) -{ - if (wildcard == NULL) - return; - if (wildcard->annot != NULL) - xmlSchemaFreeAnnot(wildcard->annot); - if (wildcard->nsSet != NULL) - xmlSchemaFreeWildcardNsSet(wildcard->nsSet); - if (wildcard->negNsSet != NULL) - xmlFree(wildcard->negNsSet); - xmlFree(wildcard); -} - -/** - * xmlSchemaFreeAttributeGroup: - * @schema: a schema attribute group structure - * - * Deallocate a Schema Attribute Group structure. - */ -static void -xmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr) -{ - if (attrGr == NULL) - return; - if (attrGr->annot != NULL) - xmlSchemaFreeAnnot(attrGr->annot); - if (attrGr->attrUses != NULL) - xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses); - xmlFree(attrGr); -} - -/** - * xmlSchemaFreeQNameRef: - * @item: a QName reference structure - * - * Deallocatea a QName reference structure. - */ -static void -xmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr item) -{ - xmlFree(item); -} - -/** - * xmlSchemaFreeTypeLinkList: - * @alink: a type link - * - * Deallocate a list of types. - */ -static void -xmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr link) -{ - xmlSchemaTypeLinkPtr next; - - while (link != NULL) { - next = link->next; - xmlFree(link); - link = next; - } -} - -static void -xmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto) -{ - xmlSchemaIDCStateObjPtr next; - while (sto != NULL) { - next = sto->next; - if (sto->history != NULL) - xmlFree(sto->history); - if (sto->xpathCtxt != NULL) - xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt); - xmlFree(sto); - sto = next; - } -} - -/** - * xmlSchemaFreeIDC: - * @idc: a identity-constraint definition - * - * Deallocates an identity-constraint definition. - */ -static void -xmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef) -{ - xmlSchemaIDCSelectPtr cur, prev; - - if (idcDef == NULL) - return; - if (idcDef->annot != NULL) - xmlSchemaFreeAnnot(idcDef->annot); - /* Selector */ - if (idcDef->selector != NULL) { - if (idcDef->selector->xpathComp != NULL) - xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp); - xmlFree(idcDef->selector); - } - /* Fields */ - if (idcDef->fields != NULL) { - cur = idcDef->fields; - do { - prev = cur; - cur = cur->next; - if (prev->xpathComp != NULL) - xmlFreePattern((xmlPatternPtr) prev->xpathComp); - xmlFree(prev); - } while (cur != NULL); - } - xmlFree(idcDef); -} - -/** - * xmlSchemaFreeElement: - * @schema: a schema element structure - * - * Deallocate a Schema Element structure. - */ -static void -xmlSchemaFreeElement(xmlSchemaElementPtr elem) -{ - if (elem == NULL) - return; - if (elem->annot != NULL) - xmlSchemaFreeAnnot(elem->annot); - if (elem->contModel != NULL) - xmlRegFreeRegexp(elem->contModel); - if (elem->defVal != NULL) - xmlSchemaFreeValue(elem->defVal); - xmlFree(elem); -} - -/** - * xmlSchemaFreeFacet: - * @facet: a schema facet structure - * - * Deallocate a Schema Facet structure. - */ -void -xmlSchemaFreeFacet(xmlSchemaFacetPtr facet) -{ - if (facet == NULL) - return; - if (facet->val != NULL) - xmlSchemaFreeValue(facet->val); - if (facet->regexp != NULL) - xmlRegFreeRegexp(facet->regexp); - if (facet->annot != NULL) - xmlSchemaFreeAnnot(facet->annot); - xmlFree(facet); -} - -/** - * xmlSchemaFreeType: - * @type: a schema type structure - * - * Deallocate a Schema Type structure. - */ -void -xmlSchemaFreeType(xmlSchemaTypePtr type) -{ - if (type == NULL) - return; - if (type->annot != NULL) - xmlSchemaFreeAnnot(type->annot); - if (type->facets != NULL) { - xmlSchemaFacetPtr facet, next; - - facet = type->facets; - while (facet != NULL) { - next = facet->next; - xmlSchemaFreeFacet(facet); - facet = next; - } - } - if (type->attrUses != NULL) - xmlSchemaItemListFree((xmlSchemaItemListPtr) type->attrUses); - if (type->memberTypes != NULL) - xmlSchemaFreeTypeLinkList(type->memberTypes); - if (type->facetSet != NULL) { - xmlSchemaFacetLinkPtr next, link; - - link = type->facetSet; - do { - next = link->next; - xmlFree(link); - link = next; - } while (link != NULL); - } - if (type->contModel != NULL) - xmlRegFreeRegexp(type->contModel); - xmlFree(type); -} - -/** - * xmlSchemaFreeModelGroupDef: - * @item: a schema model group definition - * - * Deallocates a schema model group definition. - */ -static void -xmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr item) -{ - if (item->annot != NULL) - xmlSchemaFreeAnnot(item->annot); - xmlFree(item); -} - -/** - * xmlSchemaFreeModelGroup: - * @item: a schema model group - * - * Deallocates a schema model group structure. - */ -static void -xmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr item) -{ - if (item->annot != NULL) - xmlSchemaFreeAnnot(item->annot); - xmlFree(item); -} - -static void -xmlSchemaComponentListFree(xmlSchemaItemListPtr list) -{ - if ((list == NULL) || (list->nbItems == 0)) - return; - { - xmlSchemaTreeItemPtr item; - xmlSchemaTreeItemPtr *items = (xmlSchemaTreeItemPtr *) list->items; - int i; - - for (i = 0; i < list->nbItems; i++) { - item = items[i]; - if (item == NULL) - continue; - switch (item->type) { - case XML_SCHEMA_TYPE_SIMPLE: - case XML_SCHEMA_TYPE_COMPLEX: - xmlSchemaFreeType((xmlSchemaTypePtr) item); - break; - case XML_SCHEMA_TYPE_ATTRIBUTE: - xmlSchemaFreeAttribute((xmlSchemaAttributePtr) item); - break; - case XML_SCHEMA_TYPE_ATTRIBUTE_USE: - xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr) item); - break; - case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: - xmlSchemaFreeAttributeUseProhib( - (xmlSchemaAttributeUseProhibPtr) item); - break; - case XML_SCHEMA_TYPE_ELEMENT: - xmlSchemaFreeElement((xmlSchemaElementPtr) item); - break; - case XML_SCHEMA_TYPE_PARTICLE: - if (item->annot != NULL) - xmlSchemaFreeAnnot(item->annot); - xmlFree(item); - break; - case XML_SCHEMA_TYPE_SEQUENCE: - case XML_SCHEMA_TYPE_CHOICE: - case XML_SCHEMA_TYPE_ALL: - xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr) item); - break; - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - xmlSchemaFreeAttributeGroup( - (xmlSchemaAttributeGroupPtr) item); - break; - case XML_SCHEMA_TYPE_GROUP: - xmlSchemaFreeModelGroupDef( - (xmlSchemaModelGroupDefPtr) item); - break; - case XML_SCHEMA_TYPE_ANY: - case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: - xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) item); - break; - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_UNIQUE: - case XML_SCHEMA_TYPE_IDC_KEYREF: - xmlSchemaFreeIDC((xmlSchemaIDCPtr) item); - break; - case XML_SCHEMA_TYPE_NOTATION: - xmlSchemaFreeNotation((xmlSchemaNotationPtr) item); - break; - case XML_SCHEMA_EXTRA_QNAMEREF: - xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr) item); - break; - default: { - /* TODO: This should never be hit. */ - xmlSchemaPSimpleInternalErr(NULL, - "Internal error: xmlSchemaComponentListFree, " - "unexpected component type '%s'\n", - (const xmlChar *) WXS_ITEM_TYPE_NAME(item)); - } - break; - } - } - list->nbItems = 0; - } -} - -/** - * xmlSchemaFree: - * @schema: a schema structure - * - * Deallocate a Schema structure. - */ -void -xmlSchemaFree(xmlSchemaPtr schema) -{ - if (schema == NULL) - return; - /* @volatiles is not used anymore :-/ */ - if (schema->volatiles != NULL) - TODO - /* - * Note that those slots are not responsible for freeing - * schema components anymore; this will now be done by - * the schema buckets. - */ - if (schema->notaDecl != NULL) - xmlHashFree(schema->notaDecl, NULL); - if (schema->attrDecl != NULL) - xmlHashFree(schema->attrDecl, NULL); - if (schema->attrgrpDecl != NULL) - xmlHashFree(schema->attrgrpDecl, NULL); - if (schema->elemDecl != NULL) - xmlHashFree(schema->elemDecl, NULL); - if (schema->typeDecl != NULL) - xmlHashFree(schema->typeDecl, NULL); - if (schema->groupDecl != NULL) - xmlHashFree(schema->groupDecl, NULL); - if (schema->idcDef != NULL) - xmlHashFree(schema->idcDef, NULL); - - if (schema->schemasImports != NULL) - xmlHashFree(schema->schemasImports, - (xmlHashDeallocator) xmlSchemaBucketFree); - if (schema->includes != NULL) { - xmlSchemaItemListPtr list = (xmlSchemaItemListPtr) schema->includes; - int i; - for (i = 0; i < list->nbItems; i++) { - xmlSchemaBucketFree((xmlSchemaBucketPtr) list->items[i]); - } - xmlSchemaItemListFree(list); - } - if (schema->annot != NULL) - xmlSchemaFreeAnnot(schema->annot); - /* Never free the doc here, since this will be done by the buckets. */ - - xmlDictFree(schema->dict); - xmlFree(schema); -} - -/************************************************************************ - * * - * Debug functions * - * * - ************************************************************************/ - -#ifdef LIBXML_OUTPUT_ENABLED - -static void -xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output); /* forward */ - -/** - * xmlSchemaElementDump: - * @elem: an element - * @output: the file output - * - * Dump the element - */ -static void -xmlSchemaElementDump(xmlSchemaElementPtr elem, FILE * output, - const xmlChar * name ATTRIBUTE_UNUSED, - const xmlChar * namespace ATTRIBUTE_UNUSED, - const xmlChar * context ATTRIBUTE_UNUSED) -{ - if (elem == NULL) - return; - - - fprintf(output, "Element"); - if (elem->flags & XML_SCHEMAS_ELEM_GLOBAL) - fprintf(output, " (global)"); - fprintf(output, ": '%s' ", elem->name); - if (namespace != NULL) - fprintf(output, "ns '%s'", namespace); - fprintf(output, "\n"); -#if 0 - if ((elem->minOccurs != 1) || (elem->maxOccurs != 1)) { - fprintf(output, " min %d ", elem->minOccurs); - if (elem->maxOccurs >= UNBOUNDED) - fprintf(output, "max: unbounded\n"); - else if (elem->maxOccurs != 1) - fprintf(output, "max: %d\n", elem->maxOccurs); - else - fprintf(output, "\n"); - } -#endif - /* - * Misc other properties. - */ - if ((elem->flags & XML_SCHEMAS_ELEM_NILLABLE) || - (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) || - (elem->flags & XML_SCHEMAS_ELEM_FIXED) || - (elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) { - fprintf(output, " props: "); - if (elem->flags & XML_SCHEMAS_ELEM_FIXED) - fprintf(output, "[fixed] "); - if (elem->flags & XML_SCHEMAS_ELEM_DEFAULT) - fprintf(output, "[default] "); - if (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) - fprintf(output, "[abstract] "); - if (elem->flags & XML_SCHEMAS_ELEM_NILLABLE) - fprintf(output, "[nillable] "); - fprintf(output, "\n"); - } - /* - * Default/fixed value. - */ - if (elem->value != NULL) - fprintf(output, " value: '%s'\n", elem->value); - /* - * Type. - */ - if (elem->namedType != NULL) { - fprintf(output, " type: '%s' ", elem->namedType); - if (elem->namedTypeNs != NULL) - fprintf(output, "ns '%s'\n", elem->namedTypeNs); - else - fprintf(output, "\n"); - } else if (elem->subtypes != NULL) { - /* - * Dump local types. - */ - xmlSchemaTypeDump(elem->subtypes, output); - } - /* - * Substitution group. - */ - if (elem->substGroup != NULL) { - fprintf(output, " substitutionGroup: '%s' ", elem->substGroup); - if (elem->substGroupNs != NULL) - fprintf(output, "ns '%s'\n", elem->substGroupNs); - else - fprintf(output, "\n"); - } -} - -/** - * xmlSchemaAnnotDump: - * @output: the file output - * @annot: a annotation - * - * Dump the annotation - */ -static void -xmlSchemaAnnotDump(FILE * output, xmlSchemaAnnotPtr annot) -{ - xmlChar *content; - - if (annot == NULL) - return; - - content = xmlNodeGetContent(annot->content); - if (content != NULL) { - fprintf(output, " Annot: %s\n", content); - xmlFree(content); - } else - fprintf(output, " Annot: empty\n"); -} - -/** - * xmlSchemaContentModelDump: - * @particle: the schema particle - * @output: the file output - * @depth: the depth used for intentation - * - * Dump a SchemaType structure - */ -static void -xmlSchemaContentModelDump(xmlSchemaParticlePtr particle, FILE * output, int depth) -{ - xmlChar *str = NULL; - xmlSchemaTreeItemPtr term; - char shift[100]; - int i; - - if (particle == NULL) - return; - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - fprintf(output, shift); - if (particle->children == NULL) { - fprintf(output, "MISSING particle term\n"); - return; - } - term = particle->children; - if (term == NULL) { - fprintf(output, "(NULL)"); - } else { - switch (term->type) { - case XML_SCHEMA_TYPE_ELEMENT: - fprintf(output, "ELEM '%s'", xmlSchemaFormatQName(&str, - ((xmlSchemaElementPtr)term)->targetNamespace, - ((xmlSchemaElementPtr)term)->name)); - FREE_AND_NULL(str); - break; - case XML_SCHEMA_TYPE_SEQUENCE: - fprintf(output, "SEQUENCE"); - break; - case XML_SCHEMA_TYPE_CHOICE: - fprintf(output, "CHOICE"); - break; - case XML_SCHEMA_TYPE_ALL: - fprintf(output, "ALL"); - break; - case XML_SCHEMA_TYPE_ANY: - fprintf(output, "ANY"); - break; - default: - fprintf(output, "UNKNOWN\n"); - return; - } - } - if (particle->minOccurs != 1) - fprintf(output, " min: %d", particle->minOccurs); - if (particle->maxOccurs >= UNBOUNDED) - fprintf(output, " max: unbounded"); - else if (particle->maxOccurs != 1) - fprintf(output, " max: %d", particle->maxOccurs); - fprintf(output, "\n"); - if (term && - ((term->type == XML_SCHEMA_TYPE_SEQUENCE) || - (term->type == XML_SCHEMA_TYPE_CHOICE) || - (term->type == XML_SCHEMA_TYPE_ALL)) && - (term->children != NULL)) { - xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children, - output, depth +1); - } - if (particle->next != NULL) - xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next, - output, depth); -} - -/** - * xmlSchemaAttrUsesDump: - * @uses: attribute uses list - * @output: the file output - * - * Dumps a list of attribute use components. - */ -static void -xmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses, FILE * output) -{ - xmlSchemaAttributeUsePtr use; - xmlSchemaAttributeUseProhibPtr prohib; - xmlSchemaQNameRefPtr ref; - const xmlChar *name, *tns; - xmlChar *str = NULL; - int i; - - if ((uses == NULL) || (uses->nbItems == 0)) - return; - - fprintf(output, " attributes:\n"); - for (i = 0; i < uses->nbItems; i++) { - use = uses->items[i]; - if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) { - fprintf(output, " [prohibition] "); - prohib = (xmlSchemaAttributeUseProhibPtr) use; - name = prohib->name; - tns = prohib->targetNamespace; - } else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) { - fprintf(output, " [reference] "); - ref = (xmlSchemaQNameRefPtr) use; - name = ref->name; - tns = ref->targetNamespace; - } else { - fprintf(output, " [use] "); - name = WXS_ATTRUSE_DECL_NAME(use); - tns = WXS_ATTRUSE_DECL_TNS(use); - } - fprintf(output, "'%s'\n", - (const char *) xmlSchemaFormatQName(&str, tns, name)); - FREE_AND_NULL(str); - } -} - -/** - * xmlSchemaTypeDump: - * @output: the file output - * @type: a type structure - * - * Dump a SchemaType structure - */ -static void -xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output) -{ - if (type == NULL) { - fprintf(output, "Type: NULL\n"); - return; - } - fprintf(output, "Type: "); - if (type->name != NULL) - fprintf(output, "'%s' ", type->name); - else - fprintf(output, "(no name) "); - if (type->targetNamespace != NULL) - fprintf(output, "ns '%s' ", type->targetNamespace); - switch (type->type) { - case XML_SCHEMA_TYPE_BASIC: - fprintf(output, "[basic] "); - break; - case XML_SCHEMA_TYPE_SIMPLE: - fprintf(output, "[simple] "); - break; - case XML_SCHEMA_TYPE_COMPLEX: - fprintf(output, "[complex] "); - break; - case XML_SCHEMA_TYPE_SEQUENCE: - fprintf(output, "[sequence] "); - break; - case XML_SCHEMA_TYPE_CHOICE: - fprintf(output, "[choice] "); - break; - case XML_SCHEMA_TYPE_ALL: - fprintf(output, "[all] "); - break; - case XML_SCHEMA_TYPE_UR: - fprintf(output, "[ur] "); - break; - case XML_SCHEMA_TYPE_RESTRICTION: - fprintf(output, "[restriction] "); - break; - case XML_SCHEMA_TYPE_EXTENSION: - fprintf(output, "[extension] "); - break; - default: - fprintf(output, "[unknown type %d] ", type->type); - break; - } - fprintf(output, "content: "); - switch (type->contentType) { - case XML_SCHEMA_CONTENT_UNKNOWN: - fprintf(output, "[unknown] "); - break; - case XML_SCHEMA_CONTENT_EMPTY: - fprintf(output, "[empty] "); - break; - case XML_SCHEMA_CONTENT_ELEMENTS: - fprintf(output, "[element] "); - break; - case XML_SCHEMA_CONTENT_MIXED: - fprintf(output, "[mixed] "); - break; - case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS: - /* not used. */ - break; - case XML_SCHEMA_CONTENT_BASIC: - fprintf(output, "[basic] "); - break; - case XML_SCHEMA_CONTENT_SIMPLE: - fprintf(output, "[simple] "); - break; - case XML_SCHEMA_CONTENT_ANY: - fprintf(output, "[any] "); - break; - } - fprintf(output, "\n"); - if (type->base != NULL) { - fprintf(output, " base type: '%s'", type->base); - if (type->baseNs != NULL) - fprintf(output, " ns '%s'\n", type->baseNs); - else - fprintf(output, "\n"); - } - if (type->attrUses != NULL) - xmlSchemaAttrUsesDump(type->attrUses, output); - if (type->annot != NULL) - xmlSchemaAnnotDump(output, type->annot); -#ifdef DUMP_CONTENT_MODEL - if ((type->type == XML_SCHEMA_TYPE_COMPLEX) && - (type->subtypes != NULL)) { - xmlSchemaContentModelDump((xmlSchemaParticlePtr) type->subtypes, - output, 1); - } -#endif -} - -/** - * xmlSchemaDump: - * @output: the file output - * @schema: a schema structure - * - * Dump a Schema structure. - */ -void -xmlSchemaDump(FILE * output, xmlSchemaPtr schema) -{ - if (output == NULL) - return; - if (schema == NULL) { - fprintf(output, "Schemas: NULL\n"); - return; - } - fprintf(output, "Schemas: "); - if (schema->name != NULL) - fprintf(output, "%s, ", schema->name); - else - fprintf(output, "no name, "); - if (schema->targetNamespace != NULL) - fprintf(output, "%s", (const char *) schema->targetNamespace); - else - fprintf(output, "no target namespace"); - fprintf(output, "\n"); - if (schema->annot != NULL) - xmlSchemaAnnotDump(output, schema->annot); - xmlHashScan(schema->typeDecl, (xmlHashScanner) xmlSchemaTypeDump, - output); - xmlHashScanFull(schema->elemDecl, - (xmlHashScannerFull) xmlSchemaElementDump, output); -} - -#ifdef DEBUG_IDC_NODE_TABLE -/** - * xmlSchemaDebugDumpIDCTable: - * @vctxt: the WXS validation context - * - * Displays the current IDC table for debug purposes. - */ -static void -xmlSchemaDebugDumpIDCTable(FILE * output, - const xmlChar *namespaceName, - const xmlChar *localName, - xmlSchemaPSVIIDCBindingPtr bind) -{ - xmlChar *str = NULL; - const xmlChar *value; - xmlSchemaPSVIIDCNodePtr tab; - xmlSchemaPSVIIDCKeyPtr key; - int i, j, res; - - fprintf(output, "IDC: TABLES on '%s'\n", - xmlSchemaFormatQName(&str, namespaceName, localName)); - FREE_AND_NULL(str) - - if (bind == NULL) - return; - do { - fprintf(output, "IDC: BINDING '%s' (%d)\n", - xmlSchemaGetComponentQName(&str, - bind->definition), bind->nbNodes); - FREE_AND_NULL(str) - for (i = 0; i < bind->nbNodes; i++) { - tab = bind->nodeTable[i]; - fprintf(output, " ( "); - for (j = 0; j < bind->definition->nbFields; j++) { - key = tab->keys[j]; - if ((key != NULL) && (key->val != NULL)) { - res = xmlSchemaGetCanonValue(key->val, &value); - if (res >= 0) - fprintf(output, "'%s' ", value); - else - fprintf(output, "CANON-VALUE-FAILED "); - if (res == 0) - FREE_AND_NULL(value) - } else if (key != NULL) - fprintf(output, "(no val), "); - else - fprintf(output, "(key missing), "); - } - fprintf(output, ")\n"); - } - if (bind->dupls && bind->dupls->nbItems) { - fprintf(output, "IDC: dupls (%d):\n", bind->dupls->nbItems); - for (i = 0; i < bind->dupls->nbItems; i++) { - tab = bind->dupls->items[i]; - fprintf(output, " ( "); - for (j = 0; j < bind->definition->nbFields; j++) { - key = tab->keys[j]; - if ((key != NULL) && (key->val != NULL)) { - res = xmlSchemaGetCanonValue(key->val, &value); - if (res >= 0) - fprintf(output, "'%s' ", value); - else - fprintf(output, "CANON-VALUE-FAILED "); - if (res == 0) - FREE_AND_NULL(value) - } else if (key != NULL) - fprintf(output, "(no val), "); - else - fprintf(output, "(key missing), "); - } - fprintf(output, ")\n"); - } - } - bind = bind->next; - } while (bind != NULL); -} -#endif /* DEBUG_IDC */ -#endif /* LIBXML_OUTPUT_ENABLED */ - -/************************************************************************ - * * - * Utilities * - * * - ************************************************************************/ - -/** - * xmlSchemaGetPropNode: - * @node: the element node - * @name: the name of the attribute - * - * Seeks an attribute with a name of @name in - * no namespace. - * - * Returns the attribute or NULL if not present. - */ -static xmlAttrPtr -xmlSchemaGetPropNode(xmlNodePtr node, const char *name) -{ - xmlAttrPtr prop; - - if ((node == NULL) || (name == NULL)) - return(NULL); - prop = node->properties; - while (prop != NULL) { - if ((prop->ns == NULL) && xmlStrEqual(prop->name, BAD_CAST name)) - return(prop); - prop = prop->next; - } - return (NULL); -} - -/** - * xmlSchemaGetPropNodeNs: - * @node: the element node - * @uri: the uri - * @name: the name of the attribute - * - * Seeks an attribute with a local name of @name and - * a namespace URI of @uri. - * - * Returns the attribute or NULL if not present. - */ -static xmlAttrPtr -xmlSchemaGetPropNodeNs(xmlNodePtr node, const char *uri, const char *name) -{ - xmlAttrPtr prop; - - if ((node == NULL) || (name == NULL)) - return(NULL); - prop = node->properties; - while (prop != NULL) { - if ((prop->ns != NULL) && - xmlStrEqual(prop->name, BAD_CAST name) && - xmlStrEqual(prop->ns->href, BAD_CAST uri)) - return(prop); - prop = prop->next; - } - return (NULL); -} - -static const xmlChar * -xmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node) -{ - xmlChar *val; - const xmlChar *ret; - - val = xmlNodeGetContent(node); - if (val == NULL) - val = xmlStrdup((xmlChar *)""); - ret = xmlDictLookup(ctxt->dict, val, -1); - xmlFree(val); - return(ret); -} - -static const xmlChar * -xmlSchemaGetNodeContentNoDict(xmlNodePtr node) -{ - return((const xmlChar*) xmlNodeGetContent(node)); -} - -/** - * xmlSchemaGetProp: - * @ctxt: the parser context - * @node: the node - * @name: the property name - * - * Read a attribute value and internalize the string - * - * Returns the string or NULL if not present. - */ -static const xmlChar * -xmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, - const char *name) -{ - xmlChar *val; - const xmlChar *ret; - - val = xmlGetNoNsProp(node, BAD_CAST name); - if (val == NULL) - return(NULL); - ret = xmlDictLookup(ctxt->dict, val, -1); - xmlFree(val); - return(ret); -} - -/************************************************************************ - * * - * Parsing functions * - * * - ************************************************************************/ - -#define WXS_FIND_GLOBAL_ITEM(slot) \ - if (xmlStrEqual(nsName, schema->targetNamespace)) { \ - ret = xmlHashLookup(schema->slot, name); \ - if (ret != NULL) goto exit; \ - } \ - if (xmlHashSize(schema->schemasImports) > 1) { \ - xmlSchemaImportPtr import; \ - if (nsName == NULL) \ - import = xmlHashLookup(schema->schemasImports, \ - XML_SCHEMAS_NO_NAMESPACE); \ - else \ - import = xmlHashLookup(schema->schemasImports, nsName); \ - if (import == NULL) \ - goto exit; \ - ret = xmlHashLookup(import->schema->slot, name); \ - } - -/** - * xmlSchemaGetElem: - * @schema: the schema context - * @name: the element name - * @ns: the element namespace - * - * Lookup a global element declaration in the schema. - * - * Returns the element declaration or NULL if not found. - */ -static xmlSchemaElementPtr -xmlSchemaGetElem(xmlSchemaPtr schema, const xmlChar * name, - const xmlChar * nsName) -{ - xmlSchemaElementPtr ret = NULL; - - if ((name == NULL) || (schema == NULL)) - return(NULL); - if (schema != NULL) { - WXS_FIND_GLOBAL_ITEM(elemDecl) - } -exit: -#ifdef DEBUG - if (ret == NULL) { - if (nsName == NULL) - fprintf(stderr, "Unable to lookup element decl. %s", name); - else - fprintf(stderr, "Unable to lookup element decl. %s:%s", name, - nsName); - } -#endif - return (ret); -} - -/** - * xmlSchemaGetType: - * @schema: the main schema - * @name: the type's name - * nsName: the type's namespace - * - * Lookup a type in the schemas or the predefined types - * - * Returns the group definition or NULL if not found. - */ -static xmlSchemaTypePtr -xmlSchemaGetType(xmlSchemaPtr schema, const xmlChar * name, - const xmlChar * nsName) -{ - xmlSchemaTypePtr ret = NULL; - - if (name == NULL) - return (NULL); - /* First try the built-in types. */ - if ((nsName != NULL) && xmlStrEqual(nsName, xmlSchemaNs)) { - ret = xmlSchemaGetPredefinedType(name, nsName); - if (ret != NULL) - goto exit; - /* - * Note that we try the parsed schemas as well here - * since one might have parsed the S4S, which contain more - * than the built-in types. - * TODO: Can we optimize this? - */ - } - if (schema != NULL) { - WXS_FIND_GLOBAL_ITEM(typeDecl) - } -exit: - -#ifdef DEBUG - if (ret == NULL) { - if (nsName == NULL) - fprintf(stderr, "Unable to lookup type %s", name); - else - fprintf(stderr, "Unable to lookup type %s:%s", name, - nsName); - } -#endif - return (ret); -} - -/** - * xmlSchemaGetAttributeDecl: - * @schema: the context of the schema - * @name: the name of the attribute - * @ns: the target namespace of the attribute - * - * Lookup a an attribute in the schema or imported schemas - * - * Returns the attribute declaration or NULL if not found. - */ -static xmlSchemaAttributePtr -xmlSchemaGetAttributeDecl(xmlSchemaPtr schema, const xmlChar * name, - const xmlChar * nsName) -{ - xmlSchemaAttributePtr ret = NULL; - - if ((name == NULL) || (schema == NULL)) - return (NULL); - if (schema != NULL) { - WXS_FIND_GLOBAL_ITEM(attrDecl) - } -exit: -#ifdef DEBUG - if (ret == NULL) { - if (nsName == NULL) - fprintf(stderr, "Unable to lookup attribute %s", name); - else - fprintf(stderr, "Unable to lookup attribute %s:%s", name, - nsName); - } -#endif - return (ret); -} - -/** - * xmlSchemaGetAttributeGroup: - * @schema: the context of the schema - * @name: the name of the attribute group - * @ns: the target namespace of the attribute group - * - * Lookup a an attribute group in the schema or imported schemas - * - * Returns the attribute group definition or NULL if not found. - */ -static xmlSchemaAttributeGroupPtr -xmlSchemaGetAttributeGroup(xmlSchemaPtr schema, const xmlChar * name, - const xmlChar * nsName) -{ - xmlSchemaAttributeGroupPtr ret = NULL; - - if ((name == NULL) || (schema == NULL)) - return (NULL); - if (schema != NULL) { - WXS_FIND_GLOBAL_ITEM(attrgrpDecl) - } -exit: - /* TODO: - if ((ret != NULL) && (ret->redef != NULL)) { - * Return the last redefinition. * - ret = ret->redef; - } - */ -#ifdef DEBUG - if (ret == NULL) { - if (nsName == NULL) - fprintf(stderr, "Unable to lookup attribute group %s", name); - else - fprintf(stderr, "Unable to lookup attribute group %s:%s", name, - nsName); - } -#endif - return (ret); -} - -/** - * xmlSchemaGetGroup: - * @schema: the context of the schema - * @name: the name of the group - * @ns: the target namespace of the group - * - * Lookup a group in the schema or imported schemas - * - * Returns the group definition or NULL if not found. - */ -static xmlSchemaModelGroupDefPtr -xmlSchemaGetGroup(xmlSchemaPtr schema, const xmlChar * name, - const xmlChar * nsName) -{ - xmlSchemaModelGroupDefPtr ret = NULL; - - if ((name == NULL) || (schema == NULL)) - return (NULL); - if (schema != NULL) { - WXS_FIND_GLOBAL_ITEM(groupDecl) - } -exit: - -#ifdef DEBUG - if (ret == NULL) { - if (nsName == NULL) - fprintf(stderr, "Unable to lookup group %s", name); - else - fprintf(stderr, "Unable to lookup group %s:%s", name, - nsName); - } -#endif - return (ret); -} - -static xmlSchemaNotationPtr -xmlSchemaGetNotation(xmlSchemaPtr schema, - const xmlChar *name, - const xmlChar *nsName) -{ - xmlSchemaNotationPtr ret = NULL; - - if ((name == NULL) || (schema == NULL)) - return (NULL); - if (schema != NULL) { - WXS_FIND_GLOBAL_ITEM(notaDecl) - } -exit: - return (ret); -} - -static xmlSchemaIDCPtr -xmlSchemaGetIDC(xmlSchemaPtr schema, - const xmlChar *name, - const xmlChar *nsName) -{ - xmlSchemaIDCPtr ret = NULL; - - if ((name == NULL) || (schema == NULL)) - return (NULL); - if (schema != NULL) { - WXS_FIND_GLOBAL_ITEM(idcDef) - } -exit: - return (ret); -} - -/** - * xmlSchemaGetNamedComponent: - * @schema: the schema - * @name: the name of the group - * @ns: the target namespace of the group - * - * Lookup a group in the schema or imported schemas - * - * Returns the group definition or NULL if not found. - */ -static xmlSchemaBasicItemPtr -xmlSchemaGetNamedComponent(xmlSchemaPtr schema, - xmlSchemaTypeType itemType, - const xmlChar *name, - const xmlChar *targetNs) -{ - switch (itemType) { - case XML_SCHEMA_TYPE_GROUP: - return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(schema, - name, targetNs)); - case XML_SCHEMA_TYPE_ELEMENT: - return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(schema, - name, targetNs)); - default: - TODO - return (NULL); - } -} - -/************************************************************************ - * * - * Parsing functions * - * * - ************************************************************************/ - -#define IS_BLANK_NODE(n) \ - (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1))) - -/** - * xmlSchemaIsBlank: - * @str: a string - * @len: the length of the string or -1 - * - * Check if a string is ignorable - * - * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise - */ -static int -xmlSchemaIsBlank(xmlChar * str, int len) -{ - if (str == NULL) - return (1); - if (len < 0) { - while (*str != 0) { - if (!(IS_BLANK_CH(*str))) - return (0); - str++; - } - } else while ((*str != 0) && (len != 0)) { - if (!(IS_BLANK_CH(*str))) - return (0); - str++; - len--; - } - - return (1); -} - -#define WXS_COMP_NAME(c, t) ((t) (c))->name -#define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace -/* -* xmlSchemaFindRedefCompInGraph: -* ATTENTION TODO: This uses pointer comp. for strings. -*/ -static xmlSchemaBasicItemPtr -xmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket, - xmlSchemaTypeType type, - const xmlChar *name, - const xmlChar *nsName) -{ - xmlSchemaBasicItemPtr ret; - int i; - - if ((bucket == NULL) || (name == NULL)) - return(NULL); - if ((bucket->globals == NULL) || - (bucket->globals->nbItems == 0)) - goto subschemas; - /* - * Search in global components. - */ - for (i = 0; i < bucket->globals->nbItems; i++) { - ret = bucket->globals->items[i]; - if (ret->type == type) { - switch (type) { - case XML_SCHEMA_TYPE_COMPLEX: - case XML_SCHEMA_TYPE_SIMPLE: - if ((WXS_COMP_NAME(ret, xmlSchemaTypePtr) == name) && - (WXS_COMP_TNS(ret, xmlSchemaTypePtr) == - nsName)) - { - return(ret); - } - break; - case XML_SCHEMA_TYPE_GROUP: - if ((WXS_COMP_NAME(ret, - xmlSchemaModelGroupDefPtr) == name) && - (WXS_COMP_TNS(ret, - xmlSchemaModelGroupDefPtr) == nsName)) - { - return(ret); - } - break; - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - if ((WXS_COMP_NAME(ret, - xmlSchemaAttributeGroupPtr) == name) && - (WXS_COMP_TNS(ret, - xmlSchemaAttributeGroupPtr) == nsName)) - { - return(ret); - } - break; - default: - /* Should not be hit. */ - return(NULL); - } - } - } -subschemas: - /* - * Process imported/included schemas. - */ - if (bucket->relations != NULL) { - xmlSchemaSchemaRelationPtr rel = bucket->relations; - - /* - * TODO: Marking the bucket will not avoid multiple searches - * in the same schema, but avoids at least circularity. - */ - bucket->flags |= XML_SCHEMA_BUCKET_MARKED; - do { - if ((rel->bucket != NULL) && - ((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) { - ret = xmlSchemaFindRedefCompInGraph(rel->bucket, - type, name, nsName); - if (ret != NULL) - return(ret); - } - rel = rel->next; - } while (rel != NULL); - bucket->flags ^= XML_SCHEMA_BUCKET_MARKED; - } - return(NULL); -} - -/** - * xmlSchemaAddNotation: - * @ctxt: a schema parser context - * @schema: the schema being built - * @name: the item name - * - * Add an XML schema annotation declaration - * *WARNING* this interface is highly subject to change - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaNotationPtr -xmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - const xmlChar *name, const xmlChar *nsName, - xmlNodePtr node ATTRIBUTE_UNUSED) -{ - xmlSchemaNotationPtr ret = NULL; - - if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) - return (NULL); - - ret = (xmlSchemaNotationPtr) xmlMalloc(sizeof(xmlSchemaNotation)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "add annotation", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaNotation)); - ret->type = XML_SCHEMA_TYPE_NOTATION; - ret->name = name; - ret->targetNamespace = nsName; - /* TODO: do we need the node to be set? - * ret->node = node;*/ - WXS_ADD_GLOBAL(ctxt, ret); - return (ret); -} - -/** - * xmlSchemaAddAttribute: - * @ctxt: a schema parser context - * @schema: the schema being built - * @name: the item name - * @namespace: the namespace - * - * Add an XML schema Attrribute declaration - * *WARNING* this interface is highly subject to change - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaAttributePtr -xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - const xmlChar * name, const xmlChar * nsName, - xmlNodePtr node, int topLevel) -{ - xmlSchemaAttributePtr ret = NULL; - - if ((ctxt == NULL) || (schema == NULL)) - return (NULL); - - ret = (xmlSchemaAttributePtr) xmlMalloc(sizeof(xmlSchemaAttribute)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating attribute", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaAttribute)); - ret->type = XML_SCHEMA_TYPE_ATTRIBUTE; - ret->node = node; - ret->name = name; - ret->targetNamespace = nsName; - - if (topLevel) - WXS_ADD_GLOBAL(ctxt, ret); - else - WXS_ADD_LOCAL(ctxt, ret); - WXS_ADD_PENDING(ctxt, ret); - return (ret); -} - -/** - * xmlSchemaAddAttributeUse: - * @ctxt: a schema parser context - * @schema: the schema being built - * @name: the item name - * @namespace: the namespace - * - * Add an XML schema Attrribute declaration - * *WARNING* this interface is highly subject to change - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaAttributeUsePtr -xmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt, - xmlNodePtr node) -{ - xmlSchemaAttributeUsePtr ret = NULL; - - if (pctxt == NULL) - return (NULL); - - ret = (xmlSchemaAttributeUsePtr) xmlMalloc(sizeof(xmlSchemaAttributeUse)); - if (ret == NULL) { - xmlSchemaPErrMemory(pctxt, "allocating attribute", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaAttributeUse)); - ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE; - ret->node = node; - - WXS_ADD_LOCAL(pctxt, ret); - return (ret); -} - -/* -* xmlSchemaAddRedef: -* -* Adds a redefinition information. This is used at a later stage to: -* resolve references to the redefined components and to check constraints. -*/ -static xmlSchemaRedefPtr -xmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaBucketPtr targetBucket, - void *item, - const xmlChar *refName, - const xmlChar *refTargetNs) -{ - xmlSchemaRedefPtr ret; - - ret = (xmlSchemaRedefPtr) - xmlMalloc(sizeof(xmlSchemaRedef)); - if (ret == NULL) { - xmlSchemaPErrMemory(pctxt, - "allocating redefinition info", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaRedef)); - ret->item = item; - ret->targetBucket = targetBucket; - ret->refName = refName; - ret->refTargetNs = refTargetNs; - if (WXS_CONSTRUCTOR(pctxt)->redefs == NULL) - WXS_CONSTRUCTOR(pctxt)->redefs = ret; - else - WXS_CONSTRUCTOR(pctxt)->lastRedef->next = ret; - WXS_CONSTRUCTOR(pctxt)->lastRedef = ret; - - return (ret); -} - -/** - * xmlSchemaAddAttributeGroupDefinition: - * @ctxt: a schema parser context - * @schema: the schema being built - * @name: the item name - * @nsName: the target namespace - * @node: the corresponding node - * - * Add an XML schema Attrribute Group definition. - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaAttributeGroupPtr -xmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema ATTRIBUTE_UNUSED, - const xmlChar *name, - const xmlChar *nsName, - xmlNodePtr node) -{ - xmlSchemaAttributeGroupPtr ret = NULL; - - if ((pctxt == NULL) || (name == NULL)) - return (NULL); - - ret = (xmlSchemaAttributeGroupPtr) - xmlMalloc(sizeof(xmlSchemaAttributeGroup)); - if (ret == NULL) { - xmlSchemaPErrMemory(pctxt, "allocating attribute group", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaAttributeGroup)); - ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP; - ret->name = name; - ret->targetNamespace = nsName; - ret->node = node; - - /* TODO: Remove the flag. */ - ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL; - if (pctxt->isRedefine) { - pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined, - ret, name, nsName); - if (pctxt->redef == NULL) { - xmlFree(ret); - return(NULL); - } - pctxt->redefCounter = 0; - } - WXS_ADD_GLOBAL(pctxt, ret); - WXS_ADD_PENDING(pctxt, ret); - return (ret); -} - -/** - * xmlSchemaAddElement: - * @ctxt: a schema parser context - * @schema: the schema being built - * @name: the type name - * @namespace: the type namespace - * - * Add an XML schema Element declaration - * *WARNING* this interface is highly subject to change - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaElementPtr -xmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt, - const xmlChar * name, const xmlChar * nsName, - xmlNodePtr node, int topLevel) -{ - xmlSchemaElementPtr ret = NULL; - - if ((ctxt == NULL) || (name == NULL)) - return (NULL); - - ret = (xmlSchemaElementPtr) xmlMalloc(sizeof(xmlSchemaElement)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating element", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaElement)); - ret->type = XML_SCHEMA_TYPE_ELEMENT; - ret->name = name; - ret->targetNamespace = nsName; - ret->node = node; - - if (topLevel) - WXS_ADD_GLOBAL(ctxt, ret); - else - WXS_ADD_LOCAL(ctxt, ret); - WXS_ADD_PENDING(ctxt, ret); - return (ret); -} - -/** - * xmlSchemaAddType: - * @ctxt: a schema parser context - * @schema: the schema being built - * @name: the item name - * @namespace: the namespace - * - * Add an XML schema item - * *WARNING* this interface is highly subject to change - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaTypePtr -xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlSchemaTypeType type, - const xmlChar * name, const xmlChar * nsName, - xmlNodePtr node, int topLevel) -{ - xmlSchemaTypePtr ret = NULL; - - if ((ctxt == NULL) || (schema == NULL)) - return (NULL); - - ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating type", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaType)); - ret->type = type; - ret->name = name; - ret->targetNamespace = nsName; - ret->node = node; - if (topLevel) { - if (ctxt->isRedefine) { - ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined, - ret, name, nsName); - if (ctxt->redef == NULL) { - xmlFree(ret); - return(NULL); - } - ctxt->redefCounter = 0; - } - WXS_ADD_GLOBAL(ctxt, ret); - } else - WXS_ADD_LOCAL(ctxt, ret); - WXS_ADD_PENDING(ctxt, ret); - return (ret); -} - -static xmlSchemaQNameRefPtr -xmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypeType refType, - const xmlChar *refName, - const xmlChar *refNs) -{ - xmlSchemaQNameRefPtr ret; - - ret = (xmlSchemaQNameRefPtr) - xmlMalloc(sizeof(xmlSchemaQNameRef)); - if (ret == NULL) { - xmlSchemaPErrMemory(pctxt, - "allocating QName reference item", NULL); - return (NULL); - } - ret->node = NULL; - ret->type = XML_SCHEMA_EXTRA_QNAMEREF; - ret->name = refName; - ret->targetNamespace = refNs; - ret->item = NULL; - ret->itemType = refType; - /* - * Store the reference item in the schema. - */ - WXS_ADD_LOCAL(pctxt, ret); - return (ret); -} - -static xmlSchemaAttributeUseProhibPtr -xmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt) -{ - xmlSchemaAttributeUseProhibPtr ret; - - ret = (xmlSchemaAttributeUseProhibPtr) - xmlMalloc(sizeof(xmlSchemaAttributeUseProhib)); - if (ret == NULL) { - xmlSchemaPErrMemory(pctxt, - "allocating attribute use prohibition", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaAttributeUseProhib)); - ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB; - WXS_ADD_LOCAL(pctxt, ret); - return (ret); -} - - -/** - * xmlSchemaAddModelGroup: - * @ctxt: a schema parser context - * @schema: the schema being built - * @type: the "compositor" type of the model group - * @node: the node in the schema doc - * - * Adds a schema model group - * *WARNING* this interface is highly subject to change - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaModelGroupPtr -xmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlSchemaTypeType type, - xmlNodePtr node) -{ - xmlSchemaModelGroupPtr ret = NULL; - - if ((ctxt == NULL) || (schema == NULL)) - return (NULL); - - ret = (xmlSchemaModelGroupPtr) - xmlMalloc(sizeof(xmlSchemaModelGroup)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating model group component", - NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaModelGroup)); - ret->type = type; - ret->node = node; - WXS_ADD_LOCAL(ctxt, ret); - if ((type == XML_SCHEMA_TYPE_SEQUENCE) || - (type == XML_SCHEMA_TYPE_CHOICE)) - WXS_ADD_PENDING(ctxt, ret); - return (ret); -} - - -/** - * xmlSchemaAddParticle: - * @ctxt: a schema parser context - * @schema: the schema being built - * @node: the corresponding node in the schema doc - * @min: the minOccurs - * @max: the maxOccurs - * - * Adds an XML schema particle component. - * *WARNING* this interface is highly subject to change - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaParticlePtr -xmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt, - xmlNodePtr node, int min, int max) -{ - xmlSchemaParticlePtr ret = NULL; - if (ctxt == NULL) - return (NULL); - -#ifdef DEBUG - fprintf(stderr, "Adding particle component\n"); -#endif - ret = (xmlSchemaParticlePtr) - xmlMalloc(sizeof(xmlSchemaParticle)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating particle component", - NULL); - return (NULL); - } - ret->type = XML_SCHEMA_TYPE_PARTICLE; - ret->annot = NULL; - ret->node = node; - ret->minOccurs = min; - ret->maxOccurs = max; - ret->next = NULL; - ret->children = NULL; - - WXS_ADD_LOCAL(ctxt, ret); - /* - * Note that addition to pending components will be done locally - * to the specific parsing function, since the most particles - * need not to be fixed up (i.e. the reference to be resolved). - * REMOVED: WXS_ADD_PENDING(ctxt, ret); - */ - return (ret); -} - -/** - * xmlSchemaAddModelGroupDefinition: - * @ctxt: a schema validation context - * @schema: the schema being built - * @name: the group name - * - * Add an XML schema Group definition - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaModelGroupDefPtr -xmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - const xmlChar *name, - const xmlChar *nsName, - xmlNodePtr node) -{ - xmlSchemaModelGroupDefPtr ret = NULL; - - if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) - return (NULL); - - ret = (xmlSchemaModelGroupDefPtr) - xmlMalloc(sizeof(xmlSchemaModelGroupDef)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "adding group", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaModelGroupDef)); - ret->name = name; - ret->type = XML_SCHEMA_TYPE_GROUP; - ret->node = node; - ret->targetNamespace = nsName; - - if (ctxt->isRedefine) { - ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined, - ret, name, nsName); - if (ctxt->redef == NULL) { - xmlFree(ret); - return(NULL); - } - ctxt->redefCounter = 0; - } - WXS_ADD_GLOBAL(ctxt, ret); - WXS_ADD_PENDING(ctxt, ret); - return (ret); -} - -/** - * xmlSchemaNewWildcardNs: - * @ctxt: a schema validation context - * - * Creates a new wildcard namespace constraint. - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaWildcardNsPtr -xmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt) -{ - xmlSchemaWildcardNsPtr ret; - - ret = (xmlSchemaWildcardNsPtr) - xmlMalloc(sizeof(xmlSchemaWildcardNs)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "creating wildcard namespace constraint", NULL); - return (NULL); - } - ret->value = NULL; - ret->next = NULL; - return (ret); -} - -static xmlSchemaIDCPtr -xmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - const xmlChar *name, const xmlChar *nsName, - int category, xmlNodePtr node) -{ - xmlSchemaIDCPtr ret = NULL; - - if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) - return (NULL); - - ret = (xmlSchemaIDCPtr) xmlMalloc(sizeof(xmlSchemaIDC)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, - "allocating an identity-constraint definition", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaIDC)); - /* The target namespace of the parent element declaration. */ - ret->targetNamespace = nsName; - ret->name = name; - ret->type = category; - ret->node = node; - - WXS_ADD_GLOBAL(ctxt, ret); - /* - * Only keyrefs need to be fixup up. - */ - if (category == XML_SCHEMA_TYPE_IDC_KEYREF) - WXS_ADD_PENDING(ctxt, ret); - return (ret); -} - -/** - * xmlSchemaAddWildcard: - * @ctxt: a schema validation context - * @schema: a schema - * - * Adds a wildcard. - * It corresponds to a xsd:anyAttribute and xsd:any. - * - * Returns the new struture or NULL in case of error - */ -static xmlSchemaWildcardPtr -xmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlSchemaTypeType type, xmlNodePtr node) -{ - xmlSchemaWildcardPtr ret = NULL; - - if ((ctxt == NULL) || (schema == NULL)) - return (NULL); - - ret = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); - if (ret == NULL) { - xmlSchemaPErrMemory(ctxt, "adding wildcard", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaWildcard)); - ret->type = type; - ret->node = node; - WXS_ADD_LOCAL(ctxt, ret); - return (ret); -} - -static void -xmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr group) -{ - if (group == NULL) - return; - if (group->members != NULL) - xmlSchemaItemListFree(group->members); - xmlFree(group); -} - -static xmlSchemaSubstGroupPtr -xmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaElementPtr head) -{ - xmlSchemaSubstGroupPtr ret; - - /* Init subst group hash. */ - if (WXS_SUBST_GROUPS(pctxt) == NULL) { - WXS_SUBST_GROUPS(pctxt) = xmlHashCreateDict(10, pctxt->dict); - if (WXS_SUBST_GROUPS(pctxt) == NULL) - return(NULL); - } - /* Create a new substitution group. */ - ret = (xmlSchemaSubstGroupPtr) xmlMalloc(sizeof(xmlSchemaSubstGroup)); - if (ret == NULL) { - xmlSchemaPErrMemory(NULL, - "allocating a substitution group container", NULL); - return(NULL); - } - memset(ret, 0, sizeof(xmlSchemaSubstGroup)); - ret->head = head; - /* Create list of members. */ - ret->members = xmlSchemaItemListCreate(); - if (ret->members == NULL) { - xmlSchemaSubstGroupFree(ret); - return(NULL); - } - /* Add subst group to hash. */ - if (xmlHashAddEntry2(WXS_SUBST_GROUPS(pctxt), - head->name, head->targetNamespace, ret) != 0) { - PERROR_INT("xmlSchemaSubstGroupAdd", - "failed to add a new substitution container"); - xmlSchemaSubstGroupFree(ret); - return(NULL); - } - return(ret); -} - -static xmlSchemaSubstGroupPtr -xmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaElementPtr head) -{ - if (WXS_SUBST_GROUPS(pctxt) == NULL) - return(NULL); - return(xmlHashLookup2(WXS_SUBST_GROUPS(pctxt), - head->name, head->targetNamespace)); - -} - -/** - * xmlSchemaAddElementSubstitutionMember: - * @pctxt: a schema parser context - * @head: the head of the substitution group - * @member: the new member of the substitution group - * - * Allocate a new annotation structure. - * - * Returns the newly allocated structure or NULL in case or error - */ -static int -xmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaElementPtr head, - xmlSchemaElementPtr member) -{ - xmlSchemaSubstGroupPtr substGroup = NULL; - - if ((pctxt == NULL) || (head == NULL) || (member == NULL)) - return (-1); - - substGroup = xmlSchemaSubstGroupGet(pctxt, head); - if (substGroup == NULL) - substGroup = xmlSchemaSubstGroupAdd(pctxt, head); - if (substGroup == NULL) - return(-1); - if (xmlSchemaItemListAdd(substGroup->members, member) == -1) - return(-1); - return(0); -} - -/************************************************************************ - * * - * Utilities for parsing * - * * - ************************************************************************/ - -/** - * xmlSchemaPValAttrNodeQNameValue: - * @ctxt: a schema parser context - * @schema: the schema context - * @ownerDes: the designation of the parent element - * @ownerItem: the parent as a schema object - * @value: the QName value - * @local: the resulting local part if found, the attribute value otherwise - * @uri: the resulting namespace URI if found - * - * Extracts the local name and the URI of a QName value and validates it. - * This one is intended to be used on attribute values that - * should resolve to schema components. - * - * Returns 0, in case the QName is valid, a positive error code - * if not valid and -1 if an internal error occurs. - */ -static int -xmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlSchemaBasicItemPtr ownerItem, - xmlAttrPtr attr, - const xmlChar *value, - const xmlChar **uri, - const xmlChar **local) -{ - const xmlChar *pref; - xmlNsPtr ns; - int len, ret; - - *uri = NULL; - *local = NULL; - ret = xmlValidateQName(value, 1); - if (ret > 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - ownerItem, (xmlNodePtr) attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), - NULL, value, NULL, NULL, NULL); - *local = value; - return (ctxt->err); - } else if (ret < 0) - return (-1); - - if (!strchr((char *) value, ':')) { - ns = xmlSearchNs(attr->doc, attr->parent, NULL); - if (ns) - *uri = xmlDictLookup(ctxt->dict, ns->href, -1); - else if (schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) { - /* TODO: move XML_SCHEMAS_INCLUDING_CONVERT_NS to the - * parser context. */ - /* - * This one takes care of included schemas with no - * target namespace. - */ - *uri = ctxt->targetNamespace; - } - *local = xmlDictLookup(ctxt->dict, value, -1); - return (0); - } - /* - * At this point xmlSplitQName3 has to return a local name. - */ - *local = xmlSplitQName3(value, &len); - *local = xmlDictLookup(ctxt->dict, *local, -1); - pref = xmlDictLookup(ctxt->dict, value, len); - ns = xmlSearchNs(attr->doc, attr->parent, pref); - if (ns == NULL) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - ownerItem, (xmlNodePtr) attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), NULL, value, - "The value '%s' of simple type 'xs:QName' has no " - "corresponding namespace declaration in scope", value, NULL); - return (ctxt->err); - } else { - *uri = xmlDictLookup(ctxt->dict, ns->href, -1); - } - return (0); -} - -/** - * xmlSchemaPValAttrNodeQName: - * @ctxt: a schema parser context - * @schema: the schema context - * @ownerDes: the designation of the owner element - * @ownerItem: the owner as a schema object - * @attr: the attribute node - * @local: the resulting local part if found, the attribute value otherwise - * @uri: the resulting namespace URI if found - * - * Extracts and validates the QName of an attribute value. - * This one is intended to be used on attribute values that - * should resolve to schema components. - * - * Returns 0, in case the QName is valid, a positive error code - * if not valid and -1 if an internal error occurs. - */ -static int -xmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlSchemaBasicItemPtr ownerItem, - xmlAttrPtr attr, - const xmlChar **uri, - const xmlChar **local) -{ - const xmlChar *value; - - value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - return (xmlSchemaPValAttrNodeQNameValue(ctxt, schema, - ownerItem, attr, value, uri, local)); -} - -/** - * xmlSchemaPValAttrQName: - * @ctxt: a schema parser context - * @schema: the schema context - * @ownerDes: the designation of the parent element - * @ownerItem: the owner as a schema object - * @ownerElem: the parent node of the attribute - * @name: the name of the attribute - * @local: the resulting local part if found, the attribute value otherwise - * @uri: the resulting namespace URI if found - * - * Extracts and validates the QName of an attribute value. - * - * Returns 0, in case the QName is valid, a positive error code - * if not valid and -1 if an internal error occurs. - */ -static int -xmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlSchemaBasicItemPtr ownerItem, - xmlNodePtr ownerElem, - const char *name, - const xmlChar **uri, - const xmlChar **local) -{ - xmlAttrPtr attr; - - attr = xmlSchemaGetPropNode(ownerElem, name); - if (attr == NULL) { - *local = NULL; - *uri = NULL; - return (0); - } - return (xmlSchemaPValAttrNodeQName(ctxt, schema, - ownerItem, attr, uri, local)); -} - -/** - * xmlSchemaPValAttrID: - * @ctxt: a schema parser context - * @schema: the schema context - * @ownerDes: the designation of the parent element - * @ownerItem: the owner as a schema object - * @ownerElem: the parent node of the attribute - * @name: the name of the attribute - * - * Extracts and validates the ID of an attribute value. - * - * Returns 0, in case the ID is valid, a positive error code - * if not valid and -1 if an internal error occurs. - */ -static int -xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr) -{ - int ret; - const xmlChar *value; - - if (attr == NULL) - return(0); - value = xmlSchemaGetNodeContentNoDict((xmlNodePtr) attr); - ret = xmlValidateNCName(value, 1); - if (ret == 0) { - /* - * NOTE: the IDness might have already be declared in the DTD - */ - if (attr->atype != XML_ATTRIBUTE_ID) { - xmlIDPtr res; - xmlChar *strip; - - /* - * TODO: Use xmlSchemaStrip here; it's not exported at this - * moment. - */ - strip = xmlSchemaCollapseString(value); - if (strip != NULL) { - xmlFree((xmlChar *) value); - value = strip; - } - res = xmlAddID(NULL, attr->doc, value, attr); - if (res == NULL) { - ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_ID), - NULL, NULL, "Duplicate value '%s' of simple " - "type 'xs:ID'", value, NULL); - } else - attr->atype = XML_ATTRIBUTE_ID; - } - } else if (ret > 0) { - ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_ID), - NULL, NULL, "The value '%s' of simple type 'xs:ID' is " - "not a valid 'xs:NCName'", - value, NULL); - } - if (value != NULL) - xmlFree((xmlChar *)value); - - return (ret); -} - -static int -xmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt, - xmlNodePtr ownerElem, - const xmlChar *name) -{ - xmlAttrPtr attr; - - attr = xmlSchemaGetPropNode(ownerElem, (const char *) name); - if (attr == NULL) - return(0); - return(xmlSchemaPValAttrNodeID(ctxt, attr)); - -} - -/** - * xmlGetMaxOccurs: - * @ctxt: a schema validation context - * @node: a subtree containing XML Schema informations - * - * Get the maxOccurs property - * - * Returns the default if not found, or the value - */ -static int -xmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, - int min, int max, int def, const char *expected) -{ - const xmlChar *val, *cur; - int ret = 0; - xmlAttrPtr attr; - - attr = xmlSchemaGetPropNode(node, "maxOccurs"); - if (attr == NULL) - return (def); - val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - - if (xmlStrEqual(val, (const xmlChar *) "unbounded")) { - if (max != UNBOUNDED) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - /* XML_SCHEMAP_INVALID_MINOCCURS, */ - NULL, (xmlNodePtr) attr, NULL, expected, - val, NULL, NULL, NULL); - return (def); - } else - return (UNBOUNDED); /* encoding it with -1 might be another option */ - } - - cur = val; - while (IS_BLANK_CH(*cur)) - cur++; - if (*cur == 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - /* XML_SCHEMAP_INVALID_MINOCCURS, */ - NULL, (xmlNodePtr) attr, NULL, expected, - val, NULL, NULL, NULL); - return (def); - } - while ((*cur >= '0') && (*cur <= '9')) { - ret = ret * 10 + (*cur - '0'); - cur++; - } - while (IS_BLANK_CH(*cur)) - cur++; - /* - * TODO: Restrict the maximal value to Integer. - */ - if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - /* XML_SCHEMAP_INVALID_MINOCCURS, */ - NULL, (xmlNodePtr) attr, NULL, expected, - val, NULL, NULL, NULL); - return (def); - } - return (ret); -} - -/** - * xmlGetMinOccurs: - * @ctxt: a schema validation context - * @node: a subtree containing XML Schema informations - * - * Get the minOccurs property - * - * Returns the default if not found, or the value - */ -static int -xmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, - int min, int max, int def, const char *expected) -{ - const xmlChar *val, *cur; - int ret = 0; - xmlAttrPtr attr; - - attr = xmlSchemaGetPropNode(node, "minOccurs"); - if (attr == NULL) - return (def); - val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - cur = val; - while (IS_BLANK_CH(*cur)) - cur++; - if (*cur == 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - /* XML_SCHEMAP_INVALID_MINOCCURS, */ - NULL, (xmlNodePtr) attr, NULL, expected, - val, NULL, NULL, NULL); - return (def); - } - while ((*cur >= '0') && (*cur <= '9')) { - ret = ret * 10 + (*cur - '0'); - cur++; - } - while (IS_BLANK_CH(*cur)) - cur++; - /* - * TODO: Restrict the maximal value to Integer. - */ - if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - /* XML_SCHEMAP_INVALID_MINOCCURS, */ - NULL, (xmlNodePtr) attr, NULL, expected, - val, NULL, NULL, NULL); - return (def); - } - return (ret); -} - -/** - * xmlSchemaPGetBoolNodeValue: - * @ctxt: a schema validation context - * @ownerDes: owner designation - * @ownerItem: the owner as a schema item - * @node: the node holding the value - * - * Converts a boolean string value into 1 or 0. - * - * Returns 0 or 1. - */ -static int -xmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaBasicItemPtr ownerItem, - xmlNodePtr node) -{ - xmlChar *value = NULL; - int res = 0; - - value = xmlNodeGetContent(node); - /* - * 3.2.2.1 Lexical representation - * An instance of a datatype that is defined as ·boolean· - * can have the following legal literals {true, false, 1, 0}. - */ - if (xmlStrEqual(BAD_CAST value, BAD_CAST "true")) - res = 1; - else if (xmlStrEqual(BAD_CAST value, BAD_CAST "false")) - res = 0; - else if (xmlStrEqual(BAD_CAST value, BAD_CAST "1")) - res = 1; - else if (xmlStrEqual(BAD_CAST value, BAD_CAST "0")) - res = 0; - else { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_INVALID_BOOLEAN, - ownerItem, node, - xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), - NULL, BAD_CAST value, - NULL, NULL, NULL); - } - if (value != NULL) - xmlFree(value); - return (res); -} - -/** - * xmlGetBooleanProp: - * @ctxt: a schema validation context - * @node: a subtree containing XML Schema informations - * @name: the attribute name - * @def: the default value - * - * Evaluate if a boolean property is set - * - * Returns the default if not found, 0 if found to be false, - * 1 if found to be true - */ -static int -xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt, - xmlNodePtr node, - const char *name, int def) -{ - const xmlChar *val; - - val = xmlSchemaGetProp(ctxt, node, name); - if (val == NULL) - return (def); - /* - * 3.2.2.1 Lexical representation - * An instance of a datatype that is defined as ·boolean· - * can have the following legal literals {true, false, 1, 0}. - */ - if (xmlStrEqual(val, BAD_CAST "true")) - def = 1; - else if (xmlStrEqual(val, BAD_CAST "false")) - def = 0; - else if (xmlStrEqual(val, BAD_CAST "1")) - def = 1; - else if (xmlStrEqual(val, BAD_CAST "0")) - def = 0; - else { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_INVALID_BOOLEAN, - NULL, - (xmlNodePtr) xmlSchemaGetPropNode(node, name), - xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), - NULL, val, NULL, NULL, NULL); - } - return (def); -} - -/************************************************************************ - * * - * Shema extraction from an Infoset * - * * - ************************************************************************/ -static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr - ctxt, xmlSchemaPtr schema, - xmlNodePtr node, - int topLevel); -static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr - ctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - int topLevel); -static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr - ctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - xmlSchemaTypeType parentType); -static xmlSchemaBasicItemPtr -xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - xmlSchemaItemListPtr uses, - int parentType); -static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlNodePtr node); -static xmlSchemaWildcardPtr -xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, xmlNodePtr node); - -/** - * xmlSchemaPValAttrNodeValue: - * - * @ctxt: a schema parser context - * @ownerDes: the designation of the parent element - * @ownerItem: the schema object owner if existent - * @attr: the schema attribute node being validated - * @value: the value - * @type: the built-in type to be validated against - * - * Validates a value against the given built-in type. - * This one is intended to be used internally for validation - * of schema attribute values during parsing of the schema. - * - * Returns 0 if the value is valid, a positive error code - * number otherwise and -1 in case of an internal or API error. - */ -static int -xmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaBasicItemPtr ownerItem, - xmlAttrPtr attr, - const xmlChar *value, - xmlSchemaTypePtr type) -{ - - int ret = 0; - - /* - * NOTE: Should we move this to xmlschematypes.c? Hmm, but this - * one is really meant to be used internally, so better not. - */ - if ((pctxt == NULL) || (type == NULL) || (attr == NULL)) - return (-1); - if (type->type != XML_SCHEMA_TYPE_BASIC) { - PERROR_INT("xmlSchemaPValAttrNodeValue", - "the given type is not a built-in type"); - return (-1); - } - switch (type->builtInType) { - case XML_SCHEMAS_NCNAME: - case XML_SCHEMAS_QNAME: - case XML_SCHEMAS_ANYURI: - case XML_SCHEMAS_TOKEN: - case XML_SCHEMAS_LANGUAGE: - ret = xmlSchemaValPredefTypeNode(type, value, NULL, - (xmlNodePtr) attr); - break; - default: { - PERROR_INT("xmlSchemaPValAttrNodeValue", - "validation using the given type is not supported while " - "parsing a schema"); - return (-1); - } - } - /* - * TODO: Should we use the S4S error codes instead? - */ - if (ret < 0) { - PERROR_INT("xmlSchemaPValAttrNodeValue", - "failed to validate a schema attribute value"); - return (-1); - } else if (ret > 0) { - if (WXS_IS_LIST(type)) - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; - else - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; - xmlSchemaPSimpleTypeErr(pctxt, - ret, ownerItem, (xmlNodePtr) attr, - type, NULL, value, NULL, NULL, NULL); - } - return (ret); -} - -/** - * xmlSchemaPValAttrNode: - * - * @ctxt: a schema parser context - * @ownerDes: the designation of the parent element - * @ownerItem: the schema object owner if existent - * @attr: the schema attribute node being validated - * @type: the built-in type to be validated against - * @value: the resulting value if any - * - * Extracts and validates a value against the given built-in type. - * This one is intended to be used internally for validation - * of schema attribute values during parsing of the schema. - * - * Returns 0 if the value is valid, a positive error code - * number otherwise and -1 in case of an internal or API error. - */ -static int -xmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaBasicItemPtr ownerItem, - xmlAttrPtr attr, - xmlSchemaTypePtr type, - const xmlChar **value) -{ - const xmlChar *val; - - if ((ctxt == NULL) || (type == NULL) || (attr == NULL)) - return (-1); - - val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - if (value != NULL) - *value = val; - - return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem, attr, - val, type)); -} - -/** - * xmlSchemaPValAttr: - * - * @ctxt: a schema parser context - * @node: the element node of the attribute - * @ownerDes: the designation of the parent element - * @ownerItem: the schema object owner if existent - * @ownerElem: the owner element node - * @name: the name of the schema attribute node - * @type: the built-in type to be validated against - * @value: the resulting value if any - * - * Extracts and validates a value against the given built-in type. - * This one is intended to be used internally for validation - * of schema attribute values during parsing of the schema. - * - * Returns 0 if the value is valid, a positive error code - * number otherwise and -1 in case of an internal or API error. - */ -static int -xmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaBasicItemPtr ownerItem, - xmlNodePtr ownerElem, - const char *name, - xmlSchemaTypePtr type, - const xmlChar **value) -{ - xmlAttrPtr attr; - - if ((ctxt == NULL) || (type == NULL)) { - if (value != NULL) - *value = NULL; - return (-1); - } - if (type->type != XML_SCHEMA_TYPE_BASIC) { - if (value != NULL) - *value = NULL; - xmlSchemaPErr(ctxt, ownerElem, - XML_SCHEMAP_INTERNAL, - "Internal error: xmlSchemaPValAttr, the given " - "type '%s' is not a built-in type.\n", - type->name, NULL); - return (-1); - } - attr = xmlSchemaGetPropNode(ownerElem, name); - if (attr == NULL) { - if (value != NULL) - *value = NULL; - return (0); - } - return (xmlSchemaPValAttrNode(ctxt, ownerItem, attr, - type, value)); -} - -static int -xmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema ATTRIBUTE_UNUSED, - xmlNodePtr node, - xmlAttrPtr attr, - const xmlChar *namespaceName) -{ - /* TODO: Pointer comparison instead? */ - if (xmlStrEqual(pctxt->targetNamespace, namespaceName)) - return (0); - if (xmlStrEqual(xmlSchemaNs, namespaceName)) - return (0); - /* - * Check if the referenced namespace was <import>ed. - */ - if (WXS_BUCKET(pctxt)->relations != NULL) { - xmlSchemaSchemaRelationPtr rel; - - rel = WXS_BUCKET(pctxt)->relations; - do { - if (WXS_IS_BUCKET_IMPMAIN(rel->type) && - xmlStrEqual(namespaceName, rel->importNamespace)) - return (0); - rel = rel->next; - } while (rel != NULL); - } - /* - * No matching <import>ed namespace found. - */ - { - xmlNodePtr n = (attr != NULL) ? (xmlNodePtr) attr : node; - - if (namespaceName == NULL) - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_SRC_RESOLVE, n, NULL, - "References from this schema to components in no " - "namespace are not allowed, since not indicated by an " - "import statement", NULL, NULL); - else - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_SRC_RESOLVE, n, NULL, - "References from this schema to components in the " - "namespace '%s' are not allowed, since not indicated by an " - "import statement", namespaceName, NULL); - } - return (XML_SCHEMAP_SRC_RESOLVE); -} - -/** - * xmlSchemaParseLocalAttributes: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * @type: the hosting type where the attributes will be anchored - * - * Parses attribute uses and attribute declarations and - * attribute group references. - */ -static int -xmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr *child, xmlSchemaItemListPtr *list, - int parentType, int *hasRefs) -{ - void *item; - - while ((IS_SCHEMA((*child), "attribute")) || - (IS_SCHEMA((*child), "attributeGroup"))) { - if (IS_SCHEMA((*child), "attribute")) { - item = xmlSchemaParseLocalAttribute(ctxt, schema, *child, - *list, parentType); - } else { - item = xmlSchemaParseAttributeGroupRef(ctxt, schema, *child); - if ((item != NULL) && (hasRefs != NULL)) - *hasRefs = 1; - } - if (item != NULL) { - if (*list == NULL) { - /* TODO: Customize grow factor. */ - *list = xmlSchemaItemListCreate(); - if (*list == NULL) - return(-1); - } - if (xmlSchemaItemListAddSize(*list, 2, item) == -1) - return(-1); - } - *child = (*child)->next; - } - return (0); -} - -/** - * xmlSchemaParseAnnotation: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Attrribute declaration - * *WARNING* this interface is highly subject to change - * - * Returns -1 in case of error, 0 if the declaration is improper and - * 1 in case of success. - */ -static xmlSchemaAnnotPtr -xmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int needed) -{ - xmlSchemaAnnotPtr ret; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - int barked = 0; - - /* - * INFO: S4S completed. - */ - /* - * id = ID - * {any attributes with non-schema namespace . . .}> - * Content: (appinfo | documentation)* - */ - if ((ctxt == NULL) || (node == NULL)) - return (NULL); - if (needed) - ret = xmlSchemaNewAnnot(ctxt, node); - else - ret = NULL; - attr = node->properties; - while (attr != NULL) { - if (((attr->ns == NULL) && - (!xmlStrEqual(attr->name, BAD_CAST "id"))) || - ((attr->ns != NULL) && - xmlStrEqual(attr->ns->href, xmlSchemaNs))) { - - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * And now for the children... - */ - child = node->children; - while (child != NULL) { - if (IS_SCHEMA(child, "appinfo")) { - /* TODO: make available the content of "appinfo". */ - /* - * source = anyURI - * {any attributes with non-schema namespace . . .}> - * Content: ({any})* - */ - attr = child->properties; - while (attr != NULL) { - if (((attr->ns == NULL) && - (!xmlStrEqual(attr->name, BAD_CAST "source"))) || - ((attr->ns != NULL) && - xmlStrEqual(attr->ns->href, xmlSchemaNs))) { - - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttr(ctxt, NULL, child, "source", - xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL); - child = child->next; - } else if (IS_SCHEMA(child, "documentation")) { - /* TODO: make available the content of "documentation". */ - /* - * source = anyURI - * {any attributes with non-schema namespace . . .}> - * Content: ({any})* - */ - attr = child->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if (!xmlStrEqual(attr->name, BAD_CAST "source")) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else { - if (xmlStrEqual(attr->ns->href, xmlSchemaNs) || - (xmlStrEqual(attr->name, BAD_CAST "lang") && - (!xmlStrEqual(attr->ns->href, XML_XML_NAMESPACE)))) { - - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } - attr = attr->next; - } - /* - * Attribute "xml:lang". - */ - attr = xmlSchemaGetPropNodeNs(child, (const char *) XML_XML_NAMESPACE, "lang"); - if (attr != NULL) - xmlSchemaPValAttrNode(ctxt, NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE), NULL); - child = child->next; - } else { - if (!barked) - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, "(appinfo | documentation)*"); - barked = 1; - child = child->next; - } - } - - return (ret); -} - -/** - * xmlSchemaParseFacet: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Facet declaration - * *WARNING* this interface is highly subject to change - * - * Returns the new type structure or NULL in case of error - */ -static xmlSchemaFacetPtr -xmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlSchemaFacetPtr facet; - xmlNodePtr child = NULL; - const xmlChar *value; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - facet = xmlSchemaNewFacet(); - if (facet == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating facet", node); - return (NULL); - } - facet->node = node; - value = xmlSchemaGetProp(ctxt, node, "value"); - if (value == NULL) { - xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_FACET_NO_VALUE, - "Facet %s has no value\n", node->name, NULL); - xmlSchemaFreeFacet(facet); - return (NULL); - } - if (IS_SCHEMA(node, "minInclusive")) { - facet->type = XML_SCHEMA_FACET_MININCLUSIVE; - } else if (IS_SCHEMA(node, "minExclusive")) { - facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE; - } else if (IS_SCHEMA(node, "maxInclusive")) { - facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE; - } else if (IS_SCHEMA(node, "maxExclusive")) { - facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE; - } else if (IS_SCHEMA(node, "totalDigits")) { - facet->type = XML_SCHEMA_FACET_TOTALDIGITS; - } else if (IS_SCHEMA(node, "fractionDigits")) { - facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS; - } else if (IS_SCHEMA(node, "pattern")) { - facet->type = XML_SCHEMA_FACET_PATTERN; - } else if (IS_SCHEMA(node, "enumeration")) { - facet->type = XML_SCHEMA_FACET_ENUMERATION; - } else if (IS_SCHEMA(node, "whiteSpace")) { - facet->type = XML_SCHEMA_FACET_WHITESPACE; - } else if (IS_SCHEMA(node, "length")) { - facet->type = XML_SCHEMA_FACET_LENGTH; - } else if (IS_SCHEMA(node, "maxLength")) { - facet->type = XML_SCHEMA_FACET_MAXLENGTH; - } else if (IS_SCHEMA(node, "minLength")) { - facet->type = XML_SCHEMA_FACET_MINLENGTH; - } else { - xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_TYPE, - "Unknown facet type %s\n", node->name, NULL); - xmlSchemaFreeFacet(facet); - return (NULL); - } - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - facet->value = value; - if ((facet->type != XML_SCHEMA_FACET_PATTERN) && - (facet->type != XML_SCHEMA_FACET_ENUMERATION)) { - const xmlChar *fixed; - - fixed = xmlSchemaGetProp(ctxt, node, "fixed"); - if (fixed != NULL) { - if (xmlStrEqual(fixed, BAD_CAST "true")) - facet->fixed = 1; - } - } - child = node->children; - - if (IS_SCHEMA(child, "annotation")) { - facet->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (child != NULL) { - xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_CHILD, - "Facet %s has unexpected child content\n", - node->name, NULL); - } - return (facet); -} - -/** - * xmlSchemaParseWildcardNs: - * @ctxt: a schema parser context - * @wildc: the wildcard, already created - * @node: a subtree containing XML Schema informations - * - * Parses the attribute "processContents" and "namespace" - * of a xsd:anyAttribute and xsd:any. - * *WARNING* this interface is highly subject to change - * - * Returns 0 if everything goes fine, a positive error code - * if something is not valid and -1 if an internal error occurs. - */ -static int -xmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema ATTRIBUTE_UNUSED, - xmlSchemaWildcardPtr wildc, - xmlNodePtr node) -{ - const xmlChar *pc, *ns, *dictnsItem; - int ret = 0; - xmlChar *nsItem; - xmlSchemaWildcardNsPtr tmp, lastNs = NULL; - xmlAttrPtr attr; - - pc = xmlSchemaGetProp(ctxt, node, "processContents"); - if ((pc == NULL) - || (xmlStrEqual(pc, (const xmlChar *) "strict"))) { - wildc->processContents = XML_SCHEMAS_ANY_STRICT; - } else if (xmlStrEqual(pc, (const xmlChar *) "skip")) { - wildc->processContents = XML_SCHEMAS_ANY_SKIP; - } else if (xmlStrEqual(pc, (const xmlChar *) "lax")) { - wildc->processContents = XML_SCHEMAS_ANY_LAX; - } else { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, node, - NULL, "(strict | skip | lax)", pc, - NULL, NULL, NULL); - wildc->processContents = XML_SCHEMAS_ANY_STRICT; - ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; - } - /* - * Build the namespace constraints. - */ - attr = xmlSchemaGetPropNode(node, "namespace"); - ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - if ((attr == NULL) || (xmlStrEqual(ns, BAD_CAST "##any"))) - wildc->any = 1; - else if (xmlStrEqual(ns, BAD_CAST "##other")) { - wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); - if (wildc->negNsSet == NULL) { - return (-1); - } - wildc->negNsSet->value = ctxt->targetNamespace; - } else { - const xmlChar *end, *cur; - - cur = ns; - do { - while (IS_BLANK_CH(*cur)) - cur++; - end = cur; - while ((*end != 0) && (!(IS_BLANK_CH(*end)))) - end++; - if (end == cur) - break; - nsItem = xmlStrndup(cur, end - cur); - if ((xmlStrEqual(nsItem, BAD_CAST "##other")) || - (xmlStrEqual(nsItem, BAD_CAST "##any"))) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER, - NULL, (xmlNodePtr) attr, - NULL, - "((##any | ##other) | List of (xs:anyURI | " - "(##targetNamespace | ##local)))", - nsItem, NULL, NULL, NULL); - ret = XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER; - } else { - if (xmlStrEqual(nsItem, BAD_CAST "##targetNamespace")) { - dictnsItem = ctxt->targetNamespace; - } else if (xmlStrEqual(nsItem, BAD_CAST "##local")) { - dictnsItem = NULL; - } else { - /* - * Validate the item (anyURI). - */ - xmlSchemaPValAttrNodeValue(ctxt, NULL, attr, - nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI)); - dictnsItem = xmlDictLookup(ctxt->dict, nsItem, -1); - } - /* - * Avoid dublicate namespaces. - */ - tmp = wildc->nsSet; - while (tmp != NULL) { - if (dictnsItem == tmp->value) - break; - tmp = tmp->next; - } - if (tmp == NULL) { - tmp = xmlSchemaNewWildcardNsConstraint(ctxt); - if (tmp == NULL) { - xmlFree(nsItem); - return (-1); - } - tmp->value = dictnsItem; - tmp->next = NULL; - if (wildc->nsSet == NULL) - wildc->nsSet = tmp; - else - lastNs->next = tmp; - lastNs = tmp; - } - - } - xmlFree(nsItem); - cur = end; - } while (*cur != 0); - } - return (ret); -} - -static int -xmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr item ATTRIBUTE_UNUSED, - xmlNodePtr node, - int minOccurs, - int maxOccurs) { - - if ((maxOccurs == 0) && ( minOccurs == 0)) - return (0); - if (maxOccurs != UNBOUNDED) { - /* - * TODO: Maybe we should better not create the particle, - * if min/max is invalid, since it could confuse the build of the - * content model. - */ - /* - * 3.9.6 Schema Component Constraint: Particle Correct - * - */ - if (maxOccurs < 1) { - /* - * 2.2 {max occurs} must be greater than or equal to 1. - */ - xmlSchemaPCustomAttrErr(ctxt, - XML_SCHEMAP_P_PROPS_CORRECT_2_2, - NULL, NULL, - xmlSchemaGetPropNode(node, "maxOccurs"), - "The value must be greater than or equal to 1"); - return (XML_SCHEMAP_P_PROPS_CORRECT_2_2); - } else if (minOccurs > maxOccurs) { - /* - * 2.1 {min occurs} must not be greater than {max occurs}. - */ - xmlSchemaPCustomAttrErr(ctxt, - XML_SCHEMAP_P_PROPS_CORRECT_2_1, - NULL, NULL, - xmlSchemaGetPropNode(node, "minOccurs"), - "The value must not be greater than the value of 'maxOccurs'"); - return (XML_SCHEMAP_P_PROPS_CORRECT_2_1); - } - } - return (0); -} - -/** - * xmlSchemaParseAny: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * Parsea a XML schema <any> element. A particle and wildcard - * will be created (except if minOccurs==maxOccurs==0, in this case - * nothing will be created). - * *WARNING* this interface is highly subject to change - * - * Returns the particle or NULL in case of error or if minOccurs==maxOccurs==0 - */ -static xmlSchemaParticlePtr -xmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlSchemaParticlePtr particle; - xmlNodePtr child = NULL; - xmlSchemaWildcardPtr wild; - int min, max; - xmlAttrPtr attr; - xmlSchemaAnnotPtr annot = NULL; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && - (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && - (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && - (!xmlStrEqual(attr->name, BAD_CAST "processContents"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * minOccurs/maxOccurs. - */ - max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, - "(xs:nonNegativeInteger | unbounded)"); - min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, - "xs:nonNegativeInteger"); - xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); - /* - * Create & parse the wildcard. - */ - wild = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY, node); - if (wild == NULL) - return (NULL); - xmlSchemaParseWildcardNs(ctxt, schema, wild, node); - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?)"); - } - /* - * No component if minOccurs==maxOccurs==0. - */ - if ((min == 0) && (max == 0)) { - /* Don't free the wildcard, since it's already on the list. */ - return (NULL); - } - /* - * Create the particle. - */ - particle = xmlSchemaAddParticle(ctxt, node, min, max); - if (particle == NULL) - return (NULL); - particle->annot = annot; - particle->children = (xmlSchemaTreeItemPtr) wild; - - return (particle); -} - -/** - * xmlSchemaParseNotation: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Notation declaration - * - * Returns the new structure or NULL in case of error - */ -static xmlSchemaNotationPtr -xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node) -{ - const xmlChar *name; - xmlSchemaNotationPtr ret; - xmlNodePtr child = NULL; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - name = xmlSchemaGetProp(ctxt, node, "name"); - if (name == NULL) { - xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_NOTATION_NO_NAME, - "Notation has no name\n", NULL, NULL); - return (NULL); - } - ret = xmlSchemaAddNotation(ctxt, schema, name, - ctxt->targetNamespace, node); - if (ret == NULL) - return (NULL); - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?)"); - } - - return (ret); -} - -/** - * xmlSchemaParseAnyAttribute: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema AnyAttrribute declaration - * *WARNING* this interface is highly subject to change - * - * Returns a wildcard or NULL. - */ -static xmlSchemaWildcardPtr -xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, xmlNodePtr node) -{ - xmlSchemaWildcardPtr ret; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - ret = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE, - node); - if (ret == NULL) { - return (NULL); - } - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && - (!xmlStrEqual(attr->name, BAD_CAST "processContents"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * Parse the namespace list. - */ - if (xmlSchemaParseWildcardNs(ctxt, schema, ret, node) != 0) - return (NULL); - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?)"); - } - - return (ret); -} - - -/** - * xmlSchemaParseAttribute: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Attrribute declaration - * *WARNING* this interface is highly subject to change - * - * Returns the attribute declaration. - */ -static xmlSchemaBasicItemPtr -xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - xmlSchemaItemListPtr uses, - int parentType) -{ - const xmlChar *attrValue, *name = NULL, *ns = NULL; - xmlSchemaAttributeUsePtr use = NULL; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - const xmlChar *tmpNs = NULL, *tmpName = NULL, *defValue = NULL; - int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL; - int nberrors, hasForm = 0, defValueType = 0; - -#define WXS_ATTR_DEF_VAL_DEFAULT 1 -#define WXS_ATTR_DEF_VAL_FIXED 2 - - /* - * 3.2.3 Constraints on XML Representations of Attribute Declarations - */ - - if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - attr = xmlSchemaGetPropNode(node, "ref"); - if (attr != NULL) { - if (xmlSchemaPValAttrNodeQName(pctxt, schema, - NULL, attr, &tmpNs, &tmpName) != 0) { - return (NULL); - } - if (xmlSchemaCheckReference(pctxt, schema, node, attr, tmpNs) != 0) - return(NULL); - isRef = 1; - } - nberrors = pctxt->nberrors; - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if (isRef) { - if (xmlStrEqual(attr->name, BAD_CAST "id")) { - xmlSchemaPValAttrNodeID(pctxt, attr); - goto attr_next; - } else if (xmlStrEqual(attr->name, BAD_CAST "ref")) { - goto attr_next; - } - } else { - if (xmlStrEqual(attr->name, BAD_CAST "name")) { - goto attr_next; - } else if (xmlStrEqual(attr->name, BAD_CAST "id")) { - xmlSchemaPValAttrNodeID(pctxt, attr); - goto attr_next; - } else if (xmlStrEqual(attr->name, BAD_CAST "type")) { - xmlSchemaPValAttrNodeQName(pctxt, schema, NULL, - attr, &tmpNs, &tmpName); - goto attr_next; - } else if (xmlStrEqual(attr->name, BAD_CAST "form")) { - /* - * Evaluate the target namespace - */ - hasForm = 1; - attrValue = xmlSchemaGetNodeContent(pctxt, - (xmlNodePtr) attr); - if (xmlStrEqual(attrValue, BAD_CAST "qualified")) { - ns = pctxt->targetNamespace; - } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) - { - xmlSchemaPSimpleTypeErr(pctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, - NULL, "(qualified | unqualified)", - attrValue, NULL, NULL, NULL); - } - goto attr_next; - } - } - if (xmlStrEqual(attr->name, BAD_CAST "use")) { - - attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); - /* TODO: Maybe we need to normalize the value beforehand. */ - if (xmlStrEqual(attrValue, BAD_CAST "optional")) - occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL; - else if (xmlStrEqual(attrValue, BAD_CAST "prohibited")) - occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED; - else if (xmlStrEqual(attrValue, BAD_CAST "required")) - occurs = XML_SCHEMAS_ATTR_USE_REQUIRED; - else { - xmlSchemaPSimpleTypeErr(pctxt, - XML_SCHEMAP_INVALID_ATTR_USE, - NULL, (xmlNodePtr) attr, - NULL, "(optional | prohibited | required)", - attrValue, NULL, NULL, NULL); - } - goto attr_next; - } else if (xmlStrEqual(attr->name, BAD_CAST "default")) { - /* - * 3.2.3 : 1 - * default and fixed must not both be present. - */ - if (defValue) { - xmlSchemaPMutualExclAttrErr(pctxt, - XML_SCHEMAP_SRC_ATTRIBUTE_1, - NULL, attr, "default", "fixed"); - } else { - defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); - defValueType = WXS_ATTR_DEF_VAL_DEFAULT; - } - goto attr_next; - } else if (xmlStrEqual(attr->name, BAD_CAST "fixed")) { - /* - * 3.2.3 : 1 - * default and fixed must not both be present. - */ - if (defValue) { - xmlSchemaPMutualExclAttrErr(pctxt, - XML_SCHEMAP_SRC_ATTRIBUTE_1, - NULL, attr, "default", "fixed"); - } else { - defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); - defValueType = WXS_ATTR_DEF_VAL_FIXED; - } - goto attr_next; - } - } else if (! xmlStrEqual(attr->ns->href, xmlSchemaNs)) - goto attr_next; - - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - -attr_next: - attr = attr->next; - } - /* - * 3.2.3 : 2 - * If default and use are both present, use must have - * the actual value optional. - */ - if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) && - (occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) { - xmlSchemaPSimpleTypeErr(pctxt, - XML_SCHEMAP_SRC_ATTRIBUTE_2, - NULL, node, NULL, - "(optional | prohibited | required)", NULL, - "The value of the attribute 'use' must be 'optional' " - "if the attribute 'default' is present", - NULL, NULL); - } - /* - * We want correct attributes. - */ - if (nberrors != pctxt->nberrors) - return(NULL); - if (! isRef) { - xmlSchemaAttributePtr attrDecl; - - /* TODO: move XML_SCHEMAS_QUALIF_ATTR to the parser. */ - if ((! hasForm) && (schema->flags & XML_SCHEMAS_QUALIF_ATTR)) - ns = pctxt->targetNamespace; - /* - * 3.2.6 Schema Component Constraint: xsi: Not Allowed - * TODO: Move this to the component layer. - */ - if (xmlStrEqual(ns, xmlSchemaInstanceNs)) { - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_NO_XSI, - node, NULL, - "The target namespace must not match '%s'", - xmlSchemaInstanceNs, NULL); - } - attr = xmlSchemaGetPropNode(node, "name"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "name", NULL); - return (NULL); - } - if (xmlSchemaPValAttrNode(pctxt, NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { - return (NULL); - } - /* - * 3.2.6 Schema Component Constraint: xmlns Not Allowed - * TODO: Move this to the component layer. - */ - if (xmlStrEqual(name, BAD_CAST "xmlns")) { - xmlSchemaPSimpleTypeErr(pctxt, - XML_SCHEMAP_NO_XMLNS, - NULL, (xmlNodePtr) attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL, - "The value of the attribute must not match 'xmlns'", - NULL, NULL); - return (NULL); - } - if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) - goto check_children; - /* - * Create the attribute use component. - */ - use = xmlSchemaAddAttributeUse(pctxt, node); - if (use == NULL) - return(NULL); - use->occurs = occurs; - /* - * Create the attribute declaration. - */ - attrDecl = xmlSchemaAddAttribute(pctxt, schema, name, ns, node, 0); - if (attrDecl == NULL) - return (NULL); - if (tmpName != NULL) { - attrDecl->typeName = tmpName; - attrDecl->typeNs = tmpNs; - } - use->attrDecl = attrDecl; - /* - * Value constraint. - */ - if (defValue != NULL) { - attrDecl->defValue = defValue; - if (defValueType == WXS_ATTR_DEF_VAL_FIXED) - attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED; - } - } else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) { - xmlSchemaQNameRefPtr ref; - - /* - * Create the attribute use component. - */ - use = xmlSchemaAddAttributeUse(pctxt, node); - if (use == NULL) - return(NULL); - /* - * We need to resolve the reference at later stage. - */ - WXS_ADD_PENDING(pctxt, use); - use->occurs = occurs; - /* - * Create a QName reference to the attribute declaration. - */ - ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE, - tmpName, tmpNs); - if (ref == NULL) - return(NULL); - /* - * Assign the reference. This will be substituted for the - * referenced attribute declaration when the QName is resolved. - */ - use->attrDecl = WXS_ATTR_CAST ref; - /* - * Value constraint. - */ - if (defValue != NULL) - use->defValue = defValue; - if (defValueType == WXS_ATTR_DEF_VAL_FIXED) - use->flags |= XML_SCHEMA_ATTR_USE_FIXED; - } - -check_children: - /* - * And now for the children... - */ - child = node->children; - if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) { - xmlSchemaAttributeUseProhibPtr prohib; - - if (IS_SCHEMA(child, "annotation")) { - xmlSchemaParseAnnotation(pctxt, child, 0); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(pctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?)"); - } - /* - * Check for pointlessness of attribute prohibitions. - */ - if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) { - xmlSchemaCustomWarning(ACTXT_CAST pctxt, - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, - node, NULL, - "Skipping attribute use prohibition, since it is " - "pointless inside an <attributeGroup>", - NULL, NULL, NULL); - return(NULL); - } else if (parentType == XML_SCHEMA_TYPE_EXTENSION) { - xmlSchemaCustomWarning(ACTXT_CAST pctxt, - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, - node, NULL, - "Skipping attribute use prohibition, since it is " - "pointless when extending a type", - NULL, NULL, NULL); - return(NULL); - } - if (! isRef) { - tmpName = name; - tmpNs = ns; - } - /* - * Check for duplicate attribute prohibitions. - */ - if (uses) { - int i; - - for (i = 0; i < uses->nbItems; i++) { - use = uses->items[i]; - if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) && - (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) && - (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace)) - { - xmlChar *str = NULL; - - xmlSchemaCustomWarning(ACTXT_CAST pctxt, - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, - node, NULL, - "Skipping duplicate attribute use prohibition '%s'", - xmlSchemaFormatQName(&str, tmpNs, tmpName), - NULL, NULL); - FREE_AND_NULL(str) - return(NULL); - } - } - } - /* - * Create the attribute prohibition helper component. - */ - prohib = xmlSchemaAddAttributeUseProhib(pctxt); - if (prohib == NULL) - return(NULL); - prohib->node = node; - prohib->name = tmpName; - prohib->targetNamespace = tmpNs; - if (isRef) { - /* - * We need at least to resolve to the attribute declaration. - */ - WXS_ADD_PENDING(pctxt, prohib); - } - return(WXS_BASIC_CAST prohib); - } else { - if (IS_SCHEMA(child, "annotation")) { - /* - * TODO: Should this go into the attr decl? - */ - use->annot = xmlSchemaParseAnnotation(pctxt, child, 1); - child = child->next; - } - if (isRef) { - if (child != NULL) { - if (IS_SCHEMA(child, "simpleType")) - /* - * 3.2.3 : 3.2 - * If ref is present, then all of <simpleType>, - * form and type must be absent. - */ - xmlSchemaPContentErr(pctxt, - XML_SCHEMAP_SRC_ATTRIBUTE_3_2, - NULL, node, child, NULL, - "(annotation?)"); - else - xmlSchemaPContentErr(pctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?)"); - } - } else { - if (IS_SCHEMA(child, "simpleType")) { - if (WXS_ATTRUSE_DECL(use)->typeName != NULL) { - /* - * 3.2.3 : 4 - * type and <simpleType> must not both be present. - */ - xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4, - NULL, node, child, - "The attribute 'type' and the <simpleType> child " - "are mutually exclusive", NULL); - } else - WXS_ATTRUSE_TYPEDEF(use) = - xmlSchemaParseSimpleType(pctxt, schema, child, 0); - child = child->next; - } - if (child != NULL) - xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, simpleType?)"); - } - } - return (WXS_BASIC_CAST use); -} - - -static xmlSchemaAttributePtr -xmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlNodePtr node) -{ - const xmlChar *attrValue; - xmlSchemaAttributePtr ret; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - - /* - * Note that the w3c spec assumes the schema to be validated with schema - * for schemas beforehand. - * - * 3.2.3 Constraints on XML Representations of Attribute Declarations - */ - if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - /* - * 3.2.3 : 3.1 - * One of ref or name must be present, but not both - */ - attr = xmlSchemaGetPropNode(node, "name"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "name", NULL); - return (NULL); - } - if (xmlSchemaPValAttrNode(pctxt, NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) { - return (NULL); - } - /* - * 3.2.6 Schema Component Constraint: xmlns Not Allowed - * TODO: Move this to the component layer. - */ - if (xmlStrEqual(attrValue, BAD_CAST "xmlns")) { - xmlSchemaPSimpleTypeErr(pctxt, - XML_SCHEMAP_NO_XMLNS, - NULL, (xmlNodePtr) attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL, - "The value of the attribute must not match 'xmlns'", - NULL, NULL); - return (NULL); - } - /* - * 3.2.6 Schema Component Constraint: xsi: Not Allowed - * TODO: Move this to the component layer. - * Or better leave it here and add it to the component layer - * if we have a schema construction API. - */ - if (xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) { - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_NO_XSI, node, NULL, - "The target namespace must not match '%s'", - xmlSchemaInstanceNs, NULL); - } - - ret = xmlSchemaAddAttribute(pctxt, schema, attrValue, - pctxt->targetNamespace, node, 1); - if (ret == NULL) - return (NULL); - ret->flags |= XML_SCHEMAS_ATTR_GLOBAL; - - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "default")) && - (!xmlStrEqual(attr->name, BAD_CAST "fixed")) && - (!xmlStrEqual(attr->name, BAD_CAST "name")) && - (!xmlStrEqual(attr->name, BAD_CAST "type"))) - { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttrQName(pctxt, schema, NULL, - node, "type", &ret->typeNs, &ret->typeName); - - xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); - /* - * Attribute "fixed". - */ - ret->defValue = xmlSchemaGetProp(pctxt, node, "fixed"); - if (ret->defValue != NULL) - ret->flags |= XML_SCHEMAS_ATTR_FIXED; - /* - * Attribute "default". - */ - attr = xmlSchemaGetPropNode(node, "default"); - if (attr != NULL) { - /* - * 3.2.3 : 1 - * default and fixed must not both be present. - */ - if (ret->flags & XML_SCHEMAS_ATTR_FIXED) { - xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1, - WXS_BASIC_CAST ret, attr, "default", "fixed"); - } else - ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); - } - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1); - child = child->next; - } - if (IS_SCHEMA(child, "simpleType")) { - if (ret->typeName != NULL) { - /* - * 3.2.3 : 4 - * type and <simpleType> must not both be present. - */ - xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4, - NULL, node, child, - "The attribute 'type' and the <simpleType> child " - "are mutually exclusive", NULL); - } else - ret->subtypes = xmlSchemaParseSimpleType(pctxt, schema, child, 0); - child = child->next; - } - if (child != NULL) - xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, simpleType?)"); - - return (ret); -} - -/** - * xmlSchemaParseAttributeGroupRef: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * Parse an attribute group definition reference. - * Note that a reference to an attribute group does not - * correspond to any component at all. - * *WARNING* this interface is highly subject to change - * - * Returns the attribute group or NULL in case of error. - */ -static xmlSchemaQNameRefPtr -xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlSchemaQNameRefPtr ret; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - const xmlChar *refNs = NULL, *ref = NULL; - - if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - attr = xmlSchemaGetPropNode(node, "ref"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "ref", NULL); - return (NULL); - } - xmlSchemaPValAttrNodeQName(pctxt, schema, - NULL, attr, &refNs, &ref); - if (xmlSchemaCheckReference(pctxt, schema, node, attr, refNs) != 0) - return(NULL); - - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) && - (!xmlStrEqual(attr->name, BAD_CAST "id"))) - { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* Attribute ID */ - xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); - - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - /* - * TODO: We do not have a place to store the annotation, do we? - */ - xmlSchemaParseAnnotation(pctxt, child, 0); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(pctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?)"); - } - - /* - * Handle attribute group redefinitions. - */ - if (pctxt->isRedefine && pctxt->redef && - (pctxt->redef->item->type == - XML_SCHEMA_TYPE_ATTRIBUTEGROUP) && - (ref == pctxt->redef->refName) && - (refNs == pctxt->redef->refTargetNs)) - { - /* - * SPEC src-redefine: - * (7.1) "If it has an <attributeGroup> among its contents - * the ·actual value· of whose ref [attribute] is the same - * as the ·actual value· of its own name attribute plus - * target namespace, then it must have exactly one such group." - */ - if (pctxt->redefCounter != 0) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_SRC_REDEFINE, node, NULL, - "The redefining attribute group definition " - "'%s' must not contain more than one " - "reference to the redefined definition", - xmlSchemaFormatQName(&str, refNs, ref), NULL); - FREE_AND_NULL(str); - return(NULL); - } - pctxt->redefCounter++; - /* - * URGENT TODO: How to ensure that the reference will not be - * handled by the normal component resolution mechanism? - */ - ret = xmlSchemaNewQNameRef(pctxt, - XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs); - if (ret == NULL) - return(NULL); - ret->node = node; - pctxt->redef->reference = WXS_BASIC_CAST ret; - } else { - /* - * Create a QName-reference helper component. We will substitute this - * component for the attribute uses of the referenced attribute group - * definition. - */ - ret = xmlSchemaNewQNameRef(pctxt, - XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs); - if (ret == NULL) - return(NULL); - ret->node = node; - /* Add to pending items, to be able to resolve the reference. */ - WXS_ADD_PENDING(pctxt, ret); - } - return (ret); -} - -/** - * xmlSchemaParseAttributeGroupDefinition: - * @pctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Attribute Group declaration - * *WARNING* this interface is highly subject to change - * - * Returns the attribute group definition or NULL in case of error. - */ -static xmlSchemaAttributeGroupPtr -xmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlNodePtr node) -{ - const xmlChar *name; - xmlSchemaAttributeGroupPtr ret; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - int hasRefs = 0; - - if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - attr = xmlSchemaGetPropNode(node, "name"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "name", NULL); - return (NULL); - } - /* - * The name is crucial, exit if invalid. - */ - if (xmlSchemaPValAttrNode(pctxt, - NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { - return (NULL); - } - ret = xmlSchemaAddAttributeGroupDefinition(pctxt, schema, - name, pctxt->targetNamespace, node); - if (ret == NULL) - return (NULL); - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && - (!xmlStrEqual(attr->name, BAD_CAST "id"))) - { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* Attribute ID */ - xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1); - child = child->next; - } - /* - * Parse contained attribute decls/refs. - */ - if (xmlSchemaParseLocalAttributes(pctxt, schema, &child, - (xmlSchemaItemListPtr *) &(ret->attrUses), - XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1) - return(NULL); - if (hasRefs) - ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS; - /* - * Parse the attribute wildcard. - */ - if (IS_SCHEMA(child, "anyAttribute")) { - ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt, - schema, child); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(pctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))"); - } - return (ret); -} - -/** - * xmlSchemaPValAttrFormDefault: - * @value: the value - * @flags: the flags to be modified - * @flagQualified: the specific flag for "qualified" - * - * Returns 0 if the value is valid, 1 otherwise. - */ -static int -xmlSchemaPValAttrFormDefault(const xmlChar *value, - int *flags, - int flagQualified) -{ - if (xmlStrEqual(value, BAD_CAST "qualified")) { - if ((*flags & flagQualified) == 0) - *flags |= flagQualified; - } else if (!xmlStrEqual(value, BAD_CAST "unqualified")) - return (1); - - return (0); -} - -/** - * xmlSchemaPValAttrBlockFinal: - * @value: the value - * @flags: the flags to be modified - * @flagAll: the specific flag for "#all" - * @flagExtension: the specific flag for "extension" - * @flagRestriction: the specific flag for "restriction" - * @flagSubstitution: the specific flag for "substitution" - * @flagList: the specific flag for "list" - * @flagUnion: the specific flag for "union" - * - * Validates the value of the attribute "final" and "block". The value - * is converted into the specified flag values and returned in @flags. - * - * Returns 0 if the value is valid, 1 otherwise. - */ - -static int -xmlSchemaPValAttrBlockFinal(const xmlChar *value, - int *flags, - int flagAll, - int flagExtension, - int flagRestriction, - int flagSubstitution, - int flagList, - int flagUnion) -{ - int ret = 0; - - /* - * TODO: This does not check for dublicate entries. - */ - if ((flags == NULL) || (value == NULL)) - return (-1); - if (value[0] == 0) - return (0); - if (xmlStrEqual(value, BAD_CAST "#all")) { - if (flagAll != -1) - *flags |= flagAll; - else { - if (flagExtension != -1) - *flags |= flagExtension; - if (flagRestriction != -1) - *flags |= flagRestriction; - if (flagSubstitution != -1) - *flags |= flagSubstitution; - if (flagList != -1) - *flags |= flagList; - if (flagUnion != -1) - *flags |= flagUnion; - } - } else { - const xmlChar *end, *cur = value; - xmlChar *item; - - do { - while (IS_BLANK_CH(*cur)) - cur++; - end = cur; - while ((*end != 0) && (!(IS_BLANK_CH(*end)))) - end++; - if (end == cur) - break; - item = xmlStrndup(cur, end - cur); - if (xmlStrEqual(item, BAD_CAST "extension")) { - if (flagExtension != -1) { - if ((*flags & flagExtension) == 0) - *flags |= flagExtension; - } else - ret = 1; - } else if (xmlStrEqual(item, BAD_CAST "restriction")) { - if (flagRestriction != -1) { - if ((*flags & flagRestriction) == 0) - *flags |= flagRestriction; - } else - ret = 1; - } else if (xmlStrEqual(item, BAD_CAST "substitution")) { - if (flagSubstitution != -1) { - if ((*flags & flagSubstitution) == 0) - *flags |= flagSubstitution; - } else - ret = 1; - } else if (xmlStrEqual(item, BAD_CAST "list")) { - if (flagList != -1) { - if ((*flags & flagList) == 0) - *flags |= flagList; - } else - ret = 1; - } else if (xmlStrEqual(item, BAD_CAST "union")) { - if (flagUnion != -1) { - if ((*flags & flagUnion) == 0) - *flags |= flagUnion; - } else - ret = 1; - } else - ret = 1; - if (item != NULL) - xmlFree(item); - cur = end; - } while ((ret == 0) && (*cur != 0)); - } - - return (ret); -} - -static int -xmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaIDCPtr idc, - xmlSchemaIDCSelectPtr selector, - xmlAttrPtr attr, - int isField) -{ - xmlNodePtr node; - - /* - * c-selector-xpath: - * Schema Component Constraint: Selector Value OK - * - * TODO: 1 The {selector} must be a valid XPath expression, as defined - * in [XPath]. - */ - if (selector == NULL) { - xmlSchemaPErr(ctxt, idc->node, - XML_SCHEMAP_INTERNAL, - "Internal error: xmlSchemaCheckCSelectorXPath, " - "the selector is not specified.\n", NULL, NULL); - return (-1); - } - if (attr == NULL) - node = idc->node; - else - node = (xmlNodePtr) attr; - if (selector->xpath == NULL) { - xmlSchemaPCustomErr(ctxt, - /* TODO: Adjust error code. */ - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, node, - "The XPath expression of the selector is not valid", NULL); - return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE); - } else { - const xmlChar **nsArray = NULL; - xmlNsPtr *nsList = NULL; - /* - * Compile the XPath expression. - */ - /* - * TODO: We need the array of in-scope namespaces for compilation. - * TODO: Call xmlPatterncompile with different options for selector/ - * field. - */ - if (attr == NULL) - nsList = NULL; - else - nsList = xmlGetNsList(attr->doc, attr->parent); - /* - * Build an array of prefixes and namespaces. - */ - if (nsList != NULL) { - int i, count = 0; - - for (i = 0; nsList[i] != NULL; i++) - count++; - - nsArray = (const xmlChar **) xmlMalloc( - (count * 2 + 1) * sizeof(const xmlChar *)); - if (nsArray == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating a namespace array", - NULL); - xmlFree(nsList); - return (-1); - } - for (i = 0; i < count; i++) { - nsArray[2 * i] = nsList[i]->href; - nsArray[2 * i + 1] = nsList[i]->prefix; - } - nsArray[count * 2] = NULL; - xmlFree(nsList); - } - /* - * TODO: Differentiate between "selector" and "field". - */ - if (isField) - selector->xpathComp = (void *) xmlPatterncompile(selector->xpath, - NULL, XML_PATTERN_XSFIELD, nsArray); - else - selector->xpathComp = (void *) xmlPatterncompile(selector->xpath, - NULL, XML_PATTERN_XSSEL, nsArray); - if (nsArray != NULL) - xmlFree((xmlChar **) nsArray); - - if (selector->xpathComp == NULL) { - xmlSchemaPCustomErr(ctxt, - /* TODO: Adjust error code? */ - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, node, - "The XPath expression '%s' could not be " - "compiled", selector->xpath); - return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE); - } - } - return (0); -} - -#define ADD_ANNOTATION(annot) \ - xmlSchemaAnnotPtr cur = item->annot; \ - if (item->annot == NULL) { \ - item->annot = annot; \ - return (annot); \ - } \ - cur = item->annot; \ - if (cur->next != NULL) { \ - cur = cur->next; \ - } \ - cur->next = annot; - -/** - * xmlSchemaAssignAnnotation: - * @item: the schema component - * @annot: the annotation - * - * Adds the annotation to the given schema component. - * - * Returns the given annotaion. - */ -static xmlSchemaAnnotPtr -xmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem, - xmlSchemaAnnotPtr annot) -{ - if ((annItem == NULL) || (annot == NULL)) - return (NULL); - switch (annItem->type) { - case XML_SCHEMA_TYPE_ELEMENT: { - xmlSchemaElementPtr item = (xmlSchemaElementPtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_TYPE_ATTRIBUTE: { - xmlSchemaAttributePtr item = (xmlSchemaAttributePtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: - case XML_SCHEMA_TYPE_ANY: { - xmlSchemaWildcardPtr item = (xmlSchemaWildcardPtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_TYPE_PARTICLE: - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_KEYREF: - case XML_SCHEMA_TYPE_IDC_UNIQUE: { - xmlSchemaAnnotItemPtr item = (xmlSchemaAnnotItemPtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: { - xmlSchemaAttributeGroupPtr item = - (xmlSchemaAttributeGroupPtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_TYPE_NOTATION: { - xmlSchemaNotationPtr item = (xmlSchemaNotationPtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_FACET_MININCLUSIVE: - case XML_SCHEMA_FACET_MINEXCLUSIVE: - case XML_SCHEMA_FACET_MAXINCLUSIVE: - case XML_SCHEMA_FACET_MAXEXCLUSIVE: - case XML_SCHEMA_FACET_TOTALDIGITS: - case XML_SCHEMA_FACET_FRACTIONDIGITS: - case XML_SCHEMA_FACET_PATTERN: - case XML_SCHEMA_FACET_ENUMERATION: - case XML_SCHEMA_FACET_WHITESPACE: - case XML_SCHEMA_FACET_LENGTH: - case XML_SCHEMA_FACET_MAXLENGTH: - case XML_SCHEMA_FACET_MINLENGTH: { - xmlSchemaFacetPtr item = (xmlSchemaFacetPtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_TYPE_SIMPLE: - case XML_SCHEMA_TYPE_COMPLEX: { - xmlSchemaTypePtr item = (xmlSchemaTypePtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_TYPE_GROUP: { - xmlSchemaModelGroupDefPtr item = (xmlSchemaModelGroupDefPtr) annItem; - ADD_ANNOTATION(annot) - } - break; - case XML_SCHEMA_TYPE_SEQUENCE: - case XML_SCHEMA_TYPE_CHOICE: - case XML_SCHEMA_TYPE_ALL: { - xmlSchemaModelGroupPtr item = (xmlSchemaModelGroupPtr) annItem; - ADD_ANNOTATION(annot) - } - break; - default: - xmlSchemaPCustomErr(NULL, - XML_SCHEMAP_INTERNAL, - NULL, NULL, - "Internal error: xmlSchemaAddAnnotation, " - "The item is not a annotated schema component", NULL); - break; - } - return (annot); -} - -/** - * xmlSchemaParseIDCSelectorAndField: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * Parses a XML Schema identity-contraint definition's - * <selector> and <field> elements. - * - * Returns the parsed identity-constraint definition. - */ -static xmlSchemaIDCSelectPtr -xmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaIDCPtr idc, - xmlNodePtr node, - int isField) -{ - xmlSchemaIDCSelectPtr item; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "xpath"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* - * Create the item. - */ - item = (xmlSchemaIDCSelectPtr) xmlMalloc(sizeof(xmlSchemaIDCSelect)); - if (item == NULL) { - xmlSchemaPErrMemory(ctxt, - "allocating a 'selector' of an identity-constraint definition", - NULL); - return (NULL); - } - memset(item, 0, sizeof(xmlSchemaIDCSelect)); - /* - * Attribute "xpath" (mandatory). - */ - attr = xmlSchemaGetPropNode(node, "xpath"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, - "name", NULL); - } else { - item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - /* - * URGENT TODO: "field"s have an other syntax than "selector"s. - */ - - if (xmlSchemaCheckCSelectorXPath(ctxt, idc, item, attr, - isField) == -1) { - xmlSchemaPErr(ctxt, - (xmlNodePtr) attr, - XML_SCHEMAP_INTERNAL, - "Internal error: xmlSchemaParseIDCSelectorAndField, " - "validating the XPath expression of a IDC selector.\n", - NULL, NULL); - } - - } - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - /* - * Add the annotation to the parent IDC. - */ - xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc, - xmlSchemaParseAnnotation(ctxt, child, 1)); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?)"); - } - - return (item); -} - -/** - * xmlSchemaParseIDC: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * Parses a XML Schema identity-contraint definition. - * - * Returns the parsed identity-constraint definition. - */ -static xmlSchemaIDCPtr -xmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - xmlSchemaTypeType idcCategory, - const xmlChar *targetNamespace) -{ - xmlSchemaIDCPtr item = NULL; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - const xmlChar *name = NULL; - xmlSchemaIDCSelectPtr field = NULL, lastField = NULL; - - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "name")) && - ((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) || - (!xmlStrEqual(attr->name, BAD_CAST "refer")))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* - * Attribute "name" (mandatory). - */ - attr = xmlSchemaGetPropNode(node, "name"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, - "name", NULL); - return (NULL); - } else if (xmlSchemaPValAttrNode(ctxt, - NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { - return (NULL); - } - /* Create the component. */ - item = xmlSchemaAddIDC(ctxt, schema, name, targetNamespace, - idcCategory, node); - if (item == NULL) - return(NULL); - - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) { - /* - * Attribute "refer" (mandatory). - */ - attr = xmlSchemaGetPropNode(node, "refer"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, - "refer", NULL); - } else { - /* - * Create a reference item. - */ - item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY, - NULL, NULL); - if (item->ref == NULL) - return (NULL); - xmlSchemaPValAttrNodeQName(ctxt, schema, - NULL, attr, - &(item->ref->targetNamespace), - &(item->ref->name)); - xmlSchemaCheckReference(ctxt, schema, node, attr, - item->ref->targetNamespace); - } - } - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (child == NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_MISSING, - NULL, node, child, - "A child element is missing", - "(annotation?, (selector, field+))"); - } - /* - * Child element <selector>. - */ - if (IS_SCHEMA(child, "selector")) { - item->selector = xmlSchemaParseIDCSelectorAndField(ctxt, - item, child, 0); - child = child->next; - /* - * Child elements <field>. - */ - if (IS_SCHEMA(child, "field")) { - do { - field = xmlSchemaParseIDCSelectorAndField(ctxt, - item, child, 1); - if (field != NULL) { - field->index = item->nbFields; - item->nbFields++; - if (lastField != NULL) - lastField->next = field; - else - item->fields = field; - lastField = field; - } - child = child->next; - } while (IS_SCHEMA(child, "field")); - } else { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?, (selector, field+))"); - } - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?, (selector, field+))"); - } - - return (item); -} - -/** - * xmlSchemaParseElement: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * @topLevel: indicates if this is global declaration - * - * Parses a XML schema element declaration. - * *WARNING* this interface is highly subject to change - * - * Returns the element declaration or a particle; NULL in case - * of an error or if the particle has minOccurs==maxOccurs==0. - */ -static xmlSchemaBasicItemPtr -xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node, int *isElemRef, int topLevel) -{ - xmlSchemaElementPtr decl = NULL; - xmlSchemaParticlePtr particle = NULL; - xmlSchemaAnnotPtr annot = NULL; - xmlNodePtr child = NULL; - xmlAttrPtr attr, nameAttr; - int min, max, isRef = 0; - xmlChar *des = NULL; - - /* 3.3.3 Constraints on XML Representations of Element Declarations */ - /* TODO: Complete implementation of 3.3.6 */ - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - if (isElemRef != NULL) - *isElemRef = 0; - /* - * If we get a "ref" attribute on a local <element> we will assume it's - * a reference - even if there's a "name" attribute; this seems to be more - * robust. - */ - nameAttr = xmlSchemaGetPropNode(node, "name"); - attr = xmlSchemaGetPropNode(node, "ref"); - if ((topLevel) || (attr == NULL)) { - if (nameAttr == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "name", NULL); - return (NULL); - } - } else - isRef = 1; - - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - /* - * Skip particle part if a global declaration. - */ - if (topLevel) - goto declaration_part; - /* - * The particle part ================================================== - */ - min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); - max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)"); - xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); - particle = xmlSchemaAddParticle(ctxt, node, min, max); - if (particle == NULL) - goto return_null; - - /* ret->flags |= XML_SCHEMAS_ELEM_REF; */ - - if (isRef) { - const xmlChar *refNs = NULL, *ref = NULL; - xmlSchemaQNameRefPtr refer = NULL; - /* - * The reference part ============================================= - */ - if (isElemRef != NULL) - *isElemRef = 1; - - xmlSchemaPValAttrNodeQName(ctxt, schema, - NULL, attr, &refNs, &ref); - xmlSchemaCheckReference(ctxt, schema, node, attr, refNs); - /* - * SPEC (3.3.3 : 2.1) "One of ref or name must be present, but not both" - */ - if (nameAttr != NULL) { - xmlSchemaPMutualExclAttrErr(ctxt, - XML_SCHEMAP_SRC_ELEMENT_2_1, NULL, nameAttr, "ref", "name"); - } - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if (xmlStrEqual(attr->name, BAD_CAST "ref") || - xmlStrEqual(attr->name, BAD_CAST "name") || - xmlStrEqual(attr->name, BAD_CAST "id") || - xmlStrEqual(attr->name, BAD_CAST "maxOccurs") || - xmlStrEqual(attr->name, BAD_CAST "minOccurs")) - { - attr = attr->next; - continue; - } else { - /* SPEC (3.3.3 : 2.2) */ - xmlSchemaPCustomAttrErr(ctxt, - XML_SCHEMAP_SRC_ELEMENT_2_2, - NULL, NULL, attr, - "Only the attributes 'minOccurs', 'maxOccurs' and " - "'id' are allowed in addition to 'ref'"); - break; - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* - * No children except <annotation> expected. - */ - if (child != NULL) { - xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, "(annotation?)"); - } - if ((min == 0) && (max == 0)) - goto return_null; - /* - * Create the reference item and attach it to the particle. - */ - refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT, - ref, refNs); - if (refer == NULL) - goto return_null; - particle->children = (xmlSchemaTreeItemPtr) refer; - particle->annot = annot; - /* - * Add the particle to pending components, since the reference - * need to be resolved. - */ - WXS_ADD_PENDING(ctxt, particle); - return ((xmlSchemaBasicItemPtr) particle); - } - /* - * The declaration part =============================================== - */ -declaration_part: - { - const xmlChar *ns = NULL, *fixed, *name, *attrValue; - xmlSchemaIDCPtr curIDC = NULL, lastIDC = NULL; - - if (xmlSchemaPValAttrNode(ctxt, NULL, nameAttr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) - goto return_null; - /* - * Evaluate the target namespace. - */ - if (topLevel) { - ns = ctxt->targetNamespace; - } else { - attr = xmlSchemaGetPropNode(node, "form"); - if (attr != NULL) { - attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - if (xmlStrEqual(attrValue, BAD_CAST "qualified")) { - ns = ctxt->targetNamespace; - } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, - NULL, "(qualified | unqualified)", - attrValue, NULL, NULL, NULL); - } - } else if (schema->flags & XML_SCHEMAS_QUALIF_ELEM) - ns = ctxt->targetNamespace; - } - decl = xmlSchemaAddElement(ctxt, name, ns, node, topLevel); - if (decl == NULL) { - goto return_null; - } - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && - (!xmlStrEqual(attr->name, BAD_CAST "type")) && - (!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "default")) && - (!xmlStrEqual(attr->name, BAD_CAST "fixed")) && - (!xmlStrEqual(attr->name, BAD_CAST "block")) && - (!xmlStrEqual(attr->name, BAD_CAST "nillable"))) - { - if (topLevel == 0) { - if ((!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && - (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && - (!xmlStrEqual(attr->name, BAD_CAST "form"))) - { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if ((!xmlStrEqual(attr->name, BAD_CAST "final")) && - (!xmlStrEqual(attr->name, BAD_CAST "abstract")) && - (!xmlStrEqual(attr->name, BAD_CAST "substitutionGroup"))) { - - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* - * Extract/validate attributes. - */ - if (topLevel) { - /* - * Process top attributes of global element declarations here. - */ - decl->flags |= XML_SCHEMAS_ELEM_GLOBAL; - decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL; - xmlSchemaPValAttrQName(ctxt, schema, - NULL, node, "substitutionGroup", - &(decl->substGroupNs), &(decl->substGroup)); - if (xmlGetBooleanProp(ctxt, node, "abstract", 0)) - decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT; - /* - * Attribute "final". - */ - attr = xmlSchemaGetPropNode(node, "final"); - if (attr == NULL) { - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) - decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION; - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) - decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION; - } else { - attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags), - -1, - XML_SCHEMAS_ELEM_FINAL_EXTENSION, - XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, - NULL, "(#all | List of (extension | restriction))", - attrValue, NULL, NULL, NULL); - } - } - } - /* - * Attribute "block". - */ - attr = xmlSchemaGetPropNode(node, "block"); - if (attr == NULL) { - /* - * Apply default "block" values. - */ - if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) - decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION; - if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) - decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION; - if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION) - decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION; - } else { - attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags), - -1, - XML_SCHEMAS_ELEM_BLOCK_EXTENSION, - XML_SCHEMAS_ELEM_BLOCK_RESTRICTION, - XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, - NULL, "(#all | List of (extension | " - "restriction | substitution))", attrValue, - NULL, NULL, NULL); - } - } - if (xmlGetBooleanProp(ctxt, node, "nillable", 0)) - decl->flags |= XML_SCHEMAS_ELEM_NILLABLE; - - attr = xmlSchemaGetPropNode(node, "type"); - if (attr != NULL) { - xmlSchemaPValAttrNodeQName(ctxt, schema, - NULL, attr, - &(decl->namedTypeNs), &(decl->namedType)); - xmlSchemaCheckReference(ctxt, schema, node, - attr, decl->namedTypeNs); - } - decl->value = xmlSchemaGetProp(ctxt, node, "default"); - attr = xmlSchemaGetPropNode(node, "fixed"); - if (attr != NULL) { - fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - if (decl->value != NULL) { - /* - * 3.3.3 : 1 - * default and fixed must not both be present. - */ - xmlSchemaPMutualExclAttrErr(ctxt, - XML_SCHEMAP_SRC_ELEMENT_1, - NULL, attr, "default", "fixed"); - } else { - decl->flags |= XML_SCHEMAS_ELEM_FIXED; - decl->value = fixed; - } - } - /* - * And now for the children... - */ - if (IS_SCHEMA(child, "complexType")) { - /* - * 3.3.3 : 3 - * "type" and either <simpleType> or <complexType> are mutually - * exclusive - */ - if (decl->namedType != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_SRC_ELEMENT_3, - NULL, node, child, - "The attribute 'type' and the <complexType> child are " - "mutually exclusive", NULL); - } else - WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt, schema, child, 0); - child = child->next; - } else if (IS_SCHEMA(child, "simpleType")) { - /* - * 3.3.3 : 3 - * "type" and either <simpleType> or <complexType> are - * mutually exclusive - */ - if (decl->namedType != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_SRC_ELEMENT_3, - NULL, node, child, - "The attribute 'type' and the <simpleType> child are " - "mutually exclusive", NULL); - } else - WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt, schema, child, 0); - child = child->next; - } - while ((IS_SCHEMA(child, "unique")) || - (IS_SCHEMA(child, "key")) || (IS_SCHEMA(child, "keyref"))) { - if (IS_SCHEMA(child, "unique")) { - curIDC = xmlSchemaParseIDC(ctxt, schema, child, - XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace); - } else if (IS_SCHEMA(child, "key")) { - curIDC = xmlSchemaParseIDC(ctxt, schema, child, - XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace); - } else if (IS_SCHEMA(child, "keyref")) { - curIDC = xmlSchemaParseIDC(ctxt, schema, child, - XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace); - } - if (lastIDC != NULL) - lastIDC->next = curIDC; - else - decl->idcs = (void *) curIDC; - lastIDC = curIDC; - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?, ((simpleType | complexType)?, " - "(unique | key | keyref)*))"); - } - decl->annot = annot; - } - /* - * NOTE: Element Declaration Representation OK 4. will be checked at a - * different layer. - */ - FREE_AND_NULL(des) - if (topLevel) - return ((xmlSchemaBasicItemPtr) decl); - else { - particle->children = (xmlSchemaTreeItemPtr) decl; - return ((xmlSchemaBasicItemPtr) particle); - } - -return_null: - FREE_AND_NULL(des); - if (annot != NULL) { - if (particle != NULL) - particle->annot = NULL; - if (decl != NULL) - decl->annot = NULL; - xmlSchemaFreeAnnot(annot); - } - return (NULL); -} - -/** - * xmlSchemaParseUnion: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Union definition - * *WARNING* this interface is highly subject to change - * - * Returns -1 in case of internal error, 0 in case of success and a positive - * error code otherwise. - */ -static int -xmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlSchemaTypePtr type; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - const xmlChar *cur = NULL; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (-1); - /* Not a component, don't create it. */ - type = ctxt->ctxtType; - /* - * Mark the simple type as being of variety "union". - */ - type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION; - /* - * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen, - * then the ·simple ur-type definition·." - */ - type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "memberTypes"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * Attribute "memberTypes". This is a list of QNames. - * TODO: Check the value to contain anything. - */ - attr = xmlSchemaGetPropNode(node, "memberTypes"); - if (attr != NULL) { - const xmlChar *end; - xmlChar *tmp; - const xmlChar *localName, *nsName; - xmlSchemaTypeLinkPtr link, lastLink = NULL; - xmlSchemaQNameRefPtr ref; - - cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - type->base = cur; - do { - while (IS_BLANK_CH(*cur)) - cur++; - end = cur; - while ((*end != 0) && (!(IS_BLANK_CH(*end)))) - end++; - if (end == cur) - break; - tmp = xmlStrndup(cur, end - cur); - if (xmlSchemaPValAttrNodeQNameValue(ctxt, schema, - NULL, attr, BAD_CAST tmp, &nsName, &localName) == 0) { - /* - * Create the member type link. - */ - link = (xmlSchemaTypeLinkPtr) - xmlMalloc(sizeof(xmlSchemaTypeLink)); - if (link == NULL) { - xmlSchemaPErrMemory(ctxt, "xmlSchemaParseUnion, " - "allocating a type link", NULL); - return (-1); - } - link->type = NULL; - link->next = NULL; - if (lastLink == NULL) - type->memberTypes = link; - else - lastLink->next = link; - lastLink = link; - /* - * Create a reference item. - */ - ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE, - localName, nsName); - if (ref == NULL) { - FREE_AND_NULL(tmp) - return (-1); - } - /* - * Assign the reference to the link, it will be resolved - * later during fixup of the union simple type. - */ - link->type = (xmlSchemaTypePtr) ref; - } - FREE_AND_NULL(tmp) - cur = end; - } while (*cur != 0); - - } - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - /* - * Add the annotation to the simple type ancestor. - */ - xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, - xmlSchemaParseAnnotation(ctxt, child, 1)); - child = child->next; - } - if (IS_SCHEMA(child, "simpleType")) { - xmlSchemaTypePtr subtype, last = NULL; - - /* - * Anchor the member types in the "subtypes" field of the - * simple type. - */ - while (IS_SCHEMA(child, "simpleType")) { - subtype = (xmlSchemaTypePtr) - xmlSchemaParseSimpleType(ctxt, schema, child, 0); - if (subtype != NULL) { - if (last == NULL) { - type->subtypes = subtype; - last = subtype; - } else { - last->next = subtype; - last = subtype; - } - last->next = NULL; - } - child = child->next; - } - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, "(annotation?, simpleType*)"); - } - if ((attr == NULL) && (type->subtypes == NULL)) { - /* - * src-union-memberTypes-or-simpleTypes - * Either the memberTypes [attribute] of the <union> element must - * be non-empty or there must be at least one simpleType [child]. - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES, - NULL, node, - "Either the attribute 'memberTypes' or " - "at least one <simpleType> child must be present", NULL); - } - return (0); -} - -/** - * xmlSchemaParseList: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema List definition - * *WARNING* this interface is highly subject to change - * - * Returns -1 in case of error, 0 if the declaration is improper and - * 1 in case of success. - */ -static xmlSchemaTypePtr -xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlSchemaTypePtr type; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - /* Not a component, don't create it. */ - type = ctxt->ctxtType; - /* - * Mark the type as being of variety "list". - */ - type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; - /* - * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen, - * then the ·simple ur-type definition·." - */ - type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "itemType"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - - /* - * Attribute "itemType". NOTE that we will use the "ref" and "refNs" - * fields for holding the reference to the itemType. - * - * REVAMP TODO: Use the "base" and "baseNs" fields, since we will remove - * the "ref" fields. - */ - xmlSchemaPValAttrQName(ctxt, schema, NULL, - node, "itemType", &(type->baseNs), &(type->base)); - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, - xmlSchemaParseAnnotation(ctxt, child, 1)); - child = child->next; - } - if (IS_SCHEMA(child, "simpleType")) { - /* - * src-list-itemType-or-simpleType - * Either the itemType [attribute] or the <simpleType> [child] of - * the <list> element must be present, but not both. - */ - if (type->base != NULL) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_SIMPLE_TYPE_1, - NULL, node, - "The attribute 'itemType' and the <simpleType> child " - "are mutually exclusive", NULL); - } else { - type->subtypes = xmlSchemaParseSimpleType(ctxt, schema, child, 0); - } - child = child->next; - } else if (type->base == NULL) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_SIMPLE_TYPE_1, - NULL, node, - "Either the attribute 'itemType' or the <simpleType> child " - "must be present", NULL); - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, "(annotation?, simpleType?)"); - } - if ((type->base == NULL) && - (type->subtypes == NULL) && - (xmlSchemaGetPropNode(node, "itemType") == NULL)) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_SIMPLE_TYPE_1, - NULL, node, - "Either the attribute 'itemType' or the <simpleType> child " - "must be present", NULL); - } - return (NULL); -} - -/** - * xmlSchemaParseSimpleType: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Simple Type definition - * *WARNING* this interface is highly subject to change - * - * Returns -1 in case of error, 0 if the declaration is improper and - * 1 in case of success. - */ -static xmlSchemaTypePtr -xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node, int topLevel) -{ - xmlSchemaTypePtr type, oldCtxtType; - xmlNodePtr child = NULL; - const xmlChar *attrValue = NULL; - xmlAttrPtr attr; - int hasRestriction = 0; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - if (topLevel) { - attr = xmlSchemaGetPropNode(node, "name"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, - "name", NULL); - return (NULL); - } else { - if (xmlSchemaPValAttrNode(ctxt, - NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) - return (NULL); - /* - * Skip built-in types. - */ - if (ctxt->isS4S) { - xmlSchemaTypePtr biType; - - if (ctxt->isRedefine) { - /* - * REDEFINE: Disallow redefinition of built-in-types. - * TODO: It seems that the spec does not say anything - * about this case. - */ - xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, - NULL, node, - "Redefinition of built-in simple types is not " - "supported", NULL); - return(NULL); - } - biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs); - if (biType != NULL) - return (biType); - } - } - } - /* - * TargetNamespace: - * SPEC "The ·actual value· of the targetNamespace [attribute] - * of the <schema> ancestor element information item if present, - * otherwise ·absent·. - */ - if (topLevel == 0) { -#ifdef ENABLE_NAMED_LOCALS - char buf[40]; -#endif - /* - * Parse as local simple type definition. - */ -#ifdef ENABLE_NAMED_LOCALS - snprintf(buf, 39, "#ST%d", ctxt->counter++ + 1); - type = xmlSchemaAddType(ctxt, schema, - XML_SCHEMA_TYPE_SIMPLE, - xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1), - ctxt->targetNamespace, node, 0); -#else - type = xmlSchemaAddType(ctxt, schema, - XML_SCHEMA_TYPE_SIMPLE, - NULL, ctxt->targetNamespace, node, 0); -#endif - if (type == NULL) - return (NULL); - type->type = XML_SCHEMA_TYPE_SIMPLE; - type->contentType = XML_SCHEMA_CONTENT_SIMPLE; - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if (!xmlStrEqual(attr->name, BAD_CAST "id")) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - } else { - /* - * Parse as global simple type definition. - * - * Note that attrValue is the value of the attribute "name" here. - */ - type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE, - attrValue, ctxt->targetNamespace, node, 1); - if (type == NULL) - return (NULL); - type->type = XML_SCHEMA_TYPE_SIMPLE; - type->contentType = XML_SCHEMA_CONTENT_SIMPLE; - type->flags |= XML_SCHEMAS_TYPE_GLOBAL; - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "name")) && - (!xmlStrEqual(attr->name, BAD_CAST "final"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* - * Attribute "final". - */ - attr = xmlSchemaGetPropNode(node, "final"); - if (attr == NULL) { - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) - type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION; - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST) - type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST; - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION) - type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION; - } else { - attrValue = xmlSchemaGetProp(ctxt, node, "final"); - if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags), - -1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1, - XML_SCHEMAS_TYPE_FINAL_LIST, - XML_SCHEMAS_TYPE_FINAL_UNION) != 0) { - - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - WXS_BASIC_CAST type, (xmlNodePtr) attr, - NULL, "(#all | List of (list | union | restriction)", - attrValue, NULL, NULL, NULL); - } - } - } - type->targetNamespace = ctxt->targetNamespace; - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * And now for the children... - */ - oldCtxtType = ctxt->ctxtType; - - ctxt->ctxtType = type; - - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - type->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (child == NULL) { - xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING, - NULL, node, child, NULL, - "(annotation?, (restriction | list | union))"); - } else if (IS_SCHEMA(child, "restriction")) { - xmlSchemaParseRestriction(ctxt, schema, child, - XML_SCHEMA_TYPE_SIMPLE); - hasRestriction = 1; - child = child->next; - } else if (IS_SCHEMA(child, "list")) { - xmlSchemaParseList(ctxt, schema, child); - child = child->next; - } else if (IS_SCHEMA(child, "union")) { - xmlSchemaParseUnion(ctxt, schema, child); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, (restriction | list | union))"); - } - /* - * REDEFINE: SPEC src-redefine (5) - * "Within the [children], each <simpleType> must have a - * <restriction> among its [children] ... the ·actual value· of whose - * base [attribute] must be the same as the ·actual value· of its own - * name attribute plus target namespace;" - */ - if (topLevel && ctxt->isRedefine && (! hasRestriction)) { - xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, - NULL, node, "This is a redefinition, thus the " - "<simpleType> must have a <restriction> child", NULL); - } - - ctxt->ctxtType = oldCtxtType; - return (type); -} - -/** - * xmlSchemaParseModelGroupDefRef: - * @ctxt: the parser context - * @schema: the schema being built - * @node: the node - * - * Parses a reference to a model group definition. - * - * We will return a particle component with a qname-component or - * NULL in case of an error. - */ -static xmlSchemaTreeItemPtr -xmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlSchemaParticlePtr item; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - const xmlChar *ref = NULL, *refNs = NULL; - int min, max; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - attr = xmlSchemaGetPropNode(node, "ref"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "ref", NULL); - return (NULL); - } else if (xmlSchemaPValAttrNodeQName(ctxt, schema, NULL, - attr, &refNs, &ref) != 0) { - return (NULL); - } - xmlSchemaCheckReference(ctxt, schema, node, attr, refNs); - min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); - max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, - "(xs:nonNegativeInteger | unbounded)"); - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) && - (!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && - (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - item = xmlSchemaAddParticle(ctxt, node, min, max); - if (item == NULL) - return (NULL); - /* - * Create a qname-reference and set as the term; it will be substituted - * for the model group after the reference has been resolved. - */ - item->children = (xmlSchemaTreeItemPtr) - xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP, ref, refNs); - xmlSchemaPCheckParticleCorrect_2(ctxt, item, node, min, max); - /* - * And now for the children... - */ - child = node->children; - /* TODO: Is annotation even allowed for a model group reference? */ - if (IS_SCHEMA(child, "annotation")) { - /* - * TODO: What to do exactly with the annotation? - */ - item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?)"); - } - /* - * Corresponds to no component at all if minOccurs==maxOccurs==0. - */ - if ((min == 0) && (max == 0)) - return (NULL); - - return ((xmlSchemaTreeItemPtr) item); -} - -/** - * xmlSchemaParseModelGroupDefinition: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * Parses a XML schema model group definition. - * - * Note that the contraint src-redefine (6.2) can't be applied until - * references have been resolved. So we will do this at the - * component fixup level. - * - * *WARNING* this interface is highly subject to change - * - * Returns -1 in case of error, 0 if the declaration is improper and - * 1 in case of success. - */ -static xmlSchemaModelGroupDefPtr -xmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlSchemaModelGroupDefPtr item; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - const xmlChar *name; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - attr = xmlSchemaGetPropNode(node, "name"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, - "name", NULL); - return (NULL); - } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { - return (NULL); - } - item = xmlSchemaAddModelGroupDefinition(ctxt, schema, name, - ctxt->targetNamespace, node); - if (item == NULL) - return (NULL); - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && - (!xmlStrEqual(attr->name, BAD_CAST "id"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (IS_SCHEMA(child, "all")) { - item->children = xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_ALL, 0); - child = child->next; - } else if (IS_SCHEMA(child, "choice")) { - item->children = xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_CHOICE, 0); - child = child->next; - } else if (IS_SCHEMA(child, "sequence")) { - item->children = xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_SEQUENCE, 0); - child = child->next; - } - - - - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, (all | choice | sequence)?)"); - } - return (item); -} - -/** - * xmlSchemaCleanupDoc: - * @ctxt: a schema validation context - * @node: the root of the document. - * - * removes unwanted nodes in a schemas document tree - */ -static void -xmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr root) -{ - xmlNodePtr delete, cur; - - if ((ctxt == NULL) || (root == NULL)) return; - - /* - * Remove all the blank text nodes - */ - delete = NULL; - cur = root; - while (cur != NULL) { - if (delete != NULL) { - xmlUnlinkNode(delete); - xmlFreeNode(delete); - delete = NULL; - } - if (cur->type == XML_TEXT_NODE) { - if (IS_BLANK_NODE(cur)) { - if (xmlNodeGetSpacePreserve(cur) != 1) { - delete = cur; - } - } - } else if ((cur->type != XML_ELEMENT_NODE) && - (cur->type != XML_CDATA_SECTION_NODE)) { - delete = cur; - goto skip_children; - } - - /* - * Skip to next node - */ - 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; - } - } - skip_children: - if (cur->next != NULL) { - cur = cur->next; - continue; - } - - do { - cur = cur->parent; - if (cur == NULL) - break; - if (cur == root) { - cur = NULL; - break; - } - if (cur->next != NULL) { - cur = cur->next; - break; - } - } while (cur != NULL); - } - if (delete != NULL) { - xmlUnlinkNode(delete); - xmlFreeNode(delete); - delete = NULL; - } -} - - -static void -xmlSchemaClearSchemaDefaults(xmlSchemaPtr schema) -{ - if (schema->flags & XML_SCHEMAS_QUALIF_ELEM) - schema->flags ^= XML_SCHEMAS_QUALIF_ELEM; - - if (schema->flags & XML_SCHEMAS_QUALIF_ATTR) - schema->flags ^= XML_SCHEMAS_QUALIF_ATTR; - - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) - schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION; - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) - schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION; - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST) - schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST; - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION) - schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION; - - if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) - schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION; - if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) - schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION; - if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION) - schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION; -} - -static int -xmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlAttrPtr attr; - const xmlChar *val; - int res = 0, oldErrs = ctxt->nberrors; - - /* - * Those flags should be moved to the parser context flags, - * since they are not visible at the component level. I.e. - * they are used if processing schema *documents* only. - */ - res = xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - HFAILURE; - - /* - * Since the version is of type xs:token, we won't bother to - * check it. - */ - /* REMOVED: - attr = xmlSchemaGetPropNode(node, "version"); - if (attr != NULL) { - res = xmlSchemaPValAttrNode(ctxt, NULL, NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_TOKEN), &val); - HFAILURE; - } - */ - attr = xmlSchemaGetPropNode(node, "targetNamespace"); - if (attr != NULL) { - res = xmlSchemaPValAttrNode(ctxt, NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL); - HFAILURE; - if (res != 0) { - ctxt->stop = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; - goto exit; - } - } - attr = xmlSchemaGetPropNode(node, "elementFormDefault"); - if (attr != NULL) { - val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - res = xmlSchemaPValAttrFormDefault(val, &schema->flags, - XML_SCHEMAS_QUALIF_ELEM); - HFAILURE; - if (res != 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_ELEMFORMDEFAULT_VALUE, - NULL, (xmlNodePtr) attr, NULL, - "(qualified | unqualified)", val, NULL, NULL, NULL); - } - } - attr = xmlSchemaGetPropNode(node, "attributeFormDefault"); - if (attr != NULL) { - val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - res = xmlSchemaPValAttrFormDefault(val, &schema->flags, - XML_SCHEMAS_QUALIF_ATTR); - HFAILURE; - if (res != 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_ATTRFORMDEFAULT_VALUE, - NULL, (xmlNodePtr) attr, NULL, - "(qualified | unqualified)", val, NULL, NULL, NULL); - } - } - attr = xmlSchemaGetPropNode(node, "finalDefault"); - if (attr != NULL) { - val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1, - XML_SCHEMAS_FINAL_DEFAULT_EXTENSION, - XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION, - -1, - XML_SCHEMAS_FINAL_DEFAULT_LIST, - XML_SCHEMAS_FINAL_DEFAULT_UNION); - HFAILURE; - if (res != 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, NULL, - "(#all | List of (extension | restriction | list | union))", - val, NULL, NULL, NULL); - } - } - attr = xmlSchemaGetPropNode(node, "blockDefault"); - if (attr != NULL) { - val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); - res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1, - XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION, - XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION, - XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1); - HFAILURE; - if (res != 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, NULL, - "(#all | List of (extension | restriction | substitution))", - val, NULL, NULL, NULL); - } - } - -exit: - if (oldErrs != ctxt->nberrors) - res = ctxt->err; - return(res); -exit_failure: - return(-1); -} - -/** - * xmlSchemaParseSchemaTopLevel: - * @ctxt: a schema validation context - * @schema: the schemas - * @nodes: the list of top level nodes - * - * Returns the internal XML Schema structure built from the resource or - * NULL in case of error - */ -static int -xmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, xmlNodePtr nodes) -{ - xmlNodePtr child; - xmlSchemaAnnotPtr annot; - int res = 0, oldErrs, tmpOldErrs; - - if ((ctxt == NULL) || (schema == NULL) || (nodes == NULL)) - return(-1); - - oldErrs = ctxt->nberrors; - child = nodes; - while ((IS_SCHEMA(child, "include")) || - (IS_SCHEMA(child, "import")) || - (IS_SCHEMA(child, "redefine")) || - (IS_SCHEMA(child, "annotation"))) { - if (IS_SCHEMA(child, "annotation")) { - annot = xmlSchemaParseAnnotation(ctxt, child, 1); - if (schema->annot == NULL) - schema->annot = annot; - else - xmlSchemaFreeAnnot(annot); - } else if (IS_SCHEMA(child, "import")) { - tmpOldErrs = ctxt->nberrors; - res = xmlSchemaParseImport(ctxt, schema, child); - HFAILURE; - HSTOP(ctxt); - if (tmpOldErrs != ctxt->nberrors) - goto exit; - } else if (IS_SCHEMA(child, "include")) { - tmpOldErrs = ctxt->nberrors; - res = xmlSchemaParseInclude(ctxt, schema, child); - HFAILURE; - HSTOP(ctxt); - if (tmpOldErrs != ctxt->nberrors) - goto exit; - } else if (IS_SCHEMA(child, "redefine")) { - tmpOldErrs = ctxt->nberrors; - res = xmlSchemaParseRedefine(ctxt, schema, child); - HFAILURE; - HSTOP(ctxt); - if (tmpOldErrs != ctxt->nberrors) - goto exit; - } - child = child->next; - } - /* - * URGENT TODO: Change the functions to return int results. - * We need especially to catch internal errors. - */ - while (child != NULL) { - if (IS_SCHEMA(child, "complexType")) { - xmlSchemaParseComplexType(ctxt, schema, child, 1); - child = child->next; - } else if (IS_SCHEMA(child, "simpleType")) { - xmlSchemaParseSimpleType(ctxt, schema, child, 1); - child = child->next; - } else if (IS_SCHEMA(child, "element")) { - xmlSchemaParseElement(ctxt, schema, child, NULL, 1); - child = child->next; - } else if (IS_SCHEMA(child, "attribute")) { - xmlSchemaParseGlobalAttribute(ctxt, schema, child); - child = child->next; - } else if (IS_SCHEMA(child, "attributeGroup")) { - xmlSchemaParseAttributeGroupDefinition(ctxt, schema, child); - child = child->next; - } else if (IS_SCHEMA(child, "group")) { - xmlSchemaParseModelGroupDefinition(ctxt, schema, child); - child = child->next; - } else if (IS_SCHEMA(child, "notation")) { - xmlSchemaParseNotation(ctxt, schema, child); - child = child->next; - } else { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, child->parent, child, - NULL, "((include | import | redefine | annotation)*, " - "(((simpleType | complexType | group | attributeGroup) " - "| element | attribute | notation), annotation*)*)"); - child = child->next; - } - while (IS_SCHEMA(child, "annotation")) { - /* - * TODO: We should add all annotations. - */ - annot = xmlSchemaParseAnnotation(ctxt, child, 1); - if (schema->annot == NULL) - schema->annot = annot; - else - xmlSchemaFreeAnnot(annot); - child = child->next; - } - } -exit: - ctxt->ctxtType = NULL; - if (oldErrs != ctxt->nberrors) - res = ctxt->err; - return(res); -exit_failure: - return(-1); -} - -static xmlSchemaSchemaRelationPtr -xmlSchemaSchemaRelationCreate(void) -{ - xmlSchemaSchemaRelationPtr ret; - - ret = (xmlSchemaSchemaRelationPtr) - xmlMalloc(sizeof(xmlSchemaSchemaRelation)); - if (ret == NULL) { - xmlSchemaPErrMemory(NULL, "allocating schema relation", NULL); - return(NULL); - } - memset(ret, 0, sizeof(xmlSchemaSchemaRelation)); - return(ret); -} - -#if 0 -static void -xmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel) -{ - xmlFree(rel); -} -#endif - -static void -xmlSchemaRedefListFree(xmlSchemaRedefPtr redef) -{ - xmlSchemaRedefPtr prev; - - while (redef != NULL) { - prev = redef; - redef = redef->next; - xmlFree(prev); - } -} - -static void -xmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con) -{ - /* - * After the construction context has been freed, there will be - * no schema graph available any more. Only the schema buckets - * will stay alive, which are put into the "schemasImports" and - * "includes" slots of the xmlSchema. - */ - if (con->buckets != NULL) - xmlSchemaItemListFree(con->buckets); - if (con->pending != NULL) - xmlSchemaItemListFree(con->pending); - if (con->substGroups != NULL) - xmlHashFree(con->substGroups, - (xmlHashDeallocator) xmlSchemaSubstGroupFree); - if (con->redefs != NULL) - xmlSchemaRedefListFree(con->redefs); - if (con->dict != NULL) - xmlDictFree(con->dict); - xmlFree(con); -} - -static xmlSchemaConstructionCtxtPtr -xmlSchemaConstructionCtxtCreate(xmlDictPtr dict) -{ - xmlSchemaConstructionCtxtPtr ret; - - ret = (xmlSchemaConstructionCtxtPtr) - xmlMalloc(sizeof(xmlSchemaConstructionCtxt)); - if (ret == NULL) { - xmlSchemaPErrMemory(NULL, - "allocating schema construction context", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaConstructionCtxt)); - - ret->buckets = xmlSchemaItemListCreate(); - if (ret->buckets == NULL) { - xmlSchemaPErrMemory(NULL, - "allocating list of schema buckets", NULL); - xmlFree(ret); - return (NULL); - } - ret->pending = xmlSchemaItemListCreate(); - if (ret->pending == NULL) { - xmlSchemaPErrMemory(NULL, - "allocating list of pending global components", NULL); - xmlSchemaConstructionCtxtFree(ret); - return (NULL); - } - ret->dict = dict; - xmlDictReference(dict); - return(ret); -} - -static xmlSchemaParserCtxtPtr -xmlSchemaParserCtxtCreate(void) -{ - xmlSchemaParserCtxtPtr ret; - - ret = (xmlSchemaParserCtxtPtr) xmlMalloc(sizeof(xmlSchemaParserCtxt)); - if (ret == NULL) { - xmlSchemaPErrMemory(NULL, "allocating schema parser context", - NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaParserCtxt)); - ret->type = XML_SCHEMA_CTXT_PARSER; - ret->attrProhibs = xmlSchemaItemListCreate(); - if (ret->attrProhibs == NULL) { - xmlFree(ret); - return(NULL); - } - return(ret); -} - -/** - * xmlSchemaNewParserCtxtUseDict: - * @URL: the location of the schema - * @dict: the dictionary to be used - * - * Create an XML Schemas parse context for that file/resource expected - * to contain an XML Schemas file. - * - * Returns the parser context or NULL in case of error - */ -static xmlSchemaParserCtxtPtr -xmlSchemaNewParserCtxtUseDict(const char *URL, xmlDictPtr dict) -{ - xmlSchemaParserCtxtPtr ret; - - ret = xmlSchemaParserCtxtCreate(); - if (ret == NULL) - return (NULL); - ret->dict = dict; - xmlDictReference(dict); - if (URL != NULL) - ret->URL = xmlDictLookup(dict, (const xmlChar *) URL, -1); - return (ret); -} - -static int -xmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt) -{ - if (vctxt->pctxt == NULL) { - if (vctxt->schema != NULL) - vctxt->pctxt = - xmlSchemaNewParserCtxtUseDict("*", vctxt->schema->dict); - else - vctxt->pctxt = xmlSchemaNewParserCtxt("*"); - if (vctxt->pctxt == NULL) { - VERROR_INT("xmlSchemaCreatePCtxtOnVCtxt", - "failed to create a temp. parser context"); - return (-1); - } - /* TODO: Pass user data. */ - xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error, - vctxt->warning, vctxt->errCtxt); - xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror, - vctxt->errCtxt); - } - return (0); -} - -/** - * xmlSchemaGetSchemaBucket: - * @pctxt: the schema parser context - * @schemaLocation: the URI of the schema document - * - * Returns a schema bucket if it was already parsed. - * - * Returns a schema bucket if it was already parsed from - * @schemaLocation, NULL otherwise. - */ -static xmlSchemaBucketPtr -xmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt, - const xmlChar *schemaLocation) -{ - xmlSchemaBucketPtr cur; - xmlSchemaItemListPtr list; - - list = pctxt->constructor->buckets; - if (list->nbItems == 0) - return(NULL); - else { - int i; - for (i = 0; i < list->nbItems; i++) { - cur = (xmlSchemaBucketPtr) list->items[i]; - /* Pointer comparison! */ - if (cur->schemaLocation == schemaLocation) - return(cur); - } - } - return(NULL); -} - -static xmlSchemaBucketPtr -xmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt, - const xmlChar *schemaLocation, - const xmlChar *targetNamespace) -{ - xmlSchemaBucketPtr cur; - xmlSchemaItemListPtr list; - - list = pctxt->constructor->buckets; - if (list->nbItems == 0) - return(NULL); - else { - int i; - for (i = 0; i < list->nbItems; i++) { - cur = (xmlSchemaBucketPtr) list->items[i]; - /* Pointer comparison! */ - if ((cur->origTargetNamespace == NULL) && - (cur->schemaLocation == schemaLocation) && - (cur->targetNamespace == targetNamespace)) - return(cur); - } - } - return(NULL); -} - - -#define IS_BAD_SCHEMA_DOC(b) \ - (((b)->doc == NULL) && ((b)->schemaLocation != NULL)) - -static xmlSchemaBucketPtr -xmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt, - const xmlChar *targetNamespace, - int imported) -{ - xmlSchemaBucketPtr cur; - xmlSchemaItemListPtr list; - - list = pctxt->constructor->buckets; - if (list->nbItems == 0) - return(NULL); - else { - int i; - for (i = 0; i < list->nbItems; i++) { - cur = (xmlSchemaBucketPtr) list->items[i]; - if ((! IS_BAD_SCHEMA_DOC(cur)) && - (cur->origTargetNamespace == targetNamespace) && - ((imported && cur->imported) || - ((!imported) && (!cur->imported)))) - return(cur); - } - } - return(NULL); -} - -static int -xmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlSchemaBucketPtr bucket) -{ - int oldFlags; - xmlDocPtr oldDoc; - xmlNodePtr node; - int ret, oldErrs; - xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket; - - /* - * Save old values; reset the *main* schema. - * URGENT TODO: This is not good; move the per-document information - * to the parser. Get rid of passing the main schema to the - * parsing functions. - */ - oldFlags = schema->flags; - oldDoc = schema->doc; - if (schema->flags != 0) - xmlSchemaClearSchemaDefaults(schema); - schema->doc = bucket->doc; - pctxt->schema = schema; - /* - * Keep the current target namespace on the parser *not* on the - * main schema. - */ - pctxt->targetNamespace = bucket->targetNamespace; - WXS_CONSTRUCTOR(pctxt)->bucket = bucket; - - if ((bucket->targetNamespace != NULL) && - xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) { - /* - * We are parsing the schema for schemas! - */ - pctxt->isS4S = 1; - } - /* Mark it as parsed, even if parsing fails. */ - bucket->parsed++; - /* Compile the schema doc. */ - node = xmlDocGetRootElement(bucket->doc); - ret = xmlSchemaParseSchemaElement(pctxt, schema, node); - if (ret != 0) - goto exit; - /* An empty schema; just get out. */ - if (node->children == NULL) - goto exit; - oldErrs = pctxt->nberrors; - ret = xmlSchemaParseSchemaTopLevel(pctxt, schema, node->children); - if (ret != 0) - goto exit; - /* - * TODO: Not nice, but I'm not 100% sure we will get always an error - * as a result of the obove functions; so better rely on pctxt->err - * as well. - */ - if ((ret == 0) && (oldErrs != pctxt->nberrors)) { - ret = pctxt->err; - goto exit; - } - -exit: - WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket; - /* Restore schema values. */ - schema->doc = oldDoc; - schema->flags = oldFlags; - return(ret); -} - -static int -xmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlSchemaBucketPtr bucket) -{ - xmlSchemaParserCtxtPtr newpctxt; - int res = 0; - - if (bucket == NULL) - return(0); - if (bucket->parsed) { - PERROR_INT("xmlSchemaParseNewDoc", - "reparsing a schema doc"); - return(-1); - } - if (bucket->doc == NULL) { - PERROR_INT("xmlSchemaParseNewDoc", - "parsing a schema doc, but there's no doc"); - return(-1); - } - if (pctxt->constructor == NULL) { - PERROR_INT("xmlSchemaParseNewDoc", - "no constructor"); - return(-1); - } - /* Create and init the temporary parser context. */ - newpctxt = xmlSchemaNewParserCtxtUseDict( - (const char *) bucket->schemaLocation, pctxt->dict); - if (newpctxt == NULL) - return(-1); - newpctxt->constructor = pctxt->constructor; - /* - * TODO: Can we avoid that the parser knows about the main schema? - * It would be better if he knows about the current schema bucket - * only. - */ - newpctxt->schema = schema; - xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning, - pctxt->errCtxt); - xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror, - pctxt->errCtxt); - newpctxt->counter = pctxt->counter; - - - res = xmlSchemaParseNewDocWithContext(newpctxt, schema, bucket); - - /* Channel back errors and cleanup the temporary parser context. */ - if (res != 0) - pctxt->err = res; - pctxt->nberrors += newpctxt->nberrors; - pctxt->counter = newpctxt->counter; - newpctxt->constructor = NULL; - /* Free the parser context. */ - xmlSchemaFreeParserCtxt(newpctxt); - return(res); -} - -static void -xmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket, - xmlSchemaSchemaRelationPtr rel) -{ - xmlSchemaSchemaRelationPtr cur = bucket->relations; - - if (cur == NULL) { - bucket->relations = rel; - return; - } - while (cur->next != NULL) - cur = cur->next; - cur->next = rel; -} - - -static const xmlChar * -xmlSchemaBuildAbsoluteURI(xmlDictPtr dict, const xmlChar* location, - xmlNodePtr ctxtNode) -{ - /* - * Build an absolue location URI. - */ - if (location != NULL) { - if (ctxtNode == NULL) - return(location); - else { - xmlChar *base, *URI; - const xmlChar *ret = NULL; - - base = xmlNodeGetBase(ctxtNode->doc, ctxtNode); - if (base == NULL) { - URI = xmlBuildURI(location, ctxtNode->doc->URL); - } else { - URI = xmlBuildURI(location, base); - xmlFree(base); - } - if (URI != NULL) { - ret = xmlDictLookup(dict, URI, -1); - xmlFree(URI); - return(ret); - } - } - } - return(NULL); -} - - - -/** - * xmlSchemaAddSchemaDoc: - * @pctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * Parse an included (and to-be-redefined) XML schema document. - * - * Returns 0 on success, a positive error code on errors and - * -1 in case of an internal or API error. - */ - -static int -xmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt, - int type, /* import or include or redefine */ - const xmlChar *schemaLocation, - xmlDocPtr schemaDoc, - const char *schemaBuffer, - int schemaBufferLen, - xmlNodePtr invokingNode, - const xmlChar *sourceTargetNamespace, - const xmlChar *importNamespace, - xmlSchemaBucketPtr *bucket) -{ - const xmlChar *targetNamespace = NULL; - xmlSchemaSchemaRelationPtr relation = NULL; - xmlDocPtr doc = NULL; - int res = 0, err = 0, located = 0, preserveDoc = 0; - xmlSchemaBucketPtr bkt = NULL; - - if (bucket != NULL) - *bucket = NULL; - - switch (type) { - case XML_SCHEMA_SCHEMA_IMPORT: - case XML_SCHEMA_SCHEMA_MAIN: - err = XML_SCHEMAP_SRC_IMPORT; - break; - case XML_SCHEMA_SCHEMA_INCLUDE: - err = XML_SCHEMAP_SRC_INCLUDE; - break; - case XML_SCHEMA_SCHEMA_REDEFINE: - err = XML_SCHEMAP_SRC_REDEFINE; - break; - } - - - /* Special handling for the main schema: - * skip the location and relation logic and just parse the doc. - * We need just a bucket to be returned in this case. - */ - if ((type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt))) - goto doc_load; - - /* Note that we expect the location to be an absulute URI. */ - if (schemaLocation != NULL) { - bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation); - if ((bkt != NULL) && - (pctxt->constructor->bucket == bkt)) { - /* Report self-imports/inclusions/redefinitions. */ - - xmlSchemaCustomErr(ACTXT_CAST pctxt, err, - invokingNode, NULL, - "The schema must not import/include/redefine itself", - NULL, NULL); - goto exit; - } - } - /* - * Create a relation for the graph of schemas. - */ - relation = xmlSchemaSchemaRelationCreate(); - if (relation == NULL) - return(-1); - xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket, - relation); - relation->type = type; - - /* - * Save the namespace import information. - */ - if (WXS_IS_BUCKET_IMPMAIN(type)) { - relation->importNamespace = importNamespace; - if (schemaLocation == NULL) { - /* - * No location; this is just an import of the namespace. - * Note that we don't assign a bucket to the relation - * in this case. - */ - goto exit; - } - targetNamespace = importNamespace; - } - - /* Did we already fetch the doc? */ - if (bkt != NULL) { - /* TODO: The following nasty cases will produce an error. */ - if ((WXS_IS_BUCKET_IMPMAIN(type)) && (! bkt->imported)) { - /* We included/redefined and then try to import a schema. */ - xmlSchemaCustomErr(ACTXT_CAST pctxt, err, - invokingNode, NULL, - "The schema document '%s' cannot be imported, since " - "it was already included or redefined", - schemaLocation, NULL); - goto exit; - } else if ((! WXS_IS_BUCKET_IMPMAIN(type)) && (bkt->imported)) { - /* We imported and then try to include/redefine a schema. */ - xmlSchemaCustomErr(ACTXT_CAST pctxt, err, - invokingNode, NULL, - "The schema document '%s' cannot be included or " - "redefined, since it was already imported", - schemaLocation, NULL); - goto exit; - } - } - - if (WXS_IS_BUCKET_IMPMAIN(type)) { - /* - * Given that the schemaLocation [attribute] is only a hint, it is open - * to applications to ignore all but the first <import> for a given - * namespace, regardless of the ·actual value· of schemaLocation, but - * such a strategy risks missing useful information when new - * schemaLocations are offered. - * - * We will use the first <import> that comes with a location. - * Further <import>s *with* a location, will result in an error. - * TODO: Better would be to just report a warning here, but - * we'll try it this way until someone complains. - * - * Schema Document Location Strategy: - * 3 Based on the namespace name, identify an existing schema document, - * either as a resource which is an XML document or a <schema> element - * information item, in some local schema repository; - * 5 Attempt to resolve the namespace name to locate such a resource. - * - * NOTE: (3) and (5) are not supported. - */ - if (bkt != NULL) { - relation->bucket = bkt; - goto exit; - } - bkt = xmlSchemaGetSchemaBucketByTNS(pctxt, - importNamespace, 1); - - if (bkt != NULL) { - relation->bucket = bkt; - if (bkt->schemaLocation == NULL) { - /* First given location of the schema; load the doc. */ - bkt->schemaLocation = schemaLocation; - } else { - if (!xmlStrEqual(schemaLocation, - bkt->schemaLocation)) { - /* - * Additional location given; just skip it. - * URGENT TODO: We should report a warning here. - * res = XML_SCHEMAP_SRC_IMPORT; - */ - xmlSchemaCustomWarning(ACTXT_CAST pctxt, - XML_SCHEMAP_WARN_SKIP_SCHEMA, - invokingNode, NULL, - "Skipping import of schema located at '%s' for the " - "namespace '%s', since this namespace was already " - "imported with the schema located at '%s'", - schemaLocation, importNamespace, bkt->schemaLocation); - } - goto exit; - } - } - /* - * No bucket + first location: load the doc and create a - * bucket. - */ - } else { - /* <include> and <redefine> */ - if (bkt != NULL) { - - if ((bkt->origTargetNamespace == NULL) && - (bkt->targetNamespace != sourceTargetNamespace)) { - xmlSchemaBucketPtr chamel; - - /* - * Chameleon include/redefine: skip loading only if it was - * aleady build for the targetNamespace of the including - * schema. - */ - /* - * URGENT TODO: If the schema is a chameleon-include then copy - * the components into the including schema and modify the - * targetNamespace of those components, do nothing otherwise. - * NOTE: This is currently worked-around by compiling the - * chameleon for every destinct including targetNamespace; thus - * not performant at the moment. - * TODO: Check when the namespace in wildcards for chameleons - * needs to be converted: before we built wildcard intersections - * or after. - * Answer: after! - */ - chamel = xmlSchemaGetChameleonSchemaBucket(pctxt, - schemaLocation, sourceTargetNamespace); - if (chamel != NULL) { - /* A fitting chameleon was already parsed; NOP. */ - relation->bucket = chamel; - goto exit; - } - /* - * We need to parse the chameleon again for a different - * targetNamespace. - * CHAMELEON TODO: Optimize this by only parsing the - * chameleon once, and then copying the components to - * the new targetNamespace. - */ - bkt = NULL; - } else { - relation->bucket = bkt; - goto exit; - } - } - } - if ((bkt != NULL) && (bkt->doc != NULL)) { - PERROR_INT("xmlSchemaAddSchemaDoc", - "trying to load a schema doc, but a doc is already " - "assigned to the schema bucket"); - goto exit_failure; - } - -doc_load: - /* - * Load the document. - */ - if (schemaDoc != NULL) { - doc = schemaDoc; - /* Don' free this one, since it was provided by the caller. */ - preserveDoc = 1; - /* TODO: Does the context or the doc hold the location? */ - if (schemaDoc->URL != NULL) - schemaLocation = xmlDictLookup(pctxt->dict, - schemaDoc->URL, -1); - - } else if ((schemaLocation != NULL) || (schemaBuffer != NULL)) { - xmlParserCtxtPtr parserCtxt; - - parserCtxt = xmlNewParserCtxt(); - if (parserCtxt == NULL) { - xmlSchemaPErrMemory(NULL, "xmlSchemaGetDoc, " - "allocating a parser context", NULL); - goto exit_failure; - } - if ((pctxt->dict != NULL) && (parserCtxt->dict != NULL)) { - /* - * TODO: Do we have to burden the schema parser dict with all - * the content of the schema doc? - */ - xmlDictFree(parserCtxt->dict); - parserCtxt->dict = pctxt->dict; - xmlDictReference(parserCtxt->dict); - } - if (schemaLocation != NULL) { - /* Parse from file. */ - doc = xmlCtxtReadFile(parserCtxt, (const char *) schemaLocation, - NULL, SCHEMAS_PARSE_OPTIONS); - } else if (schemaBuffer != NULL) { - /* Parse from memory buffer. */ - doc = xmlCtxtReadMemory(parserCtxt, schemaBuffer, schemaBufferLen, - NULL, NULL, SCHEMAS_PARSE_OPTIONS); - schemaLocation = xmlStrdup(BAD_CAST "in_memory_buffer"); - if (doc != NULL) - doc->URL = schemaLocation; - } - /* - * For <import>: - * 2.1 The referent is (a fragment of) a resource which is an - * XML document (see clause 1.1), which in turn corresponds to - * a <schema> element information item in a well-formed information - * set, which in turn corresponds to a valid schema. - * TODO: (2.1) fragments of XML documents are not supported. - * - * 2.2 The referent is a <schema> element information item in - * a well-formed information set, which in turn corresponds - * to a valid schema. - * TODO: (2.2) is not supported. - */ - if (doc == NULL) { - xmlErrorPtr lerr; - lerr = xmlGetLastError(); - /* - * Check if this a parser error, or if the document could - * just not be located. - * TODO: Try to find specific error codes to react only on - * localisation failures. - */ - if ((lerr == NULL) || (lerr->domain != XML_FROM_IO)) { - /* - * We assume a parser error here. - */ - located = 1; - /* TODO: Error code ?? */ - res = XML_SCHEMAP_SRC_IMPORT_2_1; - xmlSchemaCustomErr(ACTXT_CAST pctxt, res, - invokingNode, NULL, - "Failed to parse the XML resource '%s'", - schemaLocation, NULL); - } - } - xmlFreeParserCtxt(parserCtxt); - if ((doc == NULL) && located) - goto exit_error; - } else { - xmlSchemaPErr(pctxt, NULL, - XML_SCHEMAP_NOTHING_TO_PARSE, - "No information for parsing was provided with the " - "given schema parser context.\n", - NULL, NULL); - goto exit_failure; - } - /* - * Preprocess the document. - */ - if (doc != NULL) { - xmlNodePtr docElem = NULL; - - located = 1; - docElem = xmlDocGetRootElement(doc); - if (docElem == NULL) { - xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOROOT, - invokingNode, NULL, - "The document '%s' has no document element", - schemaLocation, NULL); - goto exit_error; - } - /* - * Remove all the blank text nodes. - */ - xmlSchemaCleanupDoc(pctxt, docElem); - /* - * Check the schema's top level element. - */ - if (!IS_SCHEMA(docElem, "schema")) { - xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOT_SCHEMA, - invokingNode, NULL, - "The XML document '%s' is not a schema document", - schemaLocation, NULL); - goto exit_error; - } - /* - * Note that we don't apply a type check for the - * targetNamespace value here. - */ - targetNamespace = xmlSchemaGetProp(pctxt, docElem, - "targetNamespace"); - } - -/* after_doc_loading: */ - if ((bkt == NULL) && located) { - /* Only create a bucket if the schema was located. */ - bkt = xmlSchemaBucketCreate(pctxt, type, - targetNamespace); - if (bkt == NULL) - goto exit_failure; - } - if (bkt != NULL) { - bkt->schemaLocation = schemaLocation; - bkt->located = located; - if (doc != NULL) { - bkt->doc = doc; - bkt->targetNamespace = targetNamespace; - bkt->origTargetNamespace = targetNamespace; - if (preserveDoc) - bkt->preserveDoc = 1; - } - if (WXS_IS_BUCKET_IMPMAIN(type)) - bkt->imported++; - /* - * Add it to the graph of schemas. - */ - if (relation != NULL) - relation->bucket = bkt; - } - -exit: - /* - * Return the bucket explicitly; this is needed for the - * main schema. - */ - if (bucket != NULL) - *bucket = bkt; - return (0); - -exit_error: - if ((doc != NULL) && (! preserveDoc)) { - xmlFreeDoc(doc); - if (bkt != NULL) - bkt->doc = NULL; - } - return(pctxt->err); - -exit_failure: - if ((doc != NULL) && (! preserveDoc)) { - xmlFreeDoc(doc); - if (bkt != NULL) - bkt->doc = NULL; - } - return (-1); -} - -/** - * xmlSchemaParseImport: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Import definition - * *WARNING* this interface is highly subject to change - * - * Returns 0 in case of success, a positive error code if - * not valid and -1 in case of an internal error. - */ -static int -xmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, - xmlNodePtr node) -{ - xmlNodePtr child; - const xmlChar *namespaceName = NULL, *schemaLocation = NULL; - const xmlChar *thisTargetNamespace; - xmlAttrPtr attr; - int ret = 0; - xmlSchemaBucketPtr bucket = NULL; - - if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) - return (-1); - - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && - (!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* - * Extract and validate attributes. - */ - if (xmlSchemaPValAttr(pctxt, NULL, node, - "namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), - &namespaceName) != 0) { - xmlSchemaPSimpleTypeErr(pctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, node, - xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), - NULL, namespaceName, NULL, NULL, NULL); - return (pctxt->err); - } - - if (xmlSchemaPValAttr(pctxt, NULL, node, - "schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), - &schemaLocation) != 0) { - xmlSchemaPSimpleTypeErr(pctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, node, - xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), - NULL, namespaceName, NULL, NULL, NULL); - return (pctxt->err); - } - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - /* - * the annotation here is simply discarded ... - * TODO: really? - */ - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(pctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?)"); - } - /* - * Apply additional constraints. - * - * Note that it is important to use the original @targetNamespace - * (or none at all), to rule out imports of schemas _with_ a - * @targetNamespace if the importing schema is a chameleon schema - * (with no @targetNamespace). - */ - thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace; - if (namespaceName != NULL) { - /* - * 1.1 If the namespace [attribute] is present, then its ·actual value· - * must not match the ·actual value· of the enclosing <schema>'s - * targetNamespace [attribute]. - */ - if (xmlStrEqual(thisTargetNamespace, namespaceName)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_SRC_IMPORT_1_1, - NULL, node, - "The value of the attribute 'namespace' must not match " - "the target namespace '%s' of the importing schema", - thisTargetNamespace); - return (pctxt->err); - } - } else { - /* - * 1.2 If the namespace [attribute] is not present, then the enclosing - * <schema> must have a targetNamespace [attribute]. - */ - if (thisTargetNamespace == NULL) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_SRC_IMPORT_1_2, - NULL, node, - "The attribute 'namespace' must be existent if " - "the importing schema has no target namespace", - NULL); - return (pctxt->err); - } - } - /* - * Locate and acquire the schema document. - */ - if (schemaLocation != NULL) - schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict, - schemaLocation, node); - ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT, - schemaLocation, NULL, NULL, 0, node, thisTargetNamespace, - namespaceName, &bucket); - - if (ret != 0) - return(ret); - - /* - * For <import>: "It is *not* an error for the application - * schema reference strategy to fail." - * So just don't parse if no schema document was found. - * Note that we will get no bucket if the schema could not be - * located or if there was no schemaLocation. - */ - if ((bucket == NULL) && (schemaLocation != NULL)) { - xmlSchemaCustomWarning(ACTXT_CAST pctxt, - XML_SCHEMAP_WARN_UNLOCATED_SCHEMA, - node, NULL, - "Failed to locate a schema at location '%s'. " - "Skipping the import", schemaLocation, NULL, NULL); - } - - if ((bucket != NULL) && CAN_PARSE_SCHEMA(bucket)) { - ret = xmlSchemaParseNewDoc(pctxt, schema, bucket); - } - - return (ret); -} - -static int -xmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - xmlChar **schemaLocation, - int type) -{ - xmlAttrPtr attr; - - if ((pctxt == NULL) || (schema == NULL) || (node == NULL) || - (schemaLocation == NULL)) - return (-1); - - *schemaLocation = NULL; - /* - * Check for illegal attributes. - * Applies for both <include> and <redefine>. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); - /* - * Preliminary step, extract the URI-Reference and make an URI - * from the base. - */ - /* - * Attribute "schemaLocation" is mandatory. - */ - attr = xmlSchemaGetPropNode(node, "schemaLocation"); - if (attr != NULL) { - xmlChar *base = NULL; - xmlChar *uri = NULL; - - if (xmlSchemaPValAttrNode(pctxt, NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), - (const xmlChar **) schemaLocation) != 0) - goto exit_error; - base = xmlNodeGetBase(node->doc, node); - if (base == NULL) { - uri = xmlBuildURI(*schemaLocation, node->doc->URL); - } else { - uri = xmlBuildURI(*schemaLocation, base); - xmlFree(base); - } - if (uri == NULL) { - PERROR_INT("xmlSchemaParseIncludeOrRedefine", - "could not build an URI from the schemaLocation") - goto exit_failure; - } - (*schemaLocation) = (xmlChar *) xmlDictLookup(pctxt->dict, uri, -1); - xmlFree(uri); - } else { - xmlSchemaPMissingAttrErr(pctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "schemaLocation", NULL); - goto exit_error; - } - /* - * Report self-inclusion and self-redefinition. - */ - if (xmlStrEqual(*schemaLocation, pctxt->URL)) { - if (type == XML_SCHEMA_SCHEMA_REDEFINE) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_SRC_REDEFINE, - NULL, node, - "The schema document '%s' cannot redefine itself.", - *schemaLocation); - } else { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_SRC_INCLUDE, - NULL, node, - "The schema document '%s' cannot include itself.", - *schemaLocation); - } - goto exit_error; - } - - return(0); -exit_error: - return(pctxt->err); -exit_failure: - return(-1); -} - -static int -xmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - int type) -{ - xmlNodePtr child = NULL; - const xmlChar *schemaLocation = NULL; - int res = 0; /* hasRedefinitions = 0 */ - int isChameleon = 0, wasChameleon = 0; - xmlSchemaBucketPtr bucket = NULL; - - if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) - return (-1); - - /* - * Parse attributes. Note that the returned schemaLocation will - * be already converted to an absolute URI. - */ - res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt, schema, - node, (xmlChar **) (&schemaLocation), type); - if (res != 0) - return(res); - /* - * Load and add the schema document. - */ - res = xmlSchemaAddSchemaDoc(pctxt, type, schemaLocation, NULL, - NULL, 0, node, pctxt->targetNamespace, NULL, &bucket); - if (res != 0) - return(res); - /* - * If we get no schema bucket back, then this means that the schema - * document could not be located or was broken XML or was not - * a schema document. - */ - if ((bucket == NULL) || (bucket->doc == NULL)) { - if (type == XML_SCHEMA_SCHEMA_INCLUDE) { - /* - * WARNING for <include>: - * We will raise an error if the schema cannot be located - * for inclusions, since the that was the feedback from the - * schema people. I.e. the following spec piece will *not* be - * satisfied: - * SPEC src-include: "It is not an error for the ·actual value· of the - * schemaLocation [attribute] to fail to resolve it all, in which - * case no corresponding inclusion is performed. - * So do we need a warning report here?" - */ - res = XML_SCHEMAP_SRC_INCLUDE; - xmlSchemaCustomErr(ACTXT_CAST pctxt, res, - node, NULL, - "Failed to load the document '%s' for inclusion", - schemaLocation, NULL); - } else { - /* - * NOTE: This was changed to raise an error even if no redefinitions - * are specified. - * - * SPEC src-redefine (1) - * "If there are any element information items among the [children] - * other than <annotation> then the ·actual value· of the - * schemaLocation [attribute] must successfully resolve." - * TODO: Ask the WG if a the location has always to resolve - * here as well! - */ - res = XML_SCHEMAP_SRC_REDEFINE; - xmlSchemaCustomErr(ACTXT_CAST pctxt, res, - node, NULL, - "Failed to load the document '%s' for redefinition", - schemaLocation, NULL); - } - } else { - /* - * Check targetNamespace sanity before parsing the new schema. - * TODO: Note that we won't check further content if the - * targetNamespace was bad. - */ - if (bucket->origTargetNamespace != NULL) { - /* - * SPEC src-include (2.1) - * "SII has a targetNamespace [attribute], and its ·actual - * value· is identical to the ·actual value· of the targetNamespace - * [attribute] of SII’ (which must have such an [attribute])." - */ - if (pctxt->targetNamespace == NULL) { - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_SRC_INCLUDE, - node, NULL, - "The target namespace of the included/redefined schema " - "'%s' has to be absent, since the including/redefining " - "schema has no target namespace", - schemaLocation, NULL); - goto exit_error; - } else if (!xmlStrEqual(bucket->origTargetNamespace, - pctxt->targetNamespace)) { - /* TODO: Change error function. */ - xmlSchemaPCustomErrExt(pctxt, - XML_SCHEMAP_SRC_INCLUDE, - NULL, node, - "The target namespace '%s' of the included/redefined " - "schema '%s' differs from '%s' of the " - "including/redefining schema", - bucket->origTargetNamespace, schemaLocation, - pctxt->targetNamespace); - goto exit_error; - } - } else if (pctxt->targetNamespace != NULL) { - /* - * Chameleons: the original target namespace will - * differ from the resulting namespace. - */ - isChameleon = 1; - if (bucket->parsed && - (bucket->targetNamespace != pctxt->targetNamespace)) { - /* - * This is a sanity check, I dunno yet if this can happen. - */ - PERROR_INT("xmlSchemaParseIncludeOrRedefine", - "trying to use an already parsed schema for a " - "different targetNamespace"); - return(-1); - } - bucket->targetNamespace = pctxt->targetNamespace; - } - } - /* - * Parse the schema. - */ - if (bucket && (!bucket->parsed) && (bucket->doc != NULL)) { - if (isChameleon) { - /* TODO: Get rid of this flag on the schema itself. */ - if ((schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) { - schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS; - } else - wasChameleon = 1; - } - xmlSchemaParseNewDoc(pctxt, schema, bucket); - /* Restore chameleon flag. */ - if (isChameleon && (!wasChameleon)) - schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS; - } - /* - * And now for the children... - */ - child = node->children; - if (type == XML_SCHEMA_SCHEMA_REDEFINE) { - /* - * Parse (simpleType | complexType | group | attributeGroup))* - */ - pctxt->redefined = bucket; - /* - * How to proceed if the redefined schema was not located? - */ - pctxt->isRedefine = 1; - while (IS_SCHEMA(child, "annotation") || - IS_SCHEMA(child, "simpleType") || - IS_SCHEMA(child, "complexType") || - IS_SCHEMA(child, "group") || - IS_SCHEMA(child, "attributeGroup")) { - if (IS_SCHEMA(child, "annotation")) { - /* - * TODO: discard or not? - */ - } else if (IS_SCHEMA(child, "simpleType")) { - xmlSchemaParseSimpleType(pctxt, schema, child, 1); - } else if (IS_SCHEMA(child, "complexType")) { - xmlSchemaParseComplexType(pctxt, schema, child, 1); - /* hasRedefinitions = 1; */ - } else if (IS_SCHEMA(child, "group")) { - /* hasRedefinitions = 1; */ - xmlSchemaParseModelGroupDefinition(pctxt, - schema, child); - } else if (IS_SCHEMA(child, "attributeGroup")) { - /* hasRedefinitions = 1; */ - xmlSchemaParseAttributeGroupDefinition(pctxt, schema, - child); - } - child = child->next; - } - pctxt->redefined = NULL; - pctxt->isRedefine = 0; - } else { - if (IS_SCHEMA(child, "annotation")) { - /* - * TODO: discard or not? - */ - child = child->next; - } - } - if (child != NULL) { - res = XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED; - if (type == XML_SCHEMA_SCHEMA_REDEFINE) { - xmlSchemaPContentErr(pctxt, res, - NULL, node, child, NULL, - "(annotation | (simpleType | complexType | group | attributeGroup))*"); - } else { - xmlSchemaPContentErr(pctxt, res, - NULL, node, child, NULL, - "(annotation?)"); - } - } - return(res); - -exit_error: - return(pctxt->err); -} - -static int -xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, - xmlNodePtr node) -{ - int res; -#ifndef ENABLE_REDEFINE - TODO - return(0); -#endif - res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node, - XML_SCHEMA_SCHEMA_REDEFINE); - if (res != 0) - return(res); - return(0); -} - -static int -xmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, - xmlNodePtr node) -{ - int res; - - res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node, - XML_SCHEMA_SCHEMA_INCLUDE); - if (res != 0) - return(res); - return(0); -} - -/** - * xmlSchemaParseModelGroup: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * @type: the "compositor" type - * @particleNeeded: if a a model group with a particle - * - * parse a XML schema Sequence definition. - * Applies parts of: - * Schema Representation Constraint: - * Redefinition Constraints and Semantics (src-redefine) - * (6.1), (6.1.1), (6.1.2) - * - * Schema Component Constraint: - * All Group Limited (cos-all-limited) (2) - * TODO: Actually this should go to component-level checks, - * but is done here due to performance. Move it to an other layer - * is schema construction via an API is implemented. - * - * *WARNING* this interface is highly subject to change - * - * Returns -1 in case of error, 0 if the declaration is improper and - * 1 in case of success. - */ -static xmlSchemaTreeItemPtr -xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node, xmlSchemaTypeType type, - int withParticle) -{ - xmlSchemaModelGroupPtr item; - xmlSchemaParticlePtr particle = NULL; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - int min = 1, max = 1, isElemRef, hasRefs = 0; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - /* - * Create a model group with the given compositor. - */ - item = xmlSchemaAddModelGroup(ctxt, schema, type, node); - if (item == NULL) - return (NULL); - - if (withParticle) { - if (type == XML_SCHEMA_TYPE_ALL) { - min = xmlGetMinOccurs(ctxt, node, 0, 1, 1, "(0 | 1)"); - max = xmlGetMaxOccurs(ctxt, node, 1, 1, 1, "1"); - } else { - /* choice + sequence */ - min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); - max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, - "(xs:nonNegativeInteger | unbounded)"); - } - xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); - /* - * Create a particle - */ - particle = xmlSchemaAddParticle(ctxt, node, min, max); - if (particle == NULL) - return (NULL); - particle->children = (xmlSchemaTreeItemPtr) item; - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && - (!xmlStrEqual(attr->name, BAD_CAST "minOccurs"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - } else { - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if (!xmlStrEqual(attr->name, BAD_CAST "id")) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - } - - /* - * Extract and validate attributes. - */ - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - if (type == XML_SCHEMA_TYPE_ALL) { - xmlSchemaParticlePtr part, last = NULL; - - while (IS_SCHEMA(child, "element")) { - part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt, - schema, child, &isElemRef, 0); - /* - * SPEC cos-all-limited (2) - * "The {max occurs} of all the particles in the {particles} - * of the ('all') group must be 0 or 1. - */ - if (part != NULL) { - if (isElemRef) - hasRefs++; - if (part->minOccurs > 1) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_COS_ALL_LIMITED, - NULL, child, - "Invalid value for minOccurs (must be 0 or 1)", - NULL); - /* Reset to 1. */ - part->minOccurs = 1; - } - if (part->maxOccurs > 1) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_COS_ALL_LIMITED, - NULL, child, - "Invalid value for maxOccurs (must be 0 or 1)", - NULL); - /* Reset to 1. */ - part->maxOccurs = 1; - } - if (last == NULL) - item->children = (xmlSchemaTreeItemPtr) part; - else - last->next = (xmlSchemaTreeItemPtr) part; - last = part; - } - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, (annotation?, element*)"); - } - } else { - /* choice + sequence */ - xmlSchemaTreeItemPtr part = NULL, last = NULL; - - while ((IS_SCHEMA(child, "element")) || - (IS_SCHEMA(child, "group")) || - (IS_SCHEMA(child, "any")) || - (IS_SCHEMA(child, "choice")) || - (IS_SCHEMA(child, "sequence"))) { - - if (IS_SCHEMA(child, "element")) { - part = (xmlSchemaTreeItemPtr) - xmlSchemaParseElement(ctxt, schema, child, &isElemRef, 0); - if (part && isElemRef) - hasRefs++; - } else if (IS_SCHEMA(child, "group")) { - part = - xmlSchemaParseModelGroupDefRef(ctxt, schema, child); - if (part != NULL) - hasRefs++; - /* - * Handle redefinitions. - */ - if (ctxt->isRedefine && ctxt->redef && - (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) && - part && part->children) - { - if ((xmlSchemaGetQNameRefName(part->children) == - ctxt->redef->refName) && - (xmlSchemaGetQNameRefTargetNs(part->children) == - ctxt->redef->refTargetNs)) - { - /* - * SPEC src-redefine: - * (6.1) "If it has a <group> among its contents at - * some level the ·actual value· of whose ref - * [attribute] is the same as the ·actual value· of - * its own name attribute plus target namespace, then - * all of the following must be true:" - * (6.1.1) "It must have exactly one such group." - */ - if (ctxt->redefCounter != 0) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAP_SRC_REDEFINE, child, NULL, - "The redefining model group definition " - "'%s' must not contain more than one " - "reference to the redefined definition", - xmlSchemaFormatQName(&str, - ctxt->redef->refTargetNs, - ctxt->redef->refName), - NULL); - FREE_AND_NULL(str) - part = NULL; - } else if (((WXS_PARTICLE(part))->minOccurs != 1) || - ((WXS_PARTICLE(part))->maxOccurs != 1)) - { - xmlChar *str = NULL; - /* - * SPEC src-redefine: - * (6.1.2) "The ·actual value· of both that - * group's minOccurs and maxOccurs [attribute] - * must be 1 (or ·absent·). - */ - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAP_SRC_REDEFINE, child, NULL, - "The redefining model group definition " - "'%s' must not contain a reference to the " - "redefined definition with a " - "maxOccurs/minOccurs other than 1", - xmlSchemaFormatQName(&str, - ctxt->redef->refTargetNs, - ctxt->redef->refName), - NULL); - FREE_AND_NULL(str) - part = NULL; - } - ctxt->redef->reference = WXS_BASIC_CAST part; - ctxt->redefCounter++; - } - } - } else if (IS_SCHEMA(child, "any")) { - part = (xmlSchemaTreeItemPtr) - xmlSchemaParseAny(ctxt, schema, child); - } else if (IS_SCHEMA(child, "choice")) { - part = xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_CHOICE, 1); - } else if (IS_SCHEMA(child, "sequence")) { - part = xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_SEQUENCE, 1); - } - if (part != NULL) { - if (last == NULL) - item->children = part; - else - last->next = part; - last = part; - } - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, (element | group | choice | sequence | any)*)"); - } - } - if ((max == 0) && (min == 0)) - return (NULL); - if (hasRefs) { - /* - * We need to resolve references. - */ - WXS_ADD_PENDING(ctxt, item); - } - if (withParticle) - return ((xmlSchemaTreeItemPtr) particle); - else - return ((xmlSchemaTreeItemPtr) item); -} - -/** - * xmlSchemaParseRestriction: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Restriction definition - * *WARNING* this interface is highly subject to change - * - * Returns the type definition or NULL in case of error - */ -static xmlSchemaTypePtr -xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node, xmlSchemaTypeType parentType) -{ - xmlSchemaTypePtr type; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - /* Not a component, don't create it. */ - type = ctxt->ctxtType; - type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION; - - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "base"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - /* - * Extract and validate attributes. - */ - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - /* - * Attribute - */ - /* - * Extract the base type. The "base" attribute is mandatory if inside - * a complex type or if redefining. - * - * SPEC (1.2) "...otherwise (<restriction> has no <simpleType> " - * among its [children]), the simple type definition which is - * the {content type} of the type definition ·resolved· to by - * the ·actual value· of the base [attribute]" - */ - if (xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "base", - &(type->baseNs), &(type->base)) == 0) - { - if ((type->base == NULL) && (type->type == XML_SCHEMA_TYPE_COMPLEX)) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "base", NULL); - } else if ((ctxt->isRedefine) && - (type->flags & XML_SCHEMAS_TYPE_GLOBAL)) - { - if (type->base == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "base", NULL); - } else if ((! xmlStrEqual(type->base, type->name)) || - (! xmlStrEqual(type->baseNs, type->targetNamespace))) - { - xmlChar *str1 = NULL, *str2 = NULL; - /* - * REDEFINE: SPEC src-redefine (5) - * "Within the [children], each <simpleType> must have a - * <restriction> among its [children] ... the ·actual value· of - * whose base [attribute] must be the same as the ·actual value· - * of its own name attribute plus target namespace;" - */ - xmlSchemaPCustomErrExt(ctxt, XML_SCHEMAP_SRC_REDEFINE, - NULL, node, "This is a redefinition, but the QName " - "value '%s' of the 'base' attribute does not match the " - "type's designation '%s'", - xmlSchemaFormatQName(&str1, type->baseNs, type->base), - xmlSchemaFormatQName(&str2, type->targetNamespace, - type->name), NULL); - FREE_AND_NULL(str1); - FREE_AND_NULL(str2); - /* Avoid confusion and erase the values. */ - type->base = NULL; - type->baseNs = NULL; - } - } - } - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - /* - * Add the annotation to the simple type ancestor. - */ - xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, - xmlSchemaParseAnnotation(ctxt, child, 1)); - child = child->next; - } - if (parentType == XML_SCHEMA_TYPE_SIMPLE) { - /* - * Corresponds to <simpleType><restriction><simpleType>. - */ - if (IS_SCHEMA(child, "simpleType")) { - if (type->base != NULL) { - /* - * src-restriction-base-or-simpleType - * Either the base [attribute] or the simpleType [child] of the - * <restriction> element must be present, but not both. - */ - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, - NULL, node, child, - "The attribute 'base' and the <simpleType> child are " - "mutually exclusive", NULL); - } else { - type->baseType = (xmlSchemaTypePtr) - xmlSchemaParseSimpleType(ctxt, schema, child, 0); - } - child = child->next; - } else if (type->base == NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, - NULL, node, child, - "Either the attribute 'base' or a <simpleType> child " - "must be present", NULL); - } - } else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { - /* - * Corresponds to <complexType><complexContent><restriction>... - * followed by: - * - * Model groups <all>, <choice> and <sequence>. - */ - if (IS_SCHEMA(child, "all")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_ALL, 1); - child = child->next; - } else if (IS_SCHEMA(child, "choice")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, - schema, child, XML_SCHEMA_TYPE_CHOICE, 1); - child = child->next; - } else if (IS_SCHEMA(child, "sequence")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_SEQUENCE, 1); - child = child->next; - /* - * Model group reference <group>. - */ - } else if (IS_SCHEMA(child, "group")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroupDefRef(ctxt, schema, child); - /* - * Note that the reference will be resolved in - * xmlSchemaResolveTypeReferences(); - */ - child = child->next; - } - } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) { - /* - * Corresponds to <complexType><simpleContent><restriction>... - * - * "1.1 the simple type definition corresponding to the <simpleType> - * among the [children] of <restriction> if there is one;" - */ - if (IS_SCHEMA(child, "simpleType")) { - /* - * We will store the to-be-restricted simple type in - * type->contentTypeDef *temporarily*. - */ - type->contentTypeDef = (xmlSchemaTypePtr) - xmlSchemaParseSimpleType(ctxt, schema, child, 0); - if ( type->contentTypeDef == NULL) - return (NULL); - child = child->next; - } - } - - if ((parentType == XML_SCHEMA_TYPE_SIMPLE) || - (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) { - xmlSchemaFacetPtr facet, lastfacet = NULL; - /* - * Corresponds to <complexType><simpleContent><restriction>... - * <simpleType><restriction>... - */ - - /* - * Add the facets to the simple type ancestor. - */ - /* - * TODO: Datatypes: 4.1.3 Constraints on XML Representation of - * Simple Type Definition Schema Representation Constraint: - * *Single Facet Value* - */ - while ((IS_SCHEMA(child, "minInclusive")) || - (IS_SCHEMA(child, "minExclusive")) || - (IS_SCHEMA(child, "maxInclusive")) || - (IS_SCHEMA(child, "maxExclusive")) || - (IS_SCHEMA(child, "totalDigits")) || - (IS_SCHEMA(child, "fractionDigits")) || - (IS_SCHEMA(child, "pattern")) || - (IS_SCHEMA(child, "enumeration")) || - (IS_SCHEMA(child, "whiteSpace")) || - (IS_SCHEMA(child, "length")) || - (IS_SCHEMA(child, "maxLength")) || - (IS_SCHEMA(child, "minLength"))) { - facet = xmlSchemaParseFacet(ctxt, schema, child); - if (facet != NULL) { - if (lastfacet == NULL) - type->facets = facet; - else - lastfacet->next = facet; - lastfacet = facet; - lastfacet->next = NULL; - } - child = child->next; - } - /* - * Create links for derivation and validation. - */ - if (type->facets != NULL) { - xmlSchemaFacetLinkPtr facetLink, lastFacetLink = NULL; - - facet = type->facets; - do { - facetLink = (xmlSchemaFacetLinkPtr) - xmlMalloc(sizeof(xmlSchemaFacetLink)); - if (facetLink == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating a facet link", NULL); - xmlFree(facetLink); - return (NULL); - } - facetLink->facet = facet; - facetLink->next = NULL; - if (lastFacetLink == NULL) - type->facetSet = facetLink; - else - lastFacetLink->next = facetLink; - lastFacetLink = facetLink; - facet = facet->next; - } while (facet != NULL); - } - } - if (type->type == XML_SCHEMA_TYPE_COMPLEX) { - /* - * Attribute uses/declarations. - */ - if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, - (xmlSchemaItemListPtr *) &(type->attrUses), - XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1) - return(NULL); - /* - * Attribute wildcard. - */ - if (IS_SCHEMA(child, "anyAttribute")) { - type->attributeWildcard = - xmlSchemaParseAnyAttribute(ctxt, schema, child); - child = child->next; - } - } - if (child != NULL) { - if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "annotation?, (group | all | choice | sequence)?, " - "((attribute | attributeGroup)*, anyAttribute?))"); - } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, (simpleType?, (minExclusive | minInclusive | " - "maxExclusive | maxInclusive | totalDigits | fractionDigits | " - "length | minLength | maxLength | enumeration | whiteSpace | " - "pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))"); - } else { - /* Simple type */ - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, (simpleType?, (minExclusive | minInclusive | " - "maxExclusive | maxInclusive | totalDigits | fractionDigits | " - "length | minLength | maxLength | enumeration | whiteSpace | " - "pattern)*))"); - } - } - return (NULL); -} - -/** - * xmlSchemaParseExtension: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * Parses an <extension>, which is found inside a - * <simpleContent> or <complexContent>. - * *WARNING* this interface is highly subject to change. - * - * TODO: Returns the type definition or NULL in case of error - */ -static xmlSchemaTypePtr -xmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node, xmlSchemaTypeType parentType) -{ - xmlSchemaTypePtr type; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - /* Not a component, don't create it. */ - type = ctxt->ctxtType; - type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION; - - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "base"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - - /* - * Attribute "base" - mandatory. - */ - if ((xmlSchemaPValAttrQName(ctxt, schema, NULL, node, - "base", &(type->baseNs), &(type->base)) == 0) && - (type->base == NULL)) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, - NULL, node, "base", NULL); - } - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - /* - * Add the annotation to the type ancestor. - */ - xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, - xmlSchemaParseAnnotation(ctxt, child, 1)); - child = child->next; - } - if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { - /* - * Corresponds to <complexType><complexContent><extension>... and: - * - * Model groups <all>, <choice>, <sequence> and <group>. - */ - if (IS_SCHEMA(child, "all")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, schema, - child, XML_SCHEMA_TYPE_ALL, 1); - child = child->next; - } else if (IS_SCHEMA(child, "choice")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, schema, - child, XML_SCHEMA_TYPE_CHOICE, 1); - child = child->next; - } else if (IS_SCHEMA(child, "sequence")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, schema, - child, XML_SCHEMA_TYPE_SEQUENCE, 1); - child = child->next; - } else if (IS_SCHEMA(child, "group")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroupDefRef(ctxt, schema, child); - /* - * Note that the reference will be resolved in - * xmlSchemaResolveTypeReferences(); - */ - child = child->next; - } - } - if (child != NULL) { - /* - * Attribute uses/declarations. - */ - if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, - (xmlSchemaItemListPtr *) &(type->attrUses), - XML_SCHEMA_TYPE_EXTENSION, NULL) == -1) - return(NULL); - /* - * Attribute wildcard. - */ - if (IS_SCHEMA(child, "anyAttribute")) { - ctxt->ctxtType->attributeWildcard = - xmlSchemaParseAnyAttribute(ctxt, schema, child); - child = child->next; - } - } - if (child != NULL) { - if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { - /* Complex content extension. */ - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, ((group | all | choice | sequence)?, " - "((attribute | attributeGroup)*, anyAttribute?)))"); - } else { - /* Simple content extension. */ - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, ((attribute | attributeGroup)*, " - "anyAttribute?))"); - } - } - return (NULL); -} - -/** - * xmlSchemaParseSimpleContent: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema SimpleContent definition - * *WARNING* this interface is highly subject to change - * - * Returns the type definition or NULL in case of error - */ -static int -xmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, xmlNodePtr node, - int *hasRestrictionOrExtension) -{ - xmlSchemaTypePtr type; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || - (hasRestrictionOrExtension == NULL)) - return (-1); - *hasRestrictionOrExtension = 0; - /* Not a component, don't create it. */ - type = ctxt->ctxtType; - type->contentType = XML_SCHEMA_CONTENT_SIMPLE; - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id"))) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - /* - * Add the annotation to the complex type ancestor. - */ - xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, - xmlSchemaParseAnnotation(ctxt, child, 1)); - child = child->next; - } - if (child == NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_MISSING, - NULL, node, NULL, NULL, - "(annotation?, (restriction | extension))"); - } - if (child == NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_MISSING, - NULL, node, NULL, NULL, - "(annotation?, (restriction | extension))"); - } - if (IS_SCHEMA(child, "restriction")) { - xmlSchemaParseRestriction(ctxt, schema, child, - XML_SCHEMA_TYPE_SIMPLE_CONTENT); - (*hasRestrictionOrExtension) = 1; - child = child->next; - } else if (IS_SCHEMA(child, "extension")) { - xmlSchemaParseExtension(ctxt, schema, child, - XML_SCHEMA_TYPE_SIMPLE_CONTENT); - (*hasRestrictionOrExtension) = 1; - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, NULL, - "(annotation?, (restriction | extension))"); - } - return (0); -} - -/** - * xmlSchemaParseComplexContent: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema ComplexContent definition - * *WARNING* this interface is highly subject to change - * - * Returns the type definition or NULL in case of error - */ -static int -xmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaPtr schema, xmlNodePtr node, - int *hasRestrictionOrExtension) -{ - xmlSchemaTypePtr type; - xmlNodePtr child = NULL; - xmlAttrPtr attr; - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || - (hasRestrictionOrExtension == NULL)) - return (-1); - *hasRestrictionOrExtension = 0; - /* Not a component, don't create it. */ - type = ctxt->ctxtType; - /* - * Check for illegal attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && - (!xmlStrEqual(attr->name, BAD_CAST "mixed"))) - { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - - /* - * Set the 'mixed' on the complex type ancestor. - */ - if (xmlGetBooleanProp(ctxt, node, "mixed", 0)) { - if ((type->flags & XML_SCHEMAS_TYPE_MIXED) == 0) - type->flags |= XML_SCHEMAS_TYPE_MIXED; - } - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - /* - * Add the annotation to the complex type ancestor. - */ - xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, - xmlSchemaParseAnnotation(ctxt, child, 1)); - child = child->next; - } - if (child == NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_MISSING, - NULL, node, NULL, - NULL, "(annotation?, (restriction | extension))"); - } - if (child == NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_MISSING, - NULL, node, NULL, - NULL, "(annotation?, (restriction | extension))"); - } - if (IS_SCHEMA(child, "restriction")) { - xmlSchemaParseRestriction(ctxt, schema, child, - XML_SCHEMA_TYPE_COMPLEX_CONTENT); - (*hasRestrictionOrExtension) = 1; - child = child->next; - } else if (IS_SCHEMA(child, "extension")) { - xmlSchemaParseExtension(ctxt, schema, child, - XML_SCHEMA_TYPE_COMPLEX_CONTENT); - (*hasRestrictionOrExtension) = 1; - child = child->next; - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?, (restriction | extension))"); - } - return (0); -} - -/** - * xmlSchemaParseComplexType: - * @ctxt: a schema validation context - * @schema: the schema being built - * @node: a subtree containing XML Schema informations - * - * parse a XML schema Complex Type definition - * *WARNING* this interface is highly subject to change - * - * Returns the type definition or NULL in case of error - */ -static xmlSchemaTypePtr -xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, - xmlNodePtr node, int topLevel) -{ - xmlSchemaTypePtr type, ctxtType; - xmlNodePtr child = NULL; - const xmlChar *name = NULL; - xmlAttrPtr attr; - const xmlChar *attrValue; -#ifdef ENABLE_NAMED_LOCALS - char buf[40]; -#endif - int final = 0, block = 0, hasRestrictionOrExtension = 0; - - - if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) - return (NULL); - - ctxtType = ctxt->ctxtType; - - if (topLevel) { - attr = xmlSchemaGetPropNode(node, "name"); - if (attr == NULL) { - xmlSchemaPMissingAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); - return (NULL); - } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr, - xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { - return (NULL); - } - } - - if (topLevel == 0) { - /* - * Parse as local complex type definition. - */ -#ifdef ENABLE_NAMED_LOCALS - snprintf(buf, 39, "#CT%d", ctxt->counter++ + 1); - type = xmlSchemaAddType(ctxt, schema, - XML_SCHEMA_TYPE_COMPLEX, - xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1), - ctxt->targetNamespace, node, 0); -#else - type = xmlSchemaAddType(ctxt, schema, - XML_SCHEMA_TYPE_COMPLEX, - NULL, ctxt->targetNamespace, node, 0); -#endif - if (type == NULL) - return (NULL); - name = type->name; - type->node = node; - type->type = XML_SCHEMA_TYPE_COMPLEX; - /* - * TODO: We need the target namespace. - */ - } else { - /* - * Parse as global complex type definition. - */ - type = xmlSchemaAddType(ctxt, schema, - XML_SCHEMA_TYPE_COMPLEX, - name, ctxt->targetNamespace, node, 1); - if (type == NULL) - return (NULL); - type->node = node; - type->type = XML_SCHEMA_TYPE_COMPLEX; - type->flags |= XML_SCHEMAS_TYPE_GLOBAL; - } - type->targetNamespace = ctxt->targetNamespace; - /* - * Handle attributes. - */ - attr = node->properties; - while (attr != NULL) { - if (attr->ns == NULL) { - if (xmlStrEqual(attr->name, BAD_CAST "id")) { - /* - * Attribute "id". - */ - xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); - } else if (xmlStrEqual(attr->name, BAD_CAST "mixed")) { - /* - * Attribute "mixed". - */ - if (xmlSchemaPGetBoolNodeValue(ctxt, - NULL, (xmlNodePtr) attr)) - type->flags |= XML_SCHEMAS_TYPE_MIXED; - } else if (topLevel) { - /* - * Attributes of global complex type definitions. - */ - if (xmlStrEqual(attr->name, BAD_CAST "name")) { - /* Pass. */ - } else if (xmlStrEqual(attr->name, BAD_CAST "abstract")) { - /* - * Attribute "abstract". - */ - if (xmlSchemaPGetBoolNodeValue(ctxt, - NULL, (xmlNodePtr) attr)) - type->flags |= XML_SCHEMAS_TYPE_ABSTRACT; - } else if (xmlStrEqual(attr->name, BAD_CAST "final")) { - /* - * Attribute "final". - */ - attrValue = xmlSchemaGetNodeContent(ctxt, - (xmlNodePtr) attr); - if (xmlSchemaPValAttrBlockFinal(attrValue, - &(type->flags), - -1, - XML_SCHEMAS_TYPE_FINAL_EXTENSION, - XML_SCHEMAS_TYPE_FINAL_RESTRICTION, - -1, -1, -1) != 0) - { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, NULL, - "(#all | List of (extension | restriction))", - attrValue, NULL, NULL, NULL); - } else - final = 1; - } else if (xmlStrEqual(attr->name, BAD_CAST "block")) { - /* - * Attribute "block". - */ - attrValue = xmlSchemaGetNodeContent(ctxt, - (xmlNodePtr) attr); - if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags), - -1, - XML_SCHEMAS_TYPE_BLOCK_EXTENSION, - XML_SCHEMAS_TYPE_BLOCK_RESTRICTION, - -1, -1, -1) != 0) { - xmlSchemaPSimpleTypeErr(ctxt, - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, - NULL, (xmlNodePtr) attr, NULL, - "(#all | List of (extension | restriction)) ", - attrValue, NULL, NULL, NULL); - } else - block = 1; - } else { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { - xmlSchemaPIllegalAttrErr(ctxt, - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); - } - attr = attr->next; - } - if (! block) { - /* - * Apply default "block" values. - */ - if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) - type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; - if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) - type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; - } - if (! final) { - /* - * Apply default "block" values. - */ - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) - type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION; - if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) - type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION; - } - /* - * And now for the children... - */ - child = node->children; - if (IS_SCHEMA(child, "annotation")) { - type->annot = xmlSchemaParseAnnotation(ctxt, child, 1); - child = child->next; - } - ctxt->ctxtType = type; - if (IS_SCHEMA(child, "simpleContent")) { - /* - * <complexType><simpleContent>... - * 3.4.3 : 2.2 - * Specifying mixed='true' when the <simpleContent> - * alternative is chosen has no effect - */ - if (type->flags & XML_SCHEMAS_TYPE_MIXED) - type->flags ^= XML_SCHEMAS_TYPE_MIXED; - xmlSchemaParseSimpleContent(ctxt, schema, child, - &hasRestrictionOrExtension); - child = child->next; - } else if (IS_SCHEMA(child, "complexContent")) { - /* - * <complexType><complexContent>... - */ - type->contentType = XML_SCHEMA_CONTENT_EMPTY; - xmlSchemaParseComplexContent(ctxt, schema, child, - &hasRestrictionOrExtension); - child = child->next; - } else { - /* - * E.g <complexType><sequence>... or <complexType><attribute>... etc. - * - * SPEC - * "...the third alternative (neither <simpleContent> nor - * <complexContent>) is chosen. This case is understood as shorthand - * for complex content restricting the ·ur-type definition·, and the - * details of the mappings should be modified as necessary. - */ - type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); - type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION; - /* - * Parse model groups. - */ - if (IS_SCHEMA(child, "all")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_ALL, 1); - child = child->next; - } else if (IS_SCHEMA(child, "choice")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_CHOICE, 1); - child = child->next; - } else if (IS_SCHEMA(child, "sequence")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroup(ctxt, schema, child, - XML_SCHEMA_TYPE_SEQUENCE, 1); - child = child->next; - } else if (IS_SCHEMA(child, "group")) { - type->subtypes = (xmlSchemaTypePtr) - xmlSchemaParseModelGroupDefRef(ctxt, schema, child); - /* - * Note that the reference will be resolved in - * xmlSchemaResolveTypeReferences(); - */ - child = child->next; - } - /* - * Parse attribute decls/refs. - */ - if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, - (xmlSchemaItemListPtr *) &(type->attrUses), - XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1) - return(NULL); - /* - * Parse attribute wildcard. - */ - if (IS_SCHEMA(child, "anyAttribute")) { - type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child); - child = child->next; - } - } - if (child != NULL) { - xmlSchemaPContentErr(ctxt, - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, - NULL, node, child, - NULL, "(annotation?, (simpleContent | complexContent | " - "((group | all | choice | sequence)?, ((attribute | " - "attributeGroup)*, anyAttribute?))))"); - } - /* - * REDEFINE: SPEC src-redefine (5) - */ - if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) { - xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, - NULL, node, "This is a redefinition, thus the " - "<complexType> must have a <restriction> or <extension> " - "grand-child", NULL); - } - ctxt->ctxtType = ctxtType; - return (type); -} - -/************************************************************************ - * * - * Validating using Schemas * - * * - ************************************************************************/ - -/************************************************************************ - * * - * Reading/Writing Schemas * - * * - ************************************************************************/ - -#if 0 /* Will be enabled if it is clear what options are needed. */ -/** - * xmlSchemaParserCtxtSetOptions: - * @ctxt: a schema parser context - * @options: a combination of xmlSchemaParserOption - * - * Sets the options to be used during the parse. - * - * Returns 0 in case of success, -1 in case of an - * API error. - */ -static int -xmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt, - int options) - -{ - int i; - - if (ctxt == NULL) - return (-1); - /* - * WARNING: Change the start value if adding to the - * xmlSchemaParseOption. - */ - for (i = 1; i < (int) sizeof(int) * 8; i++) { - if (options & 1<<i) { - return (-1); - } - } - ctxt->options = options; - return (0); -} - -/** - * xmlSchemaValidCtxtGetOptions: - * @ctxt: a schema parser context - * - * Returns the option combination of the parser context. - */ -static int -xmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt) - -{ - if (ctxt == NULL) - return (-1); - else - return (ctxt->options); -} -#endif - -/** - * xmlSchemaNewParserCtxt: - * @URL: the location of the schema - * - * Create an XML Schemas parse context for that file/resource expected - * to contain an XML Schemas file. - * - * Returns the parser context or NULL in case of error - */ -xmlSchemaParserCtxtPtr -xmlSchemaNewParserCtxt(const char *URL) -{ - xmlSchemaParserCtxtPtr ret; - - if (URL == NULL) - return (NULL); - - ret = xmlSchemaParserCtxtCreate(); - if (ret == NULL) - return(NULL); - ret->dict = xmlDictCreate(); - ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1); - return (ret); -} - -/** - * xmlSchemaNewMemParserCtxt: - * @buffer: a pointer to a char array containing the schemas - * @size: the size of the array - * - * Create an XML Schemas parse context for that memory buffer expected - * to contain an XML Schemas file. - * - * Returns the parser context or NULL in case of error - */ -xmlSchemaParserCtxtPtr -xmlSchemaNewMemParserCtxt(const char *buffer, int size) -{ - xmlSchemaParserCtxtPtr ret; - - if ((buffer == NULL) || (size <= 0)) - return (NULL); - ret = xmlSchemaParserCtxtCreate(); - if (ret == NULL) - return(NULL); - ret->buffer = buffer; - ret->size = size; - ret->dict = xmlDictCreate(); - return (ret); -} - -/** - * xmlSchemaNewDocParserCtxt: - * @doc: a preparsed document tree - * - * Create an XML Schemas parse context for that document. - * NB. The document may be modified during the parsing process. - * - * Returns the parser context or NULL in case of error - */ -xmlSchemaParserCtxtPtr -xmlSchemaNewDocParserCtxt(xmlDocPtr doc) -{ - xmlSchemaParserCtxtPtr ret; - - if (doc == NULL) - return (NULL); - ret = xmlSchemaParserCtxtCreate(); - if (ret == NULL) - return(NULL); - ret->doc = doc; - ret->dict = xmlDictCreate(); - /* The application has responsibility for the document */ - ret->preserve = 1; - - return (ret); -} - -/** - * xmlSchemaFreeParserCtxt: - * @ctxt: the schema parser context - * - * Free the resources associated to the schema parser context - */ -void -xmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt) -{ - if (ctxt == NULL) - return; - if (ctxt->doc != NULL && !ctxt->preserve) - xmlFreeDoc(ctxt->doc); - if (ctxt->vctxt != NULL) { - xmlSchemaFreeValidCtxt(ctxt->vctxt); - } - if (ctxt->ownsConstructor && (ctxt->constructor != NULL)) { - xmlSchemaConstructionCtxtFree(ctxt->constructor); - ctxt->constructor = NULL; - ctxt->ownsConstructor = 0; - } - if (ctxt->attrProhibs != NULL) - xmlSchemaItemListFree(ctxt->attrProhibs); - xmlDictFree(ctxt->dict); - xmlFree(ctxt); -} - -/************************************************************************ - * * - * Building the content models * - * * - ************************************************************************/ - -static void -xmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaParticlePtr particle, int counter, xmlAutomataStatePtr end) -{ - xmlAutomataStatePtr start, tmp; - xmlSchemaElementPtr elemDecl, member; - xmlSchemaSubstGroupPtr substGroup; - int i; - - elemDecl = (xmlSchemaElementPtr) particle->children; - /* - * Wrap the substitution group with a CHOICE. - */ - start = pctxt->state; - if (end == NULL) - end = xmlAutomataNewState(pctxt->am); - substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl); - if (substGroup == NULL) { - xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle), - XML_SCHEMAP_INTERNAL, - "Internal error: xmlSchemaBuildContentModelForSubstGroup, " - "declaration is marked having a subst. group but none " - "available.\n", elemDecl->name, NULL); - return; - } - if (counter >= 0) { - /* - * NOTE that we put the declaration in, even if it's abstract. - * However, an error will be raised during *validation* if an element - * information item shall be validated against an abstract element - * declaration. - */ - tmp = xmlAutomataNewCountedTrans(pctxt->am, start, NULL, counter); - xmlAutomataNewTransition2(pctxt->am, tmp, end, - elemDecl->name, elemDecl->targetNamespace, elemDecl); - /* - * Add subst. group members. - */ - for (i = 0; i < substGroup->members->nbItems; i++) { - member = (xmlSchemaElementPtr) substGroup->members->items[i]; - xmlAutomataNewTransition2(pctxt->am, tmp, end, - member->name, member->targetNamespace, member); - } - } else if (particle->maxOccurs == 1) { - /* - * NOTE that we put the declaration in, even if it's abstract, - */ - xmlAutomataNewEpsilon(pctxt->am, - xmlAutomataNewTransition2(pctxt->am, - start, NULL, - elemDecl->name, elemDecl->targetNamespace, elemDecl), end); - /* - * Add subst. group members. - */ - for (i = 0; i < substGroup->members->nbItems; i++) { - member = (xmlSchemaElementPtr) substGroup->members->items[i]; - /* - * NOTE: This fixes bug #341150. xmlAutomataNewOnceTrans2() - * was incorrectly used instead of xmlAutomataNewTransition2() - * (seems like a copy&paste bug from the XML_SCHEMA_TYPE_ALL - * section in xmlSchemaBuildAContentModel() ). - * TODO: Check if xmlAutomataNewOnceTrans2() was instead - * intended for the above "counter" section originally. I.e., - * check xs:all with subst-groups. - * - * tmp = xmlAutomataNewOnceTrans2(pctxt->am, start, NULL, - * member->name, member->targetNamespace, - * 1, 1, member); - */ - tmp = xmlAutomataNewTransition2(pctxt->am, start, NULL, - member->name, member->targetNamespace, member); - xmlAutomataNewEpsilon(pctxt->am, tmp, end); - } - } else { - xmlAutomataStatePtr hop; - int maxOccurs = particle->maxOccurs == UNBOUNDED ? - UNBOUNDED : particle->maxOccurs - 1; - int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; - - counter = - xmlAutomataNewCounter(pctxt->am, minOccurs, - maxOccurs); - hop = xmlAutomataNewState(pctxt->am); - - xmlAutomataNewEpsilon(pctxt->am, - xmlAutomataNewTransition2(pctxt->am, - start, NULL, - elemDecl->name, elemDecl->targetNamespace, elemDecl), - hop); - /* - * Add subst. group members. - */ - for (i = 0; i < substGroup->members->nbItems; i++) { - member = (xmlSchemaElementPtr) substGroup->members->items[i]; - xmlAutomataNewEpsilon(pctxt->am, - xmlAutomataNewTransition2(pctxt->am, - start, NULL, - member->name, member->targetNamespace, member), - hop); - } - xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter); - xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); - } - if (particle->minOccurs == 0) - xmlAutomataNewEpsilon(pctxt->am, start, end); - pctxt->state = end; -} - -static void -xmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr particle) -{ - if (((xmlSchemaElementPtr) particle->children)->flags & - XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) { - /* - * Substitution groups. - */ - xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1, NULL); - } else { - xmlSchemaElementPtr elemDecl; - xmlAutomataStatePtr start; - - elemDecl = (xmlSchemaElementPtr) particle->children; - - if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) - return; - if (particle->maxOccurs == 1) { - start = ctxt->state; - ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, - elemDecl->name, elemDecl->targetNamespace, elemDecl); - } else if ((particle->maxOccurs >= UNBOUNDED) && - (particle->minOccurs < 2)) { - /* Special case. */ - start = ctxt->state; - ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, - elemDecl->name, elemDecl->targetNamespace, elemDecl); - ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state, - elemDecl->name, elemDecl->targetNamespace, elemDecl); - } else { - int counter; - int maxOccurs = particle->maxOccurs == UNBOUNDED ? - UNBOUNDED : particle->maxOccurs - 1; - int minOccurs = particle->minOccurs < 1 ? - 0 : particle->minOccurs - 1; - - start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); - counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs); - ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, - elemDecl->name, elemDecl->targetNamespace, elemDecl); - xmlAutomataNewCountedTrans(ctxt->am, ctxt->state, start, counter); - ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state, - NULL, counter); - } - if (particle->minOccurs == 0) - xmlAutomataNewEpsilon(ctxt->am, start, ctxt->state); - } -} - -/** - * xmlSchemaBuildAContentModel: - * @ctxt: the schema parser context - * @particle: the particle component - * @name: the complex type's name whose content is being built - * - * Create the automaton for the {content type} of a complex type. - * - */ -static void -xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaParticlePtr particle) -{ - if (particle == NULL) { - PERROR_INT("xmlSchemaBuildAContentModel", "particle is NULL"); - return; - } - if (particle->children == NULL) { - /* - * Just return in this case. A missing "term" of the particle - * might arise due to an invalid "term" component. - */ - return; - } - - switch (particle->children->type) { - case XML_SCHEMA_TYPE_ANY: { - xmlAutomataStatePtr start, end; - xmlSchemaWildcardPtr wild; - xmlSchemaWildcardNsPtr ns; - - wild = (xmlSchemaWildcardPtr) particle->children; - - start = pctxt->state; - end = xmlAutomataNewState(pctxt->am); - - if (particle->maxOccurs == 1) { - if (wild->any == 1) { - /* - * We need to add both transitions: - * - * 1. the {"*", "*"} for elements in a namespace. - */ - pctxt->state = - xmlAutomataNewTransition2(pctxt->am, - start, NULL, BAD_CAST "*", BAD_CAST "*", wild); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); - /* - * 2. the {"*"} for elements in no namespace. - */ - pctxt->state = - xmlAutomataNewTransition2(pctxt->am, - start, NULL, BAD_CAST "*", NULL, wild); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); - - } else if (wild->nsSet != NULL) { - ns = wild->nsSet; - do { - pctxt->state = start; - pctxt->state = xmlAutomataNewTransition2(pctxt->am, - pctxt->state, NULL, BAD_CAST "*", ns->value, wild); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); - ns = ns->next; - } while (ns != NULL); - - } else if (wild->negNsSet != NULL) { - pctxt->state = xmlAutomataNewNegTrans(pctxt->am, - start, end, BAD_CAST "*", wild->negNsSet->value, - wild); - } - } else { - int counter; - xmlAutomataStatePtr hop; - int maxOccurs = - particle->maxOccurs == UNBOUNDED ? UNBOUNDED : particle->maxOccurs - 1; - int minOccurs = - particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; - - counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs); - hop = xmlAutomataNewState(pctxt->am); - if (wild->any == 1) { - pctxt->state = - xmlAutomataNewTransition2(pctxt->am, - start, NULL, BAD_CAST "*", BAD_CAST "*", wild); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); - pctxt->state = - xmlAutomataNewTransition2(pctxt->am, - start, NULL, BAD_CAST "*", NULL, wild); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); - } else if (wild->nsSet != NULL) { - ns = wild->nsSet; - do { - pctxt->state = - xmlAutomataNewTransition2(pctxt->am, - start, NULL, BAD_CAST "*", ns->value, wild); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); - ns = ns->next; - } while (ns != NULL); - - } else if (wild->negNsSet != NULL) { - pctxt->state = xmlAutomataNewNegTrans(pctxt->am, - start, hop, BAD_CAST "*", wild->negNsSet->value, - wild); - } - xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter); - xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); - } - if (particle->minOccurs == 0) { - xmlAutomataNewEpsilon(pctxt->am, start, end); - } - pctxt->state = end; - break; - } - case XML_SCHEMA_TYPE_ELEMENT: - xmlSchemaBuildContentModelForElement(pctxt, particle); - break; - case XML_SCHEMA_TYPE_SEQUENCE:{ - xmlSchemaTreeItemPtr sub; - - /* - * If max and min occurances are default (1) then - * simply iterate over the particles of the <sequence>. - */ - if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) { - sub = particle->children->children; - while (sub != NULL) { - xmlSchemaBuildAContentModel(pctxt, - (xmlSchemaParticlePtr) sub); - sub = sub->next; - } - } else { - xmlAutomataStatePtr oldstate = pctxt->state; - - if (particle->maxOccurs >= UNBOUNDED) { - if (particle->minOccurs > 1) { - xmlAutomataStatePtr tmp; - int counter; - - pctxt->state = xmlAutomataNewEpsilon(pctxt->am, - oldstate, NULL); - oldstate = pctxt->state; - - counter = xmlAutomataNewCounter(pctxt->am, - particle->minOccurs - 1, UNBOUNDED); - - sub = particle->children->children; - while (sub != NULL) { - xmlSchemaBuildAContentModel(pctxt, - (xmlSchemaParticlePtr) sub); - sub = sub->next; - } - tmp = pctxt->state; - xmlAutomataNewCountedTrans(pctxt->am, tmp, - oldstate, counter); - pctxt->state = - xmlAutomataNewCounterTrans(pctxt->am, tmp, - NULL, counter); - - } else { - pctxt->state = xmlAutomataNewEpsilon(pctxt->am, - oldstate, NULL); - oldstate = pctxt->state; - - sub = particle->children->children; - while (sub != NULL) { - xmlSchemaBuildAContentModel(pctxt, - (xmlSchemaParticlePtr) sub); - sub = sub->next; - } - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, - oldstate); - /* - * epsilon needed to block previous trans from - * being allowed to enter back from another - * construct - */ - pctxt->state = xmlAutomataNewEpsilon(pctxt->am, - pctxt->state, NULL); - if (particle->minOccurs == 0) { - xmlAutomataNewEpsilon(pctxt->am, - oldstate, pctxt->state); - } - } - } else if ((particle->maxOccurs > 1) - || (particle->minOccurs > 1)) { - xmlAutomataStatePtr tmp; - int counter; - - pctxt->state = xmlAutomataNewEpsilon(pctxt->am, - oldstate, NULL); - oldstate = pctxt->state; - - counter = xmlAutomataNewCounter(pctxt->am, - particle->minOccurs - 1, - particle->maxOccurs - 1); - - sub = particle->children->children; - while (sub != NULL) { - xmlSchemaBuildAContentModel(pctxt, - (xmlSchemaParticlePtr) sub); - sub = sub->next; - } - tmp = pctxt->state; - xmlAutomataNewCountedTrans(pctxt->am, - tmp, oldstate, counter); - pctxt->state = - xmlAutomataNewCounterTrans(pctxt->am, tmp, NULL, - counter); - if (particle->minOccurs == 0) { - xmlAutomataNewEpsilon(pctxt->am, - oldstate, pctxt->state); - } - } else { - sub = particle->children->children; - while (sub != NULL) { - xmlSchemaBuildAContentModel(pctxt, - (xmlSchemaParticlePtr) sub); - sub = sub->next; - } - if (particle->minOccurs == 0) { - xmlAutomataNewEpsilon(pctxt->am, oldstate, - pctxt->state); - } - } - } - break; - } - case XML_SCHEMA_TYPE_CHOICE:{ - xmlSchemaTreeItemPtr sub; - xmlAutomataStatePtr start, end; - - start = pctxt->state; - end = xmlAutomataNewState(pctxt->am); - - /* - * iterate over the subtypes and remerge the end with an - * epsilon transition - */ - if (particle->maxOccurs == 1) { - sub = particle->children->children; - while (sub != NULL) { - pctxt->state = start; - xmlSchemaBuildAContentModel(pctxt, - (xmlSchemaParticlePtr) sub); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); - sub = sub->next; - } - } else { - int counter; - xmlAutomataStatePtr hop, base; - int maxOccurs = particle->maxOccurs == UNBOUNDED ? - UNBOUNDED : particle->maxOccurs - 1; - int minOccurs = - particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; - - /* - * use a counter to keep track of the number of transtions - * which went through the choice. - */ - counter = - xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs); - hop = xmlAutomataNewState(pctxt->am); - base = xmlAutomataNewState(pctxt->am); - - sub = particle->children->children; - while (sub != NULL) { - pctxt->state = base; - xmlSchemaBuildAContentModel(pctxt, - (xmlSchemaParticlePtr) sub); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); - sub = sub->next; - } - xmlAutomataNewEpsilon(pctxt->am, start, base); - xmlAutomataNewCountedTrans(pctxt->am, hop, base, counter); - xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); - } - if (particle->minOccurs == 0) { - xmlAutomataNewEpsilon(pctxt->am, start, end); - } - pctxt->state = end; - break; - } - case XML_SCHEMA_TYPE_ALL:{ - xmlAutomataStatePtr start; - xmlSchemaParticlePtr sub; - xmlSchemaElementPtr elemDecl; - int lax; - - sub = (xmlSchemaParticlePtr) particle->children->children; - if (sub == NULL) - break; - start = pctxt->state; - while (sub != NULL) { - pctxt->state = start; - - elemDecl = (xmlSchemaElementPtr) sub->children; - if (elemDecl == NULL) { - PERROR_INT("xmlSchemaBuildAContentModel", - "<element> particle has no term"); - return; - }; - /* - * NOTE: The {max occurs} of all the particles in the - * {particles} of the group must be 0 or 1; this is - * already ensured during the parse of the content of - * <all>. - */ - if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) { - int counter; - - /* - * This is an abstract group, we need to share - * the same counter for all the element transitions - * derived from the group - */ - counter = xmlAutomataNewCounter(pctxt->am, - sub->minOccurs, sub->maxOccurs); - xmlSchemaBuildContentModelForSubstGroup(pctxt, - sub, counter, pctxt->state); - } else { - if ((sub->minOccurs == 1) && - (sub->maxOccurs == 1)) { - xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state, - pctxt->state, - elemDecl->name, - elemDecl->targetNamespace, - 1, 1, elemDecl); - } else if ((sub->minOccurs == 0) && - (sub->maxOccurs == 1)) { - - xmlAutomataNewCountTrans2(pctxt->am, pctxt->state, - pctxt->state, - elemDecl->name, - elemDecl->targetNamespace, - 0, - 1, - elemDecl); - } - } - sub = (xmlSchemaParticlePtr) sub->next; - } - lax = particle->minOccurs == 0; - pctxt->state = - xmlAutomataNewAllTrans(pctxt->am, pctxt->state, NULL, lax); - break; - } - case XML_SCHEMA_TYPE_GROUP: - /* - * If we hit a model group definition, then this means that - * it was empty, thus was not substituted for the containing - * model group. Just do nothing in this case. - * TODO: But the group should be substituted and not occur at - * all in the content model at this point. Fix this. - */ - break; - default: - xmlSchemaInternalErr2(ACTXT_CAST pctxt, - "xmlSchemaBuildAContentModel", - "found unexpected term of type '%s' in content model", - WXS_ITEM_TYPE_NAME(particle->children), NULL); - return; - } -} - -/** - * xmlSchemaBuildContentModel: - * @ctxt: the schema parser context - * @type: the complex type definition - * @name: the element name - * - * Builds the content model of the complex type. - */ -static void -xmlSchemaBuildContentModel(xmlSchemaTypePtr type, - xmlSchemaParserCtxtPtr ctxt) -{ - if ((type->type != XML_SCHEMA_TYPE_COMPLEX) || - (type->contModel != NULL) || - ((type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) && - (type->contentType != XML_SCHEMA_CONTENT_MIXED))) - return; - -#ifdef DEBUG_CONTENT - xmlGenericError(xmlGenericErrorContext, - "Building content model for %s\n", name); -#endif - ctxt->am = NULL; - ctxt->am = xmlNewAutomata(); - if (ctxt->am == NULL) { - xmlGenericError(xmlGenericErrorContext, - "Cannot create automata for complex type %s\n", type->name); - return; - } - ctxt->state = xmlAutomataGetInitState(ctxt->am); - /* - * Build the automaton. - */ - xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(type)); - xmlAutomataSetFinalState(ctxt->am, ctxt->state); - type->contModel = xmlAutomataCompile(ctxt->am); - if (type->contModel == NULL) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_INTERNAL, - WXS_BASIC_CAST type, type->node, - "Failed to compile the content model", NULL); - } else if (xmlRegexpIsDeterminist(type->contModel) != 1) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_NOT_DETERMINISTIC, - /* XML_SCHEMAS_ERR_NOTDETERMINIST, */ - WXS_BASIC_CAST type, type->node, - "The content model is not determinist", NULL); - } else { -#ifdef DEBUG_CONTENT_REGEXP - xmlGenericError(xmlGenericErrorContext, - "Content model of %s:\n", type->name); - xmlRegexpPrint(stderr, type->contModel); -#endif - } - ctxt->state = NULL; - xmlFreeAutomata(ctxt->am); - ctxt->am = NULL; -} - -/** - * xmlSchemaResolveElementReferences: - * @elem: the schema element context - * @ctxt: the schema parser context - * - * Resolves the references of an element declaration - * or particle, which has an element declaration as it's - * term. - */ -static void -xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl, - xmlSchemaParserCtxtPtr ctxt) -{ - if ((ctxt == NULL) || (elemDecl == NULL) || - ((elemDecl != NULL) && - (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED))) - return; - elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED; - - if ((elemDecl->subtypes == NULL) && (elemDecl->namedType != NULL)) { - xmlSchemaTypePtr type; - - /* (type definition) ... otherwise the type definition ·resolved· - * to by the ·actual value· of the type [attribute] ... - */ - type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType, - elemDecl->namedTypeNs); - if (type == NULL) { - xmlSchemaPResCompAttrErr(ctxt, - XML_SCHEMAP_SRC_RESOLVE, - WXS_BASIC_CAST elemDecl, elemDecl->node, - "type", elemDecl->namedType, elemDecl->namedTypeNs, - XML_SCHEMA_TYPE_BASIC, "type definition"); - } else - elemDecl->subtypes = type; - } - if (elemDecl->substGroup != NULL) { - xmlSchemaElementPtr substHead; - - /* - * FIXME TODO: Do we need a new field in _xmlSchemaElement for - * substitutionGroup? - */ - substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup, - elemDecl->substGroupNs); - if (substHead == NULL) { - xmlSchemaPResCompAttrErr(ctxt, - XML_SCHEMAP_SRC_RESOLVE, - WXS_BASIC_CAST elemDecl, NULL, - "substitutionGroup", elemDecl->substGroup, - elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT, NULL); - } else { - xmlSchemaResolveElementReferences(substHead, ctxt); - /* - * Set the "substitution group affiliation". - * NOTE that now we use the "refDecl" field for this. - */ - WXS_SUBST_HEAD(elemDecl) = substHead; - /* - * The type definitions is set to: - * SPEC "...the {type definition} of the element - * declaration ·resolved· to by the ·actual value· - * of the substitutionGroup [attribute], if present" - */ - if (elemDecl->subtypes == NULL) - elemDecl->subtypes = substHead->subtypes; - } - } - /* - * SPEC "The definition of anyType serves as the default type definition - * for element declarations whose XML representation does not specify one." - */ - if ((elemDecl->subtypes == NULL) && - (elemDecl->namedType == NULL) && - (elemDecl->substGroup == NULL)) - elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); -} - -/** - * xmlSchemaResolveUnionMemberTypes: - * @ctxt: the schema parser context - * @type: the schema simple type definition - * - * Checks and builds the "member type definitions" property of the union - * simple type. This handles part (1), part (2) is done in - * xmlSchemaFinishMemberTypeDefinitionsProperty() - * - * Returns -1 in case of an internal error, 0 otherwise. - */ -static int -xmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaTypePtr type) -{ - - xmlSchemaTypeLinkPtr link, lastLink, newLink; - xmlSchemaTypePtr memberType; - - /* - * SPEC (1) "If the <union> alternative is chosen, then [Definition:] - * define the explicit members as the type definitions ·resolved· - * to by the items in the ·actual value· of the memberTypes [attribute], - * if any, followed by the type definitions corresponding to the - * <simpleType>s among the [children] of <union>, if any." - */ - /* - * Resolve references. - */ - link = type->memberTypes; - lastLink = NULL; - while (link != NULL) { - const xmlChar *name, *nsName; - - name = ((xmlSchemaQNameRefPtr) link->type)->name; - nsName = ((xmlSchemaQNameRefPtr) link->type)->targetNamespace; - - memberType = xmlSchemaGetType(ctxt->schema, name, nsName); - if ((memberType == NULL) || (! WXS_IS_SIMPLE(memberType))) { - xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, - WXS_BASIC_CAST type, type->node, "memberTypes", - name, nsName, XML_SCHEMA_TYPE_SIMPLE, NULL); - /* - * Remove the member type link. - */ - if (lastLink == NULL) - type->memberTypes = link->next; - else - lastLink->next = link->next; - newLink = link; - link = link->next; - xmlFree(newLink); - } else { - link->type = memberType; - lastLink = link; - link = link->next; - } - } - /* - * Add local simple types, - */ - memberType = type->subtypes; - while (memberType != NULL) { - link = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink)); - if (link == NULL) { - xmlSchemaPErrMemory(ctxt, "allocating a type link", NULL); - return (-1); - } - link->type = memberType; - link->next = NULL; - if (lastLink == NULL) - type->memberTypes = link; - else - lastLink->next = link; - lastLink = link; - memberType = memberType->next; - } - return (0); -} - -/** - * xmlSchemaIsDerivedFromBuiltInType: - * @ctxt: the schema parser context - * @type: the type definition - * @valType: the value type - * - * - * Returns 1 if the type has the given value type, or - * is derived from such a type. - */ -static int -xmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType) -{ - if (type == NULL) - return (0); - if (WXS_IS_COMPLEX(type)) - return (0); - if (type->type == XML_SCHEMA_TYPE_BASIC) { - if (type->builtInType == valType) - return(1); - if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) || - (type->builtInType == XML_SCHEMAS_ANYTYPE)) - return (0); - return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); - } - return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); -} - -#if 0 -/** - * xmlSchemaIsDerivedFromBuiltInType: - * @ctxt: the schema parser context - * @type: the type definition - * @valType: the value type - * - * - * Returns 1 if the type has the given value type, or - * is derived from such a type. - */ -static int -xmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType) -{ - if (type == NULL) - return (0); - if (WXS_IS_COMPLEX(type)) - return (0); - if (type->type == XML_SCHEMA_TYPE_BASIC) { - if (type->builtInType == valType) - return(1); - return (0); - } else - return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); - - return (0); -} -#endif - -static xmlSchemaTypePtr -xmlSchemaQueryBuiltInType(xmlSchemaTypePtr type) -{ - if (type == NULL) - return (NULL); - if (WXS_IS_COMPLEX(type)) - return (NULL); - if (type->type == XML_SCHEMA_TYPE_BASIC) - return(type); - return(xmlSchemaQueryBuiltInType(type->subtypes)); -} - -/** - * xmlSchemaGetPrimitiveType: - * @type: the simpleType definition - * - * Returns the primitive type of the given type or - * NULL in case of error. - */ -static xmlSchemaTypePtr -xmlSchemaGetPrimitiveType(xmlSchemaTypePtr type) -{ - - while (type != NULL) { - /* - * Note that anySimpleType is actually not a primitive type - * but we need that here. - */ - if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) || - (type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE)) - return (type); - type = type->baseType; - } - - return (NULL); -} - -#if 0 -/** - * xmlSchemaGetBuiltInTypeAncestor: - * @type: the simpleType definition - * - * Returns the primitive type of the given type or - * NULL in case of error. - */ -static xmlSchemaTypePtr -xmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr type) -{ - if (WXS_IS_LIST(type) || WXS_IS_UNION(type)) - return (0); - while (type != NULL) { - if (type->type == XML_SCHEMA_TYPE_BASIC) - return (type); - type = type->baseType; - } - - return (NULL); -} -#endif - -/** - * xmlSchemaCloneWildcardNsConstraints: - * @ctxt: the schema parser context - * @dest: the destination wildcard - * @source: the source wildcard - * - * Clones the namespace constraints of source - * and assignes them to dest. - * Returns -1 on internal error, 0 otherwise. - */ -static int -xmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaWildcardPtr dest, - xmlSchemaWildcardPtr source) -{ - xmlSchemaWildcardNsPtr cur, tmp, last; - - if ((source == NULL) || (dest == NULL)) - return(-1); - dest->any = source->any; - cur = source->nsSet; - last = NULL; - while (cur != NULL) { - tmp = xmlSchemaNewWildcardNsConstraint(ctxt); - if (tmp == NULL) - return(-1); - tmp->value = cur->value; - if (last == NULL) - dest->nsSet = tmp; - else - last->next = tmp; - last = tmp; - cur = cur->next; - } - if (dest->negNsSet != NULL) - xmlSchemaFreeWildcardNsSet(dest->negNsSet); - if (source->negNsSet != NULL) { - dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); - if (dest->negNsSet == NULL) - return(-1); - dest->negNsSet->value = source->negNsSet->value; - } else - dest->negNsSet = NULL; - return(0); -} - -/** - * xmlSchemaUnionWildcards: - * @ctxt: the schema parser context - * @completeWild: the first wildcard - * @curWild: the second wildcard - * - * Unions the namespace constraints of the given wildcards. - * @completeWild will hold the resulting union. - * Returns a positive error code on failure, -1 in case of an - * internal error, 0 otherwise. - */ -static int -xmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaWildcardPtr completeWild, - xmlSchemaWildcardPtr curWild) -{ - xmlSchemaWildcardNsPtr cur, curB, tmp; - - /* - * 1 If O1 and O2 are the same value, then that value must be the - * value. - */ - if ((completeWild->any == curWild->any) && - ((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) && - ((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) { - - if ((completeWild->negNsSet == NULL) || - (completeWild->negNsSet->value == curWild->negNsSet->value)) { - - if (completeWild->nsSet != NULL) { - int found = 0; - - /* - * Check equality of sets. - */ - cur = completeWild->nsSet; - while (cur != NULL) { - found = 0; - curB = curWild->nsSet; - while (curB != NULL) { - if (cur->value == curB->value) { - found = 1; - break; - } - curB = curB->next; - } - if (!found) - break; - cur = cur->next; - } - if (found) - return(0); - } else - return(0); - } - } - /* - * 2 If either O1 or O2 is any, then any must be the value - */ - if (completeWild->any != curWild->any) { - if (completeWild->any == 0) { - completeWild->any = 1; - if (completeWild->nsSet != NULL) { - xmlSchemaFreeWildcardNsSet(completeWild->nsSet); - completeWild->nsSet = NULL; - } - if (completeWild->negNsSet != NULL) { - xmlFree(completeWild->negNsSet); - completeWild->negNsSet = NULL; - } - } - return (0); - } - /* - * 3 If both O1 and O2 are sets of (namespace names or ·absent·), - * then the union of those sets must be the value. - */ - if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) { - int found; - xmlSchemaWildcardNsPtr start; - - cur = curWild->nsSet; - start = completeWild->nsSet; - while (cur != NULL) { - found = 0; - curB = start; - while (curB != NULL) { - if (cur->value == curB->value) { - found = 1; - break; - } - curB = curB->next; - } - if (!found) { - tmp = xmlSchemaNewWildcardNsConstraint(ctxt); - if (tmp == NULL) - return (-1); - tmp->value = cur->value; - tmp->next = completeWild->nsSet; - completeWild->nsSet = tmp; - } - cur = cur->next; - } - - return(0); - } - /* - * 4 If the two are negations of different values (namespace names - * or ·absent·), then a pair of not and ·absent· must be the value. - */ - if ((completeWild->negNsSet != NULL) && - (curWild->negNsSet != NULL) && - (completeWild->negNsSet->value != curWild->negNsSet->value)) { - completeWild->negNsSet->value = NULL; - - return(0); - } - /* - * 5. - */ - if (((completeWild->negNsSet != NULL) && - (completeWild->negNsSet->value != NULL) && - (curWild->nsSet != NULL)) || - ((curWild->negNsSet != NULL) && - (curWild->negNsSet->value != NULL) && - (completeWild->nsSet != NULL))) { - - int nsFound, absentFound = 0; - - if (completeWild->nsSet != NULL) { - cur = completeWild->nsSet; - curB = curWild->negNsSet; - } else { - cur = curWild->nsSet; - curB = completeWild->negNsSet; - } - nsFound = 0; - while (cur != NULL) { - if (cur->value == NULL) - absentFound = 1; - else if (cur->value == curB->value) - nsFound = 1; - if (nsFound && absentFound) - break; - cur = cur->next; - } - - if (nsFound && absentFound) { - /* - * 5.1 If the set S includes both the negated namespace - * name and ·absent·, then any must be the value. - */ - completeWild->any = 1; - if (completeWild->nsSet != NULL) { - xmlSchemaFreeWildcardNsSet(completeWild->nsSet); - completeWild->nsSet = NULL; - } - if (completeWild->negNsSet != NULL) { - xmlFree(completeWild->negNsSet); - completeWild->negNsSet = NULL; - } - } else if (nsFound && (!absentFound)) { - /* - * 5.2 If the set S includes the negated namespace name - * but not ·absent·, then a pair of not and ·absent· must - * be the value. - */ - if (completeWild->nsSet != NULL) { - xmlSchemaFreeWildcardNsSet(completeWild->nsSet); - completeWild->nsSet = NULL; - } - if (completeWild->negNsSet == NULL) { - completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); - if (completeWild->negNsSet == NULL) - return (-1); - } - completeWild->negNsSet->value = NULL; - } else if ((!nsFound) && absentFound) { - /* - * 5.3 If the set S includes ·absent· but not the negated - * namespace name, then the union is not expressible. - */ - xmlSchemaPErr(ctxt, completeWild->node, - XML_SCHEMAP_UNION_NOT_EXPRESSIBLE, - "The union of the wilcard is not expressible.\n", - NULL, NULL); - return(XML_SCHEMAP_UNION_NOT_EXPRESSIBLE); - } else if ((!nsFound) && (!absentFound)) { - /* - * 5.4 If the set S does not include either the negated namespace - * name or ·absent·, then whichever of O1 or O2 is a pair of not - * and a namespace name must be the value. - */ - if (completeWild->negNsSet == NULL) { - if (completeWild->nsSet != NULL) { - xmlSchemaFreeWildcardNsSet(completeWild->nsSet); - completeWild->nsSet = NULL; - } - completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); - if (completeWild->negNsSet == NULL) - return (-1); - completeWild->negNsSet->value = curWild->negNsSet->value; - } - } - return (0); - } - /* - * 6. - */ - if (((completeWild->negNsSet != NULL) && - (completeWild->negNsSet->value == NULL) && - (curWild->nsSet != NULL)) || - ((curWild->negNsSet != NULL) && - (curWild->negNsSet->value == NULL) && - (completeWild->nsSet != NULL))) { - - if (completeWild->nsSet != NULL) { - cur = completeWild->nsSet; - } else { - cur = curWild->nsSet; - } - while (cur != NULL) { - if (cur->value == NULL) { - /* - * 6.1 If the set S includes ·absent·, then any must be the - * value. - */ - completeWild->any = 1; - if (completeWild->nsSet != NULL) { - xmlSchemaFreeWildcardNsSet(completeWild->nsSet); - completeWild->nsSet = NULL; - } - if (completeWild->negNsSet != NULL) { - xmlFree(completeWild->negNsSet); - completeWild->negNsSet = NULL; - } - return (0); - } - cur = cur->next; - } - if (completeWild->negNsSet == NULL) { - /* - * 6.2 If the set S does not include ·absent·, then a pair of not - * and ·absent· must be the value. - */ - if (completeWild->nsSet != NULL) { - xmlSchemaFreeWildcardNsSet(completeWild->nsSet); - completeWild->nsSet = NULL; - } - completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); - if (completeWild->negNsSet == NULL) - return (-1); - completeWild->negNsSet->value = NULL; - } - return (0); - } - return (0); - -} - -/** - * xmlSchemaIntersectWildcards: - * @ctxt: the schema parser context - * @completeWild: the first wildcard - * @curWild: the second wildcard - * - * Intersects the namespace constraints of the given wildcards. - * @completeWild will hold the resulting intersection. - * Returns a positive error code on failure, -1 in case of an - * internal error, 0 otherwise. - */ -static int -xmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaWildcardPtr completeWild, - xmlSchemaWildcardPtr curWild) -{ - xmlSchemaWildcardNsPtr cur, curB, prev, tmp; - - /* - * 1 If O1 and O2 are the same value, then that value must be the - * value. - */ - if ((completeWild->any == curWild->any) && - ((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) && - ((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) { - - if ((completeWild->negNsSet == NULL) || - (completeWild->negNsSet->value == curWild->negNsSet->value)) { - - if (completeWild->nsSet != NULL) { - int found = 0; - - /* - * Check equality of sets. - */ - cur = completeWild->nsSet; - while (cur != NULL) { - found = 0; - curB = curWild->nsSet; - while (curB != NULL) { - if (cur->value == curB->value) { - found = 1; - break; - } - curB = curB->next; - } - if (!found) - break; - cur = cur->next; - } - if (found) - return(0); - } else - return(0); - } - } - /* - * 2 If either O1 or O2 is any, then the other must be the value. - */ - if ((completeWild->any != curWild->any) && (completeWild->any)) { - if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1) - return(-1); - return(0); - } - /* - * 3 If either O1 or O2 is a pair of not and a value (a namespace - * name or ·absent·) and the other is a set of (namespace names or - * ·absent·), then that set, minus the negated value if it was in - * the set, minus ·absent· if it was in the set, must be the value. - */ - if (((completeWild->negNsSet != NULL) && (curWild->nsSet != NULL)) || - ((curWild->negNsSet != NULL) && (completeWild->nsSet != NULL))) { - const xmlChar *neg; - - if (completeWild->nsSet == NULL) { - neg = completeWild->negNsSet->value; - if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1) - return(-1); - } else - neg = curWild->negNsSet->value; - /* - * Remove absent and negated. - */ - prev = NULL; - cur = completeWild->nsSet; - while (cur != NULL) { - if (cur->value == NULL) { - if (prev == NULL) - completeWild->nsSet = cur->next; - else - prev->next = cur->next; - xmlFree(cur); - break; - } - prev = cur; - cur = cur->next; - } - if (neg != NULL) { - prev = NULL; - cur = completeWild->nsSet; - while (cur != NULL) { - if (cur->value == neg) { - if (prev == NULL) - completeWild->nsSet = cur->next; - else - prev->next = cur->next; - xmlFree(cur); - break; - } - prev = cur; - cur = cur->next; - } - } - - return(0); - } - /* - * 4 If both O1 and O2 are sets of (namespace names or ·absent·), - * then the intersection of those sets must be the value. - */ - if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) { - int found; - - cur = completeWild->nsSet; - prev = NULL; - while (cur != NULL) { - found = 0; - curB = curWild->nsSet; - while (curB != NULL) { - if (cur->value == curB->value) { - found = 1; - break; - } - curB = curB->next; - } - if (!found) { - if (prev == NULL) - completeWild->nsSet = cur->next; - else - prev->next = cur->next; - tmp = cur->next; - xmlFree(cur); - cur = tmp; - continue; - } - prev = cur; - cur = cur->next; - } - - return(0); - } - /* 5 If the two are negations of different namespace names, - * then the intersection is not expressible - */ - if ((completeWild->negNsSet != NULL) && - (curWild->negNsSet != NULL) && - (completeWild->negNsSet->value != curWild->negNsSet->value) && - (completeWild->negNsSet->value != NULL) && - (curWild->negNsSet->value != NULL)) { - - xmlSchemaPErr(ctxt, completeWild->node, XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE, - "The intersection of the wilcard is not expressible.\n", - NULL, NULL); - return(XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE); - } - /* - * 6 If the one is a negation of a namespace name and the other - * is a negation of ·absent·, then the one which is the negation - * of a namespace name must be the value. - */ - if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) && - (completeWild->negNsSet->value != curWild->negNsSet->value) && - (completeWild->negNsSet->value == NULL)) { - completeWild->negNsSet->value = curWild->negNsSet->value; - } - return(0); -} - -/** - * xmlSchemaIsWildcardNsConstraintSubset: - * @ctxt: the schema parser context - * @sub: the first wildcard - * @super: the second wildcard - * - * Schema Component Constraint: Wildcard Subset (cos-ns-subset) - * - * Returns 0 if the namespace constraint of @sub is an intensional - * subset of @super, 1 otherwise. - */ -static int -xmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub, - xmlSchemaWildcardPtr super) -{ - /* - * 1 super must be any. - */ - if (super->any) - return (0); - /* - * 2.1 sub must be a pair of not and a namespace name or ·absent·. - * 2.2 super must be a pair of not and the same value. - */ - if ((sub->negNsSet != NULL) && - (super->negNsSet != NULL) && - (sub->negNsSet->value == sub->negNsSet->value)) - return (0); - /* - * 3.1 sub must be a set whose members are either namespace names or ·absent·. - */ - if (sub->nsSet != NULL) { - /* - * 3.2.1 super must be the same set or a superset thereof. - */ - if (super->nsSet != NULL) { - xmlSchemaWildcardNsPtr cur, curB; - int found = 0; - - cur = sub->nsSet; - while (cur != NULL) { - found = 0; - curB = super->nsSet; - while (curB != NULL) { - if (cur->value == curB->value) { - found = 1; - break; - } - curB = curB->next; - } - if (!found) - return (1); - cur = cur->next; - } - if (found) - return (0); - } else if (super->negNsSet != NULL) { - xmlSchemaWildcardNsPtr cur; - /* - * 3.2.2 super must be a pair of not and a namespace name or - * ·absent· and that value must not be in sub's set. - */ - cur = sub->nsSet; - while (cur != NULL) { - if (cur->value == super->negNsSet->value) - return (1); - cur = cur->next; - } - return (0); - } - } - return (1); -} - -static int -xmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse, - int *fixed, - const xmlChar **value, - xmlSchemaValPtr *val) -{ - *fixed = 0; - *value = NULL; - if (val != 0) - *val = NULL; - - if (attruse->defValue != NULL) { - *value = attruse->defValue; - if (val != NULL) - *val = attruse->defVal; - if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED) - *fixed = 1; - return(1); - } else if ((attruse->attrDecl != NULL) && - (attruse->attrDecl->defValue != NULL)) { - *value = attruse->attrDecl->defValue; - if (val != NULL) - *val = attruse->attrDecl->defVal; - if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED) - *fixed = 1; - return(1); - } - return(0); -} -/** - * xmlSchemaCheckCVCWildcardNamespace: - * @wild: the wildcard - * @ns: the namespace - * - * Validation Rule: Wildcard allows Namespace Name - * (cvc-wildcard-namespace) - * - * Returns 0 if the given namespace matches the wildcard, - * 1 otherwise and -1 on API errors. - */ -static int -xmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild, - const xmlChar* ns) -{ - if (wild == NULL) - return(-1); - - if (wild->any) - return(0); - else if (wild->nsSet != NULL) { - xmlSchemaWildcardNsPtr cur; - - cur = wild->nsSet; - while (cur != NULL) { - if (xmlStrEqual(cur->value, ns)) - return(0); - cur = cur->next; - } - } else if ((wild->negNsSet != NULL) && (ns != NULL) && - (!xmlStrEqual(wild->negNsSet->value, ns))) - return(0); - - return(1); -} - -#define XML_SCHEMA_ACTION_DERIVE 0 -#define XML_SCHEMA_ACTION_REDEFINE 1 - -#define WXS_ACTION_STR(a) \ -((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined" - -/* -* Schema Component Constraint: -* Derivation Valid (Restriction, Complex) -* derivation-ok-restriction (2) - (4) -* -* ATTENTION: -* In XML Schema 1.1 this will be: -* Validation Rule: -* Checking complex type subsumption (practicalSubsumption) (1, 2 and 3) -* -*/ -static int -xmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt, - int action, - xmlSchemaBasicItemPtr item, - xmlSchemaBasicItemPtr baseItem, - xmlSchemaItemListPtr uses, - xmlSchemaItemListPtr baseUses, - xmlSchemaWildcardPtr wild, - xmlSchemaWildcardPtr baseWild) -{ - xmlSchemaAttributeUsePtr cur = NULL, bcur; - int i, j, found; /* err = 0; */ - const xmlChar *bEffValue; - int effFixed; - - if (uses != NULL) { - for (i = 0; i < uses->nbItems; i++) { - cur = uses->items[i]; - found = 0; - if (baseUses == NULL) - goto not_found; - for (j = 0; j < baseUses->nbItems; j++) { - bcur = baseUses->items[j]; - if ((WXS_ATTRUSE_DECL_NAME(cur) == - WXS_ATTRUSE_DECL_NAME(bcur)) && - (WXS_ATTRUSE_DECL_TNS(cur) == - WXS_ATTRUSE_DECL_TNS(bcur))) - { - /* - * (2.1) "If there is an attribute use in the {attribute - * uses} of the {base type definition} (call this B) whose - * {attribute declaration} has the same {name} and {target - * namespace}, then all of the following must be true:" - */ - found = 1; - - if ((cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) && - (bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED)) - { - xmlChar *str = NULL; - /* - * (2.1.1) "one of the following must be true:" - * (2.1.1.1) "B's {required} is false." - * (2.1.1.2) "R's {required} is true." - */ - xmlSchemaPAttrUseErr4(pctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1, - WXS_ITEM_NODE(item), item, cur, - "The 'optional' attribute use is inconsistent " - "with the corresponding 'required' attribute use of " - "the %s %s", - WXS_ACTION_STR(action), - xmlSchemaGetComponentDesignation(&str, baseItem), - NULL, NULL); - FREE_AND_NULL(str); - /* err = pctxt->err; */ - } else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, - WXS_ATTRUSE_TYPEDEF(cur), - WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0) - { - xmlChar *strA = NULL, *strB = NULL, *strC = NULL; - - /* - * SPEC (2.1.2) "R's {attribute declaration}'s - * {type definition} must be validly derived from - * B's {type definition} given the empty set as - * defined in Type Derivation OK (Simple) (§3.14.6)." - */ - xmlSchemaPAttrUseErr4(pctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2, - WXS_ITEM_NODE(item), item, cur, - "The attribute declaration's %s " - "is not validly derived from " - "the corresponding %s of the " - "attribute declaration in the %s %s", - xmlSchemaGetComponentDesignation(&strA, - WXS_ATTRUSE_TYPEDEF(cur)), - xmlSchemaGetComponentDesignation(&strB, - WXS_ATTRUSE_TYPEDEF(bcur)), - WXS_ACTION_STR(action), - xmlSchemaGetComponentDesignation(&strC, baseItem)); - /* xmlSchemaGetComponentDesignation(&str, baseItem), */ - FREE_AND_NULL(strA); - FREE_AND_NULL(strB); - FREE_AND_NULL(strC); - /* err = pctxt->err; */ - } else { - /* - * 2.1.3 [Definition:] Let the effective value - * constraint of an attribute use be its {value - * constraint}, if present, otherwise its {attribute - * declaration}'s {value constraint} . - */ - xmlSchemaGetEffectiveValueConstraint(bcur, - &effFixed, &bEffValue, NULL); - /* - * 2.1.3 ... one of the following must be true - * - * 2.1.3.1 B's ·effective value constraint· is - * ·absent· or default. - */ - if ((bEffValue != NULL) && - (effFixed == 1)) { - const xmlChar *rEffValue = NULL; - - xmlSchemaGetEffectiveValueConstraint(bcur, - &effFixed, &rEffValue, NULL); - /* - * 2.1.3.2 R's ·effective value constraint· is - * fixed with the same string as B's. - * MAYBE TODO: Compare the computed values. - * Hmm, it says "same string" so - * string-equality might really be sufficient. - */ - if ((effFixed == 0) || - (! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue))) - { - xmlChar *str = NULL; - - xmlSchemaPAttrUseErr4(pctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3, - WXS_ITEM_NODE(item), item, cur, - "The effective value constraint of the " - "attribute use is inconsistent with " - "its correspondent in the %s %s", - WXS_ACTION_STR(action), - xmlSchemaGetComponentDesignation(&str, - baseItem), - NULL, NULL); - FREE_AND_NULL(str); - /* err = pctxt->err; */ - } - } - } - break; - } - } -not_found: - if (!found) { - /* - * (2.2) "otherwise the {base type definition} must have an - * {attribute wildcard} and the {target namespace} of the - * R's {attribute declaration} must be ·valid· with respect - * to that wildcard, as defined in Wildcard allows Namespace - * Name (§3.10.4)." - */ - if ((baseWild == NULL) || - (xmlSchemaCheckCVCWildcardNamespace(baseWild, - (WXS_ATTRUSE_DECL(cur))->targetNamespace) != 0)) - { - xmlChar *str = NULL; - - xmlSchemaPAttrUseErr4(pctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2, - WXS_ITEM_NODE(item), item, cur, - "Neither a matching attribute use, " - "nor a matching wildcard exists in the %s %s", - WXS_ACTION_STR(action), - xmlSchemaGetComponentDesignation(&str, baseItem), - NULL, NULL); - FREE_AND_NULL(str); - /* err = pctxt->err; */ - } - } - } - } - /* - * SPEC derivation-ok-restriction (3): - * (3) "For each attribute use in the {attribute uses} of the {base type - * definition} whose {required} is true, there must be an attribute - * use with an {attribute declaration} with the same {name} and - * {target namespace} as its {attribute declaration} in the {attribute - * uses} of the complex type definition itself whose {required} is true. - */ - if (baseUses != NULL) { - for (j = 0; j < baseUses->nbItems; j++) { - bcur = baseUses->items[j]; - if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED) - continue; - found = 0; - if (uses != NULL) { - for (i = 0; i < uses->nbItems; i++) { - cur = uses->items[i]; - if ((WXS_ATTRUSE_DECL_NAME(cur) == - WXS_ATTRUSE_DECL_NAME(bcur)) && - (WXS_ATTRUSE_DECL_TNS(cur) == - WXS_ATTRUSE_DECL_TNS(bcur))) { - found = 1; - break; - } - } - } - if (!found) { - xmlChar *strA = NULL, *strB = NULL; - - xmlSchemaCustomErr4(ACTXT_CAST pctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3, - NULL, item, - "A matching attribute use for the " - "'required' %s of the %s %s is missing", - xmlSchemaGetComponentDesignation(&strA, bcur), - WXS_ACTION_STR(action), - xmlSchemaGetComponentDesignation(&strB, baseItem), - NULL); - FREE_AND_NULL(strA); - FREE_AND_NULL(strB); - } - } - } - /* - * derivation-ok-restriction (4) - */ - if (wild != NULL) { - /* - * (4) "If there is an {attribute wildcard}, all of the - * following must be true:" - */ - if (baseWild == NULL) { - xmlChar *str = NULL; - - /* - * (4.1) "The {base type definition} must also have one." - */ - xmlSchemaCustomErr4(ACTXT_CAST pctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1, - NULL, item, - "The %s has an attribute wildcard, " - "but the %s %s '%s' does not have one", - WXS_ITEM_TYPE_NAME(item), - WXS_ACTION_STR(action), - WXS_ITEM_TYPE_NAME(baseItem), - xmlSchemaGetComponentQName(&str, baseItem)); - FREE_AND_NULL(str); - return(pctxt->err); - } else if ((baseWild->any == 0) && - xmlSchemaCheckCOSNSSubset(wild, baseWild)) - { - xmlChar *str = NULL; - /* - * (4.2) "The complex type definition's {attribute wildcard}'s - * {namespace constraint} must be a subset of the {base type - * definition}'s {attribute wildcard}'s {namespace constraint}, - * as defined by Wildcard Subset (§3.10.6)." - */ - xmlSchemaCustomErr4(ACTXT_CAST pctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2, - NULL, item, - "The attribute wildcard is not a valid " - "subset of the wildcard in the %s %s '%s'", - WXS_ACTION_STR(action), - WXS_ITEM_TYPE_NAME(baseItem), - xmlSchemaGetComponentQName(&str, baseItem), - NULL); - FREE_AND_NULL(str); - return(pctxt->err); - } - /* 4.3 Unless the {base type definition} is the ·ur-type - * definition·, the complex type definition's {attribute - * wildcard}'s {process contents} must be identical to or - * stronger than the {base type definition}'s {attribute - * wildcard}'s {process contents}, where strict is stronger - * than lax is stronger than skip. - */ - if ((! WXS_IS_ANYTYPE(baseItem)) && - (wild->processContents < baseWild->processContents)) { - xmlChar *str = NULL; - xmlSchemaCustomErr4(ACTXT_CAST pctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3, - NULL, baseItem, - "The {process contents} of the attribute wildcard is " - "weaker than the one in the %s %s '%s'", - WXS_ACTION_STR(action), - WXS_ITEM_TYPE_NAME(baseItem), - xmlSchemaGetComponentQName(&str, baseItem), - NULL); - FREE_AND_NULL(str) - return(pctxt->err); - } - } - return(0); -} - - -static int -xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaBasicItemPtr item, - xmlSchemaWildcardPtr *completeWild, - xmlSchemaItemListPtr list, - xmlSchemaItemListPtr prohibs); -/** - * xmlSchemaFixupTypeAttributeUses: - * @ctxt: the schema parser context - * @type: the complex type definition - * - * - * Builds the wildcard and the attribute uses on the given complex type. - * Returns -1 if an internal error occurs, 0 otherwise. - * - * ATTENTION TODO: Experimantally this uses pointer comparisons for - * strings, so recheck this if we start to hardcode some schemata, since - * they might not be in the same dict. - * NOTE: It is allowed to "extend" the xs:anyType type. - */ -static int -xmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - xmlSchemaTypePtr baseType = NULL; - xmlSchemaAttributeUsePtr use; - xmlSchemaItemListPtr uses, baseUses, prohibs = NULL; - - if (type->baseType == NULL) { - PERROR_INT("xmlSchemaFixupTypeAttributeUses", - "no base type"); - return (-1); - } - baseType = type->baseType; - if (WXS_IS_TYPE_NOT_FIXED(baseType)) - if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1) - return(-1); - - uses = type->attrUses; - baseUses = baseType->attrUses; - /* - * Expand attribute group references. And build the 'complete' - * wildcard, i.e. intersect multiple wildcards. - * Move attribute prohibitions into a separate list. - */ - if (uses != NULL) { - if (WXS_IS_RESTRICTION(type)) { - /* - * This one will transfer all attr. prohibitions - * into pctxt->attrProhibs. - */ - if (xmlSchemaExpandAttributeGroupRefs(pctxt, - WXS_BASIC_CAST type, &(type->attributeWildcard), uses, - pctxt->attrProhibs) == -1) - { - PERROR_INT("xmlSchemaFixupTypeAttributeUses", - "failed to expand attributes"); - } - if (pctxt->attrProhibs->nbItems != 0) - prohibs = pctxt->attrProhibs; - } else { - if (xmlSchemaExpandAttributeGroupRefs(pctxt, - WXS_BASIC_CAST type, &(type->attributeWildcard), uses, - NULL) == -1) - { - PERROR_INT("xmlSchemaFixupTypeAttributeUses", - "failed to expand attributes"); - } - } - } - /* - * Inherit the attribute uses of the base type. - */ - if (baseUses != NULL) { - int i, j; - xmlSchemaAttributeUseProhibPtr pro; - - if (WXS_IS_RESTRICTION(type)) { - int usesCount; - xmlSchemaAttributeUsePtr tmp; - - if (uses != NULL) - usesCount = uses->nbItems; - else - usesCount = 0; - - /* Restriction. */ - for (i = 0; i < baseUses->nbItems; i++) { - use = baseUses->items[i]; - if (prohibs) { - /* - * Filter out prohibited uses. - */ - for (j = 0; j < prohibs->nbItems; j++) { - pro = prohibs->items[j]; - if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) && - (WXS_ATTRUSE_DECL_TNS(use) == - pro->targetNamespace)) - { - goto inherit_next; - } - } - } - if (usesCount) { - /* - * Filter out existing uses. - */ - for (j = 0; j < usesCount; j++) { - tmp = uses->items[j]; - if ((WXS_ATTRUSE_DECL_NAME(use) == - WXS_ATTRUSE_DECL_NAME(tmp)) && - (WXS_ATTRUSE_DECL_TNS(use) == - WXS_ATTRUSE_DECL_TNS(tmp))) - { - goto inherit_next; - } - } - } - if (uses == NULL) { - type->attrUses = xmlSchemaItemListCreate(); - if (type->attrUses == NULL) - goto exit_failure; - uses = type->attrUses; - } - xmlSchemaItemListAddSize(uses, 2, use); -inherit_next: {} - } - } else { - /* Extension. */ - for (i = 0; i < baseUses->nbItems; i++) { - use = baseUses->items[i]; - if (uses == NULL) { - type->attrUses = xmlSchemaItemListCreate(); - if (type->attrUses == NULL) - goto exit_failure; - uses = type->attrUses; - } - xmlSchemaItemListAddSize(uses, baseUses->nbItems, use); - } - } - } - /* - * Shrink attr. uses. - */ - if (uses) { - if (uses->nbItems == 0) { - xmlSchemaItemListFree(uses); - type->attrUses = NULL; - } - /* - * TODO: We could shrink the size of the array - * to fit the actual number of items. - */ - } - /* - * Compute the complete wildcard. - */ - if (WXS_IS_EXTENSION(type)) { - if (baseType->attributeWildcard != NULL) { - /* - * (3.2.2.1) "If the ·base wildcard· is non-·absent·, then - * the appropriate case among the following:" - */ - if (type->attributeWildcard != NULL) { - /* - * Union the complete wildcard with the base wildcard. - * SPEC {attribute wildcard} - * (3.2.2.1.2) "otherwise a wildcard whose {process contents} - * and {annotation} are those of the ·complete wildcard·, - * and whose {namespace constraint} is the intensional union - * of the {namespace constraint} of the ·complete wildcard· - * and of the ·base wildcard·, as defined in Attribute - * Wildcard Union (§3.10.6)." - */ - if (xmlSchemaUnionWildcards(pctxt, type->attributeWildcard, - baseType->attributeWildcard) == -1) - goto exit_failure; - } else { - /* - * (3.2.2.1.1) "If the ·complete wildcard· is ·absent·, - * then the ·base wildcard·." - */ - type->attributeWildcard = baseType->attributeWildcard; - } - } else { - /* - * (3.2.2.2) "otherwise (the ·base wildcard· is ·absent·) the - * ·complete wildcard" - * NOOP - */ - } - } else { - /* - * SPEC {attribute wildcard} - * (3.1) "If the <restriction> alternative is chosen, then the - * ·complete wildcard·;" - * NOOP - */ - } - - return (0); - -exit_failure: - return(-1); -} - -/** - * xmlSchemaTypeFinalContains: - * @schema: the schema - * @type: the type definition - * @final: the final - * - * Evaluates if a type definition contains the given "final". - * This does take "finalDefault" into account as well. - * - * Returns 1 if the type does containt the given "final", - * 0 otherwise. - */ -static int -xmlSchemaTypeFinalContains(xmlSchemaTypePtr type, int final) -{ - if (type == NULL) - return (0); - if (type->flags & final) - return (1); - else - return (0); -} - -/** - * xmlSchemaGetUnionSimpleTypeMemberTypes: - * @type: the Union Simple Type - * - * Returns a list of member types of @type if existing, - * returns NULL otherwise. - */ -static xmlSchemaTypeLinkPtr -xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type) -{ - while ((type != NULL) && (type->type == XML_SCHEMA_TYPE_SIMPLE)) { - if (type->memberTypes != NULL) - return (type->memberTypes); - else - type = type->baseType; - } - return (NULL); -} - -/** - * xmlSchemaGetParticleTotalRangeMin: - * @particle: the particle - * - * Schema Component Constraint: Effective Total Range - * (all and sequence) + (choice) - * - * Returns the minimun Effective Total Range. - */ -static int -xmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle) -{ - if ((particle->children == NULL) || - (particle->minOccurs == 0)) - return (0); - if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) { - int min = -1, cur; - xmlSchemaParticlePtr part = - (xmlSchemaParticlePtr) particle->children->children; - - if (part == NULL) - return (0); - while (part != NULL) { - if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || - (part->children->type == XML_SCHEMA_TYPE_ANY)) - cur = part->minOccurs; - else - cur = xmlSchemaGetParticleTotalRangeMin(part); - if (cur == 0) - return (0); - if ((min > cur) || (min == -1)) - min = cur; - part = (xmlSchemaParticlePtr) part->next; - } - return (particle->minOccurs * min); - } else { - /* <all> and <sequence> */ - int sum = 0; - xmlSchemaParticlePtr part = - (xmlSchemaParticlePtr) particle->children->children; - - if (part == NULL) - return (0); - do { - if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || - (part->children->type == XML_SCHEMA_TYPE_ANY)) - sum += part->minOccurs; - else - sum += xmlSchemaGetParticleTotalRangeMin(part); - part = (xmlSchemaParticlePtr) part->next; - } while (part != NULL); - return (particle->minOccurs * sum); - } -} - -/** - * xmlSchemaGetParticleTotalRangeMax: - * @particle: the particle - * - * Schema Component Constraint: Effective Total Range - * (all and sequence) + (choice) - * - * Returns the maximum Effective Total Range. - */ -static int -xmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle) -{ - if ((particle->children == NULL) || - (particle->children->children == NULL)) - return (0); - if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) { - int max = -1, cur; - xmlSchemaParticlePtr part = - (xmlSchemaParticlePtr) particle->children->children; - - for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) { - if (part->children == NULL) - continue; - if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || - (part->children->type == XML_SCHEMA_TYPE_ANY)) - cur = part->maxOccurs; - else - cur = xmlSchemaGetParticleTotalRangeMax(part); - if (cur == UNBOUNDED) - return (UNBOUNDED); - if ((max < cur) || (max == -1)) - max = cur; - } - /* TODO: Handle overflows? */ - return (particle->maxOccurs * max); - } else { - /* <all> and <sequence> */ - int sum = 0, cur; - xmlSchemaParticlePtr part = - (xmlSchemaParticlePtr) particle->children->children; - - for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) { - if (part->children == NULL) - continue; - if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || - (part->children->type == XML_SCHEMA_TYPE_ANY)) - cur = part->maxOccurs; - else - cur = xmlSchemaGetParticleTotalRangeMax(part); - if (cur == UNBOUNDED) - return (UNBOUNDED); - if ((cur > 0) && (particle->maxOccurs == UNBOUNDED)) - return (UNBOUNDED); - sum += cur; - } - /* TODO: Handle overflows? */ - return (particle->maxOccurs * sum); - } -} - -/** - * xmlSchemaIsParticleEmptiable: - * @particle: the particle - * - * Schema Component Constraint: Particle Emptiable - * Checks whether the given particle is emptiable. - * - * Returns 1 if emptiable, 0 otherwise. - */ -static int -xmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle) -{ - /* - * SPEC (1) "Its {min occurs} is 0." - */ - if ((particle == NULL) || (particle->minOccurs == 0) || - (particle->children == NULL)) - return (1); - /* - * SPEC (2) "Its {term} is a group and the minimum part of the - * effective total range of that group, [...] is 0." - */ - if (WXS_IS_MODEL_GROUP(particle->children)) { - if (xmlSchemaGetParticleTotalRangeMin(particle) == 0) - return (1); - } - return (0); -} - -/** - * xmlSchemaCheckCOSSTDerivedOK: - * @actxt: a context - * @type: the derived simple type definition - * @baseType: the base type definition - * @subset: the subset of ('restriction', ect.) - * - * Schema Component Constraint: - * Type Derivation OK (Simple) (cos-st-derived-OK) - * - * Checks whether @type can be validly - * derived from @baseType. - * - * Returns 0 on success, an positive error code otherwise. - */ -static int -xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt, - xmlSchemaTypePtr type, - xmlSchemaTypePtr baseType, - int subset) -{ - /* - * 1 They are the same type definition. - * TODO: The identy check might have to be more complex than this. - */ - if (type == baseType) - return (0); - /* - * 2.1 restriction is not in the subset, or in the {final} - * of its own {base type definition}; - * - * NOTE that this will be used also via "xsi:type". - * - * TODO: Revise this, it looks strange. How can the "type" - * not be fixed or *in* fixing? - */ - if (WXS_IS_TYPE_NOT_FIXED(type)) - if (xmlSchemaTypeFixup(type, actxt) == -1) - return(-1); - if (WXS_IS_TYPE_NOT_FIXED(baseType)) - if (xmlSchemaTypeFixup(baseType, actxt) == -1) - return(-1); - if ((subset & SUBSET_RESTRICTION) || - (xmlSchemaTypeFinalContains(type->baseType, - XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) { - return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_1); - } - /* 2.2 */ - if (type->baseType == baseType) { - /* - * 2.2.1 D's ·base type definition· is B. - */ - return (0); - } - /* - * 2.2.2 D's ·base type definition· is not the ·ur-type definition· - * and is validly derived from B given the subset, as defined by this - * constraint. - */ - if ((! WXS_IS_ANYTYPE(type->baseType)) && - (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType, - baseType, subset) == 0)) { - return (0); - } - /* - * 2.2.3 D's {variety} is list or union and B is the ·simple ur-type - * definition·. - */ - if (WXS_IS_ANY_SIMPLE_TYPE(baseType) && - (WXS_IS_LIST(type) || WXS_IS_UNION(type))) { - return (0); - } - /* - * 2.2.4 B's {variety} is union and D is validly derived from a type - * definition in B's {member type definitions} given the subset, as - * defined by this constraint. - * - * NOTE: This seems not to involve built-in types, since there is no - * built-in Union Simple Type. - */ - if (WXS_IS_UNION(baseType)) { - xmlSchemaTypeLinkPtr cur; - - cur = baseType->memberTypes; - while (cur != NULL) { - if (WXS_IS_TYPE_NOT_FIXED(cur->type)) - if (xmlSchemaTypeFixup(cur->type, actxt) == -1) - return(-1); - if (xmlSchemaCheckCOSSTDerivedOK(actxt, - type, cur->type, subset) == 0) - { - /* - * It just has to be validly derived from at least one - * member-type. - */ - return (0); - } - cur = cur->next; - } - } - return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_2); -} - -/** - * xmlSchemaCheckTypeDefCircularInternal: - * @pctxt: the schema parser context - * @ctxtType: the type definition - * @ancestor: an ancestor of @ctxtType - * - * Checks st-props-correct (2) + ct-props-correct (3). - * Circular type definitions are not allowed. - * - * Returns XML_SCHEMAP_ST_PROPS_CORRECT_2 if the given type is - * circular, 0 otherwise. - */ -static int -xmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr ctxtType, - xmlSchemaTypePtr ancestor) -{ - int ret; - - if ((ancestor == NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC)) - return (0); - - if (ctxtType == ancestor) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_ST_PROPS_CORRECT_2, - WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType), - "The definition is circular", NULL); - return (XML_SCHEMAP_ST_PROPS_CORRECT_2); - } - if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) { - /* - * Avoid inifinite recursion on circular types not yet checked. - */ - return (0); - } - ancestor->flags |= XML_SCHEMAS_TYPE_MARKED; - ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType, - ancestor->baseType); - ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED; - return (ret); -} - -/** - * xmlSchemaCheckTypeDefCircular: - * @item: the complex/simple type definition - * @ctxt: the parser context - * @name: the name - * - * Checks for circular type definitions. - */ -static void -xmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr item, - xmlSchemaParserCtxtPtr ctxt) -{ - if ((item == NULL) || - (item->type == XML_SCHEMA_TYPE_BASIC) || - (item->baseType == NULL)) - return; - xmlSchemaCheckTypeDefCircularInternal(ctxt, item, - item->baseType); -} - -/* -* Simple Type Definition Representation OK (src-simple-type) 4 -* -* "4 Circular union type definition is disallowed. That is, if the -* <union> alternative is chosen, there must not be any entries in the -* memberTypes [attribute] at any depth which resolve to the component -* corresponding to the <simpleType>." -* -* Note that this should work on the *representation* of a component, -* thus assumes any union types in the member types not being yet -* substituted. At this stage we need the variety of the types -* to be already computed. -*/ -static int -xmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr ctxType, - xmlSchemaTypeLinkPtr members) -{ - xmlSchemaTypeLinkPtr member; - xmlSchemaTypePtr memberType; - - member = members; - while (member != NULL) { - memberType = member->type; - while ((memberType != NULL) && - (memberType->type != XML_SCHEMA_TYPE_BASIC)) { - if (memberType == ctxType) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_SRC_SIMPLE_TYPE_4, - WXS_BASIC_CAST ctxType, NULL, - "The union type definition is circular", NULL); - return (XML_SCHEMAP_SRC_SIMPLE_TYPE_4); - } - if ((WXS_IS_UNION(memberType)) && - ((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0)) - { - int res; - memberType->flags |= XML_SCHEMAS_TYPE_MARKED; - res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, - ctxType, - xmlSchemaGetUnionSimpleTypeMemberTypes(memberType)); - memberType->flags ^= XML_SCHEMAS_TYPE_MARKED; - if (res != 0) - return(res); - } - memberType = memberType->baseType; - } - member = member->next; - } - return(0); -} - -static int -xmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - if (! WXS_IS_UNION(type)) - return(0); - return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, type, - type->memberTypes)); -} - -/** - * xmlSchemaResolveTypeReferences: - * @item: the complex/simple type definition - * @ctxt: the parser context - * @name: the name - * - * Resolvese type definition references - */ -static void -xmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef, - xmlSchemaParserCtxtPtr ctxt) -{ - if (typeDef == NULL) - return; - - /* - * Resolve the base type. - */ - if (typeDef->baseType == NULL) { - typeDef->baseType = xmlSchemaGetType(ctxt->schema, - typeDef->base, typeDef->baseNs); - if (typeDef->baseType == NULL) { - xmlSchemaPResCompAttrErr(ctxt, - XML_SCHEMAP_SRC_RESOLVE, - WXS_BASIC_CAST typeDef, typeDef->node, - "base", typeDef->base, typeDef->baseNs, - XML_SCHEMA_TYPE_SIMPLE, NULL); - return; - } - } - if (WXS_IS_SIMPLE(typeDef)) { - if (WXS_IS_UNION(typeDef)) { - /* - * Resolve the memberTypes. - */ - xmlSchemaResolveUnionMemberTypes(ctxt, typeDef); - return; - } else if (WXS_IS_LIST(typeDef)) { - /* - * Resolve the itemType. - */ - if ((typeDef->subtypes == NULL) && (typeDef->base != NULL)) { - - typeDef->subtypes = xmlSchemaGetType(ctxt->schema, - typeDef->base, typeDef->baseNs); - - if ((typeDef->subtypes == NULL) || - (! WXS_IS_SIMPLE(typeDef->subtypes))) - { - typeDef->subtypes = NULL; - xmlSchemaPResCompAttrErr(ctxt, - XML_SCHEMAP_SRC_RESOLVE, - WXS_BASIC_CAST typeDef, typeDef->node, - "itemType", typeDef->base, typeDef->baseNs, - XML_SCHEMA_TYPE_SIMPLE, NULL); - } - } - return; - } - } - /* - * The ball of letters below means, that if we have a particle - * which has a QName-helper component as its {term}, we want - * to resolve it... - */ - else if ((WXS_TYPE_CONTENTTYPE(typeDef) != NULL) && - ((WXS_TYPE_CONTENTTYPE(typeDef))->type == - XML_SCHEMA_TYPE_PARTICLE) && - (WXS_TYPE_PARTICLE_TERM(typeDef) != NULL) && - ((WXS_TYPE_PARTICLE_TERM(typeDef))->type == - XML_SCHEMA_EXTRA_QNAMEREF)) - { - xmlSchemaQNameRefPtr ref = - WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef); - xmlSchemaModelGroupDefPtr groupDef; - - /* - * URGENT TODO: Test this. - */ - WXS_TYPE_PARTICLE_TERM(typeDef) = NULL; - /* - * Resolve the MG definition reference. - */ - groupDef = - WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema, - ref->itemType, ref->name, ref->targetNamespace); - if (groupDef == NULL) { - xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, - NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), - "ref", ref->name, ref->targetNamespace, ref->itemType, - NULL); - /* Remove the particle. */ - WXS_TYPE_CONTENTTYPE(typeDef) = NULL; - } else if (WXS_MODELGROUPDEF_MODEL(groupDef) == NULL) - /* Remove the particle. */ - WXS_TYPE_CONTENTTYPE(typeDef) = NULL; - else { - /* - * Assign the MG definition's {model group} to the - * particle's {term}. - */ - WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef); - - if (WXS_MODELGROUPDEF_MODEL(groupDef)->type == XML_SCHEMA_TYPE_ALL) { - /* - * SPEC cos-all-limited (1.2) - * "1.2 the {term} property of a particle with - * {max occurs}=1 which is part of a pair which constitutes - * the {content type} of a complex type definition." - */ - if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) { - xmlSchemaCustomErr(ACTXT_CAST ctxt, - /* TODO: error code */ - XML_SCHEMAP_COS_ALL_LIMITED, - WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), NULL, - "The particle's {max occurs} must be 1, since the " - "reference resolves to an 'all' model group", - NULL, NULL); - } - } - } - } -} - - - -/** - * xmlSchemaCheckSTPropsCorrect: - * @ctxt: the schema parser context - * @type: the simple type definition - * - * Checks st-props-correct. - * - * Returns 0 if the properties are correct, - * if not, a positive error code and -1 on internal - * errors. - */ -static int -xmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaTypePtr type) -{ - xmlSchemaTypePtr baseType = type->baseType; - xmlChar *str = NULL; - - /* STATE: error funcs converted. */ - /* - * Schema Component Constraint: Simple Type Definition Properties Correct - * - * NOTE: This is somehow redundant, since we actually built a simple type - * to have all the needed information; this acts as an self test. - */ - /* Base type: If the datatype has been ·derived· by ·restriction· - * then the Simple Type Definition component from which it is ·derived·, - * otherwise the Simple Type Definition for anySimpleType (§4.1.6). - */ - if (baseType == NULL) { - /* - * TODO: Think about: "modulo the impact of Missing - * Sub-components (§5.3)." - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_ST_PROPS_CORRECT_1, - WXS_BASIC_CAST type, NULL, - "No base type existent", NULL); - return (XML_SCHEMAP_ST_PROPS_CORRECT_1); - - } - if (! WXS_IS_SIMPLE(baseType)) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_ST_PROPS_CORRECT_1, - WXS_BASIC_CAST type, NULL, - "The base type '%s' is not a simple type", - xmlSchemaGetComponentQName(&str, baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_ST_PROPS_CORRECT_1); - } - if ( (WXS_IS_LIST(type) || WXS_IS_UNION(type)) && - (WXS_IS_RESTRICTION(type) == 0) && - (! WXS_IS_ANY_SIMPLE_TYPE(baseType))) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_ST_PROPS_CORRECT_1, - WXS_BASIC_CAST type, NULL, - "A type, derived by list or union, must have" - "the simple ur-type definition as base type, not '%s'", - xmlSchemaGetComponentQName(&str, baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_ST_PROPS_CORRECT_1); - } - /* - * Variety: One of {atomic, list, union}. - */ - if ((! WXS_IS_ATOMIC(type)) && (! WXS_IS_UNION(type)) && - (! WXS_IS_LIST(type))) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_ST_PROPS_CORRECT_1, - WXS_BASIC_CAST type, NULL, - "The variety is absent", NULL); - return (XML_SCHEMAP_ST_PROPS_CORRECT_1); - } - /* TODO: Finish this. Hmm, is this finished? */ - - /* - * 3 The {final} of the {base type definition} must not contain restriction. - */ - if (xmlSchemaTypeFinalContains(baseType, - XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_ST_PROPS_CORRECT_3, - WXS_BASIC_CAST type, NULL, - "The 'final' of its base type '%s' must not contain " - "'restriction'", - xmlSchemaGetComponentQName(&str, baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_ST_PROPS_CORRECT_3); - } - - /* - * 2 All simple type definitions must be derived ultimately from the ·simple - * ur-type definition (so· circular definitions are disallowed). That is, it - * must be possible to reach a built-in primitive datatype or the ·simple - * ur-type definition· by repeatedly following the {base type definition}. - * - * NOTE: this is done in xmlSchemaCheckTypeDefCircular(). - */ - return (0); -} - -/** - * xmlSchemaCheckCOSSTRestricts: - * @ctxt: the schema parser context - * @type: the simple type definition - * - * Schema Component Constraint: - * Derivation Valid (Restriction, Simple) (cos-st-restricts) - - * Checks if the given @type (simpleType) is derived validly by restriction. - * STATUS: - * - * Returns -1 on internal errors, 0 if the type is validly derived, - * a positive error code otherwise. - */ -static int -xmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - xmlChar *str = NULL; - - if (type->type != XML_SCHEMA_TYPE_SIMPLE) { - PERROR_INT("xmlSchemaCheckCOSSTRestricts", - "given type is not a user-derived simpleType"); - return (-1); - } - - if (WXS_IS_ATOMIC(type)) { - xmlSchemaTypePtr primitive; - /* - * 1.1 The {base type definition} must be an atomic simple - * type definition or a built-in primitive datatype. - */ - if (! WXS_IS_ATOMIC(type->baseType)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_1_1, - WXS_BASIC_CAST type, NULL, - "The base type '%s' is not an atomic simple type", - xmlSchemaGetComponentQName(&str, type->baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_1_1); - } - /* 1.2 The {final} of the {base type definition} must not contain - * restriction. - */ - /* OPTIMIZE TODO : This is already done in xmlSchemaCheckStPropsCorrect */ - if (xmlSchemaTypeFinalContains(type->baseType, - XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_1_2, - WXS_BASIC_CAST type, NULL, - "The final of its base type '%s' must not contain 'restriction'", - xmlSchemaGetComponentQName(&str, type->baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_1_2); - } - - /* - * 1.3.1 DF must be an allowed constraining facet for the {primitive - * type definition}, as specified in the appropriate subsection of 3.2 - * Primitive datatypes. - */ - if (type->facets != NULL) { - xmlSchemaFacetPtr facet; - int ok = 1; - - primitive = xmlSchemaGetPrimitiveType(type); - if (primitive == NULL) { - PERROR_INT("xmlSchemaCheckCOSSTRestricts", - "failed to get primitive type"); - return (-1); - } - facet = type->facets; - do { - if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) { - ok = 0; - xmlSchemaPIllegalFacetAtomicErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1, - type, primitive, facet); - } - facet = facet->next; - } while (facet != NULL); - if (ok == 0) - return (XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1); - } - /* - * SPEC (1.3.2) "If there is a facet of the same kind in the {facets} - * of the {base type definition} (call this BF),then the DF's {value} - * must be a valid restriction of BF's {value} as defined in - * [XML Schemas: Datatypes]." - * - * NOTE (1.3.2) Facet derivation constraints are currently handled in - * xmlSchemaDeriveAndValidateFacets() - */ - } else if (WXS_IS_LIST(type)) { - xmlSchemaTypePtr itemType = NULL; - - itemType = type->subtypes; - if ((itemType == NULL) || (! WXS_IS_SIMPLE(itemType))) { - PERROR_INT("xmlSchemaCheckCOSSTRestricts", - "failed to evaluate the item type"); - return (-1); - } - if (WXS_IS_TYPE_NOT_FIXED(itemType)) - xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt); - /* - * 2.1 The {item type definition} must have a {variety} of atomic or - * union (in which case all the {member type definitions} - * must be atomic). - */ - if ((! WXS_IS_ATOMIC(itemType)) && - (! WXS_IS_UNION(itemType))) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_2_1, - WXS_BASIC_CAST type, NULL, - "The item type '%s' does not have a variety of atomic or union", - xmlSchemaGetComponentQName(&str, itemType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1); - } else if (WXS_IS_UNION(itemType)) { - xmlSchemaTypeLinkPtr member; - - member = itemType->memberTypes; - while (member != NULL) { - if (! WXS_IS_ATOMIC(member->type)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_2_1, - WXS_BASIC_CAST type, NULL, - "The item type is a union type, but the " - "member type '%s' of this item type is not atomic", - xmlSchemaGetComponentQName(&str, member->type)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1); - } - member = member->next; - } - } - - if (WXS_IS_ANY_SIMPLE_TYPE(type->baseType)) { - xmlSchemaFacetPtr facet; - /* - * This is the case if we have: <simpleType><list .. - */ - /* - * 2.3.1 - * 2.3.1.1 The {final} of the {item type definition} must not - * contain list. - */ - if (xmlSchemaTypeFinalContains(itemType, - XML_SCHEMAS_TYPE_FINAL_LIST)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1, - WXS_BASIC_CAST type, NULL, - "The final of its item type '%s' must not contain 'list'", - xmlSchemaGetComponentQName(&str, itemType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1); - } - /* - * 2.3.1.2 The {facets} must only contain the whiteSpace - * facet component. - * OPTIMIZE TODO: the S4S already disallows any facet - * to be specified. - */ - if (type->facets != NULL) { - facet = type->facets; - do { - if (facet->type != XML_SCHEMA_FACET_WHITESPACE) { - xmlSchemaPIllegalFacetListUnionErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2, - type, facet); - return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2); - } - facet = facet->next; - } while (facet != NULL); - } - /* - * MAYBE TODO: (Hmm, not really) Datatypes states: - * A ·list· datatype can be ·derived· from an ·atomic· datatype - * whose ·lexical space· allows space (such as string or anyURI)or - * a ·union· datatype any of whose {member type definitions}'s - * ·lexical space· allows space. - */ - } else { - /* - * This is the case if we have: <simpleType><restriction ... - * I.e. the variety of "list" is inherited. - */ - /* - * 2.3.2 - * 2.3.2.1 The {base type definition} must have a {variety} of list. - */ - if (! WXS_IS_LIST(type->baseType)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1, - WXS_BASIC_CAST type, NULL, - "The base type '%s' must be a list type", - xmlSchemaGetComponentQName(&str, type->baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1); - } - /* - * 2.3.2.2 The {final} of the {base type definition} must not - * contain restriction. - */ - if (xmlSchemaTypeFinalContains(type->baseType, - XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2, - WXS_BASIC_CAST type, NULL, - "The 'final' of the base type '%s' must not contain 'restriction'", - xmlSchemaGetComponentQName(&str, type->baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2); - } - /* - * 2.3.2.3 The {item type definition} must be validly derived - * from the {base type definition}'s {item type definition} given - * the empty set, as defined in Type Derivation OK (Simple) (§3.14.6). - */ - { - xmlSchemaTypePtr baseItemType; - - baseItemType = type->baseType->subtypes; - if ((baseItemType == NULL) || (! WXS_IS_SIMPLE(baseItemType))) { - PERROR_INT("xmlSchemaCheckCOSSTRestricts", - "failed to eval the item type of a base type"); - return (-1); - } - if ((itemType != baseItemType) && - (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType, - baseItemType, 0) != 0)) { - xmlChar *strBIT = NULL, *strBT = NULL; - xmlSchemaPCustomErrExt(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3, - WXS_BASIC_CAST type, NULL, - "The item type '%s' is not validly derived from " - "the item type '%s' of the base type '%s'", - xmlSchemaGetComponentQName(&str, itemType), - xmlSchemaGetComponentQName(&strBIT, baseItemType), - xmlSchemaGetComponentQName(&strBT, type->baseType)); - - FREE_AND_NULL(str) - FREE_AND_NULL(strBIT) - FREE_AND_NULL(strBT) - return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3); - } - } - - if (type->facets != NULL) { - xmlSchemaFacetPtr facet; - int ok = 1; - /* - * 2.3.2.4 Only length, minLength, maxLength, whiteSpace, pattern - * and enumeration facet components are allowed among the {facets}. - */ - facet = type->facets; - do { - switch (facet->type) { - case XML_SCHEMA_FACET_LENGTH: - case XML_SCHEMA_FACET_MINLENGTH: - case XML_SCHEMA_FACET_MAXLENGTH: - case XML_SCHEMA_FACET_WHITESPACE: - /* - * TODO: 2.5.1.2 List datatypes - * The value of ·whiteSpace· is fixed to the value collapse. - */ - case XML_SCHEMA_FACET_PATTERN: - case XML_SCHEMA_FACET_ENUMERATION: - break; - default: { - xmlSchemaPIllegalFacetListUnionErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4, - type, facet); - /* - * We could return, but it's nicer to report all - * invalid facets. - */ - ok = 0; - } - } - facet = facet->next; - } while (facet != NULL); - if (ok == 0) - return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4); - /* - * SPEC (2.3.2.5) (same as 1.3.2) - * - * NOTE (2.3.2.5) This is currently done in - * xmlSchemaDeriveAndValidateFacets() - */ - } - } - } else if (WXS_IS_UNION(type)) { - /* - * 3.1 The {member type definitions} must all have {variety} of - * atomic or list. - */ - xmlSchemaTypeLinkPtr member; - - member = type->memberTypes; - while (member != NULL) { - if (WXS_IS_TYPE_NOT_FIXED(member->type)) - xmlSchemaTypeFixup(member->type, ACTXT_CAST pctxt); - - if ((! WXS_IS_ATOMIC(member->type)) && - (! WXS_IS_LIST(member->type))) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_3_1, - WXS_BASIC_CAST type, NULL, - "The member type '%s' is neither an atomic, nor a list type", - xmlSchemaGetComponentQName(&str, member->type)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_3_1); - } - member = member->next; - } - /* - * 3.3.1 If the {base type definition} is the ·simple ur-type - * definition· - */ - if (type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) { - /* - * 3.3.1.1 All of the {member type definitions} must have a - * {final} which does not contain union. - */ - member = type->memberTypes; - while (member != NULL) { - if (xmlSchemaTypeFinalContains(member->type, - XML_SCHEMAS_TYPE_FINAL_UNION)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1, - WXS_BASIC_CAST type, NULL, - "The 'final' of member type '%s' contains 'union'", - xmlSchemaGetComponentQName(&str, member->type)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1); - } - member = member->next; - } - /* - * 3.3.1.2 The {facets} must be empty. - */ - if (type->facetSet != NULL) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2, - WXS_BASIC_CAST type, NULL, - "No facets allowed", NULL); - return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2); - } - } else { - /* - * 3.3.2.1 The {base type definition} must have a {variety} of union. - * I.e. the variety of "list" is inherited. - */ - if (! WXS_IS_UNION(type->baseType)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1, - WXS_BASIC_CAST type, NULL, - "The base type '%s' is not a union type", - xmlSchemaGetComponentQName(&str, type->baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1); - } - /* - * 3.3.2.2 The {final} of the {base type definition} must not contain restriction. - */ - if (xmlSchemaTypeFinalContains(type->baseType, - XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2, - WXS_BASIC_CAST type, NULL, - "The 'final' of its base type '%s' must not contain 'restriction'", - xmlSchemaGetComponentQName(&str, type->baseType)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2); - } - /* - * 3.3.2.3 The {member type definitions}, in order, must be validly - * derived from the corresponding type definitions in the {base - * type definition}'s {member type definitions} given the empty set, - * as defined in Type Derivation OK (Simple) (§3.14.6). - */ - { - xmlSchemaTypeLinkPtr baseMember; - - /* - * OPTIMIZE: if the type is restricting, it has no local defined - * member types and inherits the member types of the base type; - * thus a check for equality can be skipped. - */ - /* - * Even worse: I cannot see a scenario where a restricting - * union simple type can have other member types as the member - * types of it's base type. This check seems not necessary with - * respect to the derivation process in libxml2. - * But necessary if constructing types with an API. - */ - if (type->memberTypes != NULL) { - member = type->memberTypes; - baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(type->baseType); - if ((member == NULL) && (baseMember != NULL)) { - PERROR_INT("xmlSchemaCheckCOSSTRestricts", - "different number of member types in base"); - } - while (member != NULL) { - if (baseMember == NULL) { - PERROR_INT("xmlSchemaCheckCOSSTRestricts", - "different number of member types in base"); - } else if ((member->type != baseMember->type) && - (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, - member->type, baseMember->type, 0) != 0)) { - xmlChar *strBMT = NULL, *strBT = NULL; - - xmlSchemaPCustomErrExt(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3, - WXS_BASIC_CAST type, NULL, - "The member type %s is not validly " - "derived from its corresponding member " - "type %s of the base type %s", - xmlSchemaGetComponentQName(&str, member->type), - xmlSchemaGetComponentQName(&strBMT, baseMember->type), - xmlSchemaGetComponentQName(&strBT, type->baseType)); - FREE_AND_NULL(str) - FREE_AND_NULL(strBMT) - FREE_AND_NULL(strBT) - return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3); - } - member = member->next; - baseMember = baseMember->next; - } - } - } - /* - * 3.3.2.4 Only pattern and enumeration facet components are - * allowed among the {facets}. - */ - if (type->facets != NULL) { - xmlSchemaFacetPtr facet; - int ok = 1; - - facet = type->facets; - do { - if ((facet->type != XML_SCHEMA_FACET_PATTERN) && - (facet->type != XML_SCHEMA_FACET_ENUMERATION)) { - xmlSchemaPIllegalFacetListUnionErr(pctxt, - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4, - type, facet); - ok = 0; - } - facet = facet->next; - } while (facet != NULL); - if (ok == 0) - return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4); - - } - /* - * SPEC (3.3.2.5) (same as 1.3.2) - * - * NOTE (3.3.2.5) This is currently done in - * xmlSchemaDeriveAndValidateFacets() - */ - } - } - - return (0); -} - -/** - * xmlSchemaCheckSRCSimpleType: - * @ctxt: the schema parser context - * @type: the simple type definition - * - * Checks crc-simple-type constraints. - * - * Returns 0 if the constraints are satisfied, - * if not a positive error code and -1 on internal - * errors. - */ -#if 0 -static int -xmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaTypePtr type) -{ - /* - * src-simple-type.1 The corresponding simple type definition, if any, - * must satisfy the conditions set out in Constraints on Simple Type - * Definition Schema Components (§3.14.6). - */ - if (WXS_IS_RESTRICTION(type)) { - /* - * src-simple-type.2 "If the <restriction> alternative is chosen, - * either it must have a base [attribute] or a <simpleType> among its - * [children], but not both." - * NOTE: This is checked in the parse function of <restriction>. - */ - /* - * - */ - } else if (WXS_IS_LIST(type)) { - /* src-simple-type.3 "If the <list> alternative is chosen, either it must have - * an itemType [attribute] or a <simpleType> among its [children], - * but not both." - * - * NOTE: This is checked in the parse function of <list>. - */ - } else if (WXS_IS_UNION(type)) { - /* - * src-simple-type.4 is checked in xmlSchemaCheckUnionTypeDefCircular(). - */ - } - return (0); -} -#endif - -static int -xmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt) -{ - if (ctxt->vctxt == NULL) { - ctxt->vctxt = xmlSchemaNewValidCtxt(NULL); - if (ctxt->vctxt == NULL) { - xmlSchemaPErr(ctxt, NULL, - XML_SCHEMAP_INTERNAL, - "Internal error: xmlSchemaCreateVCtxtOnPCtxt, " - "failed to create a temp. validation context.\n", - NULL, NULL); - return (-1); - } - /* TODO: Pass user data. */ - xmlSchemaSetValidErrors(ctxt->vctxt, - ctxt->error, ctxt->warning, ctxt->errCtxt); - xmlSchemaSetValidStructuredErrors(ctxt->vctxt, - ctxt->serror, ctxt->errCtxt); - } - return (0); -} - -static int -xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt, - xmlNodePtr node, - xmlSchemaTypePtr type, - const xmlChar *value, - xmlSchemaValPtr *retVal, - int fireErrors, - int normalize, - int isNormalized); - -/** - * xmlSchemaParseCheckCOSValidDefault: - * @pctxt: the schema parser context - * @type: the simple type definition - * @value: the default value - * @node: an optional node (the holder of the value) - * - * Schema Component Constraint: Element Default Valid (Immediate) - * (cos-valid-default) - * This will be used by the parser only. For the validator there's - * an other version. - * - * Returns 0 if the constraints are satisfied, - * if not, a positive error code and -1 on internal - * errors. - */ -static int -xmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt, - xmlNodePtr node, - xmlSchemaTypePtr type, - const xmlChar *value, - xmlSchemaValPtr *val) -{ - int ret = 0; - - /* - * cos-valid-default: - * Schema Component Constraint: Element Default Valid (Immediate) - * For a string to be a valid default with respect to a type - * definition the appropriate case among the following must be true: - */ - if WXS_IS_COMPLEX(type) { - /* - * Complex type. - * - * SPEC (2.1) "its {content type} must be a simple type definition - * or mixed." - * SPEC (2.2.2) "If the {content type} is mixed, then the {content - * type}'s particle must be ·emptiable· as defined by - * Particle Emptiable (§3.9.6)." - */ - if ((! WXS_HAS_SIMPLE_CONTENT(type)) && - ((! WXS_HAS_MIXED_CONTENT(type)) || (! WXS_EMPTIABLE(type)))) { - /* NOTE that this covers (2.2.2) as well. */ - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_COS_VALID_DEFAULT_2_1, - WXS_BASIC_CAST type, type->node, - "For a string to be a valid default, the type definition " - "must be a simple type or a complex type with mixed content " - "and a particle emptiable", NULL); - return(XML_SCHEMAP_COS_VALID_DEFAULT_2_1); - } - } - /* - * 1 If the type definition is a simple type definition, then the string - * must be ·valid· with respect to that definition as defined by String - * Valid (§3.14.4). - * - * AND - * - * 2.2.1 If the {content type} is a simple type definition, then the - * string must be ·valid· with respect to that simple type definition - * as defined by String Valid (§3.14.4). - */ - if (WXS_IS_SIMPLE(type)) - ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node, - type, value, val, 1, 1, 0); - else if (WXS_HAS_SIMPLE_CONTENT(type)) - ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node, - type->contentTypeDef, value, val, 1, 1, 0); - else - return (ret); - - if (ret < 0) { - PERROR_INT("xmlSchemaParseCheckCOSValidDefault", - "calling xmlSchemaVCheckCVCSimpleType()"); - } - - return (ret); -} - -/** - * xmlSchemaCheckCTPropsCorrect: - * @ctxt: the schema parser context - * @type: the complex type definition - * - *.(4.6) Constraints on Complex Type Definition Schema Components - * Schema Component Constraint: - * Complex Type Definition Properties Correct (ct-props-correct) - * STATUS: (seems) complete - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - /* - * TODO: Correct the error code; XML_SCHEMAP_SRC_CT_1 is used temporarily. - * - * SPEC (1) "The values of the properties of a complex type definition must - * be as described in the property tableau in The Complex Type Definition - * Schema Component (§3.4.1), modulo the impact of Missing - * Sub-components (§5.3)." - */ - if ((type->baseType != NULL) && - (WXS_IS_SIMPLE(type->baseType)) && - (WXS_IS_EXTENSION(type) == 0)) { - /* - * SPEC (2) "If the {base type definition} is a simple type definition, - * the {derivation method} must be extension." - */ - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_SRC_CT_1, - NULL, WXS_BASIC_CAST type, - "If the base type is a simple type, the derivation method must be " - "'extension'", NULL, NULL); - return (XML_SCHEMAP_SRC_CT_1); - } - /* - * SPEC (3) "Circular definitions are disallowed, except for the ·ur-type - * definition·. That is, it must be possible to reach the ·ur-type - * definition by repeatedly following the {base type definition}." - * - * NOTE (3) is done in xmlSchemaCheckTypeDefCircular(). - */ - /* - * NOTE that (4) and (5) need the following: - * - attribute uses need to be already inherited (apply attr. prohibitions) - * - attribute group references need to be expanded already - * - simple types need to be typefixed already - */ - if (type->attrUses && - (((xmlSchemaItemListPtr) type->attrUses)->nbItems > 1)) - { - xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr) type->attrUses; - xmlSchemaAttributeUsePtr use, tmp; - int i, j, hasId = 0; - - for (i = uses->nbItems -1; i >= 0; i--) { - use = uses->items[i]; - - /* - * SPEC ct-props-correct - * (4) "Two distinct attribute declarations in the - * {attribute uses} must not have identical {name}s and - * {target namespace}s." - */ - if (i > 0) { - for (j = i -1; j >= 0; j--) { - tmp = uses->items[j]; - if ((WXS_ATTRUSE_DECL_NAME(use) == - WXS_ATTRUSE_DECL_NAME(tmp)) && - (WXS_ATTRUSE_DECL_TNS(use) == - WXS_ATTRUSE_DECL_TNS(tmp))) - { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_AG_PROPS_CORRECT, - NULL, WXS_BASIC_CAST type, - "Duplicate %s", - xmlSchemaGetComponentDesignation(&str, use), - NULL); - FREE_AND_NULL(str); - /* - * Remove the duplicate. - */ - if (xmlSchemaItemListRemove(uses, i) == -1) - goto exit_failure; - goto next_use; - } - } - } - /* - * SPEC ct-props-correct - * (5) "Two distinct attribute declarations in the - * {attribute uses} must not have {type definition}s which - * are or are derived from ID." - */ - if (WXS_ATTRUSE_TYPEDEF(use) != NULL) { - if (xmlSchemaIsDerivedFromBuiltInType( - WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) - { - if (hasId) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_AG_PROPS_CORRECT, - NULL, WXS_BASIC_CAST type, - "There must not exist more than one attribute " - "declaration of type 'xs:ID' " - "(or derived from 'xs:ID'). The %s violates this " - "constraint", - xmlSchemaGetComponentDesignation(&str, use), - NULL); - FREE_AND_NULL(str); - if (xmlSchemaItemListRemove(uses, i) == -1) - goto exit_failure; - } - - hasId = 1; - } - } -next_use: {} - } - } - return (0); -exit_failure: - return(-1); -} - -static int -xmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA, - xmlSchemaTypePtr typeB) -{ - /* - * TODO: This should implement component-identity - * in the future. - */ - if ((typeA == NULL) || (typeB == NULL)) - return (0); - return (typeA == typeB); -} - -/** - * xmlSchemaCheckCOSCTDerivedOK: - * @ctxt: the schema parser context - * @type: the to-be derived complex type definition - * @baseType: the base complex type definition - * @set: the given set - * - * Schema Component Constraint: - * Type Derivation OK (Complex) (cos-ct-derived-ok) - * - * STATUS: completed - * - * Returns 0 if the constraints are satisfied, or 1 - * if not. - */ -static int -xmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt, - xmlSchemaTypePtr type, - xmlSchemaTypePtr baseType, - int set) -{ - int equal = xmlSchemaAreEqualTypes(type, baseType); - /* TODO: Error codes. */ - /* - * SPEC "For a complex type definition (call it D, for derived) - * to be validly derived from a type definition (call this - * B, for base) given a subset of {extension, restriction} - * all of the following must be true:" - */ - if (! equal) { - /* - * SPEC (1) "If B and D are not the same type definition, then the - * {derivation method} of D must not be in the subset." - */ - if (((set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(type))) || - ((set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(type)))) - return (1); - } else { - /* - * SPEC (2.1) "B and D must be the same type definition." - */ - return (0); - } - /* - * SPEC (2.2) "B must be D's {base type definition}." - */ - if (type->baseType == baseType) - return (0); - /* - * SPEC (2.3.1) "D's {base type definition} must not be the ·ur-type - * definition·." - */ - if (WXS_IS_ANYTYPE(type->baseType)) - return (1); - - if (WXS_IS_COMPLEX(type->baseType)) { - /* - * SPEC (2.3.2.1) "If D's {base type definition} is complex, then it - * must be validly derived from B given the subset as defined by this - * constraint." - */ - return (xmlSchemaCheckCOSCTDerivedOK(actxt, type->baseType, - baseType, set)); - } else { - /* - * SPEC (2.3.2.2) "If D's {base type definition} is simple, then it - * must be validly derived from B given the subset as defined in Type - * Derivation OK (Simple) (§3.14.6). - */ - return (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType, - baseType, set)); - } -} - -/** - * xmlSchemaCheckCOSDerivedOK: - * @type: the derived simple type definition - * @baseType: the base type definition - * - * Calls: - * Type Derivation OK (Simple) AND Type Derivation OK (Complex) - * - * Checks whether @type can be validly derived from @baseType. - * - * Returns 0 on success, an positive error code otherwise. - */ -static int -xmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt, - xmlSchemaTypePtr type, - xmlSchemaTypePtr baseType, - int set) -{ - if (WXS_IS_SIMPLE(type)) - return (xmlSchemaCheckCOSSTDerivedOK(actxt, type, baseType, set)); - else - return (xmlSchemaCheckCOSCTDerivedOK(actxt, type, baseType, set)); -} - -/** - * xmlSchemaCheckCOSCTExtends: - * @ctxt: the schema parser context - * @type: the complex type definition - * - * (3.4.6) Constraints on Complex Type Definition Schema Components - * Schema Component Constraint: - * Derivation Valid (Extension) (cos-ct-extends) - * - * STATUS: - * missing: - * (1.5) - * (1.4.3.2.2.2) "Particle Valid (Extension)" - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaTypePtr type) -{ - xmlSchemaTypePtr base = type->baseType; - /* - * TODO: Correct the error code; XML_SCHEMAP_COS_CT_EXTENDS_1_1 is used - * temporarily only. - */ - /* - * SPEC (1) "If the {base type definition} is a complex type definition, - * then all of the following must be true:" - */ - if (WXS_IS_COMPLEX(base)) { - /* - * SPEC (1.1) "The {final} of the {base type definition} must not - * contain extension." - */ - if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_COS_CT_EXTENDS_1_1, - WXS_BASIC_CAST type, NULL, - "The 'final' of the base type definition " - "contains 'extension'", NULL); - return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); - } - - /* - * ATTENTION: The constrains (1.2) and (1.3) are not applied, - * since they are automatically satisfied through the - * inheriting mechanism. - * Note that even if redefining components, the inheriting mechanism - * is used. - */ -#if 0 - /* - * SPEC (1.2) "Its {attribute uses} must be a subset of the {attribute - * uses} - * of the complex type definition itself, that is, for every attribute - * use in the {attribute uses} of the {base type definition}, there - * must be an attribute use in the {attribute uses} of the complex - * type definition itself whose {attribute declaration} has the same - * {name}, {target namespace} and {type definition} as its attribute - * declaration" - */ - if (base->attrUses != NULL) { - int i, j, found; - xmlSchemaAttributeUsePtr use, buse; - - for (i = 0; i < (WXS_LIST_CAST base->attrUses)->nbItems; i ++) { - buse = (WXS_LIST_CAST base->attrUses)->items[i]; - found = 0; - if (type->attrUses != NULL) { - use = (WXS_LIST_CAST type->attrUses)->items[j]; - for (j = 0; j < (WXS_LIST_CAST type->attrUses)->nbItems; j ++) - { - if ((WXS_ATTRUSE_DECL_NAME(use) == - WXS_ATTRUSE_DECL_NAME(buse)) && - (WXS_ATTRUSE_DECL_TNS(use) == - WXS_ATTRUSE_DECL_TNS(buse)) && - (WXS_ATTRUSE_TYPEDEF(use) == - WXS_ATTRUSE_TYPEDEF(buse)) - { - found = 1; - break; - } - } - } - if (! found) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAP_COS_CT_EXTENDS_1_2, - NULL, WXS_BASIC_CAST type, - /* - * TODO: The report does not indicate that also the - * type needs to be the same. - */ - "This type is missing a matching correspondent " - "for its {base type}'s %s in its {attribute uses}", - xmlSchemaGetComponentDesignation(&str, - buse->children), - NULL); - FREE_AND_NULL(str) - } - } - } - /* - * SPEC (1.3) "If it has an {attribute wildcard}, the complex type - * definition must also have one, and the base type definition's - * {attribute wildcard}'s {namespace constraint} must be a subset - * of the complex type definition's {attribute wildcard}'s {namespace - * constraint}, as defined by Wildcard Subset (§3.10.6)." - */ - - /* - * MAYBE TODO: Enable if ever needed. But this will be needed only - * if created the type via a schema construction API. - */ - if (base->attributeWildcard != NULL) { - if (type->attributeWilcard == NULL) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_COS_CT_EXTENDS_1_3, - NULL, type, - "The base %s has an attribute wildcard, " - "but this type is missing an attribute wildcard", - xmlSchemaGetComponentDesignation(&str, base)); - FREE_AND_NULL(str) - - } else if (xmlSchemaCheckCOSNSSubset( - base->attributeWildcard, type->attributeWildcard)) - { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_COS_CT_EXTENDS_1_3, - NULL, type, - "The attribute wildcard is not a valid " - "superset of the one in the base %s", - xmlSchemaGetComponentDesignation(&str, base)); - FREE_AND_NULL(str) - } - } -#endif - /* - * SPEC (1.4) "One of the following must be true:" - */ - if ((type->contentTypeDef != NULL) && - (type->contentTypeDef == base->contentTypeDef)) { - /* - * SPEC (1.4.1) "The {content type} of the {base type definition} - * and the {content type} of the complex type definition itself - * must be the same simple type definition" - * PASS - */ - } else if ((type->contentType == XML_SCHEMA_CONTENT_EMPTY) && - (base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) { - /* - * SPEC (1.4.2) "The {content type} of both the {base type - * definition} and the complex type definition itself must - * be empty." - * PASS - */ - } else { - /* - * SPEC (1.4.3) "All of the following must be true:" - */ - if (type->subtypes == NULL) { - /* - * SPEC 1.4.3.1 The {content type} of the complex type - * definition itself must specify a particle. - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_COS_CT_EXTENDS_1_1, - WXS_BASIC_CAST type, NULL, - "The content type must specify a particle", NULL); - return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); - } - /* - * SPEC (1.4.3.2) "One of the following must be true:" - */ - if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) { - /* - * SPEC (1.4.3.2.1) "The {content type} of the {base type - * definition} must be empty. - * PASS - */ - } else { - /* - * SPEC (1.4.3.2.2) "All of the following must be true:" - */ - if ((type->contentType != base->contentType) || - ((type->contentType != XML_SCHEMA_CONTENT_MIXED) && - (type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) { - /* - * SPEC (1.4.3.2.2.1) "Both {content type}s must be mixed - * or both must be element-only." - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_COS_CT_EXTENDS_1_1, - WXS_BASIC_CAST type, NULL, - "The content type of both, the type and its base " - "type, must either 'mixed' or 'element-only'", NULL); - return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); - } - /* - * URGENT TODO SPEC (1.4.3.2.2.2) "The particle of the - * complex type definition must be a ·valid extension· - * of the {base type definition}'s particle, as defined - * in Particle Valid (Extension) (§3.9.6)." - * - * NOTE that we won't check "Particle Valid (Extension)", - * since it is ensured by the derivation process in - * xmlSchemaTypeFixup(). We need to implement this when heading - * for a construction API - * TODO: !! This is needed to be checked if redefining a type !! - */ - } - /* - * URGENT TODO (1.5) - */ - } - } else { - /* - * SPEC (2) "If the {base type definition} is a simple type definition, - * then all of the following must be true:" - */ - if (type->contentTypeDef != base) { - /* - * SPEC (2.1) "The {content type} must be the same simple type - * definition." - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_COS_CT_EXTENDS_1_1, - WXS_BASIC_CAST type, NULL, - "The content type must be the simple base type", NULL); - return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); - } - if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) { - /* - * SPEC (2.2) "The {final} of the {base type definition} must not - * contain extension" - * NOTE that this is the same as (1.1). - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_COS_CT_EXTENDS_1_1, - WXS_BASIC_CAST type, NULL, - "The 'final' of the base type definition " - "contains 'extension'", NULL); - return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); - } - } - return (0); -} - -/** - * xmlSchemaCheckDerivationOKRestriction: - * @ctxt: the schema parser context - * @type: the complex type definition - * - * (3.4.6) Constraints on Complex Type Definition Schema Components - * Schema Component Constraint: - * Derivation Valid (Restriction, Complex) (derivation-ok-restriction) - * - * STATUS: - * missing: - * (5.4.2) ??? - * - * ATTENTION: - * In XML Schema 1.1 this will be: - * Validation Rule: Checking complex type subsumption - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaTypePtr type) -{ - xmlSchemaTypePtr base; - - /* - * TODO: Correct the error code; XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 is used - * temporarily only. - */ - base = type->baseType; - if (! WXS_IS_COMPLEX(base)) { - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, - type->node, WXS_BASIC_CAST type, - "The base type must be a complex type", NULL, NULL); - return(ctxt->err); - } - if (base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) { - /* - * SPEC (1) "The {base type definition} must be a complex type - * definition whose {final} does not contain restriction." - */ - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, - type->node, WXS_BASIC_CAST type, - "The 'final' of the base type definition " - "contains 'restriction'", NULL, NULL); - return (ctxt->err); - } - /* - * SPEC (2), (3) and (4) - * Those are handled in a separate function, since the - * same constraints are needed for redefinition of - * attribute groups as well. - */ - if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt, - XML_SCHEMA_ACTION_DERIVE, - WXS_BASIC_CAST type, WXS_BASIC_CAST base, - type->attrUses, base->attrUses, - type->attributeWildcard, - base->attributeWildcard) == -1) - { - return(-1); - } - /* - * SPEC (5) "One of the following must be true:" - */ - if (base->builtInType == XML_SCHEMAS_ANYTYPE) { - /* - * SPEC (5.1) "The {base type definition} must be the - * ·ur-type definition·." - * PASS - */ - } else if ((type->contentType == XML_SCHEMA_CONTENT_SIMPLE) || - (type->contentType == XML_SCHEMA_CONTENT_BASIC)) { - /* - * SPEC (5.2.1) "The {content type} of the complex type definition - * must be a simple type definition" - * - * SPEC (5.2.2) "One of the following must be true:" - */ - if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) || - (base->contentType == XML_SCHEMA_CONTENT_BASIC)) - { - int err; - /* - * SPEC (5.2.2.1) "The {content type} of the {base type - * definition} must be a simple type definition from which - * the {content type} is validly derived given the empty - * set as defined in Type Derivation OK (Simple) (§3.14.6)." - * - * ATTENTION TODO: This seems not needed if the type implicitely - * derived from the base type. - * - */ - err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt, - type->contentTypeDef, base->contentTypeDef, 0); - if (err != 0) { - xmlChar *strA = NULL, *strB = NULL; - - if (err == -1) - return(-1); - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, - NULL, WXS_BASIC_CAST type, - "The {content type} %s is not validly derived from the " - "base type's {content type} %s", - xmlSchemaGetComponentDesignation(&strA, - type->contentTypeDef), - xmlSchemaGetComponentDesignation(&strB, - base->contentTypeDef)); - FREE_AND_NULL(strA); - FREE_AND_NULL(strB); - return(ctxt->err); - } - } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) && - (xmlSchemaIsParticleEmptiable( - (xmlSchemaParticlePtr) base->subtypes))) { - /* - * SPEC (5.2.2.2) "The {base type definition} must be mixed - * and have a particle which is ·emptiable· as defined in - * Particle Emptiable (§3.9.6)." - * PASS - */ - } else { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, - WXS_BASIC_CAST type, NULL, - "The content type of the base type must be either " - "a simple type or 'mixed' and an emptiable particle", NULL); - return (ctxt->err); - } - } else if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) { - /* - * SPEC (5.3.1) "The {content type} of the complex type itself must - * be empty" - */ - if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) { - /* - * SPEC (5.3.2.1) "The {content type} of the {base type - * definition} must also be empty." - * PASS - */ - } else if (((base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) || - (base->contentType == XML_SCHEMA_CONTENT_MIXED)) && - xmlSchemaIsParticleEmptiable( - (xmlSchemaParticlePtr) base->subtypes)) { - /* - * SPEC (5.3.2.2) "The {content type} of the {base type - * definition} must be elementOnly or mixed and have a particle - * which is ·emptiable· as defined in Particle Emptiable (§3.9.6)." - * PASS - */ - } else { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, - WXS_BASIC_CAST type, NULL, - "The content type of the base type must be either " - "empty or 'mixed' (or 'elements-only') and an emptiable " - "particle", NULL); - return (ctxt->err); - } - } else if ((type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) || - WXS_HAS_MIXED_CONTENT(type)) { - /* - * SPEC (5.4.1.1) "The {content type} of the complex type definition - * itself must be element-only" - */ - if (WXS_HAS_MIXED_CONTENT(type) && (! WXS_HAS_MIXED_CONTENT(base))) { - /* - * SPEC (5.4.1.2) "The {content type} of the complex type - * definition itself and of the {base type definition} must be - * mixed" - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, - WXS_BASIC_CAST type, NULL, - "If the content type is 'mixed', then the content type of the " - "base type must also be 'mixed'", NULL); - return (ctxt->err); - } - /* - * SPEC (5.4.2) "The particle of the complex type definition itself - * must be a ·valid restriction· of the particle of the {content - * type} of the {base type definition} as defined in Particle Valid - * (Restriction) (§3.9.6). - * - * URGENT TODO: (5.4.2) - */ - } else { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, - WXS_BASIC_CAST type, NULL, - "The type is not a valid restriction of its base type", NULL); - return (ctxt->err); - } - return (0); -} - -/** - * xmlSchemaCheckCTComponent: - * @ctxt: the schema parser context - * @type: the complex type definition - * - * (3.4.6) Constraints on Complex Type Definition Schema Components - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaTypePtr type) -{ - int ret; - /* - * Complex Type Definition Properties Correct - */ - ret = xmlSchemaCheckCTPropsCorrect(ctxt, type); - if (ret != 0) - return (ret); - if (WXS_IS_EXTENSION(type)) - ret = xmlSchemaCheckCOSCTExtends(ctxt, type); - else - ret = xmlSchemaCheckDerivationOKRestriction(ctxt, type); - return (ret); -} - -/** - * xmlSchemaCheckSRCCT: - * @ctxt: the schema parser context - * @type: the complex type definition - * - * (3.4.3) Constraints on XML Representations of Complex Type Definitions: - * Schema Representation Constraint: - * Complex Type Definition Representation OK (src-ct) - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaTypePtr type) -{ - xmlSchemaTypePtr base; - int ret = 0; - - /* - * TODO: Adjust the error codes here, as I used - * XML_SCHEMAP_SRC_CT_1 only yet. - */ - base = type->baseType; - if (! WXS_HAS_SIMPLE_CONTENT(type)) { - /* - * 1 If the <complexContent> alternative is chosen, the type definition - * ·resolved· to by the ·actual value· of the base [attribute] - * must be a complex type definition; - */ - if (! WXS_IS_COMPLEX(base)) { - xmlChar *str = NULL; - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_CT_1, - WXS_BASIC_CAST type, type->node, - "If using <complexContent>, the base type is expected to be " - "a complex type. The base type '%s' is a simple type", - xmlSchemaFormatQName(&str, base->targetNamespace, - base->name)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_SRC_CT_1); - } - } else { - /* - * SPEC - * 2 If the <simpleContent> alternative is chosen, all of the - * following must be true: - * 2.1 The type definition ·resolved· to by the ·actual value· of the - * base [attribute] must be one of the following: - */ - if (WXS_IS_SIMPLE(base)) { - if (WXS_IS_EXTENSION(type) == 0) { - xmlChar *str = NULL; - /* - * 2.1.3 only if the <extension> alternative is also - * chosen, a simple type definition. - */ - /* TODO: Change error code to ..._SRC_CT_2_1_3. */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_CT_1, - WXS_BASIC_CAST type, NULL, - "If using <simpleContent> and <restriction>, the base " - "type must be a complex type. The base type '%s' is " - "a simple type", - xmlSchemaFormatQName(&str, base->targetNamespace, - base->name)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_SRC_CT_1); - } - } else { - /* Base type is a complex type. */ - if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) || - (base->contentType == XML_SCHEMA_CONTENT_BASIC)) { - /* - * 2.1.1 a complex type definition whose {content type} is a - * simple type definition; - * PASS - */ - if (base->contentTypeDef == NULL) { - xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_INTERNAL, - WXS_BASIC_CAST type, NULL, - "Internal error: xmlSchemaCheckSRCCT, " - "'%s', base type has no content type", - type->name); - return (-1); - } - } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) && - (WXS_IS_RESTRICTION(type))) { - - /* - * 2.1.2 only if the <restriction> alternative is also - * chosen, a complex type definition whose {content type} - * is mixed and a particle emptiable. - */ - if (! xmlSchemaIsParticleEmptiable( - (xmlSchemaParticlePtr) base->subtypes)) { - ret = XML_SCHEMAP_SRC_CT_1; - } else - /* - * Attention: at this point the <simpleType> child is in - * ->contentTypeDef (put there during parsing). - */ - if (type->contentTypeDef == NULL) { - xmlChar *str = NULL; - /* - * 2.2 If clause 2.1.2 above is satisfied, then there - * must be a <simpleType> among the [children] of - * <restriction>. - */ - /* TODO: Change error code to ..._SRC_CT_2_2. */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_CT_1, - WXS_BASIC_CAST type, NULL, - "A <simpleType> is expected among the children " - "of <restriction>, if <simpleContent> is used and " - "the base type '%s' is a complex type", - xmlSchemaFormatQName(&str, base->targetNamespace, - base->name)); - FREE_AND_NULL(str) - return (XML_SCHEMAP_SRC_CT_1); - } - } else { - ret = XML_SCHEMAP_SRC_CT_1; - } - } - if (ret > 0) { - xmlChar *str = NULL; - if (WXS_IS_RESTRICTION(type)) { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_CT_1, - WXS_BASIC_CAST type, NULL, - "If <simpleContent> and <restriction> is used, the " - "base type must be a simple type or a complex type with " - "mixed content and particle emptiable. The base type " - "'%s' is none of those", - xmlSchemaFormatQName(&str, base->targetNamespace, - base->name)); - } else { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_CT_1, - WXS_BASIC_CAST type, NULL, - "If <simpleContent> and <extension> is used, the " - "base type must be a simple type. The base type '%s' " - "is a complex type", - xmlSchemaFormatQName(&str, base->targetNamespace, - base->name)); - } - FREE_AND_NULL(str) - } - } - /* - * SPEC (3) "The corresponding complex type definition component must - * satisfy the conditions set out in Constraints on Complex Type - * Definition Schema Components (§3.4.6);" - * NOTE (3) will be done in xmlSchemaTypeFixup(). - */ - /* - * SPEC (4) If clause 2.2.1 or clause 2.2.2 in the correspondence specification - * above for {attribute wildcard} is satisfied, the intensional - * intersection must be expressible, as defined in Attribute Wildcard - * Intersection (§3.10.6). - * NOTE (4) is done in xmlSchemaFixupTypeAttributeUses(). - */ - return (ret); -} - -#ifdef ENABLE_PARTICLE_RESTRICTION -/** - * xmlSchemaCheckParticleRangeOK: - * @ctxt: the schema parser context - * @type: the complex type definition - * - * (3.9.6) Constraints on Particle Schema Components - * Schema Component Constraint: - * Occurrence Range OK (range-ok) - * - * STATUS: complete - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckParticleRangeOK(int rmin, int rmax, - int bmin, int bmax) -{ - if (rmin < bmin) - return (1); - if ((bmax != UNBOUNDED) && - (rmax > bmax)) - return (1); - return (0); -} - -/** - * xmlSchemaCheckRCaseNameAndTypeOK: - * @ctxt: the schema parser context - * @r: the restricting element declaration particle - * @b: the base element declaration particle - * - * (3.9.6) Constraints on Particle Schema Components - * Schema Component Constraint: - * Particle Restriction OK (Elt:Elt -- NameAndTypeOK) - * (rcase-NameAndTypeOK) - * - * STATUS: - * MISSING (3.2.3) - * CLARIFY: (3.2.2) - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr r, - xmlSchemaParticlePtr b) -{ - xmlSchemaElementPtr elemR, elemB; - - /* TODO: Error codes (rcase-NameAndTypeOK). */ - elemR = (xmlSchemaElementPtr) r->children; - elemB = (xmlSchemaElementPtr) b->children; - /* - * SPEC (1) "The declarations' {name}s and {target namespace}s are - * the same." - */ - if ((elemR != elemB) && - ((! xmlStrEqual(elemR->name, elemB->name)) || - (! xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace)))) - return (1); - /* - * SPEC (2) "R's occurrence range is a valid restriction of B's - * occurrence range as defined by Occurrence Range OK (§3.9.6)." - */ - if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, - b->minOccurs, b->maxOccurs) != 0) - return (1); - /* - * SPEC (3.1) "Both B's declaration's {scope} and R's declaration's - * {scope} are global." - */ - if (elemR == elemB) - return (0); - /* - * SPEC (3.2.1) "Either B's {nillable} is true or R's {nillable} is false." - */ - if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) && - (elemR->flags & XML_SCHEMAS_ELEM_NILLABLE)) - return (1); - /* - * SPEC (3.2.2) "either B's declaration's {value constraint} is absent, - * or is not fixed, or R's declaration's {value constraint} is fixed - * with the same value." - */ - if ((elemB->value != NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) && - ((elemR->value == NULL) || - ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) || - /* TODO: Equality of the initial value or normalized or canonical? */ - (! xmlStrEqual(elemR->value, elemB->value)))) - return (1); - /* - * TODO: SPEC (3.2.3) "R's declaration's {identity-constraint - * definitions} is a subset of B's declaration's {identity-constraint - * definitions}, if any." - */ - if (elemB->idcs != NULL) { - /* TODO */ - } - /* - * SPEC (3.2.4) "R's declaration's {disallowed substitutions} is a - * superset of B's declaration's {disallowed substitutions}." - */ - if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) && - ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) || - ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) && - ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) || - ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) && - ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0))) - return (1); - /* - * SPEC (3.2.5) "R's {type definition} is validly derived given - * {extension, list, union} from B's {type definition}" - * - * BADSPEC TODO: What's the point of adding "list" and "union" to the - * set, if the corresponding constraints handle "restriction" and - * "extension" only? - * - */ - { - int set = 0; - - set |= SUBSET_EXTENSION; - set |= SUBSET_LIST; - set |= SUBSET_UNION; - if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes, - elemB->subtypes, set) != 0) - return (1); - } - return (0); -} - -/** - * xmlSchemaCheckRCaseNSCompat: - * @ctxt: the schema parser context - * @r: the restricting element declaration particle - * @b: the base wildcard particle - * - * (3.9.6) Constraints on Particle Schema Components - * Schema Component Constraint: - * Particle Derivation OK (Elt:Any -- NSCompat) - * (rcase-NSCompat) - * - * STATUS: complete - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr r, - xmlSchemaParticlePtr b) -{ - /* TODO:Error codes (rcase-NSCompat). */ - /* - * SPEC "For an element declaration particle to be a ·valid restriction· - * of a wildcard particle all of the following must be true:" - * - * SPEC (1) "The element declaration's {target namespace} is ·valid· - * with respect to the wildcard's {namespace constraint} as defined by - * Wildcard allows Namespace Name (§3.10.4)." - */ - if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr) b->children, - ((xmlSchemaElementPtr) r->children)->targetNamespace) != 0) - return (1); - /* - * SPEC (2) "R's occurrence range is a valid restriction of B's - * occurrence range as defined by Occurrence Range OK (§3.9.6)." - */ - if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, - b->minOccurs, b->maxOccurs) != 0) - return (1); - - return (0); -} - -/** - * xmlSchemaCheckRCaseRecurseAsIfGroup: - * @ctxt: the schema parser context - * @r: the restricting element declaration particle - * @b: the base model group particle - * - * (3.9.6) Constraints on Particle Schema Components - * Schema Component Constraint: - * Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup) - * (rcase-RecurseAsIfGroup) - * - * STATUS: TODO - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr r, - xmlSchemaParticlePtr b) -{ - /* TODO: Error codes (rcase-RecurseAsIfGroup). */ - TODO - return (0); -} - -/** - * xmlSchemaCheckRCaseNSSubset: - * @ctxt: the schema parser context - * @r: the restricting wildcard particle - * @b: the base wildcard particle - * - * (3.9.6) Constraints on Particle Schema Components - * Schema Component Constraint: - * Particle Derivation OK (Any:Any -- NSSubset) - * (rcase-NSSubset) - * - * STATUS: complete - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr r, - xmlSchemaParticlePtr b, - int isAnyTypeBase) -{ - /* TODO: Error codes (rcase-NSSubset). */ - /* - * SPEC (1) "R's occurrence range is a valid restriction of B's - * occurrence range as defined by Occurrence Range OK (§3.9.6)." - */ - if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, - b->minOccurs, b->maxOccurs)) - return (1); - /* - * SPEC (2) "R's {namespace constraint} must be an intensional subset - * of B's {namespace constraint} as defined by Wildcard Subset (§3.10.6)." - */ - if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr) r->children, - (xmlSchemaWildcardPtr) b->children)) - return (1); - /* - * SPEC (3) "Unless B is the content model wildcard of the ·ur-type - * definition·, R's {process contents} must be identical to or stronger - * than B's {process contents}, where strict is stronger than lax is - * stronger than skip." - */ - if (! isAnyTypeBase) { - if ( ((xmlSchemaWildcardPtr) r->children)->processContents < - ((xmlSchemaWildcardPtr) b->children)->processContents) - return (1); - } - - return (0); -} - -/** - * xmlSchemaCheckCOSParticleRestrict: - * @ctxt: the schema parser context - * @type: the complex type definition - * - * (3.9.6) Constraints on Particle Schema Components - * Schema Component Constraint: - * Particle Valid (Restriction) (cos-particle-restrict) - * - * STATUS: TODO - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr r, - xmlSchemaParticlePtr b) -{ - int ret = 0; - - /*part = WXS_TYPE_PARTICLE(type); - basePart = WXS_TYPE_PARTICLE(base); - */ - - TODO - - /* - * SPEC (1) "They are the same particle." - */ - if (r == b) - return (0); - - - return (0); -} - -/** - * xmlSchemaCheckRCaseNSRecurseCheckCardinality: - * @ctxt: the schema parser context - * @r: the model group particle - * @b: the base wildcard particle - * - * (3.9.6) Constraints on Particle Schema Components - * Schema Component Constraint: - * Particle Derivation OK (All/Choice/Sequence:Any -- - * NSRecurseCheckCardinality) - * (rcase-NSRecurseCheckCardinality) - * - * STATUS: TODO: subst-groups - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr r, - xmlSchemaParticlePtr b) -{ - xmlSchemaParticlePtr part; - /* TODO: Error codes (rcase-NSRecurseCheckCardinality). */ - if ((r->children == NULL) || (r->children->children == NULL)) - return (-1); - /* - * SPEC "For a group particle to be a ·valid restriction· of a - * wildcard particle..." - * - * SPEC (1) "Every member of the {particles} of the group is a ·valid - * restriction· of the wildcard as defined by - * Particle Valid (Restriction) (§3.9.6)." - */ - part = (xmlSchemaParticlePtr) r->children->children; - do { - if (xmlSchemaCheckCOSParticleRestrict(ctxt, part, b)) - return (1); - part = (xmlSchemaParticlePtr) part->next; - } while (part != NULL); - /* - * SPEC (2) "The effective total range of the group [...] is a - * valid restriction of B's occurrence range as defined by - * Occurrence Range OK (§3.9.6)." - */ - if (xmlSchemaCheckParticleRangeOK( - xmlSchemaGetParticleTotalRangeMin(r), - xmlSchemaGetParticleTotalRangeMax(r), - b->minOccurs, b->maxOccurs) != 0) - return (1); - return (0); -} - -/** - * xmlSchemaCheckRCaseRecurse: - * @ctxt: the schema parser context - * @r: the <all> or <sequence> model group particle - * @b: the base <all> or <sequence> model group particle - * - * (3.9.6) Constraints on Particle Schema Components - * Schema Component Constraint: - * Particle Derivation OK (All:All,Sequence:Sequence -- - Recurse) - * (rcase-Recurse) - * - * STATUS: ? - * TODO: subst-groups - * - * Returns 0 if the constraints are satisfied, a positive - * error code if not and -1 if an internal error occured. - */ -static int -xmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaParticlePtr r, - xmlSchemaParticlePtr b) -{ - /* xmlSchemaParticlePtr part; */ - /* TODO: Error codes (rcase-Recurse). */ - if ((r->children == NULL) || (b->children == NULL) || - (r->children->type != b->children->type)) - return (-1); - /* - * SPEC "For an all or sequence group particle to be a ·valid - * restriction· of another group particle with the same {compositor}..." - * - * SPEC (1) "R's occurrence range is a valid restriction of B's - * occurrence range as defined by Occurrence Range OK (§3.9.6)." - */ - if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, - b->minOccurs, b->maxOccurs)) - return (1); - - - return (0); -} - -#endif - -#define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \ - xmlSchemaPCustomErrExt(pctxt, \ - XML_SCHEMAP_INVALID_FACET_VALUE, \ - WXS_BASIC_CAST fac1, fac1->node, \ - "It is an error for both '%s' and '%s' to be specified on the "\ - "same type definition", \ - BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \ - BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL); - -#define FACET_RESTR_ERR(fac1, msg) \ - xmlSchemaPCustomErr(pctxt, \ - XML_SCHEMAP_INVALID_FACET_VALUE, \ - WXS_BASIC_CAST fac1, fac1->node, \ - msg, NULL); - -#define FACET_RESTR_FIXED_ERR(fac) \ - xmlSchemaPCustomErr(pctxt, \ - XML_SCHEMAP_INVALID_FACET_VALUE, \ - WXS_BASIC_CAST fac, fac->node, \ - "The base type's facet is 'fixed', thus the value must not " \ - "differ", NULL); - -static void -xmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaFacetPtr facet1, - xmlSchemaFacetPtr facet2, - int lessGreater, - int orEqual, - int ofBase) -{ - xmlChar *msg = NULL; - - msg = xmlStrdup(BAD_CAST "'"); - msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet1->type)); - msg = xmlStrcat(msg, BAD_CAST "' has to be"); - if (lessGreater == 0) - msg = xmlStrcat(msg, BAD_CAST " equal to"); - if (lessGreater == 1) - msg = xmlStrcat(msg, BAD_CAST " greater than"); - else - msg = xmlStrcat(msg, BAD_CAST " less than"); - - if (orEqual) - msg = xmlStrcat(msg, BAD_CAST " or equal to"); - msg = xmlStrcat(msg, BAD_CAST " '"); - msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet2->type)); - if (ofBase) - msg = xmlStrcat(msg, BAD_CAST "' of the base type"); - else - msg = xmlStrcat(msg, BAD_CAST "'"); - - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_INVALID_FACET_VALUE, - WXS_BASIC_CAST facet1, NULL, - (const char *) msg, NULL); - - if (msg != NULL) - xmlFree(msg); -} - -/* -* xmlSchemaDeriveAndValidateFacets: -* -* Schema Component Constraint: Simple Type Restriction (Facets) -* (st-restrict-facets) -*/ -static int -xmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - xmlSchemaTypePtr base = type->baseType; - xmlSchemaFacetLinkPtr link, cur, last = NULL; - xmlSchemaFacetPtr facet, bfacet, - flength = NULL, ftotdig = NULL, ffracdig = NULL, - fmaxlen = NULL, fminlen = NULL, /* facets of the current type */ - fmininc = NULL, fmaxinc = NULL, - fminexc = NULL, fmaxexc = NULL, - bflength = NULL, bftotdig = NULL, bffracdig = NULL, - bfmaxlen = NULL, bfminlen = NULL, /* facets of the base type */ - bfmininc = NULL, bfmaxinc = NULL, - bfminexc = NULL, bfmaxexc = NULL; - int res; /* err = 0, fixedErr; */ - - /* - * SPEC st-restrict-facets 1: - * "The {variety} of R is the same as that of B." - */ - /* - * SPEC st-restrict-facets 2: - * "If {variety} is atomic, the {primitive type definition} - * of R is the same as that of B." - * - * NOTE: we leave 1 & 2 out for now, since this will be - * satisfied by the derivation process. - * CONSTRUCTION TODO: Maybe needed if using a construction API. - */ - /* - * SPEC st-restrict-facets 3: - * "The {facets} of R are the union of S and the {facets} - * of B, eliminating duplicates. To eliminate duplicates, - * when a facet of the same kind occurs in both S and the - * {facets} of B, the one in the {facets} of B is not - * included, with the exception of enumeration and pattern - * facets, for which multiple occurrences with distinct values - * are allowed." - */ - - if ((type->facetSet == NULL) && (base->facetSet == NULL)) - return (0); - - last = type->facetSet; - if (last != NULL) - while (last->next != NULL) - last = last->next; - - for (cur = type->facetSet; cur != NULL; cur = cur->next) { - facet = cur->facet; - switch (facet->type) { - case XML_SCHEMA_FACET_LENGTH: - flength = facet; break; - case XML_SCHEMA_FACET_MINLENGTH: - fminlen = facet; break; - case XML_SCHEMA_FACET_MININCLUSIVE: - fmininc = facet; break; - case XML_SCHEMA_FACET_MINEXCLUSIVE: - fminexc = facet; break; - case XML_SCHEMA_FACET_MAXLENGTH: - fmaxlen = facet; break; - case XML_SCHEMA_FACET_MAXINCLUSIVE: - fmaxinc = facet; break; - case XML_SCHEMA_FACET_MAXEXCLUSIVE: - fmaxexc = facet; break; - case XML_SCHEMA_FACET_TOTALDIGITS: - ftotdig = facet; break; - case XML_SCHEMA_FACET_FRACTIONDIGITS: - ffracdig = facet; break; - default: - break; - } - } - for (cur = base->facetSet; cur != NULL; cur = cur->next) { - facet = cur->facet; - switch (facet->type) { - case XML_SCHEMA_FACET_LENGTH: - bflength = facet; break; - case XML_SCHEMA_FACET_MINLENGTH: - bfminlen = facet; break; - case XML_SCHEMA_FACET_MININCLUSIVE: - bfmininc = facet; break; - case XML_SCHEMA_FACET_MINEXCLUSIVE: - bfminexc = facet; break; - case XML_SCHEMA_FACET_MAXLENGTH: - bfmaxlen = facet; break; - case XML_SCHEMA_FACET_MAXINCLUSIVE: - bfmaxinc = facet; break; - case XML_SCHEMA_FACET_MAXEXCLUSIVE: - bfmaxexc = facet; break; - case XML_SCHEMA_FACET_TOTALDIGITS: - bftotdig = facet; break; - case XML_SCHEMA_FACET_FRACTIONDIGITS: - bffracdig = facet; break; - default: - break; - } - } - /* - * length and minLength or maxLength (2.2) + (3.2) - */ - if (flength && (fminlen || fmaxlen)) { - FACET_RESTR_ERR(flength, "It is an error for both 'length' and " - "either of 'minLength' or 'maxLength' to be specified on " - "the same type definition") - } - /* - * Mutual exclusions in the same derivation step. - */ - if ((fmaxinc) && (fmaxexc)) { - /* - * SCC "maxInclusive and maxExclusive" - */ - FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc) - } - if ((fmininc) && (fminexc)) { - /* - * SCC "minInclusive and minExclusive" - */ - FACET_RESTR_MUTUAL_ERR(fmininc, fminexc) - } - - if (flength && bflength) { - /* - * SCC "length valid restriction" - * The values have to be equal. - */ - res = xmlSchemaCompareValues(flength->val, bflength->val); - if (res == -2) - goto internal_error; - if (res != 0) - xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1); - if ((res != 0) && (bflength->fixed)) { - FACET_RESTR_FIXED_ERR(flength) - } - - } - if (fminlen && bfminlen) { - /* - * SCC "minLength valid restriction" - * minLength >= BASE minLength - */ - res = xmlSchemaCompareValues(fminlen->val, bfminlen->val); - if (res == -2) - goto internal_error; - if (res == -1) - xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1); - if ((res != 0) && (bfminlen->fixed)) { - FACET_RESTR_FIXED_ERR(fminlen) - } - } - if (fmaxlen && bfmaxlen) { - /* - * SCC "maxLength valid restriction" - * maxLength <= BASE minLength - */ - res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val); - if (res == -2) - goto internal_error; - if (res == 1) - xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1); - if ((res != 0) && (bfmaxlen->fixed)) { - FACET_RESTR_FIXED_ERR(fmaxlen) - } - } - /* - * SCC "length and minLength or maxLength" - */ - if (! flength) - flength = bflength; - if (flength) { - if (! fminlen) - flength = bflength; - if (fminlen) { - /* (1.1) length >= minLength */ - res = xmlSchemaCompareValues(flength->val, fminlen->val); - if (res == -2) - goto internal_error; - if (res == -1) - xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0); - } - if (! fmaxlen) - fmaxlen = bfmaxlen; - if (fmaxlen) { - /* (2.1) length <= maxLength */ - res = xmlSchemaCompareValues(flength->val, fmaxlen->val); - if (res == -2) - goto internal_error; - if (res == 1) - xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0); - } - } - if (fmaxinc) { - /* - * "maxInclusive" - */ - if (fmininc) { - /* SCC "maxInclusive >= minInclusive" */ - res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val); - if (res == -2) - goto internal_error; - if (res == -1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0); - } - } - /* - * SCC "maxInclusive valid restriction" - */ - if (bfmaxinc) { - /* maxInclusive <= BASE maxInclusive */ - res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val); - if (res == -2) - goto internal_error; - if (res == 1) - xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1); - if ((res != 0) && (bfmaxinc->fixed)) { - FACET_RESTR_FIXED_ERR(fmaxinc) - } - } - if (bfmaxexc) { - /* maxInclusive < BASE maxExclusive */ - res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val); - if (res == -2) - goto internal_error; - if (res != -1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1); - } - } - if (bfmininc) { - /* maxInclusive >= BASE minInclusive */ - res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val); - if (res == -2) - goto internal_error; - if (res == -1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1); - } - } - if (bfminexc) { - /* maxInclusive > BASE minExclusive */ - res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val); - if (res == -2) - goto internal_error; - if (res != 1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1); - } - } - } - if (fmaxexc) { - /* - * "maxExclusive >= minExclusive" - */ - if (fminexc) { - res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val); - if (res == -2) - goto internal_error; - if (res == -1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0); - } - } - /* - * "maxExclusive valid restriction" - */ - if (bfmaxexc) { - /* maxExclusive <= BASE maxExclusive */ - res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val); - if (res == -2) - goto internal_error; - if (res == 1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1); - } - if ((res != 0) && (bfmaxexc->fixed)) { - FACET_RESTR_FIXED_ERR(fmaxexc) - } - } - if (bfmaxinc) { - /* maxExclusive <= BASE maxInclusive */ - res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val); - if (res == -2) - goto internal_error; - if (res == 1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1); - } - } - if (bfmininc) { - /* maxExclusive > BASE minInclusive */ - res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val); - if (res == -2) - goto internal_error; - if (res != 1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1); - } - } - if (bfminexc) { - /* maxExclusive > BASE minExclusive */ - res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val); - if (res == -2) - goto internal_error; - if (res != 1) { - xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1); - } - } - } - if (fminexc) { - /* - * "minExclusive < maxInclusive" - */ - if (fmaxinc) { - res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val); - if (res == -2) - goto internal_error; - if (res != -1) { - xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0); - } - } - /* - * "minExclusive valid restriction" - */ - if (bfminexc) { - /* minExclusive >= BASE minExclusive */ - res = xmlSchemaCompareValues(fminexc->val, bfminexc->val); - if (res == -2) - goto internal_error; - if (res == -1) { - xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1); - } - if ((res != 0) && (bfminexc->fixed)) { - FACET_RESTR_FIXED_ERR(fminexc) - } - } - if (bfmaxinc) { - /* minExclusive <= BASE maxInclusive */ - res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val); - if (res == -2) - goto internal_error; - if (res == 1) { - xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1); - } - } - if (bfmininc) { - /* minExclusive >= BASE minInclusive */ - res = xmlSchemaCompareValues(fminexc->val, bfmininc->val); - if (res == -2) - goto internal_error; - if (res == -1) { - xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1); - } - } - if (bfmaxexc) { - /* minExclusive < BASE maxExclusive */ - res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val); - if (res == -2) - goto internal_error; - if (res != -1) { - xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1); - } - } - } - if (fmininc) { - /* - * "minInclusive < maxExclusive" - */ - if (fmaxexc) { - res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val); - if (res == -2) - goto internal_error; - if (res != -1) { - xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0); - } - } - /* - * "minExclusive valid restriction" - */ - if (bfmininc) { - /* minInclusive >= BASE minInclusive */ - res = xmlSchemaCompareValues(fmininc->val, bfmininc->val); - if (res == -2) - goto internal_error; - if (res == -1) { - xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1); - } - if ((res != 0) && (bfmininc->fixed)) { - FACET_RESTR_FIXED_ERR(fmininc) - } - } - if (bfmaxinc) { - /* minInclusive <= BASE maxInclusive */ - res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val); - if (res == -2) - goto internal_error; - if (res == 1) { - xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1); - } - } - if (bfminexc) { - /* minInclusive > BASE minExclusive */ - res = xmlSchemaCompareValues(fmininc->val, bfminexc->val); - if (res == -2) - goto internal_error; - if (res != 1) - xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1); - } - if (bfmaxexc) { - /* minInclusive < BASE maxExclusive */ - res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val); - if (res == -2) - goto internal_error; - if (res != -1) - xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1); - } - } - if (ftotdig && bftotdig) { - /* - * SCC " totalDigits valid restriction" - * totalDigits <= BASE totalDigits - */ - res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val); - if (res == -2) - goto internal_error; - if (res == 1) - xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig, - -1, 1, 1); - if ((res != 0) && (bftotdig->fixed)) { - FACET_RESTR_FIXED_ERR(ftotdig) - } - } - if (ffracdig && bffracdig) { - /* - * SCC "fractionDigits valid restriction" - * fractionDigits <= BASE fractionDigits - */ - res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val); - if (res == -2) - goto internal_error; - if (res == 1) - xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig, - -1, 1, 1); - if ((res != 0) && (bffracdig->fixed)) { - FACET_RESTR_FIXED_ERR(ffracdig) - } - } - /* - * SCC "fractionDigits less than or equal to totalDigits" - */ - if (! ftotdig) - ftotdig = bftotdig; - if (! ffracdig) - ffracdig = bffracdig; - if (ftotdig && ffracdig) { - res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val); - if (res == -2) - goto internal_error; - if (res == 1) - xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig, - -1, 1, 0); - } - /* - * *Enumerations* won' be added here, since only the first set - * of enumerations in the ancestor-or-self axis is used - * for validation, plus we need to use the base type of those - * enumerations for whitespace. - * - * *Patterns*: won't be add here, since they are ORed at - * type level and ANDed at ancestor level. This will - * happed during validation by walking the base axis - * of the type. - */ - for (cur = base->facetSet; cur != NULL; cur = cur->next) { - bfacet = cur->facet; - /* - * Special handling of enumerations and patterns. - * TODO: hmm, they should not appear in the set, so remove this. - */ - if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) || - (bfacet->type == XML_SCHEMA_FACET_ENUMERATION)) - continue; - /* - * Search for a duplicate facet in the current type. - */ - link = type->facetSet; - /* err = 0; */ - /* fixedErr = 0; */ - while (link != NULL) { - facet = link->facet; - if (facet->type == bfacet->type) { - switch (facet->type) { - case XML_SCHEMA_FACET_WHITESPACE: - /* - * The whitespace must be stronger. - */ - if (facet->whitespace < bfacet->whitespace) { - FACET_RESTR_ERR(flength, - "The 'whitespace' value has to be equal to " - "or stronger than the 'whitespace' value of " - "the base type") - } - if ((bfacet->fixed) && - (facet->whitespace != bfacet->whitespace)) { - FACET_RESTR_FIXED_ERR(facet) - } - break; - default: - break; - } - /* Duplicate found. */ - break; - } - link = link->next; - } - /* - * If no duplicate was found: add the base types's facet - * to the set. - */ - if (link == NULL) { - link = (xmlSchemaFacetLinkPtr) - xmlMalloc(sizeof(xmlSchemaFacetLink)); - if (link == NULL) { - xmlSchemaPErrMemory(pctxt, - "deriving facets, creating a facet link", NULL); - return (-1); - } - link->facet = cur->facet; - link->next = NULL; - if (last == NULL) - type->facetSet = link; - else - last->next = link; - last = link; - } - - } - - return (0); -internal_error: - PERROR_INT("xmlSchemaDeriveAndValidateFacets", - "an error occured"); - return (-1); -} - -static int -xmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - xmlSchemaTypeLinkPtr link, lastLink, prevLink, subLink, newLink; - /* - * The actual value is then formed by replacing any union type - * definition in the ·explicit members· with the members of their - * {member type definitions}, in order. - * - * TODO: There's a bug entry at - * "http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0287.html" - * which indicates that we'll keep the union types the future. - */ - link = type->memberTypes; - while (link != NULL) { - - if (WXS_IS_TYPE_NOT_FIXED(link->type)) - xmlSchemaTypeFixup(link->type, ACTXT_CAST pctxt); - - if (WXS_IS_UNION(link->type)) { - subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(link->type); - if (subLink != NULL) { - link->type = subLink->type; - if (subLink->next != NULL) { - lastLink = link->next; - subLink = subLink->next; - prevLink = link; - while (subLink != NULL) { - newLink = (xmlSchemaTypeLinkPtr) - xmlMalloc(sizeof(xmlSchemaTypeLink)); - if (newLink == NULL) { - xmlSchemaPErrMemory(pctxt, "allocating a type link", - NULL); - return (-1); - } - newLink->type = subLink->type; - prevLink->next = newLink; - prevLink = newLink; - newLink->next = lastLink; - - subLink = subLink->next; - } - } - } - } - link = link->next; - } - return (0); -} - -static void -xmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr type) -{ - int has = 0, needVal = 0, normVal = 0; - - has = (type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0; - if (has) { - needVal = (type->baseType->flags & - XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0; - normVal = (type->baseType->flags & - XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0; - } - if (type->facets != NULL) { - xmlSchemaFacetPtr fac; - - for (fac = type->facets; fac != NULL; fac = fac->next) { - switch (fac->type) { - case XML_SCHEMA_FACET_WHITESPACE: - break; - case XML_SCHEMA_FACET_PATTERN: - normVal = 1; - has = 1; - break; - case XML_SCHEMA_FACET_ENUMERATION: - needVal = 1; - normVal = 1; - has = 1; - break; - default: - has = 1; - break; - } - } - } - if (normVal) - type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED; - if (needVal) - type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE; - if (has) - type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; - - if (has && (! needVal) && WXS_IS_ATOMIC(type)) { - xmlSchemaTypePtr prim = xmlSchemaGetPrimitiveType(type); - /* - * OPTIMIZE VAL TODO: Some facets need a computed value. - */ - if ((prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) && - (prim->builtInType != XML_SCHEMAS_STRING)) { - type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE; - } - } -} - -static int -xmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr type) -{ - - - /* - * Evaluate the whitespace-facet value. - */ - if (WXS_IS_LIST(type)) { - type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; - return (0); - } else if (WXS_IS_UNION(type)) - return (0); - - if (type->facetSet != NULL) { - xmlSchemaFacetLinkPtr lin; - - for (lin = type->facetSet; lin != NULL; lin = lin->next) { - if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) { - switch (lin->facet->whitespace) { - case XML_SCHEMAS_FACET_PRESERVE: - type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE; - break; - case XML_SCHEMAS_FACET_REPLACE: - type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE; - break; - case XML_SCHEMAS_FACET_COLLAPSE: - type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; - break; - default: - return (-1); - } - return (0); - } - } - } - /* - * For all ·atomic· datatypes other than string (and types ·derived· - * by ·restriction· from it) the value of whiteSpace is fixed to - * collapse - */ - { - xmlSchemaTypePtr anc; - - for (anc = type->baseType; anc != NULL && - anc->builtInType != XML_SCHEMAS_ANYTYPE; - anc = anc->baseType) { - - if (anc->type == XML_SCHEMA_TYPE_BASIC) { - if (anc->builtInType == XML_SCHEMAS_NORMSTRING) { - type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE; - - } else if ((anc->builtInType == XML_SCHEMAS_STRING) || - (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) { - type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE; - - } else - type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; - break; - } - } - } - return (0); -} - -static int -xmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - if (type->type != XML_SCHEMA_TYPE_SIMPLE) - return(0); - if (! WXS_IS_TYPE_NOT_FIXED_1(type)) - return(0); - type->flags |= XML_SCHEMAS_TYPE_FIXUP_1; - - if (WXS_IS_LIST(type)) { - /* - * Corresponds to <simpleType><list>... - */ - if (type->subtypes == NULL) { - /* - * This one is really needed, so get out. - */ - PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", - "list type has no item-type assigned"); - return(-1); - } - } else if (WXS_IS_UNION(type)) { - /* - * Corresponds to <simpleType><union>... - */ - if (type->memberTypes == NULL) { - /* - * This one is really needed, so get out. - */ - PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", - "union type has no member-types assigned"); - return(-1); - } - } else { - /* - * Corresponds to <simpleType><restriction>... - */ - if (type->baseType == NULL) { - PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", - "type has no base-type assigned"); - return(-1); - } - if (WXS_IS_TYPE_NOT_FIXED_1(type->baseType)) - if (xmlSchemaFixupSimpleTypeStageOne(pctxt, type->baseType) == -1) - return(-1); - /* - * Variety - * If the <restriction> alternative is chosen, then the - * {variety} of the {base type definition}. - */ - if (WXS_IS_ATOMIC(type->baseType)) - type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; - else if (WXS_IS_LIST(type->baseType)) { - type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; - /* - * Inherit the itemType. - */ - type->subtypes = type->baseType->subtypes; - } else if (WXS_IS_UNION(type->baseType)) { - type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION; - /* - * NOTE that we won't assign the memberTypes of the base, - * since this will make trouble when freeing them; we will - * use a lookup function to access them instead. - */ - } - } - return(0); -} - -#ifdef DEBUG_TYPE -static void -xmlSchemaDebugFixedType(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - if (type->node != NULL) { - xmlGenericError(xmlGenericErrorContext, - "Type of %s : %s:%d :", name, - type->node->doc->URL, - xmlGetLineNo(type->node)); - } else { - xmlGenericError(xmlGenericErrorContext, "Type of %s :", name); - } - if ((WXS_IS_SIMPLE(type)) || (WXS_IS_COMPLEX(type))) { - switch (type->contentType) { - case XML_SCHEMA_CONTENT_SIMPLE: - xmlGenericError(xmlGenericErrorContext, "simple\n"); - break; - case XML_SCHEMA_CONTENT_ELEMENTS: - xmlGenericError(xmlGenericErrorContext, "elements\n"); - break; - case XML_SCHEMA_CONTENT_UNKNOWN: - xmlGenericError(xmlGenericErrorContext, "unknown !!!\n"); - break; - case XML_SCHEMA_CONTENT_EMPTY: - xmlGenericError(xmlGenericErrorContext, "empty\n"); - break; - case XML_SCHEMA_CONTENT_MIXED: - if (xmlSchemaIsParticleEmptiable((xmlSchemaParticlePtr) - type->subtypes)) - xmlGenericError(xmlGenericErrorContext, - "mixed as emptiable particle\n"); - else - xmlGenericError(xmlGenericErrorContext, "mixed\n"); - break; - /* Removed, since not used. */ - /* - case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS: - xmlGenericError(xmlGenericErrorContext, "mixed or elems\n"); - break; - */ - case XML_SCHEMA_CONTENT_BASIC: - xmlGenericError(xmlGenericErrorContext, "basic\n"); - break; - default: - xmlGenericError(xmlGenericErrorContext, - "not registered !!!\n"); - break; - } - } -} -#endif - -/* -* 3.14.6 Constraints on Simple Type Definition Schema Components -*/ -static int -xmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - int res, olderrs = pctxt->nberrors; - - if (type->type != XML_SCHEMA_TYPE_SIMPLE) - return(-1); - - if (! WXS_IS_TYPE_NOT_FIXED(type)) - return(0); - - type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED; - type->contentType = XML_SCHEMA_CONTENT_SIMPLE; - - if (type->baseType == NULL) { - PERROR_INT("xmlSchemaFixupSimpleTypeStageTwo", - "missing baseType"); - goto exit_failure; - } - if (WXS_IS_TYPE_NOT_FIXED(type->baseType)) - xmlSchemaTypeFixup(type->baseType, ACTXT_CAST pctxt); - /* - * If a member type of a union is a union itself, we need to substitute - * that member type for its member types. - * NOTE that this might change in WXS 1.1; i.e. we will keep the union - * types in WXS 1.1. - */ - if ((type->memberTypes != NULL) && - (xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt, type) == -1)) - return(-1); - /* - * SPEC src-simple-type 1 - * "The corresponding simple type definition, if any, must satisfy - * the conditions set out in Constraints on Simple Type Definition - * Schema Components (§3.14.6)." - */ - /* - * Schema Component Constraint: Simple Type Definition Properties Correct - * (st-props-correct) - */ - res = xmlSchemaCheckSTPropsCorrect(pctxt, type); - HFAILURE HERROR - /* - * Schema Component Constraint: Derivation Valid (Restriction, Simple) - * (cos-st-restricts) - */ - res = xmlSchemaCheckCOSSTRestricts(pctxt, type); - HFAILURE HERROR - /* - * TODO: Removed the error report, since it got annoying to get an - * extra error report, if anything failed until now. - * Enable this if needed. - * - * xmlSchemaPErr(ctxt, type->node, - * XML_SCHEMAP_SRC_SIMPLE_TYPE_1, - * "Simple type '%s' does not satisfy the constraints " - * "on simple type definitions.\n", - * type->name, NULL); - */ - /* - * Schema Component Constraint: Simple Type Restriction (Facets) - * (st-restrict-facets) - */ - res = xmlSchemaCheckFacetValues(type, pctxt); - HFAILURE HERROR - if ((type->facetSet != NULL) || - (type->baseType->facetSet != NULL)) { - res = xmlSchemaDeriveAndValidateFacets(pctxt, type); - HFAILURE HERROR - } - /* - * Whitespace value. - */ - res = xmlSchemaTypeFixupWhitespace(type); - HFAILURE HERROR - xmlSchemaTypeFixupOptimFacets(type); - -exit_error: -#ifdef DEBUG_TYPE - xmlSchemaDebugFixedType(pctxt, type); -#endif - if (olderrs != pctxt->nberrors) - return(pctxt->err); - return(0); - -exit_failure: -#ifdef DEBUG_TYPE - xmlSchemaDebugFixedType(pctxt, type); -#endif - return(-1); -} - -static int -xmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaTypePtr type) -{ - int res = 0, olderrs = pctxt->nberrors; - xmlSchemaTypePtr baseType = type->baseType; - - if (! WXS_IS_TYPE_NOT_FIXED(type)) - return(0); - type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED; - if (baseType == NULL) { - PERROR_INT("xmlSchemaFixupComplexType", - "missing baseType"); - goto exit_failure; - } - /* - * Fixup the base type. - */ - if (WXS_IS_TYPE_NOT_FIXED(baseType)) - xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt); - if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) { - /* - * Skip fixup if the base type is invalid. - * TODO: Generate a warning! - */ - return(0); - } - /* - * This basically checks if the base type can be derived. - */ - res = xmlSchemaCheckSRCCT(pctxt, type); - HFAILURE HERROR - /* - * Fixup the content type. - */ - if (type->contentType == XML_SCHEMA_CONTENT_SIMPLE) { - /* - * Corresponds to <complexType><simpleContent>... - */ - if ((WXS_IS_COMPLEX(baseType)) && - (baseType->contentTypeDef != NULL) && - (WXS_IS_RESTRICTION(type))) { - xmlSchemaTypePtr contentBase, content; -#ifdef ENABLE_NAMED_LOCALS - char buf[30]; - const xmlChar *tmpname; -#endif - /* - * SPEC (1) If <restriction> + base type is <complexType>, - * "whose own {content type} is a simple type..." - */ - if (type->contentTypeDef != NULL) { - /* - * SPEC (1.1) "the simple type definition corresponding to the - * <simpleType> among the [children] of <restriction> if there - * is one;" - * Note that this "<simpleType> among the [children]" was put - * into ->contentTypeDef during parsing. - */ - contentBase = type->contentTypeDef; - type->contentTypeDef = NULL; - } else { - /* - * (1.2) "...otherwise (<restriction> has no <simpleType> - * among its [children]), the simple type definition which - * is the {content type} of the ... base type." - */ - contentBase = baseType->contentTypeDef; - } - /* - * SPEC - * "... a simple type definition which restricts the simple - * type definition identified in clause 1.1 or clause 1.2 - * with a set of facet components" - * - * Create the anonymous simple type, which will be the content - * type of the complex type. - */ -#ifdef ENABLE_NAMED_LOCALS - snprintf(buf, 29, "#scST%d", ++(pctxt->counter)); - tmpname = xmlDictLookup(pctxt->dict, BAD_CAST buf, -1); - content = xmlSchemaAddType(pctxt, pctxt->schema, - XML_SCHEMA_TYPE_SIMPLE, tmpname, type->targetNamespace, - type->node, 0); -#else - content = xmlSchemaAddType(pctxt, pctxt->schema, - XML_SCHEMA_TYPE_SIMPLE, NULL, type->targetNamespace, - type->node, 0); -#endif - if (content == NULL) - goto exit_failure; - /* - * We will use the same node as for the <complexType> - * to have it somehow anchored in the schema doc. - */ - content->type = XML_SCHEMA_TYPE_SIMPLE; - content->baseType = contentBase; - /* - * Move the facets, previously anchored on the - * complexType during parsing. - */ - content->facets = type->facets; - type->facets = NULL; - content->facetSet = type->facetSet; - type->facetSet = NULL; - - type->contentTypeDef = content; - if (WXS_IS_TYPE_NOT_FIXED(contentBase)) - xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt); - /* - * Fixup the newly created type. We don't need to check - * for circularity here. - */ - res = xmlSchemaFixupSimpleTypeStageOne(pctxt, content); - HFAILURE HERROR - res = xmlSchemaFixupSimpleTypeStageTwo(pctxt, content); - HFAILURE HERROR - - } else if ((WXS_IS_COMPLEX(baseType)) && - (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) && - (WXS_IS_RESTRICTION(type))) { - /* - * SPEC (2) If <restriction> + base is a mixed <complexType> with - * an emptiable particle, then a simple type definition which - * restricts the <restriction>'s <simpleType> child. - */ - if ((type->contentTypeDef == NULL) || - (type->contentTypeDef->baseType == NULL)) { - /* - * TODO: Check if this ever happens. - */ - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_INTERNAL, - WXS_BASIC_CAST type, NULL, - "Internal error: xmlSchemaTypeFixup, " - "complex type '%s': the <simpleContent><restriction> " - "is missing a <simpleType> child, but was not catched " - "by xmlSchemaCheckSRCCT()", type->name); - goto exit_failure; - } - } else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(type)) { - /* - * SPEC (3) If <extension> + base is <complexType> with - * <simpleType> content, "...then the {content type} of that - * complex type definition" - */ - if (baseType->contentTypeDef == NULL) { - /* - * TODO: Check if this ever happens. xmlSchemaCheckSRCCT - * should have catched this already. - */ - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_INTERNAL, - WXS_BASIC_CAST type, NULL, - "Internal error: xmlSchemaTypeFixup, " - "complex type '%s': the <extension>ed base type is " - "a complex type with no simple content type", - type->name); - goto exit_failure; - } - type->contentTypeDef = baseType->contentTypeDef; - } else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(type)) { - /* - * SPEC (4) <extension> + base is <simpleType> - * "... then that simple type definition" - */ - type->contentTypeDef = baseType; - } else { - /* - * TODO: Check if this ever happens. - */ - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_INTERNAL, - WXS_BASIC_CAST type, NULL, - "Internal error: xmlSchemaTypeFixup, " - "complex type '%s' with <simpleContent>: unhandled " - "derivation case", type->name); - goto exit_failure; - } - } else { - int dummySequence = 0; - xmlSchemaParticlePtr particle = - (xmlSchemaParticlePtr) type->subtypes; - /* - * Corresponds to <complexType><complexContent>... - * - * NOTE that the effective mixed was already set during parsing of - * <complexType> and <complexContent>; its flag value is - * XML_SCHEMAS_TYPE_MIXED. - * - * Compute the "effective content": - * (2.1.1) + (2.1.2) + (2.1.3) - */ - if ((particle == NULL) || - ((particle->type == XML_SCHEMA_TYPE_PARTICLE) && - ((particle->children->type == XML_SCHEMA_TYPE_ALL) || - (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) || - ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) && - (particle->minOccurs == 0))) && - ( ((xmlSchemaTreeItemPtr) particle->children)->children == NULL))) { - if (type->flags & XML_SCHEMAS_TYPE_MIXED) { - /* - * SPEC (2.1.4) "If the ·effective mixed· is true, then - * a particle whose properties are as follows:..." - * - * Empty sequence model group with - * minOccurs/maxOccurs = 1 (i.e. a "particle emptiable"). - * NOTE that we sill assign it the <complexType> node to - * somehow anchor it in the doc. - */ - if ((particle == NULL) || - (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) { - /* - * Create the particle. - */ - particle = xmlSchemaAddParticle(pctxt, - type->node, 1, 1); - if (particle == NULL) - goto exit_failure; - /* - * Create the model group. - */ /* URGENT TODO: avoid adding to pending items. */ - particle->children = (xmlSchemaTreeItemPtr) - xmlSchemaAddModelGroup(pctxt, pctxt->schema, - XML_SCHEMA_TYPE_SEQUENCE, type->node); - if (particle->children == NULL) - goto exit_failure; - - type->subtypes = (xmlSchemaTypePtr) particle; - } - dummySequence = 1; - type->contentType = XML_SCHEMA_CONTENT_ELEMENTS; - } else { - /* - * SPEC (2.1.5) "otherwise empty" - */ - type->contentType = XML_SCHEMA_CONTENT_EMPTY; - } - } else { - /* - * SPEC (2.2) "otherwise the particle corresponding to the - * <all>, <choice>, <group> or <sequence> among the - * [children]." - */ - type->contentType = XML_SCHEMA_CONTENT_ELEMENTS; - } - /* - * Compute the "content type". - */ - if (WXS_IS_RESTRICTION(type)) { - /* - * SPEC (3.1) "If <restriction>..." - * (3.1.1) + (3.1.2) */ - if (type->contentType != XML_SCHEMA_CONTENT_EMPTY) { - if (type->flags & XML_SCHEMAS_TYPE_MIXED) - type->contentType = XML_SCHEMA_CONTENT_MIXED; - } - } else { - /* - * SPEC (3.2) "If <extension>..." - */ - if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) { - /* - * SPEC (3.2.1) - * "If the ·effective content· is empty, then the - * {content type} of the [...] base ..." - */ - type->contentType = baseType->contentType; - type->subtypes = baseType->subtypes; - /* - * Fixes bug #347316: - * This is the case when the base type has a simple - * type definition as content. - */ - type->contentTypeDef = baseType->contentTypeDef; - /* - * NOTE that the effective mixed is ignored here. - */ - } else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) { - /* - * SPEC (3.2.2) - */ - if (type->flags & XML_SCHEMAS_TYPE_MIXED) - type->contentType = XML_SCHEMA_CONTENT_MIXED; - } else { - /* - * SPEC (3.2.3) - */ - if (type->flags & XML_SCHEMAS_TYPE_MIXED) - type->contentType = XML_SCHEMA_CONTENT_MIXED; - /* - * "A model group whose {compositor} is sequence and whose - * {particles} are..." - */ - if ((WXS_TYPE_PARTICLE(type) != NULL) && - (WXS_TYPE_PARTICLE_TERM(type) != NULL) && - ((WXS_TYPE_PARTICLE_TERM(type))->type == - XML_SCHEMA_TYPE_ALL)) - { - /* - * SPEC cos-all-limited (1) - */ - xmlSchemaCustomErr(ACTXT_CAST pctxt, - /* TODO: error code */ - XML_SCHEMAP_COS_ALL_LIMITED, - WXS_ITEM_NODE(type), NULL, - "The type has an 'all' model group in its " - "{content type} and thus cannot be derived from " - "a non-empty type, since this would produce a " - "'sequence' model group containing the 'all' " - "model group; 'all' model groups are not " - "allowed to appear inside other model groups", - NULL, NULL); - - } else if ((WXS_TYPE_PARTICLE(baseType) != NULL) && - (WXS_TYPE_PARTICLE_TERM(baseType) != NULL) && - ((WXS_TYPE_PARTICLE_TERM(baseType))->type == - XML_SCHEMA_TYPE_ALL)) - { - /* - * SPEC cos-all-limited (1) - */ - xmlSchemaCustomErr(ACTXT_CAST pctxt, - /* TODO: error code */ - XML_SCHEMAP_COS_ALL_LIMITED, - WXS_ITEM_NODE(type), NULL, - "A type cannot be derived by extension from a type " - "which has an 'all' model group in its " - "{content type}, since this would produce a " - "'sequence' model group containing the 'all' " - "model group; 'all' model groups are not " - "allowed to appear inside other model groups", - NULL, NULL); - - } else if (! dummySequence) { - xmlSchemaTreeItemPtr effectiveContent = - (xmlSchemaTreeItemPtr) type->subtypes; - /* - * Create the particle. - */ - particle = xmlSchemaAddParticle(pctxt, - type->node, 1, 1); - if (particle == NULL) - goto exit_failure; - /* - * Create the "sequence" model group. - */ - particle->children = (xmlSchemaTreeItemPtr) - xmlSchemaAddModelGroup(pctxt, pctxt->schema, - XML_SCHEMA_TYPE_SEQUENCE, type->node); - if (particle->children == NULL) - goto exit_failure; - WXS_TYPE_CONTENTTYPE(type) = (xmlSchemaTypePtr) particle; - /* - * SPEC "the particle of the {content type} of - * the ... base ..." - * Create a duplicate of the base type's particle - * and assign its "term" to it. - */ - particle->children->children = - (xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt, - type->node, - ((xmlSchemaParticlePtr) type->subtypes)->minOccurs, - ((xmlSchemaParticlePtr) type->subtypes)->maxOccurs); - if (particle->children->children == NULL) - goto exit_failure; - particle = (xmlSchemaParticlePtr) - particle->children->children; - particle->children = - ((xmlSchemaParticlePtr) baseType->subtypes)->children; - /* - * SPEC "followed by the ·effective content·." - */ - particle->next = effectiveContent; - /* - * This all will result in: - * new-particle - * --> new-sequence( - * new-particle - * --> base-model, - * this-particle - * --> this-model - * ) - */ - } else { - /* - * This is the case when there is already an empty - * <sequence> with minOccurs==maxOccurs==1. - * Just add the base types's content type. - * NOTE that, although we miss to add an intermediate - * <sequence>, this should produce no difference to - * neither the regex compilation of the content model, - * nor to the complex type constraints. - */ - particle->children->children = - (xmlSchemaTreeItemPtr) baseType->subtypes; - } - } - } - } - /* - * Now fixup attribute uses: - * - expand attr. group references - * - intersect attribute wildcards - * - inherit attribute uses of the base type - * - inherit or union attr. wildcards if extending - * - apply attr. use prohibitions if restricting - */ - res = xmlSchemaFixupTypeAttributeUses(pctxt, type); - HFAILURE HERROR - /* - * Apply the complex type component constraints; this will not - * check attributes, since this is done in - * xmlSchemaFixupTypeAttributeUses(). - */ - res = xmlSchemaCheckCTComponent(pctxt, type); - HFAILURE HERROR - -#ifdef DEBUG_TYPE - xmlSchemaDebugFixedType(pctxt, type); -#endif - if (olderrs != pctxt->nberrors) - return(pctxt->err); - else - return(0); - -exit_error: - type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID; -#ifdef DEBUG_TYPE - xmlSchemaDebugFixedType(pctxt, type); -#endif - return(pctxt->err); - -exit_failure: - type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID; -#ifdef DEBUG_TYPE - xmlSchemaDebugFixedType(pctxt, type); -#endif - return(-1); -} - - -/** - * xmlSchemaTypeFixup: - * @typeDecl: the schema type definition - * @ctxt: the schema parser context - * - * Fixes the content model of the type. - * URGENT TODO: We need an int result! - */ -static int -xmlSchemaTypeFixup(xmlSchemaTypePtr type, - xmlSchemaAbstractCtxtPtr actxt) -{ - if (type == NULL) - return(0); - if (actxt->type != XML_SCHEMA_CTXT_PARSER) { - AERROR_INT("xmlSchemaTypeFixup", - "this function needs a parser context"); - return(-1); - } - if (! WXS_IS_TYPE_NOT_FIXED(type)) - return(0); - if (type->type == XML_SCHEMA_TYPE_COMPLEX) - return(xmlSchemaFixupComplexType(PCTXT_CAST actxt, type)); - else if (type->type == XML_SCHEMA_TYPE_SIMPLE) - return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt, type)); - return(0); -} - -/** - * xmlSchemaCheckFacet: - * @facet: the facet - * @typeDecl: the schema type definition - * @pctxt: the schema parser context or NULL - * @name: the optional name of the type - * - * Checks and computes the values of facets. - * - * Returns 0 if valid, a positive error code if not valid and - * -1 in case of an internal or API error. - */ -int -xmlSchemaCheckFacet(xmlSchemaFacetPtr facet, - xmlSchemaTypePtr typeDecl, - xmlSchemaParserCtxtPtr pctxt, - const xmlChar * name ATTRIBUTE_UNUSED) -{ - int ret = 0, ctxtGiven; - - if ((facet == NULL) || (typeDecl == NULL)) - return(-1); - /* - * TODO: will the parser context be given if used from - * the relaxNG module? - */ - if (pctxt == NULL) - ctxtGiven = 0; - else - ctxtGiven = 1; - - switch (facet->type) { - case XML_SCHEMA_FACET_MININCLUSIVE: - case XML_SCHEMA_FACET_MINEXCLUSIVE: - case XML_SCHEMA_FACET_MAXINCLUSIVE: - case XML_SCHEMA_FACET_MAXEXCLUSIVE: - case XML_SCHEMA_FACET_ENUMERATION: { - /* - * Okay we need to validate the value - * at that point. - */ - xmlSchemaTypePtr base; - - /* 4.3.5.5 Constraints on enumeration Schema Components - * Schema Component Constraint: enumeration valid restriction - * It is an ·error· if any member of {value} is not in the - * ·value space· of {base type definition}. - * - * minInclusive, maxInclusive, minExclusive, maxExclusive: - * The value ·must· be in the - * ·value space· of the ·base type·. - */ - /* - * This function is intended to deliver a compiled value - * on the facet. In this implementation of XML Schemata the - * type holding a facet, won't be a built-in type. - * Thus to ensure that other API - * calls (relaxng) do work, if the given type is a built-in - * type, we will assume that the given built-in type *is - * already* the base type. - */ - if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) { - base = typeDecl->baseType; - if (base == NULL) { - PERROR_INT("xmlSchemaCheckFacet", - "a type user derived type has no base type"); - return (-1); - } - } else - base = typeDecl; - - if (! ctxtGiven) { - /* - * A context is needed if called from RelaxNG. - */ - pctxt = xmlSchemaNewParserCtxt("*"); - if (pctxt == NULL) - return (-1); - } - /* - * NOTE: This call does not check the content nodes, - * since they are not available: - * facet->node is just the node holding the facet - * definition, *not* the attribute holding the *value* - * of the facet. - */ - ret = xmlSchemaVCheckCVCSimpleType( - ACTXT_CAST pctxt, facet->node, base, - facet->value, &(facet->val), 1, 1, 0); - if (ret != 0) { - if (ret < 0) { - /* No error message for RelaxNG. */ - if (ctxtGiven) { - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_INTERNAL, facet->node, NULL, - "Internal error: xmlSchemaCheckFacet, " - "failed to validate the value '%s' of the " - "facet '%s' against the base type", - facet->value, xmlSchemaFacetTypeToString(facet->type)); - } - goto internal_error; - } - ret = XML_SCHEMAP_INVALID_FACET_VALUE; - /* No error message for RelaxNG. */ - if (ctxtGiven) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - ret, facet->node, WXS_BASIC_CAST facet, - "The value '%s' of the facet does not validate " - "against the base type '%s'", - facet->value, - xmlSchemaFormatQName(&str, - base->targetNamespace, base->name)); - FREE_AND_NULL(str); - } - goto exit; - } else if (facet->val == NULL) { - if (ctxtGiven) { - PERROR_INT("xmlSchemaCheckFacet", - "value was not computed"); - } - TODO - } - break; - } - case XML_SCHEMA_FACET_PATTERN: - facet->regexp = xmlRegexpCompile(facet->value); - if (facet->regexp == NULL) { - ret = XML_SCHEMAP_REGEXP_INVALID; - /* No error message for RelaxNG. */ - if (ctxtGiven) { - xmlSchemaCustomErr(ACTXT_CAST pctxt, - ret, facet->node, WXS_BASIC_CAST typeDecl, - "The value '%s' of the facet 'pattern' is not a " - "valid regular expression", - facet->value, NULL); - } - } - break; - case XML_SCHEMA_FACET_TOTALDIGITS: - case XML_SCHEMA_FACET_FRACTIONDIGITS: - case XML_SCHEMA_FACET_LENGTH: - case XML_SCHEMA_FACET_MAXLENGTH: - case XML_SCHEMA_FACET_MINLENGTH: - - if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { - ret = xmlSchemaValidatePredefinedType( - xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER), - facet->value, &(facet->val)); - } else { - ret = xmlSchemaValidatePredefinedType( - xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER), - facet->value, &(facet->val)); - } - if (ret != 0) { - if (ret < 0) { - /* No error message for RelaxNG. */ - if (ctxtGiven) { - PERROR_INT("xmlSchemaCheckFacet", - "validating facet value"); - } - goto internal_error; - } - ret = XML_SCHEMAP_INVALID_FACET_VALUE; - /* No error message for RelaxNG. */ - if (ctxtGiven) { - /* error code */ - xmlSchemaCustomErr4(ACTXT_CAST pctxt, - ret, facet->node, WXS_BASIC_CAST typeDecl, - "The value '%s' of the facet '%s' is not a valid '%s'", - facet->value, - xmlSchemaFacetTypeToString(facet->type), - (facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ? - BAD_CAST "nonNegativeInteger" : - BAD_CAST "positiveInteger", - NULL); - } - } - break; - - case XML_SCHEMA_FACET_WHITESPACE:{ - if (xmlStrEqual(facet->value, BAD_CAST "preserve")) { - facet->whitespace = XML_SCHEMAS_FACET_PRESERVE; - } else if (xmlStrEqual(facet->value, BAD_CAST "replace")) { - facet->whitespace = XML_SCHEMAS_FACET_REPLACE; - } else if (xmlStrEqual(facet->value, BAD_CAST "collapse")) { - facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE; - } else { - ret = XML_SCHEMAP_INVALID_FACET_VALUE; - /* No error message for RelaxNG. */ - if (ctxtGiven) { - /* error was previously: XML_SCHEMAP_INVALID_WHITE_SPACE */ - xmlSchemaCustomErr(ACTXT_CAST pctxt, - ret, facet->node, WXS_BASIC_CAST typeDecl, - "The value '%s' of the facet 'whitespace' is not " - "valid", facet->value, NULL); - } - } - } - default: - break; - } -exit: - if ((! ctxtGiven) && (pctxt != NULL)) - xmlSchemaFreeParserCtxt(pctxt); - return (ret); -internal_error: - if ((! ctxtGiven) && (pctxt != NULL)) - xmlSchemaFreeParserCtxt(pctxt); - return (-1); -} - -/** - * xmlSchemaCheckFacetValues: - * @typeDecl: the schema type definition - * @ctxt: the schema parser context - * - * Checks the default values types, especially for facets - */ -static int -xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl, - xmlSchemaParserCtxtPtr pctxt) -{ - int res, olderrs = pctxt->nberrors; - const xmlChar *name = typeDecl->name; - /* - * NOTE: It is intended to use the facets list, instead - * of facetSet. - */ - if (typeDecl->facets != NULL) { - xmlSchemaFacetPtr facet = typeDecl->facets; - - /* - * Temporarily assign the "schema" to the validation context - * of the parser context. This is needed for NOTATION validation. - */ - if (pctxt->vctxt == NULL) { - if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1) - return(-1); - } - pctxt->vctxt->schema = pctxt->schema; - while (facet != NULL) { - res = xmlSchemaCheckFacet(facet, typeDecl, pctxt, name); - HFAILURE - facet = facet->next; - } - pctxt->vctxt->schema = NULL; - } - if (olderrs != pctxt->nberrors) - return(pctxt->err); - return(0); -exit_failure: - return(-1); -} - -/** - * xmlSchemaGetCircModelGrDefRef: - * @ctxtMGroup: the searched model group - * @selfMGroup: the second searched model group - * @particle: the first particle - * - * This one is intended to be used by - * xmlSchemaCheckGroupDefCircular only. - * - * Returns the particle with the circular model group definition reference, - * otherwise NULL. - */ -static xmlSchemaTreeItemPtr -xmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef, - xmlSchemaTreeItemPtr particle) -{ - xmlSchemaTreeItemPtr circ = NULL; - xmlSchemaTreeItemPtr term; - xmlSchemaModelGroupDefPtr gdef; - - for (; particle != NULL; particle = particle->next) { - term = particle->children; - if (term == NULL) - continue; - switch (term->type) { - case XML_SCHEMA_TYPE_GROUP: - gdef = (xmlSchemaModelGroupDefPtr) term; - if (gdef == groupDef) - return (particle); - /* - * Mark this model group definition to avoid infinite - * recursion on circular references not yet examined. - */ - if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED) - continue; - if (gdef->children != NULL) { - gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED; - circ = xmlSchemaGetCircModelGrDefRef(groupDef, - gdef->children->children); - gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED; - if (circ != NULL) - return (circ); - } - break; - case XML_SCHEMA_TYPE_SEQUENCE: - case XML_SCHEMA_TYPE_CHOICE: - case XML_SCHEMA_TYPE_ALL: - circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children); - if (circ != NULL) - return (circ); - break; - default: - break; - } - } - return (NULL); -} - -/** - * xmlSchemaCheckGroupDefCircular: - * @item: the model group definition - * @ctxt: the parser context - * @name: the name - * - * Checks for circular references to model group definitions. - */ -static void -xmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr item, - xmlSchemaParserCtxtPtr ctxt) -{ - /* - * Schema Component Constraint: Model Group Correct - * 2 Circular groups are disallowed. That is, within the {particles} - * of a group there must not be at any depth a particle whose {term} - * is the group itself. - */ - if ((item == NULL) || - (item->type != XML_SCHEMA_TYPE_GROUP) || - (item->children == NULL)) - return; - { - xmlSchemaTreeItemPtr circ; - - circ = xmlSchemaGetCircModelGrDefRef(item, item->children->children); - if (circ != NULL) { - xmlChar *str = NULL; - /* - * TODO: The error report is not adequate: this constraint - * is defined for model groups but not definitions, but since - * there cannot be any circular model groups without a model group - * definition (if not using a construction API), we check those - * defintions only. - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_MG_PROPS_CORRECT_2, - NULL, WXS_ITEM_NODE(circ), - "Circular reference to the model group definition '%s' " - "defined", xmlSchemaFormatQName(&str, - item->targetNamespace, item->name)); - FREE_AND_NULL(str) - /* - * NOTE: We will cut the reference to avoid further - * confusion of the processor. This is a fatal error. - */ - circ->children = NULL; - } - } -} - -/** - * xmlSchemaModelGroupToModelGroupDefFixup: - * @ctxt: the parser context - * @mg: the model group - * - * Assigns the model group of model group definitions to the "term" - * of the referencing particle. - * In xmlSchemaResolveModelGroupParticleReferences the model group - * definitions were assigned to the "term", since needed for the - * circularity check. - * - * Schema Component Constraint: - * All Group Limited (cos-all-limited) (1.2) - */ -static void -xmlSchemaModelGroupToModelGroupDefFixup( - xmlSchemaParserCtxtPtr ctxt ATTRIBUTE_UNUSED, - xmlSchemaModelGroupPtr mg) -{ - xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg); - - while (particle != NULL) { - if ((WXS_PARTICLE_TERM(particle) == NULL) || - ((WXS_PARTICLE_TERM(particle))->type != - XML_SCHEMA_TYPE_GROUP)) - { - particle = WXS_PTC_CAST particle->next; - continue; - } - if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) == NULL) { - /* - * TODO: Remove the particle. - */ - WXS_PARTICLE_TERM(particle) = NULL; - particle = WXS_PTC_CAST particle->next; - continue; - } - /* - * Assign the model group to the {term} of the particle. - */ - WXS_PARTICLE_TERM(particle) = - WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)); - - particle = WXS_PTC_CAST particle->next; - } -} - -/** - * xmlSchemaCheckAttrGroupCircularRecur: - * @ctxtGr: the searched attribute group - * @attr: the current attribute list to be processed - * - * This one is intended to be used by - * xmlSchemaCheckAttrGroupCircular only. - * - * Returns the circular attribute grou reference, otherwise NULL. - */ -static xmlSchemaQNameRefPtr -xmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr, - xmlSchemaItemListPtr list) -{ - xmlSchemaAttributeGroupPtr gr; - xmlSchemaQNameRefPtr ref, circ; - int i; - /* - * We will search for an attribute group reference which - * references the context attribute group. - */ - for (i = 0; i < list->nbItems; i++) { - ref = list->items[i]; - if ((ref->type == XML_SCHEMA_EXTRA_QNAMEREF) && - (ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) && - (ref->item != NULL)) - { - gr = WXS_ATTR_GROUP_CAST ref->item; - if (gr == ctxtGr) - return(ref); - if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED) - continue; - /* - * Mark as visited to avoid infinite recursion on - * circular references not yet examined. - */ - if ((gr->attrUses) && - (gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)) - { - gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED; - circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr, - (xmlSchemaItemListPtr) gr->attrUses); - gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED; - if (circ != NULL) - return (circ); - } - - } - } - return (NULL); -} - -/** - * xmlSchemaCheckAttrGroupCircular: - * attrGr: the attribute group definition - * @ctxt: the parser context - * @name: the name - * - * Checks for circular references of attribute groups. - */ -static int -xmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr, - xmlSchemaParserCtxtPtr ctxt) -{ - /* - * Schema Representation Constraint: - * Attribute Group Definition Representation OK - * 3 Circular group reference is disallowed outside <redefine>. - * That is, unless this element information item's parent is - * <redefine>, then among the [children], if any, there must - * not be an <attributeGroup> with ref [attribute] which resolves - * to the component corresponding to this <attributeGroup>. Indirect - * circularity is also ruled out. That is, when QName resolution - * (Schema Document) (§3.15.3) is applied to a ·QName· arising from - * any <attributeGroup>s with a ref [attribute] among the [children], - * it must not be the case that a ·QName· is encountered at any depth - * which resolves to the component corresponding to this <attributeGroup>. - */ - if (attrGr->attrUses == NULL) - return(0); - else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0) - return(0); - else { - xmlSchemaQNameRefPtr circ; - - circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr, - (xmlSchemaItemListPtr) attrGr->attrUses); - if (circ != NULL) { - xmlChar *str = NULL; - /* - * TODO: Report the referenced attr group as QName. - */ - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3, - NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ), - "Circular reference to the attribute group '%s' " - "defined", xmlSchemaGetComponentQName(&str, attrGr)); - FREE_AND_NULL(str); - /* - * NOTE: We will cut the reference to avoid further - * confusion of the processor. - * BADSPEC TODO: The spec should define how to process in this case. - */ - circ->item = NULL; - return(ctxt->err); - } - } - return(0); -} - -static int -xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaAttributeGroupPtr attrGr); - -/** - * xmlSchemaExpandAttributeGroupRefs: - * @pctxt: the parser context - * @node: the node of the component holding the attribute uses - * @completeWild: the intersected wildcard to be returned - * @list: the attribute uses - * - * Substitutes contained attribute group references - * for their attribute uses. Wilcards are intersected. - * Attribute use prohibitions are removed from the list - * and returned via the @prohibs list. - * Pointlessness of attr. prohibs, if a matching attr. decl - * is existent a well, are checked. - */ -static int -xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaBasicItemPtr item, - xmlSchemaWildcardPtr *completeWild, - xmlSchemaItemListPtr list, - xmlSchemaItemListPtr prohibs) -{ - xmlSchemaAttributeGroupPtr gr; - xmlSchemaAttributeUsePtr use; - xmlSchemaItemListPtr sublist; - int i, j; - int created = (*completeWild == NULL) ? 0 : 1; - - if (prohibs) - prohibs->nbItems = 0; - - for (i = 0; i < list->nbItems; i++) { - use = list->items[i]; - - if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) { - if (prohibs == NULL) { - PERROR_INT("xmlSchemaExpandAttributeGroupRefs", - "unexpected attr prohibition found"); - return(-1); - } - /* - * Remove from attribute uses. - */ - if (xmlSchemaItemListRemove(list, i) == -1) - return(-1); - i--; - /* - * Note that duplicate prohibitions were already - * handled at parsing time. - */ - /* - * Add to list of prohibitions. - */ - xmlSchemaItemListAddSize(prohibs, 2, use); - continue; - } - if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) && - ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP)) - { - if ((WXS_QNAME_CAST use)->item == NULL) - return(-1); - gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item; - /* - * Expand the referenced attr. group. - * TODO: remove this, this is done in a previous step, so - * already done here. - */ - if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) { - if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1) - return(-1); - } - /* - * Build the 'complete' wildcard; i.e. intersect multiple - * wildcards. - */ - if (gr->attributeWildcard != NULL) { - if (*completeWild == NULL) { - *completeWild = gr->attributeWildcard; - } else { - if (! created) { - xmlSchemaWildcardPtr tmpWild; - - /* - * Copy the first encountered wildcard as context, - * except for the annotation. - * - * Although the complete wildcard might not correspond - * to any node in the schema, we will anchor it on - * the node of the owner component. - */ - tmpWild = xmlSchemaAddWildcard(pctxt, pctxt->schema, - XML_SCHEMA_TYPE_ANY_ATTRIBUTE, - WXS_ITEM_NODE(item)); - if (tmpWild == NULL) - return(-1); - if (xmlSchemaCloneWildcardNsConstraints(pctxt, - tmpWild, *completeWild) == -1) - return (-1); - tmpWild->processContents = (*completeWild)->processContents; - *completeWild = tmpWild; - created = 1; - } - - if (xmlSchemaIntersectWildcards(pctxt, *completeWild, - gr->attributeWildcard) == -1) - return(-1); - } - } - /* - * Just remove the reference if the referenced group does not - * contain any attribute uses. - */ - if (gr->attrUses == NULL) { - if (xmlSchemaItemListRemove(list, i) == -1) - return(-1); - i--; - continue; - } - /* - * Add the attribute uses. - */ - sublist = ((xmlSchemaItemListPtr) gr->attrUses); - if (sublist->nbItems != 0) { - list->items[i] = sublist->items[0]; - if (sublist->nbItems != 1) { - for (j = 1; j < sublist->nbItems; j++) { - i++; - if (xmlSchemaItemListInsert(list, - sublist->items[j], i) == -1) - return(-1); - } - } - } - } - - } - /* - * Handle pointless prohibitions of declared attributes. - */ - if (prohibs && (prohibs->nbItems != 0) && (list->nbItems != 0)) { - xmlSchemaAttributeUseProhibPtr prohib; - - for (i = prohibs->nbItems -1; i >= 0; i--) { - prohib = prohibs->items[i]; - for (j = 0; j < list->nbItems; j++) { - use = list->items[j]; - - if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) && - (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use))) - { - xmlChar *str = NULL; - - xmlSchemaCustomWarning(ACTXT_CAST pctxt, - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, - prohib->node, NULL, - "Skipping pointless attribute use prohibition " - "'%s', since a corresponding attribute use " - "exists already in the type definition", - xmlSchemaFormatQName(&str, - prohib->targetNamespace, prohib->name), - NULL, NULL); - FREE_AND_NULL(str); - /* - * Remove the prohibition. - */ - if (xmlSchemaItemListRemove(prohibs, i) == -1) - return(-1); - break; - } - } - } - } - return(0); -} - -/** - * xmlSchemaAttributeGroupExpandRefs: - * @pctxt: the parser context - * @attrGr: the attribute group definition - * - * Computation of: - * {attribute uses} property - * {attribute wildcard} property - * - * Substitutes contained attribute group references - * for their attribute uses. Wilcards are intersected. - */ -static int -xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaAttributeGroupPtr attrGr) -{ - if ((attrGr->attrUses == NULL) || - (attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)) - return(0); - - attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED; - if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr, - &(attrGr->attributeWildcard), attrGr->attrUses, NULL) == -1) - return(-1); - return(0); -} - -/** - * xmlSchemaAttributeGroupExpandRefs: - * @pctxt: the parser context - * @attrGr: the attribute group definition - * - * Substitutes contained attribute group references - * for their attribute uses. Wilcards are intersected. - * - * Schema Component Constraint: - * Attribute Group Definition Properties Correct (ag-props-correct) - */ -static int -xmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaAttributeGroupPtr attrGr) -{ - /* - * SPEC ag-props-correct - * (1) "The values of the properties of an attribute group definition - * must be as described in the property tableau in The Attribute - * Group Definition Schema Component (§3.6.1), modulo the impact of - * Missing Sub-components (§5.3);" - */ - - if ((attrGr->attrUses != NULL) && - (WXS_LIST_CAST attrGr->attrUses)->nbItems > 1) - { - xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses; - xmlSchemaAttributeUsePtr use, tmp; - int i, j, hasId = 0; - - for (i = uses->nbItems -1; i >= 0; i--) { - use = uses->items[i]; - /* - * SPEC ag-props-correct - * (2) "Two distinct members of the {attribute uses} must not have - * {attribute declaration}s both of whose {name}s match and whose - * {target namespace}s are identical." - */ - if (i > 0) { - for (j = i -1; j >= 0; j--) { - tmp = uses->items[j]; - if ((WXS_ATTRUSE_DECL_NAME(use) == - WXS_ATTRUSE_DECL_NAME(tmp)) && - (WXS_ATTRUSE_DECL_TNS(use) == - WXS_ATTRUSE_DECL_TNS(tmp))) - { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_AG_PROPS_CORRECT, - attrGr->node, WXS_BASIC_CAST attrGr, - "Duplicate %s", - xmlSchemaGetComponentDesignation(&str, use), - NULL); - FREE_AND_NULL(str); - /* - * Remove the duplicate. - */ - if (xmlSchemaItemListRemove(uses, i) == -1) - return(-1); - goto next_use; - } - } - } - /* - * SPEC ag-props-correct - * (3) "Two distinct members of the {attribute uses} must not have - * {attribute declaration}s both of whose {type definition}s are or - * are derived from ID." - * TODO: Does 'derived' include member-types of unions? - */ - if (WXS_ATTRUSE_TYPEDEF(use) != NULL) { - if (xmlSchemaIsDerivedFromBuiltInType( - WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) - { - if (hasId) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_AG_PROPS_CORRECT, - attrGr->node, WXS_BASIC_CAST attrGr, - "There must not exist more than one attribute " - "declaration of type 'xs:ID' " - "(or derived from 'xs:ID'). The %s violates this " - "constraint", - xmlSchemaGetComponentDesignation(&str, use), - NULL); - FREE_AND_NULL(str); - if (xmlSchemaItemListRemove(uses, i) == -1) - return(-1); - } - hasId = 1; - } - } -next_use: {} - } - } - return(0); -} - -/** - * xmlSchemaResolveAttrGroupReferences: - * @attrgrpDecl: the schema attribute definition - * @ctxt: the schema parser context - * @name: the attribute name - * - * Resolves references to attribute group definitions. - */ -static int -xmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr ref, - xmlSchemaParserCtxtPtr ctxt) -{ - xmlSchemaAttributeGroupPtr group; - - if (ref->item != NULL) - return(0); - group = xmlSchemaGetAttributeGroup(ctxt->schema, - ref->name, - ref->targetNamespace); - if (group == NULL) { - xmlSchemaPResCompAttrErr(ctxt, - XML_SCHEMAP_SRC_RESOLVE, - NULL, ref->node, - "ref", ref->name, ref->targetNamespace, - ref->itemType, NULL); - return(ctxt->err); - } - ref->item = WXS_BASIC_CAST group; - return(0); -} - -/** - * xmlSchemaCheckAttrPropsCorrect: - * @item: an schema attribute declaration/use - * @ctxt: a schema parser context - * @name: the name of the attribute - * - * - * Schema Component Constraint: - * Attribute Declaration Properties Correct (a-props-correct) - * - * Validates the value constraints of an attribute declaration/use. - * NOTE that this needs the simle type definitions to be already - * builded and checked. - */ -static int -xmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaAttributePtr attr) -{ - - /* - * SPEC a-props-correct (1) - * "The values of the properties of an attribute declaration must - * be as described in the property tableau in The Attribute - * Declaration Schema Component (§3.2.1), modulo the impact of - * Missing Sub-components (§5.3)." - */ - - if (WXS_ATTR_TYPEDEF(attr) == NULL) - return(0); - - if (attr->defValue != NULL) { - int ret; - - /* - * SPEC a-props-correct (3) - * "If the {type definition} is or is derived from ID then there - * must not be a {value constraint}." - */ - if (xmlSchemaIsDerivedFromBuiltInType( - WXS_ATTR_TYPEDEF(attr), XML_SCHEMAS_ID)) - { - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_A_PROPS_CORRECT_3, - NULL, WXS_BASIC_CAST attr, - "Value constraints are not allowed if the type definition " - "is or is derived from xs:ID", - NULL, NULL); - return(pctxt->err); - } - /* - * SPEC a-props-correct (2) - * "if there is a {value constraint}, the canonical lexical - * representation of its value must be ·valid· with respect - * to the {type definition} as defined in String Valid (§3.14.4)." - * TODO: Don't care about the *cononical* stuff here, this requirement - * will be removed in WXS 1.1 anyway. - */ - ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, - attr->node, WXS_ATTR_TYPEDEF(attr), - attr->defValue, &(attr->defVal), - 1, 1, 0); - if (ret != 0) { - if (ret < 0) { - PERROR_INT("xmlSchemaCheckAttrPropsCorrect", - "calling xmlSchemaVCheckCVCSimpleType()"); - return(-1); - } - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_A_PROPS_CORRECT_2, - NULL, WXS_BASIC_CAST attr, - "The value of the value constraint is not valid", - NULL, NULL); - return(pctxt->err); - } - } - - return(0); -} - -static xmlSchemaElementPtr -xmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl, - xmlSchemaElementPtr ancestor) -{ - xmlSchemaElementPtr ret; - - if (WXS_SUBST_HEAD(ancestor) == NULL) - return (NULL); - if (WXS_SUBST_HEAD(ancestor) == elemDecl) - return (ancestor); - - if (WXS_SUBST_HEAD(ancestor)->flags & XML_SCHEMAS_ELEM_CIRCULAR) - return (NULL); - WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR; - ret = xmlSchemaCheckSubstGroupCircular(elemDecl, - WXS_SUBST_HEAD(ancestor)); - WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR; - - return (ret); -} - -/** - * xmlSchemaCheckElemPropsCorrect: - * @ctxt: a schema parser context - * @decl: the element declaration - * @name: the name of the attribute - * - * Schema Component Constraint: - * Element Declaration Properties Correct (e-props-correct) - * - * STATUS: - * missing: (6) - */ -static int -xmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaElementPtr elemDecl) -{ - int ret = 0; - xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl); - /* - * SPEC (1) "The values of the properties of an element declaration - * must be as described in the property tableau in The Element - * Declaration Schema Component (§3.3.1), modulo the impact of Missing - * Sub-components (§5.3)." - */ - if (WXS_SUBST_HEAD(elemDecl) != NULL) { - xmlSchemaElementPtr head = WXS_SUBST_HEAD(elemDecl), circ; - - xmlSchemaCheckElementDeclComponent(head, pctxt); - /* - * SPEC (3) "If there is a non-·absent· {substitution group - * affiliation}, then {scope} must be global." - */ - if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) { - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_E_PROPS_CORRECT_3, - WXS_BASIC_CAST elemDecl, NULL, - "Only global element declarations can have a " - "substitution group affiliation", NULL); - ret = XML_SCHEMAP_E_PROPS_CORRECT_3; - } - /* - * TODO: SPEC (6) "Circular substitution groups are disallowed. - * That is, it must not be possible to return to an element declaration - * by repeatedly following the {substitution group affiliation} - * property." - */ - if (head == elemDecl) - circ = head; - else if (WXS_SUBST_HEAD(head) != NULL) - circ = xmlSchemaCheckSubstGroupCircular(head, head); - else - circ = NULL; - if (circ != NULL) { - xmlChar *strA = NULL, *strB = NULL; - - xmlSchemaPCustomErrExt(pctxt, - XML_SCHEMAP_E_PROPS_CORRECT_6, - WXS_BASIC_CAST circ, NULL, - "The element declaration '%s' defines a circular " - "substitution group to element declaration '%s'", - xmlSchemaGetComponentQName(&strA, circ), - xmlSchemaGetComponentQName(&strB, head), - NULL); - FREE_AND_NULL(strA) - FREE_AND_NULL(strB) - ret = XML_SCHEMAP_E_PROPS_CORRECT_6; - } - /* - * SPEC (4) "If there is a {substitution group affiliation}, - * the {type definition} - * of the element declaration must be validly derived from the {type - * definition} of the {substitution group affiliation}, given the value - * of the {substitution group exclusions} of the {substitution group - * affiliation}, as defined in Type Derivation OK (Complex) (§3.4.6) - * (if the {type definition} is complex) or as defined in - * Type Derivation OK (Simple) (§3.14.6) (if the {type definition} is - * simple)." - * - * NOTE: {substitution group exclusions} means the values of the - * attribute "final". - */ - - if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) { - int set = 0; - - if (head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION) - set |= SUBSET_EXTENSION; - if (head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION) - set |= SUBSET_RESTRICTION; - - if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef, - WXS_ELEM_TYPEDEF(head), set) != 0) { - xmlChar *strA = NULL, *strB = NULL, *strC = NULL; - - ret = XML_SCHEMAP_E_PROPS_CORRECT_4; - xmlSchemaPCustomErrExt(pctxt, - XML_SCHEMAP_E_PROPS_CORRECT_4, - WXS_BASIC_CAST elemDecl, NULL, - "The type definition '%s' was " - "either rejected by the substitution group " - "affiliation '%s', or not validly derived from its type " - "definition '%s'", - xmlSchemaGetComponentQName(&strA, typeDef), - xmlSchemaGetComponentQName(&strB, head), - xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(head))); - FREE_AND_NULL(strA) - FREE_AND_NULL(strB) - FREE_AND_NULL(strC) - } - } - } - /* - * SPEC (5) "If the {type definition} or {type definition}'s - * {content type} - * is or is derived from ID then there must not be a {value constraint}. - * Note: The use of ID as a type definition for elements goes beyond - * XML 1.0, and should be avoided if backwards compatibility is desired" - */ - if ((elemDecl->value != NULL) && - ((WXS_IS_SIMPLE(typeDef) && - xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) || - (WXS_IS_COMPLEX(typeDef) && - WXS_HAS_SIMPLE_CONTENT(typeDef) && - xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef, - XML_SCHEMAS_ID)))) { - - ret = XML_SCHEMAP_E_PROPS_CORRECT_5; - xmlSchemaPCustomErr(pctxt, - XML_SCHEMAP_E_PROPS_CORRECT_5, - WXS_BASIC_CAST elemDecl, NULL, - "The type definition (or type definition's content type) is or " - "is derived from ID; value constraints are not allowed in " - "conjunction with such a type definition", NULL); - } else if (elemDecl->value != NULL) { - int vcret; - xmlNodePtr node = NULL; - - /* - * SPEC (2) "If there is a {value constraint}, the canonical lexical - * representation of its value must be ·valid· with respect to the - * {type definition} as defined in Element Default Valid (Immediate) - * (§3.3.6)." - */ - if (typeDef == NULL) { - xmlSchemaPErr(pctxt, elemDecl->node, - XML_SCHEMAP_INTERNAL, - "Internal error: xmlSchemaCheckElemPropsCorrect, " - "type is missing... skipping validation of " - "the value constraint", NULL, NULL); - return (-1); - } - if (elemDecl->node != NULL) { - if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) - node = (xmlNodePtr) xmlHasProp(elemDecl->node, - BAD_CAST "fixed"); - else - node = (xmlNodePtr) xmlHasProp(elemDecl->node, - BAD_CAST "default"); - } - vcret = xmlSchemaParseCheckCOSValidDefault(pctxt, node, - typeDef, elemDecl->value, &(elemDecl->defVal)); - if (vcret != 0) { - if (vcret < 0) { - PERROR_INT("xmlSchemaElemCheckValConstr", - "failed to validate the value constraint of an " - "element declaration"); - return (-1); - } - return (vcret); - } - } - - return (ret); -} - -/** - * xmlSchemaCheckElemSubstGroup: - * @ctxt: a schema parser context - * @decl: the element declaration - * @name: the name of the attribute - * - * Schema Component Constraint: - * Substitution Group (cos-equiv-class) - * - * In Libxml2 the subst. groups will be precomputed, in terms of that - * a list will be built for each subst. group head, holding all direct - * referents to this head. - * NOTE that this function needs: - * 1. circular subst. groups to be checked beforehand - * 2. the declaration's type to be derived from the head's type - * - * STATUS: - * - */ -static void -xmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaElementPtr elemDecl) -{ - if ((WXS_SUBST_HEAD(elemDecl) == NULL) || - /* SPEC (1) "Its {abstract} is false." */ - (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)) - return; - { - xmlSchemaElementPtr head; - xmlSchemaTypePtr headType, type; - int set, methSet; - /* - * SPEC (2) "It is validly substitutable for HEAD subject to HEAD's - * {disallowed substitutions} as the blocking constraint, as defined in - * Substitution Group OK (Transitive) (§3.3.6)." - */ - for (head = WXS_SUBST_HEAD(elemDecl); head != NULL; - head = WXS_SUBST_HEAD(head)) { - set = 0; - methSet = 0; - /* - * The blocking constraints. - */ - if (head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) - continue; - headType = head->subtypes; - type = elemDecl->subtypes; - if (headType == type) - goto add_member; - if (head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) - set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; - if (head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) - set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; - /* - * SPEC: Substitution Group OK (Transitive) (2.3) - * "The set of all {derivation method}s involved in the - * derivation of D's {type definition} from C's {type definition} - * does not intersect with the union of the blocking constraint, - * C's {prohibited substitutions} (if C is complex, otherwise the - * empty set) and the {prohibited substitutions} (respectively the - * empty set) of any intermediate {type definition}s in the - * derivation of D's {type definition} from C's {type definition}." - */ - /* - * OPTIMIZE TODO: Optimize this a bit, since, if traversing the - * subst.head axis, the methSet does not need to be computed for - * the full depth over and over. - */ - /* - * The set of all {derivation method}s involved in the derivation - */ - while ((type != NULL) && (type != headType)) { - if ((WXS_IS_EXTENSION(type)) && - ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) - methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; - - if (WXS_IS_RESTRICTION(type) && - ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) - methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; - - type = type->baseType; - } - /* - * The {prohibited substitutions} of all intermediate types + - * the head's type. - */ - type = elemDecl->subtypes->baseType; - while (type != NULL) { - if (WXS_IS_COMPLEX(type)) { - if ((type->flags & - XML_SCHEMAS_TYPE_BLOCK_EXTENSION) && - ((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0)) - set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; - if ((type->flags & - XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) && - ((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) - set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; - } else - break; - if (type == headType) - break; - type = type->baseType; - } - if ((set != 0) && - (((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) && - (methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) || - ((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) && - (methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) { - continue; - } -add_member: - xmlSchemaAddElementSubstitutionMember(ctxt, head, elemDecl); - if ((head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0) - head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD; - } - } -} - -#ifdef WXS_ELEM_DECL_CONS_ENABLED /* enable when finished */ -/** - * xmlSchemaCheckElementDeclComponent - * @pctxt: the schema parser context - * @ctxtComponent: the context component (an element declaration) - * @ctxtParticle: the first particle of the context component - * @searchParticle: the element declaration particle to be analysed - * - * Schema Component Constraint: Element Declarations Consistent - */ -static int -xmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaBasicItemPtr ctxtComponent, - xmlSchemaParticlePtr ctxtParticle, - xmlSchemaParticlePtr searchParticle, - xmlSchemaParticlePtr curParticle, - int search) -{ - return(0); - - int ret = 0; - xmlSchemaParticlePtr cur = curParticle; - if (curParticle == NULL) { - return(0); - } - if (WXS_PARTICLE_TERM(curParticle) == NULL) { - /* - * Just return in this case. A missing "term" of the particle - * might arise due to an invalid "term" component. - */ - return(0); - } - while (cur != NULL) { - switch (WXS_PARTICLE_TERM(cur)->type) { - case XML_SCHEMA_TYPE_ANY: - break; - case XML_SCHEMA_TYPE_ELEMENT: - if (search == 0) { - ret = xmlSchemaCheckElementDeclConsistent(pctxt, - ctxtComponent, ctxtParticle, cur, ctxtParticle, 1); - if (ret != 0) - return(ret); - } else { - xmlSchemaElementPtr elem = - WXS_ELEM_CAST(WXS_PARTICLE_TERM(cur)); - /* - * SPEC Element Declarations Consistent: - * "If the {particles} contains, either directly, - * indirectly (that is, within the {particles} of a - * contained model group, recursively) or ·implicitly· - * two or more element declaration particles with - * the same {name} and {target namespace}, then - * all their type definitions must be the same - * top-level definition [...]" - */ - if (xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->name, - WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->name) && - xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace, - WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace)) - { - xmlChar *strA = NULL, *strB = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - /* TODO: error code */ - XML_SCHEMAP_COS_NONAMBIG, - WXS_ITEM_NODE(cur), NULL, - "In the content model of %s, there are multiple " - "element declarations for '%s' with different " - "type definitions", - xmlSchemaGetComponentDesignation(&strA, - ctxtComponent), - xmlSchemaFormatQName(&strB, - WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace, - WXS_PARTICLE_TERM_AS_ELEM(cur)->name)); - FREE_AND_NULL(strA); - FREE_AND_NULL(strB); - return(XML_SCHEMAP_COS_NONAMBIG); - } - } - break; - case XML_SCHEMA_TYPE_SEQUENCE: { - break; - } - case XML_SCHEMA_TYPE_CHOICE:{ - /* - xmlSchemaTreeItemPtr sub; - - sub = WXS_PARTICLE_TERM(particle)->children; (xmlSchemaParticlePtr) - while (sub != NULL) { - ret = xmlSchemaCheckElementDeclConsistent(pctxt, ctxtComponent, - ctxtParticle, ctxtElem); - if (ret != 0) - return(ret); - sub = sub->next; - } - */ - break; - } - case XML_SCHEMA_TYPE_ALL: - break; - case XML_SCHEMA_TYPE_GROUP: - break; - default: - xmlSchemaInternalErr2(ACTXT_CAST pctxt, - "xmlSchemaCheckElementDeclConsistent", - "found unexpected term of type '%s' in content model", - WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(cur)), NULL); - return(-1); - } - cur = (xmlSchemaParticlePtr) cur->next; - } - -exit: - return(ret); -} -#endif - -/** - * xmlSchemaCheckElementDeclComponent - * @item: an schema element declaration/particle - * @ctxt: a schema parser context - * @name: the name of the attribute - * - * Validates the value constraints of an element declaration. - * Adds substitution group members. - */ -static void -xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl, - xmlSchemaParserCtxtPtr ctxt) -{ - if (elemDecl == NULL) - return; - if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) - return; - elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED; - if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) { - /* - * Adds substitution group members. - */ - xmlSchemaCheckElemSubstGroup(ctxt, elemDecl); - } -} - -/** - * xmlSchemaResolveModelGroupParticleReferences: - * @particle: a particle component - * @ctxt: a parser context - * - * Resolves references of a model group's {particles} to - * model group definitions and to element declarations. - */ -static void -xmlSchemaResolveModelGroupParticleReferences( - xmlSchemaParserCtxtPtr ctxt, - xmlSchemaModelGroupPtr mg) -{ - xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg); - xmlSchemaQNameRefPtr ref; - xmlSchemaBasicItemPtr refItem; - - /* - * URGENT TODO: Test this. - */ - while (particle != NULL) { - if ((WXS_PARTICLE_TERM(particle) == NULL) || - ((WXS_PARTICLE_TERM(particle))->type != - XML_SCHEMA_EXTRA_QNAMEREF)) - { - goto next_particle; - } - ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle); - /* - * Resolve the reference. - * NULL the {term} by default. - */ - particle->children = NULL; - - refItem = xmlSchemaGetNamedComponent(ctxt->schema, - ref->itemType, ref->name, ref->targetNamespace); - if (refItem == NULL) { - xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, - NULL, WXS_ITEM_NODE(particle), "ref", ref->name, - ref->targetNamespace, ref->itemType, NULL); - /* TODO: remove the particle. */ - goto next_particle; - } - if (refItem->type == XML_SCHEMA_TYPE_GROUP) { - if (WXS_MODELGROUPDEF_MODEL(refItem) == NULL) - /* TODO: remove the particle. */ - goto next_particle; - /* - * NOTE that we will assign the model group definition - * itself to the "term" of the particle. This will ease - * the check for circular model group definitions. After - * that the "term" will be assigned the model group of the - * model group definition. - */ - if ((WXS_MODELGROUPDEF_MODEL(refItem))->type == - XML_SCHEMA_TYPE_ALL) { - /* - * SPEC cos-all-limited (1) - * SPEC cos-all-limited (1.2) - * "It appears only as the value of one or both of the - * following properties:" - * (1.1) "the {model group} property of a model group - * definition." - * (1.2) "the {term} property of a particle [... of] the " - * {content type} of a complex type definition." - */ - xmlSchemaCustomErr(ACTXT_CAST ctxt, - /* TODO: error code */ - XML_SCHEMAP_COS_ALL_LIMITED, - WXS_ITEM_NODE(particle), NULL, - "A model group definition is referenced, but " - "it contains an 'all' model group, which " - "cannot be contained by model groups", - NULL, NULL); - /* TODO: remove the particle. */ - goto next_particle; - } - particle->children = (xmlSchemaTreeItemPtr) refItem; - } else { - /* - * TODO: Are referenced element declarations the only - * other components we expect here? - */ - particle->children = (xmlSchemaTreeItemPtr) refItem; - } -next_particle: - particle = WXS_PTC_CAST particle->next; - } -} - -static int -xmlSchemaAreValuesEqual(xmlSchemaValPtr x, - xmlSchemaValPtr y) -{ - xmlSchemaTypePtr tx, ty, ptx, pty; - int ret; - - while (x != NULL) { - /* Same types. */ - tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(x)); - ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(y)); - ptx = xmlSchemaGetPrimitiveType(tx); - pty = xmlSchemaGetPrimitiveType(ty); - /* - * (1) if a datatype T' is ·derived· by ·restriction· from an - * atomic datatype T then the ·value space· of T' is a subset of - * the ·value space· of T. */ - /* - * (2) if datatypes T' and T'' are ·derived· by ·restriction· - * from a common atomic ancestor T then the ·value space·s of T' - * and T'' may overlap. - */ - if (ptx != pty) - return(0); - /* - * We assume computed values to be normalized, so do a fast - * string comparison for string based types. - */ - if ((ptx->builtInType == XML_SCHEMAS_STRING) || - WXS_IS_ANY_SIMPLE_TYPE(ptx)) { - if (! xmlStrEqual( - xmlSchemaValueGetAsString(x), - xmlSchemaValueGetAsString(y))) - return (0); - } else { - ret = xmlSchemaCompareValuesWhtsp( - x, XML_SCHEMA_WHITESPACE_PRESERVE, - y, XML_SCHEMA_WHITESPACE_PRESERVE); - if (ret == -2) - return(-1); - if (ret != 0) - return(0); - } - /* - * Lists. - */ - x = xmlSchemaValueGetNext(x); - if (x != NULL) { - y = xmlSchemaValueGetNext(y); - if (y == NULL) - return (0); - } else if (xmlSchemaValueGetNext(y) != NULL) - return (0); - else - return (1); - } - return (0); -} - -/** - * xmlSchemaResolveAttrUseReferences: - * @item: an attribute use - * @ctxt: a parser context - * - * Resolves the referenced attribute declaration. - */ -static int -xmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause, - xmlSchemaParserCtxtPtr ctxt) -{ - if ((ctxt == NULL) || (ause == NULL)) - return(-1); - if ((ause->attrDecl == NULL) || - (ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF)) - return(0); - - { - xmlSchemaQNameRefPtr ref = WXS_QNAME_CAST ause->attrDecl; - - /* - * TODO: Evaluate, what errors could occur if the declaration is not - * found. - */ - ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema, - ref->name, ref->targetNamespace); - if (ause->attrDecl == NULL) { - xmlSchemaPResCompAttrErr(ctxt, - XML_SCHEMAP_SRC_RESOLVE, - WXS_BASIC_CAST ause, ause->node, - "ref", ref->name, ref->targetNamespace, - XML_SCHEMA_TYPE_ATTRIBUTE, NULL); - return(ctxt->err);; - } - } - return(0); -} - -/** - * xmlSchemaCheckAttrUsePropsCorrect: - * @ctxt: a parser context - * @use: an attribute use - * - * Schema Component Constraint: - * Attribute Use Correct (au-props-correct) - * - */ -static int -xmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaAttributeUsePtr use) -{ - if ((ctxt == NULL) || (use == NULL)) - return(-1); - if ((use->defValue == NULL) || (WXS_ATTRUSE_DECL(use) == NULL) || - ((WXS_ATTRUSE_DECL(use))->type != XML_SCHEMA_TYPE_ATTRIBUTE)) - return(0); - - /* - * SPEC au-props-correct (1) - * "The values of the properties of an attribute use must be as - * described in the property tableau in The Attribute Use Schema - * Component (§3.5.1), modulo the impact of Missing - * Sub-components (§5.3)." - */ - - if (((WXS_ATTRUSE_DECL(use))->defValue != NULL) && - ((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMAS_ATTR_FIXED) && - ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0)) - { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_AU_PROPS_CORRECT_2, - WXS_BASIC_CAST use, NULL, - "The attribute declaration has a 'fixed' value constraint " - ", thus the attribute use must also have a 'fixed' value " - "constraint", - NULL); - return(ctxt->err); - } - /* - * Compute and check the value constraint's value. - */ - if ((use->defVal != NULL) && (WXS_ATTRUSE_TYPEDEF(use) != NULL)) { - int ret; - /* - * TODO: The spec seems to be missing a check of the - * value constraint of the attribute use. We will do it here. - */ - /* - * SPEC a-props-correct (3) - */ - if (xmlSchemaIsDerivedFromBuiltInType( - WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) - { - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAP_AU_PROPS_CORRECT, - NULL, WXS_BASIC_CAST use, - "Value constraints are not allowed if the type definition " - "is or is derived from xs:ID", - NULL, NULL); - return(ctxt->err); - } - - ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt, - use->node, WXS_ATTRUSE_TYPEDEF(use), - use->defValue, &(use->defVal), - 1, 1, 0); - if (ret != 0) { - if (ret < 0) { - PERROR_INT2("xmlSchemaCheckAttrUsePropsCorrect", - "calling xmlSchemaVCheckCVCSimpleType()"); - return(-1); - } - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAP_AU_PROPS_CORRECT, - NULL, WXS_BASIC_CAST use, - "The value of the value constraint is not valid", - NULL, NULL); - return(ctxt->err); - } - } - /* - * SPEC au-props-correct (2) - * "If the {attribute declaration} has a fixed - * {value constraint}, then if the attribute use itself has a - * {value constraint}, it must also be fixed and its value must match - * that of the {attribute declaration}'s {value constraint}." - */ - if (((WXS_ATTRUSE_DECL(use))->defVal != NULL) && - (((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0)) - { - if (! xmlSchemaAreValuesEqual(use->defVal, - (WXS_ATTRUSE_DECL(use))->defVal)) - { - xmlSchemaPCustomErr(ctxt, - XML_SCHEMAP_AU_PROPS_CORRECT_2, - WXS_BASIC_CAST use, NULL, - "The 'fixed' value constraint of the attribute use " - "must match the attribute declaration's value " - "constraint '%s'", - (WXS_ATTRUSE_DECL(use))->defValue); - } - return(ctxt->err); - } - return(0); -} - - - - -/** - * xmlSchemaResolveAttrTypeReferences: - * @item: an attribute declaration - * @ctxt: a parser context - * - * Resolves the referenced type definition component. - */ -static int -xmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr item, - xmlSchemaParserCtxtPtr ctxt) -{ - /* - * The simple type definition corresponding to the <simpleType> element - * information item in the [children], if present, otherwise the simple - * type definition ·resolved· to by the ·actual value· of the type - * [attribute], if present, otherwise the ·simple ur-type definition·. - */ - if (item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED) - return(0); - item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED; - if (item->subtypes != NULL) - return(0); - if (item->typeName != NULL) { - xmlSchemaTypePtr type; - - type = xmlSchemaGetType(ctxt->schema, item->typeName, - item->typeNs); - if ((type == NULL) || (! WXS_IS_SIMPLE(type))) { - xmlSchemaPResCompAttrErr(ctxt, - XML_SCHEMAP_SRC_RESOLVE, - WXS_BASIC_CAST item, item->node, - "type", item->typeName, item->typeNs, - XML_SCHEMA_TYPE_SIMPLE, NULL); - return(ctxt->err); - } else - item->subtypes = type; - - } else { - /* - * The type defaults to the xs:anySimpleType. - */ - item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); - } - return(0); -} - -/** - * xmlSchemaResolveIDCKeyReferences: - * @idc: the identity-constraint definition - * @ctxt: the schema parser context - * @name: the attribute name - * - * Resolve keyRef references to key/unique IDCs. - * Schema Component Constraint: - * Identity-constraint Definition Properties Correct (c-props-correct) - */ -static int -xmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc, - xmlSchemaParserCtxtPtr pctxt) -{ - if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) - return(0); - if (idc->ref->name != NULL) { - idc->ref->item = (xmlSchemaBasicItemPtr) - xmlSchemaGetIDC(pctxt->schema, idc->ref->name, - idc->ref->targetNamespace); - if (idc->ref->item == NULL) { - /* - * TODO: It is actually not an error to fail to resolve - * at this stage. BUT we need to be that strict! - */ - xmlSchemaPResCompAttrErr(pctxt, - XML_SCHEMAP_SRC_RESOLVE, - WXS_BASIC_CAST idc, idc->node, - "refer", idc->ref->name, - idc->ref->targetNamespace, - XML_SCHEMA_TYPE_IDC_KEY, NULL); - return(pctxt->err); - } else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) { - /* - * SPEC c-props-correct (1) - */ - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_C_PROPS_CORRECT, - NULL, WXS_BASIC_CAST idc, - "The keyref references a keyref", - NULL, NULL); - idc->ref->item = NULL; - return(pctxt->err); - } else { - if (idc->nbFields != - ((xmlSchemaIDCPtr) idc->ref->item)->nbFields) { - xmlChar *str = NULL; - xmlSchemaIDCPtr refer; - - refer = (xmlSchemaIDCPtr) idc->ref->item; - /* - * SPEC c-props-correct(2) - * "If the {identity-constraint category} is keyref, - * the cardinality of the {fields} must equal that of - * the {fields} of the {referenced key}. - */ - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_C_PROPS_CORRECT, - NULL, WXS_BASIC_CAST idc, - "The cardinality of the keyref differs from the " - "cardinality of the referenced key/unique '%s'", - xmlSchemaFormatQName(&str, refer->targetNamespace, - refer->name), - NULL); - FREE_AND_NULL(str) - return(pctxt->err); - } - } - } - return(0); -} - -static int -xmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib, - xmlSchemaParserCtxtPtr pctxt) -{ - if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name, - prohib->targetNamespace) == NULL) { - - xmlSchemaPResCompAttrErr(pctxt, - XML_SCHEMAP_SRC_RESOLVE, - NULL, prohib->node, - "ref", prohib->name, prohib->targetNamespace, - XML_SCHEMA_TYPE_ATTRIBUTE, NULL); - return(XML_SCHEMAP_SRC_RESOLVE); - } - return(0); -} - -#define WXS_REDEFINED_TYPE(c) \ -(((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED) - -#define WXS_REDEFINED_MODEL_GROUP_DEF(c) \ -(((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED) - -#define WXS_REDEFINED_ATTR_GROUP(c) \ -(((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED) - -static int -xmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt) -{ - int err = 0; - xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs; - xmlSchemaBasicItemPtr prev, item; - int wasRedefined; - - if (redef == NULL) - return(0); - - do { - item = redef->item; - /* - * First try to locate the redefined component in the - * schema graph starting with the redefined schema. - * NOTE: According to this schema bug entry: - * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005OctDec/0019.html - * it's not clear if the referenced component needs to originate - * from the <redefine>d schema _document_ or the schema; the latter - * would include all imported and included sub-schemas of the - * <redefine>d schema. Currenlty we latter approach is used. - * SUPPLEMENT: It seems that the WG moves towards the latter - * approach, so we are doing it right. - * - */ - prev = xmlSchemaFindRedefCompInGraph( - redef->targetBucket, item->type, - redef->refName, redef->refTargetNs); - if (prev == NULL) { - xmlChar *str = NULL; - xmlNodePtr node; - - /* - * SPEC src-redefine: - * (6.2.1) "The ·actual value· of its own name attribute plus - * target namespace must successfully ·resolve· to a model - * group definition in I." - * (7.2.1) "The ·actual value· of its own name attribute plus - * target namespace must successfully ·resolve· to an attribute - * group definition in I." - - * - * Note that, if we are redefining with the use of references - * to components, the spec assumes the src-resolve to be used; - * but this won't assure that we search only *inside* the - * redefined schema. - */ - if (redef->reference) - node = WXS_ITEM_NODE(redef->reference); - else - node = WXS_ITEM_NODE(item); - xmlSchemaCustomErr(ACTXT_CAST pctxt, - /* - * TODO: error code. - * Probably XML_SCHEMAP_SRC_RESOLVE, if this is using the - * reference kind. - */ - XML_SCHEMAP_SRC_REDEFINE, node, NULL, - "The %s '%s' to be redefined could not be found in " - "the redefined schema", - WXS_ITEM_TYPE_NAME(item), - xmlSchemaFormatQName(&str, redef->refTargetNs, - redef->refName)); - FREE_AND_NULL(str); - err = pctxt->err; - redef = redef->next; - continue; - } - /* - * TODO: Obtaining and setting the redefinition state is really - * clumsy. - */ - wasRedefined = 0; - switch (item->type) { - case XML_SCHEMA_TYPE_COMPLEX: - case XML_SCHEMA_TYPE_SIMPLE: - if ((WXS_TYPE_CAST prev)->flags & - XML_SCHEMAS_TYPE_REDEFINED) - { - wasRedefined = 1; - break; - } - /* Mark it as redefined. */ - (WXS_TYPE_CAST prev)->flags |= XML_SCHEMAS_TYPE_REDEFINED; - /* - * Assign the redefined type to the - * base type of the redefining type. - * TODO: How - */ - ((xmlSchemaTypePtr) item)->baseType = - (xmlSchemaTypePtr) prev; - break; - case XML_SCHEMA_TYPE_GROUP: - if ((WXS_MODEL_GROUPDEF_CAST prev)->flags & - XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED) - { - wasRedefined = 1; - break; - } - /* Mark it as redefined. */ - (WXS_MODEL_GROUPDEF_CAST prev)->flags |= - XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED; - if (redef->reference != NULL) { - /* - * Overwrite the QName-reference with the - * referenced model group def. - */ - (WXS_PTC_CAST redef->reference)->children = - WXS_TREE_CAST prev; - } - redef->target = prev; - break; - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - if ((WXS_ATTR_GROUP_CAST prev)->flags & - XML_SCHEMAS_ATTRGROUP_REDEFINED) - { - wasRedefined = 1; - break; - } - (WXS_ATTR_GROUP_CAST prev)->flags |= - XML_SCHEMAS_ATTRGROUP_REDEFINED; - if (redef->reference != NULL) { - /* - * Assign the redefined attribute group to the - * QName-reference component. - * This is the easy case, since we will just - * expand the redefined group. - */ - (WXS_QNAME_CAST redef->reference)->item = prev; - redef->target = NULL; - } else { - /* - * This is the complicated case: we need - * to apply src-redefine (7.2.2) at a later - * stage, i.e. when attribute group references - * have beed expanded and simple types have - * beed fixed. - */ - redef->target = prev; - } - break; - default: - PERROR_INT("xmlSchemaResolveRedefReferences", - "Unexpected redefined component type"); - return(-1); - } - if (wasRedefined) { - xmlChar *str = NULL; - xmlNodePtr node; - - if (redef->reference) - node = WXS_ITEM_NODE(redef->reference); - else - node = WXS_ITEM_NODE(redef->item); - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - /* TODO: error code. */ - XML_SCHEMAP_SRC_REDEFINE, - node, NULL, - "The referenced %s was already redefined. Multiple " - "redefinition of the same component is not supported", - xmlSchemaGetComponentDesignation(&str, prev), - NULL); - FREE_AND_NULL(str) - err = pctxt->err; - redef = redef->next; - continue; - } - redef = redef->next; - } while (redef != NULL); - - return(err); -} - -static int -xmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt) -{ - int err = 0; - xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs; - xmlSchemaBasicItemPtr item; - - if (redef == NULL) - return(0); - - do { - if (redef->target == NULL) { - redef = redef->next; - continue; - } - item = redef->item; - - switch (item->type) { - case XML_SCHEMA_TYPE_SIMPLE: - case XML_SCHEMA_TYPE_COMPLEX: - /* - * Since the spec wants the {name} of the redefined - * type to be 'absent', we'll NULL it. - */ - (WXS_TYPE_CAST redef->target)->name = NULL; - - /* - * TODO: Seems like there's nothing more to do. The normal - * inheritance mechanism is used. But not 100% sure. - */ - break; - case XML_SCHEMA_TYPE_GROUP: - /* - * URGENT TODO: - * SPEC src-redefine: - * (6.2.2) "The {model group} of the model group definition - * which corresponds to it per XML Representation of Model - * Group Definition Schema Components (§3.7.2) must be a - * ·valid restriction· of the {model group} of that model - * group definition in I, as defined in Particle Valid - * (Restriction) (§3.9.6)." - */ - break; - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - /* - * SPEC src-redefine: - * (7.2.2) "The {attribute uses} and {attribute wildcard} of - * the attribute group definition which corresponds to it - * per XML Representation of Attribute Group Definition Schema - * Components (§3.6.2) must be ·valid restrictions· of the - * {attribute uses} and {attribute wildcard} of that attribute - * group definition in I, as defined in clause 2, clause 3 and - * clause 4 of Derivation Valid (Restriction, Complex) - * (§3.4.6) (where references to the base type definition are - * understood as references to the attribute group definition - * in I)." - */ - err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt, - XML_SCHEMA_ACTION_REDEFINE, - item, redef->target, - (WXS_ATTR_GROUP_CAST item)->attrUses, - (WXS_ATTR_GROUP_CAST redef->target)->attrUses, - (WXS_ATTR_GROUP_CAST item)->attributeWildcard, - (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard); - if (err == -1) - return(-1); - break; - default: - break; - } - redef = redef->next; - } while (redef != NULL); - return(0); -} - - -static int -xmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaBucketPtr bucket) -{ - xmlSchemaBasicItemPtr item; - int err; - xmlHashTablePtr *table; - const xmlChar *name; - int i; - -#define WXS_GET_GLOBAL_HASH(c, slot) { \ - if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \ - table = &(WXS_IMPBUCKET((c))->schema->slot); \ - else \ - table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); } - - /* - * Add global components to the schema's hash tables. - * This is the place where duplicate components will be - * detected. - * TODO: I think normally we should support imports of the - * same namespace from multiple locations. We don't do currently, - * but if we do then according to: - * http://www.w3.org/Bugs/Public/show_bug.cgi?id=2224 - * we would need, if imported directly, to import redefined - * components as well to be able to catch clashing components. - * (I hope I'll still know what this means after some months :-() - */ - if (bucket == NULL) - return(-1); - if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) - return(0); - bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED; - - for (i = 0; i < bucket->globals->nbItems; i++) { - item = bucket->globals->items[i]; - table = NULL; - switch (item->type) { - case XML_SCHEMA_TYPE_COMPLEX: - case XML_SCHEMA_TYPE_SIMPLE: - if (WXS_REDEFINED_TYPE(item)) - continue; - name = (WXS_TYPE_CAST item)->name; - WXS_GET_GLOBAL_HASH(bucket, typeDecl) - break; - case XML_SCHEMA_TYPE_ELEMENT: - name = (WXS_ELEM_CAST item)->name; - WXS_GET_GLOBAL_HASH(bucket, elemDecl) - break; - case XML_SCHEMA_TYPE_ATTRIBUTE: - name = (WXS_ATTR_CAST item)->name; - WXS_GET_GLOBAL_HASH(bucket, attrDecl) - break; - case XML_SCHEMA_TYPE_GROUP: - if (WXS_REDEFINED_MODEL_GROUP_DEF(item)) - continue; - name = (WXS_MODEL_GROUPDEF_CAST item)->name; - WXS_GET_GLOBAL_HASH(bucket, groupDecl) - break; - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - if (WXS_REDEFINED_ATTR_GROUP(item)) - continue; - name = (WXS_ATTR_GROUP_CAST item)->name; - WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl) - break; - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_UNIQUE: - case XML_SCHEMA_TYPE_IDC_KEYREF: - name = (WXS_IDC_CAST item)->name; - WXS_GET_GLOBAL_HASH(bucket, idcDef) - break; - case XML_SCHEMA_TYPE_NOTATION: - name = ((xmlSchemaNotationPtr) item)->name; - WXS_GET_GLOBAL_HASH(bucket, notaDecl) - break; - default: - PERROR_INT("xmlSchemaAddComponents", - "Unexpected global component type"); - continue; - } - if (*table == NULL) { - *table = xmlHashCreateDict(10, pctxt->dict); - if (*table == NULL) { - PERROR_INT("xmlSchemaAddComponents", - "failed to create a component hash table"); - return(-1); - } - } - err = xmlHashAddEntry(*table, name, item); - if (err != 0) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST pctxt, - XML_SCHEMAP_REDEFINED_TYPE, - WXS_ITEM_NODE(item), - WXS_BASIC_CAST item, - "A global %s '%s' does already exist", - WXS_ITEM_TYPE_NAME(item), - xmlSchemaGetComponentQName(&str, item)); - FREE_AND_NULL(str); - } - } - /* - * Process imported/included schemas. - */ - if (bucket->relations != NULL) { - xmlSchemaSchemaRelationPtr rel = bucket->relations; - do { - if ((rel->bucket != NULL) && - ((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) { - if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1) - return(-1); - } - rel = rel->next; - } while (rel != NULL); - } - return(0); -} - -static int -xmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt, - xmlSchemaBucketPtr rootBucket) -{ - xmlSchemaConstructionCtxtPtr con = pctxt->constructor; - xmlSchemaTreeItemPtr item, *items; - int nbItems, i, ret = 0; - xmlSchemaBucketPtr oldbucket = con->bucket; - xmlSchemaElementPtr elemDecl; - -#define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure; - - if ((con->pending == NULL) || - (con->pending->nbItems == 0)) - return(0); - - /* - * Since xmlSchemaFixupComplexType() will create new particles - * (local components), and those particle components need a bucket - * on the constructor, we'll assure here that the constructor has - * a bucket. - * TODO: Think about storing locals _only_ on the main bucket. - */ - if (con->bucket == NULL) - con->bucket = rootBucket; - - /* TODO: - * SPEC (src-redefine): - * (6.2) "If it has no such self-reference, then all of the - * following must be true:" - - * (6.2.2) The {model group} of the model group definition which - * corresponds to it per XML Representation of Model Group - * Definition Schema Components (§3.7.2) must be a ·valid - * restriction· of the {model group} of that model group definition - * in I, as defined in Particle Valid (Restriction) (§3.9.6)." - */ - xmlSchemaCheckSRCRedefineFirst(pctxt); - - /* - * Add global components to the schemata's hash tables. - */ - xmlSchemaAddComponents(pctxt, rootBucket); - - pctxt->ctxtType = NULL; - items = (xmlSchemaTreeItemPtr *) con->pending->items; - nbItems = con->pending->nbItems; - /* - * Now that we have parsed *all* the schema document(s) and converted - * them to schema components, we can resolve references, apply component - * constraints, create the FSA from the content model, etc. - */ - /* - * Resolve references of.. - * - * 1. element declarations: - * - the type definition - * - the substitution group affiliation - * 2. simple/complex types: - * - the base type definition - * - the memberTypes of union types - * - the itemType of list types - * 3. attributes declarations and attribute uses: - * - the type definition - * - if an attribute use, then the attribute declaration - * 4. attribute group references: - * - the attribute group definition - * 5. particles: - * - the term of the particle (e.g. a model group) - * 6. IDC key-references: - * - the referenced IDC 'key' or 'unique' definition - * 7. Attribute prohibitions which had a "ref" attribute. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_ELEMENT: - xmlSchemaResolveElementReferences( - (xmlSchemaElementPtr) item, pctxt); - FIXHFAILURE; - break; - case XML_SCHEMA_TYPE_COMPLEX: - case XML_SCHEMA_TYPE_SIMPLE: - xmlSchemaResolveTypeReferences( - (xmlSchemaTypePtr) item, pctxt); - FIXHFAILURE; - break; - case XML_SCHEMA_TYPE_ATTRIBUTE: - xmlSchemaResolveAttrTypeReferences( - (xmlSchemaAttributePtr) item, pctxt); - FIXHFAILURE; - break; - case XML_SCHEMA_TYPE_ATTRIBUTE_USE: - xmlSchemaResolveAttrUseReferences( - (xmlSchemaAttributeUsePtr) item, pctxt); - FIXHFAILURE; - break; - case XML_SCHEMA_EXTRA_QNAMEREF: - if ((WXS_QNAME_CAST item)->itemType == - XML_SCHEMA_TYPE_ATTRIBUTEGROUP) - { - xmlSchemaResolveAttrGroupReferences( - WXS_QNAME_CAST item, pctxt); - } - FIXHFAILURE; - break; - case XML_SCHEMA_TYPE_SEQUENCE: - case XML_SCHEMA_TYPE_CHOICE: - case XML_SCHEMA_TYPE_ALL: - xmlSchemaResolveModelGroupParticleReferences(pctxt, - WXS_MODEL_GROUP_CAST item); - FIXHFAILURE; - break; - case XML_SCHEMA_TYPE_IDC_KEY: - case XML_SCHEMA_TYPE_IDC_UNIQUE: - case XML_SCHEMA_TYPE_IDC_KEYREF: - xmlSchemaResolveIDCKeyReferences( - (xmlSchemaIDCPtr) item, pctxt); - FIXHFAILURE; - break; - case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: - /* - * Handle attribue prohibition which had a - * "ref" attribute. - */ - xmlSchemaResolveAttrUseProhibReferences( - WXS_ATTR_PROHIB_CAST item, pctxt); - FIXHFAILURE; - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - - /* - * Now that all references are resolved we - * can check for circularity of... - * 1. the base axis of type definitions - * 2. nested model group definitions - * 3. nested attribute group definitions - * TODO: check for circual substitution groups. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - /* - * Let's better stop on the first error here. - */ - switch (item->type) { - case XML_SCHEMA_TYPE_COMPLEX: - case XML_SCHEMA_TYPE_SIMPLE: - xmlSchemaCheckTypeDefCircular( - (xmlSchemaTypePtr) item, pctxt); - FIXHFAILURE; - if (pctxt->nberrors != 0) - goto exit_error; - break; - case XML_SCHEMA_TYPE_GROUP: - xmlSchemaCheckGroupDefCircular( - (xmlSchemaModelGroupDefPtr) item, pctxt); - FIXHFAILURE; - if (pctxt->nberrors != 0) - goto exit_error; - break; - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - xmlSchemaCheckAttrGroupCircular( - (xmlSchemaAttributeGroupPtr) item, pctxt); - FIXHFAILURE; - if (pctxt->nberrors != 0) - goto exit_error; - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - /* - * Model group definition references: - * Such a reference is reflected by a particle at the component - * level. Until now the 'term' of such particles pointed - * to the model group definition; this was done, in order to - * ease circularity checks. Now we need to set the 'term' of - * such particles to the model group of the model group definition. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_SEQUENCE: - case XML_SCHEMA_TYPE_CHOICE: - xmlSchemaModelGroupToModelGroupDefFixup(pctxt, - WXS_MODEL_GROUP_CAST item); - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - /* - * Expand attribute group references of attribute group definitions. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - if ((! WXS_ATTR_GROUP_EXPANDED(item)) && - WXS_ATTR_GROUP_HAS_REFS(item)) - { - xmlSchemaAttributeGroupExpandRefs(pctxt, - WXS_ATTR_GROUP_CAST item); - FIXHFAILURE; - } - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - /* - * First compute the variety of simple types. This is needed as - * a separate step, since otherwise we won't be able to detect - * circular union types in all cases. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_SIMPLE: - if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr) item)) { - xmlSchemaFixupSimpleTypeStageOne(pctxt, - (xmlSchemaTypePtr) item); - FIXHFAILURE; - } - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - /* - * Detect circular union types. Note that this needs the variety to - * be already computed. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_SIMPLE: - if (((xmlSchemaTypePtr) item)->memberTypes != NULL) { - xmlSchemaCheckUnionTypeDefCircular(pctxt, - (xmlSchemaTypePtr) item); - FIXHFAILURE; - } - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - - /* - * Do the complete type fixup for simple types. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_SIMPLE: - if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) { - xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST item); - FIXHFAILURE; - } - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - /* - * At this point we need build and check all simple types. - */ - /* - * Apply constraints for attribute declarations. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_ATTRIBUTE: - xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST item); - FIXHFAILURE; - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - /* - * Apply constraints for attribute uses. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_ATTRIBUTE_USE: - if (((xmlSchemaAttributeUsePtr)item)->defValue != NULL) { - xmlSchemaCheckAttrUsePropsCorrect(pctxt, - WXS_ATTR_USE_CAST item); - FIXHFAILURE; - } - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - - /* - * Apply constraints for attribute group definitions. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: - if (( (WXS_ATTR_GROUP_CAST item)->attrUses != NULL) && - ( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST item)->attrUses)->nbItems > 1)) - { - xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST item); - FIXHFAILURE; - } - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - - /* - * Apply constraints for redefinitions. - */ - if (WXS_CONSTRUCTOR(pctxt)->redefs != NULL) - xmlSchemaCheckSRCRedefineSecond(pctxt); - if (pctxt->nberrors != 0) - goto exit_error; - - /* - * Complex types are builded and checked. - */ - for (i = 0; i < nbItems; i++) { - item = con->pending->items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_COMPLEX: - if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) { - xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST item); - FIXHFAILURE; - } - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - - /* - * The list could have changed, since xmlSchemaFixupComplexType() - * will create particles and model groups in some cases. - */ - items = (xmlSchemaTreeItemPtr *) con->pending->items; - nbItems = con->pending->nbItems; - - /* - * Apply some constraints for element declarations. - */ - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_ELEMENT: - elemDecl = (xmlSchemaElementPtr) item; - - if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0) - { - xmlSchemaCheckElementDeclComponent( - (xmlSchemaElementPtr) elemDecl, pctxt); - FIXHFAILURE; - } - -#ifdef WXS_ELEM_DECL_CONS_ENABLED - /* - * Schema Component Constraint: Element Declarations Consistent - * Apply this constraint to local types of element declarations. - */ - if ((WXS_ELEM_TYPEDEF(elemDecl) != NULL) && - (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) && - (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl)))) - { - xmlSchemaCheckElementDeclConsistent(pctxt, - WXS_BASIC_CAST elemDecl, - WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)), - NULL, NULL, 0); - } -#endif - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - - /* - * Finally we can build the automaton from the content model of - * complex types. - */ - - for (i = 0; i < nbItems; i++) { - item = items[i]; - switch (item->type) { - case XML_SCHEMA_TYPE_COMPLEX: - xmlSchemaBuildContentModel((xmlSchemaTypePtr) item, pctxt); - /* FIXHFAILURE; */ - break; - default: - break; - } - } - if (pctxt->nberrors != 0) - goto exit_error; - /* - * URGENT TODO: cos-element-consistent - */ - goto exit; - -exit_error: - ret = pctxt->err; - goto exit; - -exit_failure: - ret = -1; - -exit: - /* - * Reset the constructor. This is needed for XSI acquisition, since - * those items will be processed over and over again for every XSI - * if not cleared here. - */ - con->bucket = oldbucket; - con->pending->nbItems = 0; - if (con->substGroups != NULL) { - xmlHashFree(con->substGroups, - (xmlHashDeallocator) xmlSchemaSubstGroupFree); - con->substGroups = NULL; - } - if (con->redefs != NULL) { - xmlSchemaRedefListFree(con->redefs); - con->redefs = NULL; - } - return(ret); -} -/** - * xmlSchemaParse: - * @ctxt: a schema validation context - * - * parse a schema definition resource and build an internal - * XML Shema struture which can be used to validate instances. - * - * Returns the internal XML Schema structure built from the resource or - * NULL in case of error - */ -xmlSchemaPtr -xmlSchemaParse(xmlSchemaParserCtxtPtr ctxt) -{ - xmlSchemaPtr mainSchema = NULL; - xmlSchemaBucketPtr bucket = NULL; - int res; - - /* - * This one is used if the schema to be parsed was specified via - * the API; i.e. not automatically by the validated instance document. - */ - - xmlSchemaInitTypes(); - - if (ctxt == NULL) - return (NULL); - - /* TODO: Init the context. Is this all we need?*/ - ctxt->nberrors = 0; - ctxt->err = 0; - ctxt->counter = 0; - - /* Create the *main* schema. */ - mainSchema = xmlSchemaNewSchema(ctxt); - if (mainSchema == NULL) - goto exit_failure; - /* - * Create the schema constructor. - */ - if (ctxt->constructor == NULL) { - ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict); - if (ctxt->constructor == NULL) - return(NULL); - /* Take ownership of the constructor to be able to free it. */ - ctxt->ownsConstructor = 1; - } - ctxt->constructor->mainSchema = mainSchema; - /* - * Locate and add the schema document. - */ - res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN, - ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size, NULL, - NULL, NULL, &bucket); - if (res == -1) - goto exit_failure; - if (res != 0) - goto exit; - - if (bucket == NULL) { - /* TODO: Error code, actually we failed to *locate* the schema. */ - if (ctxt->URL) - xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD, - NULL, NULL, - "Failed to locate the main schema resource at '%s'", - ctxt->URL, NULL); - else - xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD, - NULL, NULL, - "Failed to locate the main schema resource", - NULL, NULL); - goto exit; - } - /* Then do the parsing for good. */ - if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1) - goto exit_failure; - if (ctxt->nberrors != 0) - goto exit; - - mainSchema->doc = bucket->doc; - mainSchema->preserve = ctxt->preserve; - - ctxt->schema = mainSchema; - - if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1) - goto exit_failure; - - /* - * TODO: This is not nice, since we cannot distinguish from the - * result if there was an internal error or not. - */ -exit: - if (ctxt->nberrors != 0) { - if (mainSchema) { - xmlSchemaFree(mainSchema); - mainSchema = NULL; - } - if (ctxt->constructor) { - xmlSchemaConstructionCtxtFree(ctxt->constructor); - ctxt->constructor = NULL; - ctxt->ownsConstructor = 0; - } - } - ctxt->schema = NULL; - return(mainSchema); -exit_failure: - /* - * Quite verbose, but should catch internal errors, which were - * not communitated. - */ - if (mainSchema) { - xmlSchemaFree(mainSchema); - mainSchema = NULL; - } - if (ctxt->constructor) { - xmlSchemaConstructionCtxtFree(ctxt->constructor); - ctxt->constructor = NULL; - ctxt->ownsConstructor = 0; - } - PERROR_INT2("xmlSchemaParse", - "An internal error occured"); - ctxt->schema = NULL; - return(NULL); -} - -/** - * xmlSchemaSetParserErrors: - * @ctxt: a schema validation context - * @err: the error callback - * @warn: the warning callback - * @ctx: contextual data for the callbacks - * - * Set the callback functions used to handle errors for a validation context - */ -void -xmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaValidityErrorFunc err, - xmlSchemaValidityWarningFunc warn, void *ctx) -{ - if (ctxt == NULL) - return; - ctxt->error = err; - ctxt->warning = warn; - ctxt->errCtxt = ctx; - if (ctxt->vctxt != NULL) - xmlSchemaSetValidErrors(ctxt->vctxt, err, warn, ctx); -} - -/** - * xmlSchemaSetParserStructuredErrors: - * @ctxt: a schema parser context - * @serror: the structured error function - * @ctx: the functions context - * - * Set the structured error callback - */ -void -xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt, - xmlStructuredErrorFunc serror, - void *ctx) -{ - if (ctxt == NULL) - return; - ctxt->serror = serror; - ctxt->errCtxt = ctx; - if (ctxt->vctxt != NULL) - xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror, ctx); -} - -/** - * xmlSchemaGetParserErrors: - * @ctxt: a XMl-Schema parser context - * @err: the error callback result - * @warn: the warning callback result - * @ctx: contextual data for the callbacks result - * - * Get the callback information used to handle errors for a parser context - * - * Returns -1 in case of failure, 0 otherwise - */ -int -xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt, - xmlSchemaValidityErrorFunc * err, - xmlSchemaValidityWarningFunc * warn, void **ctx) -{ - if (ctxt == NULL) - return(-1); - if (err != NULL) - *err = ctxt->error; - if (warn != NULL) - *warn = ctxt->warning; - if (ctx != NULL) - *ctx = ctxt->errCtxt; - return(0); -} - -/** - * xmlSchemaFacetTypeToString: - * @type: the facet type - * - * Convert the xmlSchemaTypeType to a char string. - * - * Returns the char string representation of the facet type if the - * type is a facet and an "Internal Error" string otherwise. - */ -static const xmlChar * -xmlSchemaFacetTypeToString(xmlSchemaTypeType type) -{ - switch (type) { - case XML_SCHEMA_FACET_PATTERN: - return (BAD_CAST "pattern"); - case XML_SCHEMA_FACET_MAXEXCLUSIVE: - return (BAD_CAST "maxExclusive"); - case XML_SCHEMA_FACET_MAXINCLUSIVE: - return (BAD_CAST "maxInclusive"); - case XML_SCHEMA_FACET_MINEXCLUSIVE: - return (BAD_CAST "minExclusive"); - case XML_SCHEMA_FACET_MININCLUSIVE: - return (BAD_CAST "minInclusive"); - case XML_SCHEMA_FACET_WHITESPACE: - return (BAD_CAST "whiteSpace"); - case XML_SCHEMA_FACET_ENUMERATION: - return (BAD_CAST "enumeration"); - case XML_SCHEMA_FACET_LENGTH: - return (BAD_CAST "length"); - case XML_SCHEMA_FACET_MAXLENGTH: - return (BAD_CAST "maxLength"); - case XML_SCHEMA_FACET_MINLENGTH: - return (BAD_CAST "minLength"); - case XML_SCHEMA_FACET_TOTALDIGITS: - return (BAD_CAST "totalDigits"); - case XML_SCHEMA_FACET_FRACTIONDIGITS: - return (BAD_CAST "fractionDigits"); - default: - break; - } - return (BAD_CAST "Internal Error"); -} - -static xmlSchemaWhitespaceValueType -xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type) -{ - /* - * The normalization type can be changed only for types which are derived - * from xsd:string. - */ - if (type->type == XML_SCHEMA_TYPE_BASIC) { - /* - * Note that we assume a whitespace of preserve for anySimpleType. - */ - if ((type->builtInType == XML_SCHEMAS_STRING) || - (type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) - return(XML_SCHEMA_WHITESPACE_PRESERVE); - else if (type->builtInType == XML_SCHEMAS_NORMSTRING) - return(XML_SCHEMA_WHITESPACE_REPLACE); - else { - /* - * For all ·atomic· datatypes other than string (and types ·derived· - * by ·restriction· from it) the value of whiteSpace is fixed to - * collapse - * Note that this includes built-in list datatypes. - */ - return(XML_SCHEMA_WHITESPACE_COLLAPSE); - } - } else if (WXS_IS_LIST(type)) { - /* - * For list types the facet "whiteSpace" is fixed to "collapse". - */ - return (XML_SCHEMA_WHITESPACE_COLLAPSE); - } else if (WXS_IS_UNION(type)) { - return (XML_SCHEMA_WHITESPACE_UNKNOWN); - } else if (WXS_IS_ATOMIC(type)) { - if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE) - return (XML_SCHEMA_WHITESPACE_PRESERVE); - else if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE) - return (XML_SCHEMA_WHITESPACE_REPLACE); - else - return (XML_SCHEMA_WHITESPACE_COLLAPSE); - } - return (-1); -} - -/************************************************************************ - * * - * Simple type validation * - * * - ************************************************************************/ - - -/************************************************************************ - * * - * DOM Validation code * - * * - ************************************************************************/ - -/** - * xmlSchemaAssembleByLocation: - * @pctxt: a schema parser context - * @vctxt: a schema validation context - * @schema: the existing schema - * @node: the node that fired the assembling - * @nsName: the namespace name of the new schema - * @location: the location of the schema - * - * Expands an existing schema by an additional schema. - * - * Returns 0 if the new schema is correct, a positive error code - * number otherwise and -1 in case of an internal or API error. - */ -static int -xmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - const xmlChar *nsName, - const xmlChar *location) -{ - int ret = 0; - xmlSchemaParserCtxtPtr pctxt; - xmlSchemaBucketPtr bucket = NULL; - - if ((vctxt == NULL) || (schema == NULL)) - return (-1); - - if (vctxt->pctxt == NULL) { - VERROR_INT("xmlSchemaAssembleByLocation", - "no parser context available"); - return(-1); - } - pctxt = vctxt->pctxt; - if (pctxt->constructor == NULL) { - PERROR_INT("xmlSchemaAssembleByLocation", - "no constructor"); - return(-1); - } - /* - * Acquire the schema document. - */ - location = xmlSchemaBuildAbsoluteURI(pctxt->dict, - location, node); - /* - * Note that we pass XML_SCHEMA_SCHEMA_IMPORT here; - * the process will automatically change this to - * XML_SCHEMA_SCHEMA_MAIN if it is the first schema document. - */ - ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT, - location, NULL, NULL, 0, node, NULL, nsName, - &bucket); - if (ret != 0) - return(ret); - if (bucket == NULL) { - /* - * Generate a warning that the document could not be located. - */ - xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC, - node, NULL, - "The document at location '%s' could not be acquired", - location, NULL, NULL); - return(ret); - } - /* - * The first located schema will be handled as if all other - * schemas imported by XSI were imported by this first schema. - */ - if ((bucket != NULL) && - (WXS_CONSTRUCTOR(pctxt)->bucket == NULL)) - WXS_CONSTRUCTOR(pctxt)->bucket = bucket; - /* - * TODO: Is this handled like an import? I.e. is it not an error - * if the schema cannot be located? - */ - if ((bucket == NULL) || (! CAN_PARSE_SCHEMA(bucket))) - return(0); - /* - * We will reuse the parser context for every schema imported - * directly via XSI. So reset the context. - */ - pctxt->nberrors = 0; - pctxt->err = 0; - pctxt->doc = bucket->doc; - - ret = xmlSchemaParseNewDocWithContext(pctxt, schema, bucket); - if (ret == -1) { - pctxt->doc = NULL; - goto exit_failure; - } - /* Paranoid error channelling. */ - if ((ret == 0) && (pctxt->nberrors != 0)) - ret = pctxt->err; - if (pctxt->nberrors == 0) { - /* - * Only bother to fixup pending components, if there was - * no error yet. - * For every XSI acquired schema (and its sub-schemata) we will - * fixup the components. - */ - xmlSchemaFixupComponents(pctxt, bucket); - ret = pctxt->err; - /* - * Not nice, but we need somehow to channel the schema parser - * error to the validation context. - */ - if ((ret != 0) && (vctxt->err == 0)) - vctxt->err = ret; - vctxt->nberrors += pctxt->nberrors; - } else { - /* Add to validation error sum. */ - vctxt->nberrors += pctxt->nberrors; - } - pctxt->doc = NULL; - return(ret); -exit_failure: - pctxt->doc = NULL; - return (-1); -} - -static xmlSchemaAttrInfoPtr -xmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt, - int metaType) -{ - if (vctxt->nbAttrInfos == 0) - return (NULL); - { - int i; - xmlSchemaAttrInfoPtr iattr; - - for (i = 0; i < vctxt->nbAttrInfos; i++) { - iattr = vctxt->attrInfos[i]; - if (iattr->metaType == metaType) - return (iattr); - } - - } - return (NULL); -} - -/** - * xmlSchemaAssembleByXSI: - * @vctxt: a schema validation context - * - * Expands an existing schema by an additional schema using - * the xsi:schemaLocation or xsi:noNamespaceSchemaLocation attribute - * of an instance. If xsi:noNamespaceSchemaLocation is used, @noNamespace - * must be set to 1. - * - * Returns 0 if the new schema is correct, a positive error code - * number otherwise and -1 in case of an internal or API error. - */ -static int -xmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt) -{ - const xmlChar *cur, *end; - const xmlChar *nsname = NULL, *location; - int count = 0; - int ret = 0; - xmlSchemaAttrInfoPtr iattr; - - /* - * Parse the value; we will assume an even number of values - * to be given (this is how Xerces and XSV work). - * - * URGENT TODO: !! This needs to work for both - * @noNamespaceSchemaLocation AND @schemaLocation on the same - * element !! - */ - iattr = xmlSchemaGetMetaAttrInfo(vctxt, - XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC); - if (iattr == NULL) - iattr = xmlSchemaGetMetaAttrInfo(vctxt, - XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC); - if (iattr == NULL) - return (0); - cur = iattr->value; - do { - /* - * TODO: Move the string parsing mechanism away from here. - */ - if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) { - /* - * Get the namespace name. - */ - while (IS_BLANK_CH(*cur)) - cur++; - end = cur; - while ((*end != 0) && (!(IS_BLANK_CH(*end)))) - end++; - if (end == cur) - break; - count++; /* TODO: Don't use the schema's dict. */ - nsname = xmlDictLookup(vctxt->schema->dict, cur, end - cur); - cur = end; - } - /* - * Get the URI. - */ - while (IS_BLANK_CH(*cur)) - cur++; - end = cur; - while ((*end != 0) && (!(IS_BLANK_CH(*end)))) - end++; - if (end == cur) { - if (iattr->metaType == - XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) - { - /* - * If using @schemaLocation then tuples are expected. - * I.e. the namespace name *and* the document's URI. - */ - xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC, - iattr->node, NULL, - "The value must consist of tuples: the target namespace " - "name and the document's URI", NULL, NULL, NULL); - } - break; - } - count++; /* TODO: Don't use the schema's dict. */ - location = xmlDictLookup(vctxt->schema->dict, cur, end - cur); - cur = end; - ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema, - iattr->node, nsname, location); - if (ret == -1) { - VERROR_INT("xmlSchemaAssembleByXSI", - "assembling schemata"); - return (-1); - } - } while (*cur != 0); - return (ret); -} - -static const xmlChar * -xmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt, - const xmlChar *prefix) -{ - if (vctxt->sax != NULL) { - int i, j; - xmlSchemaNodeInfoPtr inode; - - for (i = vctxt->depth; i >= 0; i--) { - if (vctxt->elemInfos[i]->nbNsBindings != 0) { - inode = vctxt->elemInfos[i]; - for (j = 0; j < inode->nbNsBindings * 2; j += 2) { - if (((prefix == NULL) && - (inode->nsBindings[j] == NULL)) || - ((prefix != NULL) && xmlStrEqual(prefix, - inode->nsBindings[j]))) { - - /* - * Note that the namespace bindings are already - * in a string dict. - */ - return (inode->nsBindings[j+1]); - } - } - } - } - return (NULL); -#ifdef LIBXML_WRITER_ENABLED - } else if (vctxt->reader != NULL) { - xmlChar *nsName; - - nsName = xmlTextReaderLookupNamespace(vctxt->reader, prefix); - if (nsName != NULL) { - const xmlChar *ret; - - ret = xmlDictLookup(vctxt->dict, nsName, -1); - xmlFree(nsName); - return (ret); - } else - return (NULL); -#endif - } else { - xmlNsPtr ns; - - if ((vctxt->inode->node == NULL) || - (vctxt->inode->node->doc == NULL)) { - VERROR_INT("xmlSchemaLookupNamespace", - "no node or node's doc available"); - return (NULL); - } - ns = xmlSearchNs(vctxt->inode->node->doc, - vctxt->inode->node, prefix); - if (ns != NULL) - return (ns->href); - return (NULL); - } -} - -/* -* This one works on the schema of the validation context. -*/ -static int -xmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaPtr schema, - xmlNodePtr node, - const xmlChar *value, - xmlSchemaValPtr *val, - int valNeeded) -{ - int ret; - - if (vctxt && (vctxt->schema == NULL)) { - VERROR_INT("xmlSchemaValidateNotation", - "a schema is needed on the validation context"); - return (-1); - } - ret = xmlValidateQName(value, 1); - if (ret != 0) - return (ret); - { - xmlChar *localName = NULL; - xmlChar *prefix = NULL; - - localName = xmlSplitQName2(value, &prefix); - if (prefix != NULL) { - const xmlChar *nsName = NULL; - - if (vctxt != NULL) - nsName = xmlSchemaLookupNamespace(vctxt, BAD_CAST prefix); - else if (node != NULL) { - xmlNsPtr ns = xmlSearchNs(node->doc, node, prefix); - if (ns != NULL) - nsName = ns->href; - } else { - xmlFree(prefix); - xmlFree(localName); - return (1); - } - if (nsName == NULL) { - xmlFree(prefix); - xmlFree(localName); - return (1); - } - if (xmlSchemaGetNotation(schema, localName, nsName) != NULL) { - if (valNeeded && (val != NULL)) { - (*val) = xmlSchemaNewNOTATIONValue(BAD_CAST localName, - BAD_CAST xmlStrdup(nsName)); - if (*val == NULL) - ret = -1; - } - } else - ret = 1; - xmlFree(prefix); - xmlFree(localName); - } else { - if (xmlSchemaGetNotation(schema, value, NULL) != NULL) { - if (valNeeded && (val != NULL)) { - (*val) = xmlSchemaNewNOTATIONValue( - BAD_CAST xmlStrdup(value), NULL); - if (*val == NULL) - ret = -1; - } - } else - return (1); - } - } - return (ret); -} - -static int -xmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt, - const xmlChar* lname, - const xmlChar* nsname) -{ - int i; - - lname = xmlDictLookup(vctxt->dict, lname, -1); - if (lname == NULL) - return(-1); - if (nsname != NULL) { - nsname = xmlDictLookup(vctxt->dict, nsname, -1); - if (nsname == NULL) - return(-1); - } - for (i = 0; i < vctxt->nodeQNames->nbItems; i += 2) { - if ((vctxt->nodeQNames->items [i] == lname) && - (vctxt->nodeQNames->items[i +1] == nsname)) - /* Already there */ - return(i); - } - /* Add new entry. */ - i = vctxt->nodeQNames->nbItems; - xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) lname); - xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) nsname); - return(i); -} - -/************************************************************************ - * * - * Validation of identity-constraints (IDC) * - * * - ************************************************************************/ - -/** - * xmlSchemaAugmentIDC: - * @idcDef: the IDC definition - * - * Creates an augmented IDC definition item. - * - * Returns the item, or NULL on internal errors. - */ -static void -xmlSchemaAugmentIDC(xmlSchemaIDCPtr idcDef, - xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaIDCAugPtr aidc; - - aidc = (xmlSchemaIDCAugPtr) xmlMalloc(sizeof(xmlSchemaIDCAug)); - if (aidc == NULL) { - xmlSchemaVErrMemory(vctxt, - "xmlSchemaAugmentIDC: allocating an augmented IDC definition", - NULL); - return; - } - aidc->keyrefDepth = -1; - aidc->def = idcDef; - aidc->next = NULL; - if (vctxt->aidcs == NULL) - vctxt->aidcs = aidc; - else { - aidc->next = vctxt->aidcs; - vctxt->aidcs = aidc; - } - /* - * Save if we have keyrefs at all. - */ - if ((vctxt->hasKeyrefs == 0) && - (idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF)) - vctxt->hasKeyrefs = 1; -} - -/** - * xmlSchemaIDCNewBinding: - * @idcDef: the IDC definition of this binding - * - * Creates a new IDC binding. - * - * Returns the new IDC binding, NULL on internal errors. - */ -static xmlSchemaPSVIIDCBindingPtr -xmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef) -{ - xmlSchemaPSVIIDCBindingPtr ret; - - ret = (xmlSchemaPSVIIDCBindingPtr) xmlMalloc( - sizeof(xmlSchemaPSVIIDCBinding)); - if (ret == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating a PSVI IDC binding item", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaPSVIIDCBinding)); - ret->definition = idcDef; - return (ret); -} - -/** - * xmlSchemaIDCStoreNodeTableItem: - * @vctxt: the WXS validation context - * @item: the IDC node table item - * - * The validation context is used to store IDC node table items. - * They are stored to avoid copying them if IDC node-tables are merged - * with corresponding parent IDC node-tables (bubbling). - * - * Returns 0 if succeeded, -1 on internal errors. - */ -static int -xmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaPSVIIDCNodePtr item) -{ - /* - * Add to gobal list. - */ - if (vctxt->idcNodes == NULL) { - vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *) - xmlMalloc(20 * sizeof(xmlSchemaPSVIIDCNodePtr)); - if (vctxt->idcNodes == NULL) { - xmlSchemaVErrMemory(vctxt, - "allocating the IDC node table item list", NULL); - return (-1); - } - vctxt->sizeIdcNodes = 20; - } else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) { - vctxt->sizeIdcNodes *= 2; - vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *) - xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes * - sizeof(xmlSchemaPSVIIDCNodePtr)); - if (vctxt->idcNodes == NULL) { - xmlSchemaVErrMemory(vctxt, - "re-allocating the IDC node table item list", NULL); - return (-1); - } - } - vctxt->idcNodes[vctxt->nbIdcNodes++] = item; - - return (0); -} - -/** - * xmlSchemaIDCStoreKey: - * @vctxt: the WXS validation context - * @item: the IDC key - * - * The validation context is used to store an IDC key. - * - * Returns 0 if succeeded, -1 on internal errors. - */ -static int -xmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaPSVIIDCKeyPtr key) -{ - /* - * Add to gobal list. - */ - if (vctxt->idcKeys == NULL) { - vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *) - xmlMalloc(40 * sizeof(xmlSchemaPSVIIDCKeyPtr)); - if (vctxt->idcKeys == NULL) { - xmlSchemaVErrMemory(vctxt, - "allocating the IDC key storage list", NULL); - return (-1); - } - vctxt->sizeIdcKeys = 40; - } else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) { - vctxt->sizeIdcKeys *= 2; - vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *) - xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys * - sizeof(xmlSchemaPSVIIDCKeyPtr)); - if (vctxt->idcKeys == NULL) { - xmlSchemaVErrMemory(vctxt, - "re-allocating the IDC key storage list", NULL); - return (-1); - } - } - vctxt->idcKeys[vctxt->nbIdcKeys++] = key; - - return (0); -} - -/** - * xmlSchemaIDCAppendNodeTableItem: - * @bind: the IDC binding - * @ntItem: the node-table item - * - * Appends the IDC node-table item to the binding. - * - * Returns 0 on success and -1 on internal errors. - */ -static int -xmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr bind, - xmlSchemaPSVIIDCNodePtr ntItem) -{ - if (bind->nodeTable == NULL) { - bind->sizeNodes = 10; - bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) - xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr)); - if (bind->nodeTable == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating an array of IDC node-table items", NULL); - return(-1); - } - } else if (bind->sizeNodes <= bind->nbNodes) { - bind->sizeNodes *= 2; - bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) - xmlRealloc(bind->nodeTable, bind->sizeNodes * - sizeof(xmlSchemaPSVIIDCNodePtr)); - if (bind->nodeTable == NULL) { - xmlSchemaVErrMemory(NULL, - "re-allocating an array of IDC node-table items", NULL); - return(-1); - } - } - bind->nodeTable[bind->nbNodes++] = ntItem; - return(0); -} - -/** - * xmlSchemaIDCAcquireBinding: - * @vctxt: the WXS validation context - * @matcher: the IDC matcher - * - * Looks up an PSVI IDC binding, for the IDC definition and - * of the given matcher. If none found, a new one is created - * and added to the IDC table. - * - * Returns an IDC binding or NULL on internal errors. - */ -static xmlSchemaPSVIIDCBindingPtr -xmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaIDCMatcherPtr matcher) -{ - xmlSchemaNodeInfoPtr ielem; - - ielem = vctxt->elemInfos[matcher->depth]; - - if (ielem->idcTable == NULL) { - ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def); - if (ielem->idcTable == NULL) - return (NULL); - return(ielem->idcTable); - } else { - xmlSchemaPSVIIDCBindingPtr bind = NULL; - - bind = ielem->idcTable; - do { - if (bind->definition == matcher->aidc->def) - return(bind); - if (bind->next == NULL) { - bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def); - if (bind->next == NULL) - return (NULL); - return(bind->next); - } - bind = bind->next; - } while (bind != NULL); - } - return (NULL); -} - -static xmlSchemaItemListPtr -xmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED, - xmlSchemaIDCMatcherPtr matcher) -{ - if (matcher->targets == NULL) - matcher->targets = xmlSchemaItemListCreate(); - return(matcher->targets); -} - -/** - * xmlSchemaIDCFreeKey: - * @key: the IDC key - * - * Frees an IDC key together with its compiled value. - */ -static void -xmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr key) -{ - if (key->val != NULL) - xmlSchemaFreeValue(key->val); - xmlFree(key); -} - -/** - * xmlSchemaIDCFreeBinding: - * - * Frees an IDC binding. Note that the node table-items - * are not freed. - */ -static void -xmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr bind) -{ - if (bind->nodeTable != NULL) - xmlFree(bind->nodeTable); - if (bind->dupls != NULL) - xmlSchemaItemListFree(bind->dupls); - xmlFree(bind); -} - -/** - * xmlSchemaIDCFreeIDCTable: - * @bind: the first IDC binding in the list - * - * Frees an IDC table, i.e. all the IDC bindings in the list. - */ -static void -xmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr bind) -{ - xmlSchemaPSVIIDCBindingPtr prev; - - while (bind != NULL) { - prev = bind; - bind = bind->next; - xmlSchemaIDCFreeBinding(prev); - } -} - -/** - * xmlSchemaIDCFreeMatcherList: - * @matcher: the first IDC matcher in the list - * - * Frees a list of IDC matchers. - */ -static void -xmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher) -{ - xmlSchemaIDCMatcherPtr next; - - while (matcher != NULL) { - next = matcher->next; - if (matcher->keySeqs != NULL) { - int i; - for (i = 0; i < matcher->sizeKeySeqs; i++) - if (matcher->keySeqs[i] != NULL) - xmlFree(matcher->keySeqs[i]); - xmlFree(matcher->keySeqs); - } - if (matcher->targets != NULL) { - if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) { - int i; - xmlSchemaPSVIIDCNodePtr idcNode; - /* - * Node-table items for keyrefs are not stored globally - * to the validation context, since they are not bubbled. - * We need to free them here. - */ - for (i = 0; i < matcher->targets->nbItems; i++) { - idcNode = - (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i]; - xmlFree(idcNode->keys); - xmlFree(idcNode); - } - } - xmlSchemaItemListFree(matcher->targets); - } - xmlFree(matcher); - matcher = next; - } -} - -/** - * xmlSchemaIDCReleaseMatcherList: - * @vctxt: the WXS validation context - * @matcher: the first IDC matcher in the list - * - * Caches a list of IDC matchers for reuse. - */ -static void -xmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaIDCMatcherPtr matcher) -{ - xmlSchemaIDCMatcherPtr next; - - while (matcher != NULL) { - next = matcher->next; - if (matcher->keySeqs != NULL) { - int i; - /* - * Don't free the array, but only the content. - */ - for (i = 0; i < matcher->sizeKeySeqs; i++) - if (matcher->keySeqs[i] != NULL) { - xmlFree(matcher->keySeqs[i]); - matcher->keySeqs[i] = NULL; - } - } - if (matcher->targets) { - if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) { - int i; - xmlSchemaPSVIIDCNodePtr idcNode; - /* - * Node-table items for keyrefs are not stored globally - * to the validation context, since they are not bubbled. - * We need to free them here. - */ - for (i = 0; i < matcher->targets->nbItems; i++) { - idcNode = - (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i]; - xmlFree(idcNode->keys); - xmlFree(idcNode); - } - } - xmlSchemaItemListFree(matcher->targets); - matcher->targets = NULL; - } - matcher->next = NULL; - /* - * Cache the matcher. - */ - if (vctxt->idcMatcherCache != NULL) - matcher->nextCached = vctxt->idcMatcherCache; - vctxt->idcMatcherCache = matcher; - - matcher = next; - } -} - -/** - * xmlSchemaIDCAddStateObject: - * @vctxt: the WXS validation context - * @matcher: the IDC matcher - * @sel: the XPath information - * @parent: the parent "selector" state object if any - * @type: "selector" or "field" - * - * Creates/reuses and activates state objects for the given - * XPath information; if the XPath expression consists of unions, - * multiple state objects are created for every unioned expression. - * - * Returns 0 on success and -1 on internal errors. - */ -static int -xmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaIDCMatcherPtr matcher, - xmlSchemaIDCSelectPtr sel, - int type) -{ - xmlSchemaIDCStateObjPtr sto; - - /* - * Reuse the state objects from the pool. - */ - if (vctxt->xpathStatePool != NULL) { - sto = vctxt->xpathStatePool; - vctxt->xpathStatePool = sto->next; - sto->next = NULL; - } else { - /* - * Create a new state object. - */ - sto = (xmlSchemaIDCStateObjPtr) xmlMalloc(sizeof(xmlSchemaIDCStateObj)); - if (sto == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating an IDC state object", NULL); - return (-1); - } - memset(sto, 0, sizeof(xmlSchemaIDCStateObj)); - } - /* - * Add to global list. - */ - if (vctxt->xpathStates != NULL) - sto->next = vctxt->xpathStates; - vctxt->xpathStates = sto; - - /* - * Free the old xpath validation context. - */ - if (sto->xpathCtxt != NULL) - xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt); - - /* - * Create a new XPath (pattern) validation context. - */ - sto->xpathCtxt = (void *) xmlPatternGetStreamCtxt( - (xmlPatternPtr) sel->xpathComp); - if (sto->xpathCtxt == NULL) { - VERROR_INT("xmlSchemaIDCAddStateObject", - "failed to create an XPath validation context"); - return (-1); - } - sto->type = type; - sto->depth = vctxt->depth; - sto->matcher = matcher; - sto->sel = sel; - sto->nbHistory = 0; - -#ifdef DEBUG_IDC - xmlGenericError(xmlGenericErrorContext, "IDC: STO push '%s'\n", - sto->sel->xpath); -#endif - return (0); -} - -/** - * xmlSchemaXPathEvaluate: - * @vctxt: the WXS validation context - * @nodeType: the nodeType of the current node - * - * Evaluates all active XPath state objects. - * - * Returns the number of IC "field" state objects which resolved to - * this node, 0 if none resolved and -1 on internal errors. - */ -static int -xmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt, - xmlElementType nodeType) -{ - xmlSchemaIDCStateObjPtr sto, head = NULL, first; - int res, resolved = 0, depth = vctxt->depth; - - if (vctxt->xpathStates == NULL) - return (0); - - if (nodeType == XML_ATTRIBUTE_NODE) - depth++; -#ifdef DEBUG_IDC - { - xmlChar *str = NULL; - xmlGenericError(xmlGenericErrorContext, - "IDC: EVAL on %s, depth %d, type %d\n", - xmlSchemaFormatQName(&str, vctxt->inode->nsName, - vctxt->inode->localName), depth, nodeType); - FREE_AND_NULL(str) - } -#endif - /* - * Process all active XPath state objects. - */ - first = vctxt->xpathStates; - sto = first; - while (sto != head) { -#ifdef DEBUG_IDC - if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) - xmlGenericError(xmlGenericErrorContext, "IDC: ['%s'] selector '%s'\n", - sto->matcher->aidc->def->name, sto->sel->xpath); - else - xmlGenericError(xmlGenericErrorContext, "IDC: ['%s'] field '%s'\n", - sto->matcher->aidc->def->name, sto->sel->xpath); -#endif - if (nodeType == XML_ELEMENT_NODE) - res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt, - vctxt->inode->localName, vctxt->inode->nsName); - else - res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt, - vctxt->inode->localName, vctxt->inode->nsName); - - if (res == -1) { - VERROR_INT("xmlSchemaXPathEvaluate", - "calling xmlStreamPush()"); - return (-1); - } - if (res == 0) - goto next_sto; - /* - * Full match. - */ -#ifdef DEBUG_IDC - xmlGenericError(xmlGenericErrorContext, "IDC: " - "MATCH\n"); -#endif - /* - * Register a match in the state object history. - */ - if (sto->history == NULL) { - sto->history = (int *) xmlMalloc(5 * sizeof(int)); - if (sto->history == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating the state object history", NULL); - return(-1); - } - sto->sizeHistory = 5; - } else if (sto->sizeHistory <= sto->nbHistory) { - sto->sizeHistory *= 2; - sto->history = (int *) xmlRealloc(sto->history, - sto->sizeHistory * sizeof(int)); - if (sto->history == NULL) { - xmlSchemaVErrMemory(NULL, - "re-allocating the state object history", NULL); - return(-1); - } - } - sto->history[sto->nbHistory++] = depth; - -#ifdef DEBUG_IDC - xmlGenericError(xmlGenericErrorContext, "IDC: push match '%d'\n", - vctxt->depth); -#endif - - if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) { - xmlSchemaIDCSelectPtr sel; - /* - * Activate state objects for the IDC fields of - * the IDC selector. - */ -#ifdef DEBUG_IDC - xmlGenericError(xmlGenericErrorContext, "IDC: " - "activating field states\n"); -#endif - sel = sto->matcher->aidc->def->fields; - while (sel != NULL) { - if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher, - sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1) - return (-1); - sel = sel->next; - } - } else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) { - /* - * An IDC key node was found by the IDC field. - */ -#ifdef DEBUG_IDC - xmlGenericError(xmlGenericErrorContext, - "IDC: key found\n"); -#endif - /* - * Notify that the character value of this node is - * needed. - */ - if (resolved == 0) { - if ((vctxt->inode->flags & - XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0) - vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED; - } - resolved++; - } -next_sto: - if (sto->next == NULL) { - /* - * Evaluate field state objects created on this node as well. - */ - head = first; - sto = vctxt->xpathStates; - } else - sto = sto->next; - } - return (resolved); -} - -static const xmlChar * -xmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt, - xmlChar **buf, - xmlSchemaPSVIIDCKeyPtr *seq, - int count) -{ - int i, res; - xmlChar *value = NULL; - - *buf = xmlStrdup(BAD_CAST "["); - for (i = 0; i < count; i++) { - *buf = xmlStrcat(*buf, BAD_CAST "'"); - res = xmlSchemaGetCanonValueWhtspExt(seq[i]->val, - xmlSchemaGetWhiteSpaceFacetValue(seq[i]->type), - &value); - if (res == 0) - *buf = xmlStrcat(*buf, BAD_CAST value); - else { - VERROR_INT("xmlSchemaFormatIDCKeySequence", - "failed to compute a canonical value"); - *buf = xmlStrcat(*buf, BAD_CAST "???"); - } - if (i < count -1) - *buf = xmlStrcat(*buf, BAD_CAST "', "); - else - *buf = xmlStrcat(*buf, BAD_CAST "'"); - if (value != NULL) { - xmlFree(value); - value = NULL; - } - } - *buf = xmlStrcat(*buf, BAD_CAST "]"); - - return (BAD_CAST *buf); -} - -/** - * xmlSchemaXPathPop: - * @vctxt: the WXS validation context - * - * Pops all XPath states. - * - * Returns 0 on success and -1 on internal errors. - */ -static int -xmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaIDCStateObjPtr sto; - int res; - - if (vctxt->xpathStates == NULL) - return(0); - sto = vctxt->xpathStates; - do { - res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt); - if (res == -1) - return (-1); - sto = sto->next; - } while (sto != NULL); - return(0); -} - -/** - * xmlSchemaXPathProcessHistory: - * @vctxt: the WXS validation context - * @type: the simple/complex type of the current node if any at all - * @val: the precompiled value - * - * Processes and pops the history items of the IDC state objects. - * IDC key-sequences are validated/created on IDC bindings. - * - * Returns 0 on success and -1 on internal errors. - */ -static int -xmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt, - int depth) -{ - xmlSchemaIDCStateObjPtr sto, nextsto; - int res, matchDepth; - xmlSchemaPSVIIDCKeyPtr key = NULL; - xmlSchemaTypePtr type = vctxt->inode->typeDef, simpleType = NULL; - - if (vctxt->xpathStates == NULL) - return (0); - sto = vctxt->xpathStates; - -#ifdef DEBUG_IDC - { - xmlChar *str = NULL; - xmlGenericError(xmlGenericErrorContext, - "IDC: BACK on %s, depth %d\n", - xmlSchemaFormatQName(&str, vctxt->inode->nsName, - vctxt->inode->localName), vctxt->depth); - FREE_AND_NULL(str) - } -#endif - /* - * Evaluate the state objects. - */ - while (sto != NULL) { - res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt); - if (res == -1) { - VERROR_INT("xmlSchemaXPathProcessHistory", - "calling xmlStreamPop()"); - return (-1); - } -#ifdef DEBUG_IDC - xmlGenericError(xmlGenericErrorContext, "IDC: stream pop '%s'\n", - sto->sel->xpath); -#endif - if (sto->nbHistory == 0) - goto deregister_check; - - matchDepth = sto->history[sto->nbHistory -1]; - - /* - * Only matches at the current depth are of interest. - */ - if (matchDepth != depth) { - sto = sto->next; - continue; - } - if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) { - /* - * NOTE: According to - * http://www.w3.org/Bugs/Public/show_bug.cgi?id=2198 - * ... the simple-content of complex types is also allowed. - */ - - if (WXS_IS_COMPLEX(type)) { - if (WXS_HAS_SIMPLE_CONTENT(type)) { - /* - * Sanity check for complex types with simple content. - */ - simpleType = type->contentTypeDef; - if (simpleType == NULL) { - VERROR_INT("xmlSchemaXPathProcessHistory", - "field resolves to a CT with simple content " - "but the CT is missing the ST definition"); - return (-1); - } - } else - simpleType = NULL; - } else - simpleType = type; - if (simpleType == NULL) { - xmlChar *str = NULL; - - /* - * Not qualified if the field resolves to a node of non - * simple type. - */ - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_IDC, NULL, - WXS_BASIC_CAST sto->matcher->aidc->def, - "The XPath '%s' of a field of %s does evaluate to a node of " - "non-simple type", - sto->sel->xpath, - xmlSchemaGetIDCDesignation(&str, sto->matcher->aidc->def)); - FREE_AND_NULL(str); - sto->nbHistory--; - goto deregister_check; - } - - if ((key == NULL) && (vctxt->inode->val == NULL)) { - /* - * Failed to provide the normalized value; maybe - * the value was invalid. - */ - VERROR(XML_SCHEMAV_CVC_IDC, - WXS_BASIC_CAST sto->matcher->aidc->def, - "Warning: No precomputed value available, the value " - "was either invalid or something strange happend"); - sto->nbHistory--; - goto deregister_check; - } else { - xmlSchemaIDCMatcherPtr matcher = sto->matcher; - xmlSchemaPSVIIDCKeyPtr *keySeq; - int pos, idx; - - /* - * The key will be anchored on the matcher's list of - * key-sequences. The position in this list is determined - * by the target node's depth relative to the matcher's - * depth of creation (i.e. the depth of the scope element). - * - * Element Depth Pos List-entries - * <scope> 0 NULL - * <bar> 1 NULL - * <target/> 2 2 target - * <bar> - * </scope> - * - * The size of the list is only dependant on the depth of - * the tree. - * An entry will be NULLed in selector_leave, i.e. when - * we hit the target's - */ - pos = sto->depth - matcher->depth; - idx = sto->sel->index; - - /* - * Create/grow the array of key-sequences. - */ - if (matcher->keySeqs == NULL) { - if (pos > 9) - matcher->sizeKeySeqs = pos * 2; - else - matcher->sizeKeySeqs = 10; - matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **) - xmlMalloc(matcher->sizeKeySeqs * - sizeof(xmlSchemaPSVIIDCKeyPtr *)); - if (matcher->keySeqs == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating an array of key-sequences", - NULL); - return(-1); - } - memset(matcher->keySeqs, 0, - matcher->sizeKeySeqs * - sizeof(xmlSchemaPSVIIDCKeyPtr *)); - } else if (pos >= matcher->sizeKeySeqs) { - int i = matcher->sizeKeySeqs; - - matcher->sizeKeySeqs *= 2; - matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **) - xmlRealloc(matcher->keySeqs, - matcher->sizeKeySeqs * - sizeof(xmlSchemaPSVIIDCKeyPtr *)); - if (matcher->keySeqs == NULL) { - xmlSchemaVErrMemory(NULL, - "reallocating an array of key-sequences", - NULL); - return (-1); - } - /* - * The array needs to be NULLed. - * TODO: Use memset? - */ - for (; i < matcher->sizeKeySeqs; i++) - matcher->keySeqs[i] = NULL; - } - - /* - * Get/create the key-sequence. - */ - keySeq = matcher->keySeqs[pos]; - if (keySeq == NULL) { - goto create_sequence; - } else if (keySeq[idx] != NULL) { - xmlChar *str = NULL; - /* - * cvc-identity-constraint: - * 3 For each node in the ·target node set· all - * of the {fields}, with that node as the context - * node, evaluate to either an empty node-set or - * a node-set with exactly one member, which must - * have a simple type. - * - * The key was already set; report an error. - */ - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_IDC, NULL, - WXS_BASIC_CAST matcher->aidc->def, - "The XPath '%s' of a field of %s evaluates to a " - "node-set with more than one member", - sto->sel->xpath, - xmlSchemaGetIDCDesignation(&str, matcher->aidc->def)); - FREE_AND_NULL(str); - sto->nbHistory--; - goto deregister_check; - } else - goto create_key; - -create_sequence: - /* - * Create a key-sequence. - */ - keySeq = (xmlSchemaPSVIIDCKeyPtr *) xmlMalloc( - matcher->aidc->def->nbFields * - sizeof(xmlSchemaPSVIIDCKeyPtr)); - if (keySeq == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating an IDC key-sequence", NULL); - return(-1); - } - memset(keySeq, 0, matcher->aidc->def->nbFields * - sizeof(xmlSchemaPSVIIDCKeyPtr)); - matcher->keySeqs[pos] = keySeq; -create_key: - /* - * Create a key once per node only. - */ - if (key == NULL) { - key = (xmlSchemaPSVIIDCKeyPtr) xmlMalloc( - sizeof(xmlSchemaPSVIIDCKey)); - if (key == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating a IDC key", NULL); - xmlFree(keySeq); - matcher->keySeqs[pos] = NULL; - return(-1); - } - /* - * Consume the compiled value. - */ - key->type = simpleType; - key->val = vctxt->inode->val; - vctxt->inode->val = NULL; - /* - * Store the key in a global list. - */ - if (xmlSchemaIDCStoreKey(vctxt, key) == -1) { - xmlSchemaIDCFreeKey(key); - return (-1); - } - } - keySeq[idx] = key; - } - } else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) { - - xmlSchemaPSVIIDCKeyPtr **keySeq = NULL; - /* xmlSchemaPSVIIDCBindingPtr bind; */ - xmlSchemaPSVIIDCNodePtr ntItem; - xmlSchemaIDCMatcherPtr matcher; - xmlSchemaIDCPtr idc; - xmlSchemaItemListPtr targets; - int pos, i, j, nbKeys; - /* - * Here we have the following scenario: - * An IDC 'selector' state object resolved to a target node, - * during the time this target node was in the - * ancestor-or-self axis, the 'field' state object(s) looked - * out for matching nodes to create a key-sequence for this - * target node. Now we are back to this target node and need - * to put the key-sequence, together with the target node - * itself, into the node-table of the corresponding IDC - * binding. - */ - matcher = sto->matcher; - idc = matcher->aidc->def; - nbKeys = idc->nbFields; - pos = depth - matcher->depth; - /* - * Check if the matcher has any key-sequences at all, plus - * if it has a key-sequence for the current target node. - */ - if ((matcher->keySeqs == NULL) || - (matcher->sizeKeySeqs <= pos)) { - if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) - goto selector_key_error; - else - goto selector_leave; - } - - keySeq = &(matcher->keySeqs[pos]); - if (*keySeq == NULL) { - if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) - goto selector_key_error; - else - goto selector_leave; - } - - for (i = 0; i < nbKeys; i++) { - if ((*keySeq)[i] == NULL) { - /* - * Not qualified, if not all fields did resolve. - */ - if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) { - /* - * All fields of a "key" IDC must resolve. - */ - goto selector_key_error; - } - goto selector_leave; - } - } - /* - * All fields did resolve. - */ - - /* - * 4.1 If the {identity-constraint category} is unique(/key), - * then no two members of the ·qualified node set· have - * ·key-sequences· whose members are pairwise equal, as - * defined by Equal in [XML Schemas: Datatypes]. - * - * Get the IDC binding from the matcher and check for - * duplicate key-sequences. - */ -#if 0 - bind = xmlSchemaIDCAcquireBinding(vctxt, matcher); -#endif - targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher); - if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) && - (targets->nbItems != 0)) { - xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq; - - i = 0; - res = 0; - /* - * Compare the key-sequences, key by key. - */ - do { - bkeySeq = - ((xmlSchemaPSVIIDCNodePtr) targets->items[i])->keys; - for (j = 0; j < nbKeys; j++) { - ckey = (*keySeq)[j]; - bkey = bkeySeq[j]; - res = xmlSchemaAreValuesEqual(ckey->val, bkey->val); - if (res == -1) { - return (-1); - } else if (res == 0) { - /* - * One of the keys differs, so the key-sequence - * won't be equal; get out. - */ - break; - } - } - if (res == 1) { - /* - * Duplicate key-sequence found. - */ - break; - } - i++; - } while (i < targets->nbItems); - if (i != targets->nbItems) { - xmlChar *str = NULL, *strB = NULL; - /* - * TODO: Try to report the key-sequence. - */ - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_IDC, NULL, - WXS_BASIC_CAST idc, - "Duplicate key-sequence %s in %s", - xmlSchemaFormatIDCKeySequence(vctxt, &str, - (*keySeq), nbKeys), - xmlSchemaGetIDCDesignation(&strB, idc)); - FREE_AND_NULL(str); - FREE_AND_NULL(strB); - goto selector_leave; - } - } - /* - * Add a node-table item to the IDC binding. - */ - ntItem = (xmlSchemaPSVIIDCNodePtr) xmlMalloc( - sizeof(xmlSchemaPSVIIDCNode)); - if (ntItem == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating an IDC node-table item", NULL); - xmlFree(*keySeq); - *keySeq = NULL; - return(-1); - } - memset(ntItem, 0, sizeof(xmlSchemaPSVIIDCNode)); - - /* - * Store the node-table item in a global list. - */ - if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) { - if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) { - xmlFree(ntItem); - xmlFree(*keySeq); - *keySeq = NULL; - return (-1); - } - ntItem->nodeQNameID = -1; - } else { - /* - * Save a cached QName for this node on the IDC node, to be - * able to report it, even if the node is not saved. - */ - ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt, - vctxt->inode->localName, vctxt->inode->nsName); - if (ntItem->nodeQNameID == -1) { - xmlFree(ntItem); - xmlFree(*keySeq); - *keySeq = NULL; - return (-1); - } - } - /* - * Init the node-table item: Save the node, position and - * consume the key-sequence. - */ - ntItem->node = vctxt->node; - ntItem->nodeLine = vctxt->inode->nodeLine; - ntItem->keys = *keySeq; - *keySeq = NULL; -#if 0 - if (xmlSchemaIDCAppendNodeTableItem(bind, ntItem) == -1) { -#endif - if (xmlSchemaItemListAdd(targets, ntItem) == -1) { - if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) { - /* - * Free the item, since keyref items won't be - * put on a global list. - */ - xmlFree(ntItem->keys); - xmlFree(ntItem); - } - return (-1); - } - - goto selector_leave; -selector_key_error: - { - xmlChar *str = NULL; - /* - * 4.2.1 (KEY) The ·target node set· and the - * ·qualified node set· are equal, that is, every - * member of the ·target node set· is also a member - * of the ·qualified node set· and vice versa. - */ - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_IDC, NULL, - WXS_BASIC_CAST idc, - "Not all fields of %s evaluate to a node", - xmlSchemaGetIDCDesignation(&str, idc), NULL); - FREE_AND_NULL(str); - } -selector_leave: - /* - * Free the key-sequence if not added to the IDC table. - */ - if ((keySeq != NULL) && (*keySeq != NULL)) { - xmlFree(*keySeq); - *keySeq = NULL; - } - } /* if selector */ - - sto->nbHistory--; - -deregister_check: - /* - * Deregister state objects if they reach the depth of creation. - */ - if ((sto->nbHistory == 0) && (sto->depth == depth)) { -#ifdef DEBUG_IDC - xmlGenericError(xmlGenericErrorContext, "IDC: STO pop '%s'\n", - sto->sel->xpath); -#endif - if (vctxt->xpathStates != sto) { - VERROR_INT("xmlSchemaXPathProcessHistory", - "The state object to be removed is not the first " - "in the list"); - } - nextsto = sto->next; - /* - * Unlink from the list of active XPath state objects. - */ - vctxt->xpathStates = sto->next; - sto->next = vctxt->xpathStatePool; - /* - * Link it to the pool of reusable state objects. - */ - vctxt->xpathStatePool = sto; - sto = nextsto; - } else - sto = sto->next; - } /* while (sto != NULL) */ - return (0); -} - -/** - * xmlSchemaIDCRegisterMatchers: - * @vctxt: the WXS validation context - * @elemDecl: the element declaration - * - * Creates helper objects to evaluate IDC selectors/fields - * successively. - * - * Returns 0 if OK and -1 on internal errors. - */ -static int -xmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaElementPtr elemDecl) -{ - xmlSchemaIDCMatcherPtr matcher, last = NULL; - xmlSchemaIDCPtr idc, refIdc; - xmlSchemaIDCAugPtr aidc; - - idc = (xmlSchemaIDCPtr) elemDecl->idcs; - if (idc == NULL) - return (0); - -#ifdef DEBUG_IDC - { - xmlChar *str = NULL; - xmlGenericError(xmlGenericErrorContext, - "IDC: REGISTER on %s, depth %d\n", - (char *) xmlSchemaFormatQName(&str, vctxt->inode->nsName, - vctxt->inode->localName), vctxt->depth); - FREE_AND_NULL(str) - } -#endif - if (vctxt->inode->idcMatchers != NULL) { - VERROR_INT("xmlSchemaIDCRegisterMatchers", - "The chain of IDC matchers is expected to be empty"); - return (-1); - } - do { - if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) { - /* - * Since IDCs bubbles are expensive we need to know the - * depth at which the bubbles should stop; this will be - * the depth of the top-most keyref IDC. If no keyref - * references a key/unique IDC, the keyrefDepth will - * be -1, indicating that no bubbles are needed. - */ - refIdc = (xmlSchemaIDCPtr) idc->ref->item; - if (refIdc != NULL) { - /* - * Remember that we have keyrefs on this node. - */ - vctxt->inode->hasKeyrefs = 1; - /* - * Lookup the referenced augmented IDC info. - */ - aidc = vctxt->aidcs; - while (aidc != NULL) { - if (aidc->def == refIdc) - break; - aidc = aidc->next; - } - if (aidc == NULL) { - VERROR_INT("xmlSchemaIDCRegisterMatchers", - "Could not find an augmented IDC item for an IDC " - "definition"); - return (-1); - } - if ((aidc->keyrefDepth == -1) || - (vctxt->depth < aidc->keyrefDepth)) - aidc->keyrefDepth = vctxt->depth; - } - } - /* - * Lookup the augmented IDC item for the IDC definition. - */ - aidc = vctxt->aidcs; - while (aidc != NULL) { - if (aidc->def == idc) - break; - aidc = aidc->next; - } - if (aidc == NULL) { - VERROR_INT("xmlSchemaIDCRegisterMatchers", - "Could not find an augmented IDC item for an IDC definition"); - return (-1); - } - /* - * Create an IDC matcher for every IDC definition. - */ - if (vctxt->idcMatcherCache != NULL) { - /* - * Reuse a cached matcher. - */ - matcher = vctxt->idcMatcherCache; - vctxt->idcMatcherCache = matcher->nextCached; - matcher->nextCached = NULL; - } else { - matcher = (xmlSchemaIDCMatcherPtr) - xmlMalloc(sizeof(xmlSchemaIDCMatcher)); - if (matcher == NULL) { - xmlSchemaVErrMemory(vctxt, - "allocating an IDC matcher", NULL); - return (-1); - } - memset(matcher, 0, sizeof(xmlSchemaIDCMatcher)); - } - if (last == NULL) - vctxt->inode->idcMatchers = matcher; - else - last->next = matcher; - last = matcher; - - matcher->type = IDC_MATCHER; - matcher->depth = vctxt->depth; - matcher->aidc = aidc; - matcher->idcType = aidc->def->type; -#ifdef DEBUG_IDC - xmlGenericError(xmlGenericErrorContext, "IDC: register matcher\n"); -#endif - /* - * Init the automaton state object. - */ - if (xmlSchemaIDCAddStateObject(vctxt, matcher, - idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1) - return (-1); - - idc = idc->next; - } while (idc != NULL); - return (0); -} - -static int -xmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaNodeInfoPtr ielem) -{ - xmlSchemaPSVIIDCBindingPtr bind; - int res, i, j, k, nbTargets, nbFields, nbDupls, nbNodeTable; - xmlSchemaPSVIIDCKeyPtr *keys, *ntkeys; - xmlSchemaPSVIIDCNodePtr *targets, *dupls; - - xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers; - /* vctxt->createIDCNodeTables */ - while (matcher != NULL) { - /* - * Skip keyref IDCs and empty IDC target-lists. - */ - if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) || - WXS_ILIST_IS_EMPTY(matcher->targets)) - { - matcher = matcher->next; - continue; - } - /* - * If we _want_ the IDC node-table to be created in any case - * then do so. Otherwise create them only if keyrefs need them. - */ - if ((! vctxt->createIDCNodeTables) && - ((matcher->aidc->keyrefDepth == -1) || - (matcher->aidc->keyrefDepth > vctxt->depth))) - { - matcher = matcher->next; - continue; - } - /* - * Get/create the IDC binding on this element for the IDC definition. - */ - bind = xmlSchemaIDCAcquireBinding(vctxt, matcher); - - if (! WXS_ILIST_IS_EMPTY(bind->dupls)) { - dupls = (xmlSchemaPSVIIDCNodePtr *) bind->dupls->items; - nbDupls = bind->dupls->nbItems; - } else { - dupls = NULL; - nbDupls = 0; - } - if (bind->nodeTable != NULL) { - nbNodeTable = bind->nbNodes; - } else { - nbNodeTable = 0; - } - - if ((nbNodeTable == 0) && (nbDupls == 0)) { - /* - * Transfer all IDC target-nodes to the IDC node-table. - */ - bind->nodeTable = - (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items; - bind->sizeNodes = matcher->targets->sizeItems; - bind->nbNodes = matcher->targets->nbItems; - - matcher->targets->items = NULL; - matcher->targets->sizeItems = 0; - matcher->targets->nbItems = 0; - } else { - /* - * Compare the key-sequences and add to the IDC node-table. - */ - nbTargets = matcher->targets->nbItems; - targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items; - nbFields = matcher->aidc->def->nbFields; - i = 0; - do { - keys = targets[i]->keys; - if (nbDupls) { - /* - * Search in already found duplicates first. - */ - j = 0; - do { - if (nbFields == 1) { - res = xmlSchemaAreValuesEqual(keys[0]->val, - dupls[j]->keys[0]->val); - if (res == -1) - goto internal_error; - if (res == 1) { - /* - * Equal key-sequence. - */ - goto next_target; - } - } else { - res = 0; - ntkeys = dupls[j]->keys; - for (k = 0; k < nbFields; k++) { - res = xmlSchemaAreValuesEqual(keys[k]->val, - ntkeys[k]->val); - if (res == -1) - goto internal_error; - if (res == 0) { - /* - * One of the keys differs. - */ - break; - } - } - if (res == 1) { - /* - * Equal key-sequence found. - */ - goto next_target; - } - } - j++; - } while (j < nbDupls); - } - if (nbNodeTable) { - j = 0; - do { - if (nbFields == 1) { - res = xmlSchemaAreValuesEqual(keys[0]->val, - bind->nodeTable[j]->keys[0]->val); - if (res == -1) - goto internal_error; - if (res == 0) { - /* - * The key-sequence differs. - */ - goto next_node_table_entry; - } - } else { - res = 0; - ntkeys = bind->nodeTable[j]->keys; - for (k = 0; k < nbFields; k++) { - res = xmlSchemaAreValuesEqual(keys[k]->val, - ntkeys[k]->val); - if (res == -1) - goto internal_error; - if (res == 0) { - /* - * One of the keys differs. - */ - goto next_node_table_entry; - } - } - } - /* - * Add the duplicate to the list of duplicates. - */ - if (bind->dupls == NULL) { - bind->dupls = xmlSchemaItemListCreate(); - if (bind->dupls == NULL) - goto internal_error; - } - if (xmlSchemaItemListAdd(bind->dupls, bind->nodeTable[j]) == -1) - goto internal_error; - /* - * Remove the duplicate entry from the IDC node-table. - */ - bind->nodeTable[j] = bind->nodeTable[bind->nbNodes -1]; - bind->nbNodes--; - - goto next_target; - -next_node_table_entry: - j++; - } while (j < nbNodeTable); - } - /* - * If everything is fine, then add the IDC target-node to - * the IDC node-table. - */ - if (xmlSchemaIDCAppendNodeTableItem(bind, targets[i]) == -1) - goto internal_error; - -next_target: - i++; - } while (i < nbTargets); - } - matcher = matcher->next; - } - return(0); - -internal_error: - return(-1); -} - -/** - * xmlSchemaBubbleIDCNodeTables: - * @depth: the current tree depth - * - * Merges IDC bindings of an element at @depth into the corresponding IDC - * bindings of its parent element. If a duplicate note-table entry is found, - * both, the parent node-table entry and child entry are discarded from the - * node-table of the parent. - * - * Returns 0 if OK and -1 on internal errors. - */ -static int -xmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaPSVIIDCBindingPtr bind; /* IDC bindings of the current node. */ - xmlSchemaPSVIIDCBindingPtr *parTable, parBind = NULL; /* parent IDC bindings. */ - xmlSchemaPSVIIDCNodePtr node, parNode = NULL, *dupls, *parNodes; /* node-table entries. */ - xmlSchemaIDCAugPtr aidc; - int i, j, k, ret = 0, nbFields, oldNum, oldDupls; - - bind = vctxt->inode->idcTable; - if (bind == NULL) { - /* Fine, no table, no bubbles. */ - return (0); - } - - parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable); - /* - * Walk all bindings; create new or add to existing bindings. - * Remove duplicate key-sequences. - */ - while (bind != NULL) { - - if ((bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(bind->dupls)) - goto next_binding; - /* - * Check if the key/unique IDC table needs to be bubbled. - */ - if (! vctxt->createIDCNodeTables) { - aidc = vctxt->aidcs; - do { - if (aidc->def == bind->definition) { - if ((aidc->keyrefDepth == -1) || - (aidc->keyrefDepth >= vctxt->depth)) { - goto next_binding; - } - break; - } - aidc = aidc->next; - } while (aidc != NULL); - } - - if (parTable != NULL) - parBind = *parTable; - /* - * Search a matching parent binding for the - * IDC definition. - */ - while (parBind != NULL) { - if (parBind->definition == bind->definition) - break; - parBind = parBind->next; - } - - if (parBind != NULL) { - /* - * Compare every node-table entry of the child node, - * i.e. the key-sequence within, ... - */ - oldNum = parBind->nbNodes; /* Skip newly added items. */ - - if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) { - oldDupls = parBind->dupls->nbItems; - dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items; - } else { - dupls = NULL; - oldDupls = 0; - } - - parNodes = parBind->nodeTable; - nbFields = bind->definition->nbFields; - - for (i = 0; i < bind->nbNodes; i++) { - node = bind->nodeTable[i]; - if (node == NULL) - continue; - /* - * ...with every key-sequence of the parent node, already - * evaluated to be a duplicate key-sequence. - */ - if (oldDupls) { - j = 0; - while (j < oldDupls) { - if (nbFields == 1) { - ret = xmlSchemaAreValuesEqual( - node->keys[0]->val, - dupls[j]->keys[0]->val); - if (ret == -1) - goto internal_error; - if (ret == 0) { - j++; - continue; - } - } else { - parNode = dupls[j]; - for (k = 0; k < nbFields; k++) { - ret = xmlSchemaAreValuesEqual( - node->keys[k]->val, - parNode->keys[k]->val); - if (ret == -1) - goto internal_error; - if (ret == 0) - break; - } - } - if (ret == 1) - /* Duplicate found. */ - break; - j++; - } - if (j != oldDupls) { - /* Duplicate found. Skip this entry. */ - continue; - } - } - /* - * ... and with every key-sequence of the parent node. - */ - if (oldNum) { - j = 0; - while (j < oldNum) { - parNode = parNodes[j]; - if (nbFields == 1) { - ret = xmlSchemaAreValuesEqual( - node->keys[0]->val, - parNode->keys[0]->val); - if (ret == -1) - goto internal_error; - if (ret == 0) { - j++; - continue; - } - } else { - for (k = 0; k < nbFields; k++) { - ret = xmlSchemaAreValuesEqual( - node->keys[k]->val, - parNode->keys[k]->val); - if (ret == -1) - goto internal_error; - if (ret == 0) - break; - } - } - if (ret == 1) - /* Duplicate found. */ - break; - j++; - } - if (j != oldNum) { - /* - * Handle duplicates. Move the duplicate in - * the parent's node-table to the list of - * duplicates. - */ - oldNum--; - parBind->nbNodes--; - /* - * Move last old item to pos of duplicate. - */ - parNodes[j] = parNodes[oldNum]; - - if (parBind->nbNodes != oldNum) { - /* - * If new items exist, move last new item to - * last of old items. - */ - parNodes[oldNum] = - parNodes[parBind->nbNodes]; - } - if (parBind->dupls == NULL) { - parBind->dupls = xmlSchemaItemListCreate(); - if (parBind->dupls == NULL) - goto internal_error; - } - xmlSchemaItemListAdd(parBind->dupls, parNode); - } else { - /* - * Add the node-table entry (node and key-sequence) of - * the child node to the node table of the parent node. - */ - if (parBind->nodeTable == NULL) { - parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) - xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr)); - if (parBind->nodeTable == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating IDC list of node-table items", NULL); - goto internal_error; - } - parBind->sizeNodes = 1; - } else if (parBind->nbNodes >= parBind->sizeNodes) { - parBind->sizeNodes *= 2; - parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) - xmlRealloc(parBind->nodeTable, parBind->sizeNodes * - sizeof(xmlSchemaPSVIIDCNodePtr)); - if (parBind->nodeTable == NULL) { - xmlSchemaVErrMemory(NULL, - "re-allocating IDC list of node-table items", NULL); - goto internal_error; - } - } - parNodes = parBind->nodeTable; - /* - * Append the new node-table entry to the 'new node-table - * entries' section. - */ - parNodes[parBind->nbNodes++] = node; - } - - } - - } - } else { - /* - * No binding for the IDC was found: create a new one and - * copy all node-tables. - */ - parBind = xmlSchemaIDCNewBinding(bind->definition); - if (parBind == NULL) - goto internal_error; - - /* - * TODO: Hmm, how to optimize the initial number of - * allocated entries? - */ - if (bind->nbNodes != 0) { - /* - * Add all IDC node-table entries. - */ - if (! vctxt->psviExposeIDCNodeTables) { - /* - * Just move the entries. - * NOTE: this is quite save here, since - * all the keyref lookups have already been - * performed. - */ - parBind->nodeTable = bind->nodeTable; - bind->nodeTable = NULL; - parBind->sizeNodes = bind->sizeNodes; - bind->sizeNodes = 0; - parBind->nbNodes = bind->nbNodes; - bind->nbNodes = 0; - } else { - /* - * Copy the entries. - */ - parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) - xmlMalloc(bind->nbNodes * - sizeof(xmlSchemaPSVIIDCNodePtr)); - if (parBind->nodeTable == NULL) { - xmlSchemaVErrMemory(NULL, - "allocating an array of IDC node-table " - "items", NULL); - xmlSchemaIDCFreeBinding(parBind); - goto internal_error; - } - parBind->sizeNodes = bind->nbNodes; - parBind->nbNodes = bind->nbNodes; - memcpy(parBind->nodeTable, bind->nodeTable, - bind->nbNodes * sizeof(xmlSchemaPSVIIDCNodePtr)); - } - } - if (bind->dupls) { - /* - * Move the duplicates. - */ - if (parBind->dupls != NULL) - xmlSchemaItemListFree(parBind->dupls); - parBind->dupls = bind->dupls; - bind->dupls = NULL; - } - if (*parTable == NULL) - *parTable = parBind; - else { - parBind->next = *parTable; - *parTable = parBind; - } - } - -next_binding: - bind = bind->next; - } - return (0); - -internal_error: - return(-1); -} - -/** - * xmlSchemaCheckCVCIDCKeyRef: - * @vctxt: the WXS validation context - * @elemDecl: the element declaration - * - * Check the cvc-idc-keyref constraints. - */ -static int -xmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaIDCMatcherPtr matcher; - xmlSchemaPSVIIDCBindingPtr bind; - - matcher = vctxt->inode->idcMatchers; - /* - * Find a keyref. - */ - while (matcher != NULL) { - if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) && - matcher->targets && - matcher->targets->nbItems) - { - int i, j, k, res, nbFields, hasDupls; - xmlSchemaPSVIIDCKeyPtr *refKeys, *keys; - xmlSchemaPSVIIDCNodePtr refNode = NULL; - - nbFields = matcher->aidc->def->nbFields; - - /* - * Find the IDC node-table for the referenced IDC key/unique. - */ - bind = vctxt->inode->idcTable; - while (bind != NULL) { - if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item == - bind->definition) - break; - bind = bind->next; - } - hasDupls = (bind && bind->dupls && bind->dupls->nbItems) ? 1 : 0; - /* - * Search for a matching key-sequences. - */ - for (i = 0; i < matcher->targets->nbItems; i++) { - res = 0; - refNode = matcher->targets->items[i]; - if (bind != NULL) { - refKeys = refNode->keys; - for (j = 0; j < bind->nbNodes; j++) { - keys = bind->nodeTable[j]->keys; - for (k = 0; k < nbFields; k++) { - res = xmlSchemaAreValuesEqual(keys[k]->val, - refKeys[k]->val); - if (res == 0) - break; - else if (res == -1) { - return (-1); - } - } - if (res == 1) { - /* - * Match found. - */ - break; - } - } - if ((res == 0) && hasDupls) { - /* - * Search in duplicates - */ - for (j = 0; j < bind->dupls->nbItems; j++) { - keys = ((xmlSchemaPSVIIDCNodePtr) - bind->dupls->items[j])->keys; - for (k = 0; k < nbFields; k++) { - res = xmlSchemaAreValuesEqual(keys[k]->val, - refKeys[k]->val); - if (res == 0) - break; - else if (res == -1) { - return (-1); - } - } - if (res == 1) { - /* - * Match in duplicates found. - */ - xmlChar *str = NULL, *strB = NULL; - xmlSchemaKeyrefErr(vctxt, - XML_SCHEMAV_CVC_IDC, refNode, - (xmlSchemaTypePtr) matcher->aidc->def, - "More than one match found for " - "key-sequence %s of keyref '%s'", - xmlSchemaFormatIDCKeySequence(vctxt, &str, - refNode->keys, nbFields), - xmlSchemaGetComponentQName(&strB, - matcher->aidc->def)); - FREE_AND_NULL(str); - FREE_AND_NULL(strB); - break; - } - } - } - } - - if (res == 0) { - xmlChar *str = NULL, *strB = NULL; - xmlSchemaKeyrefErr(vctxt, - XML_SCHEMAV_CVC_IDC, refNode, - (xmlSchemaTypePtr) matcher->aidc->def, - "No match found for key-sequence %s of keyref '%s'", - xmlSchemaFormatIDCKeySequence(vctxt, &str, - refNode->keys, nbFields), - xmlSchemaGetComponentQName(&strB, matcher->aidc->def)); - FREE_AND_NULL(str); - FREE_AND_NULL(strB); - } - } - } - matcher = matcher->next; - } - /* TODO: Return an error if any error encountered. */ - return (0); -} - -/************************************************************************ - * * - * XML Reader validation code * - * * - ************************************************************************/ - -static xmlSchemaAttrInfoPtr -xmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaAttrInfoPtr iattr; - /* - * Grow/create list of attribute infos. - */ - if (vctxt->attrInfos == NULL) { - vctxt->attrInfos = (xmlSchemaAttrInfoPtr *) - xmlMalloc(sizeof(xmlSchemaAttrInfoPtr)); - vctxt->sizeAttrInfos = 1; - if (vctxt->attrInfos == NULL) { - xmlSchemaVErrMemory(vctxt, - "allocating attribute info list", NULL); - return (NULL); - } - } else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) { - vctxt->sizeAttrInfos++; - vctxt->attrInfos = (xmlSchemaAttrInfoPtr *) - xmlRealloc(vctxt->attrInfos, - vctxt->sizeAttrInfos * sizeof(xmlSchemaAttrInfoPtr)); - if (vctxt->attrInfos == NULL) { - xmlSchemaVErrMemory(vctxt, - "re-allocating attribute info list", NULL); - return (NULL); - } - } else { - iattr = vctxt->attrInfos[vctxt->nbAttrInfos++]; - if (iattr->localName != NULL) { - VERROR_INT("xmlSchemaGetFreshAttrInfo", - "attr info not cleared"); - return (NULL); - } - iattr->nodeType = XML_ATTRIBUTE_NODE; - return (iattr); - } - /* - * Create an attribute info. - */ - iattr = (xmlSchemaAttrInfoPtr) - xmlMalloc(sizeof(xmlSchemaAttrInfo)); - if (iattr == NULL) { - xmlSchemaVErrMemory(vctxt, "creating new attribute info", NULL); - return (NULL); - } - memset(iattr, 0, sizeof(xmlSchemaAttrInfo)); - iattr->nodeType = XML_ATTRIBUTE_NODE; - vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr; - - return (iattr); -} - -static int -xmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt, - xmlNodePtr attrNode, - int nodeLine, - const xmlChar *localName, - const xmlChar *nsName, - int ownedNames, - xmlChar *value, - int ownedValue) -{ - xmlSchemaAttrInfoPtr attr; - - attr = xmlSchemaGetFreshAttrInfo(vctxt); - if (attr == NULL) { - VERROR_INT("xmlSchemaPushAttribute", - "calling xmlSchemaGetFreshAttrInfo()"); - return (-1); - } - attr->node = attrNode; - attr->nodeLine = nodeLine; - attr->state = XML_SCHEMAS_ATTR_UNKNOWN; - attr->localName = localName; - attr->nsName = nsName; - if (ownedNames) - attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES; - /* - * Evaluate if it's an XSI attribute. - */ - if (nsName != NULL) { - if (xmlStrEqual(localName, BAD_CAST "nil")) { - if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { - attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL; - } - } else if (xmlStrEqual(localName, BAD_CAST "type")) { - if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { - attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE; - } - } else if (xmlStrEqual(localName, BAD_CAST "schemaLocation")) { - if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { - attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC; - } - } else if (xmlStrEqual(localName, BAD_CAST "noNamespaceSchemaLocation")) { - if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { - attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC; - } - } else if (xmlStrEqual(attr->nsName, xmlNamespaceNs)) { - attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS; - } - } - attr->value = value; - if (ownedValue) - attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; - if (attr->metaType != 0) - attr->state = XML_SCHEMAS_ATTR_META; - return (0); -} - -/** - * xmlSchemaClearElemInfo: - * @vctxt: the WXS validation context - * @ielem: the element information item - */ -static void -xmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaNodeInfoPtr ielem) -{ - ielem->hasKeyrefs = 0; - ielem->appliedXPath = 0; - if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) { - FREE_AND_NULL(ielem->localName); - FREE_AND_NULL(ielem->nsName); - } else { - ielem->localName = NULL; - ielem->nsName = NULL; - } - if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { - FREE_AND_NULL(ielem->value); - } else { - ielem->value = NULL; - } - if (ielem->val != NULL) { - /* - * PSVI TODO: Be careful not to free it when the value is - * exposed via PSVI. - */ - xmlSchemaFreeValue(ielem->val); - ielem->val = NULL; - } - if (ielem->idcMatchers != NULL) { - /* - * REVISIT OPTIMIZE TODO: Use a pool of IDC matchers. - * Does it work? - */ - xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers); -#if 0 - xmlSchemaIDCFreeMatcherList(ielem->idcMatchers); -#endif - ielem->idcMatchers = NULL; - } - if (ielem->idcTable != NULL) { - /* - * OPTIMIZE TODO: Use a pool of IDC tables??. - */ - xmlSchemaIDCFreeIDCTable(ielem->idcTable); - ielem->idcTable = NULL; - } - if (ielem->regexCtxt != NULL) { - xmlRegFreeExecCtxt(ielem->regexCtxt); - ielem->regexCtxt = NULL; - } - if (ielem->nsBindings != NULL) { - xmlFree((xmlChar **)ielem->nsBindings); - ielem->nsBindings = NULL; - ielem->nbNsBindings = 0; - ielem->sizeNsBindings = 0; - } -} - -/** - * xmlSchemaGetFreshElemInfo: - * @vctxt: the schema validation context - * - * Creates/reuses and initializes the element info item for - * the currect tree depth. - * - * Returns the element info item or NULL on API or internal errors. - */ -static xmlSchemaNodeInfoPtr -xmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaNodeInfoPtr info = NULL; - - if (vctxt->depth > vctxt->sizeElemInfos) { - VERROR_INT("xmlSchemaGetFreshElemInfo", - "inconsistent depth encountered"); - return (NULL); - } - if (vctxt->elemInfos == NULL) { - vctxt->elemInfos = (xmlSchemaNodeInfoPtr *) - xmlMalloc(10 * sizeof(xmlSchemaNodeInfoPtr)); - if (vctxt->elemInfos == NULL) { - xmlSchemaVErrMemory(vctxt, - "allocating the element info array", NULL); - return (NULL); - } - memset(vctxt->elemInfos, 0, 10 * sizeof(xmlSchemaNodeInfoPtr)); - vctxt->sizeElemInfos = 10; - } else if (vctxt->sizeElemInfos <= vctxt->depth) { - int i = vctxt->sizeElemInfos; - - vctxt->sizeElemInfos *= 2; - vctxt->elemInfos = (xmlSchemaNodeInfoPtr *) - xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos * - sizeof(xmlSchemaNodeInfoPtr)); - if (vctxt->elemInfos == NULL) { - xmlSchemaVErrMemory(vctxt, - "re-allocating the element info array", NULL); - return (NULL); - } - /* - * We need the new memory to be NULLed. - * TODO: Use memset instead? - */ - for (; i < vctxt->sizeElemInfos; i++) - vctxt->elemInfos[i] = NULL; - } else - info = vctxt->elemInfos[vctxt->depth]; - - if (info == NULL) { - info = (xmlSchemaNodeInfoPtr) - xmlMalloc(sizeof(xmlSchemaNodeInfo)); - if (info == NULL) { - xmlSchemaVErrMemory(vctxt, - "allocating an element info", NULL); - return (NULL); - } - vctxt->elemInfos[vctxt->depth] = info; - } else { - if (info->localName != NULL) { - VERROR_INT("xmlSchemaGetFreshElemInfo", - "elem info has not been cleared"); - return (NULL); - } - } - memset(info, 0, sizeof(xmlSchemaNodeInfo)); - info->nodeType = XML_ELEMENT_NODE; - info->depth = vctxt->depth; - - return (info); -} - -#define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item; -#define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth]; -#define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1]; - -static int -xmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt, - xmlNodePtr node, - xmlSchemaTypePtr type, - xmlSchemaValType valType, - const xmlChar * value, - xmlSchemaValPtr val, - unsigned long length, - int fireErrors) -{ - int ret, error = 0; - - xmlSchemaTypePtr tmpType; - xmlSchemaFacetLinkPtr facetLink; - xmlSchemaFacetPtr facet; - unsigned long len = 0; - xmlSchemaWhitespaceValueType ws; - - /* - * In Libxml2, derived built-in types have currently no explicit facets. - */ - if (type->type == XML_SCHEMA_TYPE_BASIC) - return (0); - - /* - * NOTE: Do not jump away, if the facetSet of the given type is - * empty: until now, "pattern" and "enumeration" facets of the - * *base types* need to be checked as well. - */ - if (type->facetSet == NULL) - goto pattern_and_enum; - - if (! WXS_IS_ATOMIC(type)) { - if (WXS_IS_LIST(type)) - goto WXS_IS_LIST; - else - goto pattern_and_enum; - } - /* - * Whitespace handling is only of importance for string-based - * types. - */ - tmpType = xmlSchemaGetPrimitiveType(type); - if ((tmpType->builtInType == XML_SCHEMAS_STRING) || - WXS_IS_ANY_SIMPLE_TYPE(tmpType)) { - ws = xmlSchemaGetWhiteSpaceFacetValue(type); - } else - ws = XML_SCHEMA_WHITESPACE_COLLAPSE; - /* - * If the value was not computed (for string or - * anySimpleType based types), then use the provided - * type. - */ - if (val == NULL) - valType = valType; - else - valType = xmlSchemaGetValType(val); - - ret = 0; - for (facetLink = type->facetSet; facetLink != NULL; - facetLink = facetLink->next) { - /* - * Skip the pattern "whiteSpace": it is used to - * format the character content beforehand. - */ - switch (facetLink->facet->type) { - case XML_SCHEMA_FACET_WHITESPACE: - case XML_SCHEMA_FACET_PATTERN: - case XML_SCHEMA_FACET_ENUMERATION: - continue; - case XML_SCHEMA_FACET_LENGTH: - case XML_SCHEMA_FACET_MINLENGTH: - case XML_SCHEMA_FACET_MAXLENGTH: - ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet, - valType, value, val, &len, ws); - break; - default: - ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws, - valType, value, val, ws); - break; - } - if (ret < 0) { - AERROR_INT("xmlSchemaValidateFacets", - "validating against a atomic type facet"); - return (-1); - } else if (ret > 0) { - if (fireErrors) - xmlSchemaFacetErr(actxt, ret, node, - value, len, type, facetLink->facet, NULL, NULL, NULL); - else - return (ret); - if (error == 0) - error = ret; - } - ret = 0; - } - -WXS_IS_LIST: - if (! WXS_IS_LIST(type)) - goto pattern_and_enum; - /* - * "length", "minLength" and "maxLength" of list types. - */ - ret = 0; - for (facetLink = type->facetSet; facetLink != NULL; - facetLink = facetLink->next) { - - switch (facetLink->facet->type) { - case XML_SCHEMA_FACET_LENGTH: - case XML_SCHEMA_FACET_MINLENGTH: - case XML_SCHEMA_FACET_MAXLENGTH: - ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet, - value, length, NULL); - break; - default: - continue; - } - if (ret < 0) { - AERROR_INT("xmlSchemaValidateFacets", - "validating against a list type facet"); - return (-1); - } else if (ret > 0) { - if (fireErrors) - xmlSchemaFacetErr(actxt, ret, node, - value, length, type, facetLink->facet, NULL, NULL, NULL); - else - return (ret); - if (error == 0) - error = ret; - } - ret = 0; - } - -pattern_and_enum: - if (error >= 0) { - int found = 0; - /* - * Process enumerations. Facet values are in the value space - * of the defining type's base type. This seems to be a bug in the - * XML Schema 1.0 spec. Use the whitespace type of the base type. - * Only the first set of enumerations in the ancestor-or-self axis - * is used for validation. - */ - ret = 0; - tmpType = type; - do { - for (facet = tmpType->facets; facet != NULL; facet = facet->next) { - if (facet->type != XML_SCHEMA_FACET_ENUMERATION) - continue; - found = 1; - ret = xmlSchemaAreValuesEqual(facet->val, val); - if (ret == 1) - break; - else if (ret < 0) { - AERROR_INT("xmlSchemaValidateFacets", - "validating against an enumeration facet"); - return (-1); - } - } - if (ret != 0) - break; - /* - * Break on the first set of enumerations. Any additional - * enumerations which might be existent on the ancestors - * of the current type are restricted by this set; thus - * *must* *not* be taken into account. - */ - if (found) - break; - tmpType = tmpType->baseType; - } while ((tmpType != NULL) && - (tmpType->type != XML_SCHEMA_TYPE_BASIC)); - if (found && (ret == 0)) { - ret = XML_SCHEMAV_CVC_ENUMERATION_VALID; - if (fireErrors) { - xmlSchemaFacetErr(actxt, ret, node, - value, 0, type, NULL, NULL, NULL, NULL); - } else - return (ret); - if (error == 0) - error = ret; - } - } - - if (error >= 0) { - int found; - /* - * Process patters. Pattern facets are ORed at type level - * and ANDed if derived. Walk the base type axis. - */ - tmpType = type; - facet = NULL; - do { - found = 0; - for (facetLink = tmpType->facetSet; facetLink != NULL; - facetLink = facetLink->next) { - if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN) - continue; - found = 1; - /* - * NOTE that for patterns, @value needs to be the - * normalized vaule. - */ - ret = xmlRegexpExec(facetLink->facet->regexp, value); - if (ret == 1) - break; - else if (ret < 0) { - AERROR_INT("xmlSchemaValidateFacets", - "validating against a pattern facet"); - return (-1); - } else { - /* - * Save the last non-validating facet. - */ - facet = facetLink->facet; - } - } - if (found && (ret != 1)) { - ret = XML_SCHEMAV_CVC_PATTERN_VALID; - if (fireErrors) { - xmlSchemaFacetErr(actxt, ret, node, - value, 0, type, facet, NULL, NULL, NULL); - } else - return (ret); - if (error == 0) - error = ret; - break; - } - tmpType = tmpType->baseType; - } while ((tmpType != NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC)); - } - - return (error); -} - -static xmlChar * -xmlSchemaNormalizeValue(xmlSchemaTypePtr type, - const xmlChar *value) -{ - switch (xmlSchemaGetWhiteSpaceFacetValue(type)) { - case XML_SCHEMA_WHITESPACE_COLLAPSE: - return (xmlSchemaCollapseString(value)); - case XML_SCHEMA_WHITESPACE_REPLACE: - return (xmlSchemaWhiteSpaceReplace(value)); - default: - return (NULL); - } -} - -static int -xmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt, - const xmlChar *value, - xmlSchemaValPtr *val, - int valNeeded) -{ - int ret; - const xmlChar *nsName; - xmlChar *local, *prefix = NULL; - - ret = xmlValidateQName(value, 1); - if (ret != 0) { - if (ret == -1) { - VERROR_INT("xmlSchemaValidateQName", - "calling xmlValidateQName()"); - return (-1); - } - return( XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1); - } - /* - * NOTE: xmlSplitQName2 will always return a duplicated - * strings. - */ - local = xmlSplitQName2(value, &prefix); - if (local == NULL) - local = xmlStrdup(value); - /* - * OPTIMIZE TODO: Use flags for: - * - is there any namespace binding? - * - is there a default namespace? - */ - nsName = xmlSchemaLookupNamespace(vctxt, prefix); - - if (prefix != NULL) { - xmlFree(prefix); - /* - * A namespace must be found if the prefix is - * NOT NULL. - */ - if (nsName == NULL) { - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; - xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL, - WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), - "The QName value '%s' has no " - "corresponding namespace declaration in " - "scope", value, NULL); - if (local != NULL) - xmlFree(local); - return (ret); - } - } - if (valNeeded && val) { - if (nsName != NULL) - *val = xmlSchemaNewQNameValue( - BAD_CAST xmlStrdup(nsName), BAD_CAST local); - else - *val = xmlSchemaNewQNameValue(NULL, - BAD_CAST local); - } else - xmlFree(local); - return (0); -} - -/* -* cvc-simple-type -*/ -static int -xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt, - xmlNodePtr node, - xmlSchemaTypePtr type, - const xmlChar *value, - xmlSchemaValPtr *retVal, - int fireErrors, - int normalize, - int isNormalized) -{ - int ret = 0, valNeeded = (retVal) ? 1 : 0; - xmlSchemaValPtr val = NULL; - /* xmlSchemaWhitespaceValueType ws; */ - xmlChar *normValue = NULL; - -#define NORMALIZE(atype) \ - if ((! isNormalized) && \ - (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \ - normValue = xmlSchemaNormalizeValue(atype, value); \ - if (normValue != NULL) \ - value = normValue; \ - isNormalized = 1; \ - } - - if ((retVal != NULL) && (*retVal != NULL)) { - xmlSchemaFreeValue(*retVal); - *retVal = NULL; - } - /* - * 3.14.4 Simple Type Definition Validation Rules - * Validation Rule: String Valid - */ - /* - * 1 It is schema-valid with respect to that definition as defined - * by Datatype Valid in [XML Schemas: Datatypes]. - */ - /* - * 2.1 If The definition is ENTITY or is validly derived from ENTITY given - * the empty set, as defined in Type Derivation OK (Simple) (§3.14.6), then - * the string must be a ·declared entity name·. - */ - /* - * 2.2 If The definition is ENTITIES or is validly derived from ENTITIES - * given the empty set, as defined in Type Derivation OK (Simple) (§3.14.6), - * then every whitespace-delimited substring of the string must be a ·declared - * entity name·. - */ - /* - * 2.3 otherwise no further condition applies. - */ - if ((! valNeeded) && (type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE)) - valNeeded = 1; - if (value == NULL) - value = BAD_CAST ""; - if (WXS_IS_ANY_SIMPLE_TYPE(type) || WXS_IS_ATOMIC(type)) { - xmlSchemaTypePtr biType; /* The built-in type. */ - /* - * SPEC (1.2.1) "if {variety} is ·atomic· then the string must ·match· - * a literal in the ·lexical space· of {base type definition}" - */ - /* - * Whitespace-normalize. - */ - NORMALIZE(type); - if (type->type != XML_SCHEMA_TYPE_BASIC) { - /* - * Get the built-in type. - */ - biType = type->baseType; - while ((biType != NULL) && - (biType->type != XML_SCHEMA_TYPE_BASIC)) - biType = biType->baseType; - - if (biType == NULL) { - AERROR_INT("xmlSchemaVCheckCVCSimpleType", - "could not get the built-in type"); - goto internal_error; - } - } else - biType = type; - /* - * NOTATIONs need to be processed here, since they need - * to lookup in the hashtable of NOTATION declarations of the schema. - */ - if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) { - switch (biType->builtInType) { - case XML_SCHEMAS_NOTATION: - ret = xmlSchemaValidateNotation( - (xmlSchemaValidCtxtPtr) actxt, - ((xmlSchemaValidCtxtPtr) actxt)->schema, - NULL, value, &val, valNeeded); - break; - case XML_SCHEMAS_QNAME: - ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt, - value, &val, valNeeded); - break; - default: - /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */ - if (valNeeded) - ret = xmlSchemaValPredefTypeNodeNoNorm(biType, - value, &val, NULL); - else - ret = xmlSchemaValPredefTypeNodeNoNorm(biType, - value, NULL, NULL); - break; - } - } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) { - switch (biType->builtInType) { - case XML_SCHEMAS_NOTATION: - ret = xmlSchemaValidateNotation(NULL, - ((xmlSchemaParserCtxtPtr) actxt)->schema, node, - value, &val, valNeeded); - break; - default: - /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */ - if (valNeeded) - ret = xmlSchemaValPredefTypeNodeNoNorm(biType, - value, &val, node); - else - ret = xmlSchemaValPredefTypeNodeNoNorm(biType, - value, NULL, node); - break; - } - } else { - /* - * Validation via a public API is not implemented yet. - */ - TODO - goto internal_error; - } - if (ret != 0) { - if (ret < 0) { - AERROR_INT("xmlSchemaVCheckCVCSimpleType", - "validating against a built-in type"); - goto internal_error; - } - if (WXS_IS_LIST(type)) - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; - else - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; - } - if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { - /* - * Check facets. - */ - ret = xmlSchemaValidateFacets(actxt, node, type, - (xmlSchemaValType) biType->builtInType, value, val, - 0, fireErrors); - if (ret != 0) { - if (ret < 0) { - AERROR_INT("xmlSchemaVCheckCVCSimpleType", - "validating facets of atomic simple type"); - goto internal_error; - } - if (WXS_IS_LIST(type)) - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; - else - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; - } - } - if (fireErrors && (ret > 0)) - xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); - } else if (WXS_IS_LIST(type)) { - - xmlSchemaTypePtr itemType; - const xmlChar *cur, *end; - xmlChar *tmpValue = NULL; - unsigned long len = 0; - xmlSchemaValPtr prevVal = NULL, curVal = NULL; - /* 1.2.2 if {variety} is ·list· then the string must be a sequence - * of white space separated tokens, each of which ·match·es a literal - * in the ·lexical space· of {item type definition} - */ - /* - * Note that XML_SCHEMAS_TYPE_NORMVALUENEEDED will be set if - * the list type has an enum or pattern facet. - */ - NORMALIZE(type); - /* - * VAL TODO: Optimize validation of empty values. - * VAL TODO: We do not have computed values for lists. - */ - itemType = WXS_LIST_ITEMTYPE(type); - cur = value; - do { - while (IS_BLANK_CH(*cur)) - cur++; - end = cur; - while ((*end != 0) && (!(IS_BLANK_CH(*end)))) - end++; - if (end == cur) - break; - tmpValue = xmlStrndup(cur, end - cur); - len++; - - if (valNeeded) - ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType, - tmpValue, &curVal, fireErrors, 0, 1); - else - ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType, - tmpValue, NULL, fireErrors, 0, 1); - FREE_AND_NULL(tmpValue); - if (curVal != NULL) { - /* - * Add to list of computed values. - */ - if (val == NULL) - val = curVal; - else - xmlSchemaValueAppend(prevVal, curVal); - prevVal = curVal; - curVal = NULL; - } - if (ret != 0) { - if (ret < 0) { - AERROR_INT("xmlSchemaVCheckCVCSimpleType", - "validating an item of list simple type"); - goto internal_error; - } - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; - break; - } - cur = end; - } while (*cur != 0); - FREE_AND_NULL(tmpValue); - if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { - /* - * Apply facets (pattern, enumeration). - */ - ret = xmlSchemaValidateFacets(actxt, node, type, - XML_SCHEMAS_UNKNOWN, value, val, - len, fireErrors); - if (ret != 0) { - if (ret < 0) { - AERROR_INT("xmlSchemaVCheckCVCSimpleType", - "validating facets of list simple type"); - goto internal_error; - } - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; - } - } - if (fireErrors && (ret > 0)) { - /* - * Report the normalized value. - */ - normalize = 1; - NORMALIZE(type); - xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); - } - } else if (WXS_IS_UNION(type)) { - xmlSchemaTypeLinkPtr memberLink; - /* - * TODO: For all datatypes ·derived· by ·union· whiteSpace does - * not apply directly; however, the normalization behavior of ·union· - * types is controlled by the value of whiteSpace on that one of the - * ·memberTypes· against which the ·union· is successfully validated. - * - * This means that the value is normalized by the first validating - * member type, then the facets of the union type are applied. This - * needs changing of the value! - */ - - /* - * 1.2.3 if {variety} is ·union· then the string must ·match· a - * literal in the ·lexical space· of at least one member of - * {member type definitions} - */ - memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(type); - if (memberLink == NULL) { - AERROR_INT("xmlSchemaVCheckCVCSimpleType", - "union simple type has no member types"); - goto internal_error; - } - /* - * Always normalize union type values, since we currently - * cannot store the whitespace information with the value - * itself; otherwise a later value-comparison would be - * not possible. - */ - while (memberLink != NULL) { - if (valNeeded) - ret = xmlSchemaVCheckCVCSimpleType(actxt, node, - memberLink->type, value, &val, 0, 1, 0); - else - ret = xmlSchemaVCheckCVCSimpleType(actxt, node, - memberLink->type, value, NULL, 0, 1, 0); - if (ret <= 0) - break; - memberLink = memberLink->next; - } - if (ret != 0) { - if (ret < 0) { - AERROR_INT("xmlSchemaVCheckCVCSimpleType", - "validating members of union simple type"); - goto internal_error; - } - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3; - } - /* - * Apply facets (pattern, enumeration). - */ - if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { - /* - * The normalization behavior of ·union· types is controlled by - * the value of whiteSpace on that one of the ·memberTypes· - * against which the ·union· is successfully validated. - */ - NORMALIZE(memberLink->type); - ret = xmlSchemaValidateFacets(actxt, node, type, - XML_SCHEMAS_UNKNOWN, value, val, - 0, fireErrors); - if (ret != 0) { - if (ret < 0) { - AERROR_INT("xmlSchemaVCheckCVCSimpleType", - "validating facets of union simple type"); - goto internal_error; - } - ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3; - } - } - if (fireErrors && (ret > 0)) - xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); - } - - if (normValue != NULL) - xmlFree(normValue); - if (ret == 0) { - if (retVal != NULL) - *retVal = val; - else if (val != NULL) - xmlSchemaFreeValue(val); - } else if (val != NULL) - xmlSchemaFreeValue(val); - return (ret); -internal_error: - if (normValue != NULL) - xmlFree(normValue); - if (val != NULL) - xmlSchemaFreeValue(val); - return (-1); -} - -static int -xmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt, - const xmlChar *value, - const xmlChar **nsName, - const xmlChar **localName) -{ - int ret = 0; - - if ((nsName == NULL) || (localName == NULL)) - return (-1); - *nsName = NULL; - *localName = NULL; - - ret = xmlValidateQName(value, 1); - if (ret == -1) - return (-1); - if (ret > 0) { - xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL, - value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1); - return (1); - } - { - xmlChar *local = NULL; - xmlChar *prefix; - - /* - * NOTE: xmlSplitQName2 will return a duplicated - * string. - */ - local = xmlSplitQName2(value, &prefix); - if (local == NULL) - *localName = xmlDictLookup(vctxt->dict, value, -1); - else { - *localName = xmlDictLookup(vctxt->dict, local, -1); - xmlFree(local); - } - - *nsName = xmlSchemaLookupNamespace(vctxt, prefix); - - if (prefix != NULL) { - xmlFree(prefix); - /* - * A namespace must be found if the prefix is NOT NULL. - */ - if (*nsName == NULL) { - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL, - WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), - "The QName value '%s' has no " - "corresponding namespace declaration in scope", - value, NULL); - return (2); - } - } - } - return (0); -} - -static int -xmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaAttrInfoPtr iattr, - xmlSchemaTypePtr *localType, - xmlSchemaElementPtr elemDecl) -{ - int ret = 0; - /* - * cvc-elt (3.3.4) : (4) - * AND - * Schema-Validity Assessment (Element) (cvc-assess-elt) - * (1.2.1.2.1) - (1.2.1.2.4) - * Handle 'xsi:type'. - */ - if (localType == NULL) - return (-1); - *localType = NULL; - if (iattr == NULL) - return (0); - else { - const xmlChar *nsName = NULL, *local = NULL; - /* - * TODO: We should report a *warning* that the type was overriden - * by the instance. - */ - ACTIVATE_ATTRIBUTE(iattr); - /* - * (cvc-elt) (3.3.4) : (4.1) - * (cvc-assess-elt) (1.2.1.2.2) - */ - ret = xmlSchemaVExpandQName(vctxt, iattr->value, - &nsName, &local); - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaValidateElementByDeclaration", - "calling xmlSchemaQNameExpand() to validate the " - "attribute 'xsi:type'"); - goto internal_error; - } - goto exit; - } - /* - * (cvc-elt) (3.3.4) : (4.2) - * (cvc-assess-elt) (1.2.1.2.3) - */ - *localType = xmlSchemaGetType(vctxt->schema, local, nsName); - if (*localType == NULL) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_ELT_4_2, NULL, - WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), - "The QName value '%s' of the xsi:type attribute does not " - "resolve to a type definition", - xmlSchemaFormatQName(&str, nsName, local), NULL); - FREE_AND_NULL(str); - ret = vctxt->err; - goto exit; - } - if (elemDecl != NULL) { - int set = 0; - - /* - * SPEC cvc-elt (3.3.4) : (4.3) (Type Derivation OK) - * "The ·local type definition· must be validly - * derived from the {type definition} given the union of - * the {disallowed substitutions} and the {type definition}'s - * {prohibited substitutions}, as defined in - * Type Derivation OK (Complex) (§3.4.6) - * (if it is a complex type definition), - * or given {disallowed substitutions} as defined in Type - * Derivation OK (Simple) (§3.14.6) (if it is a simple type - * definition)." - * - * {disallowed substitutions}: the "block" on the element decl. - * {prohibited substitutions}: the "block" on the type def. - */ - /* - * OPTIMIZE TODO: We could map types already evaluated - * to be validly derived from other types to avoid checking - * this over and over for the same types. - */ - if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) || - (elemDecl->subtypes->flags & - XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) - set |= SUBSET_EXTENSION; - - if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) || - (elemDecl->subtypes->flags & - XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)) - set |= SUBSET_RESTRICTION; - - /* - * REMOVED and CHANGED since this produced a parser context - * which adds to the string dict of the schema. So this would - * change the schema and we don't want this. We don't need - * the parser context anymore. - * - * if ((vctxt->pctxt == NULL) && - * (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1)) - * return (-1); - */ - - if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType, - elemDecl->subtypes, set) != 0) { - xmlChar *str = NULL; - - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_ELT_4_3, NULL, NULL, - "The type definition '%s', specified by xsi:type, is " - "blocked or not validly derived from the type definition " - "of the element declaration", - xmlSchemaFormatQName(&str, - (*localType)->targetNamespace, - (*localType)->name), - NULL); - FREE_AND_NULL(str); - ret = vctxt->err; - *localType = NULL; - } - } - } -exit: - ACTIVATE_ELEM; - return (ret); -internal_error: - ACTIVATE_ELEM; - return (-1); -} - -static int -xmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaElementPtr elemDecl = vctxt->inode->decl; - xmlSchemaTypePtr actualType; - - /* - * cvc-elt (3.3.4) : 1 - */ - if (elemDecl == NULL) { - VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, - "No matching declaration available"); - return (vctxt->err); - } - actualType = WXS_ELEM_TYPEDEF(elemDecl); - /* - * cvc-elt (3.3.4) : 2 - */ - if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) { - VERROR(XML_SCHEMAV_CVC_ELT_2, NULL, - "The element declaration is abstract"); - return (vctxt->err); - } - if (actualType == NULL) { - VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL, - "The type definition is absent"); - return (XML_SCHEMAV_CVC_TYPE_1); - } - if (vctxt->nbAttrInfos != 0) { - int ret; - xmlSchemaAttrInfoPtr iattr; - /* - * cvc-elt (3.3.4) : 3 - * Handle 'xsi:nil'. - */ - iattr = xmlSchemaGetMetaAttrInfo(vctxt, - XML_SCHEMA_ATTR_INFO_META_XSI_NIL); - if (iattr) { - ACTIVATE_ATTRIBUTE(iattr); - /* - * Validate the value. - */ - ret = xmlSchemaVCheckCVCSimpleType( - ACTXT_CAST vctxt, NULL, - xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), - iattr->value, &(iattr->val), 1, 0, 0); - ACTIVATE_ELEM; - if (ret < 0) { - VERROR_INT("xmlSchemaValidateElemDecl", - "calling xmlSchemaVCheckCVCSimpleType() to " - "validate the attribute 'xsi:nil'"); - return (-1); - } - if (ret == 0) { - if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) { - /* - * cvc-elt (3.3.4) : 3.1 - */ - VERROR(XML_SCHEMAV_CVC_ELT_3_1, NULL, - "The element is not 'nillable'"); - /* Does not return an error on purpose. */ - } else { - if (xmlSchemaValueGetAsBoolean(iattr->val)) { - /* - * cvc-elt (3.3.4) : 3.2.2 - */ - if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) && - (elemDecl->value != NULL)) { - VERROR(XML_SCHEMAV_CVC_ELT_3_2_2, NULL, - "The element cannot be 'nilled' because " - "there is a fixed value constraint defined " - "for it"); - /* Does not return an error on purpose. */ - } else - vctxt->inode->flags |= - XML_SCHEMA_ELEM_INFO_NILLED; - } - } - } - } - /* - * cvc-elt (3.3.4) : 4 - * Handle 'xsi:type'. - */ - iattr = xmlSchemaGetMetaAttrInfo(vctxt, - XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); - if (iattr) { - xmlSchemaTypePtr localType = NULL; - - ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType, - elemDecl); - if (ret != 0) { - if (ret == -1) { - VERROR_INT("xmlSchemaValidateElemDecl", - "calling xmlSchemaProcessXSIType() to " - "process the attribute 'xsi:type'"); - return (-1); - } - /* Does not return an error on purpose. */ - } - if (localType != NULL) { - vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE; - actualType = localType; - } - } - } - /* - * IDC: Register identity-constraint XPath matchers. - */ - if ((elemDecl->idcs != NULL) && - (xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1)) - return (-1); - /* - * No actual type definition. - */ - if (actualType == NULL) { - VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL, - "The type definition is absent"); - return (XML_SCHEMAV_CVC_TYPE_1); - } - /* - * Remember the actual type definition. - */ - vctxt->inode->typeDef = actualType; - - return (0); -} - -static int -xmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaAttrInfoPtr iattr; - int ret = 0, i; - - /* - * SPEC cvc-type (3.1.1) - * "The attributes of must be empty, excepting those whose namespace - * name is identical to http://www.w3.org/2001/XMLSchema-instance and - * whose local name is one of type, nil, schemaLocation or - * noNamespaceSchemaLocation." - */ - if (vctxt->nbAttrInfos == 0) - return (0); - for (i = 0; i < vctxt->nbAttrInfos; i++) { - iattr = vctxt->attrInfos[i]; - if (! iattr->metaType) { - ACTIVATE_ATTRIBUTE(iattr) - xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_TYPE_3_1_1, iattr, NULL); - ret = XML_SCHEMAV_CVC_TYPE_3_1_1; - } - } - ACTIVATE_ELEM - return (ret); -} - -/* -* Cleanup currently used attribute infos. -*/ -static void -xmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt) -{ - int i; - xmlSchemaAttrInfoPtr attr; - - if (vctxt->nbAttrInfos == 0) - return; - for (i = 0; i < vctxt->nbAttrInfos; i++) { - attr = vctxt->attrInfos[i]; - if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) { - if (attr->localName != NULL) - xmlFree((xmlChar *) attr->localName); - if (attr->nsName != NULL) - xmlFree((xmlChar *) attr->nsName); - } - if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { - if (attr->value != NULL) - xmlFree((xmlChar *) attr->value); - } - if (attr->val != NULL) { - xmlSchemaFreeValue(attr->val); - attr->val = NULL; - } - memset(attr, 0, sizeof(xmlSchemaAttrInfo)); - } - vctxt->nbAttrInfos = 0; -} - -/* -* 3.4.4 Complex Type Definition Validation Rules -* Element Locally Valid (Complex Type) (cvc-complex-type) -* 3.2.4 Attribute Declaration Validation Rules -* Validation Rule: Attribute Locally Valid (cvc-attribute) -* Attribute Locally Valid (Use) (cvc-au) -* -* Only "assessed" attribute information items will be visible to -* IDCs. I.e. not "lax" (without declaration) and "skip" wild attributes. -*/ -static int -xmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaTypePtr type = vctxt->inode->typeDef; - xmlSchemaItemListPtr attrUseList; - xmlSchemaAttributeUsePtr attrUse = NULL; - xmlSchemaAttributePtr attrDecl = NULL; - xmlSchemaAttrInfoPtr iattr, tmpiattr; - int i, j, found, nbAttrs, nbUses; - int xpathRes = 0, res, wildIDs = 0, fixed; - xmlNodePtr defAttrOwnerElem = NULL; - - /* - * SPEC (cvc-attribute) - * (1) "The declaration must not be ·absent· (see Missing - * Sub-components (§5.3) for how this can fail to be - * the case)." - * (2) "Its {type definition} must not be absent." - * - * NOTE (1) + (2): This is not handled here, since we currently do not - * allow validation against schemas which have missing sub-components. - * - * SPEC (cvc-complex-type) - * (3) "For each attribute information item in the element information - * item's [attributes] excepting those whose [namespace name] is - * identical to http://www.w3.org/2001/XMLSchema-instance and whose - * [local name] is one of type, nil, schemaLocation or - * noNamespaceSchemaLocation, the appropriate case among the following - * must be true: - * - */ - attrUseList = (xmlSchemaItemListPtr) type->attrUses; - /* - * @nbAttrs is the number of attributes present in the instance. - */ - nbAttrs = vctxt->nbAttrInfos; - if (attrUseList != NULL) - nbUses = attrUseList->nbItems; - else - nbUses = 0; - for (i = 0; i < nbUses; i++) { - found = 0; - attrUse = attrUseList->items[i]; - attrDecl = WXS_ATTRUSE_DECL(attrUse); - for (j = 0; j < nbAttrs; j++) { - iattr = vctxt->attrInfos[j]; - /* - * SPEC (cvc-complex-type) (3) - * Skip meta attributes. - */ - if (iattr->metaType) - continue; - if (iattr->localName[0] != attrDecl->name[0]) - continue; - if (!xmlStrEqual(iattr->localName, attrDecl->name)) - continue; - if (!xmlStrEqual(iattr->nsName, attrDecl->targetNamespace)) - continue; - found = 1; - /* - * SPEC (cvc-complex-type) - * (3.1) "If there is among the {attribute uses} an attribute - * use with an {attribute declaration} whose {name} matches - * the attribute information item's [local name] and whose - * {target namespace} is identical to the attribute information - * item's [namespace name] (where an ·absent· {target namespace} - * is taken to be identical to a [namespace name] with no value), - * then the attribute information must be ·valid· with respect - * to that attribute use as per Attribute Locally Valid (Use) - * (§3.5.4). In this case the {attribute declaration} of that - * attribute use is the ·context-determined declaration· for the - * attribute information item with respect to Schema-Validity - * Assessment (Attribute) (§3.2.4) and - * Assessment Outcome (Attribute) (§3.2.5). - */ - iattr->state = XML_SCHEMAS_ATTR_ASSESSED; - iattr->use = attrUse; - /* - * Context-determined declaration. - */ - iattr->decl = attrDecl; - iattr->typeDef = attrDecl->subtypes; - break; - } - - if (found) - continue; - - if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) { - /* - * Handle non-existent, required attributes. - * - * SPEC (cvc-complex-type) - * (4) "The {attribute declaration} of each attribute use in - * the {attribute uses} whose {required} is true matches one - * of the attribute information items in the element information - * item's [attributes] as per clause 3.1 above." - */ - tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt); - if (tmpiattr == NULL) { - VERROR_INT( - "xmlSchemaVAttributesComplex", - "calling xmlSchemaGetFreshAttrInfo()"); - return (-1); - } - tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING; - tmpiattr->use = attrUse; - tmpiattr->decl = attrDecl; - } else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) && - ((attrUse->defValue != NULL) || - (attrDecl->defValue != NULL))) { - /* - * Handle non-existent, optional, default/fixed attributes. - */ - tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt); - if (tmpiattr == NULL) { - VERROR_INT( - "xmlSchemaVAttributesComplex", - "calling xmlSchemaGetFreshAttrInfo()"); - return (-1); - } - tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT; - tmpiattr->use = attrUse; - tmpiattr->decl = attrDecl; - tmpiattr->typeDef = attrDecl->subtypes; - tmpiattr->localName = attrDecl->name; - tmpiattr->nsName = attrDecl->targetNamespace; - } - } - - if (vctxt->nbAttrInfos == 0) - return (0); - nbUses = vctxt->nbAttrInfos; - /* - * Validate against the wildcard. - */ - if (type->attributeWildcard != NULL) { - /* - * SPEC (cvc-complex-type) - * (3.2.1) "There must be an {attribute wildcard}." - */ - for (i = 0; i < nbAttrs; i++) { - iattr = vctxt->attrInfos[i]; - /* - * SPEC (cvc-complex-type) (3) - * Skip meta attributes. - */ - if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN) - continue; - /* - * SPEC (cvc-complex-type) - * (3.2.2) "The attribute information item must be ·valid· with - * respect to it as defined in Item Valid (Wildcard) (§3.10.4)." - * - * SPEC Item Valid (Wildcard) (cvc-wildcard) - * "... its [namespace name] must be ·valid· with respect to - * the wildcard constraint, as defined in Wildcard allows - * Namespace Name (§3.10.4)." - */ - if (xmlSchemaCheckCVCWildcardNamespace(type->attributeWildcard, - iattr->nsName) == 0) { - /* - * Handle processContents. - * - * SPEC (cvc-wildcard): - * processContents | context-determined declaration: - * "strict" "mustFind" - * "lax" "none" - * "skip" "skip" - */ - if (type->attributeWildcard->processContents == - XML_SCHEMAS_ANY_SKIP) { - /* - * context-determined declaration = "skip" - * - * SPEC PSVI Assessment Outcome (Attribute) - * [validity] = "notKnown" - * [validation attempted] = "none" - */ - iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP; - continue; - } - /* - * Find an attribute declaration. - */ - iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema, - iattr->localName, iattr->nsName); - if (iattr->decl != NULL) { - iattr->state = XML_SCHEMAS_ATTR_ASSESSED; - /* - * SPEC (cvc-complex-type) - * (5) "Let [Definition:] the wild IDs be the set of - * all attribute information item to which clause 3.2 - * applied and whose ·validation· resulted in a - * ·context-determined declaration· of mustFind or no - * ·context-determined declaration· at all, and whose - * [local name] and [namespace name] resolve (as - * defined by QName resolution (Instance) (§3.15.4)) to - * an attribute declaration whose {type definition} is - * or is derived from ID. Then all of the following - * must be true:" - */ - iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl); - if (xmlSchemaIsDerivedFromBuiltInType( - iattr->typeDef, XML_SCHEMAS_ID)) { - /* - * SPEC (5.1) "There must be no more than one - * item in ·wild IDs·." - */ - if (wildIDs != 0) { - /* VAL TODO */ - iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID; - TODO - continue; - } - wildIDs++; - /* - * SPEC (cvc-complex-type) - * (5.2) "If ·wild IDs· is non-empty, there must not - * be any attribute uses among the {attribute uses} - * whose {attribute declaration}'s {type definition} - * is or is derived from ID." - */ - for (j = 0; j < attrUseList->nbItems; j++) { - if (xmlSchemaIsDerivedFromBuiltInType( - WXS_ATTRUSE_TYPEDEF(attrUseList->items[j]), - XML_SCHEMAS_ID)) { - /* URGENT VAL TODO: implement */ - iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID; - TODO - break; - } - } - } - } else if (type->attributeWildcard->processContents == - XML_SCHEMAS_ANY_LAX) { - iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL; - /* - * SPEC PSVI Assessment Outcome (Attribute) - * [validity] = "notKnown" - * [validation attempted] = "none" - */ - } else { - iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL; - } - } - } - } - - if (vctxt->nbAttrInfos == 0) - return (0); - - /* - * Get the owner element; needed for creation of default attributes. - * This fixes bug #341337, reported by David Grohmann. - */ - if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) { - xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth]; - if (ielem && ielem->node && ielem->node->doc) - defAttrOwnerElem = ielem->node; - } - /* - * Validate values, create default attributes, evaluate IDCs. - */ - for (i = 0; i < vctxt->nbAttrInfos; i++) { - iattr = vctxt->attrInfos[i]; - /* - * VAL TODO: Note that we won't try to resolve IDCs to - * "lax" and "skip" validated attributes. Check what to - * do in this case. - */ - if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) && - (iattr->state != XML_SCHEMAS_ATTR_DEFAULT)) - continue; - /* - * VAL TODO: What to do if the type definition is missing? - */ - if (iattr->typeDef == NULL) { - iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE; - continue; - } - - ACTIVATE_ATTRIBUTE(iattr); - fixed = 0; - xpathRes = 0; - - if (vctxt->xpathStates != NULL) { - /* - * Evaluate IDCs. - */ - xpathRes = xmlSchemaXPathEvaluate(vctxt, - XML_ATTRIBUTE_NODE); - if (xpathRes == -1) { - VERROR_INT("xmlSchemaVAttributesComplex", - "calling xmlSchemaXPathEvaluate()"); - goto internal_error; - } - } - - if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) { - /* - * Default/fixed attributes. - * We need the value only if we need to resolve IDCs or - * will create default attributes. - */ - if ((xpathRes) || (defAttrOwnerElem)) { - if (iattr->use->defValue != NULL) { - iattr->value = (xmlChar *) iattr->use->defValue; - iattr->val = iattr->use->defVal; - } else { - iattr->value = (xmlChar *) iattr->decl->defValue; - iattr->val = iattr->decl->defVal; - } - /* - * IDCs will consume the precomputed default value, - * so we need to clone it. - */ - if (iattr->val == NULL) { - VERROR_INT("xmlSchemaVAttributesComplex", - "default/fixed value on an attribute use was " - "not precomputed"); - goto internal_error; - } - iattr->val = xmlSchemaCopyValue(iattr->val); - if (iattr->val == NULL) { - VERROR_INT("xmlSchemaVAttributesComplex", - "calling xmlSchemaCopyValue()"); - goto internal_error; - } - } - /* - * PSVI: Add the default attribute to the current element. - * VAL TODO: Should we use the *normalized* value? This currently - * uses the *initial* value. - */ - - if (defAttrOwnerElem) { - xmlChar *normValue; - const xmlChar *value; - - value = iattr->value; - /* - * Normalize the value. - */ - normValue = xmlSchemaNormalizeValue(iattr->typeDef, - iattr->value); - if (normValue != NULL) - value = BAD_CAST normValue; - - if (iattr->nsName == NULL) { - if (xmlNewProp(defAttrOwnerElem, - iattr->localName, value) == NULL) { - VERROR_INT("xmlSchemaVAttributesComplex", - "callling xmlNewProp()"); - if (normValue != NULL) - xmlFree(normValue); - goto internal_error; - } - } else { - xmlNsPtr ns; - - ns = xmlSearchNsByHref(defAttrOwnerElem->doc, - defAttrOwnerElem, iattr->nsName); - if (ns == NULL) { - xmlChar prefix[12]; - int counter = 0; - - /* - * Create a namespace declaration on the validation - * root node if no namespace declaration is in scope. - */ - do { - snprintf((char *) prefix, 12, "p%d", counter++); - ns = xmlSearchNs(defAttrOwnerElem->doc, - defAttrOwnerElem, BAD_CAST prefix); - if (counter > 1000) { - VERROR_INT( - "xmlSchemaVAttributesComplex", - "could not compute a ns prefix for a " - "default/fixed attribute"); - if (normValue != NULL) - xmlFree(normValue); - goto internal_error; - } - } while (ns != NULL); - ns = xmlNewNs(vctxt->validationRoot, - iattr->nsName, BAD_CAST prefix); - } - /* - * TODO: - * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0406.html - * If we have QNames: do we need to ensure there's a - * prefix defined for the QName? - */ - xmlNewNsProp(defAttrOwnerElem, ns, iattr->localName, value); - } - if (normValue != NULL) - xmlFree(normValue); - } - /* - * Go directly to IDC evaluation. - */ - goto eval_idcs; - } - /* - * Validate the value. - */ - if (vctxt->value != NULL) { - /* - * Free last computed value; just for safety reasons. - */ - xmlSchemaFreeValue(vctxt->value); - vctxt->value = NULL; - } - /* - * Note that the attribute *use* can be unavailable, if - * the attribute was a wild attribute. - */ - if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) || - ((iattr->use != NULL) && - (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED))) - fixed = 1; - else - fixed = 0; - /* - * SPEC (cvc-attribute) - * (3) "The item's ·normalized value· must be locally ·valid· - * with respect to that {type definition} as per - * String Valid (§3.14.4)." - * - * VAL TODO: Do we already have the - * "normalized attribute value" here? - */ - if (xpathRes || fixed) { - iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED; - /* - * Request a computed value. - */ - res = xmlSchemaVCheckCVCSimpleType( - ACTXT_CAST vctxt, - iattr->node, iattr->typeDef, iattr->value, &(iattr->val), - 1, 1, 0); - } else { - res = xmlSchemaVCheckCVCSimpleType( - ACTXT_CAST vctxt, - iattr->node, iattr->typeDef, iattr->value, NULL, - 1, 0, 0); - } - - if (res != 0) { - if (res == -1) { - VERROR_INT("xmlSchemaVAttributesComplex", - "calling xmlSchemaStreamValidateSimpleTypeValue()"); - goto internal_error; - } - iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE; - /* - * SPEC PSVI Assessment Outcome (Attribute) - * [validity] = "invalid" - */ - goto eval_idcs; - } - - if (fixed) { - /* - * SPEC Attribute Locally Valid (Use) (cvc-au) - * "For an attribute information item to be·valid· - * with respect to an attribute use its *normalized* - * value· must match the *canonical* lexical - * representation of the attribute use's {value - * constraint}value, if it is present and fixed." - * - * VAL TODO: The requirement for the *canonical* value - * will be removed in XML Schema 1.1. - */ - /* - * SPEC Attribute Locally Valid (cvc-attribute) - * (4) "The item's *actual* value· must match the *value* of - * the {value constraint}, if it is present and fixed." - */ - if (iattr->val == NULL) { - /* VAL TODO: A value was not precomputed. */ - TODO - goto eval_idcs; - } - if ((iattr->use != NULL) && - (iattr->use->defValue != NULL)) { - if (iattr->use->defVal == NULL) { - /* VAL TODO: A default value was not precomputed. */ - TODO - goto eval_idcs; - } - iattr->vcValue = iattr->use->defValue; - /* - if (xmlSchemaCompareValuesWhtsp(attr->val, - (xmlSchemaWhitespaceValueType) ws, - attr->use->defVal, - (xmlSchemaWhitespaceValueType) ws) != 0) { - */ - if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal)) - iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE; - } else { - if (iattr->decl->defVal == NULL) { - /* VAL TODO: A default value was not precomputed. */ - TODO - goto eval_idcs; - } - iattr->vcValue = iattr->decl->defValue; - /* - if (xmlSchemaCompareValuesWhtsp(attr->val, - (xmlSchemaWhitespaceValueType) ws, - attrDecl->defVal, - (xmlSchemaWhitespaceValueType) ws) != 0) { - */ - if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal)) - iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE; - } - /* - * [validity] = "valid" - */ - } -eval_idcs: - /* - * Evaluate IDCs. - */ - if (xpathRes) { - if (xmlSchemaXPathProcessHistory(vctxt, - vctxt->depth +1) == -1) { - VERROR_INT("xmlSchemaVAttributesComplex", - "calling xmlSchemaXPathEvaluate()"); - goto internal_error; - } - } else if (vctxt->xpathStates != NULL) - xmlSchemaXPathPop(vctxt); - } - - /* - * Report errors. - */ - for (i = 0; i < vctxt->nbAttrInfos; i++) { - iattr = vctxt->attrInfos[i]; - if ((iattr->state == XML_SCHEMAS_ATTR_META) || - (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) || - (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) || - (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL)) - continue; - ACTIVATE_ATTRIBUTE(iattr); - switch (iattr->state) { - case XML_SCHEMAS_ATTR_ERR_MISSING: { - xmlChar *str = NULL; - ACTIVATE_ELEM; - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_COMPLEX_TYPE_4, NULL, NULL, - "The attribute '%s' is required but missing", - xmlSchemaFormatQName(&str, - iattr->decl->targetNamespace, - iattr->decl->name), - NULL); - FREE_AND_NULL(str) - break; - } - case XML_SCHEMAS_ATTR_ERR_NO_TYPE: - VERROR(XML_SCHEMAV_CVC_ATTRIBUTE_2, NULL, - "The type definition is absent"); - break; - case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE: - xmlSchemaCustomErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_AU, NULL, NULL, - "The value '%s' does not match the fixed " - "value constraint '%s'", - iattr->value, iattr->vcValue); - break; - case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL: - VERROR(XML_SCHEMAV_CVC_WILDCARD, NULL, - "No matching global attribute declaration available, but " - "demanded by the strict wildcard"); - break; - case XML_SCHEMAS_ATTR_UNKNOWN: - if (iattr->metaType) - break; - /* - * MAYBE VAL TODO: One might report different error messages - * for the following errors. - */ - if (type->attributeWildcard == NULL) { - xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, iattr, NULL); - } else { - xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, iattr, NULL); - } - break; - default: - break; - } - } - - ACTIVATE_ELEM; - return (0); -internal_error: - ACTIVATE_ELEM; - return (-1); -} - -static int -xmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt, - int *skip) -{ - xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl; - /* - * The namespace of the element was already identified to be - * matching the wildcard. - */ - if ((skip == NULL) || (wild == NULL) || - (wild->type != XML_SCHEMA_TYPE_ANY)) { - VERROR_INT("xmlSchemaValidateElemWildcard", - "bad arguments"); - return (-1); - } - *skip = 0; - if (wild->processContents == XML_SCHEMAS_ANY_SKIP) { - /* - * URGENT VAL TODO: Either we need to position the stream to the - * next sibling, or walk the whole subtree. - */ - *skip = 1; - return (0); - } - { - xmlSchemaElementPtr decl = NULL; - - decl = xmlSchemaGetElem(vctxt->schema, - vctxt->inode->localName, vctxt->inode->nsName); - if (decl != NULL) { - vctxt->inode->decl = decl; - return (0); - } - } - if (wild->processContents == XML_SCHEMAS_ANY_STRICT) { - /* VAL TODO: Change to proper error code. */ - VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, /* WXS_BASIC_CAST wild */ - "No matching global element declaration available, but " - "demanded by the strict wildcard"); - return (vctxt->err); - } - if (vctxt->nbAttrInfos != 0) { - xmlSchemaAttrInfoPtr iattr; - /* - * SPEC Validation Rule: Schema-Validity Assessment (Element) - * (1.2.1.2.1) - (1.2.1.2.3 ) - * - * Use the xsi:type attribute for the type definition. - */ - iattr = xmlSchemaGetMetaAttrInfo(vctxt, - XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); - if (iattr != NULL) { - if (xmlSchemaProcessXSIType(vctxt, iattr, - &(vctxt->inode->typeDef), NULL) == -1) { - VERROR_INT("xmlSchemaValidateElemWildcard", - "calling xmlSchemaProcessXSIType() to " - "process the attribute 'xsi:nil'"); - return (-1); - } - /* - * Don't return an error on purpose. - */ - return (0); - } - } - /* - * SPEC Validation Rule: Schema-Validity Assessment (Element) - * - * Fallback to "anyType". - */ - vctxt->inode->typeDef = - xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); - return (0); -} - -/* -* xmlSchemaCheckCOSValidDefault: -* -* This will be called if: not nilled, no content and a default/fixed -* value is provided. -*/ - -static int -xmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt, - const xmlChar *value, - xmlSchemaValPtr *val) -{ - int ret = 0; - xmlSchemaNodeInfoPtr inode = vctxt->inode; - - /* - * cos-valid-default: - * Schema Component Constraint: Element Default Valid (Immediate) - * For a string to be a valid default with respect to a type - * definition the appropriate case among the following must be true: - */ - if WXS_IS_COMPLEX(inode->typeDef) { - /* - * Complex type. - * - * SPEC (2.1) "its {content type} must be a simple type definition - * or mixed." - * SPEC (2.2.2) "If the {content type} is mixed, then the {content - * type}'s particle must be ·emptiable· as defined by - * Particle Emptiable (§3.9.6)." - */ - if ((! WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) && - ((! WXS_HAS_MIXED_CONTENT(inode->typeDef)) || - (! WXS_EMPTIABLE(inode->typeDef)))) { - ret = XML_SCHEMAP_COS_VALID_DEFAULT_2_1; - /* NOTE that this covers (2.2.2) as well. */ - VERROR(ret, NULL, - "For a string to be a valid default, the type definition " - "must be a simple type or a complex type with simple content " - "or mixed content and a particle emptiable"); - return(ret); - } - } - /* - * 1 If the type definition is a simple type definition, then the string - * must be ·valid· with respect to that definition as defined by String - * Valid (§3.14.4). - * - * AND - * - * 2.2.1 If the {content type} is a simple type definition, then the - * string must be ·valid· with respect to that simple type definition - * as defined by String Valid (§3.14.4). - */ - if (WXS_IS_SIMPLE(inode->typeDef)) { - - ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt, - NULL, inode->typeDef, value, val, 1, 1, 0); - - } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { - - ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt, - NULL, inode->typeDef->contentTypeDef, value, val, 1, 1, 0); - } - if (ret < 0) { - VERROR_INT("xmlSchemaCheckCOSValidDefault", - "calling xmlSchemaVCheckCVCSimpleType()"); - } - return (ret); -} - -static void -xmlSchemaVContentModelCallback(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED, - const xmlChar * name ATTRIBUTE_UNUSED, - xmlSchemaElementPtr item, - xmlSchemaNodeInfoPtr inode) -{ - inode->decl = item; -#ifdef DEBUG_CONTENT - { - xmlChar *str = NULL; - - if (item->type == XML_SCHEMA_TYPE_ELEMENT) { - xmlGenericError(xmlGenericErrorContext, - "AUTOMATON callback for '%s' [declaration]\n", - xmlSchemaFormatQName(&str, - inode->localName, inode->nsName)); - } else { - xmlGenericError(xmlGenericErrorContext, - "AUTOMATON callback for '%s' [wildcard]\n", - xmlSchemaFormatQName(&str, - inode->localName, inode->nsName)); - - } - FREE_AND_NULL(str) - } -#endif -} - -static int -xmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt) -{ - vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt); - if (vctxt->inode == NULL) { - VERROR_INT("xmlSchemaValidatorPushElem", - "calling xmlSchemaGetFreshElemInfo()"); - return (-1); - } - vctxt->nbAttrInfos = 0; - return (0); -} - -static int -xmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt, - xmlSchemaNodeInfoPtr inode, - xmlSchemaTypePtr type, - const xmlChar *value) -{ - if (inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED) - return (xmlSchemaVCheckCVCSimpleType( - ACTXT_CAST vctxt, NULL, - type, value, &(inode->val), 1, 1, 0)); - else - return (xmlSchemaVCheckCVCSimpleType( - ACTXT_CAST vctxt, NULL, - type, value, NULL, 1, 0, 0)); -} - - - -/* -* Process END of element. -*/ -static int -xmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt) -{ - int ret = 0; - xmlSchemaNodeInfoPtr inode = vctxt->inode; - - if (vctxt->nbAttrInfos != 0) - xmlSchemaClearAttrInfos(vctxt); - if (inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) { - /* - * This element was not expected; - * we will not validate child elements of broken parents. - * Skip validation of all content of the parent. - */ - vctxt->skipDepth = vctxt->depth -1; - goto end_elem; - } - if ((inode->typeDef == NULL) || - (inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) { - /* - * 1. the type definition might be missing if the element was - * error prone - * 2. it might be abstract. - */ - goto end_elem; - } - /* - * Check the content model. - */ - if ((inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) || - (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) { - - /* - * Workaround for "anyType". - */ - if (inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE) - goto character_content; - - if ((inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) { - xmlChar *values[10]; - int terminal, nbval = 10, nbneg; - - if (inode->regexCtxt == NULL) { - /* - * Create the regex context. - */ - inode->regexCtxt = - xmlRegNewExecCtxt(inode->typeDef->contModel, - (xmlRegExecCallbacks) xmlSchemaVContentModelCallback, - vctxt); - if (inode->regexCtxt == NULL) { - VERROR_INT("xmlSchemaValidatorPopElem", - "failed to create a regex context"); - goto internal_error; - } -#ifdef DEBUG_AUTOMATA - xmlGenericError(xmlGenericErrorContext, - "AUTOMATON create on '%s'\n", inode->localName); -#endif - } - /* - * Get hold of the still expected content, since a further - * call to xmlRegExecPushString() will loose this information. - */ - xmlRegExecNextValues(inode->regexCtxt, - &nbval, &nbneg, &values[0], &terminal); - ret = xmlRegExecPushString(inode->regexCtxt, NULL, NULL); - if (ret <= 0) { - /* - * Still missing something. - */ - ret = 1; - inode->flags |= - XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT; - xmlSchemaComplexTypeErr(ACTXT_CAST vctxt, - XML_SCHEMAV_ELEMENT_CONTENT, NULL, NULL, - "Missing child element(s)", - nbval, nbneg, values); -#ifdef DEBUG_AUTOMATA - xmlGenericError(xmlGenericErrorContext, - "AUTOMATON missing ERROR on '%s'\n", - inode->localName); -#endif - } else { - /* - * Content model is satisfied. - */ - ret = 0; -#ifdef DEBUG_AUTOMATA - xmlGenericError(xmlGenericErrorContext, - "AUTOMATON succeeded on '%s'\n", - inode->localName); -#endif - } - - } - } - if (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS) - goto end_elem; - -character_content: - - if (vctxt->value != NULL) { - xmlSchemaFreeValue(vctxt->value); - vctxt->value = NULL; - } - /* - * Check character content. - */ - if (inode->decl == NULL) { - /* - * Speedup if no declaration exists. - */ - if (WXS_IS_SIMPLE(inode->typeDef)) { - ret = xmlSchemaVCheckINodeDataType(vctxt, - inode, inode->typeDef, inode->value); - } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { - ret = xmlSchemaVCheckINodeDataType(vctxt, - inode, inode->typeDef->contentTypeDef, - inode->value); - } - if (ret < 0) { - VERROR_INT("xmlSchemaValidatorPopElem", - "calling xmlSchemaVCheckCVCSimpleType()"); - goto internal_error; - } - goto end_elem; - } - /* - * cvc-elt (3.3.4) : 5 - * The appropriate case among the following must be true: - */ - /* - * cvc-elt (3.3.4) : 5.1 - * If the declaration has a {value constraint}, - * the item has neither element nor character [children] and - * clause 3.2 has not applied, then all of the following must be true: - */ - if ((inode->decl->value != NULL) && - (inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) && - (! INODE_NILLED(inode))) { - /* - * cvc-elt (3.3.4) : 5.1.1 - * If the ·actual type definition· is a ·local type definition· - * then the canonical lexical representation of the {value constraint} - * value must be a valid default for the ·actual type definition· as - * defined in Element Default Valid (Immediate) (§3.3.6). - */ - /* - * NOTE: 'local' above means types acquired by xsi:type. - * NOTE: Although the *canonical* value is stated, it is not - * relevant if canonical or not. Additionally XML Schema 1.1 - * will removed this requirement as well. - */ - if (inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) { - - ret = xmlSchemaCheckCOSValidDefault(vctxt, - inode->decl->value, &(inode->val)); - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaValidatorPopElem", - "calling xmlSchemaCheckCOSValidDefault()"); - goto internal_error; - } - goto end_elem; - } - /* - * Stop here, to avoid redundant validation of the value - * (see following). - */ - goto default_psvi; - } - /* - * cvc-elt (3.3.4) : 5.1.2 - * The element information item with the canonical lexical - * representation of the {value constraint} value used as its - * ·normalized value· must be ·valid· with respect to the - * ·actual type definition· as defined by Element Locally Valid (Type) - * (§3.3.4). - */ - if (WXS_IS_SIMPLE(inode->typeDef)) { - ret = xmlSchemaVCheckINodeDataType(vctxt, - inode, inode->typeDef, inode->decl->value); - } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { - ret = xmlSchemaVCheckINodeDataType(vctxt, - inode, inode->typeDef->contentTypeDef, - inode->decl->value); - } - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaValidatorPopElem", - "calling xmlSchemaVCheckCVCSimpleType()"); - goto internal_error; - } - goto end_elem; - } - -default_psvi: - /* - * PSVI: Create a text node on the instance element. - */ - if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) && - (inode->node != NULL)) { - xmlNodePtr textChild; - xmlChar *normValue; - /* - * VAL TODO: Normalize the value. - */ - normValue = xmlSchemaNormalizeValue(inode->typeDef, - inode->decl->value); - if (normValue != NULL) { - textChild = xmlNewText(BAD_CAST normValue); - xmlFree(normValue); - } else - textChild = xmlNewText(inode->decl->value); - if (textChild == NULL) { - VERROR_INT("xmlSchemaValidatorPopElem", - "calling xmlNewText()"); - goto internal_error; - } else - xmlAddChild(inode->node, textChild); - } - - } else if (! INODE_NILLED(inode)) { - /* - * 5.2.1 The element information item must be ·valid· with respect - * to the ·actual type definition· as defined by Element Locally - * Valid (Type) (§3.3.4). - */ - if (WXS_IS_SIMPLE(inode->typeDef)) { - /* - * SPEC (cvc-type) (3.1) - * "If the type definition is a simple type definition, ..." - * (3.1.3) "If clause 3.2 of Element Locally Valid - * (Element) (§3.3.4) did not apply, then the ·normalized value· - * must be ·valid· with respect to the type definition as defined - * by String Valid (§3.14.4). - */ - ret = xmlSchemaVCheckINodeDataType(vctxt, - inode, inode->typeDef, inode->value); - } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { - /* - * SPEC (cvc-type) (3.2) "If the type definition is a complex type - * definition, then the element information item must be - * ·valid· with respect to the type definition as per - * Element Locally Valid (Complex Type) (§3.4.4);" - * - * SPEC (cvc-complex-type) (2.2) - * "If the {content type} is a simple type definition, ... - * the ·normalized value· of the element information item is - * ·valid· with respect to that simple type definition as - * defined by String Valid (§3.14.4)." - */ - ret = xmlSchemaVCheckINodeDataType(vctxt, - inode, inode->typeDef->contentTypeDef, inode->value); - } - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaValidatorPopElem", - "calling xmlSchemaVCheckCVCSimpleType()"); - goto internal_error; - } - goto end_elem; - } - /* - * 5.2.2 If there is a fixed {value constraint} and clause 3.2 has - * not applied, all of the following must be true: - */ - if ((inode->decl->value != NULL) && - (inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) { - - /* - * TODO: We will need a computed value, when comparison is - * done on computed values. - */ - /* - * 5.2.2.1 The element information item must have no element - * information item [children]. - */ - if (inode->flags & - XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) { - ret = XML_SCHEMAV_CVC_ELT_5_2_2_1; - VERROR(ret, NULL, - "The content must not containt element nodes since " - "there is a fixed value constraint"); - goto end_elem; - } else { - /* - * 5.2.2.2 The appropriate case among the following must - * be true: - */ - if (WXS_HAS_MIXED_CONTENT(inode->typeDef)) { - /* - * 5.2.2.2.1 If the {content type} of the ·actual type - * definition· is mixed, then the *initial value* of the - * item must match the canonical lexical representation - * of the {value constraint} value. - * - * ... the *initial value* of an element information - * item is the string composed of, in order, the - * [character code] of each character information item in - * the [children] of that element information item. - */ - if (! xmlStrEqual(inode->value, inode->decl->value)){ - /* - * VAL TODO: Report invalid & expected values as well. - * VAL TODO: Implement the canonical stuff. - */ - ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_1; - xmlSchemaCustomErr(ACTXT_CAST vctxt, - ret, NULL, NULL, - "The initial value '%s' does not match the fixed " - "value constraint '%s'", - inode->value, inode->decl->value); - goto end_elem; - } - } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { - /* - * 5.2.2.2.2 If the {content type} of the ·actual type - * definition· is a simple type definition, then the - * *actual value* of the item must match the canonical - * lexical representation of the {value constraint} value. - */ - /* - * VAL TODO: *actual value* is the normalized value, impl. - * this. - * VAL TODO: Report invalid & expected values as well. - * VAL TODO: Implement a comparison with the computed values. - */ - if (! xmlStrEqual(inode->value, - inode->decl->value)) { - ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_2; - xmlSchemaCustomErr(ACTXT_CAST vctxt, - ret, NULL, NULL, - "The actual value '%s' does not match the fixed " - "value constraint '%s'", - inode->value, - inode->decl->value); - goto end_elem; - } - } - } - } - } - -end_elem: - if (vctxt->depth < 0) { - /* TODO: raise error? */ - return (0); - } - if (vctxt->depth == vctxt->skipDepth) - vctxt->skipDepth = -1; - /* - * Evaluate the history of XPath state objects. - */ - if (inode->appliedXPath && - (xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1)) - goto internal_error; - /* - * MAYBE TODO: - * SPEC (6) "The element information item must be ·valid· with - * respect to each of the {identity-constraint definitions} as per - * Identity-constraint Satisfied (§3.11.4)." - */ - /* - * PSVI TODO: If we expose IDC node-tables via PSVI then the tables - * need to be built in any case. - * We will currently build IDC node-tables and bubble them only if - * keyrefs do exist. - */ - - /* - * Add the current IDC target-nodes to the IDC node-tables. - */ - if ((inode->idcMatchers != NULL) && - (vctxt->hasKeyrefs || vctxt->createIDCNodeTables)) - { - if (xmlSchemaIDCFillNodeTables(vctxt, inode) == -1) - goto internal_error; - } - /* - * Validate IDC keyrefs. - */ - if (vctxt->inode->hasKeyrefs) - if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1) - goto internal_error; - /* - * Merge/free the IDC table. - */ - if (inode->idcTable != NULL) { -#ifdef DEBUG_IDC_NODE_TABLE - xmlSchemaDebugDumpIDCTable(stdout, - inode->nsName, - inode->localName, - inode->idcTable); -#endif - if ((vctxt->depth > 0) && - (vctxt->hasKeyrefs || vctxt->createIDCNodeTables)) - { - /* - * Merge the IDC node table with the table of the parent node. - */ - if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1) - goto internal_error; - } - } - /* - * Clear the current ielem. - * VAL TODO: Don't free the PSVI IDC tables if they are - * requested for the PSVI. - */ - xmlSchemaClearElemInfo(vctxt, inode); - /* - * Skip further processing if we are on the validation root. - */ - if (vctxt->depth == 0) { - vctxt->depth--; - vctxt->inode = NULL; - return (0); - } - /* - * Reset the keyrefDepth if needed. - */ - if (vctxt->aidcs != NULL) { - xmlSchemaIDCAugPtr aidc = vctxt->aidcs; - do { - if (aidc->keyrefDepth == vctxt->depth) { - /* - * A 'keyrefDepth' of a key/unique IDC matches the current - * depth, this means that we are leaving the scope of the - * top-most keyref IDC which refers to this IDC. - */ - aidc->keyrefDepth = -1; - } - aidc = aidc->next; - } while (aidc != NULL); - } - vctxt->depth--; - vctxt->inode = vctxt->elemInfos[vctxt->depth]; - /* - * VAL TODO: 7 If the element information item is the ·validation root·, it must be - * ·valid· per Validation Root Valid (ID/IDREF) (§3.3.4). - */ - return (ret); - -internal_error: - vctxt->err = -1; - return (-1); -} - -/* -* 3.4.4 Complex Type Definition Validation Rules -* Validation Rule: Element Locally Valid (Complex Type) (cvc-complex-type) -*/ -static int -xmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt) -{ - xmlSchemaNodeInfoPtr pielem; - xmlSchemaTypePtr ptype; - int ret = 0; - - if (vctxt->depth <= 0) { - VERROR_INT("xmlSchemaValidateChildElem", - "not intended for the validation root"); - return (-1); - } - pielem = vctxt->elemInfos[vctxt->depth -1]; - if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) - pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; - /* - * Handle 'nilled' elements. - */ - if (INODE_NILLED(pielem)) { - /* - * SPEC (cvc-elt) (3.3.4) : (3.2.1) - */ - ACTIVATE_PARENT_ELEM; - ret = XML_SCHEMAV_CVC_ELT_3_2_1; - VERROR(ret, NULL, - "Neither character nor element content is allowed, " - "because the element was 'nilled'"); - ACTIVATE_ELEM; - goto unexpected_elem; - } - - ptype = pielem->typeDef; - - if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) { - /* - * Workaround for "anyType": we have currently no content model - * assigned for "anyType", so handle it explicitly. - * "anyType" has an unbounded, lax "any" wildcard. - */ - vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema, - vctxt->inode->localName, - vctxt->inode->nsName); - - if (vctxt->inode->decl == NULL) { - xmlSchemaAttrInfoPtr iattr; - /* - * Process "xsi:type". - * SPEC (cvc-assess-elt) (1.2.1.2.1) - (1.2.1.2.3) - */ - iattr = xmlSchemaGetMetaAttrInfo(vctxt, - XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); - if (iattr != NULL) { - ret = xmlSchemaProcessXSIType(vctxt, iattr, - &(vctxt->inode->typeDef), NULL); - if (ret != 0) { - if (ret == -1) { - VERROR_INT("xmlSchemaValidateChildElem", - "calling xmlSchemaProcessXSIType() to " - "process the attribute 'xsi:nil'"); - return (-1); - } - return (ret); - } - } else { - /* - * Fallback to "anyType". - * - * SPEC (cvc-assess-elt) - * "If the item cannot be ·strictly assessed·, [...] - * an element information item's schema validity may be laxly - * assessed if its ·context-determined declaration· is not - * skip by ·validating· with respect to the ·ur-type - * definition· as per Element Locally Valid (Type) (§3.3.4)." - */ - vctxt->inode->typeDef = - xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); - } - } - return (0); - } - - switch (ptype->contentType) { - case XML_SCHEMA_CONTENT_EMPTY: - /* - * SPEC (2.1) "If the {content type} is empty, then the - * element information item has no character or element - * information item [children]." - */ - ACTIVATE_PARENT_ELEM - ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1; - VERROR(ret, NULL, - "Element content is not allowed, " - "because the content type is empty"); - ACTIVATE_ELEM - goto unexpected_elem; - break; - - case XML_SCHEMA_CONTENT_MIXED: - case XML_SCHEMA_CONTENT_ELEMENTS: { - xmlRegExecCtxtPtr regexCtxt; - xmlChar *values[10]; - int terminal, nbval = 10, nbneg; - - /* VAL TODO: Optimized "anyType" validation.*/ - - if (ptype->contModel == NULL) { - VERROR_INT("xmlSchemaValidateChildElem", - "type has elem content but no content model"); - return (-1); - } - /* - * Safety belf for evaluation if the cont. model was already - * examined to be invalid. - */ - if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) { - VERROR_INT("xmlSchemaValidateChildElem", - "validating elem, but elem content is already invalid"); - return (-1); - } - - regexCtxt = pielem->regexCtxt; - if (regexCtxt == NULL) { - /* - * Create the regex context. - */ - regexCtxt = xmlRegNewExecCtxt(ptype->contModel, - (xmlRegExecCallbacks) xmlSchemaVContentModelCallback, - vctxt); - if (regexCtxt == NULL) { - VERROR_INT("xmlSchemaValidateChildElem", - "failed to create a regex context"); - return (-1); - } - pielem->regexCtxt = regexCtxt; -#ifdef DEBUG_AUTOMATA - xmlGenericError(xmlGenericErrorContext, "AUTOMATA create on '%s'\n", - pielem->localName); -#endif - } - - /* - * SPEC (2.4) "If the {content type} is element-only or mixed, - * then the sequence of the element information item's - * element information item [children], if any, taken in - * order, is ·valid· with respect to the {content type}'s - * particle, as defined in Element Sequence Locally Valid - * (Particle) (§3.9.4)." - */ - ret = xmlRegExecPushString2(regexCtxt, - vctxt->inode->localName, - vctxt->inode->nsName, - vctxt->inode); -#ifdef DEBUG_AUTOMATA - if (ret < 0) - xmlGenericError(xmlGenericErrorContext, - "AUTOMATON push ERROR for '%s' on '%s'\n", - vctxt->inode->localName, pielem->localName); - else - xmlGenericError(xmlGenericErrorContext, - "AUTOMATON push OK for '%s' on '%s'\n", - vctxt->inode->localName, pielem->localName); -#endif - if (vctxt->err == XML_SCHEMAV_INTERNAL) { - VERROR_INT("xmlSchemaValidateChildElem", - "calling xmlRegExecPushString2()"); - return (-1); - } - if (ret < 0) { - xmlRegExecErrInfo(regexCtxt, NULL, &nbval, &nbneg, - &values[0], &terminal); - xmlSchemaComplexTypeErr(ACTXT_CAST vctxt, - XML_SCHEMAV_ELEMENT_CONTENT, NULL,NULL, - "This element is not expected", - nbval, nbneg, values); - ret = vctxt->err; - goto unexpected_elem; - } else - ret = 0; - } - break; - case XML_SCHEMA_CONTENT_SIMPLE: - case XML_SCHEMA_CONTENT_BASIC: - ACTIVATE_PARENT_ELEM - if (WXS_IS_COMPLEX(ptype)) { - /* - * SPEC (cvc-complex-type) (2.2) - * "If the {content type} is a simple type definition, then - * the element information item has no element information - * item [children], ..." - */ - ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2; - VERROR(ret, NULL, "Element content is not allowed, " - "because the content type is a simple type definition"); - } else { - /* - * SPEC (cvc-type) (3.1.2) "The element information item must - * have no element information item [children]." - */ - ret = XML_SCHEMAV_CVC_TYPE_3_1_2; - VERROR(ret, NULL, "Element content is not allowed, " - "because the type definition is simple"); - } - ACTIVATE_ELEM - ret = vctxt->err; - goto unexpected_elem; - break; - - default: - break; - } - return (ret); -unexpected_elem: - /* - * Pop this element and set the skipDepth to skip - * all further content of the parent element. - */ - vctxt->skipDepth = vctxt->depth; - vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED; - pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT; - return (ret); -} - -#define XML_SCHEMA_PUSH_TEXT_PERSIST 1 -#define XML_SCHEMA_PUSH_TEXT_CREATED 2 -#define XML_SCHEMA_PUSH_TEXT_VOLATILE 3 - -static int -xmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt, - int nodeType, const xmlChar *value, int len, - int mode, int *consumed) -{ - /* - * Unfortunately we have to duplicate the text sometimes. - * OPTIMIZE: Maybe we could skip it, if: - * 1. content type is simple - * 2. whitespace is "collapse" - * 3. it consists of whitespace only - * - * Process character content. - */ - if (consumed != NULL) - *consumed = 0; - if (INODE_NILLED(vctxt->inode)) { - /* - * SPEC cvc-elt (3.3.4 - 3.2.1) - * "The element information item must have no character or - * element information item [children]." - */ - VERROR(XML_SCHEMAV_CVC_ELT_3_2_1, NULL, - "Neither character nor element content is allowed " - "because the element is 'nilled'"); - return (vctxt->err); - } - /* - * SPEC (2.1) "If the {content type} is empty, then the - * element information item has no character or element - * information item [children]." - */ - if (vctxt->inode->typeDef->contentType == - XML_SCHEMA_CONTENT_EMPTY) { - VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, NULL, - "Character content is not allowed, " - "because the content type is empty"); - return (vctxt->err); - } - - if (vctxt->inode->typeDef->contentType == - XML_SCHEMA_CONTENT_ELEMENTS) { - if ((nodeType != XML_TEXT_NODE) || - (! xmlSchemaIsBlank((xmlChar *) value, len))) { - /* - * SPEC cvc-complex-type (2.3) - * "If the {content type} is element-only, then the - * element information item has no character information - * item [children] other than those whose [character - * code] is defined as a white space in [XML 1.0 (Second - * Edition)]." - */ - VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, NULL, - "Character content other than whitespace is not allowed " - "because the content type is 'element-only'"); - return (vctxt->err); - } - return (0); - } - - if ((value == NULL) || (value[0] == 0)) - return (0); - /* - * Save the value. - * NOTE that even if the content type is *mixed*, we need the - * *initial value* for default/fixed value constraints. - */ - if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) && - ((vctxt->inode->decl == NULL) || - (vctxt->inode->decl->value == NULL))) - return (0); - - if (vctxt->inode->value == NULL) { - /* - * Set the value. - */ - switch (mode) { - case XML_SCHEMA_PUSH_TEXT_PERSIST: - /* - * When working on a tree. - */ - vctxt->inode->value = value; - break; - case XML_SCHEMA_PUSH_TEXT_CREATED: - /* - * When working with the reader. - * The value will be freed by the element info. - */ - vctxt->inode->value = value; - if (consumed != NULL) - *consumed = 1; - vctxt->inode->flags |= - XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; - break; - case XML_SCHEMA_PUSH_TEXT_VOLATILE: - /* - * When working with SAX. - * The value will be freed by the element info. - */ - if (len != -1) - vctxt->inode->value = BAD_CAST xmlStrndup(value, len); - else - vctxt->inode->value = BAD_CAST xmlStrdup(value); - vctxt->inode->flags |= - XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; - break; - default: - break; - } - } else { - if (len < 0) - len = xmlStrlen(value); - /* - * Concat the value. - */ - if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { - vctxt->inode->value = BAD_CAST xmlStrncat( - (xmlChar *) vctxt->inode->value, value, len); - } else { - vctxt->inode->value = - BAD_CAST xmlStrncatNew(vctxt->inode->value, value, len); - vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; - } - } - - return (0); -} - -static int -xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt) -{ - int ret = 0; - - if ((vctxt->skipDepth != -1) && - (vctxt->depth >= vctxt->skipDepth)) { - VERROR_INT("xmlSchemaValidateElem", - "in skip-state"); - goto internal_error; - } - if (vctxt->xsiAssemble) { - /* - * We will stop validation if there was an error during - * dynamic schema construction. - * Note that we simply set @skipDepth to 0, this could - * mean that a streaming document via SAX would be - * still read to the end but it won't be validated any more. - * TODO: If we are sure how to stop the validation at once - * for all input scenarios, then this should be changed to - * instantly stop the validation. - */ - ret = xmlSchemaAssembleByXSI(vctxt); - if (ret != 0) { - if (ret == -1) - goto internal_error; - vctxt->skipDepth = 0; - return(ret); - } - } - if (vctxt->depth > 0) { - /* - * Validate this element against the content model - * of the parent. - */ - ret = xmlSchemaValidateChildElem(vctxt); - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaValidateElem", - "calling xmlSchemaStreamValidateChildElement()"); - goto internal_error; - } - goto exit; - } - if (vctxt->depth == vctxt->skipDepth) - goto exit; - if ((vctxt->inode->decl == NULL) && - (vctxt->inode->typeDef == NULL)) { - VERROR_INT("xmlSchemaValidateElem", - "the child element was valid but neither the " - "declaration nor the type was set"); - goto internal_error; - } - } else { - /* - * Get the declaration of the validation root. - */ - vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema, - vctxt->inode->localName, - vctxt->inode->nsName); - if (vctxt->inode->decl == NULL) { - ret = XML_SCHEMAV_CVC_ELT_1; - VERROR(ret, NULL, - "No matching global declaration available " - "for the validation root"); - goto exit; - } - } - - if (vctxt->inode->decl == NULL) - goto type_validation; - - if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) { - int skip; - /* - * Wildcards. - */ - ret = xmlSchemaValidateElemWildcard(vctxt, &skip); - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaValidateElem", - "calling xmlSchemaValidateElemWildcard()"); - goto internal_error; - } - goto exit; - } - if (skip) { - vctxt->skipDepth = vctxt->depth; - goto exit; - } - /* - * The declaration might be set by the wildcard validation, - * when the processContents is "lax" or "strict". - */ - if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) { - /* - * Clear the "decl" field to not confuse further processing. - */ - vctxt->inode->decl = NULL; - goto type_validation; - } - } - /* - * Validate against the declaration. - */ - ret = xmlSchemaValidateElemDecl(vctxt); - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaValidateElem", - "calling xmlSchemaValidateElemDecl()"); - goto internal_error; - } - goto exit; - } - /* - * Validate against the type definition. - */ -type_validation: - - if (vctxt->inode->typeDef == NULL) { - vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE; - ret = XML_SCHEMAV_CVC_TYPE_1; - VERROR(ret, NULL, - "The type definition is absent"); - goto exit; - } - if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) { - vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE; - ret = XML_SCHEMAV_CVC_TYPE_2; - VERROR(ret, NULL, - "The type definition is abstract"); - goto exit; - } - /* - * Evaluate IDCs. Do it here, since new IDC matchers are registered - * during validation against the declaration. This must be done - * _before_ attribute validation. - */ - if (vctxt->xpathStates != NULL) { - ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE); - vctxt->inode->appliedXPath = 1; - if (ret == -1) { - VERROR_INT("xmlSchemaValidateElem", - "calling xmlSchemaXPathEvaluate()"); - goto internal_error; - } - } - /* - * Validate attributes. - */ - if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) { - if ((vctxt->nbAttrInfos != 0) || - (vctxt->inode->typeDef->attrUses != NULL)) { - - ret = xmlSchemaVAttributesComplex(vctxt); - } - } else if (vctxt->nbAttrInfos != 0) { - - ret = xmlSchemaVAttributesSimple(vctxt); - } - /* - * Clear registered attributes. - */ - if (vctxt->nbAttrInfos != 0) - xmlSchemaClearAttrInfos(vctxt); - if (ret == -1) { - VERROR_INT("xmlSchemaValidateElem", - "calling attributes validation"); - goto internal_error; - } - /* - * Don't return an error if attributes are invalid on purpose. - */ - ret = 0; - -exit: - if (ret != 0) - vctxt->skipDepth = vctxt->depth; - return (ret); -internal_error: - return (-1); -} - -#ifdef XML_SCHEMA_READER_ENABLED -static int -xmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt) -{ - const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15; - int depth, nodeType, ret = 0, consumed; - xmlSchemaNodeInfoPtr ielem; - - vctxt->depth = -1; - ret = xmlTextReaderRead(vctxt->reader); - /* - * Move to the document element. - */ - while (ret == 1) { - nodeType = xmlTextReaderNodeType(vctxt->reader); - if (nodeType == XML_ELEMENT_NODE) - goto root_found; - ret = xmlTextReaderRead(vctxt->reader); - } - goto exit; - -root_found: - - do { - depth = xmlTextReaderDepth(vctxt->reader); - nodeType = xmlTextReaderNodeType(vctxt->reader); - - if (nodeType == XML_ELEMENT_NODE) { - - vctxt->depth++; - if (xmlSchemaValidatorPushElem(vctxt) == -1) { - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlSchemaValidatorPushElem()"); - goto internal_error; - } - ielem = vctxt->inode; - ielem->localName = xmlTextReaderLocalName(vctxt->reader); - ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader); - ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES; - /* - * Is the element empty? - */ - ret = xmlTextReaderIsEmptyElement(vctxt->reader); - if (ret == -1) { - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlTextReaderIsEmptyElement()"); - goto internal_error; - } - if (ret) { - ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; - } - /* - * Register attributes. - */ - vctxt->nbAttrInfos = 0; - ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader); - if (ret == -1) { - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlTextReaderMoveToFirstAttribute()"); - goto internal_error; - } - if (ret == 1) { - do { - /* - * VAL TODO: How do we know that the reader works on a - * node tree, to be able to pass a node here? - */ - if (xmlSchemaValidatorPushAttribute(vctxt, NULL, - (const xmlChar *) xmlTextReaderLocalName(vctxt->reader), - xmlTextReaderNamespaceUri(vctxt->reader), 1, - xmlTextReaderValue(vctxt->reader), 1) == -1) { - - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlSchemaValidatorPushAttribute()"); - goto internal_error; - } - ret = xmlTextReaderMoveToNextAttribute(vctxt->reader); - if (ret == -1) { - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlTextReaderMoveToFirstAttribute()"); - goto internal_error; - } - } while (ret == 1); - /* - * Back to element position. - */ - ret = xmlTextReaderMoveToElement(vctxt->reader); - if (ret == -1) { - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlTextReaderMoveToElement()"); - goto internal_error; - } - } - /* - * Validate the element. - */ - ret= xmlSchemaValidateElem(vctxt); - if (ret != 0) { - if (ret == -1) { - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlSchemaValidateElem()"); - goto internal_error; - } - goto exit; - } - if (vctxt->depth == vctxt->skipDepth) { - int curDepth; - /* - * Skip all content. - */ - if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) { - ret = xmlTextReaderRead(vctxt->reader); - curDepth = xmlTextReaderDepth(vctxt->reader); - while ((ret == 1) && (curDepth != depth)) { - ret = xmlTextReaderRead(vctxt->reader); - curDepth = xmlTextReaderDepth(vctxt->reader); - } - if (ret < 0) { - /* - * VAL TODO: A reader error occured; what to do here? - */ - ret = 1; - goto exit; - } - } - goto leave_elem; - } - /* - * READER VAL TODO: Is an END_ELEM really never called - * if the elem is empty? - */ - if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) - goto leave_elem; - } else if (nodeType == END_ELEM) { - /* - * Process END of element. - */ -leave_elem: - ret = xmlSchemaValidatorPopElem(vctxt); - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlSchemaValidatorPopElem()"); - goto internal_error; - } - goto exit; - } - if (vctxt->depth >= 0) - ielem = vctxt->inode; - else - ielem = NULL; - } else if ((nodeType == XML_TEXT_NODE) || - (nodeType == XML_CDATA_SECTION_NODE) || - (nodeType == WHTSP) || - (nodeType == SIGN_WHTSP)) { - /* - * Process character content. - */ - xmlChar *value; - - if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP)) - nodeType = XML_TEXT_NODE; - - value = xmlTextReaderValue(vctxt->reader); - ret = xmlSchemaVPushText(vctxt, nodeType, BAD_CAST value, - -1, XML_SCHEMA_PUSH_TEXT_CREATED, &consumed); - if (! consumed) - xmlFree(value); - if (ret == -1) { - VERROR_INT("xmlSchemaVReaderWalk", - "calling xmlSchemaVPushText()"); - goto internal_error; - } - } else if ((nodeType == XML_ENTITY_NODE) || - (nodeType == XML_ENTITY_REF_NODE)) { - /* - * VAL TODO: What to do with entities? - */ - TODO - } - /* - * Read next node. - */ - ret = xmlTextReaderRead(vctxt->reader); - } while (ret == 1); - -exit: - return (ret); -internal_error: - return (-1); -} -#endif - -/************************************************************************ - * * - * SAX validation handlers * - * * - ************************************************************************/ - -/* -* Process text content. -*/ -static void -xmlSchemaSAXHandleText(void *ctx, - const xmlChar * ch, - int len) -{ - xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; - - if (vctxt->depth < 0) - return; - if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) - return; - if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) - vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; - if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE, ch, len, - XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) { - VERROR_INT("xmlSchemaSAXHandleCDataSection", - "calling xmlSchemaVPushText()"); - vctxt->err = -1; - xmlStopParser(vctxt->parserCtxt); - } -} - -/* -* Process CDATA content. -*/ -static void -xmlSchemaSAXHandleCDataSection(void *ctx, - const xmlChar * ch, - int len) -{ - xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; - - if (vctxt->depth < 0) - return; - if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) - return; - if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) - vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; - if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE, ch, len, - XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) { - VERROR_INT("xmlSchemaSAXHandleCDataSection", - "calling xmlSchemaVPushText()"); - vctxt->err = -1; - xmlStopParser(vctxt->parserCtxt); - } -} - -static void -xmlSchemaSAXHandleReference(void *ctx ATTRIBUTE_UNUSED, - const xmlChar * name ATTRIBUTE_UNUSED) -{ - xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; - - if (vctxt->depth < 0) - return; - if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) - return; - /* SAX VAL TODO: What to do here? */ - TODO -} - -static void -xmlSchemaSAXHandleStartElementNs(void *ctx, - const xmlChar * localname, - const xmlChar * prefix ATTRIBUTE_UNUSED, - const xmlChar * URI, - int nb_namespaces, - const xmlChar ** namespaces, - int nb_attributes, - int nb_defaulted ATTRIBUTE_UNUSED, - const xmlChar ** attributes) -{ - xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; - int ret; - xmlSchemaNodeInfoPtr ielem; - int i, j; - - /* - * SAX VAL TODO: What to do with nb_defaulted? - */ - /* - * Skip elements if inside a "skip" wildcard or invalid. - */ - vctxt->depth++; - if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) - return; - /* - * Push the element. - */ - if (xmlSchemaValidatorPushElem(vctxt) == -1) { - VERROR_INT("xmlSchemaSAXHandleStartElementNs", - "calling xmlSchemaValidatorPushElem()"); - goto internal_error; - } - ielem = vctxt->inode; - /* - * TODO: Is this OK? - */ - ielem->nodeLine = xmlSAX2GetLineNumber(vctxt->parserCtxt); - ielem->localName = localname; - ielem->nsName = URI; - ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; - /* - * Register namespaces on the elem info. - */ - if (nb_namespaces != 0) { - /* - * Although the parser builds its own namespace list, - * we have no access to it, so we'll use an own one. - */ - for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) { - /* - * Store prefix and namespace name. - */ - if (ielem->nsBindings == NULL) { - ielem->nsBindings = - (const xmlChar **) xmlMalloc(10 * - sizeof(const xmlChar *)); - if (ielem->nsBindings == NULL) { - xmlSchemaVErrMemory(vctxt, - "allocating namespace bindings for SAX validation", - NULL); - goto internal_error; - } - ielem->nbNsBindings = 0; - ielem->sizeNsBindings = 5; - } else if (ielem->sizeNsBindings <= ielem->nbNsBindings) { - ielem->sizeNsBindings *= 2; - ielem->nsBindings = - (const xmlChar **) xmlRealloc( - (void *) ielem->nsBindings, - ielem->sizeNsBindings * 2 * sizeof(const xmlChar *)); - if (ielem->nsBindings == NULL) { - xmlSchemaVErrMemory(vctxt, - "re-allocating namespace bindings for SAX validation", - NULL); - goto internal_error; - } - } - - ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[j]; - if (namespaces[j+1][0] == 0) { - /* - * Handle xmlns="". - */ - ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = NULL; - } else - ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = - namespaces[j+1]; - ielem->nbNsBindings++; - } - } - /* - * Register attributes. - * SAX VAL TODO: We are not adding namespace declaration - * attributes yet. - */ - if (nb_attributes != 0) { - xmlChar *value; - - for (j = 0, i = 0; i < nb_attributes; i++, j += 5) { - /* - * Duplicate the value. - */ - value = xmlStrndup(attributes[j+3], - attributes[j+4] - attributes[j+3]); - /* - * TODO: Set the node line. - */ - ret = xmlSchemaValidatorPushAttribute(vctxt, - NULL, ielem->nodeLine, attributes[j], attributes[j+2], 0, - value, 1); - if (ret == -1) { - VERROR_INT("xmlSchemaSAXHandleStartElementNs", - "calling xmlSchemaValidatorPushAttribute()"); - goto internal_error; - } - } - } - /* - * Validate the element. - */ - ret = xmlSchemaValidateElem(vctxt); - if (ret != 0) { - if (ret == -1) { - VERROR_INT("xmlSchemaSAXHandleStartElementNs", - "calling xmlSchemaValidateElem()"); - goto internal_error; - } - goto exit; - } - -exit: - return; -internal_error: - vctxt->err = -1; - xmlStopParser(vctxt->parserCtxt); - return; -} - -static void -xmlSchemaSAXHandleEndElementNs(void *ctx, - const xmlChar * localname ATTRIBUTE_UNUSED, - const xmlChar * prefix ATTRIBUTE_UNUSED, - const xmlChar * URI ATTRIBUTE_UNUSED) -{ - xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; - int res; - - /* - * Skip elements if inside a "skip" wildcard or if invalid. - */ - if (vctxt->skipDepth != -1) { - if (vctxt->depth > vctxt->skipDepth) { - vctxt->depth--; - return; - } else - vctxt->skipDepth = -1; - } - /* - * SAX VAL TODO: Just a temporary check. - */ - if ((!xmlStrEqual(vctxt->inode->localName, localname)) || - (!xmlStrEqual(vctxt->inode->nsName, URI))) { - VERROR_INT("xmlSchemaSAXHandleEndElementNs", - "elem pop mismatch"); - } - res = xmlSchemaValidatorPopElem(vctxt); - if (res != 0) { - if (res < 0) { - VERROR_INT("xmlSchemaSAXHandleEndElementNs", - "calling xmlSchemaValidatorPopElem()"); - goto internal_error; - } - goto exit; - } -exit: - return; -internal_error: - vctxt->err = -1; - xmlStopParser(vctxt->parserCtxt); - return; -} - -/************************************************************************ - * * - * Validation interfaces * - * * - ************************************************************************/ - -/** - * xmlSchemaNewValidCtxt: - * @schema: a precompiled XML Schemas - * - * Create an XML Schemas validation context based on the given schema. - * - * Returns the validation context or NULL in case of error - */ -xmlSchemaValidCtxtPtr -xmlSchemaNewValidCtxt(xmlSchemaPtr schema) -{ - xmlSchemaValidCtxtPtr ret; - - ret = (xmlSchemaValidCtxtPtr) xmlMalloc(sizeof(xmlSchemaValidCtxt)); - if (ret == NULL) { - xmlSchemaVErrMemory(NULL, "allocating validation context", NULL); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaValidCtxt)); - ret->type = XML_SCHEMA_CTXT_VALIDATOR; - ret->dict = xmlDictCreate(); - ret->nodeQNames = xmlSchemaItemListCreate(); - ret->schema = schema; - return (ret); -} - -/** - * xmlSchemaClearValidCtxt: - * @ctxt: the schema validation context - * - * Free the resources associated to the schema validation context; - * leaves some fields alive intended for reuse of the context. - */ -static void -xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt) -{ - if (vctxt == NULL) - return; - - /* - * TODO: Should we clear the flags? - * Might be problematic if one reuses the context - * and assumes that the options remain the same. - */ - vctxt->flags = 0; - vctxt->validationRoot = NULL; - vctxt->doc = NULL; -#ifdef LIBXML_READER_ENABLED - vctxt->reader = NULL; -#endif - vctxt->hasKeyrefs = 0; - - if (vctxt->value != NULL) { - xmlSchemaFreeValue(vctxt->value); - vctxt->value = NULL; - } - /* - * Augmented IDC information. - */ - if (vctxt->aidcs != NULL) { - xmlSchemaIDCAugPtr cur = vctxt->aidcs, next; - do { - next = cur->next; - xmlFree(cur); - cur = next; - } while (cur != NULL); - vctxt->aidcs = NULL; - } - if (vctxt->idcMatcherCache != NULL) { - xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp; - - while (matcher) { - tmp = matcher; - matcher = matcher->nextCached; - xmlSchemaIDCFreeMatcherList(tmp); - } - vctxt->idcMatcherCache = NULL; - } - - - if (vctxt->idcNodes != NULL) { - int i; - xmlSchemaPSVIIDCNodePtr item; - - for (i = 0; i < vctxt->nbIdcNodes; i++) { - item = vctxt->idcNodes[i]; - xmlFree(item->keys); - xmlFree(item); - } - xmlFree(vctxt->idcNodes); - vctxt->idcNodes = NULL; - vctxt->nbIdcNodes = 0; - vctxt->sizeIdcNodes = 0; - } - /* - * Note that we won't delete the XPath state pool here. - */ - if (vctxt->xpathStates != NULL) { - xmlSchemaFreeIDCStateObjList(vctxt->xpathStates); - vctxt->xpathStates = NULL; - } - /* - * Attribute info. - */ - if (vctxt->nbAttrInfos != 0) { - xmlSchemaClearAttrInfos(vctxt); - } - /* - * Element info. - */ - if (vctxt->elemInfos != NULL) { - int i; - xmlSchemaNodeInfoPtr ei; - - for (i = 0; i < vctxt->sizeElemInfos; i++) { - ei = vctxt->elemInfos[i]; - if (ei == NULL) - break; - xmlSchemaClearElemInfo(vctxt, ei); - } - } - xmlSchemaItemListClear(vctxt->nodeQNames); - /* Recreate the dict. */ - xmlDictFree(vctxt->dict); - /* - * TODO: Is is save to recreate it? Do we have a scenario - * where the user provides the dict? - */ - vctxt->dict = xmlDictCreate(); -} - -/** - * xmlSchemaFreeValidCtxt: - * @ctxt: the schema validation context - * - * Free the resources associated to the schema validation context - */ -void -xmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt) -{ - if (ctxt == NULL) - return; - if (ctxt->value != NULL) - xmlSchemaFreeValue(ctxt->value); - if (ctxt->pctxt != NULL) - xmlSchemaFreeParserCtxt(ctxt->pctxt); - if (ctxt->idcNodes != NULL) { - int i; - xmlSchemaPSVIIDCNodePtr item; - - for (i = 0; i < ctxt->nbIdcNodes; i++) { - item = ctxt->idcNodes[i]; - xmlFree(item->keys); - xmlFree(item); - } - xmlFree(ctxt->idcNodes); - } - if (ctxt->idcKeys != NULL) { - int i; - for (i = 0; i < ctxt->nbIdcKeys; i++) - xmlSchemaIDCFreeKey(ctxt->idcKeys[i]); - xmlFree(ctxt->idcKeys); - } - - if (ctxt->xpathStates != NULL) { - xmlSchemaFreeIDCStateObjList(ctxt->xpathStates); - ctxt->xpathStates = NULL; - } - if (ctxt->xpathStatePool != NULL) { - xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool); - ctxt->xpathStatePool = NULL; - } - - /* - * Augmented IDC information. - */ - if (ctxt->aidcs != NULL) { - xmlSchemaIDCAugPtr cur = ctxt->aidcs, next; - do { - next = cur->next; - xmlFree(cur); - cur = next; - } while (cur != NULL); - } - if (ctxt->attrInfos != NULL) { - int i; - xmlSchemaAttrInfoPtr attr; - - /* Just a paranoid call to the cleanup. */ - if (ctxt->nbAttrInfos != 0) - xmlSchemaClearAttrInfos(ctxt); - for (i = 0; i < ctxt->sizeAttrInfos; i++) { - attr = ctxt->attrInfos[i]; - xmlFree(attr); - } - xmlFree(ctxt->attrInfos); - } - if (ctxt->elemInfos != NULL) { - int i; - xmlSchemaNodeInfoPtr ei; - - for (i = 0; i < ctxt->sizeElemInfos; i++) { - ei = ctxt->elemInfos[i]; - if (ei == NULL) - break; - xmlSchemaClearElemInfo(ctxt, ei); - xmlFree(ei); - } - xmlFree(ctxt->elemInfos); - } - if (ctxt->nodeQNames != NULL) - xmlSchemaItemListFree(ctxt->nodeQNames); - if (ctxt->dict != NULL) - xmlDictFree(ctxt->dict); - xmlFree(ctxt); -} - -/** - * xmlSchemaIsValid: - * @ctxt: the schema validation context - * - * Check if any error was detected during validation. - * - * Returns 1 if valid so far, 0 if errors were detected, and -1 in case - * of internal error. - */ -int -xmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt) -{ - if (ctxt == NULL) - return(-1); - return(ctxt->err == 0); -} - -/** - * xmlSchemaSetValidErrors: - * @ctxt: a schema validation context - * @err: the error function - * @warn: the warning function - * @ctx: the functions context - * - * Set the error and warning callback informations - */ -void -xmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt, - xmlSchemaValidityErrorFunc err, - xmlSchemaValidityWarningFunc warn, void *ctx) -{ - if (ctxt == NULL) - return; - ctxt->error = err; - ctxt->warning = warn; - ctxt->errCtxt = ctx; - if (ctxt->pctxt != NULL) - xmlSchemaSetParserErrors(ctxt->pctxt, err, warn, ctx); -} - -/** - * xmlSchemaSetValidStructuredErrors: - * @ctxt: a schema validation context - * @serror: the structured error function - * @ctx: the functions context - * - * Set the structured error callback - */ -void -xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt, - xmlStructuredErrorFunc serror, void *ctx) -{ - if (ctxt == NULL) - return; - ctxt->serror = serror; - ctxt->error = NULL; - ctxt->warning = NULL; - ctxt->errCtxt = ctx; - if (ctxt->pctxt != NULL) - xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror, ctx); -} - -/** - * xmlSchemaGetValidErrors: - * @ctxt: a XML-Schema validation context - * @err: the error function result - * @warn: the warning function result - * @ctx: the functions context result - * - * Get the error and warning callback informations - * - * Returns -1 in case of error and 0 otherwise - */ -int -xmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt, - xmlSchemaValidityErrorFunc * err, - xmlSchemaValidityWarningFunc * warn, void **ctx) -{ - if (ctxt == NULL) - return (-1); - if (err != NULL) - *err = ctxt->error; - if (warn != NULL) - *warn = ctxt->warning; - if (ctx != NULL) - *ctx = ctxt->errCtxt; - return (0); -} - - -/** - * xmlSchemaSetValidOptions: - * @ctxt: a schema validation context - * @options: a combination of xmlSchemaValidOption - * - * Sets the options to be used during the validation. - * - * Returns 0 in case of success, -1 in case of an - * API error. - */ -int -xmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt, - int options) - -{ - int i; - - if (ctxt == NULL) - return (-1); - /* - * WARNING: Change the start value if adding to the - * xmlSchemaValidOption. - * TODO: Is there an other, more easy to maintain, - * way? - */ - for (i = 1; i < (int) sizeof(int) * 8; i++) { - if (options & 1<<i) - return (-1); - } - ctxt->options = options; - return (0); -} - -/** - * xmlSchemaValidCtxtGetOptions: - * @ctxt: a schema validation context - * - * Get the validation context options. - * - * Returns the option combination or -1 on error. - */ -int -xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt) - -{ - if (ctxt == NULL) - return (-1); - else - return (ctxt->options); -} - -static int -xmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt) -{ - xmlAttrPtr attr; - int ret = 0; - xmlSchemaNodeInfoPtr ielem = NULL; - xmlNodePtr node, valRoot; - const xmlChar *nsName; - - /* DOC VAL TODO: Move this to the start function. */ - valRoot = xmlDocGetRootElement(vctxt->doc); - if (valRoot == NULL) { - /* VAL TODO: Error code? */ - VERROR(1, NULL, "The document has no document element"); - return (1); - } - vctxt->depth = -1; - vctxt->validationRoot = valRoot; - node = valRoot; - while (node != NULL) { - if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) - goto next_sibling; - if (node->type == XML_ELEMENT_NODE) { - - /* - * Init the node-info. - */ - vctxt->depth++; - if (xmlSchemaValidatorPushElem(vctxt) == -1) - goto internal_error; - ielem = vctxt->inode; - ielem->node = node; - ielem->nodeLine = node->line; - ielem->localName = node->name; - if (node->ns != NULL) - ielem->nsName = node->ns->href; - ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; - /* - * Register attributes. - * DOC VAL TODO: We do not register namespace declaration - * attributes yet. - */ - vctxt->nbAttrInfos = 0; - if (node->properties != NULL) { - attr = node->properties; - do { - if (attr->ns != NULL) - nsName = attr->ns->href; - else - nsName = NULL; - ret = xmlSchemaValidatorPushAttribute(vctxt, - (xmlNodePtr) attr, - /* - * Note that we give it the line number of the - * parent element. - */ - ielem->nodeLine, - attr->name, nsName, 0, - xmlNodeListGetString(attr->doc, attr->children, 1), 1); - if (ret == -1) { - VERROR_INT("xmlSchemaDocWalk", - "calling xmlSchemaValidatorPushAttribute()"); - goto internal_error; - } - attr = attr->next; - } while (attr); - } - /* - * Validate the element. - */ - ret = xmlSchemaValidateElem(vctxt); - if (ret != 0) { - if (ret == -1) { - VERROR_INT("xmlSchemaDocWalk", - "calling xmlSchemaValidateElem()"); - goto internal_error; - } - /* - * Don't stop validation; just skip the content - * of this element. - */ - goto leave_node; - } - if ((vctxt->skipDepth != -1) && - (vctxt->depth >= vctxt->skipDepth)) - goto leave_node; - } else if ((node->type == XML_TEXT_NODE) || - (node->type == XML_CDATA_SECTION_NODE)) { - /* - * Process character content. - */ - if ((ielem != NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)) - ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; - ret = xmlSchemaVPushText(vctxt, node->type, node->content, - -1, XML_SCHEMA_PUSH_TEXT_PERSIST, NULL); - if (ret < 0) { - VERROR_INT("xmlSchemaVDocWalk", - "calling xmlSchemaVPushText()"); - goto internal_error; - } - /* - * DOC VAL TODO: Should we skip further validation of the - * element content here? - */ - } else if ((node->type == XML_ENTITY_NODE) || - (node->type == XML_ENTITY_REF_NODE)) { - /* - * DOC VAL TODO: What to do with entities? - */ - VERROR_INT("xmlSchemaVDocWalk", - "there is at least one entity reference in the node-tree " - "currently being validated. Processing of entities with " - "this XML Schema processor is not supported (yet). Please " - "substitute entities before validation."); - goto internal_error; - } else { - goto leave_node; - /* - * DOC VAL TODO: XInclude nodes, etc. - */ - } - /* - * Walk the doc. - */ - if (node->children != NULL) { - node = node->children; - continue; - } -leave_node: - if (node->type == XML_ELEMENT_NODE) { - /* - * Leaving the scope of an element. - */ - if (node != vctxt->inode->node) { - VERROR_INT("xmlSchemaVDocWalk", - "element position mismatch"); - goto internal_error; - } - ret = xmlSchemaValidatorPopElem(vctxt); - if (ret != 0) { - if (ret < 0) { - VERROR_INT("xmlSchemaVDocWalk", - "calling xmlSchemaValidatorPopElem()"); - goto internal_error; - } - } - if (node == valRoot) - goto exit; - } -next_sibling: - if (node->next != NULL) - node = node->next; - else { - node = node->parent; - goto leave_node; - } - } - -exit: - return (ret); -internal_error: - return (-1); -} - -static int -xmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) { - /* - * Some initialization. - */ - vctxt->err = 0; - vctxt->nberrors = 0; - vctxt->depth = -1; - vctxt->skipDepth = -1; - vctxt->xsiAssemble = 0; - vctxt->hasKeyrefs = 0; -#ifdef ENABLE_IDC_NODE_TABLES_TEST - vctxt->createIDCNodeTables = 1; -#else - vctxt->createIDCNodeTables = 0; -#endif - /* - * Create a schema + parser if necessary. - */ - if (vctxt->schema == NULL) { - xmlSchemaParserCtxtPtr pctxt; - - vctxt->xsiAssemble = 1; - /* - * If not schema was given then we will create a schema - * dynamically using XSI schema locations. - * - * Create the schema parser context. - */ - if ((vctxt->pctxt == NULL) && - (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1)) - return (-1); - pctxt = vctxt->pctxt; - pctxt->xsiAssemble = 1; - /* - * Create the schema. - */ - vctxt->schema = xmlSchemaNewSchema(pctxt); - if (vctxt->schema == NULL) - return (-1); - /* - * Create the schema construction context. - */ - pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict); - if (pctxt->constructor == NULL) - return(-1); - pctxt->constructor->mainSchema = vctxt->schema; - /* - * Take ownership of the constructor to be able to free it. - */ - pctxt->ownsConstructor = 1; - } - /* - * Augment the IDC definitions. - */ - if (vctxt->schema->idcDef != NULL) { - xmlHashScan(vctxt->schema->idcDef, - (xmlHashScanner) xmlSchemaAugmentIDC, vctxt); - } - return(0); -} - -static void -xmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) { - if (vctxt->xsiAssemble) { - if (vctxt->schema != NULL) { - xmlSchemaFree(vctxt->schema); - vctxt->schema = NULL; - } - } - xmlSchemaClearValidCtxt(vctxt); -} - -static int -xmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt) -{ - int ret = 0; - - if (xmlSchemaPreRun(vctxt) < 0) - return(-1); - - if (vctxt->doc != NULL) { - /* - * Tree validation. - */ - ret = xmlSchemaVDocWalk(vctxt); -#ifdef LIBXML_READER_ENABLED - } else if (vctxt->reader != NULL) { - /* - * XML Reader validation. - */ -#ifdef XML_SCHEMA_READER_ENABLED - ret = xmlSchemaVReaderWalk(vctxt); -#endif -#endif - } else if ((vctxt->sax != NULL) && (vctxt->parserCtxt != NULL)) { - /* - * SAX validation. - */ - ret = xmlParseDocument(vctxt->parserCtxt); - } else { - VERROR_INT("xmlSchemaVStart", - "no instance to validate"); - ret = -1; - } - - xmlSchemaPostRun(vctxt); - if (ret == 0) - ret = vctxt->err; - return (ret); -} - -/** - * xmlSchemaValidateOneElement: - * @ctxt: a schema validation context - * @elem: an element node - * - * Validate a branch of a tree, starting with the given @elem. - * - * Returns 0 if the element and its subtree is valid, a positive error - * code number otherwise and -1 in case of an internal or API error. - */ -int -xmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr elem) -{ - if ((ctxt == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE)) - return (-1); - - if (ctxt->schema == NULL) - return (-1); - - ctxt->doc = elem->doc; - ctxt->node = elem; - ctxt->validationRoot = elem; - return(xmlSchemaVStart(ctxt)); -} - -/** - * xmlSchemaValidateDoc: - * @ctxt: a schema validation context - * @doc: a parsed document tree - * - * Validate a document tree in memory. - * - * Returns 0 if the document is schemas valid, a positive error code - * number otherwise and -1 in case of internal or API error. - */ -int -xmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc) -{ - if ((ctxt == NULL) || (doc == NULL)) - return (-1); - - ctxt->doc = doc; - ctxt->node = xmlDocGetRootElement(doc); - if (ctxt->node == NULL) { - xmlSchemaCustomErr(ACTXT_CAST ctxt, - XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING, - (xmlNodePtr) doc, NULL, - "The document has no document element", NULL, NULL); - return (ctxt->err); - } - ctxt->validationRoot = ctxt->node; - return (xmlSchemaVStart(ctxt)); -} - - -/************************************************************************ - * * - * Function and data for SAX streaming API * - * * - ************************************************************************/ -typedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData; -typedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr; - -struct _xmlSchemaSplitSAXData { - xmlSAXHandlerPtr user_sax; - void *user_data; - xmlSchemaValidCtxtPtr ctxt; - xmlSAXHandlerPtr schemas_sax; -}; - -#define XML_SAX_PLUG_MAGIC 0xdc43ba21 - -struct _xmlSchemaSAXPlug { - unsigned int magic; - - /* the original callbacks informations */ - xmlSAXHandlerPtr *user_sax_ptr; - xmlSAXHandlerPtr user_sax; - void **user_data_ptr; - void *user_data; - - /* the block plugged back and validation informations */ - xmlSAXHandler schemas_sax; - xmlSchemaValidCtxtPtr ctxt; -}; - -/* All those functions just bounces to the user provided SAX handlers */ -static void -internalSubsetSplit(void *ctx, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->internalSubset != NULL)) - ctxt->user_sax->internalSubset(ctxt->user_data, name, ExternalID, - SystemID); -} - -static int -isStandaloneSplit(void *ctx) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->isStandalone != NULL)) - return(ctxt->user_sax->isStandalone(ctxt->user_data)); - return(0); -} - -static int -hasInternalSubsetSplit(void *ctx) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->hasInternalSubset != NULL)) - return(ctxt->user_sax->hasInternalSubset(ctxt->user_data)); - return(0); -} - -static int -hasExternalSubsetSplit(void *ctx) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->hasExternalSubset != NULL)) - return(ctxt->user_sax->hasExternalSubset(ctxt->user_data)); - return(0); -} - -static void -externalSubsetSplit(void *ctx, const xmlChar *name, - const xmlChar *ExternalID, const xmlChar *SystemID) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->internalSubset != NULL)) - ctxt->user_sax->internalSubset(ctxt->user_data, name, ExternalID, - SystemID); -} - -static xmlParserInputPtr -resolveEntitySplit(void *ctx, const xmlChar *publicId, const xmlChar *systemId) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->resolveEntity != NULL)) - return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId, - systemId)); - return(NULL); -} - -static xmlEntityPtr -getEntitySplit(void *ctx, const xmlChar *name) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->getEntity != NULL)) - return(ctxt->user_sax->getEntity(ctxt->user_data, name)); - return(NULL); -} - -static xmlEntityPtr -getParameterEntitySplit(void *ctx, const xmlChar *name) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->getParameterEntity != NULL)) - return(ctxt->user_sax->getParameterEntity(ctxt->user_data, name)); - return(NULL); -} - - -static void -entityDeclSplit(void *ctx, const xmlChar *name, int type, - const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->entityDecl != NULL)) - ctxt->user_sax->entityDecl(ctxt->user_data, name, type, publicId, - systemId, content); -} - -static void -attributeDeclSplit(void *ctx, const xmlChar * elem, - const xmlChar * name, int type, int def, - const xmlChar * defaultValue, xmlEnumerationPtr tree) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->attributeDecl != NULL)) { - ctxt->user_sax->attributeDecl(ctxt->user_data, elem, name, type, - def, defaultValue, tree); - } else { - xmlFreeEnumeration(tree); - } -} - -static void -elementDeclSplit(void *ctx, const xmlChar *name, int type, - xmlElementContentPtr content) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->elementDecl != NULL)) - ctxt->user_sax->elementDecl(ctxt->user_data, name, type, content); -} - -static void -notationDeclSplit(void *ctx, const xmlChar *name, - const xmlChar *publicId, const xmlChar *systemId) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->notationDecl != NULL)) - ctxt->user_sax->notationDecl(ctxt->user_data, name, publicId, - systemId); -} - -static void -unparsedEntityDeclSplit(void *ctx, const xmlChar *name, - const xmlChar *publicId, const xmlChar *systemId, - const xmlChar *notationName) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->unparsedEntityDecl != NULL)) - ctxt->user_sax->unparsedEntityDecl(ctxt->user_data, name, publicId, - systemId, notationName); -} - -static void -setDocumentLocatorSplit(void *ctx, xmlSAXLocatorPtr loc) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->setDocumentLocator != NULL)) - ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc); -} - -static void -startDocumentSplit(void *ctx) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->startDocument != NULL)) - ctxt->user_sax->startDocument(ctxt->user_data); -} - -static void -endDocumentSplit(void *ctx) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->endDocument != NULL)) - ctxt->user_sax->endDocument(ctxt->user_data); -} - -static void -processingInstructionSplit(void *ctx, const xmlChar *target, - const xmlChar *data) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->processingInstruction != NULL)) - ctxt->user_sax->processingInstruction(ctxt->user_data, target, data); -} - -static void -commentSplit(void *ctx, const xmlChar *value) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->comment != NULL)) - ctxt->user_sax->comment(ctxt->user_data, value); -} - -/* - * Varargs error callbacks to the user application, harder ... - */ - -static void XMLCDECL -warningSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->warning != NULL)) { - TODO - } -} -static void XMLCDECL -errorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->error != NULL)) { - TODO - } -} -static void XMLCDECL -fatalErrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->fatalError != NULL)) { - TODO - } -} - -/* - * Those are function where both the user handler and the schemas handler - * need to be called. - */ -static void -charactersSplit(void *ctx, const xmlChar *ch, int len) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if (ctxt == NULL) - return; - if ((ctxt->user_sax != NULL) && (ctxt->user_sax->characters != NULL)) - ctxt->user_sax->characters(ctxt->user_data, ch, len); - if (ctxt->ctxt != NULL) - xmlSchemaSAXHandleText(ctxt->ctxt, ch, len); -} - -static void -ignorableWhitespaceSplit(void *ctx, const xmlChar *ch, int len) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if (ctxt == NULL) - return; - if ((ctxt->user_sax != NULL) && - (ctxt->user_sax->ignorableWhitespace != NULL)) - ctxt->user_sax->ignorableWhitespace(ctxt->user_data, ch, len); - if (ctxt->ctxt != NULL) - xmlSchemaSAXHandleText(ctxt->ctxt, ch, len); -} - -static void -cdataBlockSplit(void *ctx, const xmlChar *value, int len) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if (ctxt == NULL) - return; - if ((ctxt->user_sax != NULL) && - (ctxt->user_sax->ignorableWhitespace != NULL)) - ctxt->user_sax->ignorableWhitespace(ctxt->user_data, value, len); - if (ctxt->ctxt != NULL) - xmlSchemaSAXHandleCDataSection(ctxt->ctxt, value, len); -} - -static void -referenceSplit(void *ctx, const xmlChar *name) -{ - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if (ctxt == NULL) - return; - if ((ctxt != NULL) && (ctxt->user_sax != NULL) && - (ctxt->user_sax->reference != NULL)) - ctxt->user_sax->reference(ctxt->user_data, name); - if (ctxt->ctxt != NULL) - xmlSchemaSAXHandleReference(ctxt->user_data, name); -} - -static void -startElementNsSplit(void *ctx, const xmlChar * localname, - const xmlChar * prefix, const xmlChar * URI, - int nb_namespaces, const xmlChar ** namespaces, - int nb_attributes, int nb_defaulted, - const xmlChar ** attributes) { - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if (ctxt == NULL) - return; - if ((ctxt->user_sax != NULL) && - (ctxt->user_sax->startElementNs != NULL)) - ctxt->user_sax->startElementNs(ctxt->user_data, localname, prefix, - URI, nb_namespaces, namespaces, - nb_attributes, nb_defaulted, - attributes); - if (ctxt->ctxt != NULL) - xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname, prefix, - URI, nb_namespaces, namespaces, - nb_attributes, nb_defaulted, - attributes); -} - -static void -endElementNsSplit(void *ctx, const xmlChar * localname, - const xmlChar * prefix, const xmlChar * URI) { - xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; - if (ctxt == NULL) - return; - if ((ctxt->user_sax != NULL) && - (ctxt->user_sax->endElementNs != NULL)) - ctxt->user_sax->endElementNs(ctxt->user_data, localname, prefix, URI); - if (ctxt->ctxt != NULL) - xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname, prefix, URI); -} - -/** - * xmlSchemaSAXPlug: - * @ctxt: a schema validation context - * @sax: a pointer to the original xmlSAXHandlerPtr - * @user_data: a pointer to the original SAX user data pointer - * - * Plug a SAX based validation layer in a SAX parsing event flow. - * The original @saxptr and @dataptr data are replaced by new pointers - * but the calls to the original will be maintained. - * - * Returns a pointer to a data structure needed to unplug the validation layer - * or NULL in case of errors. - */ -xmlSchemaSAXPlugPtr -xmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt, - xmlSAXHandlerPtr *sax, void **user_data) -{ - xmlSchemaSAXPlugPtr ret; - xmlSAXHandlerPtr old_sax; - - if ((ctxt == NULL) || (sax == NULL) || (user_data == NULL)) - return(NULL); - - /* - * We only allow to plug into SAX2 event streams - */ - old_sax = *sax; - if ((old_sax != NULL) && (old_sax->initialized != XML_SAX2_MAGIC)) - return(NULL); - if ((old_sax != NULL) && - (old_sax->startElementNs == NULL) && (old_sax->endElementNs == NULL) && - ((old_sax->startElement != NULL) || (old_sax->endElement != NULL))) - return(NULL); - - /* - * everything seems right allocate the local data needed for that layer - */ - ret = (xmlSchemaSAXPlugPtr) xmlMalloc(sizeof(xmlSchemaSAXPlugStruct)); - if (ret == NULL) { - return(NULL); - } - memset(ret, 0, sizeof(xmlSchemaSAXPlugStruct)); - ret->magic = XML_SAX_PLUG_MAGIC; - ret->schemas_sax.initialized = XML_SAX2_MAGIC; - ret->ctxt = ctxt; - ret->user_sax_ptr = sax; - ret->user_sax = old_sax; - if (old_sax == NULL) { - /* - * go direct, no need for the split block and functions. - */ - ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs; - ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs; - /* - * Note that we use the same text-function for both, to prevent - * the parser from testing for ignorable whitespace. - */ - ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText; - ret->schemas_sax.characters = xmlSchemaSAXHandleText; - - ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection; - ret->schemas_sax.reference = xmlSchemaSAXHandleReference; - - ret->user_data = ctxt; - *user_data = ctxt; - } else { - /* - * for each callback unused by Schemas initialize it to the Split - * routine only if non NULL in the user block, this can speed up - * things at the SAX level. - */ - if (old_sax->internalSubset != NULL) - ret->schemas_sax.internalSubset = internalSubsetSplit; - if (old_sax->isStandalone != NULL) - ret->schemas_sax.isStandalone = isStandaloneSplit; - if (old_sax->hasInternalSubset != NULL) - ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit; - if (old_sax->hasExternalSubset != NULL) - ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit; - if (old_sax->resolveEntity != NULL) - ret->schemas_sax.resolveEntity = resolveEntitySplit; - if (old_sax->getEntity != NULL) - ret->schemas_sax.getEntity = getEntitySplit; - if (old_sax->entityDecl != NULL) - ret->schemas_sax.entityDecl = entityDeclSplit; - if (old_sax->notationDecl != NULL) - ret->schemas_sax.notationDecl = notationDeclSplit; - if (old_sax->attributeDecl != NULL) - ret->schemas_sax.attributeDecl = attributeDeclSplit; - if (old_sax->elementDecl != NULL) - ret->schemas_sax.elementDecl = elementDeclSplit; - if (old_sax->unparsedEntityDecl != NULL) - ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit; - if (old_sax->setDocumentLocator != NULL) - ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit; - if (old_sax->startDocument != NULL) - ret->schemas_sax.startDocument = startDocumentSplit; - if (old_sax->endDocument != NULL) - ret->schemas_sax.endDocument = endDocumentSplit; - if (old_sax->processingInstruction != NULL) - ret->schemas_sax.processingInstruction = processingInstructionSplit; - if (old_sax->comment != NULL) - ret->schemas_sax.comment = commentSplit; - if (old_sax->warning != NULL) - ret->schemas_sax.warning = warningSplit; - if (old_sax->error != NULL) - ret->schemas_sax.error = errorSplit; - if (old_sax->fatalError != NULL) - ret->schemas_sax.fatalError = fatalErrorSplit; - if (old_sax->getParameterEntity != NULL) - ret->schemas_sax.getParameterEntity = getParameterEntitySplit; - if (old_sax->externalSubset != NULL) - ret->schemas_sax.externalSubset = externalSubsetSplit; - - /* - * the 6 schemas callback have to go to the splitter functions - * Note that we use the same text-function for ignorableWhitespace - * if possible, to prevent the parser from testing for ignorable - * whitespace. - */ - ret->schemas_sax.characters = charactersSplit; - if ((old_sax->ignorableWhitespace != NULL) && - (old_sax->ignorableWhitespace != old_sax->characters)) - ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit; - else - ret->schemas_sax.ignorableWhitespace = charactersSplit; - ret->schemas_sax.cdataBlock = cdataBlockSplit; - ret->schemas_sax.reference = referenceSplit; - ret->schemas_sax.startElementNs = startElementNsSplit; - ret->schemas_sax.endElementNs = endElementNsSplit; - - ret->user_data_ptr = user_data; - ret->user_data = *user_data; - *user_data = ret; - } - - /* - * plug the pointers back. - */ - *sax = &(ret->schemas_sax); - ctxt->sax = *sax; - ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM; - xmlSchemaPreRun(ctxt); - return(ret); -} - -/** - * xmlSchemaSAXUnplug: - * @plug: a data structure returned by xmlSchemaSAXPlug - * - * Unplug a SAX based validation layer in a SAX parsing event flow. - * The original pointers used in the call are restored. - * - * Returns 0 in case of success and -1 in case of failure. - */ -int -xmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug) -{ - xmlSAXHandlerPtr *sax; - void **user_data; - - if ((plug == NULL) || (plug->magic != XML_SAX_PLUG_MAGIC)) - return(-1); - plug->magic = 0; - - xmlSchemaPostRun(plug->ctxt); - /* restore the data */ - sax = plug->user_sax_ptr; - *sax = plug->user_sax; - if (plug->user_sax != NULL) { - user_data = plug->user_data_ptr; - *user_data = plug->user_data; - } - - /* free and return */ - xmlFree(plug); - return(0); -} - -/** - * xmlSchemaValidateStream: - * @ctxt: a schema validation context - * @input: the input to use for reading the data - * @enc: an optional encoding information - * @sax: a SAX handler for the resulting events - * @user_data: the context to provide to the SAX handler. - * - * Validate an input based on a flow of SAX event from the parser - * and forward the events to the @sax handler with the provided @user_data - * the user provided @sax handler must be a SAX2 one. - * - * Returns 0 if the document is schemas valid, a positive error code - * number otherwise and -1 in case of internal or API error. - */ -int -xmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt, - xmlParserInputBufferPtr input, xmlCharEncoding enc, - xmlSAXHandlerPtr sax, void *user_data) -{ - xmlSchemaSAXPlugPtr plug = NULL; - xmlSAXHandlerPtr old_sax = NULL; - xmlParserCtxtPtr pctxt = NULL; - xmlParserInputPtr inputStream = NULL; - int ret; - - if ((ctxt == NULL) || (input == NULL)) - return (-1); - - /* - * prepare the parser - */ - pctxt = xmlNewParserCtxt(); - if (pctxt == NULL) - return (-1); - old_sax = pctxt->sax; - pctxt->sax = sax; - pctxt->userData = user_data; -#if 0 - if (options) - xmlCtxtUseOptions(pctxt, options); -#endif - pctxt->linenumbers = 1; - - inputStream = xmlNewIOInputStream(pctxt, input, enc);; - if (inputStream == NULL) { - ret = -1; - goto done; - } - inputPush(pctxt, inputStream); - ctxt->parserCtxt = pctxt; - ctxt->input = input; - - /* - * Plug the validation and launch the parsing - */ - plug = xmlSchemaSAXPlug(ctxt, &(pctxt->sax), &(pctxt->userData)); - if (plug == NULL) { - ret = -1; - goto done; - } - ctxt->input = input; - ctxt->enc = enc; - ctxt->sax = pctxt->sax; - ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM; - ret = xmlSchemaVStart(ctxt); - - if ((ret == 0) && (! ctxt->parserCtxt->wellFormed)) { - ret = ctxt->parserCtxt->errNo; - if (ret == 0) - ret = 1; - } - -done: - ctxt->parserCtxt = NULL; - ctxt->sax = NULL; - ctxt->input = NULL; - if (plug != NULL) { - xmlSchemaSAXUnplug(plug); - } - /* cleanup */ - if (pctxt != NULL) { - pctxt->sax = old_sax; - xmlFreeParserCtxt(pctxt); - } - return (ret); -} - -/** - * xmlSchemaValidateFile: - * @ctxt: a schema validation context - * @filename: the URI of the instance - * @options: a future set of options, currently unused - * - * Do a schemas validation of the given resource, it will use the - * SAX streamable validation internally. - * - * Returns 0 if the document is valid, a positive error code - * number otherwise and -1 in case of an internal or API error. - */ -int -xmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt, - const char * filename, - int options ATTRIBUTE_UNUSED) -{ - int ret; - xmlParserInputBufferPtr input; - - if ((ctxt == NULL) || (filename == NULL)) - return (-1); - - input = xmlParserInputBufferCreateFilename(filename, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (-1); - ret = xmlSchemaValidateStream(ctxt, input, XML_CHAR_ENCODING_NONE, - NULL, NULL); - return (ret); -} - -#define bottom_xmlschemas -#include "elfgcchack.h" -#endif /* LIBXML_SCHEMAS_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/xmlschemastypes.c b/ThirdParty/libxml2/vtklibxml2/xmlschemastypes.c deleted file mode 100644 index 2964701a703..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlschemastypes.c +++ /dev/null @@ -1,6113 +0,0 @@ -/* - * schemastypes.c : implementation of the XML Schema Datatypes - * definition and validity checking - * - * See Copyright for the status of this software. - * - * Daniel Veillard <veillard@redhat.com> - */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_SCHEMAS_ENABLED - -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/parserInternals.h> -#include <libxml/hash.h> -#include <libxml/valid.h> -#include <libxml/xpath.h> -#include <libxml/uri.h> - -#include <libxml/xmlschemas.h> -#include <libxml/schemasInternals.h> -#include <libxml/xmlschemastypes.h> - -#ifdef HAVE_MATH_H -#include <math.h> -#endif -#ifdef HAVE_FLOAT_H -#include <float.h> -#endif - -#define DEBUG - -#ifndef LIBXML_XPATH_ENABLED -extern double xmlXPathNAN; -extern double xmlXPathPINF; -extern double xmlXPathNINF; -#endif - -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -#define XML_SCHEMAS_NAMESPACE_NAME \ - (const xmlChar *)"http://www.w3.org/2001/XMLSchema" - -#define IS_WSP_REPLACE_CH(c) ((((c) == 0x9) || ((c) == 0xa)) || \ - ((c) == 0xd)) - -#define IS_WSP_SPACE_CH(c) ((c) == 0x20) - -#define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c) - -/* Date value */ -typedef struct _xmlSchemaValDate xmlSchemaValDate; -typedef xmlSchemaValDate *xmlSchemaValDatePtr; -struct _xmlSchemaValDate { - long year; - unsigned int mon :4; /* 1 <= mon <= 12 */ - unsigned int day :5; /* 1 <= day <= 31 */ - unsigned int hour :5; /* 0 <= hour <= 23 */ - unsigned int min :6; /* 0 <= min <= 59 */ - double sec; - unsigned int tz_flag :1; /* is tzo explicitly set? */ - signed int tzo :12; /* -1440 <= tzo <= 1440; - currently only -840 to +840 are needed */ -}; - -/* Duration value */ -typedef struct _xmlSchemaValDuration xmlSchemaValDuration; -typedef xmlSchemaValDuration *xmlSchemaValDurationPtr; -struct _xmlSchemaValDuration { - long mon; /* mon stores years also */ - long day; - double sec; /* sec stores min and hour also */ -}; - -typedef struct _xmlSchemaValDecimal xmlSchemaValDecimal; -typedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr; -struct _xmlSchemaValDecimal { - /* would use long long but not portable */ - unsigned long lo; - unsigned long mi; - unsigned long hi; - unsigned int extra; - unsigned int sign:1; - unsigned int frac:7; - unsigned int total:8; -}; - -typedef struct _xmlSchemaValQName xmlSchemaValQName; -typedef xmlSchemaValQName *xmlSchemaValQNamePtr; -struct _xmlSchemaValQName { - xmlChar *name; - xmlChar *uri; -}; - -typedef struct _xmlSchemaValHex xmlSchemaValHex; -typedef xmlSchemaValHex *xmlSchemaValHexPtr; -struct _xmlSchemaValHex { - xmlChar *str; - unsigned int total; -}; - -typedef struct _xmlSchemaValBase64 xmlSchemaValBase64; -typedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr; -struct _xmlSchemaValBase64 { - xmlChar *str; - unsigned int total; -}; - -struct _xmlSchemaVal { - xmlSchemaValType type; - struct _xmlSchemaVal *next; - union { - xmlSchemaValDecimal decimal; - xmlSchemaValDate date; - xmlSchemaValDuration dur; - xmlSchemaValQName qname; - xmlSchemaValHex hex; - xmlSchemaValBase64 base64; - float f; - double d; - int b; - xmlChar *str; - } value; -}; - -static int xmlSchemaTypesInitialized = 0; -static xmlHashTablePtr xmlSchemaTypesBank = NULL; - -/* - * Basic types - */ -static xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL; - -/* - * Derived types - */ -static xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL; -static xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL; - -/************************************************************************ - * * - * Datatype error handlers * - * * - ************************************************************************/ -/** - * xmlSchemaTypeErrMemory: - * @extra: extra informations - * - * Handle an out of memory condition - */ -static void -xmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra) -{ - __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra); -} - -/************************************************************************ - * * - * Base types support * - * * - ************************************************************************/ - -/** - * xmlSchemaNewValue: - * @type: the value type - * - * Allocate a new simple type value - * - * Returns a pointer to the new value or NULL in case of error - */ -static xmlSchemaValPtr -xmlSchemaNewValue(xmlSchemaValType type) { - xmlSchemaValPtr value; - - value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); - if (value == NULL) { - return(NULL); - } - memset(value, 0, sizeof(xmlSchemaVal)); - value->type = type; - return(value); -} - -static xmlSchemaFacetPtr -xmlSchemaNewMinLengthFacet(int value) -{ - xmlSchemaFacetPtr ret; - - ret = xmlSchemaNewFacet(); - if (ret == NULL) { - return(NULL); - } - ret->type = XML_SCHEMA_FACET_MINLENGTH; - ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER); - ret->val->value.decimal.lo = value; - return (ret); -} - -/* - * xmlSchemaInitBasicType: - * @name: the type name - * @type: the value type associated - * - * Initialize one primitive built-in type - */ -static xmlSchemaTypePtr -xmlSchemaInitBasicType(const char *name, xmlSchemaValType type, - xmlSchemaTypePtr baseType) { - xmlSchemaTypePtr ret; - - ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); - if (ret == NULL) { - xmlSchemaTypeErrMemory(NULL, "could not initialize basic types"); - return(NULL); - } - memset(ret, 0, sizeof(xmlSchemaType)); - ret->name = (const xmlChar *)name; - ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME; - ret->type = XML_SCHEMA_TYPE_BASIC; - ret->baseType = baseType; - ret->contentType = XML_SCHEMA_CONTENT_BASIC; - /* - * Primitive types. - */ - switch (type) { - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_DECIMAL: - case XML_SCHEMAS_DATE: - case XML_SCHEMAS_DATETIME: - case XML_SCHEMAS_TIME: - case XML_SCHEMAS_GYEAR: - case XML_SCHEMAS_GYEARMONTH: - case XML_SCHEMAS_GMONTH: - case XML_SCHEMAS_GMONTHDAY: - case XML_SCHEMAS_GDAY: - case XML_SCHEMAS_DURATION: - case XML_SCHEMAS_FLOAT: - case XML_SCHEMAS_DOUBLE: - case XML_SCHEMAS_BOOLEAN: - case XML_SCHEMAS_ANYURI: - case XML_SCHEMAS_HEXBINARY: - case XML_SCHEMAS_BASE64BINARY: - case XML_SCHEMAS_QNAME: - case XML_SCHEMAS_NOTATION: - ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE; - break; - default: - break; - } - /* - * Set variety. - */ - switch (type) { - case XML_SCHEMAS_ANYTYPE: - case XML_SCHEMAS_ANYSIMPLETYPE: - break; - case XML_SCHEMAS_IDREFS: - case XML_SCHEMAS_NMTOKENS: - case XML_SCHEMAS_ENTITIES: - ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; - ret->facets = xmlSchemaNewMinLengthFacet(1); - ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; - break; - default: - ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; - break; - } - xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, - XML_SCHEMAS_NAMESPACE_NAME, ret); - ret->builtInType = type; - return(ret); -} - -/* -* WARNING: Those type reside normally in xmlschemas.c but are -* redefined here locally in oder of being able to use them for xs:anyType- -* TODO: Remove those definition if we move the types to a header file. -* TODO: Always keep those structs up-to-date with the originals. -*/ -#define UNBOUNDED (1 << 30) - -typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; -typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; -struct _xmlSchemaTreeItem { - xmlSchemaTypeType type; - xmlSchemaAnnotPtr annot; - xmlSchemaTreeItemPtr next; - xmlSchemaTreeItemPtr children; -}; - -typedef struct _xmlSchemaParticle xmlSchemaParticle; -typedef xmlSchemaParticle *xmlSchemaParticlePtr; -struct _xmlSchemaParticle { - xmlSchemaTypeType type; - xmlSchemaAnnotPtr annot; - xmlSchemaTreeItemPtr next; - xmlSchemaTreeItemPtr children; - int minOccurs; - int maxOccurs; - xmlNodePtr node; -}; - -typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; -typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; -struct _xmlSchemaModelGroup { - xmlSchemaTypeType type; - xmlSchemaAnnotPtr annot; - xmlSchemaTreeItemPtr next; - xmlSchemaTreeItemPtr children; - xmlNodePtr node; -}; - -static xmlSchemaParticlePtr -xmlSchemaAddParticle(void) -{ - xmlSchemaParticlePtr ret = NULL; - - ret = (xmlSchemaParticlePtr) - xmlMalloc(sizeof(xmlSchemaParticle)); - if (ret == NULL) { - xmlSchemaTypeErrMemory(NULL, "allocating particle component"); - return (NULL); - } - memset(ret, 0, sizeof(xmlSchemaParticle)); - ret->type = XML_SCHEMA_TYPE_PARTICLE; - ret->minOccurs = 1; - ret->maxOccurs = 1; - return (ret); -} - -/* - * xmlSchemaInitTypes: - * - * Initialize the default XML Schemas type library - */ -void -xmlSchemaInitTypes(void) -{ - if (xmlSchemaTypesInitialized != 0) - return; - xmlSchemaTypesBank = xmlHashCreate(40); - - - /* - * 3.4.7 Built-in Complex Type Definition - */ - xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", - XML_SCHEMAS_ANYTYPE, - NULL); - xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; - xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; - /* - * Init the content type. - */ - xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; - { - xmlSchemaParticlePtr particle; - xmlSchemaModelGroupPtr sequence; - xmlSchemaWildcardPtr wild; - /* First particle. */ - particle = xmlSchemaAddParticle(); - if (particle == NULL) - return; - xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle; - /* Sequence model group. */ - sequence = (xmlSchemaModelGroupPtr) - xmlMalloc(sizeof(xmlSchemaModelGroup)); - if (sequence == NULL) { - xmlSchemaTypeErrMemory(NULL, "allocating model group component"); - return; - } - memset(sequence, 0, sizeof(xmlSchemaModelGroup)); - sequence->type = XML_SCHEMA_TYPE_SEQUENCE; - particle->children = (xmlSchemaTreeItemPtr) sequence; - /* Second particle. */ - particle = xmlSchemaAddParticle(); - if (particle == NULL) - return; - particle->minOccurs = 0; - particle->maxOccurs = UNBOUNDED; - sequence->children = (xmlSchemaTreeItemPtr) particle; - /* The wildcard */ - wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); - if (wild == NULL) { - xmlSchemaTypeErrMemory(NULL, "allocating wildcard component"); - return; - } - memset(wild, 0, sizeof(xmlSchemaWildcard)); - wild->type = XML_SCHEMA_TYPE_ANY; - wild->any = 1; - wild->processContents = XML_SCHEMAS_ANY_LAX; - particle->children = (xmlSchemaTreeItemPtr) wild; - /* - * Create the attribute wildcard. - */ - wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); - if (wild == NULL) { - xmlSchemaTypeErrMemory(NULL, "could not create an attribute " - "wildcard on anyType"); - return; - } - memset(wild, 0, sizeof(xmlSchemaWildcard)); - wild->any = 1; - wild->processContents = XML_SCHEMAS_ANY_LAX; - xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; - } - xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", - XML_SCHEMAS_ANYSIMPLETYPE, - xmlSchemaTypeAnyTypeDef); - /* - * primitive datatypes - */ - xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", - XML_SCHEMAS_STRING, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", - XML_SCHEMAS_DECIMAL, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", - XML_SCHEMAS_DATE, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", - XML_SCHEMAS_DATETIME, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", - XML_SCHEMAS_TIME, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", - XML_SCHEMAS_GYEAR, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", - XML_SCHEMAS_GYEARMONTH, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", - XML_SCHEMAS_GMONTH, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", - XML_SCHEMAS_GMONTHDAY, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", - XML_SCHEMAS_GDAY, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", - XML_SCHEMAS_DURATION, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", - XML_SCHEMAS_FLOAT, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", - XML_SCHEMAS_DOUBLE, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", - XML_SCHEMAS_BOOLEAN, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", - XML_SCHEMAS_ANYURI, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", - XML_SCHEMAS_HEXBINARY, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeBase64BinaryDef - = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", - XML_SCHEMAS_NOTATION, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", - XML_SCHEMAS_QNAME, - xmlSchemaTypeAnySimpleTypeDef); - - /* - * derived datatypes - */ - xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", - XML_SCHEMAS_INTEGER, - xmlSchemaTypeDecimalDef); - xmlSchemaTypeNonPositiveIntegerDef = - xmlSchemaInitBasicType("nonPositiveInteger", - XML_SCHEMAS_NPINTEGER, - xmlSchemaTypeIntegerDef); - xmlSchemaTypeNegativeIntegerDef = - xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, - xmlSchemaTypeNonPositiveIntegerDef); - xmlSchemaTypeLongDef = - xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, - xmlSchemaTypeIntegerDef); - xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, - xmlSchemaTypeLongDef); - xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", - XML_SCHEMAS_SHORT, - xmlSchemaTypeIntDef); - xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", - XML_SCHEMAS_BYTE, - xmlSchemaTypeShortDef); - xmlSchemaTypeNonNegativeIntegerDef = - xmlSchemaInitBasicType("nonNegativeInteger", - XML_SCHEMAS_NNINTEGER, - xmlSchemaTypeIntegerDef); - xmlSchemaTypeUnsignedLongDef = - xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, - xmlSchemaTypeNonNegativeIntegerDef); - xmlSchemaTypeUnsignedIntDef = - xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, - xmlSchemaTypeUnsignedLongDef); - xmlSchemaTypeUnsignedShortDef = - xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, - xmlSchemaTypeUnsignedIntDef); - xmlSchemaTypeUnsignedByteDef = - xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, - xmlSchemaTypeUnsignedShortDef); - xmlSchemaTypePositiveIntegerDef = - xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, - xmlSchemaTypeNonNegativeIntegerDef); - xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", - XML_SCHEMAS_NORMSTRING, - xmlSchemaTypeStringDef); - xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", - XML_SCHEMAS_TOKEN, - xmlSchemaTypeNormStringDef); - xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", - XML_SCHEMAS_LANGUAGE, - xmlSchemaTypeTokenDef); - xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", - XML_SCHEMAS_NAME, - xmlSchemaTypeTokenDef); - xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", - XML_SCHEMAS_NMTOKEN, - xmlSchemaTypeTokenDef); - xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", - XML_SCHEMAS_NCNAME, - xmlSchemaTypeNameDef); - xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, - xmlSchemaTypeNCNameDef); - xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", - XML_SCHEMAS_IDREF, - xmlSchemaTypeNCNameDef); - xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", - XML_SCHEMAS_ENTITY, - xmlSchemaTypeNCNameDef); - /* - * Derived list types. - */ - /* ENTITIES */ - xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", - XML_SCHEMAS_ENTITIES, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef; - /* IDREFS */ - xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", - XML_SCHEMAS_IDREFS, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef; - - /* NMTOKENS */ - xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", - XML_SCHEMAS_NMTOKENS, - xmlSchemaTypeAnySimpleTypeDef); - xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef; - - xmlSchemaTypesInitialized = 1; -} - -/** - * xmlSchemaCleanupTypes: - * - * Cleanup the default XML Schemas type library - */ -void -xmlSchemaCleanupTypes(void) { - if (xmlSchemaTypesInitialized == 0) - return; - /* - * Free xs:anyType. - */ - { - xmlSchemaParticlePtr particle; - /* Attribute wildcard. */ - xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); - /* Content type. */ - particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes; - /* Wildcard. */ - xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) - particle->children->children->children); - xmlFree((xmlSchemaParticlePtr) particle->children->children); - /* Sequence model group. */ - xmlFree((xmlSchemaModelGroupPtr) particle->children); - xmlFree((xmlSchemaParticlePtr) particle); - xmlSchemaTypeAnyTypeDef->subtypes = NULL; - } - xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); - xmlSchemaTypesInitialized = 0; -} - -/** - * xmlSchemaIsBuiltInTypeFacet: - * @type: the built-in type - * @facetType: the facet type - * - * Evaluates if a specific facet can be - * used in conjunction with a type. - * - * Returns 1 if the facet can be used with the given built-in type, - * 0 otherwise and -1 in case the type is not a built-in type. - */ -int -xmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) -{ - if (type == NULL) - return (-1); - if (type->type != XML_SCHEMA_TYPE_BASIC) - return (-1); - switch (type->builtInType) { - case XML_SCHEMAS_BOOLEAN: - if ((facetType == XML_SCHEMA_FACET_PATTERN) || - (facetType == XML_SCHEMA_FACET_WHITESPACE)) - return (1); - else - return (0); - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_NOTATION: - case XML_SCHEMAS_QNAME: - case XML_SCHEMAS_ANYURI: - case XML_SCHEMAS_BASE64BINARY: - case XML_SCHEMAS_HEXBINARY: - if ((facetType == XML_SCHEMA_FACET_LENGTH) || - (facetType == XML_SCHEMA_FACET_MINLENGTH) || - (facetType == XML_SCHEMA_FACET_MAXLENGTH) || - (facetType == XML_SCHEMA_FACET_PATTERN) || - (facetType == XML_SCHEMA_FACET_ENUMERATION) || - (facetType == XML_SCHEMA_FACET_WHITESPACE)) - return (1); - else - return (0); - case XML_SCHEMAS_DECIMAL: - if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || - (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || - (facetType == XML_SCHEMA_FACET_PATTERN) || - (facetType == XML_SCHEMA_FACET_WHITESPACE) || - (facetType == XML_SCHEMA_FACET_ENUMERATION) || - (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || - (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || - (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || - (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) - return (1); - else - return (0); - case XML_SCHEMAS_TIME: - case XML_SCHEMAS_GDAY: - case XML_SCHEMAS_GMONTH: - case XML_SCHEMAS_GMONTHDAY: - case XML_SCHEMAS_GYEAR: - case XML_SCHEMAS_GYEARMONTH: - case XML_SCHEMAS_DATE: - case XML_SCHEMAS_DATETIME: - case XML_SCHEMAS_DURATION: - case XML_SCHEMAS_FLOAT: - case XML_SCHEMAS_DOUBLE: - if ((facetType == XML_SCHEMA_FACET_PATTERN) || - (facetType == XML_SCHEMA_FACET_ENUMERATION) || - (facetType == XML_SCHEMA_FACET_WHITESPACE) || - (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || - (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || - (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || - (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) - return (1); - else - return (0); - default: - break; - } - return (0); -} - -/** - * xmlSchemaGetBuiltInType: - * @type: the type of the built in type - * - * Gives you the type struct for a built-in - * type by its type id. - * - * Returns the type if found, NULL otherwise. - */ -xmlSchemaTypePtr -xmlSchemaGetBuiltInType(xmlSchemaValType type) -{ - if (xmlSchemaTypesInitialized == 0) - xmlSchemaInitTypes(); - switch (type) { - - case XML_SCHEMAS_ANYSIMPLETYPE: - return (xmlSchemaTypeAnySimpleTypeDef); - case XML_SCHEMAS_STRING: - return (xmlSchemaTypeStringDef); - case XML_SCHEMAS_NORMSTRING: - return (xmlSchemaTypeNormStringDef); - case XML_SCHEMAS_DECIMAL: - return (xmlSchemaTypeDecimalDef); - case XML_SCHEMAS_TIME: - return (xmlSchemaTypeTimeDef); - case XML_SCHEMAS_GDAY: - return (xmlSchemaTypeGDayDef); - case XML_SCHEMAS_GMONTH: - return (xmlSchemaTypeGMonthDef); - case XML_SCHEMAS_GMONTHDAY: - return (xmlSchemaTypeGMonthDayDef); - case XML_SCHEMAS_GYEAR: - return (xmlSchemaTypeGYearDef); - case XML_SCHEMAS_GYEARMONTH: - return (xmlSchemaTypeGYearMonthDef); - case XML_SCHEMAS_DATE: - return (xmlSchemaTypeDateDef); - case XML_SCHEMAS_DATETIME: - return (xmlSchemaTypeDatetimeDef); - case XML_SCHEMAS_DURATION: - return (xmlSchemaTypeDurationDef); - case XML_SCHEMAS_FLOAT: - return (xmlSchemaTypeFloatDef); - case XML_SCHEMAS_DOUBLE: - return (xmlSchemaTypeDoubleDef); - case XML_SCHEMAS_BOOLEAN: - return (xmlSchemaTypeBooleanDef); - case XML_SCHEMAS_TOKEN: - return (xmlSchemaTypeTokenDef); - case XML_SCHEMAS_LANGUAGE: - return (xmlSchemaTypeLanguageDef); - case XML_SCHEMAS_NMTOKEN: - return (xmlSchemaTypeNmtokenDef); - case XML_SCHEMAS_NMTOKENS: - return (xmlSchemaTypeNmtokensDef); - case XML_SCHEMAS_NAME: - return (xmlSchemaTypeNameDef); - case XML_SCHEMAS_QNAME: - return (xmlSchemaTypeQNameDef); - case XML_SCHEMAS_NCNAME: - return (xmlSchemaTypeNCNameDef); - case XML_SCHEMAS_ID: - return (xmlSchemaTypeIdDef); - case XML_SCHEMAS_IDREF: - return (xmlSchemaTypeIdrefDef); - case XML_SCHEMAS_IDREFS: - return (xmlSchemaTypeIdrefsDef); - case XML_SCHEMAS_ENTITY: - return (xmlSchemaTypeEntityDef); - case XML_SCHEMAS_ENTITIES: - return (xmlSchemaTypeEntitiesDef); - case XML_SCHEMAS_NOTATION: - return (xmlSchemaTypeNotationDef); - case XML_SCHEMAS_ANYURI: - return (xmlSchemaTypeAnyURIDef); - case XML_SCHEMAS_INTEGER: - return (xmlSchemaTypeIntegerDef); - case XML_SCHEMAS_NPINTEGER: - return (xmlSchemaTypeNonPositiveIntegerDef); - case XML_SCHEMAS_NINTEGER: - return (xmlSchemaTypeNegativeIntegerDef); - case XML_SCHEMAS_NNINTEGER: - return (xmlSchemaTypeNonNegativeIntegerDef); - case XML_SCHEMAS_PINTEGER: - return (xmlSchemaTypePositiveIntegerDef); - case XML_SCHEMAS_INT: - return (xmlSchemaTypeIntDef); - case XML_SCHEMAS_UINT: - return (xmlSchemaTypeUnsignedIntDef); - case XML_SCHEMAS_LONG: - return (xmlSchemaTypeLongDef); - case XML_SCHEMAS_ULONG: - return (xmlSchemaTypeUnsignedLongDef); - case XML_SCHEMAS_SHORT: - return (xmlSchemaTypeShortDef); - case XML_SCHEMAS_USHORT: - return (xmlSchemaTypeUnsignedShortDef); - case XML_SCHEMAS_BYTE: - return (xmlSchemaTypeByteDef); - case XML_SCHEMAS_UBYTE: - return (xmlSchemaTypeUnsignedByteDef); - case XML_SCHEMAS_HEXBINARY: - return (xmlSchemaTypeHexBinaryDef); - case XML_SCHEMAS_BASE64BINARY: - return (xmlSchemaTypeBase64BinaryDef); - case XML_SCHEMAS_ANYTYPE: - return (xmlSchemaTypeAnyTypeDef); - default: - return (NULL); - } -} - -/** - * xmlSchemaValueAppend: - * @prev: the value - * @cur: the value to be appended - * - * Appends a next sibling to a list of computed values. - * - * Returns 0 if succeeded and -1 on API errors. - */ -int -xmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) { - - if ((prev == NULL) || (cur == NULL)) - return (-1); - prev->next = cur; - return (0); -} - -/** - * xmlSchemaValueGetNext: - * @cur: the value - * - * Accessor for the next sibling of a list of computed values. - * - * Returns the next value or NULL if there was none, or on - * API errors. - */ -xmlSchemaValPtr -xmlSchemaValueGetNext(xmlSchemaValPtr cur) { - - if (cur == NULL) - return (NULL); - return (cur->next); -} - -/** - * xmlSchemaValueGetAsString: - * @val: the value - * - * Accessor for the string value of a computed value. - * - * Returns the string value or NULL if there was none, or on - * API errors. - */ -const xmlChar * -xmlSchemaValueGetAsString(xmlSchemaValPtr val) -{ - if (val == NULL) - return (NULL); - switch (val->type) { - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_NORMSTRING: - case XML_SCHEMAS_ANYSIMPLETYPE: - case XML_SCHEMAS_TOKEN: - case XML_SCHEMAS_LANGUAGE: - case XML_SCHEMAS_NMTOKEN: - case XML_SCHEMAS_NAME: - case XML_SCHEMAS_NCNAME: - case XML_SCHEMAS_ID: - case XML_SCHEMAS_IDREF: - case XML_SCHEMAS_ENTITY: - case XML_SCHEMAS_ANYURI: - return (BAD_CAST val->value.str); - default: - break; - } - return (NULL); -} - -/** - * xmlSchemaValueGetAsBoolean: - * @val: the value - * - * Accessor for the boolean value of a computed value. - * - * Returns 1 if true and 0 if false, or in case of an error. Hmm. - */ -int -xmlSchemaValueGetAsBoolean(xmlSchemaValPtr val) -{ - if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN)) - return (0); - return (val->value.b); -} - -/** - * xmlSchemaNewStringValue: - * @type: the value type - * @value: the value - * - * Allocate a new simple type value. The type can be - * of XML_SCHEMAS_STRING. - * WARNING: This one is intended to be expanded for other - * string based types. We need this for anySimpleType as well. - * The given value is consumed and freed with the struct. - * - * Returns a pointer to the new value or NULL in case of error - */ -xmlSchemaValPtr -xmlSchemaNewStringValue(xmlSchemaValType type, - const xmlChar *value) -{ - xmlSchemaValPtr val; - - if (type != XML_SCHEMAS_STRING) - return(NULL); - val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); - if (val == NULL) { - return(NULL); - } - memset(val, 0, sizeof(xmlSchemaVal)); - val->type = type; - val->value.str = (xmlChar *) value; - return(val); -} - -/** - * xmlSchemaNewNOTATIONValue: - * @name: the notation name - * @ns: the notation namespace name or NULL - * - * Allocate a new NOTATION value. - * The given values are consumed and freed with the struct. - * - * Returns a pointer to the new value or NULL in case of error - */ -xmlSchemaValPtr -xmlSchemaNewNOTATIONValue(const xmlChar *name, - const xmlChar *ns) -{ - xmlSchemaValPtr val; - - val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); - if (val == NULL) - return (NULL); - - val->value.qname.name = (xmlChar *)name; - if (ns != NULL) - val->value.qname.uri = (xmlChar *)ns; - return(val); -} - -/** - * xmlSchemaNewQNameValue: - * @namespaceName: the namespace name - * @localName: the local name - * - * Allocate a new QName value. - * The given values are consumed and freed with the struct. - * - * Returns a pointer to the new value or NULL in case of an error. - */ -xmlSchemaValPtr -xmlSchemaNewQNameValue(const xmlChar *namespaceName, - const xmlChar *localName) -{ - xmlSchemaValPtr val; - - val = xmlSchemaNewValue(XML_SCHEMAS_QNAME); - if (val == NULL) - return (NULL); - - val->value.qname.name = (xmlChar *) localName; - val->value.qname.uri = (xmlChar *) namespaceName; - return(val); -} - -/** - * xmlSchemaFreeValue: - * @value: the value to free - * - * Cleanup the default XML Schemas type library - */ -void -xmlSchemaFreeValue(xmlSchemaValPtr value) { - xmlSchemaValPtr prev; - - while (value != NULL) { - switch (value->type) { - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_NORMSTRING: - case XML_SCHEMAS_TOKEN: - case XML_SCHEMAS_LANGUAGE: - case XML_SCHEMAS_NMTOKEN: - case XML_SCHEMAS_NMTOKENS: - case XML_SCHEMAS_NAME: - case XML_SCHEMAS_NCNAME: - case XML_SCHEMAS_ID: - case XML_SCHEMAS_IDREF: - case XML_SCHEMAS_IDREFS: - case XML_SCHEMAS_ENTITY: - case XML_SCHEMAS_ENTITIES: - case XML_SCHEMAS_ANYURI: - case XML_SCHEMAS_ANYSIMPLETYPE: - if (value->value.str != NULL) - xmlFree(value->value.str); - break; - case XML_SCHEMAS_NOTATION: - case XML_SCHEMAS_QNAME: - if (value->value.qname.uri != NULL) - xmlFree(value->value.qname.uri); - if (value->value.qname.name != NULL) - xmlFree(value->value.qname.name); - break; - case XML_SCHEMAS_HEXBINARY: - if (value->value.hex.str != NULL) - xmlFree(value->value.hex.str); - break; - case XML_SCHEMAS_BASE64BINARY: - if (value->value.base64.str != NULL) - xmlFree(value->value.base64.str); - break; - default: - break; - } - prev = value; - value = value->next; - xmlFree(prev); - } -} - -/** - * xmlSchemaGetPredefinedType: - * @name: the type name - * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" - * - * Lookup a type in the default XML Schemas type library - * - * Returns the type if found, NULL otherwise - */ -xmlSchemaTypePtr -xmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { - if (xmlSchemaTypesInitialized == 0) - xmlSchemaInitTypes(); - if (name == NULL) - return(NULL); - return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); -} - -/** - * xmlSchemaGetBuiltInListSimpleTypeItemType: - * @type: the built-in simple type. - * - * Lookup function - * - * Returns the item type of @type as defined by the built-in datatype - * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. - */ -xmlSchemaTypePtr -xmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) -{ - if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) - return (NULL); - switch (type->builtInType) { - case XML_SCHEMAS_NMTOKENS: - return (xmlSchemaTypeNmtokenDef ); - case XML_SCHEMAS_IDREFS: - return (xmlSchemaTypeIdrefDef); - case XML_SCHEMAS_ENTITIES: - return (xmlSchemaTypeEntityDef); - default: - return (NULL); - } -} - -/**************************************************************** - * * - * Convenience macros and functions * - * * - ****************************************************************/ - -#define IS_TZO_CHAR(c) \ - ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) - -#define VALID_YEAR(yr) (yr != 0) -#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) -/* VALID_DAY should only be used when month is unknown */ -#define VALID_DAY(day) ((day >= 1) && (day <= 31)) -#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) -#define VALID_MIN(min) ((min >= 0) && (min <= 59)) -#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) -#define VALID_TZO(tzo) ((tzo > -840) && (tzo < 840)) -#define IS_LEAP(y) \ - (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) - -static const unsigned int daysInMonth[12] = - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; -static const unsigned int daysInMonthLeap[12] = - { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - -#define MAX_DAYINMONTH(yr,mon) \ - (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) - -#define VALID_MDAY(dt) \ - (IS_LEAP(dt->year) ? \ - (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ - (dt->day <= daysInMonth[dt->mon - 1])) - -#define VALID_DATE(dt) \ - (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) - -#define VALID_TIME(dt) \ - (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ - VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) - -#define VALID_DATETIME(dt) \ - (VALID_DATE(dt) && VALID_TIME(dt)) - -#define SECS_PER_MIN (60) -#define SECS_PER_HOUR (60 * SECS_PER_MIN) -#define SECS_PER_DAY (24 * SECS_PER_HOUR) - -static const long dayInYearByMonth[12] = - { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; -static const long dayInLeapYearByMonth[12] = - { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; - -#define DAY_IN_YEAR(day, month, year) \ - ((IS_LEAP(year) ? \ - dayInLeapYearByMonth[month - 1] : \ - dayInYearByMonth[month - 1]) + day) - -#ifdef DEBUG -#define DEBUG_DATE(dt) \ - xmlGenericError(xmlGenericErrorContext, \ - "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ - dt->type,dt->value.date.year,dt->value.date.mon, \ - dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ - dt->value.date.sec); \ - if (dt->value.date.tz_flag) \ - if (dt->value.date.tzo != 0) \ - xmlGenericError(xmlGenericErrorContext, \ - "%+05d\n",dt->value.date.tzo); \ - else \ - xmlGenericError(xmlGenericErrorContext, "Z\n"); \ - else \ - xmlGenericError(xmlGenericErrorContext,"\n") -#else -#define DEBUG_DATE(dt) -#endif - -/** - * _xmlSchemaParseGYear: - * @dt: pointer to a date structure - * @str: pointer to the string to analyze - * - * Parses a xs:gYear without time zone and fills in the appropriate - * field of the @dt structure. @str is updated to point just after the - * xs:gYear. It is supposed that @dt->year is big enough to contain - * the year. - * - * Returns 0 or the error code - */ -static int -_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { - const xmlChar *cur = *str, *firstChar; - int isneg = 0, digcnt = 0; - - if (((*cur < '0') || (*cur > '9')) && - (*cur != '-') && (*cur != '+')) - return -1; - - if (*cur == '-') { - isneg = 1; - cur++; - } - - firstChar = cur; - - while ((*cur >= '0') && (*cur <= '9')) { - dt->year = dt->year * 10 + (*cur - '0'); - cur++; - digcnt++; - } - - /* year must be at least 4 digits (CCYY); over 4 - * digits cannot have a leading zero. */ - if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) - return 1; - - if (isneg) - dt->year = - dt->year; - - if (!VALID_YEAR(dt->year)) - return 2; - - *str = cur; - return 0; -} - -/** - * PARSE_2_DIGITS: - * @num: the integer to fill in - * @cur: an #xmlChar * - * @invalid: an integer - * - * Parses a 2-digits integer and updates @num with the value. @cur is - * updated to point just after the integer. - * In case of error, @invalid is set to %TRUE, values of @num and - * @cur are undefined. - */ -#define PARSE_2_DIGITS(num, cur, invalid) \ - if ((cur[0] < '0') || (cur[0] > '9') || \ - (cur[1] < '0') || (cur[1] > '9')) \ - invalid = 1; \ - else \ - num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ - cur += 2; - -/** - * PARSE_FLOAT: - * @num: the double to fill in - * @cur: an #xmlChar * - * @invalid: an integer - * - * Parses a float and updates @num with the value. @cur is - * updated to point just after the float. The float must have a - * 2-digits integer part and may or may not have a decimal part. - * In case of error, @invalid is set to %TRUE, values of @num and - * @cur are undefined. - */ -#define PARSE_FLOAT(num, cur, invalid) \ - PARSE_2_DIGITS(num, cur, invalid); \ - if (!invalid && (*cur == '.')) { \ - double mult = 1; \ - cur++; \ - if ((*cur < '0') || (*cur > '9')) \ - invalid = 1; \ - while ((*cur >= '0') && (*cur <= '9')) { \ - mult /= 10; \ - num += (*cur - '0') * mult; \ - cur++; \ - } \ - } - -/** - * _xmlSchemaParseGMonth: - * @dt: pointer to a date structure - * @str: pointer to the string to analyze - * - * Parses a xs:gMonth without time zone and fills in the appropriate - * field of the @dt structure. @str is updated to point just after the - * xs:gMonth. - * - * Returns 0 or the error code - */ -static int -_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { - const xmlChar *cur = *str; - int ret = 0; - unsigned int value = 0; - - PARSE_2_DIGITS(value, cur, ret); - if (ret != 0) - return ret; - - if (!VALID_MONTH(value)) - return 2; - - dt->mon = value; - - *str = cur; - return 0; -} - -/** - * _xmlSchemaParseGDay: - * @dt: pointer to a date structure - * @str: pointer to the string to analyze - * - * Parses a xs:gDay without time zone and fills in the appropriate - * field of the @dt structure. @str is updated to point just after the - * xs:gDay. - * - * Returns 0 or the error code - */ -static int -_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { - const xmlChar *cur = *str; - int ret = 0; - unsigned int value = 0; - - PARSE_2_DIGITS(value, cur, ret); - if (ret != 0) - return ret; - - if (!VALID_DAY(value)) - return 2; - - dt->day = value; - *str = cur; - return 0; -} - -/** - * _xmlSchemaParseTime: - * @dt: pointer to a date structure - * @str: pointer to the string to analyze - * - * Parses a xs:time without time zone and fills in the appropriate - * fields of the @dt structure. @str is updated to point just after the - * xs:time. - * In case of error, values of @dt fields are undefined. - * - * Returns 0 or the error code - */ -static int -_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { - const xmlChar *cur = *str; - int ret = 0; - int value = 0; - - PARSE_2_DIGITS(value, cur, ret); - if (ret != 0) - return ret; - if (*cur != ':') - return 1; - if (!VALID_HOUR(value)) - return 2; - cur++; - - /* the ':' insures this string is xs:time */ - dt->hour = value; - - PARSE_2_DIGITS(value, cur, ret); - if (ret != 0) - return ret; - if (!VALID_MIN(value)) - return 2; - dt->min = value; - - if (*cur != ':') - return 1; - cur++; - - PARSE_FLOAT(dt->sec, cur, ret); - if (ret != 0) - return ret; - - if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo))) - return 2; - - *str = cur; - return 0; -} - -/** - * _xmlSchemaParseTimeZone: - * @dt: pointer to a date structure - * @str: pointer to the string to analyze - * - * Parses a time zone without time zone and fills in the appropriate - * field of the @dt structure. @str is updated to point just after the - * time zone. - * - * Returns 0 or the error code - */ -static int -_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { - const xmlChar *cur; - int ret = 0; - - if (str == NULL) - return -1; - cur = *str; - - switch (*cur) { - case 0: - dt->tz_flag = 0; - dt->tzo = 0; - break; - - case 'Z': - dt->tz_flag = 1; - dt->tzo = 0; - cur++; - break; - - case '+': - case '-': { - int isneg = 0, tmp = 0; - isneg = (*cur == '-'); - - cur++; - - PARSE_2_DIGITS(tmp, cur, ret); - if (ret != 0) - return ret; - if (!VALID_HOUR(tmp)) - return 2; - - if (*cur != ':') - return 1; - cur++; - - dt->tzo = tmp * 60; - - PARSE_2_DIGITS(tmp, cur, ret); - if (ret != 0) - return ret; - if (!VALID_MIN(tmp)) - return 2; - - dt->tzo += tmp; - if (isneg) - dt->tzo = - dt->tzo; - - if (!VALID_TZO(dt->tzo)) - return 2; - - dt->tz_flag = 1; - break; - } - default: - return 1; - } - - *str = cur; - return 0; -} - -/** - * _xmlSchemaBase64Decode: - * @ch: a character - * - * Converts a base64 encoded character to its base 64 value. - * - * Returns 0-63 (value), 64 (pad), or -1 (not recognized) - */ -static int -_xmlSchemaBase64Decode (const xmlChar ch) { - if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; - if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; - if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; - if ('+' == ch) return 62; - if ('/' == ch) return 63; - if ('=' == ch) return 64; - return -1; -} - -/**************************************************************** - * * - * XML Schema Dates/Times Datatypes Handling * - * * - ****************************************************************/ - -/** - * PARSE_DIGITS: - * @num: the integer to fill in - * @cur: an #xmlChar * - * @num_type: an integer flag - * - * Parses a digits integer and updates @num with the value. @cur is - * updated to point just after the integer. - * In case of error, @num_type is set to -1, values of @num and - * @cur are undefined. - */ -#define PARSE_DIGITS(num, cur, num_type) \ - if ((*cur < '0') || (*cur > '9')) \ - num_type = -1; \ - else \ - while ((*cur >= '0') && (*cur <= '9')) { \ - num = num * 10 + (*cur - '0'); \ - cur++; \ - } - -/** - * PARSE_NUM: - * @num: the double to fill in - * @cur: an #xmlChar * - * @num_type: an integer flag - * - * Parses a float or integer and updates @num with the value. @cur is - * updated to point just after the number. If the number is a float, - * then it must have an integer part and a decimal part; @num_type will - * be set to 1. If there is no decimal part, @num_type is set to zero. - * In case of error, @num_type is set to -1, values of @num and - * @cur are undefined. - */ -#define PARSE_NUM(num, cur, num_type) \ - num = 0; \ - PARSE_DIGITS(num, cur, num_type); \ - if (!num_type && (*cur == '.')) { \ - double mult = 1; \ - cur++; \ - if ((*cur < '0') || (*cur > '9')) \ - num_type = -1; \ - else \ - num_type = 1; \ - while ((*cur >= '0') && (*cur <= '9')) { \ - mult /= 10; \ - num += (*cur - '0') * mult; \ - cur++; \ - } \ - } - -/** - * xmlSchemaValidateDates: - * @type: the expected type or XML_SCHEMAS_UNKNOWN - * @dateTime: string to analyze - * @val: the return computed value - * - * Check that @dateTime conforms to the lexical space of one of the date types. - * if true a value is computed and returned in @val. - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -static int -xmlSchemaValidateDates (xmlSchemaValType type, - const xmlChar *dateTime, xmlSchemaValPtr *val, - int collapse) { - xmlSchemaValPtr dt; - int ret; - const xmlChar *cur = dateTime; - -#define RETURN_TYPE_IF_VALID(t) \ - if (IS_TZO_CHAR(*cur)) { \ - ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ - if (ret == 0) { \ - if (*cur != 0) \ - goto error; \ - dt->type = t; \ - goto done; \ - } \ - } - - if (dateTime == NULL) - return -1; - - if (collapse) - while IS_WSP_BLANK_CH(*cur) cur++; - - if ((*cur != '-') && (*cur < '0') && (*cur > '9')) - return 1; - - dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); - if (dt == NULL) - return -1; - - if ((cur[0] == '-') && (cur[1] == '-')) { - /* - * It's an incomplete date (xs:gMonthDay, xs:gMonth or - * xs:gDay) - */ - cur += 2; - - /* is it an xs:gDay? */ - if (*cur == '-') { - if (type == XML_SCHEMAS_GMONTH) - goto error; - ++cur; - ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); - if (ret != 0) - goto error; - - RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); - - goto error; - } - - /* - * it should be an xs:gMonthDay or xs:gMonth - */ - ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); - if (ret != 0) - goto error; - - /* - * a '-' char could indicate this type is xs:gMonthDay or - * a negative time zone offset. Check for xs:gMonthDay first. - * Also the first three char's of a negative tzo (-MM:SS) can - * appear to be a valid day; so even if the day portion - * of the xs:gMonthDay verifies, we must insure it was not - * a tzo. - */ - if (*cur == '-') { - const xmlChar *rewnd = cur; - cur++; - - ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); - if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { - - /* - * we can use the VALID_MDAY macro to validate the month - * and day because the leap year test will flag year zero - * as a leap year (even though zero is an invalid year). - * FUTURE TODO: Zero will become valid in XML Schema 1.1 - * probably. - */ - if (VALID_MDAY((&(dt->value.date)))) { - - RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); - - goto error; - } - } - - /* - * not xs:gMonthDay so rewind and check if just xs:gMonth - * with an optional time zone. - */ - cur = rewnd; - } - - RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); - - goto error; - } - - /* - * It's a right-truncated date or an xs:time. - * Try to parse an xs:time then fallback on right-truncated dates. - */ - if ((*cur >= '0') && (*cur <= '9')) { - ret = _xmlSchemaParseTime(&(dt->value.date), &cur); - if (ret == 0) { - /* it's an xs:time */ - RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); - } - } - - /* fallback on date parsing */ - cur = dateTime; - - ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); - if (ret != 0) - goto error; - - /* is it an xs:gYear? */ - RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); - - if (*cur != '-') - goto error; - cur++; - - ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); - if (ret != 0) - goto error; - - /* is it an xs:gYearMonth? */ - RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); - - if (*cur != '-') - goto error; - cur++; - - ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); - if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) - goto error; - - /* is it an xs:date? */ - RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); - - if (*cur != 'T') - goto error; - cur++; - - /* it should be an xs:dateTime */ - ret = _xmlSchemaParseTime(&(dt->value.date), &cur); - if (ret != 0) - goto error; - - ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); - if (collapse) - while IS_WSP_BLANK_CH(*cur) cur++; - if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date)))))) - goto error; - - - dt->type = XML_SCHEMAS_DATETIME; - -done: -#if 1 - if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) - goto error; -#else - /* - * insure the parsed type is equal to or less significant (right - * truncated) than the desired type. - */ - if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { - - /* time only matches time */ - if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) - goto error; - - if ((type == XML_SCHEMAS_DATETIME) && - ((dt->type != XML_SCHEMAS_DATE) || - (dt->type != XML_SCHEMAS_GYEARMONTH) || - (dt->type != XML_SCHEMAS_GYEAR))) - goto error; - - if ((type == XML_SCHEMAS_DATE) && - ((dt->type != XML_SCHEMAS_GYEAR) || - (dt->type != XML_SCHEMAS_GYEARMONTH))) - goto error; - - if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) - goto error; - - if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) - goto error; - } -#endif - - if (val != NULL) - *val = dt; - else - xmlSchemaFreeValue(dt); - - return 0; - -error: - if (dt != NULL) - xmlSchemaFreeValue(dt); - return 1; -} - -/** - * xmlSchemaValidateDuration: - * @type: the predefined type - * @duration: string to analyze - * @val: the return computed value - * - * Check that @duration conforms to the lexical space of the duration type. - * if true a value is computed and returned in @val. - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -static int -xmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, - const xmlChar *duration, xmlSchemaValPtr *val, - int collapse) { - const xmlChar *cur = duration; - xmlSchemaValPtr dur; - int isneg = 0; - unsigned int seq = 0; - double num; - int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ - const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; - const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; - - if (duration == NULL) - return -1; - - if (collapse) - while IS_WSP_BLANK_CH(*cur) cur++; - - if (*cur == '-') { - isneg = 1; - cur++; - } - - /* duration must start with 'P' (after sign) */ - if (*cur++ != 'P') - return 1; - - if (*cur == 0) - return 1; - - dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); - if (dur == NULL) - return -1; - - while (*cur != 0) { - - /* input string should be empty or invalid date/time item */ - if (seq >= sizeof(desig)) - goto error; - - /* T designator must be present for time items */ - if (*cur == 'T') { - if (seq <= 3) { - seq = 3; - cur++; - } else - return 1; - } else if (seq == 3) - goto error; - - /* parse the number portion of the item */ - PARSE_NUM(num, cur, num_type); - - if ((num_type == -1) || (*cur == 0)) - goto error; - - /* update duration based on item type */ - while (seq < sizeof(desig)) { - if (*cur == desig[seq]) { - - /* verify numeric type; only seconds can be float */ - if ((num_type != 0) && (seq < (sizeof(desig)-1))) - goto error; - - switch (seq) { - case 0: - dur->value.dur.mon = (long)num * 12; - break; - case 1: - dur->value.dur.mon += (long)num; - break; - default: - /* convert to seconds using multiplier */ - dur->value.dur.sec += num * multi[seq]; - seq++; - break; - } - - break; /* exit loop */ - } - /* no date designators found? */ - if ((++seq == 3) || (seq == 6)) - goto error; - } - cur++; - if (collapse) - while IS_WSP_BLANK_CH(*cur) cur++; - } - - if (isneg) { - dur->value.dur.mon = -dur->value.dur.mon; - dur->value.dur.day = -dur->value.dur.day; - dur->value.dur.sec = -dur->value.dur.sec; - } - - if (val != NULL) - *val = dur; - else - xmlSchemaFreeValue(dur); - - return 0; - -error: - if (dur != NULL) - xmlSchemaFreeValue(dur); - return 1; -} - -/** - * xmlSchemaStrip: - * @value: a value - * - * Removes the leading and ending spaces of a string - * - * Returns the new string or NULL if no change was required. - */ -static xmlChar * -xmlSchemaStrip(const xmlChar *value) { - const xmlChar *start = value, *end, *f; - - if (value == NULL) return(NULL); - while ((*start != 0) && (IS_BLANK_CH(*start))) start++; - end = start; - while (*end != 0) end++; - f = end; - end--; - while ((end > start) && (IS_BLANK_CH(*end))) end--; - end++; - if ((start == value) && (f == end)) return(NULL); - return(xmlStrndup(start, end - start)); -} - -/** - * xmlSchemaWhiteSpaceReplace: - * @value: a value - * - * Replaces 0xd, 0x9 and 0xa with a space. - * - * Returns the new string or NULL if no change was required. - */ -xmlChar * -xmlSchemaWhiteSpaceReplace(const xmlChar *value) { - const xmlChar *cur = value; - xmlChar *ret = NULL, *mcur; - - if (value == NULL) - return(NULL); - - while ((*cur != 0) && - (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { - cur++; - } - if (*cur == 0) - return (NULL); - ret = xmlStrdup(value); - /* TODO FIXME: I guess gcc will bark at this. */ - mcur = (xmlChar *) (ret + (cur - value)); - do { - if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) - *mcur = ' '; - mcur++; - } while (*mcur != 0); - return(ret); -} - -/** - * xmlSchemaCollapseString: - * @value: a value - * - * Removes and normalize white spaces in the string - * - * Returns the new string or NULL if no change was required. - */ -xmlChar * -xmlSchemaCollapseString(const xmlChar *value) { - const xmlChar *start = value, *end, *f; - xmlChar *g; - int col = 0; - - if (value == NULL) return(NULL); - while ((*start != 0) && (IS_BLANK_CH(*start))) start++; - end = start; - while (*end != 0) { - if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { - col = end - start; - break; - } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { - col = end - start; - break; - } - end++; - } - if (col == 0) { - f = end; - end--; - while ((end > start) && (IS_BLANK_CH(*end))) end--; - end++; - if ((start == value) && (f == end)) return(NULL); - return(xmlStrndup(start, end - start)); - } - start = xmlStrdup(start); - if (start == NULL) return(NULL); - g = (xmlChar *) (start + col); - end = g; - while (*end != 0) { - if (IS_BLANK_CH(*end)) { - end++; - while (IS_BLANK_CH(*end)) end++; - if (*end != 0) - *g++ = ' '; - } else - *g++ = *end++; - } - *g = 0; - return((xmlChar *) start); -} - -/** - * xmlSchemaValAtomicListNode: - * @type: the predefined atomic type for a token in the list - * @value: the list value to check - * @ret: the return computed value - * @node: the node containing the value - * - * Check that a value conforms to the lexical space of the predefined - * list type. if true a value is computed and returned in @ret. - * - * Returns the number of items if this validates, a negative error code - * number otherwise - */ -static int -xmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, - xmlSchemaValPtr *ret, xmlNodePtr node) { - xmlChar *val, *cur, *endval; - int nb_values = 0; - int tmp = 0; - - if (value == NULL) { - return(-1); - } - val = xmlStrdup(value); - if (val == NULL) { - return(-1); - } - if (ret != NULL) { - *ret = NULL; - } - cur = val; - /* - * Split the list - */ - while (IS_BLANK_CH(*cur)) *cur++ = 0; - while (*cur != 0) { - if (IS_BLANK_CH(*cur)) { - *cur = 0; - cur++; - while (IS_BLANK_CH(*cur)) *cur++ = 0; - } else { - nb_values++; - cur++; - while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; - } - } - if (nb_values == 0) { - xmlFree(val); - return(nb_values); - } - endval = cur; - cur = val; - while ((*cur == 0) && (cur != endval)) cur++; - while (cur != endval) { - tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); - if (tmp != 0) - break; - while (*cur != 0) cur++; - while ((*cur == 0) && (cur != endval)) cur++; - } - /* TODO what return value ? c.f. bug #158628 - if (ret != NULL) { - TODO - } */ - xmlFree(val); - if (tmp == 0) - return(nb_values); - return(-1); -} - -/** - * xmlSchemaParseUInt: - * @str: pointer to the string R/W - * @llo: pointer to the low result - * @lmi: pointer to the mid result - * @lhi: pointer to the high result - * - * Parse an unsigned long into 3 fields. - * - * Returns the number of significant digits in the number or - * -1 if overflow of the capacity - */ -static int -xmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, - unsigned long *lmi, unsigned long *lhi) { - unsigned long lo = 0, mi = 0, hi = 0; - const xmlChar *tmp, *cur = *str; - int ret = 0, i = 0; - - while (*cur == '0') { /* ignore leading zeroes */ - cur++; - } - tmp = cur; - while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { - i++;tmp++;ret++; - } - if (i > 24) { - *str = tmp; - return(-1); - } - while (i > 16) { - hi = hi * 10 + (*cur++ - '0'); - i--; - } - while (i > 8) { - mi = mi * 10 + (*cur++ - '0'); - i--; - } - while (i > 0) { - lo = lo * 10 + (*cur++ - '0'); - i--; - } - - *str = cur; - *llo = lo; - *lmi = mi; - *lhi = hi; - return(ret); -} - -/** - * xmlSchemaValAtomicType: - * @type: the predefined type - * @value: the value to check - * @val: the return computed value - * @node: the node containing the value - * flags: flags to control the vlidation - * - * Check that a value conforms to the lexical space of the atomic type. - * if true a value is computed and returned in @val. - * This checks the value space for list types as well (IDREFS, NMTOKENS). - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -static int -xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, - xmlSchemaValPtr * val, xmlNodePtr node, int flags, - xmlSchemaWhitespaceValueType ws, - int normOnTheFly, int applyNorm, int createStringValue) -{ - xmlSchemaValPtr v; - xmlChar *norm = NULL; - int ret = 0; - - if (xmlSchemaTypesInitialized == 0) - xmlSchemaInitTypes(); - if (type == NULL) - return (-1); - - /* - * validating a non existant text node is similar to validating - * an empty one. - */ - if (value == NULL) - value = BAD_CAST ""; - - if (val != NULL) - *val = NULL; - if ((flags == 0) && (value != NULL)) { - - if ((type->builtInType != XML_SCHEMAS_STRING) && - (type->builtInType != XML_SCHEMAS_ANYTYPE) && - (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { - if (type->builtInType == XML_SCHEMAS_NORMSTRING) - norm = xmlSchemaWhiteSpaceReplace(value); - else - norm = xmlSchemaCollapseString(value); - if (norm != NULL) - value = norm; - } - } - - switch (type->builtInType) { - case XML_SCHEMAS_UNKNOWN: - goto error; - case XML_SCHEMAS_ANYTYPE: - case XML_SCHEMAS_ANYSIMPLETYPE: - if ((createStringValue) && (val != NULL)) { - v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE); - if (v != NULL) { - v->value.str = xmlStrdup(value); - *val = v; - } else { - goto error; - } - } - goto return0; - case XML_SCHEMAS_STRING: - if (! normOnTheFly) { - const xmlChar *cur = value; - - if (ws == XML_SCHEMA_WHITESPACE_REPLACE) { - while (*cur != 0) { - if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { - goto return1; - } else { - cur++; - } - } - } else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) { - while (*cur != 0) { - if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { - goto return1; - } else if IS_WSP_SPACE_CH(*cur) { - cur++; - if IS_WSP_SPACE_CH(*cur) - goto return1; - } else { - cur++; - } - } - } - } - if (createStringValue && (val != NULL)) { - if (applyNorm) { - if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) - norm = xmlSchemaCollapseString(value); - else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) - norm = xmlSchemaWhiteSpaceReplace(value); - if (norm != NULL) - value = norm; - } - v = xmlSchemaNewValue(XML_SCHEMAS_STRING); - if (v != NULL) { - v->value.str = xmlStrdup(value); - *val = v; - } else { - goto error; - } - } - goto return0; - case XML_SCHEMAS_NORMSTRING:{ - if (normOnTheFly) { - if (applyNorm) { - if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) - norm = xmlSchemaCollapseString(value); - else - norm = xmlSchemaWhiteSpaceReplace(value); - if (norm != NULL) - value = norm; - } - } else { - const xmlChar *cur = value; - while (*cur != 0) { - if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { - goto return1; - } else { - cur++; - } - } - } - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); - if (v != NULL) { - v->value.str = xmlStrdup(value); - *val = v; - } else { - goto error; - } - } - goto return0; - } - case XML_SCHEMAS_DECIMAL:{ - const xmlChar *cur = value; - unsigned int len, neg, integ, hasLeadingZeroes; - xmlChar cval[25]; - xmlChar *cptr = cval; - - if ((cur == NULL) || (*cur == 0)) - goto return1; - - /* - * xs:decimal has a whitespace-facet value of 'collapse'. - */ - if (normOnTheFly) - while IS_WSP_BLANK_CH(*cur) cur++; - - /* - * First we handle an optional sign. - */ - neg = 0; - if (*cur == '-') { - neg = 1; - cur++; - } else if (*cur == '+') - cur++; - /* - * Disallow: "", "-", "- " - */ - if (*cur == 0) - goto return1; - /* - * Next we "pre-parse" the number, in preparation for calling - * the common routine xmlSchemaParseUInt. We get rid of any - * leading zeroes (because we have reserved only 25 chars), - * and note the position of a decimal point. - */ - len = 0; - integ = ~0u; - hasLeadingZeroes = 0; - /* - * Skip leading zeroes. - */ - while (*cur == '0') { - cur++; - hasLeadingZeroes = 1; - } - if (*cur != 0) { - do { - if ((*cur >= '0') && (*cur <= '9')) { - *cptr++ = *cur++; - len++; - } else if (*cur == '.') { - cur++; - integ = len; - do { - if ((*cur >= '0') && (*cur <= '9')) { - *cptr++ = *cur++; - len++; - } else - break; - } while (len < 24); - /* - * Disallow "." but allow "00." - */ - if ((len == 0) && (!hasLeadingZeroes)) - goto return1; - break; - } else - break; - } while (len < 24); - } - if (normOnTheFly) - while IS_WSP_BLANK_CH(*cur) cur++; - if (*cur != 0) - goto return1; /* error if any extraneous chars */ - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); - if (v != NULL) { - /* - * Now evaluate the significant digits of the number - */ - if (len != 0) { - - if (integ != ~0u) { - /* - * Get rid of trailing zeroes in the - * fractional part. - */ - while ((len != integ) && (*(cptr-1) == '0')) { - cptr--; - len--; - } - } - /* - * Terminate the (preparsed) string. - */ - if (len != 0) { - *cptr = 0; - cptr = cval; - - xmlSchemaParseUInt((const xmlChar **)&cptr, - &v->value.decimal.lo, - &v->value.decimal.mi, - &v->value.decimal.hi); - } - } - /* - * Set the total digits to 1 if a zero value. - */ - v->value.decimal.sign = neg; - if (len == 0) { - /* Speedup for zero values. */ - v->value.decimal.total = 1; - } else { - v->value.decimal.total = len; - if (integ == ~0u) - v->value.decimal.frac = 0; - else - v->value.decimal.frac = len - integ; - } - *val = v; - } - } - goto return0; - } - case XML_SCHEMAS_TIME: - case XML_SCHEMAS_GDAY: - case XML_SCHEMAS_GMONTH: - case XML_SCHEMAS_GMONTHDAY: - case XML_SCHEMAS_GYEAR: - case XML_SCHEMAS_GYEARMONTH: - case XML_SCHEMAS_DATE: - case XML_SCHEMAS_DATETIME: - ret = xmlSchemaValidateDates(type->builtInType, value, val, - normOnTheFly); - break; - case XML_SCHEMAS_DURATION: - ret = xmlSchemaValidateDuration(type, value, val, - normOnTheFly); - break; - case XML_SCHEMAS_FLOAT: - case XML_SCHEMAS_DOUBLE:{ - const xmlChar *cur = value; - int neg = 0; - - if (normOnTheFly) - while IS_WSP_BLANK_CH(*cur) cur++; - - if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { - cur += 3; - if (*cur != 0) - goto return1; - if (val != NULL) { - if (type == xmlSchemaTypeFloatDef) { - v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); - if (v != NULL) { - v->value.f = (float) xmlXPathNAN; - } else { - xmlSchemaFreeValue(v); - goto error; - } - } else { - v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); - if (v != NULL) { - v->value.d = xmlXPathNAN; - } else { - xmlSchemaFreeValue(v); - goto error; - } - } - *val = v; - } - goto return0; - } - if (*cur == '-') { - neg = 1; - cur++; - } - if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { - cur += 3; - if (*cur != 0) - goto return1; - if (val != NULL) { - if (type == xmlSchemaTypeFloatDef) { - v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); - if (v != NULL) { - if (neg) - v->value.f = (float) xmlXPathNINF; - else - v->value.f = (float) xmlXPathPINF; - } else { - xmlSchemaFreeValue(v); - goto error; - } - } else { - v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); - if (v != NULL) { - if (neg) - v->value.d = xmlXPathNINF; - else - v->value.d = xmlXPathPINF; - } else { - xmlSchemaFreeValue(v); - goto error; - } - } - *val = v; - } - goto return0; - } - if ((neg == 0) && (*cur == '+')) - cur++; - if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) - goto return1; - while ((*cur >= '0') && (*cur <= '9')) { - cur++; - } - if (*cur == '.') { - cur++; - while ((*cur >= '0') && (*cur <= '9')) - cur++; - } - if ((*cur == 'e') || (*cur == 'E')) { - cur++; - if ((*cur == '-') || (*cur == '+')) - cur++; - while ((*cur >= '0') && (*cur <= '9')) - cur++; - } - if (normOnTheFly) - while IS_WSP_BLANK_CH(*cur) cur++; - - if (*cur != 0) - goto return1; - if (val != NULL) { - if (type == xmlSchemaTypeFloatDef) { - v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); - if (v != NULL) { - /* - * TODO: sscanf seems not to give the correct - * value for extremely high/low values. - * E.g. "1E-149" results in zero. - */ - if (sscanf((const char *) value, "%f", - &(v->value.f)) == 1) { - *val = v; - } else { - xmlSchemaFreeValue(v); - goto return1; - } - } else { - goto error; - } - } else { - v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); - if (v != NULL) { - /* - * TODO: sscanf seems not to give the correct - * value for extremely high/low values. - */ - if (sscanf((const char *) value, "%lf", - &(v->value.d)) == 1) { - *val = v; - } else { - xmlSchemaFreeValue(v); - goto return1; - } - } else { - goto error; - } - } - } - goto return0; - } - case XML_SCHEMAS_BOOLEAN:{ - const xmlChar *cur = value; - - if (normOnTheFly) { - while IS_WSP_BLANK_CH(*cur) cur++; - if (*cur == '0') { - ret = 0; - cur++; - } else if (*cur == '1') { - ret = 1; - cur++; - } else if (*cur == 't') { - cur++; - if ((*cur++ == 'r') && (*cur++ == 'u') && - (*cur++ == 'e')) { - ret = 1; - } else - goto return1; - } else if (*cur == 'f') { - cur++; - if ((*cur++ == 'a') && (*cur++ == 'l') && - (*cur++ == 's') && (*cur++ == 'e')) { - ret = 0; - } else - goto return1; - } else - goto return1; - if (*cur != 0) { - while IS_WSP_BLANK_CH(*cur) cur++; - if (*cur != 0) - goto return1; - } - } else { - if ((cur[0] == '0') && (cur[1] == 0)) - ret = 0; - else if ((cur[0] == '1') && (cur[1] == 0)) - ret = 1; - else if ((cur[0] == 't') && (cur[1] == 'r') - && (cur[2] == 'u') && (cur[3] == 'e') - && (cur[4] == 0)) - ret = 1; - else if ((cur[0] == 'f') && (cur[1] == 'a') - && (cur[2] == 'l') && (cur[3] == 's') - && (cur[4] == 'e') && (cur[5] == 0)) - ret = 0; - else - goto return1; - } - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); - if (v != NULL) { - v->value.b = ret; - *val = v; - } else { - goto error; - } - } - goto return0; - } - case XML_SCHEMAS_TOKEN:{ - const xmlChar *cur = value; - - if (! normOnTheFly) { - while (*cur != 0) { - if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { - goto return1; - } else if (*cur == ' ') { - cur++; - if (*cur == 0) - goto return1; - if (*cur == ' ') - goto return1; - } else { - cur++; - } - } - } - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); - if (v != NULL) { - v->value.str = xmlStrdup(value); - *val = v; - } else { - goto error; - } - } - goto return0; - } - case XML_SCHEMAS_LANGUAGE: - if (normOnTheFly) { - norm = xmlSchemaCollapseString(value); - if (norm != NULL) - value = norm; - } - if (xmlCheckLanguageID(value) == 1) { - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); - if (v != NULL) { - v->value.str = xmlStrdup(value); - *val = v; - } else { - goto error; - } - } - goto return0; - } - goto return1; - case XML_SCHEMAS_NMTOKEN: - if (xmlValidateNMToken(value, 1) == 0) { - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); - if (v != NULL) { - v->value.str = xmlStrdup(value); - *val = v; - } else { - goto error; - } - } - goto return0; - } - goto return1; - case XML_SCHEMAS_NMTOKENS: - ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, - value, val, node); - if (ret > 0) - ret = 0; - else - ret = 1; - goto done; - case XML_SCHEMAS_NAME: - ret = xmlValidateName(value, 1); - if ((ret == 0) && (val != NULL) && (value != NULL)) { - v = xmlSchemaNewValue(XML_SCHEMAS_NAME); - if (v != NULL) { - const xmlChar *start = value, *end; - while (IS_BLANK_CH(*start)) start++; - end = start; - while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; - v->value.str = xmlStrndup(start, end - start); - *val = v; - } else { - goto error; - } - } - goto done; - case XML_SCHEMAS_QNAME:{ - const xmlChar *uri = NULL; - xmlChar *local = NULL; - - ret = xmlValidateQName(value, 1); - if (ret != 0) - goto done; - if (node != NULL) { - xmlChar *prefix; - xmlNsPtr ns; - - local = xmlSplitQName2(value, &prefix); - ns = xmlSearchNs(node->doc, node, prefix); - if ((ns == NULL) && (prefix != NULL)) { - xmlFree(prefix); - if (local != NULL) - xmlFree(local); - goto return1; - } - if (ns != NULL) - uri = ns->href; - if (prefix != NULL) - xmlFree(prefix); - } - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); - if (v == NULL) { - if (local != NULL) - xmlFree(local); - goto error; - } - if (local != NULL) - v->value.qname.name = local; - else - v->value.qname.name = xmlStrdup(value); - if (uri != NULL) - v->value.qname.uri = xmlStrdup(uri); - *val = v; - } else - if (local != NULL) - xmlFree(local); - goto done; - } - case XML_SCHEMAS_NCNAME: - ret = xmlValidateNCName(value, 1); - if ((ret == 0) && (val != NULL)) { - v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); - if (v != NULL) { - v->value.str = xmlStrdup(value); - *val = v; - } else { - goto error; - } - } - goto done; - case XML_SCHEMAS_ID: - ret = xmlValidateNCName(value, 1); - if ((ret == 0) && (val != NULL)) { - v = xmlSchemaNewValue(XML_SCHEMAS_ID); - if (v != NULL) { - v->value.str = xmlStrdup(value); - *val = v; - } else { - goto error; - } - } - if ((ret == 0) && (node != NULL) && - (node->type == XML_ATTRIBUTE_NODE)) { - xmlAttrPtr attr = (xmlAttrPtr) node; - - /* - * NOTE: the IDness might have already be declared in the DTD - */ - if (attr->atype != XML_ATTRIBUTE_ID) { - xmlIDPtr res; - xmlChar *strip; - - strip = xmlSchemaStrip(value); - if (strip != NULL) { - res = xmlAddID(NULL, node->doc, strip, attr); - xmlFree(strip); - } else - res = xmlAddID(NULL, node->doc, value, attr); - if (res == NULL) { - ret = 2; - } else { - attr->atype = XML_ATTRIBUTE_ID; - } - } - } - goto done; - case XML_SCHEMAS_IDREF: - ret = xmlValidateNCName(value, 1); - if ((ret == 0) && (val != NULL)) { - v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); - if (v == NULL) - goto error; - v->value.str = xmlStrdup(value); - *val = v; - } - if ((ret == 0) && (node != NULL) && - (node->type == XML_ATTRIBUTE_NODE)) { - xmlAttrPtr attr = (xmlAttrPtr) node; - xmlChar *strip; - - strip = xmlSchemaStrip(value); - if (strip != NULL) { - xmlAddRef(NULL, node->doc, strip, attr); - xmlFree(strip); - } else - xmlAddRef(NULL, node->doc, value, attr); - attr->atype = XML_ATTRIBUTE_IDREF; - } - goto done; - case XML_SCHEMAS_IDREFS: - ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, - value, val, node); - if (ret < 0) - ret = 2; - else - ret = 0; - if ((ret == 0) && (node != NULL) && - (node->type == XML_ATTRIBUTE_NODE)) { - xmlAttrPtr attr = (xmlAttrPtr) node; - - attr->atype = XML_ATTRIBUTE_IDREFS; - } - goto done; - case XML_SCHEMAS_ENTITY:{ - xmlChar *strip; - - ret = xmlValidateNCName(value, 1); - if ((node == NULL) || (node->doc == NULL)) - ret = 3; - if (ret == 0) { - xmlEntityPtr ent; - - strip = xmlSchemaStrip(value); - if (strip != NULL) { - ent = xmlGetDocEntity(node->doc, strip); - xmlFree(strip); - } else { - ent = xmlGetDocEntity(node->doc, value); - } - if ((ent == NULL) || - (ent->etype != - XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) - ret = 4; - } - if ((ret == 0) && (val != NULL)) { - TODO; - } - if ((ret == 0) && (node != NULL) && - (node->type == XML_ATTRIBUTE_NODE)) { - xmlAttrPtr attr = (xmlAttrPtr) node; - - attr->atype = XML_ATTRIBUTE_ENTITY; - } - goto done; - } - case XML_SCHEMAS_ENTITIES: - if ((node == NULL) || (node->doc == NULL)) - goto return3; - ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, - value, val, node); - if (ret <= 0) - ret = 1; - else - ret = 0; - if ((ret == 0) && (node != NULL) && - (node->type == XML_ATTRIBUTE_NODE)) { - xmlAttrPtr attr = (xmlAttrPtr) node; - - attr->atype = XML_ATTRIBUTE_ENTITIES; - } - goto done; - case XML_SCHEMAS_NOTATION:{ - xmlChar *uri = NULL; - xmlChar *local = NULL; - - ret = xmlValidateQName(value, 1); - if ((ret == 0) && (node != NULL)) { - xmlChar *prefix; - - local = xmlSplitQName2(value, &prefix); - if (prefix != NULL) { - xmlNsPtr ns; - - ns = xmlSearchNs(node->doc, node, prefix); - if (ns == NULL) - ret = 1; - else if (val != NULL) - uri = xmlStrdup(ns->href); - } - if ((local != NULL) && ((val == NULL) || (ret != 0))) - xmlFree(local); - if (prefix != NULL) - xmlFree(prefix); - } - if ((node == NULL) || (node->doc == NULL)) - ret = 3; - if (ret == 0) { - ret = xmlValidateNotationUse(NULL, node->doc, value); - if (ret == 1) - ret = 0; - else - ret = 1; - } - if ((ret == 0) && (val != NULL)) { - v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); - if (v != NULL) { - if (local != NULL) - v->value.qname.name = local; - else - v->value.qname.name = xmlStrdup(value); - if (uri != NULL) - v->value.qname.uri = uri; - - *val = v; - } else { - if (local != NULL) - xmlFree(local); - if (uri != NULL) - xmlFree(uri); - goto error; - } - } - goto done; - } - case XML_SCHEMAS_ANYURI:{ - if (*value != 0) { - xmlURIPtr uri; - if (normOnTheFly) { - norm = xmlSchemaCollapseString(value); - if (norm != NULL) - value = norm; - } - uri = xmlParseURI((const char *) value); - if (uri == NULL) - goto return1; - xmlFreeURI(uri); - } - - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); - if (v == NULL) - goto error; - v->value.str = xmlStrdup(value); - *val = v; - } - goto return0; - } - case XML_SCHEMAS_HEXBINARY:{ - const xmlChar *cur = value, *start; - xmlChar *base; - int total, i = 0; - - if (cur == NULL) - goto return1; - - if (normOnTheFly) - while IS_WSP_BLANK_CH(*cur) cur++; - - start = cur; - while (((*cur >= '0') && (*cur <= '9')) || - ((*cur >= 'A') && (*cur <= 'F')) || - ((*cur >= 'a') && (*cur <= 'f'))) { - i++; - cur++; - } - if (normOnTheFly) - while IS_WSP_BLANK_CH(*cur) cur++; - - if (*cur != 0) - goto return1; - if ((i % 2) != 0) - goto return1; - - if (val != NULL) { - - v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); - if (v == NULL) - goto error; - /* - * Copy only the normalized piece. - * CRITICAL TODO: Check this. - */ - cur = xmlStrndup(start, i); - if (cur == NULL) { - xmlSchemaTypeErrMemory(node, "allocating hexbin data"); - xmlFree(v); - goto return1; - } - - total = i / 2; /* number of octets */ - - base = (xmlChar *) cur; - while (i-- > 0) { - if (*base >= 'a') - *base = *base - ('a' - 'A'); - base++; - } - - v->value.hex.str = (xmlChar *) cur; - v->value.hex.total = total; - *val = v; - } - goto return0; - } - case XML_SCHEMAS_BASE64BINARY:{ - /* ISSUE: - * - * Ignore all stray characters? (yes, currently) - * Worry about long lines? (no, currently) - * - * rfc2045.txt: - * - * "The encoded output stream must be represented in lines of - * no more than 76 characters each. All line breaks or other - * characters not found in Table 1 must be ignored by decoding - * software. In base64 data, characters other than those in - * Table 1, line breaks, and other white space probably - * indicate a transmission error, about which a warning - * message or even a message rejection might be appropriate - * under some circumstances." */ - const xmlChar *cur = value; - xmlChar *base; - int total, i = 0, pad = 0; - - if (cur == NULL) - goto return1; - - for (; *cur; ++cur) { - int decc; - - decc = _xmlSchemaBase64Decode(*cur); - if (decc < 0) ; - else if (decc < 64) - i++; - else - break; - } - for (; *cur; ++cur) { - int decc; - - decc = _xmlSchemaBase64Decode(*cur); - if (decc < 0) ; - else if (decc < 64) - goto return1; - if (decc == 64) - pad++; - } - - /* rfc2045.txt: "Special processing is performed if fewer than - * 24 bits are available at the end of the data being encoded. - * A full encoding quantum is always completed at the end of a - * body. When fewer than 24 input bits are available in an - * input group, zero bits are added (on the right) to form an - * integral number of 6-bit groups. Padding at the end of the - * data is performed using the "=" character. Since all - * base64 input is an integral number of octets, only the - * following cases can arise: (1) the final quantum of - * encoding input is an integral multiple of 24 bits; here, - * the final unit of encoded output will be an integral - * multiple ofindent: Standard input:701: Warning:old style - * assignment ambiguity in "=*". Assuming "= *" 4 characters - * with no "=" padding, (2) the final - * quantum of encoding input is exactly 8 bits; here, the - * final unit of encoded output will be two characters - * followed by two "=" padding characters, or (3) the final - * quantum of encoding input is exactly 16 bits; here, the - * final unit of encoded output will be three characters - * followed by one "=" padding character." */ - - total = 3 * (i / 4); - if (pad == 0) { - if (i % 4 != 0) - goto return1; - } else if (pad == 1) { - int decc; - - if (i % 4 != 3) - goto return1; - for (decc = _xmlSchemaBase64Decode(*cur); - (decc < 0) || (decc > 63); - decc = _xmlSchemaBase64Decode(*cur)) - --cur; - /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ - /* 00111100 -> 0x3c */ - if (decc & ~0x3c) - goto return1; - total += 2; - } else if (pad == 2) { - int decc; - - if (i % 4 != 2) - goto return1; - for (decc = _xmlSchemaBase64Decode(*cur); - (decc < 0) || (decc > 63); - decc = _xmlSchemaBase64Decode(*cur)) - --cur; - /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ - /* 00110000 -> 0x30 */ - if (decc & ~0x30) - goto return1; - total += 1; - } else - goto return1; - - if (val != NULL) { - v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); - if (v == NULL) - goto error; - base = - (xmlChar *) xmlMallocAtomic((i + pad + 1) * - sizeof(xmlChar)); - if (base == NULL) { - xmlSchemaTypeErrMemory(node, "allocating base64 data"); - xmlFree(v); - goto return1; - } - v->value.base64.str = base; - for (cur = value; *cur; ++cur) - if (_xmlSchemaBase64Decode(*cur) >= 0) { - *base = *cur; - ++base; - } - *base = 0; - v->value.base64.total = total; - *val = v; - } - goto return0; - } - case XML_SCHEMAS_INTEGER: - case XML_SCHEMAS_PINTEGER: - case XML_SCHEMAS_NPINTEGER: - case XML_SCHEMAS_NINTEGER: - case XML_SCHEMAS_NNINTEGER:{ - const xmlChar *cur = value; - unsigned long lo, mi, hi; - int sign = 0; - - if (cur == NULL) - goto return1; - if (normOnTheFly) - while IS_WSP_BLANK_CH(*cur) cur++; - if (*cur == '-') { - sign = 1; - cur++; - } else if (*cur == '+') - cur++; - ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); - if (ret == -1) - goto return1; - if (normOnTheFly) - while IS_WSP_BLANK_CH(*cur) cur++; - if (*cur != 0) - goto return1; - if (type->builtInType == XML_SCHEMAS_NPINTEGER) { - if ((sign == 0) && - ((hi != 0) || (mi != 0) || (lo != 0))) - goto return1; - } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { - if (sign == 1) - goto return1; - if ((hi == 0) && (mi == 0) && (lo == 0)) - goto return1; - } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { - if (sign == 0) - goto return1; - if ((hi == 0) && (mi == 0) && (lo == 0)) - goto return1; - } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { - if ((sign == 1) && - ((hi != 0) || (mi != 0) || (lo != 0))) - goto return1; - } - if (val != NULL) { - v = xmlSchemaNewValue(type->builtInType); - if (v != NULL) { - if (ret == 0) - ret++; - v->value.decimal.lo = lo; - v->value.decimal.mi = mi; - v->value.decimal.hi = hi; - v->value.decimal.sign = sign; - v->value.decimal.frac = 0; - v->value.decimal.total = ret; - *val = v; - } - } - goto return0; - } - case XML_SCHEMAS_LONG: - case XML_SCHEMAS_BYTE: - case XML_SCHEMAS_SHORT: - case XML_SCHEMAS_INT:{ - const xmlChar *cur = value; - unsigned long lo, mi, hi; - int sign = 0; - - if (cur == NULL) - goto return1; - if (*cur == '-') { - sign = 1; - cur++; - } else if (*cur == '+') - cur++; - ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); - if (ret < 0) - goto return1; - if (*cur != 0) - goto return1; - if (type->builtInType == XML_SCHEMAS_LONG) { - if (hi >= 922) { - if (hi > 922) - goto return1; - if (mi >= 33720368) { - if (mi > 33720368) - goto return1; - if ((sign == 0) && (lo > 54775807)) - goto return1; - if ((sign == 1) && (lo > 54775808)) - goto return1; - } - } - } else if (type->builtInType == XML_SCHEMAS_INT) { - if (hi != 0) - goto return1; - if (mi >= 21) { - if (mi > 21) - goto return1; - if ((sign == 0) && (lo > 47483647)) - goto return1; - if ((sign == 1) && (lo > 47483648)) - goto return1; - } - } else if (type->builtInType == XML_SCHEMAS_SHORT) { - if ((mi != 0) || (hi != 0)) - goto return1; - if ((sign == 1) && (lo > 32768)) - goto return1; - if ((sign == 0) && (lo > 32767)) - goto return1; - } else if (type->builtInType == XML_SCHEMAS_BYTE) { - if ((mi != 0) || (hi != 0)) - goto return1; - if ((sign == 1) && (lo > 128)) - goto return1; - if ((sign == 0) && (lo > 127)) - goto return1; - } - if (val != NULL) { - v = xmlSchemaNewValue(type->builtInType); - if (v != NULL) { - v->value.decimal.lo = lo; - v->value.decimal.mi = mi; - v->value.decimal.hi = hi; - v->value.decimal.sign = sign; - v->value.decimal.frac = 0; - v->value.decimal.total = ret; - *val = v; - } - } - goto return0; - } - case XML_SCHEMAS_UINT: - case XML_SCHEMAS_ULONG: - case XML_SCHEMAS_USHORT: - case XML_SCHEMAS_UBYTE:{ - const xmlChar *cur = value; - unsigned long lo, mi, hi; - - if (cur == NULL) - goto return1; - ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); - if (ret < 0) - goto return1; - if (*cur != 0) - goto return1; - if (type->builtInType == XML_SCHEMAS_ULONG) { - if (hi >= 1844) { - if (hi > 1844) - goto return1; - if (mi >= 67440737) { - if (mi > 67440737) - goto return1; - if (lo > 9551615) - goto return1; - } - } - } else if (type->builtInType == XML_SCHEMAS_UINT) { - if (hi != 0) - goto return1; - if (mi >= 42) { - if (mi > 42) - goto return1; - if (lo > 94967295) - goto return1; - } - } else if (type->builtInType == XML_SCHEMAS_USHORT) { - if ((mi != 0) || (hi != 0)) - goto return1; - if (lo > 65535) - goto return1; - } else if (type->builtInType == XML_SCHEMAS_UBYTE) { - if ((mi != 0) || (hi != 0)) - goto return1; - if (lo > 255) - goto return1; - } - if (val != NULL) { - v = xmlSchemaNewValue(type->builtInType); - if (v != NULL) { - v->value.decimal.lo = lo; - v->value.decimal.mi = mi; - v->value.decimal.hi = hi; - v->value.decimal.sign = 0; - v->value.decimal.frac = 0; - v->value.decimal.total = ret; - *val = v; - } - } - goto return0; - } - } - - done: - if (norm != NULL) - xmlFree(norm); - return (ret); - return3: - if (norm != NULL) - xmlFree(norm); - return (3); - return1: - if (norm != NULL) - xmlFree(norm); - return (1); - return0: - if (norm != NULL) - xmlFree(norm); - return (0); - error: - if (norm != NULL) - xmlFree(norm); - return (-1); -} - -/** - * xmlSchemaValPredefTypeNode: - * @type: the predefined type - * @value: the value to check - * @val: the return computed value - * @node: the node containing the value - * - * Check that a value conforms to the lexical space of the predefined type. - * if true a value is computed and returned in @val. - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, - xmlSchemaValPtr *val, xmlNodePtr node) { - return(xmlSchemaValAtomicType(type, value, val, node, 0, - XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0)); -} - -/** - * xmlSchemaValPredefTypeNodeNoNorm: - * @type: the predefined type - * @value: the value to check - * @val: the return computed value - * @node: the node containing the value - * - * Check that a value conforms to the lexical space of the predefined type. - * if true a value is computed and returned in @val. - * This one does apply any normalization to the value. - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, - xmlSchemaValPtr *val, xmlNodePtr node) { - return(xmlSchemaValAtomicType(type, value, val, node, 1, - XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1)); -} - -/** - * xmlSchemaValidatePredefinedType: - * @type: the predefined type - * @value: the value to check - * @val: the return computed value - * - * Check that a value conforms to the lexical space of the predefined type. - * if true a value is computed and returned in @val. - * - * Returns 0 if this validates, a positive error code number otherwise - * and -1 in case of internal or API error. - */ -int -xmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, - xmlSchemaValPtr *val) { - return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); -} - -/** - * xmlSchemaCompareDecimals: - * @x: a first decimal value - * @y: a second decimal value - * - * Compare 2 decimals - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error - */ -static int -xmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) -{ - xmlSchemaValPtr swp; - int order = 1, integx, integy, dlen; - unsigned long hi, mi, lo; - - /* - * First test: If x is -ve and not zero - */ - if ((x->value.decimal.sign) && - ((x->value.decimal.lo != 0) || - (x->value.decimal.mi != 0) || - (x->value.decimal.hi != 0))) { - /* - * Then if y is -ve and not zero reverse the compare - */ - if ((y->value.decimal.sign) && - ((y->value.decimal.lo != 0) || - (y->value.decimal.mi != 0) || - (y->value.decimal.hi != 0))) - order = -1; - /* - * Otherwise (y >= 0) we have the answer - */ - else - return (-1); - /* - * If x is not -ve and y is -ve we have the answer - */ - } else if ((y->value.decimal.sign) && - ((y->value.decimal.lo != 0) || - (y->value.decimal.mi != 0) || - (y->value.decimal.hi != 0))) { - return (1); - } - /* - * If it's not simply determined by a difference in sign, - * then we need to compare the actual values of the two nums. - * To do this, we start by looking at the integral parts. - * If the number of integral digits differ, then we have our - * answer. - */ - integx = x->value.decimal.total - x->value.decimal.frac; - integy = y->value.decimal.total - y->value.decimal.frac; - /* - * NOTE: We changed the "total" for values like "0.1" - * (or "-0.1" or ".1") to be 1, which was 2 previously. - * Therefore the special case, when such values are - * compared with 0, needs to be handled separately; - * otherwise a zero would be recognized incorrectly as - * greater than those values. This has the nice side effect - * that we gain an overall optimized comparison with zeroes. - * Note that a "0" has a "total" of 1 already. - */ - if (integx == 1) { - if (x->value.decimal.lo == 0) { - if (integy != 1) - return -order; - else if (y->value.decimal.lo != 0) - return -order; - else - return(0); - } - } - if (integy == 1) { - if (y->value.decimal.lo == 0) { - if (integx != 1) - return order; - else if (x->value.decimal.lo != 0) - return order; - else - return(0); - } - } - - if (integx > integy) - return order; - else if (integy > integx) - return -order; - - /* - * If the number of integral digits is the same for both numbers, - * then things get a little more complicated. We need to "normalize" - * the numbers in order to properly compare them. To do this, we - * look at the total length of each number (length => number of - * significant digits), and divide the "shorter" by 10 (decreasing - * the length) until they are of equal length. - */ - dlen = x->value.decimal.total - y->value.decimal.total; - if (dlen < 0) { /* y has more digits than x */ - swp = x; - hi = y->value.decimal.hi; - mi = y->value.decimal.mi; - lo = y->value.decimal.lo; - dlen = -dlen; - order = -order; - } else { /* x has more digits than y */ - swp = y; - hi = x->value.decimal.hi; - mi = x->value.decimal.mi; - lo = x->value.decimal.lo; - } - while (dlen > 8) { /* in effect, right shift by 10**8 */ - lo = mi; - mi = hi; - hi = 0; - dlen -= 8; - } - while (dlen > 0) { - unsigned long rem1, rem2; - rem1 = (hi % 10) * 100000000L; - hi = hi / 10; - rem2 = (mi % 10) * 100000000L; - mi = (mi + rem1) / 10; - lo = (lo + rem2) / 10; - dlen--; - } - if (hi > swp->value.decimal.hi) { - return order; - } else if (hi == swp->value.decimal.hi) { - if (mi > swp->value.decimal.mi) { - return order; - } else if (mi == swp->value.decimal.mi) { - if (lo > swp->value.decimal.lo) { - return order; - } else if (lo == swp->value.decimal.lo) { - if (x->value.decimal.total == y->value.decimal.total) { - return 0; - } else { - return order; - } - } - } - } - return -order; -} - -/** - * xmlSchemaCompareDurations: - * @x: a first duration value - * @y: a second duration value - * - * Compare 2 durations - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in - * case of error - */ -static int -xmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) -{ - long carry, mon, day; - double sec; - int invert = 1; - long xmon, xday, myear, minday, maxday; - static const long dayRange [2][12] = { - { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, - { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; - - if ((x == NULL) || (y == NULL)) - return -2; - - /* months */ - mon = x->value.dur.mon - y->value.dur.mon; - - /* seconds */ - sec = x->value.dur.sec - y->value.dur.sec; - carry = (long)sec / SECS_PER_DAY; - sec -= (double)(carry * SECS_PER_DAY); - - /* days */ - day = x->value.dur.day - y->value.dur.day + carry; - - /* easy test */ - if (mon == 0) { - if (day == 0) - if (sec == 0.0) - return 0; - else if (sec < 0.0) - return -1; - else - return 1; - else if (day < 0) - return -1; - else - return 1; - } - - if (mon > 0) { - if ((day >= 0) && (sec >= 0.0)) - return 1; - else { - xmon = mon; - xday = -day; - } - } else if ((day <= 0) && (sec <= 0.0)) { - return -1; - } else { - invert = -1; - xmon = -mon; - xday = day; - } - - myear = xmon / 12; - if (myear == 0) { - minday = 0; - maxday = 0; - } else { - maxday = 366 * ((myear + 3) / 4) + - 365 * ((myear - 1) % 4); - minday = maxday - 1; - } - - xmon = xmon % 12; - minday += dayRange[0][xmon]; - maxday += dayRange[1][xmon]; - - if ((maxday == minday) && (maxday == xday)) - return(0); /* can this really happen ? */ - if (maxday < xday) - return(-invert); - if (minday > xday) - return(invert); - - /* indeterminate */ - return 2; -} - -/* - * macros for adding date/times and durations - */ -#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) -#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) -#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) -#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) - -/** - * xmlSchemaDupVal: - * @v: the #xmlSchemaValPtr value to duplicate - * - * Makes a copy of @v. The calling program is responsible for freeing - * the returned value. - * - * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. - */ -static xmlSchemaValPtr -xmlSchemaDupVal (xmlSchemaValPtr v) -{ - xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); - if (ret == NULL) - return NULL; - - memcpy(ret, v, sizeof(xmlSchemaVal)); - ret->next = NULL; - return ret; -} - -/** - * xmlSchemaCopyValue: - * @val: the precomputed value to be copied - * - * Copies the precomputed value. This duplicates any string within. - * - * Returns the copy or NULL if a copy for a data-type is not implemented. - */ -xmlSchemaValPtr -xmlSchemaCopyValue(xmlSchemaValPtr val) -{ - xmlSchemaValPtr ret = NULL, prev = NULL, cur; - - /* - * Copy the string values. - */ - while (val != NULL) { - switch (val->type) { - case XML_SCHEMAS_ANYTYPE: - case XML_SCHEMAS_IDREFS: - case XML_SCHEMAS_ENTITIES: - case XML_SCHEMAS_NMTOKENS: - xmlSchemaFreeValue(ret); - return (NULL); - case XML_SCHEMAS_ANYSIMPLETYPE: - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_NORMSTRING: - case XML_SCHEMAS_TOKEN: - case XML_SCHEMAS_LANGUAGE: - case XML_SCHEMAS_NAME: - case XML_SCHEMAS_NCNAME: - case XML_SCHEMAS_ID: - case XML_SCHEMAS_IDREF: - case XML_SCHEMAS_ENTITY: - case XML_SCHEMAS_NMTOKEN: - case XML_SCHEMAS_ANYURI: - cur = xmlSchemaDupVal(val); - if (val->value.str != NULL) - cur->value.str = xmlStrdup(BAD_CAST val->value.str); - break; - case XML_SCHEMAS_QNAME: - case XML_SCHEMAS_NOTATION: - cur = xmlSchemaDupVal(val); - if (val->value.qname.name != NULL) - cur->value.qname.name = - xmlStrdup(BAD_CAST val->value.qname.name); - if (val->value.qname.uri != NULL) - cur->value.qname.uri = - xmlStrdup(BAD_CAST val->value.qname.uri); - break; - case XML_SCHEMAS_HEXBINARY: - cur = xmlSchemaDupVal(val); - if (val->value.hex.str != NULL) - cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); - break; - case XML_SCHEMAS_BASE64BINARY: - cur = xmlSchemaDupVal(val); - if (val->value.base64.str != NULL) - cur->value.base64.str = - xmlStrdup(BAD_CAST val->value.base64.str); - break; - default: - cur = xmlSchemaDupVal(val); - break; - } - if (ret == NULL) - ret = cur; - else - prev->next = cur; - prev = cur; - val = val->next; - } - return (ret); -} - -/** - * _xmlSchemaDateAdd: - * @dt: an #xmlSchemaValPtr - * @dur: an #xmlSchemaValPtr of type #XS_DURATION - * - * Compute a new date/time from @dt and @dur. This function assumes @dt - * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, - * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as - * @dt. The calling program is responsible for freeing the returned value. - * - * Returns a pointer to a new #xmlSchemaVal or NULL if error. - */ -static xmlSchemaValPtr -_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) -{ - xmlSchemaValPtr ret, tmp; - long carry, tempdays, temp; - xmlSchemaValDatePtr r, d; - xmlSchemaValDurationPtr u; - - if ((dt == NULL) || (dur == NULL)) - return NULL; - - ret = xmlSchemaNewValue(dt->type); - if (ret == NULL) - return NULL; - - /* make a copy so we don't alter the original value */ - tmp = xmlSchemaDupVal(dt); - if (tmp == NULL) { - xmlSchemaFreeValue(ret); - return NULL; - } - - r = &(ret->value.date); - d = &(tmp->value.date); - u = &(dur->value.dur); - - /* normalization */ - if (d->mon == 0) - d->mon = 1; - - /* normalize for time zone offset */ - u->sec -= (d->tzo * 60); - d->tzo = 0; - - /* normalization */ - if (d->day == 0) - d->day = 1; - - /* month */ - carry = d->mon + u->mon; - r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); - carry = (long) FQUOTIENT_RANGE(carry, 1, 13); - - /* year (may be modified later) */ - r->year = d->year + carry; - if (r->year == 0) { - if (d->year > 0) - r->year--; - else - r->year++; - } - - /* time zone */ - r->tzo = d->tzo; - r->tz_flag = d->tz_flag; - - /* seconds */ - r->sec = d->sec + u->sec; - carry = (long) FQUOTIENT((long)r->sec, 60); - if (r->sec != 0.0) { - r->sec = MODULO(r->sec, 60.0); - } - - /* minute */ - carry += d->min; - r->min = (unsigned int) MODULO(carry, 60); - carry = (long) FQUOTIENT(carry, 60); - - /* hours */ - carry += d->hour; - r->hour = (unsigned int) MODULO(carry, 24); - carry = (long)FQUOTIENT(carry, 24); - - /* - * days - * Note we use tempdays because the temporary values may need more - * than 5 bits - */ - if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && - (d->day > MAX_DAYINMONTH(r->year, r->mon))) - tempdays = MAX_DAYINMONTH(r->year, r->mon); - else if (d->day < 1) - tempdays = 1; - else - tempdays = d->day; - - tempdays += u->day + carry; - - while (1) { - if (tempdays < 1) { - long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13); - long tyr = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13); - if (tyr == 0) - tyr--; - /* - * Coverity detected an overrun in daysInMonth - * of size 12 at position 12 with index variable "((r)->mon - 1)" - */ - if (tmon < 0) - tmon = 0; - if (tmon > 12) - tmon = 12; - tempdays += MAX_DAYINMONTH(tyr, tmon); - carry = -1; - } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { - tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); - carry = 1; - } else - break; - - temp = r->mon + carry; - r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); - r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); - if (r->year == 0) { - if (temp < 1) - r->year--; - else - r->year++; - } - } - - r->day = tempdays; - - /* - * adjust the date/time type to the date values - */ - if (ret->type != XML_SCHEMAS_DATETIME) { - if ((r->hour) || (r->min) || (r->sec)) - ret->type = XML_SCHEMAS_DATETIME; - else if (ret->type != XML_SCHEMAS_DATE) { - if ((r->mon != 1) && (r->day != 1)) - ret->type = XML_SCHEMAS_DATE; - else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) - ret->type = XML_SCHEMAS_GYEARMONTH; - } - } - - xmlSchemaFreeValue(tmp); - - return ret; -} - -/** - * xmlSchemaDateNormalize: - * @dt: an #xmlSchemaValPtr of a date/time type value. - * @offset: number of seconds to adjust @dt by. - * - * Normalize @dt to GMT time. The @offset parameter is subtracted from - * the return value is a time-zone offset is present on @dt. - * - * Returns a normalized copy of @dt or NULL if error. - */ -static xmlSchemaValPtr -xmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) -{ - xmlSchemaValPtr dur, ret; - - if (dt == NULL) - return NULL; - - if (((dt->type != XML_SCHEMAS_TIME) && - (dt->type != XML_SCHEMAS_DATETIME) && - (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0)) - return xmlSchemaDupVal(dt); - - dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); - if (dur == NULL) - return NULL; - - dur->value.date.sec -= offset; - - ret = _xmlSchemaDateAdd(dt, dur); - if (ret == NULL) - return NULL; - - xmlSchemaFreeValue(dur); - - /* ret->value.date.tzo = 0; */ - return ret; -} - -/** - * _xmlSchemaDateCastYMToDays: - * @dt: an #xmlSchemaValPtr - * - * Convert mon and year of @dt to total number of days. Take the - * number of years since (or before) 1 AD and add the number of leap - * years. This is a function because negative - * years must be handled a little differently and there is no zero year. - * - * Returns number of days. - */ -static long -_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) -{ - long ret; - int mon; - - mon = dt->value.date.mon; - if (mon <= 0) mon = 1; /* normalization */ - - if (dt->value.date.year <= 0) - ret = (dt->value.date.year * 365) + - (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ - ((dt->value.date.year+1)/400)) + - DAY_IN_YEAR(0, mon, dt->value.date.year); - else - ret = ((dt->value.date.year-1) * 365) + - (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ - ((dt->value.date.year-1)/400)) + - DAY_IN_YEAR(0, mon, dt->value.date.year); - - return ret; -} - -/** - * TIME_TO_NUMBER: - * @dt: an #xmlSchemaValPtr - * - * Calculates the number of seconds in the time portion of @dt. - * - * Returns seconds. - */ -#define TIME_TO_NUMBER(dt) \ - ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ - (dt->value.date.min * SECS_PER_MIN) + \ - (dt->value.date.tzo * SECS_PER_MIN)) + \ - dt->value.date.sec) - -/** - * xmlSchemaCompareDates: - * @x: a first date/time value - * @y: a second date/time value - * - * Compare 2 date/times - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in - * case of error - */ -static int -xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) -{ - unsigned char xmask, ymask, xor_mask, and_mask; - xmlSchemaValPtr p1, p2, q1, q2; - long p1d, p2d, q1d, q2d; - - if ((x == NULL) || (y == NULL)) - return -2; - - if (x->value.date.tz_flag) { - - if (!y->value.date.tz_flag) { - p1 = xmlSchemaDateNormalize(x, 0); - p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; - /* normalize y + 14:00 */ - q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); - - q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; - if (p1d < q1d) { - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - return -1; - } else if (p1d == q1d) { - double sec; - - sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); - if (sec < 0.0) { - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - return -1; - } else { - int ret = 0; - /* normalize y - 14:00 */ - q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); - q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; - if (p1d > q2d) - ret = 1; - else if (p1d == q2d) { - sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); - if (sec > 0.0) - ret = 1; - else - ret = 2; /* indeterminate */ - } - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - xmlSchemaFreeValue(q2); - if (ret != 0) - return(ret); - } - } else { - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - } - } - } else if (y->value.date.tz_flag) { - q1 = xmlSchemaDateNormalize(y, 0); - q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; - - /* normalize x - 14:00 */ - p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); - p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; - - if (p1d < q1d) { - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - return -1; - } else if (p1d == q1d) { - double sec; - - sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); - if (sec < 0.0) { - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - return -1; - } else { - int ret = 0; - /* normalize x + 14:00 */ - p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); - p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; - - if (p2d > q1d) { - ret = 1; - } else if (p2d == q1d) { - sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); - if (sec > 0.0) - ret = 1; - else - ret = 2; /* indeterminate */ - } - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - xmlSchemaFreeValue(p2); - if (ret != 0) - return(ret); - } - } else { - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - } - } - - /* - * if the same type then calculate the difference - */ - if (x->type == y->type) { - int ret = 0; - q1 = xmlSchemaDateNormalize(y, 0); - q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; - - p1 = xmlSchemaDateNormalize(x, 0); - p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; - - if (p1d < q1d) { - ret = -1; - } else if (p1d > q1d) { - ret = 1; - } else { - double sec; - - sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); - if (sec < 0.0) - ret = -1; - else if (sec > 0.0) - ret = 1; - - } - xmlSchemaFreeValue(p1); - xmlSchemaFreeValue(q1); - return(ret); - } - - switch (x->type) { - case XML_SCHEMAS_DATETIME: - xmask = 0xf; - break; - case XML_SCHEMAS_DATE: - xmask = 0x7; - break; - case XML_SCHEMAS_GYEAR: - xmask = 0x1; - break; - case XML_SCHEMAS_GMONTH: - xmask = 0x2; - break; - case XML_SCHEMAS_GDAY: - xmask = 0x3; - break; - case XML_SCHEMAS_GYEARMONTH: - xmask = 0x3; - break; - case XML_SCHEMAS_GMONTHDAY: - xmask = 0x6; - break; - case XML_SCHEMAS_TIME: - xmask = 0x8; - break; - default: - xmask = 0; - break; - } - - switch (y->type) { - case XML_SCHEMAS_DATETIME: - ymask = 0xf; - break; - case XML_SCHEMAS_DATE: - ymask = 0x7; - break; - case XML_SCHEMAS_GYEAR: - ymask = 0x1; - break; - case XML_SCHEMAS_GMONTH: - ymask = 0x2; - break; - case XML_SCHEMAS_GDAY: - ymask = 0x3; - break; - case XML_SCHEMAS_GYEARMONTH: - ymask = 0x3; - break; - case XML_SCHEMAS_GMONTHDAY: - ymask = 0x6; - break; - case XML_SCHEMAS_TIME: - ymask = 0x8; - break; - default: - ymask = 0; - break; - } - - xor_mask = xmask ^ ymask; /* mark type differences */ - and_mask = xmask & ymask; /* mark field specification */ - - /* year */ - if (xor_mask & 1) - return 2; /* indeterminate */ - else if (and_mask & 1) { - if (x->value.date.year < y->value.date.year) - return -1; - else if (x->value.date.year > y->value.date.year) - return 1; - } - - /* month */ - if (xor_mask & 2) - return 2; /* indeterminate */ - else if (and_mask & 2) { - if (x->value.date.mon < y->value.date.mon) - return -1; - else if (x->value.date.mon > y->value.date.mon) - return 1; - } - - /* day */ - if (xor_mask & 4) - return 2; /* indeterminate */ - else if (and_mask & 4) { - if (x->value.date.day < y->value.date.day) - return -1; - else if (x->value.date.day > y->value.date.day) - return 1; - } - - /* time */ - if (xor_mask & 8) - return 2; /* indeterminate */ - else if (and_mask & 8) { - if (x->value.date.hour < y->value.date.hour) - return -1; - else if (x->value.date.hour > y->value.date.hour) - return 1; - else if (x->value.date.min < y->value.date.min) - return -1; - else if (x->value.date.min > y->value.date.min) - return 1; - else if (x->value.date.sec < y->value.date.sec) - return -1; - else if (x->value.date.sec > y->value.date.sec) - return 1; - } - - return 0; -} - -/** - * xmlSchemaComparePreserveReplaceStrings: - * @x: a first string value - * @y: a second string value - * @invert: inverts the result if x < y or x > y. - * - * Compare 2 string for their normalized values. - * @x is a string with whitespace of "preserve", @y is - * a string with a whitespace of "replace". I.e. @x could - * be an "xsd:string" and @y an "xsd:normalizedString". - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in - * case of error - */ -static int -xmlSchemaComparePreserveReplaceStrings(const xmlChar *x, - const xmlChar *y, - int invert) -{ - int tmp; - - while ((*x != 0) && (*y != 0)) { - if (IS_WSP_REPLACE_CH(*y)) { - if (! IS_WSP_SPACE_CH(*x)) { - if ((*x - 0x20) < 0) { - if (invert) - return(1); - else - return(-1); - } else { - if (invert) - return(-1); - else - return(1); - } - } - } else { - tmp = *x - *y; - if (tmp < 0) { - if (invert) - return(1); - else - return(-1); - } - if (tmp > 0) { - if (invert) - return(-1); - else - return(1); - } - } - x++; - y++; - } - if (*x != 0) { - if (invert) - return(-1); - else - return(1); - } - if (*y != 0) { - if (invert) - return(1); - else - return(-1); - } - return(0); -} - -/** - * xmlSchemaComparePreserveCollapseStrings: - * @x: a first string value - * @y: a second string value - * - * Compare 2 string for their normalized values. - * @x is a string with whitespace of "preserve", @y is - * a string with a whitespace of "collapse". I.e. @x could - * be an "xsd:string" and @y an "xsd:normalizedString". - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in - * case of error - */ -static int -xmlSchemaComparePreserveCollapseStrings(const xmlChar *x, - const xmlChar *y, - int invert) -{ - int tmp; - - /* - * Skip leading blank chars of the collapsed string. - */ - while IS_WSP_BLANK_CH(*y) - y++; - - while ((*x != 0) && (*y != 0)) { - if IS_WSP_BLANK_CH(*y) { - if (! IS_WSP_SPACE_CH(*x)) { - /* - * The yv character would have been replaced to 0x20. - */ - if ((*x - 0x20) < 0) { - if (invert) - return(1); - else - return(-1); - } else { - if (invert) - return(-1); - else - return(1); - } - } - x++; - y++; - /* - * Skip contiguous blank chars of the collapsed string. - */ - while IS_WSP_BLANK_CH(*y) - y++; - } else { - tmp = *x++ - *y++; - if (tmp < 0) { - if (invert) - return(1); - else - return(-1); - } - if (tmp > 0) { - if (invert) - return(-1); - else - return(1); - } - } - } - if (*x != 0) { - if (invert) - return(-1); - else - return(1); - } - if (*y != 0) { - /* - * Skip trailing blank chars of the collapsed string. - */ - while IS_WSP_BLANK_CH(*y) - y++; - if (*y != 0) { - if (invert) - return(1); - else - return(-1); - } - } - return(0); -} - -/** - * xmlSchemaComparePreserveCollapseStrings: - * @x: a first string value - * @y: a second string value - * - * Compare 2 string for their normalized values. - * @x is a string with whitespace of "preserve", @y is - * a string with a whitespace of "collapse". I.e. @x could - * be an "xsd:string" and @y an "xsd:normalizedString". - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in - * case of error - */ -static int -xmlSchemaCompareReplaceCollapseStrings(const xmlChar *x, - const xmlChar *y, - int invert) -{ - int tmp; - - /* - * Skip leading blank chars of the collapsed string. - */ - while IS_WSP_BLANK_CH(*y) - y++; - - while ((*x != 0) && (*y != 0)) { - if IS_WSP_BLANK_CH(*y) { - if (! IS_WSP_BLANK_CH(*x)) { - /* - * The yv character would have been replaced to 0x20. - */ - if ((*x - 0x20) < 0) { - if (invert) - return(1); - else - return(-1); - } else { - if (invert) - return(-1); - else - return(1); - } - } - x++; - y++; - /* - * Skip contiguous blank chars of the collapsed string. - */ - while IS_WSP_BLANK_CH(*y) - y++; - } else { - if IS_WSP_BLANK_CH(*x) { - /* - * The xv character would have been replaced to 0x20. - */ - if ((0x20 - *y) < 0) { - if (invert) - return(1); - else - return(-1); - } else { - if (invert) - return(-1); - else - return(1); - } - } - tmp = *x++ - *y++; - if (tmp < 0) - return(-1); - if (tmp > 0) - return(1); - } - } - if (*x != 0) { - if (invert) - return(-1); - else - return(1); - } - if (*y != 0) { - /* - * Skip trailing blank chars of the collapsed string. - */ - while IS_WSP_BLANK_CH(*y) - y++; - if (*y != 0) { - if (invert) - return(1); - else - return(-1); - } - } - return(0); -} - - -/** - * xmlSchemaCompareReplacedStrings: - * @x: a first string value - * @y: a second string value - * - * Compare 2 string for their normalized values. - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in - * case of error - */ -static int -xmlSchemaCompareReplacedStrings(const xmlChar *x, - const xmlChar *y) -{ - int tmp; - - while ((*x != 0) && (*y != 0)) { - if IS_WSP_BLANK_CH(*y) { - if (! IS_WSP_BLANK_CH(*x)) { - if ((*x - 0x20) < 0) - return(-1); - else - return(1); - } - } else { - if IS_WSP_BLANK_CH(*x) { - if ((0x20 - *y) < 0) - return(-1); - else - return(1); - } - tmp = *x - *y; - if (tmp < 0) - return(-1); - if (tmp > 0) - return(1); - } - x++; - y++; - } - if (*x != 0) - return(1); - if (*y != 0) - return(-1); - return(0); -} - -/** - * xmlSchemaCompareNormStrings: - * @x: a first string value - * @y: a second string value - * - * Compare 2 string for their normalized values. - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in - * case of error - */ -static int -xmlSchemaCompareNormStrings(const xmlChar *x, - const xmlChar *y) { - int tmp; - - while (IS_BLANK_CH(*x)) x++; - while (IS_BLANK_CH(*y)) y++; - while ((*x != 0) && (*y != 0)) { - if (IS_BLANK_CH(*x)) { - if (!IS_BLANK_CH(*y)) { - tmp = *x - *y; - return(tmp); - } - while (IS_BLANK_CH(*x)) x++; - while (IS_BLANK_CH(*y)) y++; - } else { - tmp = *x++ - *y++; - if (tmp < 0) - return(-1); - if (tmp > 0) - return(1); - } - } - if (*x != 0) { - while (IS_BLANK_CH(*x)) x++; - if (*x != 0) - return(1); - } - if (*y != 0) { - while (IS_BLANK_CH(*y)) y++; - if (*y != 0) - return(-1); - } - return(0); -} - -/** - * xmlSchemaCompareFloats: - * @x: a first float or double value - * @y: a second float or double value - * - * Compare 2 values - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in - * case of error - */ -static int -xmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { - double d1, d2; - - if ((x == NULL) || (y == NULL)) - return(-2); - - /* - * Cast everything to doubles. - */ - if (x->type == XML_SCHEMAS_DOUBLE) - d1 = x->value.d; - else if (x->type == XML_SCHEMAS_FLOAT) - d1 = x->value.f; - else - return(-2); - - if (y->type == XML_SCHEMAS_DOUBLE) - d2 = y->value.d; - else if (y->type == XML_SCHEMAS_FLOAT) - d2 = y->value.f; - else - return(-2); - - /* - * Check for special cases. - */ - if (xmlXPathIsNaN(d1)) { - if (xmlXPathIsNaN(d2)) - return(0); - return(1); - } - if (xmlXPathIsNaN(d2)) - return(-1); - if (d1 == xmlXPathPINF) { - if (d2 == xmlXPathPINF) - return(0); - return(1); - } - if (d2 == xmlXPathPINF) - return(-1); - if (d1 == xmlXPathNINF) { - if (d2 == xmlXPathNINF) - return(0); - return(-1); - } - if (d2 == xmlXPathNINF) - return(1); - - /* - * basic tests, the last one we should have equality, but - * portability is more important than speed and handling - * NaN or Inf in a portable way is always a challenge, so ... - */ - if (d1 < d2) - return(-1); - if (d1 > d2) - return(1); - if (d1 == d2) - return(0); - return(2); -} - -/** - * xmlSchemaCompareValues: - * @x: a first value - * @xvalue: the first value as a string (optional) - * @xwtsp: the whitespace type - * @y: a second value - * @xvalue: the second value as a string (optional) - * @ywtsp: the whitespace type - * - * Compare 2 values - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not - * comparable and -2 in case of error - */ -static int -xmlSchemaCompareValuesInternal(xmlSchemaValType xtype, - xmlSchemaValPtr x, - const xmlChar *xvalue, - xmlSchemaWhitespaceValueType xws, - xmlSchemaValType ytype, - xmlSchemaValPtr y, - const xmlChar *yvalue, - xmlSchemaWhitespaceValueType yws) -{ - switch (xtype) { - case XML_SCHEMAS_UNKNOWN: - case XML_SCHEMAS_ANYTYPE: - return(-2); - case XML_SCHEMAS_INTEGER: - case XML_SCHEMAS_NPINTEGER: - case XML_SCHEMAS_NINTEGER: - case XML_SCHEMAS_NNINTEGER: - case XML_SCHEMAS_PINTEGER: - case XML_SCHEMAS_INT: - case XML_SCHEMAS_UINT: - case XML_SCHEMAS_LONG: - case XML_SCHEMAS_ULONG: - case XML_SCHEMAS_SHORT: - case XML_SCHEMAS_USHORT: - case XML_SCHEMAS_BYTE: - case XML_SCHEMAS_UBYTE: - case XML_SCHEMAS_DECIMAL: - if ((x == NULL) || (y == NULL)) - return(-2); - if (ytype == xtype) - return(xmlSchemaCompareDecimals(x, y)); - if ((ytype == XML_SCHEMAS_DECIMAL) || - (ytype == XML_SCHEMAS_INTEGER) || - (ytype == XML_SCHEMAS_NPINTEGER) || - (ytype == XML_SCHEMAS_NINTEGER) || - (ytype == XML_SCHEMAS_NNINTEGER) || - (ytype == XML_SCHEMAS_PINTEGER) || - (ytype == XML_SCHEMAS_INT) || - (ytype == XML_SCHEMAS_UINT) || - (ytype == XML_SCHEMAS_LONG) || - (ytype == XML_SCHEMAS_ULONG) || - (ytype == XML_SCHEMAS_SHORT) || - (ytype == XML_SCHEMAS_USHORT) || - (ytype == XML_SCHEMAS_BYTE) || - (ytype == XML_SCHEMAS_UBYTE)) - return(xmlSchemaCompareDecimals(x, y)); - return(-2); - case XML_SCHEMAS_DURATION: - if ((x == NULL) || (y == NULL)) - return(-2); - if (ytype == XML_SCHEMAS_DURATION) - return(xmlSchemaCompareDurations(x, y)); - return(-2); - case XML_SCHEMAS_TIME: - case XML_SCHEMAS_GDAY: - case XML_SCHEMAS_GMONTH: - case XML_SCHEMAS_GMONTHDAY: - case XML_SCHEMAS_GYEAR: - case XML_SCHEMAS_GYEARMONTH: - case XML_SCHEMAS_DATE: - case XML_SCHEMAS_DATETIME: - if ((x == NULL) || (y == NULL)) - return(-2); - if ((ytype == XML_SCHEMAS_DATETIME) || - (ytype == XML_SCHEMAS_TIME) || - (ytype == XML_SCHEMAS_GDAY) || - (ytype == XML_SCHEMAS_GMONTH) || - (ytype == XML_SCHEMAS_GMONTHDAY) || - (ytype == XML_SCHEMAS_GYEAR) || - (ytype == XML_SCHEMAS_DATE) || - (ytype == XML_SCHEMAS_GYEARMONTH)) - return (xmlSchemaCompareDates(x, y)); - return (-2); - /* - * Note that we will support comparison of string types against - * anySimpleType as well. - */ - case XML_SCHEMAS_ANYSIMPLETYPE: - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_NORMSTRING: - case XML_SCHEMAS_TOKEN: - case XML_SCHEMAS_LANGUAGE: - case XML_SCHEMAS_NMTOKEN: - case XML_SCHEMAS_NAME: - case XML_SCHEMAS_NCNAME: - case XML_SCHEMAS_ID: - case XML_SCHEMAS_IDREF: - case XML_SCHEMAS_ENTITY: - case XML_SCHEMAS_ANYURI: - { - const xmlChar *xv, *yv; - - if (x == NULL) - xv = xvalue; - else - xv = x->value.str; - if (y == NULL) - yv = yvalue; - else - yv = y->value.str; - /* - * TODO: Compare those against QName. - */ - if (ytype == XML_SCHEMAS_QNAME) { - TODO - if (y == NULL) - return(-2); - return (-2); - } - if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) || - (ytype == XML_SCHEMAS_STRING) || - (ytype == XML_SCHEMAS_NORMSTRING) || - (ytype == XML_SCHEMAS_TOKEN) || - (ytype == XML_SCHEMAS_LANGUAGE) || - (ytype == XML_SCHEMAS_NMTOKEN) || - (ytype == XML_SCHEMAS_NAME) || - (ytype == XML_SCHEMAS_NCNAME) || - (ytype == XML_SCHEMAS_ID) || - (ytype == XML_SCHEMAS_IDREF) || - (ytype == XML_SCHEMAS_ENTITY) || - (ytype == XML_SCHEMAS_ANYURI)) { - - if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { - - if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { - /* TODO: What about x < y or x > y. */ - if (xmlStrEqual(xv, yv)) - return (0); - else - return (2); - } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) - return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0)); - else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) - return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0)); - - } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { - - if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) - return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1)); - if (yws == XML_SCHEMA_WHITESPACE_REPLACE) - return (xmlSchemaCompareReplacedStrings(xv, yv)); - if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) - return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0)); - - } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { - - if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) - return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1)); - if (yws == XML_SCHEMA_WHITESPACE_REPLACE) - return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1)); - if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) - return (xmlSchemaCompareNormStrings(xv, yv)); - } else - return (-2); - - } - return (-2); - } - case XML_SCHEMAS_QNAME: - case XML_SCHEMAS_NOTATION: - if ((x == NULL) || (y == NULL)) - return(-2); - if ((ytype == XML_SCHEMAS_QNAME) || - (ytype == XML_SCHEMAS_NOTATION)) { - if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && - (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) - return(0); - return(2); - } - return (-2); - case XML_SCHEMAS_FLOAT: - case XML_SCHEMAS_DOUBLE: - if ((x == NULL) || (y == NULL)) - return(-2); - if ((ytype == XML_SCHEMAS_FLOAT) || - (ytype == XML_SCHEMAS_DOUBLE)) - return (xmlSchemaCompareFloats(x, y)); - return (-2); - case XML_SCHEMAS_BOOLEAN: - if ((x == NULL) || (y == NULL)) - return(-2); - if (ytype == XML_SCHEMAS_BOOLEAN) { - if (x->value.b == y->value.b) - return(0); - if (x->value.b == 0) - return(-1); - return(1); - } - return (-2); - case XML_SCHEMAS_HEXBINARY: - if ((x == NULL) || (y == NULL)) - return(-2); - if (ytype == XML_SCHEMAS_HEXBINARY) { - if (x->value.hex.total == y->value.hex.total) { - int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); - if (ret > 0) - return(1); - else if (ret == 0) - return(0); - } - else if (x->value.hex.total > y->value.hex.total) - return(1); - - return(-1); - } - return (-2); - case XML_SCHEMAS_BASE64BINARY: - if ((x == NULL) || (y == NULL)) - return(-2); - if (ytype == XML_SCHEMAS_BASE64BINARY) { - if (x->value.base64.total == y->value.base64.total) { - int ret = xmlStrcmp(x->value.base64.str, - y->value.base64.str); - if (ret > 0) - return(1); - else if (ret == 0) - return(0); - else - return(-1); - } - else if (x->value.base64.total > y->value.base64.total) - return(1); - else - return(-1); - } - return (-2); - case XML_SCHEMAS_IDREFS: - case XML_SCHEMAS_ENTITIES: - case XML_SCHEMAS_NMTOKENS: - TODO - break; - } - return -2; -} - -/** - * xmlSchemaCompareValues: - * @x: a first value - * @y: a second value - * - * Compare 2 values - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in - * case of error - */ -int -xmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { - xmlSchemaWhitespaceValueType xws, yws; - - if ((x == NULL) || (y == NULL)) - return(-2); - if (x->type == XML_SCHEMAS_STRING) - xws = XML_SCHEMA_WHITESPACE_PRESERVE; - else if (x->type == XML_SCHEMAS_NORMSTRING) - xws = XML_SCHEMA_WHITESPACE_REPLACE; - else - xws = XML_SCHEMA_WHITESPACE_COLLAPSE; - - if (y->type == XML_SCHEMAS_STRING) - yws = XML_SCHEMA_WHITESPACE_PRESERVE; - else if (x->type == XML_SCHEMAS_NORMSTRING) - yws = XML_SCHEMA_WHITESPACE_REPLACE; - else - yws = XML_SCHEMA_WHITESPACE_COLLAPSE; - - return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, - y, NULL, yws)); -} - -/** - * xmlSchemaCompareValuesWhtsp: - * @x: a first value - * @xws: the whitespace value of x - * @y: a second value - * @yws: the whitespace value of y - * - * Compare 2 values - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in - * case of error - */ -int -xmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, - xmlSchemaWhitespaceValueType xws, - xmlSchemaValPtr y, - xmlSchemaWhitespaceValueType yws) -{ - if ((x == NULL) || (y == NULL)) - return(-2); - return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, - y, NULL, yws)); -} - -/** - * xmlSchemaCompareValuesWhtspExt: - * @x: a first value - * @xws: the whitespace value of x - * @y: a second value - * @yws: the whitespace value of y - * - * Compare 2 values - * - * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in - * case of error - */ -static int -xmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype, - xmlSchemaValPtr x, - const xmlChar *xvalue, - xmlSchemaWhitespaceValueType xws, - xmlSchemaValType ytype, - xmlSchemaValPtr y, - const xmlChar *yvalue, - xmlSchemaWhitespaceValueType yws) -{ - return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y, - yvalue, yws)); -} - -/** - * xmlSchemaNormLen: - * @value: a string - * - * Computes the UTF8 length of the normalized value of the string - * - * Returns the length or -1 in case of error. - */ -static int -xmlSchemaNormLen(const xmlChar *value) { - const xmlChar *utf; - int ret = 0; - - if (value == NULL) - return(-1); - utf = value; - while (IS_BLANK_CH(*utf)) utf++; - while (*utf != 0) { - if (utf[0] & 0x80) { - if ((utf[1] & 0xc0) != 0x80) - return(-1); - if ((utf[0] & 0xe0) == 0xe0) { - if ((utf[2] & 0xc0) != 0x80) - return(-1); - if ((utf[0] & 0xf0) == 0xf0) { - if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) - return(-1); - utf += 4; - } else { - utf += 3; - } - } else { - utf += 2; - } - } else if (IS_BLANK_CH(*utf)) { - while (IS_BLANK_CH(*utf)) utf++; - if (*utf == 0) - break; - } else { - utf++; - } - ret++; - } - return(ret); -} - -/** - * xmlSchemaGetFacetValueAsULong: - * @facet: an schemas type facet - * - * Extract the value of a facet - * - * Returns the value as a long - */ -unsigned long -xmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) -{ - /* - * TODO: Check if this is a decimal. - */ - if (facet == NULL) - return 0; - return ((unsigned long) facet->val->value.decimal.lo); -} - -/** - * xmlSchemaValidateListSimpleTypeFacet: - * @facet: the facet to check - * @value: the lexical repr of the value to validate - * @actualLen: the number of list items - * @expectedLen: the resulting expected number of list items - * - * Checks the value of a list simple type against a facet. - * - * Returns 0 if the value is valid, a positive error code - * number otherwise and -1 in case of an internal error. - */ -int -xmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, - const xmlChar *value, - unsigned long actualLen, - unsigned long *expectedLen) -{ - if (facet == NULL) - return(-1); - /* - * TODO: Check if this will work with large numbers. - * (compare value.decimal.mi and value.decimal.hi as well?). - */ - if (facet->type == XML_SCHEMA_FACET_LENGTH) { - if (actualLen != facet->val->value.decimal.lo) { - if (expectedLen != NULL) - *expectedLen = facet->val->value.decimal.lo; - return (XML_SCHEMAV_CVC_LENGTH_VALID); - } - } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { - if (actualLen < facet->val->value.decimal.lo) { - if (expectedLen != NULL) - *expectedLen = facet->val->value.decimal.lo; - return (XML_SCHEMAV_CVC_MINLENGTH_VALID); - } - } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { - if (actualLen > facet->val->value.decimal.lo) { - if (expectedLen != NULL) - *expectedLen = facet->val->value.decimal.lo; - return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); - } - } else - /* - * NOTE: That we can pass NULL as xmlSchemaValPtr to - * xmlSchemaValidateFacet, since the remaining facet types - * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. - */ - return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); - return (0); -} - -/** - * xmlSchemaValidateLengthFacet: - * @type: the built-in type - * @facet: the facet to check - * @value: the lexical repr. of the value to be validated - * @val: the precomputed value - * @ws: the whitespace type of the value - * @length: the actual length of the value - * - * Checka a value against a "length", "minLength" and "maxLength" - * facet; sets @length to the computed length of @value. - * - * Returns 0 if the value is valid, a positive error code - * otherwise and -1 in case of an internal or API error. - */ -static int -xmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet, - xmlSchemaTypeType valType, - const xmlChar *value, - xmlSchemaValPtr val, - unsigned long *length, - xmlSchemaWhitespaceValueType ws) -{ - unsigned int len = 0; - - if ((length == NULL) || (facet == NULL)) - return (-1); - *length = 0; - if ((facet->type != XML_SCHEMA_FACET_LENGTH) && - (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && - (facet->type != XML_SCHEMA_FACET_MINLENGTH)) - return (-1); - - /* - * TODO: length, maxLength and minLength must be of type - * nonNegativeInteger only. Check if decimal is used somehow. - */ - if ((facet->val == NULL) || - ((facet->val->type != XML_SCHEMAS_DECIMAL) && - (facet->val->type != XML_SCHEMAS_NNINTEGER)) || - (facet->val->value.decimal.frac != 0)) { - return(-1); - } - if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) - len = val->value.hex.total; - else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) - len = val->value.base64.total; - else { - switch (valType) { - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_NORMSTRING: - if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { - /* - * This is to ensure API compatibility with the old - * xmlSchemaValidateLengthFacet(). Anyway, this was and - * is not the correct handling. - * TODO: Get rid of this case somehow. - */ - if (valType == XML_SCHEMAS_STRING) - len = xmlUTF8Strlen(value); - else - len = xmlSchemaNormLen(value); - } else if (value != NULL) { - if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) - len = xmlSchemaNormLen(value); - else - /* - * Should be OK for "preserve" as well. - */ - len = xmlUTF8Strlen(value); - } - break; - case XML_SCHEMAS_IDREF: - case XML_SCHEMAS_TOKEN: - case XML_SCHEMAS_LANGUAGE: - case XML_SCHEMAS_NMTOKEN: - case XML_SCHEMAS_NAME: - case XML_SCHEMAS_NCNAME: - case XML_SCHEMAS_ID: - /* - * FIXME: What exactly to do with anyURI? - */ - case XML_SCHEMAS_ANYURI: - if (value != NULL) - len = xmlSchemaNormLen(value); - break; - case XML_SCHEMAS_QNAME: - case XML_SCHEMAS_NOTATION: - /* - * For QName and NOTATION, those facets are - * deprecated and should be ignored. - */ - return (0); - default: - TODO - } - } - *length = (unsigned long) len; - /* - * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi". - */ - if (facet->type == XML_SCHEMA_FACET_LENGTH) { - if (len != facet->val->value.decimal.lo) - return(XML_SCHEMAV_CVC_LENGTH_VALID); - } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { - if (len < facet->val->value.decimal.lo) - return(XML_SCHEMAV_CVC_MINLENGTH_VALID); - } else { - if (len > facet->val->value.decimal.lo) - return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); - } - - return (0); -} - -/** - * xmlSchemaValidateLengthFacet: - * @type: the built-in type - * @facet: the facet to check - * @value: the lexical repr. of the value to be validated - * @val: the precomputed value - * @length: the actual length of the value - * - * Checka a value against a "length", "minLength" and "maxLength" - * facet; sets @length to the computed length of @value. - * - * Returns 0 if the value is valid, a positive error code - * otherwise and -1 in case of an internal or API error. - */ -int -xmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, - xmlSchemaFacetPtr facet, - const xmlChar *value, - xmlSchemaValPtr val, - unsigned long *length) -{ - if (type == NULL) - return(-1); - return (xmlSchemaValidateLengthFacetInternal(facet, - type->builtInType, value, val, length, - XML_SCHEMA_WHITESPACE_UNKNOWN)); -} - -/** - * xmlSchemaValidateLengthFacetWhtsp: - * @facet: the facet to check - * @valType: the built-in type - * @value: the lexical repr. of the value to be validated - * @val: the precomputed value - * @ws: the whitespace type of the value - * @length: the actual length of the value - * - * Checka a value against a "length", "minLength" and "maxLength" - * facet; sets @length to the computed length of @value. - * - * Returns 0 if the value is valid, a positive error code - * otherwise and -1 in case of an internal or API error. - */ -int -xmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, - xmlSchemaValType valType, - const xmlChar *value, - xmlSchemaValPtr val, - unsigned long *length, - xmlSchemaWhitespaceValueType ws) -{ - return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val, - length, ws)); -} - -/** - * xmlSchemaValidateFacetInternal: - * @facet: the facet to check - * @fws: the whitespace type of the facet's value - * @valType: the built-in type of the value - * @value: the lexical repr of the value to validate - * @val: the precomputed value - * @ws: the whitespace type of the value - * - * Check a value against a facet condition - * - * Returns 0 if the element is schemas valid, a positive error code - * number otherwise and -1 in case of internal or API error. - */ -static int -xmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet, - xmlSchemaWhitespaceValueType fws, - xmlSchemaValType valType, - const xmlChar *value, - xmlSchemaValPtr val, - xmlSchemaWhitespaceValueType ws) -{ - int ret; - - if (facet == NULL) - return(-1); - - switch (facet->type) { - case XML_SCHEMA_FACET_PATTERN: - /* - * NOTE that for patterns, the @value needs to be the normalized - * value, *not* the lexical initial value or the canonical value. - */ - if (value == NULL) - return(-1); - ret = xmlRegexpExec(facet->regexp, value); - if (ret == 1) - return(0); - if (ret == 0) - return(XML_SCHEMAV_CVC_PATTERN_VALID); - return(ret); - case XML_SCHEMA_FACET_MAXEXCLUSIVE: - ret = xmlSchemaCompareValues(val, facet->val); - if (ret == -2) - return(-1); - if (ret == -1) - return(0); - return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); - case XML_SCHEMA_FACET_MAXINCLUSIVE: - ret = xmlSchemaCompareValues(val, facet->val); - if (ret == -2) - return(-1); - if ((ret == -1) || (ret == 0)) - return(0); - return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); - case XML_SCHEMA_FACET_MINEXCLUSIVE: - ret = xmlSchemaCompareValues(val, facet->val); - if (ret == -2) - return(-1); - if (ret == 1) - return(0); - return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); - case XML_SCHEMA_FACET_MININCLUSIVE: - ret = xmlSchemaCompareValues(val, facet->val); - if (ret == -2) - return(-1); - if ((ret == 1) || (ret == 0)) - return(0); - return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); - case XML_SCHEMA_FACET_WHITESPACE: - /* TODO whitespaces */ - /* - * NOTE: Whitespace should be handled to normalize - * the value to be validated against a the facets; - * not to normalize the value in-between. - */ - return(0); - case XML_SCHEMA_FACET_ENUMERATION: - if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { - /* - * This is to ensure API compatibility with the old - * xmlSchemaValidateFacet(). - * TODO: Get rid of this case. - */ - if ((facet->value != NULL) && - (xmlStrEqual(facet->value, value))) - return(0); - } else { - ret = xmlSchemaCompareValuesWhtspExt(facet->val->type, - facet->val, facet->value, fws, valType, val, - value, ws); - if (ret == -2) - return(-1); - if (ret == 0) - return(0); - } - return(XML_SCHEMAV_CVC_ENUMERATION_VALID); - case XML_SCHEMA_FACET_LENGTH: - /* - * SPEC (1.3) "if {primitive type definition} is QName or NOTATION, - * then any {value} is facet-valid." - */ - if ((valType == XML_SCHEMAS_QNAME) || - (valType == XML_SCHEMAS_NOTATION)) - return (0); - /* No break on purpose. */ - case XML_SCHEMA_FACET_MAXLENGTH: - case XML_SCHEMA_FACET_MINLENGTH: { - unsigned int len = 0; - - if ((valType == XML_SCHEMAS_QNAME) || - (valType == XML_SCHEMAS_NOTATION)) - return (0); - /* - * TODO: length, maxLength and minLength must be of type - * nonNegativeInteger only. Check if decimal is used somehow. - */ - if ((facet->val == NULL) || - ((facet->val->type != XML_SCHEMAS_DECIMAL) && - (facet->val->type != XML_SCHEMAS_NNINTEGER)) || - (facet->val->value.decimal.frac != 0)) { - return(-1); - } - if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) - len = val->value.hex.total; - else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) - len = val->value.base64.total; - else { - switch (valType) { - case XML_SCHEMAS_STRING: - case XML_SCHEMAS_NORMSTRING: - if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { - /* - * This is to ensure API compatibility with the old - * xmlSchemaValidateFacet(). Anyway, this was and - * is not the correct handling. - * TODO: Get rid of this case somehow. - */ - if (valType == XML_SCHEMAS_STRING) - len = xmlUTF8Strlen(value); - else - len = xmlSchemaNormLen(value); - } else if (value != NULL) { - if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) - len = xmlSchemaNormLen(value); - else - /* - * Should be OK for "preserve" as well. - */ - len = xmlUTF8Strlen(value); - } - break; - case XML_SCHEMAS_IDREF: - case XML_SCHEMAS_TOKEN: - case XML_SCHEMAS_LANGUAGE: - case XML_SCHEMAS_NMTOKEN: - case XML_SCHEMAS_NAME: - case XML_SCHEMAS_NCNAME: - case XML_SCHEMAS_ID: - case XML_SCHEMAS_ANYURI: - if (value != NULL) - len = xmlSchemaNormLen(value); - break; - default: - TODO - } - } - if (facet->type == XML_SCHEMA_FACET_LENGTH) { - if (len != facet->val->value.decimal.lo) - return(XML_SCHEMAV_CVC_LENGTH_VALID); - } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { - if (len < facet->val->value.decimal.lo) - return(XML_SCHEMAV_CVC_MINLENGTH_VALID); - } else { - if (len > facet->val->value.decimal.lo) - return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); - } - break; - } - case XML_SCHEMA_FACET_TOTALDIGITS: - case XML_SCHEMA_FACET_FRACTIONDIGITS: - - if ((facet->val == NULL) || - ((facet->val->type != XML_SCHEMAS_PINTEGER) && - (facet->val->type != XML_SCHEMAS_NNINTEGER)) || - (facet->val->value.decimal.frac != 0)) { - return(-1); - } - if ((val == NULL) || - ((val->type != XML_SCHEMAS_DECIMAL) && - (val->type != XML_SCHEMAS_INTEGER) && - (val->type != XML_SCHEMAS_NPINTEGER) && - (val->type != XML_SCHEMAS_NINTEGER) && - (val->type != XML_SCHEMAS_NNINTEGER) && - (val->type != XML_SCHEMAS_PINTEGER) && - (val->type != XML_SCHEMAS_INT) && - (val->type != XML_SCHEMAS_UINT) && - (val->type != XML_SCHEMAS_LONG) && - (val->type != XML_SCHEMAS_ULONG) && - (val->type != XML_SCHEMAS_SHORT) && - (val->type != XML_SCHEMAS_USHORT) && - (val->type != XML_SCHEMAS_BYTE) && - (val->type != XML_SCHEMAS_UBYTE))) { - return(-1); - } - if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { - if (val->value.decimal.total > facet->val->value.decimal.lo) - return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); - - } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { - if (val->value.decimal.frac > facet->val->value.decimal.lo) - return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); - } - break; - default: - TODO - } - return(0); - -} - -/** - * xmlSchemaValidateFacet: - * @base: the base type - * @facet: the facet to check - * @value: the lexical repr of the value to validate - * @val: the precomputed value - * - * Check a value against a facet condition - * - * Returns 0 if the element is schemas valid, a positive error code - * number otherwise and -1 in case of internal or API error. - */ -int -xmlSchemaValidateFacet(xmlSchemaTypePtr base, - xmlSchemaFacetPtr facet, - const xmlChar *value, - xmlSchemaValPtr val) -{ - /* - * This tries to ensure API compatibility regarding the old - * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and - * xmlSchemaValidateFacetWhtsp(). - */ - if (val != NULL) - return(xmlSchemaValidateFacetInternal(facet, - XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val, - XML_SCHEMA_WHITESPACE_UNKNOWN)); - else if (base != NULL) - return(xmlSchemaValidateFacetInternal(facet, - XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val, - XML_SCHEMA_WHITESPACE_UNKNOWN)); - return(-1); -} - -/** - * xmlSchemaValidateFacetWhtsp: - * @facet: the facet to check - * @fws: the whitespace type of the facet's value - * @valType: the built-in type of the value - * @value: the lexical (or normalized for pattern) repr of the value to validate - * @val: the precomputed value - * @ws: the whitespace type of the value - * - * Check a value against a facet condition. This takes value normalization - * according to the specified whitespace types into account. - * Note that @value needs to be the *normalized* value if the facet - * is of type "pattern". - * - * Returns 0 if the element is schemas valid, a positive error code - * number otherwise and -1 in case of internal or API error. - */ -int -xmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet, - xmlSchemaWhitespaceValueType fws, - xmlSchemaValType valType, - const xmlChar *value, - xmlSchemaValPtr val, - xmlSchemaWhitespaceValueType ws) -{ - return(xmlSchemaValidateFacetInternal(facet, fws, valType, - value, val, ws)); -} - -#if 0 -#ifndef DBL_DIG -#define DBL_DIG 16 -#endif -#ifndef DBL_EPSILON -#define DBL_EPSILON 1E-9 -#endif - -#define INTEGER_DIGITS DBL_DIG -#define FRACTION_DIGITS (DBL_DIG + 1) -#define EXPONENT_DIGITS (3 + 2) - -/** - * xmlXPathFormatNumber: - * @number: number to format - * @buffer: output buffer - * @buffersize: size of output buffer - * - * Convert the number into a string representation. - */ -static void -xmlSchemaFormatFloat(double number, char buffer[], int buffersize) -{ - switch (xmlXPathIsInf(number)) { - case 1: - if (buffersize > (int)sizeof("INF")) - snprintf(buffer, buffersize, "INF"); - break; - case -1: - if (buffersize > (int)sizeof("-INF")) - snprintf(buffer, buffersize, "-INF"); - break; - default: - if (xmlXPathIsNaN(number)) { - if (buffersize > (int)sizeof("NaN")) - snprintf(buffer, buffersize, "NaN"); - } else if (number == 0) { - snprintf(buffer, buffersize, "0.0E0"); - } else { - /* 3 is sign, decimal point, and terminating zero */ - char work[DBL_DIG + EXPONENT_DIGITS + 3]; - int integer_place, fraction_place; - char *ptr; - char *after_fraction; - double absolute_value; - int size; - - absolute_value = fabs(number); - - /* - * Result is in work, and after_fraction points - * just past the fractional part. - * Use scientific notation - */ - integer_place = DBL_DIG + EXPONENT_DIGITS + 1; - fraction_place = DBL_DIG - 1; - snprintf(work, sizeof(work),"%*.*e", - integer_place, fraction_place, number); - after_fraction = strchr(work + DBL_DIG, 'e'); - /* Remove fractional trailing zeroes */ - ptr = after_fraction; - while (*(--ptr) == '0') - ; - if (*ptr != '.') - ptr++; - while ((*ptr++ = *after_fraction++) != 0); - - /* Finally copy result back to caller */ - size = strlen(work) + 1; - if (size > buffersize) { - work[buffersize - 1] = 0; - size = buffersize; - } - memmove(buffer, work, size); - } - break; - } -} -#endif - -/** - * xmlSchemaGetCanonValue: - * @val: the precomputed value - * @retValue: the returned value - * - * Get a the cononical lexical representation of the value. - * The caller has to FREE the returned retValue. - * - * WARNING: Some value types are not supported yet, resulting - * in a @retValue of "???". - * - * TODO: XML Schema 1.0 does not define canonical representations - * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, - * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. - * - * - * Returns 0 if the value could be built, 1 if the value type is - * not supported yet and -1 in case of API errors. - */ -int -xmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) -{ - if ((retValue == NULL) || (val == NULL)) - return (-1); - *retValue = NULL; - switch (val->type) { - case XML_SCHEMAS_STRING: - if (val->value.str == NULL) - *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); - else - *retValue = - BAD_CAST xmlStrdup((const xmlChar *) val->value.str); - break; - case XML_SCHEMAS_NORMSTRING: - if (val->value.str == NULL) - *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); - else { - *retValue = xmlSchemaWhiteSpaceReplace( - (const xmlChar *) val->value.str); - if ((*retValue) == NULL) - *retValue = BAD_CAST xmlStrdup( - (const xmlChar *) val->value.str); - } - break; - case XML_SCHEMAS_TOKEN: - case XML_SCHEMAS_LANGUAGE: - case XML_SCHEMAS_NMTOKEN: - case XML_SCHEMAS_NAME: - case XML_SCHEMAS_NCNAME: - case XML_SCHEMAS_ID: - case XML_SCHEMAS_IDREF: - case XML_SCHEMAS_ENTITY: - case XML_SCHEMAS_NOTATION: /* Unclear */ - case XML_SCHEMAS_ANYURI: /* Unclear */ - if (val->value.str == NULL) - return (-1); - *retValue = - BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str); - if (*retValue == NULL) - *retValue = - BAD_CAST xmlStrdup((const xmlChar *) val->value.str); - break; - case XML_SCHEMAS_QNAME: - /* TODO: Unclear in XML Schema 1.0. */ - if (val->value.qname.uri == NULL) { - *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name); - return (0); - } else { - *retValue = BAD_CAST xmlStrdup(BAD_CAST "{"); - *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), - BAD_CAST val->value.qname.uri); - *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), - BAD_CAST "}"); - *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), - BAD_CAST val->value.qname.uri); - } - break; - case XML_SCHEMAS_DECIMAL: - /* - * TODO: Lookout for a more simple implementation. - */ - if ((val->value.decimal.total == 1) && - (val->value.decimal.lo == 0)) { - *retValue = xmlStrdup(BAD_CAST "0.0"); - } else { - xmlSchemaValDecimal dec = val->value.decimal; - int bufsize; - char *buf = NULL, *offs; - - /* Add room for the decimal point as well. */ - bufsize = dec.total + 2; - if (dec.sign) - bufsize++; - /* Add room for leading/trailing zero. */ - if ((dec.frac == 0) || (dec.frac == dec.total)) - bufsize++; - buf = xmlMalloc(bufsize); - if (buf == NULL) - return(-1); - offs = buf; - if (dec.sign) - *offs++ = '-'; - if (dec.frac == dec.total) { - *offs++ = '0'; - *offs++ = '.'; - } - if (dec.hi != 0) - snprintf(offs, bufsize - (offs - buf), - "%lu%lu%lu", dec.hi, dec.mi, dec.lo); - else if (dec.mi != 0) - snprintf(offs, bufsize - (offs - buf), - "%lu%lu", dec.mi, dec.lo); - else - snprintf(offs, bufsize - (offs - buf), - "%lu", dec.lo); - - if (dec.frac != 0) { - if (dec.frac != dec.total) { - int diff = dec.total - dec.frac; - /* - * Insert the decimal point. - */ - memmove(offs + diff + 1, offs + diff, dec.frac +1); - offs[diff] = '.'; - } else { - unsigned int i = 0; - /* - * Insert missing zeroes behind the decimal point. - */ - while (*(offs + i) != 0) - i++; - if (i < dec.total) { - memmove(offs + (dec.total - i), offs, i +1); - memset(offs, '0', dec.total - i); - } - } - } else { - /* - * Append decimal point and zero. - */ - offs = buf + bufsize - 1; - *offs-- = 0; - *offs-- = '0'; - *offs-- = '.'; - } - *retValue = BAD_CAST buf; - } - break; - case XML_SCHEMAS_INTEGER: - case XML_SCHEMAS_PINTEGER: - case XML_SCHEMAS_NPINTEGER: - case XML_SCHEMAS_NINTEGER: - case XML_SCHEMAS_NNINTEGER: - case XML_SCHEMAS_LONG: - case XML_SCHEMAS_BYTE: - case XML_SCHEMAS_SHORT: - case XML_SCHEMAS_INT: - case XML_SCHEMAS_UINT: - case XML_SCHEMAS_ULONG: - case XML_SCHEMAS_USHORT: - case XML_SCHEMAS_UBYTE: - if ((val->value.decimal.total == 1) && - (val->value.decimal.lo == 0)) - *retValue = xmlStrdup(BAD_CAST "0"); - else { - xmlSchemaValDecimal dec = val->value.decimal; - int bufsize = dec.total + 1; - - /* Add room for the decimal point as well. */ - if (dec.sign) - bufsize++; - *retValue = xmlMalloc(bufsize); - if (*retValue == NULL) - return(-1); - if (dec.hi != 0) { - if (dec.sign) - snprintf((char *) *retValue, bufsize, - "-%lu%lu%lu", dec.hi, dec.mi, dec.lo); - else - snprintf((char *) *retValue, bufsize, - "%lu%lu%lu", dec.hi, dec.mi, dec.lo); - } else if (dec.mi != 0) { - if (dec.sign) - snprintf((char *) *retValue, bufsize, - "-%lu%lu", dec.mi, dec.lo); - else - snprintf((char *) *retValue, bufsize, - "%lu%lu", dec.mi, dec.lo); - } else { - if (dec.sign) - snprintf((char *) *retValue, bufsize, "-%lu", dec.lo); - else - snprintf((char *) *retValue, bufsize, "%lu", dec.lo); - } - } - break; - case XML_SCHEMAS_BOOLEAN: - if (val->value.b) - *retValue = BAD_CAST xmlStrdup(BAD_CAST "true"); - else - *retValue = BAD_CAST xmlStrdup(BAD_CAST "false"); - break; - case XML_SCHEMAS_DURATION: { - char buf[100]; - unsigned long year; - unsigned long mon, day, hour = 0, min = 0; - double sec = 0, left; - - /* TODO: Unclear in XML Schema 1.0 */ - /* - * TODO: This results in a normalized output of the value - * - which is NOT conformant to the spec - - * since the exact values of each property are not - * recoverable. Think about extending the structure to - * provide a field for every property. - */ - year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12); - mon = labs(val->value.dur.mon) - 12 * year; - - day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400); - left = fabs(val->value.dur.sec) - day * 86400; - if (left > 0) { - hour = (unsigned long) FQUOTIENT(left, 3600); - left = left - (hour * 3600); - if (left > 0) { - min = (unsigned long) FQUOTIENT(left, 60); - sec = left - (min * 60); - } - } - if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0)) - snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS", - year, mon, day, hour, min, sec); - else - snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS", - year, mon, day, hour, min, sec); - *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); - } - break; - case XML_SCHEMAS_GYEAR: { - char buf[30]; - /* TODO: Unclear in XML Schema 1.0 */ - /* TODO: What to do with the timezone? */ - snprintf(buf, 30, "%04ld", val->value.date.year); - *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); - } - break; - case XML_SCHEMAS_GMONTH: { - /* TODO: Unclear in XML Schema 1.0 */ - /* TODO: What to do with the timezone? */ - *retValue = xmlMalloc(6); - if (*retValue == NULL) - return(-1); - snprintf((char *) *retValue, 6, "--%02u", - val->value.date.mon); - } - break; - case XML_SCHEMAS_GDAY: { - /* TODO: Unclear in XML Schema 1.0 */ - /* TODO: What to do with the timezone? */ - *retValue = xmlMalloc(6); - if (*retValue == NULL) - return(-1); - snprintf((char *) *retValue, 6, "---%02u", - val->value.date.day); - } - break; - case XML_SCHEMAS_GMONTHDAY: { - /* TODO: Unclear in XML Schema 1.0 */ - /* TODO: What to do with the timezone? */ - *retValue = xmlMalloc(8); - if (*retValue == NULL) - return(-1); - snprintf((char *) *retValue, 8, "--%02u-%02u", - val->value.date.mon, val->value.date.day); - } - break; - case XML_SCHEMAS_GYEARMONTH: { - char buf[35]; - /* TODO: Unclear in XML Schema 1.0 */ - /* TODO: What to do with the timezone? */ - if (val->value.date.year < 0) - snprintf(buf, 35, "-%04ld-%02u", - labs(val->value.date.year), - val->value.date.mon); - else - snprintf(buf, 35, "%04ld-%02u", - val->value.date.year, val->value.date.mon); - *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); - } - break; - case XML_SCHEMAS_TIME: - { - char buf[30]; - - if (val->value.date.tz_flag) { - xmlSchemaValPtr norm; - - norm = xmlSchemaDateNormalize(val, 0); - if (norm == NULL) - return (-1); - /* - * TODO: Check if "%.14g" is portable. - */ - snprintf(buf, 30, - "%02u:%02u:%02.14gZ", - norm->value.date.hour, - norm->value.date.min, - norm->value.date.sec); - xmlSchemaFreeValue(norm); - } else { - snprintf(buf, 30, - "%02u:%02u:%02.14g", - val->value.date.hour, - val->value.date.min, - val->value.date.sec); - } - *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); - } - break; - case XML_SCHEMAS_DATE: - { - char buf[30]; - - if (val->value.date.tz_flag) { - xmlSchemaValPtr norm; - - norm = xmlSchemaDateNormalize(val, 0); - if (norm == NULL) - return (-1); - /* - * TODO: Append the canonical value of the - * recoverable timezone and not "Z". - */ - snprintf(buf, 30, - "%04ld:%02u:%02uZ", - norm->value.date.year, norm->value.date.mon, - norm->value.date.day); - xmlSchemaFreeValue(norm); - } else { - snprintf(buf, 30, - "%04ld:%02u:%02u", - val->value.date.year, val->value.date.mon, - val->value.date.day); - } - *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); - } - break; - case XML_SCHEMAS_DATETIME: - { - char buf[50]; - - if (val->value.date.tz_flag) { - xmlSchemaValPtr norm; - - norm = xmlSchemaDateNormalize(val, 0); - if (norm == NULL) - return (-1); - /* - * TODO: Check if "%.14g" is portable. - */ - snprintf(buf, 50, - "%04ld:%02u:%02uT%02u:%02u:%02.14gZ", - norm->value.date.year, norm->value.date.mon, - norm->value.date.day, norm->value.date.hour, - norm->value.date.min, norm->value.date.sec); - xmlSchemaFreeValue(norm); - } else { - snprintf(buf, 50, - "%04ld:%02u:%02uT%02u:%02u:%02.14g", - val->value.date.year, val->value.date.mon, - val->value.date.day, val->value.date.hour, - val->value.date.min, val->value.date.sec); - } - *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); - } - break; - case XML_SCHEMAS_HEXBINARY: - *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str); - break; - case XML_SCHEMAS_BASE64BINARY: - /* - * TODO: Is the following spec piece implemented?: - * SPEC: "Note: For some values the canonical form defined - * above does not conform to [RFC 2045], which requires breaking - * with linefeeds at appropriate intervals." - */ - *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str); - break; - case XML_SCHEMAS_FLOAT: { - char buf[30]; - /* - * |m| < 16777216, -149 <= e <= 104. - * TODO: Handle, NaN, INF, -INF. The format is not - * yet conformant. The c type float does not cover - * the whole range. - */ - snprintf(buf, 30, "%01.14e", val->value.f); - *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); - } - break; - case XML_SCHEMAS_DOUBLE: { - char buf[40]; - /* |m| < 9007199254740992, -1075 <= e <= 970 */ - /* - * TODO: Handle, NaN, INF, -INF. The format is not - * yet conformant. The c type float does not cover - * the whole range. - */ - snprintf(buf, 40, "%01.14e", val->value.d); - *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); - } - break; - default: - *retValue = BAD_CAST xmlStrdup(BAD_CAST "???"); - return (1); - } - if (*retValue == NULL) - return(-1); - return (0); -} - -/** - * xmlSchemaGetCanonValueWhtsp: - * @val: the precomputed value - * @retValue: the returned value - * @ws: the whitespace type of the value - * - * Get a the cononical representation of the value. - * The caller has to free the returned @retValue. - * - * Returns 0 if the value could be built, 1 if the value type is - * not supported yet and -1 in case of API errors. - */ -int -xmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val, - const xmlChar **retValue, - xmlSchemaWhitespaceValueType ws) -{ - if ((retValue == NULL) || (val == NULL)) - return (-1); - if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) || - (ws > XML_SCHEMA_WHITESPACE_COLLAPSE)) - return (-1); - - *retValue = NULL; - switch (val->type) { - case XML_SCHEMAS_STRING: - if (val->value.str == NULL) - *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); - else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) - *retValue = xmlSchemaCollapseString(val->value.str); - else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) - *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); - if ((*retValue) == NULL) - *retValue = BAD_CAST xmlStrdup(val->value.str); - break; - case XML_SCHEMAS_NORMSTRING: - if (val->value.str == NULL) - *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); - else { - if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) - *retValue = xmlSchemaCollapseString(val->value.str); - else - *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); - if ((*retValue) == NULL) - *retValue = BAD_CAST xmlStrdup(val->value.str); - } - break; - default: - return (xmlSchemaGetCanonValue(val, retValue)); - } - return (0); -} - -/** - * xmlSchemaGetValType: - * @val: a schemas value - * - * Accessor for the type of a value - * - * Returns the xmlSchemaValType of the value - */ -xmlSchemaValType -xmlSchemaGetValType(xmlSchemaValPtr val) -{ - if (val == NULL) - return(XML_SCHEMAS_UNKNOWN); - return (val->type); -} - -#define bottom_xmlschemastypes -#include "elfgcchack.h" -#endif /* LIBXML_SCHEMAS_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/xmlstring.c b/ThirdParty/libxml2/vtklibxml2/xmlstring.c deleted file mode 100644 index 61732319587..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlstring.c +++ /dev/null @@ -1,984 +0,0 @@ -/* - * string.c : an XML string utilities module - * - * This module provides various utility functions for manipulating - * the xmlChar* type. All functions named xmlStr* have been moved here - * from the parser.c file (their original home). - * - * See Copyright for the status of this software. - * - * UTF8 string routines from: - * William Brack <wbrack@mmm.com.hk> - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <stdlib.h> -#include <string.h> -#include <libxml/xmlmemory.h> -#include <libxml/parserInternals.h> -#include <libxml/xmlstring.h> - -/************************************************************************ - * * - * Commodity functions to handle xmlChars * - * * - ************************************************************************/ - -/** - * xmlStrndup: - * @cur: the input xmlChar * - * @len: the len of @cur - * - * a strndup for array of xmlChar's - * - * Returns a new xmlChar * or NULL - */ -xmlChar * -xmlStrndup(const xmlChar *cur, int len) { - xmlChar *ret; - - if ((cur == NULL) || (len < 0)) return(NULL); - ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlErrMemory(NULL, NULL); - return(NULL); - } - memcpy(ret, cur, len * sizeof(xmlChar)); - ret[len] = 0; - return(ret); -} - -/** - * xmlStrdup: - * @cur: the input xmlChar * - * - * a strdup for array of xmlChar's. Since they are supposed to be - * encoded in UTF-8 or an encoding with 8bit based chars, we assume - * a termination mark of '0'. - * - * Returns a new xmlChar * or NULL - */ -xmlChar * -xmlStrdup(const xmlChar *cur) { - const xmlChar *p = cur; - - if (cur == NULL) return(NULL); - while (*p != 0) p++; /* non input consuming */ - return(xmlStrndup(cur, p - cur)); -} - -/** - * xmlCharStrndup: - * @cur: the input char * - * @len: the len of @cur - * - * a strndup for char's to xmlChar's - * - * Returns a new xmlChar * or NULL - */ - -xmlChar * -xmlCharStrndup(const char *cur, int len) { - int i; - xmlChar *ret; - - if ((cur == NULL) || (len < 0)) return(NULL); - ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlErrMemory(NULL, NULL); - return(NULL); - } - for (i = 0;i < len;i++) { - ret[i] = (xmlChar) cur[i]; - if (ret[i] == 0) return(ret); - } - ret[len] = 0; - return(ret); -} - -/** - * xmlCharStrdup: - * @cur: the input char * - * - * a strdup for char's to xmlChar's - * - * Returns a new xmlChar * or NULL - */ - -xmlChar * -xmlCharStrdup(const char *cur) { - const char *p = cur; - - if (cur == NULL) return(NULL); - while (*p != '\0') p++; /* non input consuming */ - return(xmlCharStrndup(cur, p - cur)); -} - -/** - * xmlStrcmp: - * @str1: the first xmlChar * - * @str2: the second xmlChar * - * - * a strcmp for xmlChar's - * - * Returns the integer result of the comparison - */ - -int -xmlStrcmp(const xmlChar *str1, const xmlChar *str2) { - register int tmp; - - if (str1 == str2) return(0); - if (str1 == NULL) return(-1); - if (str2 == NULL) return(1); - do { - tmp = *str1++ - *str2; - if (tmp != 0) return(tmp); - } while (*str2++ != 0); - return 0; -} - -/** - * xmlStrEqual: - * @str1: the first xmlChar * - * @str2: the second xmlChar * - * - * Check if both strings are equal of have same content. - * Should be a bit more readable and faster than xmlStrcmp() - * - * Returns 1 if they are equal, 0 if they are different - */ - -int -xmlStrEqual(const xmlChar *str1, const xmlChar *str2) { - if (str1 == str2) return(1); - if (str1 == NULL) return(0); - if (str2 == NULL) return(0); - do { - if (*str1++ != *str2) return(0); - } while (*str2++); - return(1); -} - -/** - * xmlStrQEqual: - * @pref: the prefix of the QName - * @name: the localname of the QName - * @str: the second xmlChar * - * - * Check if a QName is Equal to a given string - * - * Returns 1 if they are equal, 0 if they are different - */ - -int -xmlStrQEqual(const xmlChar *pref, const xmlChar *name, const xmlChar *str) { - if (pref == NULL) return(xmlStrEqual(name, str)); - if (name == NULL) return(0); - if (str == NULL) return(0); - - do { - if (*pref++ != *str) return(0); - } while ((*str++) && (*pref)); - if (*str++ != ':') return(0); - do { - if (*name++ != *str) return(0); - } while (*str++); - return(1); -} - -/** - * xmlStrncmp: - * @str1: the first xmlChar * - * @str2: the second xmlChar * - * @len: the max comparison length - * - * a strncmp for xmlChar's - * - * Returns the integer result of the comparison - */ - -int -xmlStrncmp(const xmlChar *str1, const xmlChar *str2, int len) { - register int tmp; - - if (len <= 0) return(0); - if (str1 == str2) return(0); - if (str1 == NULL) return(-1); - if (str2 == NULL) return(1); -#ifdef __GNUC__ - tmp = strncmp((const char *)str1, (const char *)str2, len); - return tmp; -#else - do { - tmp = *str1++ - *str2; - if (tmp != 0 || --len == 0) return(tmp); - } while (*str2++ != 0); - return 0; -#endif -} - -static const xmlChar casemap[256] = { - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, - 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, - 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, - 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, - 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, - 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, - 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, - 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67, - 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, - 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, - 0x78,0x79,0x7A,0x7B,0x5C,0x5D,0x5E,0x5F, - 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, - 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, - 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, - 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, - 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, - 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, - 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, - 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, - 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, - 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, - 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, - 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, - 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, - 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, - 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, - 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, - 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF -}; - -/** - * xmlStrcasecmp: - * @str1: the first xmlChar * - * @str2: the second xmlChar * - * - * a strcasecmp for xmlChar's - * - * Returns the integer result of the comparison - */ - -int -xmlStrcasecmp(const xmlChar *str1, const xmlChar *str2) { - register int tmp; - - if (str1 == str2) return(0); - if (str1 == NULL) return(-1); - if (str2 == NULL) return(1); - do { - tmp = casemap[*str1++] - casemap[*str2]; - if (tmp != 0) return(tmp); - } while (*str2++ != 0); - return 0; -} - -/** - * xmlStrncasecmp: - * @str1: the first xmlChar * - * @str2: the second xmlChar * - * @len: the max comparison length - * - * a strncasecmp for xmlChar's - * - * Returns the integer result of the comparison - */ - -int -xmlStrncasecmp(const xmlChar *str1, const xmlChar *str2, int len) { - register int tmp; - - if (len <= 0) return(0); - if (str1 == str2) return(0); - if (str1 == NULL) return(-1); - if (str2 == NULL) return(1); - do { - tmp = casemap[*str1++] - casemap[*str2]; - if (tmp != 0 || --len == 0) return(tmp); - } while (*str2++ != 0); - return 0; -} - -/** - * xmlStrchr: - * @str: the xmlChar * array - * @val: the xmlChar to search - * - * a strchr for xmlChar's - * - * Returns the xmlChar * for the first occurrence or NULL. - */ - -const xmlChar * -xmlStrchr(const xmlChar *str, xmlChar val) { - if (str == NULL) return(NULL); - while (*str != 0) { /* non input consuming */ - if (*str == val) return((xmlChar *) str); - str++; - } - return(NULL); -} - -/** - * xmlStrstr: - * @str: the xmlChar * array (haystack) - * @val: the xmlChar to search (needle) - * - * a strstr for xmlChar's - * - * Returns the xmlChar * for the first occurrence or NULL. - */ - -const xmlChar * -xmlStrstr(const xmlChar *str, const xmlChar *val) { - int n; - - if (str == NULL) return(NULL); - if (val == NULL) return(NULL); - n = xmlStrlen(val); - - if (n == 0) return(str); - while (*str != 0) { /* non input consuming */ - if (*str == *val) { - if (!xmlStrncmp(str, val, n)) return((const xmlChar *) str); - } - str++; - } - return(NULL); -} - -/** - * xmlStrcasestr: - * @str: the xmlChar * array (haystack) - * @val: the xmlChar to search (needle) - * - * a case-ignoring strstr for xmlChar's - * - * Returns the xmlChar * for the first occurrence or NULL. - */ - -const xmlChar * -xmlStrcasestr(const xmlChar *str, xmlChar *val) { - int n; - - if (str == NULL) return(NULL); - if (val == NULL) return(NULL); - n = xmlStrlen(val); - - if (n == 0) return(str); - while (*str != 0) { /* non input consuming */ - if (casemap[*str] == casemap[*val]) - if (!xmlStrncasecmp(str, val, n)) return(str); - str++; - } - return(NULL); -} - -/** - * xmlStrsub: - * @str: the xmlChar * array (haystack) - * @start: the index of the first char (zero based) - * @len: the length of the substring - * - * Extract a substring of a given string - * - * Returns the xmlChar * for the first occurrence or NULL. - */ - -xmlChar * -xmlStrsub(const xmlChar *str, int start, int len) { - int i; - - if (str == NULL) return(NULL); - if (start < 0) return(NULL); - if (len < 0) return(NULL); - - for (i = 0;i < start;i++) { - if (*str == 0) return(NULL); - str++; - } - if (*str == 0) return(NULL); - return(xmlStrndup(str, len)); -} - -/** - * xmlStrlen: - * @str: the xmlChar * array - * - * length of a xmlChar's string - * - * Returns the number of xmlChar contained in the ARRAY. - */ - -int -xmlStrlen(const xmlChar *str) { - int len = 0; - - if (str == NULL) return(0); - while (*str != 0) { /* non input consuming */ - str++; - len++; - } - return(len); -} - -/** - * xmlStrncat: - * @cur: the original xmlChar * array - * @add: the xmlChar * array added - * @len: the length of @add - * - * a strncat for array of xmlChar's, it will extend @cur with the len - * first bytes of @add. Note that if @len < 0 then this is an API error - * and NULL will be returned. - * - * Returns a new xmlChar *, the original @cur is reallocated if needed - * and should not be freed - */ - -xmlChar * -xmlStrncat(xmlChar *cur, const xmlChar *add, int len) { - int size; - xmlChar *ret; - - if ((add == NULL) || (len == 0)) - return(cur); - if (len < 0) - return(NULL); - if (cur == NULL) - return(xmlStrndup(add, len)); - - size = xmlStrlen(cur); - ret = (xmlChar *) xmlRealloc(cur, (size + len + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlErrMemory(NULL, NULL); - return(cur); - } - memcpy(&ret[size], add, len * sizeof(xmlChar)); - ret[size + len] = 0; - return(ret); -} - -/** - * xmlStrncatNew: - * @str1: first xmlChar string - * @str2: second xmlChar string - * @len: the len of @str2 or < 0 - * - * same as xmlStrncat, but creates a new string. The original - * two strings are not freed. If @len is < 0 then the length - * will be calculated automatically. - * - * Returns a new xmlChar * or NULL - */ -xmlChar * -xmlStrncatNew(const xmlChar *str1, const xmlChar *str2, int len) { - int size; - xmlChar *ret; - - if (len < 0) - len = xmlStrlen(str2); - if ((str2 == NULL) || (len == 0)) - return(xmlStrdup(str1)); - if (str1 == NULL) - return(xmlStrndup(str2, len)); - - size = xmlStrlen(str1); - ret = (xmlChar *) xmlMalloc((size + len + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlErrMemory(NULL, NULL); - return(xmlStrndup(str1, size)); - } - memcpy(ret, str1, size * sizeof(xmlChar)); - memcpy(&ret[size], str2, len * sizeof(xmlChar)); - ret[size + len] = 0; - return(ret); -} - -/** - * xmlStrcat: - * @cur: the original xmlChar * array - * @add: the xmlChar * array added - * - * a strcat for array of xmlChar's. Since they are supposed to be - * encoded in UTF-8 or an encoding with 8bit based chars, we assume - * a termination mark of '0'. - * - * Returns a new xmlChar * containing the concatenated string. - */ -xmlChar * -xmlStrcat(xmlChar *cur, const xmlChar *add) { - const xmlChar *p = add; - - if (add == NULL) return(cur); - if (cur == NULL) - return(xmlStrdup(add)); - - while (*p != 0) p++; /* non input consuming */ - return(xmlStrncat(cur, add, p - add)); -} - -/** - * xmlStrPrintf: - * @buf: the result buffer. - * @len: the result buffer length. - * @msg: the message with printf formatting. - * @...: extra parameters for the message. - * - * Formats @msg and places result into @buf. - * - * Returns the number of characters written to @buf or -1 if an error occurs. - */ -int XMLCDECL -xmlStrPrintf(xmlChar *buf, int len, const xmlChar *msg, ...) { - va_list args; - int ret; - - if((buf == NULL) || (msg == NULL)) { - return(-1); - } - - va_start(args, msg); - ret = vsnprintf((char *) buf, len, (const char *) msg, args); - va_end(args); - buf[len - 1] = 0; /* be safe ! */ - - return(ret); -} - -/** - * xmlStrVPrintf: - * @buf: the result buffer. - * @len: the result buffer length. - * @msg: the message with printf formatting. - * @ap: extra parameters for the message. - * - * Formats @msg and places result into @buf. - * - * Returns the number of characters written to @buf or -1 if an error occurs. - */ -int -xmlStrVPrintf(xmlChar *buf, int len, const xmlChar *msg, va_list ap) { - int ret; - - if((buf == NULL) || (msg == NULL)) { - return(-1); - } - - ret = vsnprintf((char *) buf, len, (const char *) msg, ap); - buf[len - 1] = 0; /* be safe ! */ - - return(ret); -} - -/************************************************************************ - * * - * Generic UTF8 handling routines * - * * - * From rfc2044: encoding of the Unicode values on UTF-8: * - * * - * UCS-4 range (hex.) UTF-8 octet sequence (binary) * - * 0000 0000-0000 007F 0xxxxxxx * - * 0000 0080-0000 07FF 110xxxxx 10xxxxxx * - * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx * - * * - * I hope we won't use values > 0xFFFF anytime soon ! * - * * - ************************************************************************/ - - -/** - * xmlUTF8Size: - * @utf: pointer to the UTF8 character - * - * calculates the internal size of a UTF8 character - * - * returns the numbers of bytes in the character, -1 on format error - */ -int -xmlUTF8Size(const xmlChar *utf) { - xmlChar mask; - int len; - - if (utf == NULL) - return -1; - if (*utf < 0x80) - return 1; - /* check valid UTF8 character */ - if (!(*utf & 0x40)) - return -1; - /* determine number of bytes in char */ - len = 2; - for (mask=0x20; mask != 0; mask>>=1) { - if (!(*utf & mask)) - return len; - len++; - } - return -1; -} - -/** - * xmlUTF8Charcmp: - * @utf1: pointer to first UTF8 char - * @utf2: pointer to second UTF8 char - * - * compares the two UCS4 values - * - * returns result of the compare as with xmlStrncmp - */ -int -xmlUTF8Charcmp(const xmlChar *utf1, const xmlChar *utf2) { - - if (utf1 == NULL ) { - if (utf2 == NULL) - return 0; - return -1; - } - return xmlStrncmp(utf1, utf2, xmlUTF8Size(utf1)); -} - -/** - * xmlUTF8Strlen: - * @utf: a sequence of UTF-8 encoded bytes - * - * compute the length of an UTF8 string, it doesn't do a full UTF8 - * checking of the content of the string. - * - * Returns the number of characters in the string or -1 in case of error - */ -int -xmlUTF8Strlen(const xmlChar *utf) { - int ret = 0; - - if (utf == NULL) - return(-1); - - while (*utf != 0) { - if (utf[0] & 0x80) { - if ((utf[1] & 0xc0) != 0x80) - return(-1); - if ((utf[0] & 0xe0) == 0xe0) { - if ((utf[2] & 0xc0) != 0x80) - return(-1); - if ((utf[0] & 0xf0) == 0xf0) { - if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) - return(-1); - utf += 4; - } else { - utf += 3; - } - } else { - utf += 2; - } - } else { - utf++; - } - ret++; - } - return(ret); -} - -/** - * xmlGetUTF8Char: - * @utf: a sequence of UTF-8 encoded bytes - * @len: a pointer to the minimum number of bytes present in - * the sequence. This is used to assure the next character - * is completely contained within the sequence. - * - * Read the first UTF8 character from @utf - * - * Returns the char value or -1 in case of error, and sets *len to - * the actual number of bytes consumed (0 in case of error) - */ -int -xmlGetUTF8Char(const unsigned char *utf, int *len) { - unsigned int c; - - if (utf == NULL) - goto error; - if (len == NULL) - goto error; - if (*len < 1) - goto error; - - c = utf[0]; - if (c & 0x80) { - if (*len < 2) - goto error; - if ((utf[1] & 0xc0) != 0x80) - goto error; - if ((c & 0xe0) == 0xe0) { - if (*len < 3) - goto error; - if ((utf[2] & 0xc0) != 0x80) - goto error; - if ((c & 0xf0) == 0xf0) { - if (*len < 4) - goto error; - if ((c & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) - goto error; - *len = 4; - /* 4-byte code */ - c = (utf[0] & 0x7) << 18; - c |= (utf[1] & 0x3f) << 12; - c |= (utf[2] & 0x3f) << 6; - c |= utf[3] & 0x3f; - } else { - /* 3-byte code */ - *len = 3; - c = (utf[0] & 0xf) << 12; - c |= (utf[1] & 0x3f) << 6; - c |= utf[2] & 0x3f; - } - } else { - /* 2-byte code */ - *len = 2; - c = (utf[0] & 0x1f) << 6; - c |= utf[1] & 0x3f; - } - } else { - /* 1-byte code */ - *len = 1; - } - return(c); - -error: - if (len != NULL) - *len = 0; - return(-1); -} - -/** - * xmlCheckUTF8: - * @utf: Pointer to putative UTF-8 encoded string. - * - * Checks @utf for being valid UTF-8. @utf is assumed to be - * null-terminated. This function is not super-strict, as it will - * allow longer UTF-8 sequences than necessary. Note that Java is - * capable of producing these sequences if provoked. Also note, this - * routine checks for the 4-byte maximum size, but does not check for - * 0x10ffff maximum value. - * - * Return value: true if @utf is valid. - **/ -int -xmlCheckUTF8(const unsigned char *utf) -{ - int ix; - unsigned char c; - - if (utf == NULL) - return(0); - /* - * utf is a string of 1, 2, 3 or 4 bytes. The valid strings - * are as follows (in "bit format"): - * 0xxxxxxx valid 1-byte - * 110xxxxx 10xxxxxx valid 2-byte - * 1110xxxx 10xxxxxx 10xxxxxx valid 3-byte - * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx valid 4-byte - */ - for (ix = 0; (c = utf[ix]);) { /* string is 0-terminated */ - if ((c & 0x80) == 0x00) { /* 1-byte code, starts with 10 */ - ix++; - } else if ((c & 0xe0) == 0xc0) {/* 2-byte code, starts with 110 */ - if ((utf[ix+1] & 0xc0 ) != 0x80) - return 0; - ix += 2; - } else if ((c & 0xf0) == 0xe0) {/* 3-byte code, starts with 1110 */ - if (((utf[ix+1] & 0xc0) != 0x80) || - ((utf[ix+2] & 0xc0) != 0x80)) - return 0; - ix += 3; - } else if ((c & 0xf8) == 0xf0) {/* 4-byte code, starts with 11110 */ - if (((utf[ix+1] & 0xc0) != 0x80) || - ((utf[ix+2] & 0xc0) != 0x80) || - ((utf[ix+3] & 0xc0) != 0x80)) - return 0; - ix += 4; - } else /* unknown encoding */ - return 0; - } - return(1); -} - -/** - * xmlUTF8Strsize: - * @utf: a sequence of UTF-8 encoded bytes - * @len: the number of characters in the array - * - * storage size of an UTF8 string - * the behaviour is not garanteed if the input string is not UTF-8 - * - * Returns the storage size of - * the first 'len' characters of ARRAY - */ - -int -xmlUTF8Strsize(const xmlChar *utf, int len) { - const xmlChar *ptr=utf; - xmlChar ch; - - if (utf == NULL) - return(0); - - if (len <= 0) - return(0); - - while ( len-- > 0) { - if ( !*ptr ) - break; - if ( (ch = *ptr++) & 0x80) - while ((ch<<=1) & 0x80 ) { - ptr++; - if (*ptr == 0) break; - } - } - return (ptr - utf); -} - - -/** - * xmlUTF8Strndup: - * @utf: the input UTF8 * - * @len: the len of @utf (in chars) - * - * a strndup for array of UTF8's - * - * Returns a new UTF8 * or NULL - */ -xmlChar * -xmlUTF8Strndup(const xmlChar *utf, int len) { - xmlChar *ret; - int i; - - if ((utf == NULL) || (len < 0)) return(NULL); - i = xmlUTF8Strsize(utf, len); - ret = (xmlChar *) xmlMallocAtomic((i + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "malloc of %ld byte failed\n", - (len + 1) * (long)sizeof(xmlChar)); - return(NULL); - } - memcpy(ret, utf, i * sizeof(xmlChar)); - ret[i] = 0; - return(ret); -} - -/** - * xmlUTF8Strpos: - * @utf: the input UTF8 * - * @pos: the position of the desired UTF8 char (in chars) - * - * a function to provide the equivalent of fetching a - * character from a string array - * - * Returns a pointer to the UTF8 character or NULL - */ -const xmlChar * -xmlUTF8Strpos(const xmlChar *utf, int pos) { - xmlChar ch; - - if (utf == NULL) return(NULL); - if (pos < 0) - return(NULL); - while (pos--) { - if ((ch=*utf++) == 0) return(NULL); - if ( ch & 0x80 ) { - /* if not simple ascii, verify proper format */ - if ( (ch & 0xc0) != 0xc0 ) - return(NULL); - /* then skip over remaining bytes for this char */ - while ( (ch <<= 1) & 0x80 ) - if ( (*utf++ & 0xc0) != 0x80 ) - return(NULL); - } - } - return((xmlChar *)utf); -} - -/** - * xmlUTF8Strloc: - * @utf: the input UTF8 * - * @utfchar: the UTF8 character to be found - * - * a function to provide the relative location of a UTF8 char - * - * Returns the relative character position of the desired char - * or -1 if not found - */ -int -xmlUTF8Strloc(const xmlChar *utf, const xmlChar *utfchar) { - int i, size; - xmlChar ch; - - if (utf==NULL || utfchar==NULL) return -1; - size = xmlUTF8Strsize(utfchar, 1); - for(i=0; (ch=*utf) != 0; i++) { - if (xmlStrncmp(utf, utfchar, size)==0) - return(i); - utf++; - if ( ch & 0x80 ) { - /* if not simple ascii, verify proper format */ - if ( (ch & 0xc0) != 0xc0 ) - return(-1); - /* then skip over remaining bytes for this char */ - while ( (ch <<= 1) & 0x80 ) - if ( (*utf++ & 0xc0) != 0x80 ) - return(-1); - } - } - - return(-1); -} -/** - * xmlUTF8Strsub: - * @utf: a sequence of UTF-8 encoded bytes - * @start: relative pos of first char - * @len: total number to copy - * - * Create a substring from a given UTF-8 string - * Note: positions are given in units of UTF-8 chars - * - * Returns a pointer to a newly created string - * or NULL if any problem - */ - -xmlChar * -xmlUTF8Strsub(const xmlChar *utf, int start, int len) { - int i; - xmlChar ch; - - if (utf == NULL) return(NULL); - if (start < 0) return(NULL); - if (len < 0) return(NULL); - - /* - * Skip over any leading chars - */ - for (i = 0;i < start;i++) { - if ((ch=*utf++) == 0) return(NULL); - if ( ch & 0x80 ) { - /* if not simple ascii, verify proper format */ - if ( (ch & 0xc0) != 0xc0 ) - return(NULL); - /* then skip over remaining bytes for this char */ - while ( (ch <<= 1) & 0x80 ) - if ( (*utf++ & 0xc0) != 0x80 ) - return(NULL); - } - } - - return(xmlUTF8Strndup(utf, len)); -} - -#define bottom_xmlstring -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/xmlunicode.c b/ThirdParty/libxml2/vtklibxml2/xmlunicode.c deleted file mode 100644 index 8b1709c5407..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlunicode.c +++ /dev/null @@ -1,3179 +0,0 @@ -/* - * xmlunicode.c: this module implements the Unicode character APIs - * - * This file is automatically generated from the - * UCS description files of the Unicode Character Database - * http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html - * using the genUnicode.py Python script. - * - * Generation date: Mon Mar 27 11:09:52 2006 - * Sources: Blocks-4.0.1.txt UnicodeData-4.0.1.txt - * Daniel Veillard <veillard@redhat.com> - */ - -#define IN_LIBXML -#include "libxml.h" - -#ifdef LIBXML_UNICODE_ENABLED - -#include <string.h> -#include <libxml/xmlversion.h> -#include <libxml/xmlunicode.h> -#include <libxml/chvalid.h> - -typedef int (xmlIntFunc)(int); /* just to keep one's mind untwisted */ - -typedef struct { - const char *rangename; - xmlIntFunc *func; -} xmlUnicodeRange; - -typedef struct { - xmlUnicodeRange *table; - int numentries; -} xmlUnicodeNameTable; - - -static xmlIntFunc *xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname); - -static xmlUnicodeRange xmlUnicodeBlocks[] = { - {"AegeanNumbers", xmlUCSIsAegeanNumbers}, - {"AlphabeticPresentationForms", xmlUCSIsAlphabeticPresentationForms}, - {"Arabic", xmlUCSIsArabic}, - {"ArabicPresentationForms-A", xmlUCSIsArabicPresentationFormsA}, - {"ArabicPresentationForms-B", xmlUCSIsArabicPresentationFormsB}, - {"Armenian", xmlUCSIsArmenian}, - {"Arrows", xmlUCSIsArrows}, - {"BasicLatin", xmlUCSIsBasicLatin}, - {"Bengali", xmlUCSIsBengali}, - {"BlockElements", xmlUCSIsBlockElements}, - {"Bopomofo", xmlUCSIsBopomofo}, - {"BopomofoExtended", xmlUCSIsBopomofoExtended}, - {"BoxDrawing", xmlUCSIsBoxDrawing}, - {"BraillePatterns", xmlUCSIsBraillePatterns}, - {"Buhid", xmlUCSIsBuhid}, - {"ByzantineMusicalSymbols", xmlUCSIsByzantineMusicalSymbols}, - {"CJKCompatibility", xmlUCSIsCJKCompatibility}, - {"CJKCompatibilityForms", xmlUCSIsCJKCompatibilityForms}, - {"CJKCompatibilityIdeographs", xmlUCSIsCJKCompatibilityIdeographs}, - {"CJKCompatibilityIdeographsSupplement", xmlUCSIsCJKCompatibilityIdeographsSupplement}, - {"CJKRadicalsSupplement", xmlUCSIsCJKRadicalsSupplement}, - {"CJKSymbolsandPunctuation", xmlUCSIsCJKSymbolsandPunctuation}, - {"CJKUnifiedIdeographs", xmlUCSIsCJKUnifiedIdeographs}, - {"CJKUnifiedIdeographsExtensionA", xmlUCSIsCJKUnifiedIdeographsExtensionA}, - {"CJKUnifiedIdeographsExtensionB", xmlUCSIsCJKUnifiedIdeographsExtensionB}, - {"Cherokee", xmlUCSIsCherokee}, - {"CombiningDiacriticalMarks", xmlUCSIsCombiningDiacriticalMarks}, - {"CombiningDiacriticalMarksforSymbols", xmlUCSIsCombiningDiacriticalMarksforSymbols}, - {"CombiningHalfMarks", xmlUCSIsCombiningHalfMarks}, - {"CombiningMarksforSymbols", xmlUCSIsCombiningMarksforSymbols}, - {"ControlPictures", xmlUCSIsControlPictures}, - {"CurrencySymbols", xmlUCSIsCurrencySymbols}, - {"CypriotSyllabary", xmlUCSIsCypriotSyllabary}, - {"Cyrillic", xmlUCSIsCyrillic}, - {"CyrillicSupplement", xmlUCSIsCyrillicSupplement}, - {"Deseret", xmlUCSIsDeseret}, - {"Devanagari", xmlUCSIsDevanagari}, - {"Dingbats", xmlUCSIsDingbats}, - {"EnclosedAlphanumerics", xmlUCSIsEnclosedAlphanumerics}, - {"EnclosedCJKLettersandMonths", xmlUCSIsEnclosedCJKLettersandMonths}, - {"Ethiopic", xmlUCSIsEthiopic}, - {"GeneralPunctuation", xmlUCSIsGeneralPunctuation}, - {"GeometricShapes", xmlUCSIsGeometricShapes}, - {"Georgian", xmlUCSIsGeorgian}, - {"Gothic", xmlUCSIsGothic}, - {"Greek", xmlUCSIsGreek}, - {"GreekExtended", xmlUCSIsGreekExtended}, - {"GreekandCoptic", xmlUCSIsGreekandCoptic}, - {"Gujarati", xmlUCSIsGujarati}, - {"Gurmukhi", xmlUCSIsGurmukhi}, - {"HalfwidthandFullwidthForms", xmlUCSIsHalfwidthandFullwidthForms}, - {"HangulCompatibilityJamo", xmlUCSIsHangulCompatibilityJamo}, - {"HangulJamo", xmlUCSIsHangulJamo}, - {"HangulSyllables", xmlUCSIsHangulSyllables}, - {"Hanunoo", xmlUCSIsHanunoo}, - {"Hebrew", xmlUCSIsHebrew}, - {"HighPrivateUseSurrogates", xmlUCSIsHighPrivateUseSurrogates}, - {"HighSurrogates", xmlUCSIsHighSurrogates}, - {"Hiragana", xmlUCSIsHiragana}, - {"IPAExtensions", xmlUCSIsIPAExtensions}, - {"IdeographicDescriptionCharacters", xmlUCSIsIdeographicDescriptionCharacters}, - {"Kanbun", xmlUCSIsKanbun}, - {"KangxiRadicals", xmlUCSIsKangxiRadicals}, - {"Kannada", xmlUCSIsKannada}, - {"Katakana", xmlUCSIsKatakana}, - {"KatakanaPhoneticExtensions", xmlUCSIsKatakanaPhoneticExtensions}, - {"Khmer", xmlUCSIsKhmer}, - {"KhmerSymbols", xmlUCSIsKhmerSymbols}, - {"Lao", xmlUCSIsLao}, - {"Latin-1Supplement", xmlUCSIsLatin1Supplement}, - {"LatinExtended-A", xmlUCSIsLatinExtendedA}, - {"LatinExtended-B", xmlUCSIsLatinExtendedB}, - {"LatinExtendedAdditional", xmlUCSIsLatinExtendedAdditional}, - {"LetterlikeSymbols", xmlUCSIsLetterlikeSymbols}, - {"Limbu", xmlUCSIsLimbu}, - {"LinearBIdeograms", xmlUCSIsLinearBIdeograms}, - {"LinearBSyllabary", xmlUCSIsLinearBSyllabary}, - {"LowSurrogates", xmlUCSIsLowSurrogates}, - {"Malayalam", xmlUCSIsMalayalam}, - {"MathematicalAlphanumericSymbols", xmlUCSIsMathematicalAlphanumericSymbols}, - {"MathematicalOperators", xmlUCSIsMathematicalOperators}, - {"MiscellaneousMathematicalSymbols-A", xmlUCSIsMiscellaneousMathematicalSymbolsA}, - {"MiscellaneousMathematicalSymbols-B", xmlUCSIsMiscellaneousMathematicalSymbolsB}, - {"MiscellaneousSymbols", xmlUCSIsMiscellaneousSymbols}, - {"MiscellaneousSymbolsandArrows", xmlUCSIsMiscellaneousSymbolsandArrows}, - {"MiscellaneousTechnical", xmlUCSIsMiscellaneousTechnical}, - {"Mongolian", xmlUCSIsMongolian}, - {"MusicalSymbols", xmlUCSIsMusicalSymbols}, - {"Myanmar", xmlUCSIsMyanmar}, - {"NumberForms", xmlUCSIsNumberForms}, - {"Ogham", xmlUCSIsOgham}, - {"OldItalic", xmlUCSIsOldItalic}, - {"OpticalCharacterRecognition", xmlUCSIsOpticalCharacterRecognition}, - {"Oriya", xmlUCSIsOriya}, - {"Osmanya", xmlUCSIsOsmanya}, - {"PhoneticExtensions", xmlUCSIsPhoneticExtensions}, - {"PrivateUse", xmlUCSIsPrivateUse}, - {"PrivateUseArea", xmlUCSIsPrivateUseArea}, - {"Runic", xmlUCSIsRunic}, - {"Shavian", xmlUCSIsShavian}, - {"Sinhala", xmlUCSIsSinhala}, - {"SmallFormVariants", xmlUCSIsSmallFormVariants}, - {"SpacingModifierLetters", xmlUCSIsSpacingModifierLetters}, - {"Specials", xmlUCSIsSpecials}, - {"SuperscriptsandSubscripts", xmlUCSIsSuperscriptsandSubscripts}, - {"SupplementalArrows-A", xmlUCSIsSupplementalArrowsA}, - {"SupplementalArrows-B", xmlUCSIsSupplementalArrowsB}, - {"SupplementalMathematicalOperators", xmlUCSIsSupplementalMathematicalOperators}, - {"SupplementaryPrivateUseArea-A", xmlUCSIsSupplementaryPrivateUseAreaA}, - {"SupplementaryPrivateUseArea-B", xmlUCSIsSupplementaryPrivateUseAreaB}, - {"Syriac", xmlUCSIsSyriac}, - {"Tagalog", xmlUCSIsTagalog}, - {"Tagbanwa", xmlUCSIsTagbanwa}, - {"Tags", xmlUCSIsTags}, - {"TaiLe", xmlUCSIsTaiLe}, - {"TaiXuanJingSymbols", xmlUCSIsTaiXuanJingSymbols}, - {"Tamil", xmlUCSIsTamil}, - {"Telugu", xmlUCSIsTelugu}, - {"Thaana", xmlUCSIsThaana}, - {"Thai", xmlUCSIsThai}, - {"Tibetan", xmlUCSIsTibetan}, - {"Ugaritic", xmlUCSIsUgaritic}, - {"UnifiedCanadianAboriginalSyllabics", xmlUCSIsUnifiedCanadianAboriginalSyllabics}, - {"VariationSelectors", xmlUCSIsVariationSelectors}, - {"VariationSelectorsSupplement", xmlUCSIsVariationSelectorsSupplement}, - {"YiRadicals", xmlUCSIsYiRadicals}, - {"YiSyllables", xmlUCSIsYiSyllables}, - {"YijingHexagramSymbols", xmlUCSIsYijingHexagramSymbols}}; - -static xmlUnicodeRange xmlUnicodeCats[] = { - {"C", xmlUCSIsCatC}, - {"Cc", xmlUCSIsCatCc}, - {"Cf", xmlUCSIsCatCf}, - {"Co", xmlUCSIsCatCo}, - {"Cs", xmlUCSIsCatCs}, - {"L", xmlUCSIsCatL}, - {"Ll", xmlUCSIsCatLl}, - {"Lm", xmlUCSIsCatLm}, - {"Lo", xmlUCSIsCatLo}, - {"Lt", xmlUCSIsCatLt}, - {"Lu", xmlUCSIsCatLu}, - {"M", xmlUCSIsCatM}, - {"Mc", xmlUCSIsCatMc}, - {"Me", xmlUCSIsCatMe}, - {"Mn", xmlUCSIsCatMn}, - {"N", xmlUCSIsCatN}, - {"Nd", xmlUCSIsCatNd}, - {"Nl", xmlUCSIsCatNl}, - {"No", xmlUCSIsCatNo}, - {"P", xmlUCSIsCatP}, - {"Pc", xmlUCSIsCatPc}, - {"Pd", xmlUCSIsCatPd}, - {"Pe", xmlUCSIsCatPe}, - {"Pf", xmlUCSIsCatPf}, - {"Pi", xmlUCSIsCatPi}, - {"Po", xmlUCSIsCatPo}, - {"Ps", xmlUCSIsCatPs}, - {"S", xmlUCSIsCatS}, - {"Sc", xmlUCSIsCatSc}, - {"Sk", xmlUCSIsCatSk}, - {"Sm", xmlUCSIsCatSm}, - {"So", xmlUCSIsCatSo}, - {"Z", xmlUCSIsCatZ}, - {"Zl", xmlUCSIsCatZl}, - {"Zp", xmlUCSIsCatZp}, - {"Zs", xmlUCSIsCatZs}}; - -static const xmlChSRange xmlCS[] = {{0x0, 0x1f}, {0x7f, 0x9f}, - {0xad, 0xad}, {0x600, 0x603}, {0x6dd, 0x6dd}, {0x70f, 0x70f}, - {0x17b4, 0x17b5}, {0x200b, 0x200f}, {0x202a, 0x202e}, {0x2060, 0x2063}, - {0x206a, 0x206f}, {0xd800, 0xd800}, {0xdb7f, 0xdb80}, {0xdbff, 0xdc00}, - {0xdfff, 0xe000}, {0xf8ff, 0xf8ff}, {0xfeff, 0xfeff}, {0xfff9, 0xfffb} }; -static const xmlChLRange xmlCL[] = {{0x1d173, 0x1d17a}, {0xe0001, 0xe0001}, - {0xe0020, 0xe007f}, {0xf0000, 0xf0000}, {0xffffd, 0xffffd}, - {0x100000, 0x100000}, {0x10fffd, 0x10fffd} }; -static xmlChRangeGroup xmlCG = {18,7,xmlCS,xmlCL}; - -static const xmlChSRange xmlCfS[] = {{0xad, 0xad}, {0x600, 0x603}, - {0x6dd, 0x6dd}, {0x70f, 0x70f}, {0x17b4, 0x17b5}, {0x200b, 0x200f}, - {0x202a, 0x202e}, {0x2060, 0x2063}, {0x206a, 0x206f}, {0xfeff, 0xfeff}, - {0xfff9, 0xfffb} }; -static const xmlChLRange xmlCfL[] = {{0x1d173, 0x1d17a}, {0xe0001, 0xe0001}, - {0xe0020, 0xe007f} }; -static xmlChRangeGroup xmlCfG = {11,3,xmlCfS,xmlCfL}; - -static const xmlChSRange xmlLS[] = {{0x41, 0x5a}, {0x61, 0x7a}, - {0xaa, 0xaa}, {0xb5, 0xb5}, {0xba, 0xba}, {0xc0, 0xd6}, {0xd8, 0xf6}, - {0xf8, 0x236}, {0x250, 0x2c1}, {0x2c6, 0x2d1}, {0x2e0, 0x2e4}, - {0x2ee, 0x2ee}, {0x37a, 0x37a}, {0x386, 0x386}, {0x388, 0x38a}, - {0x38c, 0x38c}, {0x38e, 0x3a1}, {0x3a3, 0x3ce}, {0x3d0, 0x3f5}, - {0x3f7, 0x3fb}, {0x400, 0x481}, {0x48a, 0x4ce}, {0x4d0, 0x4f5}, - {0x4f8, 0x4f9}, {0x500, 0x50f}, {0x531, 0x556}, {0x559, 0x559}, - {0x561, 0x587}, {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a}, - {0x640, 0x64a}, {0x66e, 0x66f}, {0x671, 0x6d3}, {0x6d5, 0x6d5}, - {0x6e5, 0x6e6}, {0x6ee, 0x6ef}, {0x6fa, 0x6fc}, {0x6ff, 0x6ff}, - {0x710, 0x710}, {0x712, 0x72f}, {0x74d, 0x74f}, {0x780, 0x7a5}, - {0x7b1, 0x7b1}, {0x904, 0x939}, {0x93d, 0x93d}, {0x950, 0x950}, - {0x958, 0x961}, {0x985, 0x98c}, {0x98f, 0x990}, {0x993, 0x9a8}, - {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, {0x9b6, 0x9b9}, {0x9bd, 0x9bd}, - {0x9dc, 0x9dd}, {0x9df, 0x9e1}, {0x9f0, 0x9f1}, {0xa05, 0xa0a}, - {0xa0f, 0xa10}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa32, 0xa33}, - {0xa35, 0xa36}, {0xa38, 0xa39}, {0xa59, 0xa5c}, {0xa5e, 0xa5e}, - {0xa72, 0xa74}, {0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, - {0xaaa, 0xab0}, {0xab2, 0xab3}, {0xab5, 0xab9}, {0xabd, 0xabd}, - {0xad0, 0xad0}, {0xae0, 0xae1}, {0xb05, 0xb0c}, {0xb0f, 0xb10}, - {0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb32, 0xb33}, {0xb35, 0xb39}, - {0xb3d, 0xb3d}, {0xb5c, 0xb5d}, {0xb5f, 0xb61}, {0xb71, 0xb71}, - {0xb83, 0xb83}, {0xb85, 0xb8a}, {0xb8e, 0xb90}, {0xb92, 0xb95}, - {0xb99, 0xb9a}, {0xb9c, 0xb9c}, {0xb9e, 0xb9f}, {0xba3, 0xba4}, - {0xba8, 0xbaa}, {0xbae, 0xbb5}, {0xbb7, 0xbb9}, {0xc05, 0xc0c}, - {0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc33}, {0xc35, 0xc39}, - {0xc60, 0xc61}, {0xc85, 0xc8c}, {0xc8e, 0xc90}, {0xc92, 0xca8}, - {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xcbd, 0xcbd}, {0xcde, 0xcde}, - {0xce0, 0xce1}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, {0xd12, 0xd28}, - {0xd2a, 0xd39}, {0xd60, 0xd61}, {0xd85, 0xd96}, {0xd9a, 0xdb1}, - {0xdb3, 0xdbb}, {0xdbd, 0xdbd}, {0xdc0, 0xdc6}, {0xe01, 0xe30}, - {0xe32, 0xe33}, {0xe40, 0xe46}, {0xe81, 0xe82}, {0xe84, 0xe84}, - {0xe87, 0xe88}, {0xe8a, 0xe8a}, {0xe8d, 0xe8d}, {0xe94, 0xe97}, - {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xea5, 0xea5}, {0xea7, 0xea7}, - {0xeaa, 0xeab}, {0xead, 0xeb0}, {0xeb2, 0xeb3}, {0xebd, 0xebd}, - {0xec0, 0xec4}, {0xec6, 0xec6}, {0xedc, 0xedd}, {0xf00, 0xf00}, - {0xf40, 0xf47}, {0xf49, 0xf6a}, {0xf88, 0xf8b}, {0x1000, 0x1021}, - {0x1023, 0x1027}, {0x1029, 0x102a}, {0x1050, 0x1055}, {0x10a0, 0x10c5}, - {0x10d0, 0x10f8}, {0x1100, 0x1159}, {0x115f, 0x11a2}, {0x11a8, 0x11f9}, - {0x1200, 0x1206}, {0x1208, 0x1246}, {0x1248, 0x1248}, {0x124a, 0x124d}, - {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125a, 0x125d}, {0x1260, 0x1286}, - {0x1288, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12ae}, {0x12b0, 0x12b0}, - {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c0, 0x12c0}, {0x12c2, 0x12c5}, - {0x12c8, 0x12ce}, {0x12d0, 0x12d6}, {0x12d8, 0x12ee}, {0x12f0, 0x130e}, - {0x1310, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x131e}, {0x1320, 0x1346}, - {0x1348, 0x135a}, {0x13a0, 0x13f4}, {0x1401, 0x166c}, {0x166f, 0x1676}, - {0x1681, 0x169a}, {0x16a0, 0x16ea}, {0x1700, 0x170c}, {0x170e, 0x1711}, - {0x1720, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176c}, {0x176e, 0x1770}, - {0x1780, 0x17b3}, {0x17d7, 0x17d7}, {0x17dc, 0x17dc}, {0x1820, 0x1877}, - {0x1880, 0x18a8}, {0x1900, 0x191c}, {0x1950, 0x196d}, {0x1970, 0x1974}, - {0x1d00, 0x1d6b}, {0x1e00, 0x1e9b}, {0x1ea0, 0x1ef9}, {0x1f00, 0x1f15}, - {0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, - {0x1f59, 0x1f59}, {0x1f5b, 0x1f5b}, {0x1f5d, 0x1f5d}, {0x1f5f, 0x1f7d}, - {0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc}, {0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, - {0x1fc6, 0x1fcc}, {0x1fd0, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, - {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffc}, {0x2071, 0x2071}, {0x207f, 0x207f}, - {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210a, 0x2113}, {0x2115, 0x2115}, - {0x2119, 0x211d}, {0x2124, 0x2124}, {0x2126, 0x2126}, {0x2128, 0x2128}, - {0x212a, 0x212d}, {0x212f, 0x2131}, {0x2133, 0x2139}, {0x213d, 0x213f}, - {0x2145, 0x2149}, {0x3005, 0x3006}, {0x3031, 0x3035}, {0x303b, 0x303c}, - {0x3041, 0x3096}, {0x309d, 0x309f}, {0x30a1, 0x30fa}, {0x30fc, 0x30ff}, - {0x3105, 0x312c}, {0x3131, 0x318e}, {0x31a0, 0x31b7}, {0x31f0, 0x31ff}, - {0x3400, 0x3400}, {0x4db5, 0x4db5}, {0x4e00, 0x4e00}, {0x9fa5, 0x9fa5}, - {0xa000, 0xa48c}, {0xac00, 0xac00}, {0xd7a3, 0xd7a3}, {0xf900, 0xfa2d}, - {0xfa30, 0xfa6a}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xfb1d, 0xfb1d}, - {0xfb1f, 0xfb28}, {0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, {0xfb3e, 0xfb3e}, - {0xfb40, 0xfb41}, {0xfb43, 0xfb44}, {0xfb46, 0xfbb1}, {0xfbd3, 0xfd3d}, - {0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, {0xfe70, 0xfe74}, - {0xfe76, 0xfefc}, {0xff21, 0xff3a}, {0xff41, 0xff5a}, {0xff66, 0xffbe}, - {0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7}, {0xffda, 0xffdc} }; -static const xmlChLRange xmlLL[] = {{0x10000, 0x1000b}, {0x1000d, 0x10026}, - {0x10028, 0x1003a}, {0x1003c, 0x1003d}, {0x1003f, 0x1004d}, - {0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10300, 0x1031e}, - {0x10330, 0x10349}, {0x10380, 0x1039d}, {0x10400, 0x1049d}, - {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080a, 0x10835}, - {0x10837, 0x10838}, {0x1083c, 0x1083c}, {0x1083f, 0x1083f}, - {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d49e, 0x1d49f}, - {0x1d4a2, 0x1d4a2}, {0x1d4a5, 0x1d4a6}, {0x1d4a9, 0x1d4ac}, - {0x1d4ae, 0x1d4b9}, {0x1d4bb, 0x1d4bb}, {0x1d4bd, 0x1d4c3}, - {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, - {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e}, - {0x1d540, 0x1d544}, {0x1d546, 0x1d546}, {0x1d54a, 0x1d550}, - {0x1d552, 0x1d6a3}, {0x1d6a8, 0x1d6c0}, {0x1d6c2, 0x1d6da}, - {0x1d6dc, 0x1d6fa}, {0x1d6fc, 0x1d714}, {0x1d716, 0x1d734}, - {0x1d736, 0x1d74e}, {0x1d750, 0x1d76e}, {0x1d770, 0x1d788}, - {0x1d78a, 0x1d7a8}, {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7c9}, - {0x20000, 0x20000}, {0x2a6d6, 0x2a6d6}, {0x2f800, 0x2fa1d} }; -static xmlChRangeGroup xmlLG = {279,50,xmlLS,xmlLL}; - -static const xmlChSRange xmlLlS[] = {{0x61, 0x7a}, {0xaa, 0xaa}, - {0xb5, 0xb5}, {0xba, 0xba}, {0xdf, 0xf6}, {0xf8, 0xff}, {0x101, 0x101}, - {0x103, 0x103}, {0x105, 0x105}, {0x107, 0x107}, {0x109, 0x109}, - {0x10b, 0x10b}, {0x10d, 0x10d}, {0x10f, 0x10f}, {0x111, 0x111}, - {0x113, 0x113}, {0x115, 0x115}, {0x117, 0x117}, {0x119, 0x119}, - {0x11b, 0x11b}, {0x11d, 0x11d}, {0x11f, 0x11f}, {0x121, 0x121}, - {0x123, 0x123}, {0x125, 0x125}, {0x127, 0x127}, {0x129, 0x129}, - {0x12b, 0x12b}, {0x12d, 0x12d}, {0x12f, 0x12f}, {0x131, 0x131}, - {0x133, 0x133}, {0x135, 0x135}, {0x137, 0x138}, {0x13a, 0x13a}, - {0x13c, 0x13c}, {0x13e, 0x13e}, {0x140, 0x140}, {0x142, 0x142}, - {0x144, 0x144}, {0x146, 0x146}, {0x148, 0x149}, {0x14b, 0x14b}, - {0x14d, 0x14d}, {0x14f, 0x14f}, {0x151, 0x151}, {0x153, 0x153}, - {0x155, 0x155}, {0x157, 0x157}, {0x159, 0x159}, {0x15b, 0x15b}, - {0x15d, 0x15d}, {0x15f, 0x15f}, {0x161, 0x161}, {0x163, 0x163}, - {0x165, 0x165}, {0x167, 0x167}, {0x169, 0x169}, {0x16b, 0x16b}, - {0x16d, 0x16d}, {0x16f, 0x16f}, {0x171, 0x171}, {0x173, 0x173}, - {0x175, 0x175}, {0x177, 0x177}, {0x17a, 0x17a}, {0x17c, 0x17c}, - {0x17e, 0x180}, {0x183, 0x183}, {0x185, 0x185}, {0x188, 0x188}, - {0x18c, 0x18d}, {0x192, 0x192}, {0x195, 0x195}, {0x199, 0x19b}, - {0x19e, 0x19e}, {0x1a1, 0x1a1}, {0x1a3, 0x1a3}, {0x1a5, 0x1a5}, - {0x1a8, 0x1a8}, {0x1aa, 0x1ab}, {0x1ad, 0x1ad}, {0x1b0, 0x1b0}, - {0x1b4, 0x1b4}, {0x1b6, 0x1b6}, {0x1b9, 0x1ba}, {0x1bd, 0x1bf}, - {0x1c6, 0x1c6}, {0x1c9, 0x1c9}, {0x1cc, 0x1cc}, {0x1ce, 0x1ce}, - {0x1d0, 0x1d0}, {0x1d2, 0x1d2}, {0x1d4, 0x1d4}, {0x1d6, 0x1d6}, - {0x1d8, 0x1d8}, {0x1da, 0x1da}, {0x1dc, 0x1dd}, {0x1df, 0x1df}, - {0x1e1, 0x1e1}, {0x1e3, 0x1e3}, {0x1e5, 0x1e5}, {0x1e7, 0x1e7}, - {0x1e9, 0x1e9}, {0x1eb, 0x1eb}, {0x1ed, 0x1ed}, {0x1ef, 0x1f0}, - {0x1f3, 0x1f3}, {0x1f5, 0x1f5}, {0x1f9, 0x1f9}, {0x1fb, 0x1fb}, - {0x1fd, 0x1fd}, {0x1ff, 0x1ff}, {0x201, 0x201}, {0x203, 0x203}, - {0x205, 0x205}, {0x207, 0x207}, {0x209, 0x209}, {0x20b, 0x20b}, - {0x20d, 0x20d}, {0x20f, 0x20f}, {0x211, 0x211}, {0x213, 0x213}, - {0x215, 0x215}, {0x217, 0x217}, {0x219, 0x219}, {0x21b, 0x21b}, - {0x21d, 0x21d}, {0x21f, 0x21f}, {0x221, 0x221}, {0x223, 0x223}, - {0x225, 0x225}, {0x227, 0x227}, {0x229, 0x229}, {0x22b, 0x22b}, - {0x22d, 0x22d}, {0x22f, 0x22f}, {0x231, 0x231}, {0x233, 0x236}, - {0x250, 0x2af}, {0x390, 0x390}, {0x3ac, 0x3ce}, {0x3d0, 0x3d1}, - {0x3d5, 0x3d7}, {0x3d9, 0x3d9}, {0x3db, 0x3db}, {0x3dd, 0x3dd}, - {0x3df, 0x3df}, {0x3e1, 0x3e1}, {0x3e3, 0x3e3}, {0x3e5, 0x3e5}, - {0x3e7, 0x3e7}, {0x3e9, 0x3e9}, {0x3eb, 0x3eb}, {0x3ed, 0x3ed}, - {0x3ef, 0x3f3}, {0x3f5, 0x3f5}, {0x3f8, 0x3f8}, {0x3fb, 0x3fb}, - {0x430, 0x45f}, {0x461, 0x461}, {0x463, 0x463}, {0x465, 0x465}, - {0x467, 0x467}, {0x469, 0x469}, {0x46b, 0x46b}, {0x46d, 0x46d}, - {0x46f, 0x46f}, {0x471, 0x471}, {0x473, 0x473}, {0x475, 0x475}, - {0x477, 0x477}, {0x479, 0x479}, {0x47b, 0x47b}, {0x47d, 0x47d}, - {0x47f, 0x47f}, {0x481, 0x481}, {0x48b, 0x48b}, {0x48d, 0x48d}, - {0x48f, 0x48f}, {0x491, 0x491}, {0x493, 0x493}, {0x495, 0x495}, - {0x497, 0x497}, {0x499, 0x499}, {0x49b, 0x49b}, {0x49d, 0x49d}, - {0x49f, 0x49f}, {0x4a1, 0x4a1}, {0x4a3, 0x4a3}, {0x4a5, 0x4a5}, - {0x4a7, 0x4a7}, {0x4a9, 0x4a9}, {0x4ab, 0x4ab}, {0x4ad, 0x4ad}, - {0x4af, 0x4af}, {0x4b1, 0x4b1}, {0x4b3, 0x4b3}, {0x4b5, 0x4b5}, - {0x4b7, 0x4b7}, {0x4b9, 0x4b9}, {0x4bb, 0x4bb}, {0x4bd, 0x4bd}, - {0x4bf, 0x4bf}, {0x4c2, 0x4c2}, {0x4c4, 0x4c4}, {0x4c6, 0x4c6}, - {0x4c8, 0x4c8}, {0x4ca, 0x4ca}, {0x4cc, 0x4cc}, {0x4ce, 0x4ce}, - {0x4d1, 0x4d1}, {0x4d3, 0x4d3}, {0x4d5, 0x4d5}, {0x4d7, 0x4d7}, - {0x4d9, 0x4d9}, {0x4db, 0x4db}, {0x4dd, 0x4dd}, {0x4df, 0x4df}, - {0x4e1, 0x4e1}, {0x4e3, 0x4e3}, {0x4e5, 0x4e5}, {0x4e7, 0x4e7}, - {0x4e9, 0x4e9}, {0x4eb, 0x4eb}, {0x4ed, 0x4ed}, {0x4ef, 0x4ef}, - {0x4f1, 0x4f1}, {0x4f3, 0x4f3}, {0x4f5, 0x4f5}, {0x4f9, 0x4f9}, - {0x501, 0x501}, {0x503, 0x503}, {0x505, 0x505}, {0x507, 0x507}, - {0x509, 0x509}, {0x50b, 0x50b}, {0x50d, 0x50d}, {0x50f, 0x50f}, - {0x561, 0x587}, {0x1d00, 0x1d2b}, {0x1d62, 0x1d6b}, {0x1e01, 0x1e01}, - {0x1e03, 0x1e03}, {0x1e05, 0x1e05}, {0x1e07, 0x1e07}, {0x1e09, 0x1e09}, - {0x1e0b, 0x1e0b}, {0x1e0d, 0x1e0d}, {0x1e0f, 0x1e0f}, {0x1e11, 0x1e11}, - {0x1e13, 0x1e13}, {0x1e15, 0x1e15}, {0x1e17, 0x1e17}, {0x1e19, 0x1e19}, - {0x1e1b, 0x1e1b}, {0x1e1d, 0x1e1d}, {0x1e1f, 0x1e1f}, {0x1e21, 0x1e21}, - {0x1e23, 0x1e23}, {0x1e25, 0x1e25}, {0x1e27, 0x1e27}, {0x1e29, 0x1e29}, - {0x1e2b, 0x1e2b}, {0x1e2d, 0x1e2d}, {0x1e2f, 0x1e2f}, {0x1e31, 0x1e31}, - {0x1e33, 0x1e33}, {0x1e35, 0x1e35}, {0x1e37, 0x1e37}, {0x1e39, 0x1e39}, - {0x1e3b, 0x1e3b}, {0x1e3d, 0x1e3d}, {0x1e3f, 0x1e3f}, {0x1e41, 0x1e41}, - {0x1e43, 0x1e43}, {0x1e45, 0x1e45}, {0x1e47, 0x1e47}, {0x1e49, 0x1e49}, - {0x1e4b, 0x1e4b}, {0x1e4d, 0x1e4d}, {0x1e4f, 0x1e4f}, {0x1e51, 0x1e51}, - {0x1e53, 0x1e53}, {0x1e55, 0x1e55}, {0x1e57, 0x1e57}, {0x1e59, 0x1e59}, - {0x1e5b, 0x1e5b}, {0x1e5d, 0x1e5d}, {0x1e5f, 0x1e5f}, {0x1e61, 0x1e61}, - {0x1e63, 0x1e63}, {0x1e65, 0x1e65}, {0x1e67, 0x1e67}, {0x1e69, 0x1e69}, - {0x1e6b, 0x1e6b}, {0x1e6d, 0x1e6d}, {0x1e6f, 0x1e6f}, {0x1e71, 0x1e71}, - {0x1e73, 0x1e73}, {0x1e75, 0x1e75}, {0x1e77, 0x1e77}, {0x1e79, 0x1e79}, - {0x1e7b, 0x1e7b}, {0x1e7d, 0x1e7d}, {0x1e7f, 0x1e7f}, {0x1e81, 0x1e81}, - {0x1e83, 0x1e83}, {0x1e85, 0x1e85}, {0x1e87, 0x1e87}, {0x1e89, 0x1e89}, - {0x1e8b, 0x1e8b}, {0x1e8d, 0x1e8d}, {0x1e8f, 0x1e8f}, {0x1e91, 0x1e91}, - {0x1e93, 0x1e93}, {0x1e95, 0x1e9b}, {0x1ea1, 0x1ea1}, {0x1ea3, 0x1ea3}, - {0x1ea5, 0x1ea5}, {0x1ea7, 0x1ea7}, {0x1ea9, 0x1ea9}, {0x1eab, 0x1eab}, - {0x1ead, 0x1ead}, {0x1eaf, 0x1eaf}, {0x1eb1, 0x1eb1}, {0x1eb3, 0x1eb3}, - {0x1eb5, 0x1eb5}, {0x1eb7, 0x1eb7}, {0x1eb9, 0x1eb9}, {0x1ebb, 0x1ebb}, - {0x1ebd, 0x1ebd}, {0x1ebf, 0x1ebf}, {0x1ec1, 0x1ec1}, {0x1ec3, 0x1ec3}, - {0x1ec5, 0x1ec5}, {0x1ec7, 0x1ec7}, {0x1ec9, 0x1ec9}, {0x1ecb, 0x1ecb}, - {0x1ecd, 0x1ecd}, {0x1ecf, 0x1ecf}, {0x1ed1, 0x1ed1}, {0x1ed3, 0x1ed3}, - {0x1ed5, 0x1ed5}, {0x1ed7, 0x1ed7}, {0x1ed9, 0x1ed9}, {0x1edb, 0x1edb}, - {0x1edd, 0x1edd}, {0x1edf, 0x1edf}, {0x1ee1, 0x1ee1}, {0x1ee3, 0x1ee3}, - {0x1ee5, 0x1ee5}, {0x1ee7, 0x1ee7}, {0x1ee9, 0x1ee9}, {0x1eeb, 0x1eeb}, - {0x1eed, 0x1eed}, {0x1eef, 0x1eef}, {0x1ef1, 0x1ef1}, {0x1ef3, 0x1ef3}, - {0x1ef5, 0x1ef5}, {0x1ef7, 0x1ef7}, {0x1ef9, 0x1ef9}, {0x1f00, 0x1f07}, - {0x1f10, 0x1f15}, {0x1f20, 0x1f27}, {0x1f30, 0x1f37}, {0x1f40, 0x1f45}, - {0x1f50, 0x1f57}, {0x1f60, 0x1f67}, {0x1f70, 0x1f7d}, {0x1f80, 0x1f87}, - {0x1f90, 0x1f97}, {0x1fa0, 0x1fa7}, {0x1fb0, 0x1fb4}, {0x1fb6, 0x1fb7}, - {0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fc7}, {0x1fd0, 0x1fd3}, - {0x1fd6, 0x1fd7}, {0x1fe0, 0x1fe7}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ff7}, - {0x2071, 0x2071}, {0x207f, 0x207f}, {0x210a, 0x210a}, {0x210e, 0x210f}, - {0x2113, 0x2113}, {0x212f, 0x212f}, {0x2134, 0x2134}, {0x2139, 0x2139}, - {0x213d, 0x213d}, {0x2146, 0x2149}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, - {0xff41, 0xff5a} }; -static const xmlChLRange xmlLlL[] = {{0x10428, 0x1044f}, {0x1d41a, 0x1d433}, - {0x1d44e, 0x1d454}, {0x1d456, 0x1d467}, {0x1d482, 0x1d49b}, - {0x1d4b6, 0x1d4b9}, {0x1d4bb, 0x1d4bb}, {0x1d4bd, 0x1d4c3}, - {0x1d4c5, 0x1d4cf}, {0x1d4ea, 0x1d503}, {0x1d51e, 0x1d537}, - {0x1d552, 0x1d56b}, {0x1d586, 0x1d59f}, {0x1d5ba, 0x1d5d3}, - {0x1d5ee, 0x1d607}, {0x1d622, 0x1d63b}, {0x1d656, 0x1d66f}, - {0x1d68a, 0x1d6a3}, {0x1d6c2, 0x1d6da}, {0x1d6dc, 0x1d6e1}, - {0x1d6fc, 0x1d714}, {0x1d716, 0x1d71b}, {0x1d736, 0x1d74e}, - {0x1d750, 0x1d755}, {0x1d770, 0x1d788}, {0x1d78a, 0x1d78f}, - {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7c9} }; -static xmlChRangeGroup xmlLlG = {396,28,xmlLlS,xmlLlL}; - -static const xmlChSRange xmlLmS[] = {{0x2b0, 0x2c1}, {0x2c6, 0x2d1}, - {0x2e0, 0x2e4}, {0x2ee, 0x2ee}, {0x37a, 0x37a}, {0x559, 0x559}, - {0x640, 0x640}, {0x6e5, 0x6e6}, {0xe46, 0xe46}, {0xec6, 0xec6}, - {0x17d7, 0x17d7}, {0x1843, 0x1843}, {0x1d2c, 0x1d61}, {0x3005, 0x3005}, - {0x3031, 0x3035}, {0x303b, 0x303b}, {0x309d, 0x309e}, {0x30fc, 0x30fe}, - {0xff70, 0xff70}, {0xff9e, 0xff9f} }; -static xmlChRangeGroup xmlLmG = {20,0,xmlLmS,NULL}; - -static const xmlChSRange xmlLoS[] = {{0x1bb, 0x1bb}, {0x1c0, 0x1c3}, - {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a}, {0x641, 0x64a}, - {0x66e, 0x66f}, {0x671, 0x6d3}, {0x6d5, 0x6d5}, {0x6ee, 0x6ef}, - {0x6fa, 0x6fc}, {0x6ff, 0x6ff}, {0x710, 0x710}, {0x712, 0x72f}, - {0x74d, 0x74f}, {0x780, 0x7a5}, {0x7b1, 0x7b1}, {0x904, 0x939}, - {0x93d, 0x93d}, {0x950, 0x950}, {0x958, 0x961}, {0x985, 0x98c}, - {0x98f, 0x990}, {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, - {0x9b6, 0x9b9}, {0x9bd, 0x9bd}, {0x9dc, 0x9dd}, {0x9df, 0x9e1}, - {0x9f0, 0x9f1}, {0xa05, 0xa0a}, {0xa0f, 0xa10}, {0xa13, 0xa28}, - {0xa2a, 0xa30}, {0xa32, 0xa33}, {0xa35, 0xa36}, {0xa38, 0xa39}, - {0xa59, 0xa5c}, {0xa5e, 0xa5e}, {0xa72, 0xa74}, {0xa85, 0xa8d}, - {0xa8f, 0xa91}, {0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab2, 0xab3}, - {0xab5, 0xab9}, {0xabd, 0xabd}, {0xad0, 0xad0}, {0xae0, 0xae1}, - {0xb05, 0xb0c}, {0xb0f, 0xb10}, {0xb13, 0xb28}, {0xb2a, 0xb30}, - {0xb32, 0xb33}, {0xb35, 0xb39}, {0xb3d, 0xb3d}, {0xb5c, 0xb5d}, - {0xb5f, 0xb61}, {0xb71, 0xb71}, {0xb83, 0xb83}, {0xb85, 0xb8a}, - {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xb99, 0xb9a}, {0xb9c, 0xb9c}, - {0xb9e, 0xb9f}, {0xba3, 0xba4}, {0xba8, 0xbaa}, {0xbae, 0xbb5}, - {0xbb7, 0xbb9}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, - {0xc2a, 0xc33}, {0xc35, 0xc39}, {0xc60, 0xc61}, {0xc85, 0xc8c}, - {0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, - {0xcbd, 0xcbd}, {0xcde, 0xcde}, {0xce0, 0xce1}, {0xd05, 0xd0c}, - {0xd0e, 0xd10}, {0xd12, 0xd28}, {0xd2a, 0xd39}, {0xd60, 0xd61}, - {0xd85, 0xd96}, {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdbd, 0xdbd}, - {0xdc0, 0xdc6}, {0xe01, 0xe30}, {0xe32, 0xe33}, {0xe40, 0xe45}, - {0xe81, 0xe82}, {0xe84, 0xe84}, {0xe87, 0xe88}, {0xe8a, 0xe8a}, - {0xe8d, 0xe8d}, {0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, - {0xea5, 0xea5}, {0xea7, 0xea7}, {0xeaa, 0xeab}, {0xead, 0xeb0}, - {0xeb2, 0xeb3}, {0xebd, 0xebd}, {0xec0, 0xec4}, {0xedc, 0xedd}, - {0xf00, 0xf00}, {0xf40, 0xf47}, {0xf49, 0xf6a}, {0xf88, 0xf8b}, - {0x1000, 0x1021}, {0x1023, 0x1027}, {0x1029, 0x102a}, {0x1050, 0x1055}, - {0x10d0, 0x10f8}, {0x1100, 0x1159}, {0x115f, 0x11a2}, {0x11a8, 0x11f9}, - {0x1200, 0x1206}, {0x1208, 0x1246}, {0x1248, 0x1248}, {0x124a, 0x124d}, - {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125a, 0x125d}, {0x1260, 0x1286}, - {0x1288, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12ae}, {0x12b0, 0x12b0}, - {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c0, 0x12c0}, {0x12c2, 0x12c5}, - {0x12c8, 0x12ce}, {0x12d0, 0x12d6}, {0x12d8, 0x12ee}, {0x12f0, 0x130e}, - {0x1310, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x131e}, {0x1320, 0x1346}, - {0x1348, 0x135a}, {0x13a0, 0x13f4}, {0x1401, 0x166c}, {0x166f, 0x1676}, - {0x1681, 0x169a}, {0x16a0, 0x16ea}, {0x1700, 0x170c}, {0x170e, 0x1711}, - {0x1720, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176c}, {0x176e, 0x1770}, - {0x1780, 0x17b3}, {0x17dc, 0x17dc}, {0x1820, 0x1842}, {0x1844, 0x1877}, - {0x1880, 0x18a8}, {0x1900, 0x191c}, {0x1950, 0x196d}, {0x1970, 0x1974}, - {0x2135, 0x2138}, {0x3006, 0x3006}, {0x303c, 0x303c}, {0x3041, 0x3096}, - {0x309f, 0x309f}, {0x30a1, 0x30fa}, {0x30ff, 0x30ff}, {0x3105, 0x312c}, - {0x3131, 0x318e}, {0x31a0, 0x31b7}, {0x31f0, 0x31ff}, {0x3400, 0x3400}, - {0x4db5, 0x4db5}, {0x4e00, 0x4e00}, {0x9fa5, 0x9fa5}, {0xa000, 0xa48c}, - {0xac00, 0xac00}, {0xd7a3, 0xd7a3}, {0xf900, 0xfa2d}, {0xfa30, 0xfa6a}, - {0xfb1d, 0xfb1d}, {0xfb1f, 0xfb28}, {0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, - {0xfb3e, 0xfb3e}, {0xfb40, 0xfb41}, {0xfb43, 0xfb44}, {0xfb46, 0xfbb1}, - {0xfbd3, 0xfd3d}, {0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, - {0xfe70, 0xfe74}, {0xfe76, 0xfefc}, {0xff66, 0xff6f}, {0xff71, 0xff9d}, - {0xffa0, 0xffbe}, {0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7}, - {0xffda, 0xffdc} }; -static const xmlChLRange xmlLoL[] = {{0x10000, 0x1000b}, {0x1000d, 0x10026}, - {0x10028, 0x1003a}, {0x1003c, 0x1003d}, {0x1003f, 0x1004d}, - {0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10300, 0x1031e}, - {0x10330, 0x10349}, {0x10380, 0x1039d}, {0x10450, 0x1049d}, - {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080a, 0x10835}, - {0x10837, 0x10838}, {0x1083c, 0x1083c}, {0x1083f, 0x1083f}, - {0x20000, 0x20000}, {0x2a6d6, 0x2a6d6}, {0x2f800, 0x2fa1d} }; -static xmlChRangeGroup xmlLoG = {211,20,xmlLoS,xmlLoL}; - -static const xmlChSRange xmlLtS[] = {{0x1c5, 0x1c5}, {0x1c8, 0x1c8}, - {0x1cb, 0x1cb}, {0x1f2, 0x1f2}, {0x1f88, 0x1f8f}, {0x1f98, 0x1f9f}, - {0x1fa8, 0x1faf}, {0x1fbc, 0x1fbc}, {0x1fcc, 0x1fcc}, {0x1ffc, 0x1ffc} }; -static xmlChRangeGroup xmlLtG = {10,0,xmlLtS,NULL}; - -static const xmlChSRange xmlLuS[] = {{0x41, 0x5a}, {0xc0, 0xd6}, - {0xd8, 0xde}, {0x100, 0x100}, {0x102, 0x102}, {0x104, 0x104}, - {0x106, 0x106}, {0x108, 0x108}, {0x10a, 0x10a}, {0x10c, 0x10c}, - {0x10e, 0x10e}, {0x110, 0x110}, {0x112, 0x112}, {0x114, 0x114}, - {0x116, 0x116}, {0x118, 0x118}, {0x11a, 0x11a}, {0x11c, 0x11c}, - {0x11e, 0x11e}, {0x120, 0x120}, {0x122, 0x122}, {0x124, 0x124}, - {0x126, 0x126}, {0x128, 0x128}, {0x12a, 0x12a}, {0x12c, 0x12c}, - {0x12e, 0x12e}, {0x130, 0x130}, {0x132, 0x132}, {0x134, 0x134}, - {0x136, 0x136}, {0x139, 0x139}, {0x13b, 0x13b}, {0x13d, 0x13d}, - {0x13f, 0x13f}, {0x141, 0x141}, {0x143, 0x143}, {0x145, 0x145}, - {0x147, 0x147}, {0x14a, 0x14a}, {0x14c, 0x14c}, {0x14e, 0x14e}, - {0x150, 0x150}, {0x152, 0x152}, {0x154, 0x154}, {0x156, 0x156}, - {0x158, 0x158}, {0x15a, 0x15a}, {0x15c, 0x15c}, {0x15e, 0x15e}, - {0x160, 0x160}, {0x162, 0x162}, {0x164, 0x164}, {0x166, 0x166}, - {0x168, 0x168}, {0x16a, 0x16a}, {0x16c, 0x16c}, {0x16e, 0x16e}, - {0x170, 0x170}, {0x172, 0x172}, {0x174, 0x174}, {0x176, 0x176}, - {0x178, 0x179}, {0x17b, 0x17b}, {0x17d, 0x17d}, {0x181, 0x182}, - {0x184, 0x184}, {0x186, 0x187}, {0x189, 0x18b}, {0x18e, 0x191}, - {0x193, 0x194}, {0x196, 0x198}, {0x19c, 0x19d}, {0x19f, 0x1a0}, - {0x1a2, 0x1a2}, {0x1a4, 0x1a4}, {0x1a6, 0x1a7}, {0x1a9, 0x1a9}, - {0x1ac, 0x1ac}, {0x1ae, 0x1af}, {0x1b1, 0x1b3}, {0x1b5, 0x1b5}, - {0x1b7, 0x1b8}, {0x1bc, 0x1bc}, {0x1c4, 0x1c4}, {0x1c7, 0x1c7}, - {0x1ca, 0x1ca}, {0x1cd, 0x1cd}, {0x1cf, 0x1cf}, {0x1d1, 0x1d1}, - {0x1d3, 0x1d3}, {0x1d5, 0x1d5}, {0x1d7, 0x1d7}, {0x1d9, 0x1d9}, - {0x1db, 0x1db}, {0x1de, 0x1de}, {0x1e0, 0x1e0}, {0x1e2, 0x1e2}, - {0x1e4, 0x1e4}, {0x1e6, 0x1e6}, {0x1e8, 0x1e8}, {0x1ea, 0x1ea}, - {0x1ec, 0x1ec}, {0x1ee, 0x1ee}, {0x1f1, 0x1f1}, {0x1f4, 0x1f4}, - {0x1f6, 0x1f8}, {0x1fa, 0x1fa}, {0x1fc, 0x1fc}, {0x1fe, 0x1fe}, - {0x200, 0x200}, {0x202, 0x202}, {0x204, 0x204}, {0x206, 0x206}, - {0x208, 0x208}, {0x20a, 0x20a}, {0x20c, 0x20c}, {0x20e, 0x20e}, - {0x210, 0x210}, {0x212, 0x212}, {0x214, 0x214}, {0x216, 0x216}, - {0x218, 0x218}, {0x21a, 0x21a}, {0x21c, 0x21c}, {0x21e, 0x21e}, - {0x220, 0x220}, {0x222, 0x222}, {0x224, 0x224}, {0x226, 0x226}, - {0x228, 0x228}, {0x22a, 0x22a}, {0x22c, 0x22c}, {0x22e, 0x22e}, - {0x230, 0x230}, {0x232, 0x232}, {0x386, 0x386}, {0x388, 0x38a}, - {0x38c, 0x38c}, {0x38e, 0x38f}, {0x391, 0x3a1}, {0x3a3, 0x3ab}, - {0x3d2, 0x3d4}, {0x3d8, 0x3d8}, {0x3da, 0x3da}, {0x3dc, 0x3dc}, - {0x3de, 0x3de}, {0x3e0, 0x3e0}, {0x3e2, 0x3e2}, {0x3e4, 0x3e4}, - {0x3e6, 0x3e6}, {0x3e8, 0x3e8}, {0x3ea, 0x3ea}, {0x3ec, 0x3ec}, - {0x3ee, 0x3ee}, {0x3f4, 0x3f4}, {0x3f7, 0x3f7}, {0x3f9, 0x3fa}, - {0x400, 0x42f}, {0x460, 0x460}, {0x462, 0x462}, {0x464, 0x464}, - {0x466, 0x466}, {0x468, 0x468}, {0x46a, 0x46a}, {0x46c, 0x46c}, - {0x46e, 0x46e}, {0x470, 0x470}, {0x472, 0x472}, {0x474, 0x474}, - {0x476, 0x476}, {0x478, 0x478}, {0x47a, 0x47a}, {0x47c, 0x47c}, - {0x47e, 0x47e}, {0x480, 0x480}, {0x48a, 0x48a}, {0x48c, 0x48c}, - {0x48e, 0x48e}, {0x490, 0x490}, {0x492, 0x492}, {0x494, 0x494}, - {0x496, 0x496}, {0x498, 0x498}, {0x49a, 0x49a}, {0x49c, 0x49c}, - {0x49e, 0x49e}, {0x4a0, 0x4a0}, {0x4a2, 0x4a2}, {0x4a4, 0x4a4}, - {0x4a6, 0x4a6}, {0x4a8, 0x4a8}, {0x4aa, 0x4aa}, {0x4ac, 0x4ac}, - {0x4ae, 0x4ae}, {0x4b0, 0x4b0}, {0x4b2, 0x4b2}, {0x4b4, 0x4b4}, - {0x4b6, 0x4b6}, {0x4b8, 0x4b8}, {0x4ba, 0x4ba}, {0x4bc, 0x4bc}, - {0x4be, 0x4be}, {0x4c0, 0x4c1}, {0x4c3, 0x4c3}, {0x4c5, 0x4c5}, - {0x4c7, 0x4c7}, {0x4c9, 0x4c9}, {0x4cb, 0x4cb}, {0x4cd, 0x4cd}, - {0x4d0, 0x4d0}, {0x4d2, 0x4d2}, {0x4d4, 0x4d4}, {0x4d6, 0x4d6}, - {0x4d8, 0x4d8}, {0x4da, 0x4da}, {0x4dc, 0x4dc}, {0x4de, 0x4de}, - {0x4e0, 0x4e0}, {0x4e2, 0x4e2}, {0x4e4, 0x4e4}, {0x4e6, 0x4e6}, - {0x4e8, 0x4e8}, {0x4ea, 0x4ea}, {0x4ec, 0x4ec}, {0x4ee, 0x4ee}, - {0x4f0, 0x4f0}, {0x4f2, 0x4f2}, {0x4f4, 0x4f4}, {0x4f8, 0x4f8}, - {0x500, 0x500}, {0x502, 0x502}, {0x504, 0x504}, {0x506, 0x506}, - {0x508, 0x508}, {0x50a, 0x50a}, {0x50c, 0x50c}, {0x50e, 0x50e}, - {0x531, 0x556}, {0x10a0, 0x10c5}, {0x1e00, 0x1e00}, {0x1e02, 0x1e02}, - {0x1e04, 0x1e04}, {0x1e06, 0x1e06}, {0x1e08, 0x1e08}, {0x1e0a, 0x1e0a}, - {0x1e0c, 0x1e0c}, {0x1e0e, 0x1e0e}, {0x1e10, 0x1e10}, {0x1e12, 0x1e12}, - {0x1e14, 0x1e14}, {0x1e16, 0x1e16}, {0x1e18, 0x1e18}, {0x1e1a, 0x1e1a}, - {0x1e1c, 0x1e1c}, {0x1e1e, 0x1e1e}, {0x1e20, 0x1e20}, {0x1e22, 0x1e22}, - {0x1e24, 0x1e24}, {0x1e26, 0x1e26}, {0x1e28, 0x1e28}, {0x1e2a, 0x1e2a}, - {0x1e2c, 0x1e2c}, {0x1e2e, 0x1e2e}, {0x1e30, 0x1e30}, {0x1e32, 0x1e32}, - {0x1e34, 0x1e34}, {0x1e36, 0x1e36}, {0x1e38, 0x1e38}, {0x1e3a, 0x1e3a}, - {0x1e3c, 0x1e3c}, {0x1e3e, 0x1e3e}, {0x1e40, 0x1e40}, {0x1e42, 0x1e42}, - {0x1e44, 0x1e44}, {0x1e46, 0x1e46}, {0x1e48, 0x1e48}, {0x1e4a, 0x1e4a}, - {0x1e4c, 0x1e4c}, {0x1e4e, 0x1e4e}, {0x1e50, 0x1e50}, {0x1e52, 0x1e52}, - {0x1e54, 0x1e54}, {0x1e56, 0x1e56}, {0x1e58, 0x1e58}, {0x1e5a, 0x1e5a}, - {0x1e5c, 0x1e5c}, {0x1e5e, 0x1e5e}, {0x1e60, 0x1e60}, {0x1e62, 0x1e62}, - {0x1e64, 0x1e64}, {0x1e66, 0x1e66}, {0x1e68, 0x1e68}, {0x1e6a, 0x1e6a}, - {0x1e6c, 0x1e6c}, {0x1e6e, 0x1e6e}, {0x1e70, 0x1e70}, {0x1e72, 0x1e72}, - {0x1e74, 0x1e74}, {0x1e76, 0x1e76}, {0x1e78, 0x1e78}, {0x1e7a, 0x1e7a}, - {0x1e7c, 0x1e7c}, {0x1e7e, 0x1e7e}, {0x1e80, 0x1e80}, {0x1e82, 0x1e82}, - {0x1e84, 0x1e84}, {0x1e86, 0x1e86}, {0x1e88, 0x1e88}, {0x1e8a, 0x1e8a}, - {0x1e8c, 0x1e8c}, {0x1e8e, 0x1e8e}, {0x1e90, 0x1e90}, {0x1e92, 0x1e92}, - {0x1e94, 0x1e94}, {0x1ea0, 0x1ea0}, {0x1ea2, 0x1ea2}, {0x1ea4, 0x1ea4}, - {0x1ea6, 0x1ea6}, {0x1ea8, 0x1ea8}, {0x1eaa, 0x1eaa}, {0x1eac, 0x1eac}, - {0x1eae, 0x1eae}, {0x1eb0, 0x1eb0}, {0x1eb2, 0x1eb2}, {0x1eb4, 0x1eb4}, - {0x1eb6, 0x1eb6}, {0x1eb8, 0x1eb8}, {0x1eba, 0x1eba}, {0x1ebc, 0x1ebc}, - {0x1ebe, 0x1ebe}, {0x1ec0, 0x1ec0}, {0x1ec2, 0x1ec2}, {0x1ec4, 0x1ec4}, - {0x1ec6, 0x1ec6}, {0x1ec8, 0x1ec8}, {0x1eca, 0x1eca}, {0x1ecc, 0x1ecc}, - {0x1ece, 0x1ece}, {0x1ed0, 0x1ed0}, {0x1ed2, 0x1ed2}, {0x1ed4, 0x1ed4}, - {0x1ed6, 0x1ed6}, {0x1ed8, 0x1ed8}, {0x1eda, 0x1eda}, {0x1edc, 0x1edc}, - {0x1ede, 0x1ede}, {0x1ee0, 0x1ee0}, {0x1ee2, 0x1ee2}, {0x1ee4, 0x1ee4}, - {0x1ee6, 0x1ee6}, {0x1ee8, 0x1ee8}, {0x1eea, 0x1eea}, {0x1eec, 0x1eec}, - {0x1eee, 0x1eee}, {0x1ef0, 0x1ef0}, {0x1ef2, 0x1ef2}, {0x1ef4, 0x1ef4}, - {0x1ef6, 0x1ef6}, {0x1ef8, 0x1ef8}, {0x1f08, 0x1f0f}, {0x1f18, 0x1f1d}, - {0x1f28, 0x1f2f}, {0x1f38, 0x1f3f}, {0x1f48, 0x1f4d}, {0x1f59, 0x1f59}, - {0x1f5b, 0x1f5b}, {0x1f5d, 0x1f5d}, {0x1f5f, 0x1f5f}, {0x1f68, 0x1f6f}, - {0x1fb8, 0x1fbb}, {0x1fc8, 0x1fcb}, {0x1fd8, 0x1fdb}, {0x1fe8, 0x1fec}, - {0x1ff8, 0x1ffb}, {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210b, 0x210d}, - {0x2110, 0x2112}, {0x2115, 0x2115}, {0x2119, 0x211d}, {0x2124, 0x2124}, - {0x2126, 0x2126}, {0x2128, 0x2128}, {0x212a, 0x212d}, {0x2130, 0x2131}, - {0x2133, 0x2133}, {0x213e, 0x213f}, {0x2145, 0x2145}, {0xff21, 0xff3a} }; -static const xmlChLRange xmlLuL[] = {{0x10400, 0x10427}, {0x1d400, 0x1d419}, - {0x1d434, 0x1d44d}, {0x1d468, 0x1d481}, {0x1d49c, 0x1d49c}, - {0x1d49e, 0x1d49f}, {0x1d4a2, 0x1d4a2}, {0x1d4a5, 0x1d4a6}, - {0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b5}, {0x1d4d0, 0x1d4e9}, - {0x1d504, 0x1d505}, {0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, - {0x1d516, 0x1d51c}, {0x1d538, 0x1d539}, {0x1d53b, 0x1d53e}, - {0x1d540, 0x1d544}, {0x1d546, 0x1d546}, {0x1d54a, 0x1d550}, - {0x1d56c, 0x1d585}, {0x1d5a0, 0x1d5b9}, {0x1d5d4, 0x1d5ed}, - {0x1d608, 0x1d621}, {0x1d63c, 0x1d655}, {0x1d670, 0x1d689}, - {0x1d6a8, 0x1d6c0}, {0x1d6e2, 0x1d6fa}, {0x1d71c, 0x1d734}, - {0x1d756, 0x1d76e}, {0x1d790, 0x1d7a8} }; -static xmlChRangeGroup xmlLuG = {390,31,xmlLuS,xmlLuL}; - -static const xmlChSRange xmlMS[] = {{0x300, 0x357}, {0x35d, 0x36f}, - {0x483, 0x486}, {0x488, 0x489}, {0x591, 0x5a1}, {0x5a3, 0x5b9}, - {0x5bb, 0x5bd}, {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4}, - {0x610, 0x615}, {0x64b, 0x658}, {0x670, 0x670}, {0x6d6, 0x6dc}, - {0x6de, 0x6e4}, {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x711, 0x711}, - {0x730, 0x74a}, {0x7a6, 0x7b0}, {0x901, 0x903}, {0x93c, 0x93c}, - {0x93e, 0x94d}, {0x951, 0x954}, {0x962, 0x963}, {0x981, 0x983}, - {0x9bc, 0x9bc}, {0x9be, 0x9c4}, {0x9c7, 0x9c8}, {0x9cb, 0x9cd}, - {0x9d7, 0x9d7}, {0x9e2, 0x9e3}, {0xa01, 0xa03}, {0xa3c, 0xa3c}, - {0xa3e, 0xa42}, {0xa47, 0xa48}, {0xa4b, 0xa4d}, {0xa70, 0xa71}, - {0xa81, 0xa83}, {0xabc, 0xabc}, {0xabe, 0xac5}, {0xac7, 0xac9}, - {0xacb, 0xacd}, {0xae2, 0xae3}, {0xb01, 0xb03}, {0xb3c, 0xb3c}, - {0xb3e, 0xb43}, {0xb47, 0xb48}, {0xb4b, 0xb4d}, {0xb56, 0xb57}, - {0xb82, 0xb82}, {0xbbe, 0xbc2}, {0xbc6, 0xbc8}, {0xbca, 0xbcd}, - {0xbd7, 0xbd7}, {0xc01, 0xc03}, {0xc3e, 0xc44}, {0xc46, 0xc48}, - {0xc4a, 0xc4d}, {0xc55, 0xc56}, {0xc82, 0xc83}, {0xcbc, 0xcbc}, - {0xcbe, 0xcc4}, {0xcc6, 0xcc8}, {0xcca, 0xccd}, {0xcd5, 0xcd6}, - {0xd02, 0xd03}, {0xd3e, 0xd43}, {0xd46, 0xd48}, {0xd4a, 0xd4d}, - {0xd57, 0xd57}, {0xd82, 0xd83}, {0xdca, 0xdca}, {0xdcf, 0xdd4}, - {0xdd6, 0xdd6}, {0xdd8, 0xddf}, {0xdf2, 0xdf3}, {0xe31, 0xe31}, - {0xe34, 0xe3a}, {0xe47, 0xe4e}, {0xeb1, 0xeb1}, {0xeb4, 0xeb9}, - {0xebb, 0xebc}, {0xec8, 0xecd}, {0xf18, 0xf19}, {0xf35, 0xf35}, - {0xf37, 0xf37}, {0xf39, 0xf39}, {0xf3e, 0xf3f}, {0xf71, 0xf84}, - {0xf86, 0xf87}, {0xf90, 0xf97}, {0xf99, 0xfbc}, {0xfc6, 0xfc6}, - {0x102c, 0x1032}, {0x1036, 0x1039}, {0x1056, 0x1059}, {0x1712, 0x1714}, - {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17b6, 0x17d3}, - {0x17dd, 0x17dd}, {0x180b, 0x180d}, {0x18a9, 0x18a9}, {0x1920, 0x192b}, - {0x1930, 0x193b}, {0x20d0, 0x20ea}, {0x302a, 0x302f}, {0x3099, 0x309a}, - {0xfb1e, 0xfb1e}, {0xfe00, 0xfe0f}, {0xfe20, 0xfe23} }; -static const xmlChLRange xmlML[] = {{0x1d165, 0x1d169}, {0x1d16d, 0x1d172}, - {0x1d17b, 0x1d182}, {0x1d185, 0x1d18b}, {0x1d1aa, 0x1d1ad}, - {0xe0100, 0xe01ef} }; -static xmlChRangeGroup xmlMG = {113,6,xmlMS,xmlML}; - -static const xmlChSRange xmlMcS[] = {{0x903, 0x903}, {0x93e, 0x940}, - {0x949, 0x94c}, {0x982, 0x983}, {0x9be, 0x9c0}, {0x9c7, 0x9c8}, - {0x9cb, 0x9cc}, {0x9d7, 0x9d7}, {0xa03, 0xa03}, {0xa3e, 0xa40}, - {0xa83, 0xa83}, {0xabe, 0xac0}, {0xac9, 0xac9}, {0xacb, 0xacc}, - {0xb02, 0xb03}, {0xb3e, 0xb3e}, {0xb40, 0xb40}, {0xb47, 0xb48}, - {0xb4b, 0xb4c}, {0xb57, 0xb57}, {0xbbe, 0xbbf}, {0xbc1, 0xbc2}, - {0xbc6, 0xbc8}, {0xbca, 0xbcc}, {0xbd7, 0xbd7}, {0xc01, 0xc03}, - {0xc41, 0xc44}, {0xc82, 0xc83}, {0xcbe, 0xcbe}, {0xcc0, 0xcc4}, - {0xcc7, 0xcc8}, {0xcca, 0xccb}, {0xcd5, 0xcd6}, {0xd02, 0xd03}, - {0xd3e, 0xd40}, {0xd46, 0xd48}, {0xd4a, 0xd4c}, {0xd57, 0xd57}, - {0xd82, 0xd83}, {0xdcf, 0xdd1}, {0xdd8, 0xddf}, {0xdf2, 0xdf3}, - {0xf3e, 0xf3f}, {0xf7f, 0xf7f}, {0x102c, 0x102c}, {0x1031, 0x1031}, - {0x1038, 0x1038}, {0x1056, 0x1057}, {0x17b6, 0x17b6}, {0x17be, 0x17c5}, - {0x17c7, 0x17c8}, {0x1923, 0x1926}, {0x1929, 0x192b}, {0x1930, 0x1931}, - {0x1933, 0x1938} }; -static const xmlChLRange xmlMcL[] = {{0x1d165, 0x1d166}, {0x1d16d, 0x1d172} }; -static xmlChRangeGroup xmlMcG = {55,2,xmlMcS,xmlMcL}; - -static const xmlChSRange xmlMnS[] = {{0x300, 0x357}, {0x35d, 0x36f}, - {0x483, 0x486}, {0x591, 0x5a1}, {0x5a3, 0x5b9}, {0x5bb, 0x5bd}, - {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4}, {0x610, 0x615}, - {0x64b, 0x658}, {0x670, 0x670}, {0x6d6, 0x6dc}, {0x6df, 0x6e4}, - {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x711, 0x711}, {0x730, 0x74a}, - {0x7a6, 0x7b0}, {0x901, 0x902}, {0x93c, 0x93c}, {0x941, 0x948}, - {0x94d, 0x94d}, {0x951, 0x954}, {0x962, 0x963}, {0x981, 0x981}, - {0x9bc, 0x9bc}, {0x9c1, 0x9c4}, {0x9cd, 0x9cd}, {0x9e2, 0x9e3}, - {0xa01, 0xa02}, {0xa3c, 0xa3c}, {0xa41, 0xa42}, {0xa47, 0xa48}, - {0xa4b, 0xa4d}, {0xa70, 0xa71}, {0xa81, 0xa82}, {0xabc, 0xabc}, - {0xac1, 0xac5}, {0xac7, 0xac8}, {0xacd, 0xacd}, {0xae2, 0xae3}, - {0xb01, 0xb01}, {0xb3c, 0xb3c}, {0xb3f, 0xb3f}, {0xb41, 0xb43}, - {0xb4d, 0xb4d}, {0xb56, 0xb56}, {0xb82, 0xb82}, {0xbc0, 0xbc0}, - {0xbcd, 0xbcd}, {0xc3e, 0xc40}, {0xc46, 0xc48}, {0xc4a, 0xc4d}, - {0xc55, 0xc56}, {0xcbc, 0xcbc}, {0xcbf, 0xcbf}, {0xcc6, 0xcc6}, - {0xccc, 0xccd}, {0xd41, 0xd43}, {0xd4d, 0xd4d}, {0xdca, 0xdca}, - {0xdd2, 0xdd4}, {0xdd6, 0xdd6}, {0xe31, 0xe31}, {0xe34, 0xe3a}, - {0xe47, 0xe4e}, {0xeb1, 0xeb1}, {0xeb4, 0xeb9}, {0xebb, 0xebc}, - {0xec8, 0xecd}, {0xf18, 0xf19}, {0xf35, 0xf35}, {0xf37, 0xf37}, - {0xf39, 0xf39}, {0xf71, 0xf7e}, {0xf80, 0xf84}, {0xf86, 0xf87}, - {0xf90, 0xf97}, {0xf99, 0xfbc}, {0xfc6, 0xfc6}, {0x102d, 0x1030}, - {0x1032, 0x1032}, {0x1036, 0x1037}, {0x1039, 0x1039}, {0x1058, 0x1059}, - {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, - {0x17b7, 0x17bd}, {0x17c6, 0x17c6}, {0x17c9, 0x17d3}, {0x17dd, 0x17dd}, - {0x180b, 0x180d}, {0x18a9, 0x18a9}, {0x1920, 0x1922}, {0x1927, 0x1928}, - {0x1932, 0x1932}, {0x1939, 0x193b}, {0x20d0, 0x20dc}, {0x20e1, 0x20e1}, - {0x20e5, 0x20ea}, {0x302a, 0x302f}, {0x3099, 0x309a}, {0xfb1e, 0xfb1e}, - {0xfe00, 0xfe0f}, {0xfe20, 0xfe23} }; -static const xmlChLRange xmlMnL[] = {{0x1d167, 0x1d169}, {0x1d17b, 0x1d182}, - {0x1d185, 0x1d18b}, {0x1d1aa, 0x1d1ad}, {0xe0100, 0xe01ef} }; -static xmlChRangeGroup xmlMnG = {108,5,xmlMnS,xmlMnL}; - -static const xmlChSRange xmlNS[] = {{0x30, 0x39}, {0xb2, 0xb3}, - {0xb9, 0xb9}, {0xbc, 0xbe}, {0x660, 0x669}, {0x6f0, 0x6f9}, - {0x966, 0x96f}, {0x9e6, 0x9ef}, {0x9f4, 0x9f9}, {0xa66, 0xa6f}, - {0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbf2}, {0xc66, 0xc6f}, - {0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, - {0xf20, 0xf33}, {0x1040, 0x1049}, {0x1369, 0x137c}, {0x16ee, 0x16f0}, - {0x17e0, 0x17e9}, {0x17f0, 0x17f9}, {0x1810, 0x1819}, {0x1946, 0x194f}, - {0x2070, 0x2070}, {0x2074, 0x2079}, {0x2080, 0x2089}, {0x2153, 0x2183}, - {0x2460, 0x249b}, {0x24ea, 0x24ff}, {0x2776, 0x2793}, {0x3007, 0x3007}, - {0x3021, 0x3029}, {0x3038, 0x303a}, {0x3192, 0x3195}, {0x3220, 0x3229}, - {0x3251, 0x325f}, {0x3280, 0x3289}, {0x32b1, 0x32bf}, {0xff10, 0xff19} }; -static const xmlChLRange xmlNL[] = {{0x10107, 0x10133}, {0x10320, 0x10323}, - {0x1034a, 0x1034a}, {0x104a0, 0x104a9}, {0x1d7ce, 0x1d7ff} }; -static xmlChRangeGroup xmlNG = {42,5,xmlNS,xmlNL}; - -static const xmlChSRange xmlNdS[] = {{0x30, 0x39}, {0x660, 0x669}, - {0x6f0, 0x6f9}, {0x966, 0x96f}, {0x9e6, 0x9ef}, {0xa66, 0xa6f}, - {0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbef}, {0xc66, 0xc6f}, - {0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, - {0xf20, 0xf29}, {0x1040, 0x1049}, {0x1369, 0x1371}, {0x17e0, 0x17e9}, - {0x1810, 0x1819}, {0x1946, 0x194f}, {0xff10, 0xff19} }; -static const xmlChLRange xmlNdL[] = {{0x104a0, 0x104a9}, {0x1d7ce, 0x1d7ff} }; -static xmlChRangeGroup xmlNdG = {21,2,xmlNdS,xmlNdL}; - -static const xmlChSRange xmlNoS[] = {{0xb2, 0xb3}, {0xb9, 0xb9}, - {0xbc, 0xbe}, {0x9f4, 0x9f9}, {0xbf0, 0xbf2}, {0xf2a, 0xf33}, - {0x1372, 0x137c}, {0x17f0, 0x17f9}, {0x2070, 0x2070}, {0x2074, 0x2079}, - {0x2080, 0x2089}, {0x2153, 0x215f}, {0x2460, 0x249b}, {0x24ea, 0x24ff}, - {0x2776, 0x2793}, {0x3192, 0x3195}, {0x3220, 0x3229}, {0x3251, 0x325f}, - {0x3280, 0x3289}, {0x32b1, 0x32bf} }; -static const xmlChLRange xmlNoL[] = {{0x10107, 0x10133}, {0x10320, 0x10323} }; -static xmlChRangeGroup xmlNoG = {20,2,xmlNoS,xmlNoL}; - -static const xmlChSRange xmlPS[] = {{0x21, 0x23}, {0x25, 0x2a}, - {0x2c, 0x2f}, {0x3a, 0x3b}, {0x3f, 0x40}, {0x5b, 0x5d}, {0x5f, 0x5f}, - {0x7b, 0x7b}, {0x7d, 0x7d}, {0xa1, 0xa1}, {0xab, 0xab}, {0xb7, 0xb7}, - {0xbb, 0xbb}, {0xbf, 0xbf}, {0x37e, 0x37e}, {0x387, 0x387}, - {0x55a, 0x55f}, {0x589, 0x58a}, {0x5be, 0x5be}, {0x5c0, 0x5c0}, - {0x5c3, 0x5c3}, {0x5f3, 0x5f4}, {0x60c, 0x60d}, {0x61b, 0x61b}, - {0x61f, 0x61f}, {0x66a, 0x66d}, {0x6d4, 0x6d4}, {0x700, 0x70d}, - {0x964, 0x965}, {0x970, 0x970}, {0xdf4, 0xdf4}, {0xe4f, 0xe4f}, - {0xe5a, 0xe5b}, {0xf04, 0xf12}, {0xf3a, 0xf3d}, {0xf85, 0xf85}, - {0x104a, 0x104f}, {0x10fb, 0x10fb}, {0x1361, 0x1368}, {0x166d, 0x166e}, - {0x169b, 0x169c}, {0x16eb, 0x16ed}, {0x1735, 0x1736}, {0x17d4, 0x17d6}, - {0x17d8, 0x17da}, {0x1800, 0x180a}, {0x1944, 0x1945}, {0x2010, 0x2027}, - {0x2030, 0x2043}, {0x2045, 0x2051}, {0x2053, 0x2054}, {0x2057, 0x2057}, - {0x207d, 0x207e}, {0x208d, 0x208e}, {0x2329, 0x232a}, {0x23b4, 0x23b6}, - {0x2768, 0x2775}, {0x27e6, 0x27eb}, {0x2983, 0x2998}, {0x29d8, 0x29db}, - {0x29fc, 0x29fd}, {0x3001, 0x3003}, {0x3008, 0x3011}, {0x3014, 0x301f}, - {0x3030, 0x3030}, {0x303d, 0x303d}, {0x30a0, 0x30a0}, {0x30fb, 0x30fb}, - {0xfd3e, 0xfd3f}, {0xfe30, 0xfe52}, {0xfe54, 0xfe61}, {0xfe63, 0xfe63}, - {0xfe68, 0xfe68}, {0xfe6a, 0xfe6b}, {0xff01, 0xff03}, {0xff05, 0xff0a}, - {0xff0c, 0xff0f}, {0xff1a, 0xff1b}, {0xff1f, 0xff20}, {0xff3b, 0xff3d}, - {0xff3f, 0xff3f}, {0xff5b, 0xff5b}, {0xff5d, 0xff5d}, {0xff5f, 0xff65} }; -static const xmlChLRange xmlPL[] = {{0x10100, 0x10101}, {0x1039f, 0x1039f} }; -static xmlChRangeGroup xmlPG = {84,2,xmlPS,xmlPL}; - -static const xmlChSRange xmlPdS[] = {{0x2d, 0x2d}, {0x58a, 0x58a}, - {0x1806, 0x1806}, {0x2010, 0x2015}, {0x301c, 0x301c}, {0x3030, 0x3030}, - {0x30a0, 0x30a0}, {0xfe31, 0xfe32}, {0xfe58, 0xfe58}, {0xfe63, 0xfe63}, - {0xff0d, 0xff0d} }; -static xmlChRangeGroup xmlPdG = {11,0,xmlPdS,NULL}; - -static const xmlChSRange xmlPeS[] = {{0x29, 0x29}, {0x5d, 0x5d}, - {0x7d, 0x7d}, {0xf3b, 0xf3b}, {0xf3d, 0xf3d}, {0x169c, 0x169c}, - {0x2046, 0x2046}, {0x207e, 0x207e}, {0x208e, 0x208e}, {0x232a, 0x232a}, - {0x23b5, 0x23b5}, {0x2769, 0x2769}, {0x276b, 0x276b}, {0x276d, 0x276d}, - {0x276f, 0x276f}, {0x2771, 0x2771}, {0x2773, 0x2773}, {0x2775, 0x2775}, - {0x27e7, 0x27e7}, {0x27e9, 0x27e9}, {0x27eb, 0x27eb}, {0x2984, 0x2984}, - {0x2986, 0x2986}, {0x2988, 0x2988}, {0x298a, 0x298a}, {0x298c, 0x298c}, - {0x298e, 0x298e}, {0x2990, 0x2990}, {0x2992, 0x2992}, {0x2994, 0x2994}, - {0x2996, 0x2996}, {0x2998, 0x2998}, {0x29d9, 0x29d9}, {0x29db, 0x29db}, - {0x29fd, 0x29fd}, {0x3009, 0x3009}, {0x300b, 0x300b}, {0x300d, 0x300d}, - {0x300f, 0x300f}, {0x3011, 0x3011}, {0x3015, 0x3015}, {0x3017, 0x3017}, - {0x3019, 0x3019}, {0x301b, 0x301b}, {0x301e, 0x301f}, {0xfd3f, 0xfd3f}, - {0xfe36, 0xfe36}, {0xfe38, 0xfe38}, {0xfe3a, 0xfe3a}, {0xfe3c, 0xfe3c}, - {0xfe3e, 0xfe3e}, {0xfe40, 0xfe40}, {0xfe42, 0xfe42}, {0xfe44, 0xfe44}, - {0xfe48, 0xfe48}, {0xfe5a, 0xfe5a}, {0xfe5c, 0xfe5c}, {0xfe5e, 0xfe5e}, - {0xff09, 0xff09}, {0xff3d, 0xff3d}, {0xff5d, 0xff5d}, {0xff60, 0xff60}, - {0xff63, 0xff63} }; -static xmlChRangeGroup xmlPeG = {63,0,xmlPeS,NULL}; - -static const xmlChSRange xmlPoS[] = {{0x21, 0x23}, {0x25, 0x27}, - {0x2a, 0x2a}, {0x2c, 0x2c}, {0x2e, 0x2f}, {0x3a, 0x3b}, {0x3f, 0x40}, - {0x5c, 0x5c}, {0xa1, 0xa1}, {0xb7, 0xb7}, {0xbf, 0xbf}, {0x37e, 0x37e}, - {0x387, 0x387}, {0x55a, 0x55f}, {0x589, 0x589}, {0x5be, 0x5be}, - {0x5c0, 0x5c0}, {0x5c3, 0x5c3}, {0x5f3, 0x5f4}, {0x60c, 0x60d}, - {0x61b, 0x61b}, {0x61f, 0x61f}, {0x66a, 0x66d}, {0x6d4, 0x6d4}, - {0x700, 0x70d}, {0x964, 0x965}, {0x970, 0x970}, {0xdf4, 0xdf4}, - {0xe4f, 0xe4f}, {0xe5a, 0xe5b}, {0xf04, 0xf12}, {0xf85, 0xf85}, - {0x104a, 0x104f}, {0x10fb, 0x10fb}, {0x1361, 0x1368}, {0x166d, 0x166e}, - {0x16eb, 0x16ed}, {0x1735, 0x1736}, {0x17d4, 0x17d6}, {0x17d8, 0x17da}, - {0x1800, 0x1805}, {0x1807, 0x180a}, {0x1944, 0x1945}, {0x2016, 0x2017}, - {0x2020, 0x2027}, {0x2030, 0x2038}, {0x203b, 0x203e}, {0x2041, 0x2043}, - {0x2047, 0x2051}, {0x2053, 0x2053}, {0x2057, 0x2057}, {0x23b6, 0x23b6}, - {0x3001, 0x3003}, {0x303d, 0x303d}, {0xfe30, 0xfe30}, {0xfe45, 0xfe46}, - {0xfe49, 0xfe4c}, {0xfe50, 0xfe52}, {0xfe54, 0xfe57}, {0xfe5f, 0xfe61}, - {0xfe68, 0xfe68}, {0xfe6a, 0xfe6b}, {0xff01, 0xff03}, {0xff05, 0xff07}, - {0xff0a, 0xff0a}, {0xff0c, 0xff0c}, {0xff0e, 0xff0f}, {0xff1a, 0xff1b}, - {0xff1f, 0xff20}, {0xff3c, 0xff3c}, {0xff61, 0xff61}, {0xff64, 0xff64} }; -static const xmlChLRange xmlPoL[] = {{0x10100, 0x10101}, {0x1039f, 0x1039f} }; -static xmlChRangeGroup xmlPoG = {72,2,xmlPoS,xmlPoL}; - -static const xmlChSRange xmlPsS[] = {{0x28, 0x28}, {0x5b, 0x5b}, - {0x7b, 0x7b}, {0xf3a, 0xf3a}, {0xf3c, 0xf3c}, {0x169b, 0x169b}, - {0x201a, 0x201a}, {0x201e, 0x201e}, {0x2045, 0x2045}, {0x207d, 0x207d}, - {0x208d, 0x208d}, {0x2329, 0x2329}, {0x23b4, 0x23b4}, {0x2768, 0x2768}, - {0x276a, 0x276a}, {0x276c, 0x276c}, {0x276e, 0x276e}, {0x2770, 0x2770}, - {0x2772, 0x2772}, {0x2774, 0x2774}, {0x27e6, 0x27e6}, {0x27e8, 0x27e8}, - {0x27ea, 0x27ea}, {0x2983, 0x2983}, {0x2985, 0x2985}, {0x2987, 0x2987}, - {0x2989, 0x2989}, {0x298b, 0x298b}, {0x298d, 0x298d}, {0x298f, 0x298f}, - {0x2991, 0x2991}, {0x2993, 0x2993}, {0x2995, 0x2995}, {0x2997, 0x2997}, - {0x29d8, 0x29d8}, {0x29da, 0x29da}, {0x29fc, 0x29fc}, {0x3008, 0x3008}, - {0x300a, 0x300a}, {0x300c, 0x300c}, {0x300e, 0x300e}, {0x3010, 0x3010}, - {0x3014, 0x3014}, {0x3016, 0x3016}, {0x3018, 0x3018}, {0x301a, 0x301a}, - {0x301d, 0x301d}, {0xfd3e, 0xfd3e}, {0xfe35, 0xfe35}, {0xfe37, 0xfe37}, - {0xfe39, 0xfe39}, {0xfe3b, 0xfe3b}, {0xfe3d, 0xfe3d}, {0xfe3f, 0xfe3f}, - {0xfe41, 0xfe41}, {0xfe43, 0xfe43}, {0xfe47, 0xfe47}, {0xfe59, 0xfe59}, - {0xfe5b, 0xfe5b}, {0xfe5d, 0xfe5d}, {0xff08, 0xff08}, {0xff3b, 0xff3b}, - {0xff5b, 0xff5b}, {0xff5f, 0xff5f}, {0xff62, 0xff62} }; -static xmlChRangeGroup xmlPsG = {65,0,xmlPsS,NULL}; - -static const xmlChSRange xmlSS[] = {{0x24, 0x24}, {0x2b, 0x2b}, - {0x3c, 0x3e}, {0x5e, 0x5e}, {0x60, 0x60}, {0x7c, 0x7c}, {0x7e, 0x7e}, - {0xa2, 0xa9}, {0xac, 0xac}, {0xae, 0xb1}, {0xb4, 0xb4}, {0xb6, 0xb6}, - {0xb8, 0xb8}, {0xd7, 0xd7}, {0xf7, 0xf7}, {0x2c2, 0x2c5}, - {0x2d2, 0x2df}, {0x2e5, 0x2ed}, {0x2ef, 0x2ff}, {0x374, 0x375}, - {0x384, 0x385}, {0x3f6, 0x3f6}, {0x482, 0x482}, {0x60e, 0x60f}, - {0x6e9, 0x6e9}, {0x6fd, 0x6fe}, {0x9f2, 0x9f3}, {0x9fa, 0x9fa}, - {0xaf1, 0xaf1}, {0xb70, 0xb70}, {0xbf3, 0xbfa}, {0xe3f, 0xe3f}, - {0xf01, 0xf03}, {0xf13, 0xf17}, {0xf1a, 0xf1f}, {0xf34, 0xf34}, - {0xf36, 0xf36}, {0xf38, 0xf38}, {0xfbe, 0xfc5}, {0xfc7, 0xfcc}, - {0xfcf, 0xfcf}, {0x17db, 0x17db}, {0x1940, 0x1940}, {0x19e0, 0x19ff}, - {0x1fbd, 0x1fbd}, {0x1fbf, 0x1fc1}, {0x1fcd, 0x1fcf}, {0x1fdd, 0x1fdf}, - {0x1fed, 0x1fef}, {0x1ffd, 0x1ffe}, {0x2044, 0x2044}, {0x2052, 0x2052}, - {0x207a, 0x207c}, {0x208a, 0x208c}, {0x20a0, 0x20b1}, {0x2100, 0x2101}, - {0x2103, 0x2106}, {0x2108, 0x2109}, {0x2114, 0x2114}, {0x2116, 0x2118}, - {0x211e, 0x2123}, {0x2125, 0x2125}, {0x2127, 0x2127}, {0x2129, 0x2129}, - {0x212e, 0x212e}, {0x2132, 0x2132}, {0x213a, 0x213b}, {0x2140, 0x2144}, - {0x214a, 0x214b}, {0x2190, 0x2328}, {0x232b, 0x23b3}, {0x23b7, 0x23d0}, - {0x2400, 0x2426}, {0x2440, 0x244a}, {0x249c, 0x24e9}, {0x2500, 0x2617}, - {0x2619, 0x267d}, {0x2680, 0x2691}, {0x26a0, 0x26a1}, {0x2701, 0x2704}, - {0x2706, 0x2709}, {0x270c, 0x2727}, {0x2729, 0x274b}, {0x274d, 0x274d}, - {0x274f, 0x2752}, {0x2756, 0x2756}, {0x2758, 0x275e}, {0x2761, 0x2767}, - {0x2794, 0x2794}, {0x2798, 0x27af}, {0x27b1, 0x27be}, {0x27d0, 0x27e5}, - {0x27f0, 0x2982}, {0x2999, 0x29d7}, {0x29dc, 0x29fb}, {0x29fe, 0x2b0d}, - {0x2e80, 0x2e99}, {0x2e9b, 0x2ef3}, {0x2f00, 0x2fd5}, {0x2ff0, 0x2ffb}, - {0x3004, 0x3004}, {0x3012, 0x3013}, {0x3020, 0x3020}, {0x3036, 0x3037}, - {0x303e, 0x303f}, {0x309b, 0x309c}, {0x3190, 0x3191}, {0x3196, 0x319f}, - {0x3200, 0x321e}, {0x322a, 0x3243}, {0x3250, 0x3250}, {0x3260, 0x327d}, - {0x327f, 0x327f}, {0x328a, 0x32b0}, {0x32c0, 0x32fe}, {0x3300, 0x33ff}, - {0x4dc0, 0x4dff}, {0xa490, 0xa4c6}, {0xfb29, 0xfb29}, {0xfdfc, 0xfdfd}, - {0xfe62, 0xfe62}, {0xfe64, 0xfe66}, {0xfe69, 0xfe69}, {0xff04, 0xff04}, - {0xff0b, 0xff0b}, {0xff1c, 0xff1e}, {0xff3e, 0xff3e}, {0xff40, 0xff40}, - {0xff5c, 0xff5c}, {0xff5e, 0xff5e}, {0xffe0, 0xffe6}, {0xffe8, 0xffee}, - {0xfffc, 0xfffd} }; -static const xmlChLRange xmlSL[] = {{0x10102, 0x10102}, {0x10137, 0x1013f}, - {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126}, {0x1d12a, 0x1d164}, - {0x1d16a, 0x1d16c}, {0x1d183, 0x1d184}, {0x1d18c, 0x1d1a9}, - {0x1d1ae, 0x1d1dd}, {0x1d300, 0x1d356}, {0x1d6c1, 0x1d6c1}, - {0x1d6db, 0x1d6db}, {0x1d6fb, 0x1d6fb}, {0x1d715, 0x1d715}, - {0x1d735, 0x1d735}, {0x1d74f, 0x1d74f}, {0x1d76f, 0x1d76f}, - {0x1d789, 0x1d789}, {0x1d7a9, 0x1d7a9}, {0x1d7c3, 0x1d7c3} }; -static xmlChRangeGroup xmlSG = {133,20,xmlSS,xmlSL}; - -static const xmlChSRange xmlScS[] = {{0x24, 0x24}, {0xa2, 0xa5}, - {0x9f2, 0x9f3}, {0xaf1, 0xaf1}, {0xbf9, 0xbf9}, {0xe3f, 0xe3f}, - {0x17db, 0x17db}, {0x20a0, 0x20b1}, {0xfdfc, 0xfdfc}, {0xfe69, 0xfe69}, - {0xff04, 0xff04}, {0xffe0, 0xffe1}, {0xffe5, 0xffe6} }; -static xmlChRangeGroup xmlScG = {13,0,xmlScS,NULL}; - -static const xmlChSRange xmlSkS[] = {{0x5e, 0x5e}, {0x60, 0x60}, - {0xa8, 0xa8}, {0xaf, 0xaf}, {0xb4, 0xb4}, {0xb8, 0xb8}, {0x2c2, 0x2c5}, - {0x2d2, 0x2df}, {0x2e5, 0x2ed}, {0x2ef, 0x2ff}, {0x374, 0x375}, - {0x384, 0x385}, {0x1fbd, 0x1fbd}, {0x1fbf, 0x1fc1}, {0x1fcd, 0x1fcf}, - {0x1fdd, 0x1fdf}, {0x1fed, 0x1fef}, {0x1ffd, 0x1ffe}, {0x309b, 0x309c}, - {0xff3e, 0xff3e}, {0xff40, 0xff40}, {0xffe3, 0xffe3} }; -static xmlChRangeGroup xmlSkG = {22,0,xmlSkS,NULL}; - -static const xmlChSRange xmlSmS[] = {{0x2b, 0x2b}, {0x3c, 0x3e}, - {0x7c, 0x7c}, {0x7e, 0x7e}, {0xac, 0xac}, {0xb1, 0xb1}, {0xd7, 0xd7}, - {0xf7, 0xf7}, {0x3f6, 0x3f6}, {0x2044, 0x2044}, {0x2052, 0x2052}, - {0x207a, 0x207c}, {0x208a, 0x208c}, {0x2140, 0x2144}, {0x214b, 0x214b}, - {0x2190, 0x2194}, {0x219a, 0x219b}, {0x21a0, 0x21a0}, {0x21a3, 0x21a3}, - {0x21a6, 0x21a6}, {0x21ae, 0x21ae}, {0x21ce, 0x21cf}, {0x21d2, 0x21d2}, - {0x21d4, 0x21d4}, {0x21f4, 0x22ff}, {0x2308, 0x230b}, {0x2320, 0x2321}, - {0x237c, 0x237c}, {0x239b, 0x23b3}, {0x25b7, 0x25b7}, {0x25c1, 0x25c1}, - {0x25f8, 0x25ff}, {0x266f, 0x266f}, {0x27d0, 0x27e5}, {0x27f0, 0x27ff}, - {0x2900, 0x2982}, {0x2999, 0x29d7}, {0x29dc, 0x29fb}, {0x29fe, 0x2aff}, - {0xfb29, 0xfb29}, {0xfe62, 0xfe62}, {0xfe64, 0xfe66}, {0xff0b, 0xff0b}, - {0xff1c, 0xff1e}, {0xff5c, 0xff5c}, {0xff5e, 0xff5e}, {0xffe2, 0xffe2}, - {0xffe9, 0xffec} }; -static const xmlChLRange xmlSmL[] = {{0x1d6c1, 0x1d6c1}, {0x1d6db, 0x1d6db}, - {0x1d6fb, 0x1d6fb}, {0x1d715, 0x1d715}, {0x1d735, 0x1d735}, - {0x1d74f, 0x1d74f}, {0x1d76f, 0x1d76f}, {0x1d789, 0x1d789}, - {0x1d7a9, 0x1d7a9}, {0x1d7c3, 0x1d7c3} }; -static xmlChRangeGroup xmlSmG = {48,10,xmlSmS,xmlSmL}; - -static const xmlChSRange xmlSoS[] = {{0xa6, 0xa7}, {0xa9, 0xa9}, - {0xae, 0xae}, {0xb0, 0xb0}, {0xb6, 0xb6}, {0x482, 0x482}, - {0x60e, 0x60f}, {0x6e9, 0x6e9}, {0x6fd, 0x6fe}, {0x9fa, 0x9fa}, - {0xb70, 0xb70}, {0xbf3, 0xbf8}, {0xbfa, 0xbfa}, {0xf01, 0xf03}, - {0xf13, 0xf17}, {0xf1a, 0xf1f}, {0xf34, 0xf34}, {0xf36, 0xf36}, - {0xf38, 0xf38}, {0xfbe, 0xfc5}, {0xfc7, 0xfcc}, {0xfcf, 0xfcf}, - {0x1940, 0x1940}, {0x19e0, 0x19ff}, {0x2100, 0x2101}, {0x2103, 0x2106}, - {0x2108, 0x2109}, {0x2114, 0x2114}, {0x2116, 0x2118}, {0x211e, 0x2123}, - {0x2125, 0x2125}, {0x2127, 0x2127}, {0x2129, 0x2129}, {0x212e, 0x212e}, - {0x2132, 0x2132}, {0x213a, 0x213b}, {0x214a, 0x214a}, {0x2195, 0x2199}, - {0x219c, 0x219f}, {0x21a1, 0x21a2}, {0x21a4, 0x21a5}, {0x21a7, 0x21ad}, - {0x21af, 0x21cd}, {0x21d0, 0x21d1}, {0x21d3, 0x21d3}, {0x21d5, 0x21f3}, - {0x2300, 0x2307}, {0x230c, 0x231f}, {0x2322, 0x2328}, {0x232b, 0x237b}, - {0x237d, 0x239a}, {0x23b7, 0x23d0}, {0x2400, 0x2426}, {0x2440, 0x244a}, - {0x249c, 0x24e9}, {0x2500, 0x25b6}, {0x25b8, 0x25c0}, {0x25c2, 0x25f7}, - {0x2600, 0x2617}, {0x2619, 0x266e}, {0x2670, 0x267d}, {0x2680, 0x2691}, - {0x26a0, 0x26a1}, {0x2701, 0x2704}, {0x2706, 0x2709}, {0x270c, 0x2727}, - {0x2729, 0x274b}, {0x274d, 0x274d}, {0x274f, 0x2752}, {0x2756, 0x2756}, - {0x2758, 0x275e}, {0x2761, 0x2767}, {0x2794, 0x2794}, {0x2798, 0x27af}, - {0x27b1, 0x27be}, {0x2800, 0x28ff}, {0x2b00, 0x2b0d}, {0x2e80, 0x2e99}, - {0x2e9b, 0x2ef3}, {0x2f00, 0x2fd5}, {0x2ff0, 0x2ffb}, {0x3004, 0x3004}, - {0x3012, 0x3013}, {0x3020, 0x3020}, {0x3036, 0x3037}, {0x303e, 0x303f}, - {0x3190, 0x3191}, {0x3196, 0x319f}, {0x3200, 0x321e}, {0x322a, 0x3243}, - {0x3250, 0x3250}, {0x3260, 0x327d}, {0x327f, 0x327f}, {0x328a, 0x32b0}, - {0x32c0, 0x32fe}, {0x3300, 0x33ff}, {0x4dc0, 0x4dff}, {0xa490, 0xa4c6}, - {0xfdfd, 0xfdfd}, {0xffe4, 0xffe4}, {0xffe8, 0xffe8}, {0xffed, 0xffee}, - {0xfffc, 0xfffd} }; -static const xmlChLRange xmlSoL[] = {{0x10102, 0x10102}, {0x10137, 0x1013f}, - {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126}, {0x1d12a, 0x1d164}, - {0x1d16a, 0x1d16c}, {0x1d183, 0x1d184}, {0x1d18c, 0x1d1a9}, - {0x1d1ae, 0x1d1dd}, {0x1d300, 0x1d356} }; -static xmlChRangeGroup xmlSoG = {103,10,xmlSoS,xmlSoL}; - -static const xmlChSRange xmlZS[] = {{0x20, 0x20}, {0xa0, 0xa0}, - {0x1680, 0x1680}, {0x180e, 0x180e}, {0x2000, 0x200a}, {0x2028, 0x2029}, - {0x202f, 0x202f}, {0x205f, 0x205f}, {0x3000, 0x3000} }; -static xmlChRangeGroup xmlZG = {9,0,xmlZS,NULL}; - -static xmlUnicodeNameTable xmlUnicodeBlockTbl = {xmlUnicodeBlocks, 128}; -static xmlUnicodeNameTable xmlUnicodeCatTbl = {xmlUnicodeCats, 36}; - -/** - * xmlUnicodeLookup: - * @tptr: pointer to the name table - * @name: name to be found - * - * binary table lookup for user-supplied name - * - * Returns pointer to range function if found, otherwise NULL - */ -static xmlIntFunc -*xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname) { - int low, high, mid, cmp; - xmlUnicodeRange *sptr; - - if ((tptr == NULL) || (tname == NULL)) return(NULL); - - low = 0; - high = tptr->numentries - 1; - sptr = tptr->table; - while (low <= high) { - mid = (low + high) / 2; - if ((cmp=strcmp(tname, sptr[mid].rangename)) == 0) - return (sptr[mid].func); - if (cmp < 0) - high = mid - 1; - else - low = mid + 1; - } - return (NULL); -} - -/** - * xmlUCSIsAegeanNumbers: - * @code: UCS code point - * - * Check whether the character is part of AegeanNumbers UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsAegeanNumbers(int code) { - return(((code >= 0x10100) && (code <= 0x1013F))); -} - -/** - * xmlUCSIsAlphabeticPresentationForms: - * @code: UCS code point - * - * Check whether the character is part of AlphabeticPresentationForms UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsAlphabeticPresentationForms(int code) { - return(((code >= 0xFB00) && (code <= 0xFB4F))); -} - -/** - * xmlUCSIsArabic: - * @code: UCS code point - * - * Check whether the character is part of Arabic UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsArabic(int code) { - return(((code >= 0x0600) && (code <= 0x06FF))); -} - -/** - * xmlUCSIsArabicPresentationFormsA: - * @code: UCS code point - * - * Check whether the character is part of ArabicPresentationForms-A UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsArabicPresentationFormsA(int code) { - return(((code >= 0xFB50) && (code <= 0xFDFF))); -} - -/** - * xmlUCSIsArabicPresentationFormsB: - * @code: UCS code point - * - * Check whether the character is part of ArabicPresentationForms-B UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsArabicPresentationFormsB(int code) { - return(((code >= 0xFE70) && (code <= 0xFEFF))); -} - -/** - * xmlUCSIsArmenian: - * @code: UCS code point - * - * Check whether the character is part of Armenian UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsArmenian(int code) { - return(((code >= 0x0530) && (code <= 0x058F))); -} - -/** - * xmlUCSIsArrows: - * @code: UCS code point - * - * Check whether the character is part of Arrows UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsArrows(int code) { - return(((code >= 0x2190) && (code <= 0x21FF))); -} - -/** - * xmlUCSIsBasicLatin: - * @code: UCS code point - * - * Check whether the character is part of BasicLatin UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsBasicLatin(int code) { - return(((code >= 0x0000) && (code <= 0x007F))); -} - -/** - * xmlUCSIsBengali: - * @code: UCS code point - * - * Check whether the character is part of Bengali UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsBengali(int code) { - return(((code >= 0x0980) && (code <= 0x09FF))); -} - -/** - * xmlUCSIsBlockElements: - * @code: UCS code point - * - * Check whether the character is part of BlockElements UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsBlockElements(int code) { - return(((code >= 0x2580) && (code <= 0x259F))); -} - -/** - * xmlUCSIsBopomofo: - * @code: UCS code point - * - * Check whether the character is part of Bopomofo UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsBopomofo(int code) { - return(((code >= 0x3100) && (code <= 0x312F))); -} - -/** - * xmlUCSIsBopomofoExtended: - * @code: UCS code point - * - * Check whether the character is part of BopomofoExtended UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsBopomofoExtended(int code) { - return(((code >= 0x31A0) && (code <= 0x31BF))); -} - -/** - * xmlUCSIsBoxDrawing: - * @code: UCS code point - * - * Check whether the character is part of BoxDrawing UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsBoxDrawing(int code) { - return(((code >= 0x2500) && (code <= 0x257F))); -} - -/** - * xmlUCSIsBraillePatterns: - * @code: UCS code point - * - * Check whether the character is part of BraillePatterns UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsBraillePatterns(int code) { - return(((code >= 0x2800) && (code <= 0x28FF))); -} - -/** - * xmlUCSIsBuhid: - * @code: UCS code point - * - * Check whether the character is part of Buhid UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsBuhid(int code) { - return(((code >= 0x1740) && (code <= 0x175F))); -} - -/** - * xmlUCSIsByzantineMusicalSymbols: - * @code: UCS code point - * - * Check whether the character is part of ByzantineMusicalSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsByzantineMusicalSymbols(int code) { - return(((code >= 0x1D000) && (code <= 0x1D0FF))); -} - -/** - * xmlUCSIsCJKCompatibility: - * @code: UCS code point - * - * Check whether the character is part of CJKCompatibility UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKCompatibility(int code) { - return(((code >= 0x3300) && (code <= 0x33FF))); -} - -/** - * xmlUCSIsCJKCompatibilityForms: - * @code: UCS code point - * - * Check whether the character is part of CJKCompatibilityForms UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKCompatibilityForms(int code) { - return(((code >= 0xFE30) && (code <= 0xFE4F))); -} - -/** - * xmlUCSIsCJKCompatibilityIdeographs: - * @code: UCS code point - * - * Check whether the character is part of CJKCompatibilityIdeographs UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKCompatibilityIdeographs(int code) { - return(((code >= 0xF900) && (code <= 0xFAFF))); -} - -/** - * xmlUCSIsCJKCompatibilityIdeographsSupplement: - * @code: UCS code point - * - * Check whether the character is part of CJKCompatibilityIdeographsSupplement UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKCompatibilityIdeographsSupplement(int code) { - return(((code >= 0x2F800) && (code <= 0x2FA1F))); -} - -/** - * xmlUCSIsCJKRadicalsSupplement: - * @code: UCS code point - * - * Check whether the character is part of CJKRadicalsSupplement UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKRadicalsSupplement(int code) { - return(((code >= 0x2E80) && (code <= 0x2EFF))); -} - -/** - * xmlUCSIsCJKSymbolsandPunctuation: - * @code: UCS code point - * - * Check whether the character is part of CJKSymbolsandPunctuation UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKSymbolsandPunctuation(int code) { - return(((code >= 0x3000) && (code <= 0x303F))); -} - -/** - * xmlUCSIsCJKUnifiedIdeographs: - * @code: UCS code point - * - * Check whether the character is part of CJKUnifiedIdeographs UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKUnifiedIdeographs(int code) { - return(((code >= 0x4E00) && (code <= 0x9FFF))); -} - -/** - * xmlUCSIsCJKUnifiedIdeographsExtensionA: - * @code: UCS code point - * - * Check whether the character is part of CJKUnifiedIdeographsExtensionA UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKUnifiedIdeographsExtensionA(int code) { - return(((code >= 0x3400) && (code <= 0x4DBF))); -} - -/** - * xmlUCSIsCJKUnifiedIdeographsExtensionB: - * @code: UCS code point - * - * Check whether the character is part of CJKUnifiedIdeographsExtensionB UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCJKUnifiedIdeographsExtensionB(int code) { - return(((code >= 0x20000) && (code <= 0x2A6DF))); -} - -/** - * xmlUCSIsCherokee: - * @code: UCS code point - * - * Check whether the character is part of Cherokee UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCherokee(int code) { - return(((code >= 0x13A0) && (code <= 0x13FF))); -} - -/** - * xmlUCSIsCombiningDiacriticalMarks: - * @code: UCS code point - * - * Check whether the character is part of CombiningDiacriticalMarks UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCombiningDiacriticalMarks(int code) { - return(((code >= 0x0300) && (code <= 0x036F))); -} - -/** - * xmlUCSIsCombiningDiacriticalMarksforSymbols: - * @code: UCS code point - * - * Check whether the character is part of CombiningDiacriticalMarksforSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCombiningDiacriticalMarksforSymbols(int code) { - return(((code >= 0x20D0) && (code <= 0x20FF))); -} - -/** - * xmlUCSIsCombiningHalfMarks: - * @code: UCS code point - * - * Check whether the character is part of CombiningHalfMarks UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCombiningHalfMarks(int code) { - return(((code >= 0xFE20) && (code <= 0xFE2F))); -} - -/** - * xmlUCSIsCombiningMarksforSymbols: - * @code: UCS code point - * - * Check whether the character is part of CombiningMarksforSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCombiningMarksforSymbols(int code) { - return(((code >= 0x20D0) && (code <= 0x20FF))); -} - -/** - * xmlUCSIsControlPictures: - * @code: UCS code point - * - * Check whether the character is part of ControlPictures UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsControlPictures(int code) { - return(((code >= 0x2400) && (code <= 0x243F))); -} - -/** - * xmlUCSIsCurrencySymbols: - * @code: UCS code point - * - * Check whether the character is part of CurrencySymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCurrencySymbols(int code) { - return(((code >= 0x20A0) && (code <= 0x20CF))); -} - -/** - * xmlUCSIsCypriotSyllabary: - * @code: UCS code point - * - * Check whether the character is part of CypriotSyllabary UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCypriotSyllabary(int code) { - return(((code >= 0x10800) && (code <= 0x1083F))); -} - -/** - * xmlUCSIsCyrillic: - * @code: UCS code point - * - * Check whether the character is part of Cyrillic UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCyrillic(int code) { - return(((code >= 0x0400) && (code <= 0x04FF))); -} - -/** - * xmlUCSIsCyrillicSupplement: - * @code: UCS code point - * - * Check whether the character is part of CyrillicSupplement UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCyrillicSupplement(int code) { - return(((code >= 0x0500) && (code <= 0x052F))); -} - -/** - * xmlUCSIsDeseret: - * @code: UCS code point - * - * Check whether the character is part of Deseret UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsDeseret(int code) { - return(((code >= 0x10400) && (code <= 0x1044F))); -} - -/** - * xmlUCSIsDevanagari: - * @code: UCS code point - * - * Check whether the character is part of Devanagari UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsDevanagari(int code) { - return(((code >= 0x0900) && (code <= 0x097F))); -} - -/** - * xmlUCSIsDingbats: - * @code: UCS code point - * - * Check whether the character is part of Dingbats UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsDingbats(int code) { - return(((code >= 0x2700) && (code <= 0x27BF))); -} - -/** - * xmlUCSIsEnclosedAlphanumerics: - * @code: UCS code point - * - * Check whether the character is part of EnclosedAlphanumerics UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsEnclosedAlphanumerics(int code) { - return(((code >= 0x2460) && (code <= 0x24FF))); -} - -/** - * xmlUCSIsEnclosedCJKLettersandMonths: - * @code: UCS code point - * - * Check whether the character is part of EnclosedCJKLettersandMonths UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsEnclosedCJKLettersandMonths(int code) { - return(((code >= 0x3200) && (code <= 0x32FF))); -} - -/** - * xmlUCSIsEthiopic: - * @code: UCS code point - * - * Check whether the character is part of Ethiopic UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsEthiopic(int code) { - return(((code >= 0x1200) && (code <= 0x137F))); -} - -/** - * xmlUCSIsGeneralPunctuation: - * @code: UCS code point - * - * Check whether the character is part of GeneralPunctuation UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGeneralPunctuation(int code) { - return(((code >= 0x2000) && (code <= 0x206F))); -} - -/** - * xmlUCSIsGeometricShapes: - * @code: UCS code point - * - * Check whether the character is part of GeometricShapes UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGeometricShapes(int code) { - return(((code >= 0x25A0) && (code <= 0x25FF))); -} - -/** - * xmlUCSIsGeorgian: - * @code: UCS code point - * - * Check whether the character is part of Georgian UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGeorgian(int code) { - return(((code >= 0x10A0) && (code <= 0x10FF))); -} - -/** - * xmlUCSIsGothic: - * @code: UCS code point - * - * Check whether the character is part of Gothic UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGothic(int code) { - return(((code >= 0x10330) && (code <= 0x1034F))); -} - -/** - * xmlUCSIsGreek: - * @code: UCS code point - * - * Check whether the character is part of Greek UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGreek(int code) { - return(((code >= 0x0370) && (code <= 0x03FF))); -} - -/** - * xmlUCSIsGreekExtended: - * @code: UCS code point - * - * Check whether the character is part of GreekExtended UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGreekExtended(int code) { - return(((code >= 0x1F00) && (code <= 0x1FFF))); -} - -/** - * xmlUCSIsGreekandCoptic: - * @code: UCS code point - * - * Check whether the character is part of GreekandCoptic UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGreekandCoptic(int code) { - return(((code >= 0x0370) && (code <= 0x03FF))); -} - -/** - * xmlUCSIsGujarati: - * @code: UCS code point - * - * Check whether the character is part of Gujarati UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGujarati(int code) { - return(((code >= 0x0A80) && (code <= 0x0AFF))); -} - -/** - * xmlUCSIsGurmukhi: - * @code: UCS code point - * - * Check whether the character is part of Gurmukhi UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsGurmukhi(int code) { - return(((code >= 0x0A00) && (code <= 0x0A7F))); -} - -/** - * xmlUCSIsHalfwidthandFullwidthForms: - * @code: UCS code point - * - * Check whether the character is part of HalfwidthandFullwidthForms UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHalfwidthandFullwidthForms(int code) { - return(((code >= 0xFF00) && (code <= 0xFFEF))); -} - -/** - * xmlUCSIsHangulCompatibilityJamo: - * @code: UCS code point - * - * Check whether the character is part of HangulCompatibilityJamo UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHangulCompatibilityJamo(int code) { - return(((code >= 0x3130) && (code <= 0x318F))); -} - -/** - * xmlUCSIsHangulJamo: - * @code: UCS code point - * - * Check whether the character is part of HangulJamo UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHangulJamo(int code) { - return(((code >= 0x1100) && (code <= 0x11FF))); -} - -/** - * xmlUCSIsHangulSyllables: - * @code: UCS code point - * - * Check whether the character is part of HangulSyllables UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHangulSyllables(int code) { - return(((code >= 0xAC00) && (code <= 0xD7AF))); -} - -/** - * xmlUCSIsHanunoo: - * @code: UCS code point - * - * Check whether the character is part of Hanunoo UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHanunoo(int code) { - return(((code >= 0x1720) && (code <= 0x173F))); -} - -/** - * xmlUCSIsHebrew: - * @code: UCS code point - * - * Check whether the character is part of Hebrew UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHebrew(int code) { - return(((code >= 0x0590) && (code <= 0x05FF))); -} - -/** - * xmlUCSIsHighPrivateUseSurrogates: - * @code: UCS code point - * - * Check whether the character is part of HighPrivateUseSurrogates UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHighPrivateUseSurrogates(int code) { - return(((code >= 0xDB80) && (code <= 0xDBFF))); -} - -/** - * xmlUCSIsHighSurrogates: - * @code: UCS code point - * - * Check whether the character is part of HighSurrogates UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHighSurrogates(int code) { - return(((code >= 0xD800) && (code <= 0xDB7F))); -} - -/** - * xmlUCSIsHiragana: - * @code: UCS code point - * - * Check whether the character is part of Hiragana UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsHiragana(int code) { - return(((code >= 0x3040) && (code <= 0x309F))); -} - -/** - * xmlUCSIsIPAExtensions: - * @code: UCS code point - * - * Check whether the character is part of IPAExtensions UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsIPAExtensions(int code) { - return(((code >= 0x0250) && (code <= 0x02AF))); -} - -/** - * xmlUCSIsIdeographicDescriptionCharacters: - * @code: UCS code point - * - * Check whether the character is part of IdeographicDescriptionCharacters UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsIdeographicDescriptionCharacters(int code) { - return(((code >= 0x2FF0) && (code <= 0x2FFF))); -} - -/** - * xmlUCSIsKanbun: - * @code: UCS code point - * - * Check whether the character is part of Kanbun UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsKanbun(int code) { - return(((code >= 0x3190) && (code <= 0x319F))); -} - -/** - * xmlUCSIsKangxiRadicals: - * @code: UCS code point - * - * Check whether the character is part of KangxiRadicals UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsKangxiRadicals(int code) { - return(((code >= 0x2F00) && (code <= 0x2FDF))); -} - -/** - * xmlUCSIsKannada: - * @code: UCS code point - * - * Check whether the character is part of Kannada UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsKannada(int code) { - return(((code >= 0x0C80) && (code <= 0x0CFF))); -} - -/** - * xmlUCSIsKatakana: - * @code: UCS code point - * - * Check whether the character is part of Katakana UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsKatakana(int code) { - return(((code >= 0x30A0) && (code <= 0x30FF))); -} - -/** - * xmlUCSIsKatakanaPhoneticExtensions: - * @code: UCS code point - * - * Check whether the character is part of KatakanaPhoneticExtensions UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsKatakanaPhoneticExtensions(int code) { - return(((code >= 0x31F0) && (code <= 0x31FF))); -} - -/** - * xmlUCSIsKhmer: - * @code: UCS code point - * - * Check whether the character is part of Khmer UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsKhmer(int code) { - return(((code >= 0x1780) && (code <= 0x17FF))); -} - -/** - * xmlUCSIsKhmerSymbols: - * @code: UCS code point - * - * Check whether the character is part of KhmerSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsKhmerSymbols(int code) { - return(((code >= 0x19E0) && (code <= 0x19FF))); -} - -/** - * xmlUCSIsLao: - * @code: UCS code point - * - * Check whether the character is part of Lao UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLao(int code) { - return(((code >= 0x0E80) && (code <= 0x0EFF))); -} - -/** - * xmlUCSIsLatin1Supplement: - * @code: UCS code point - * - * Check whether the character is part of Latin-1Supplement UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLatin1Supplement(int code) { - return(((code >= 0x0080) && (code <= 0x00FF))); -} - -/** - * xmlUCSIsLatinExtendedA: - * @code: UCS code point - * - * Check whether the character is part of LatinExtended-A UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLatinExtendedA(int code) { - return(((code >= 0x0100) && (code <= 0x017F))); -} - -/** - * xmlUCSIsLatinExtendedB: - * @code: UCS code point - * - * Check whether the character is part of LatinExtended-B UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLatinExtendedB(int code) { - return(((code >= 0x0180) && (code <= 0x024F))); -} - -/** - * xmlUCSIsLatinExtendedAdditional: - * @code: UCS code point - * - * Check whether the character is part of LatinExtendedAdditional UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLatinExtendedAdditional(int code) { - return(((code >= 0x1E00) && (code <= 0x1EFF))); -} - -/** - * xmlUCSIsLetterlikeSymbols: - * @code: UCS code point - * - * Check whether the character is part of LetterlikeSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLetterlikeSymbols(int code) { - return(((code >= 0x2100) && (code <= 0x214F))); -} - -/** - * xmlUCSIsLimbu: - * @code: UCS code point - * - * Check whether the character is part of Limbu UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLimbu(int code) { - return(((code >= 0x1900) && (code <= 0x194F))); -} - -/** - * xmlUCSIsLinearBIdeograms: - * @code: UCS code point - * - * Check whether the character is part of LinearBIdeograms UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLinearBIdeograms(int code) { - return(((code >= 0x10080) && (code <= 0x100FF))); -} - -/** - * xmlUCSIsLinearBSyllabary: - * @code: UCS code point - * - * Check whether the character is part of LinearBSyllabary UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLinearBSyllabary(int code) { - return(((code >= 0x10000) && (code <= 0x1007F))); -} - -/** - * xmlUCSIsLowSurrogates: - * @code: UCS code point - * - * Check whether the character is part of LowSurrogates UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsLowSurrogates(int code) { - return(((code >= 0xDC00) && (code <= 0xDFFF))); -} - -/** - * xmlUCSIsMalayalam: - * @code: UCS code point - * - * Check whether the character is part of Malayalam UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMalayalam(int code) { - return(((code >= 0x0D00) && (code <= 0x0D7F))); -} - -/** - * xmlUCSIsMathematicalAlphanumericSymbols: - * @code: UCS code point - * - * Check whether the character is part of MathematicalAlphanumericSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMathematicalAlphanumericSymbols(int code) { - return(((code >= 0x1D400) && (code <= 0x1D7FF))); -} - -/** - * xmlUCSIsMathematicalOperators: - * @code: UCS code point - * - * Check whether the character is part of MathematicalOperators UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMathematicalOperators(int code) { - return(((code >= 0x2200) && (code <= 0x22FF))); -} - -/** - * xmlUCSIsMiscellaneousMathematicalSymbolsA: - * @code: UCS code point - * - * Check whether the character is part of MiscellaneousMathematicalSymbols-A UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMiscellaneousMathematicalSymbolsA(int code) { - return(((code >= 0x27C0) && (code <= 0x27EF))); -} - -/** - * xmlUCSIsMiscellaneousMathematicalSymbolsB: - * @code: UCS code point - * - * Check whether the character is part of MiscellaneousMathematicalSymbols-B UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMiscellaneousMathematicalSymbolsB(int code) { - return(((code >= 0x2980) && (code <= 0x29FF))); -} - -/** - * xmlUCSIsMiscellaneousSymbols: - * @code: UCS code point - * - * Check whether the character is part of MiscellaneousSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMiscellaneousSymbols(int code) { - return(((code >= 0x2600) && (code <= 0x26FF))); -} - -/** - * xmlUCSIsMiscellaneousSymbolsandArrows: - * @code: UCS code point - * - * Check whether the character is part of MiscellaneousSymbolsandArrows UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMiscellaneousSymbolsandArrows(int code) { - return(((code >= 0x2B00) && (code <= 0x2BFF))); -} - -/** - * xmlUCSIsMiscellaneousTechnical: - * @code: UCS code point - * - * Check whether the character is part of MiscellaneousTechnical UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMiscellaneousTechnical(int code) { - return(((code >= 0x2300) && (code <= 0x23FF))); -} - -/** - * xmlUCSIsMongolian: - * @code: UCS code point - * - * Check whether the character is part of Mongolian UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMongolian(int code) { - return(((code >= 0x1800) && (code <= 0x18AF))); -} - -/** - * xmlUCSIsMusicalSymbols: - * @code: UCS code point - * - * Check whether the character is part of MusicalSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMusicalSymbols(int code) { - return(((code >= 0x1D100) && (code <= 0x1D1FF))); -} - -/** - * xmlUCSIsMyanmar: - * @code: UCS code point - * - * Check whether the character is part of Myanmar UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsMyanmar(int code) { - return(((code >= 0x1000) && (code <= 0x109F))); -} - -/** - * xmlUCSIsNumberForms: - * @code: UCS code point - * - * Check whether the character is part of NumberForms UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsNumberForms(int code) { - return(((code >= 0x2150) && (code <= 0x218F))); -} - -/** - * xmlUCSIsOgham: - * @code: UCS code point - * - * Check whether the character is part of Ogham UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsOgham(int code) { - return(((code >= 0x1680) && (code <= 0x169F))); -} - -/** - * xmlUCSIsOldItalic: - * @code: UCS code point - * - * Check whether the character is part of OldItalic UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsOldItalic(int code) { - return(((code >= 0x10300) && (code <= 0x1032F))); -} - -/** - * xmlUCSIsOpticalCharacterRecognition: - * @code: UCS code point - * - * Check whether the character is part of OpticalCharacterRecognition UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsOpticalCharacterRecognition(int code) { - return(((code >= 0x2440) && (code <= 0x245F))); -} - -/** - * xmlUCSIsOriya: - * @code: UCS code point - * - * Check whether the character is part of Oriya UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsOriya(int code) { - return(((code >= 0x0B00) && (code <= 0x0B7F))); -} - -/** - * xmlUCSIsOsmanya: - * @code: UCS code point - * - * Check whether the character is part of Osmanya UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsOsmanya(int code) { - return(((code >= 0x10480) && (code <= 0x104AF))); -} - -/** - * xmlUCSIsPhoneticExtensions: - * @code: UCS code point - * - * Check whether the character is part of PhoneticExtensions UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsPhoneticExtensions(int code) { - return(((code >= 0x1D00) && (code <= 0x1D7F))); -} - -/** - * xmlUCSIsPrivateUse: - * @code: UCS code point - * - * Check whether the character is part of PrivateUse UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsPrivateUse(int code) { - return(((code >= 0xE000) && (code <= 0xF8FF)) || - ((code >= 0xF0000) && (code <= 0xFFFFF)) || - ((code >= 0x100000) && (code <= 0x10FFFF))); -} - -/** - * xmlUCSIsPrivateUseArea: - * @code: UCS code point - * - * Check whether the character is part of PrivateUseArea UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsPrivateUseArea(int code) { - return(((code >= 0xE000) && (code <= 0xF8FF))); -} - -/** - * xmlUCSIsRunic: - * @code: UCS code point - * - * Check whether the character is part of Runic UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsRunic(int code) { - return(((code >= 0x16A0) && (code <= 0x16FF))); -} - -/** - * xmlUCSIsShavian: - * @code: UCS code point - * - * Check whether the character is part of Shavian UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsShavian(int code) { - return(((code >= 0x10450) && (code <= 0x1047F))); -} - -/** - * xmlUCSIsSinhala: - * @code: UCS code point - * - * Check whether the character is part of Sinhala UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSinhala(int code) { - return(((code >= 0x0D80) && (code <= 0x0DFF))); -} - -/** - * xmlUCSIsSmallFormVariants: - * @code: UCS code point - * - * Check whether the character is part of SmallFormVariants UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSmallFormVariants(int code) { - return(((code >= 0xFE50) && (code <= 0xFE6F))); -} - -/** - * xmlUCSIsSpacingModifierLetters: - * @code: UCS code point - * - * Check whether the character is part of SpacingModifierLetters UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSpacingModifierLetters(int code) { - return(((code >= 0x02B0) && (code <= 0x02FF))); -} - -/** - * xmlUCSIsSpecials: - * @code: UCS code point - * - * Check whether the character is part of Specials UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSpecials(int code) { - return(((code >= 0xFFF0) && (code <= 0xFFFF))); -} - -/** - * xmlUCSIsSuperscriptsandSubscripts: - * @code: UCS code point - * - * Check whether the character is part of SuperscriptsandSubscripts UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSuperscriptsandSubscripts(int code) { - return(((code >= 0x2070) && (code <= 0x209F))); -} - -/** - * xmlUCSIsSupplementalArrowsA: - * @code: UCS code point - * - * Check whether the character is part of SupplementalArrows-A UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSupplementalArrowsA(int code) { - return(((code >= 0x27F0) && (code <= 0x27FF))); -} - -/** - * xmlUCSIsSupplementalArrowsB: - * @code: UCS code point - * - * Check whether the character is part of SupplementalArrows-B UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSupplementalArrowsB(int code) { - return(((code >= 0x2900) && (code <= 0x297F))); -} - -/** - * xmlUCSIsSupplementalMathematicalOperators: - * @code: UCS code point - * - * Check whether the character is part of SupplementalMathematicalOperators UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSupplementalMathematicalOperators(int code) { - return(((code >= 0x2A00) && (code <= 0x2AFF))); -} - -/** - * xmlUCSIsSupplementaryPrivateUseAreaA: - * @code: UCS code point - * - * Check whether the character is part of SupplementaryPrivateUseArea-A UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSupplementaryPrivateUseAreaA(int code) { - return(((code >= 0xF0000) && (code <= 0xFFFFF))); -} - -/** - * xmlUCSIsSupplementaryPrivateUseAreaB: - * @code: UCS code point - * - * Check whether the character is part of SupplementaryPrivateUseArea-B UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSupplementaryPrivateUseAreaB(int code) { - return(((code >= 0x100000) && (code <= 0x10FFFF))); -} - -/** - * xmlUCSIsSyriac: - * @code: UCS code point - * - * Check whether the character is part of Syriac UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsSyriac(int code) { - return(((code >= 0x0700) && (code <= 0x074F))); -} - -/** - * xmlUCSIsTagalog: - * @code: UCS code point - * - * Check whether the character is part of Tagalog UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsTagalog(int code) { - return(((code >= 0x1700) && (code <= 0x171F))); -} - -/** - * xmlUCSIsTagbanwa: - * @code: UCS code point - * - * Check whether the character is part of Tagbanwa UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsTagbanwa(int code) { - return(((code >= 0x1760) && (code <= 0x177F))); -} - -/** - * xmlUCSIsTags: - * @code: UCS code point - * - * Check whether the character is part of Tags UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsTags(int code) { - return(((code >= 0xE0000) && (code <= 0xE007F))); -} - -/** - * xmlUCSIsTaiLe: - * @code: UCS code point - * - * Check whether the character is part of TaiLe UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsTaiLe(int code) { - return(((code >= 0x1950) && (code <= 0x197F))); -} - -/** - * xmlUCSIsTaiXuanJingSymbols: - * @code: UCS code point - * - * Check whether the character is part of TaiXuanJingSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsTaiXuanJingSymbols(int code) { - return(((code >= 0x1D300) && (code <= 0x1D35F))); -} - -/** - * xmlUCSIsTamil: - * @code: UCS code point - * - * Check whether the character is part of Tamil UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsTamil(int code) { - return(((code >= 0x0B80) && (code <= 0x0BFF))); -} - -/** - * xmlUCSIsTelugu: - * @code: UCS code point - * - * Check whether the character is part of Telugu UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsTelugu(int code) { - return(((code >= 0x0C00) && (code <= 0x0C7F))); -} - -/** - * xmlUCSIsThaana: - * @code: UCS code point - * - * Check whether the character is part of Thaana UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsThaana(int code) { - return(((code >= 0x0780) && (code <= 0x07BF))); -} - -/** - * xmlUCSIsThai: - * @code: UCS code point - * - * Check whether the character is part of Thai UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsThai(int code) { - return(((code >= 0x0E00) && (code <= 0x0E7F))); -} - -/** - * xmlUCSIsTibetan: - * @code: UCS code point - * - * Check whether the character is part of Tibetan UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsTibetan(int code) { - return(((code >= 0x0F00) && (code <= 0x0FFF))); -} - -/** - * xmlUCSIsUgaritic: - * @code: UCS code point - * - * Check whether the character is part of Ugaritic UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsUgaritic(int code) { - return(((code >= 0x10380) && (code <= 0x1039F))); -} - -/** - * xmlUCSIsUnifiedCanadianAboriginalSyllabics: - * @code: UCS code point - * - * Check whether the character is part of UnifiedCanadianAboriginalSyllabics UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsUnifiedCanadianAboriginalSyllabics(int code) { - return(((code >= 0x1400) && (code <= 0x167F))); -} - -/** - * xmlUCSIsVariationSelectors: - * @code: UCS code point - * - * Check whether the character is part of VariationSelectors UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsVariationSelectors(int code) { - return(((code >= 0xFE00) && (code <= 0xFE0F))); -} - -/** - * xmlUCSIsVariationSelectorsSupplement: - * @code: UCS code point - * - * Check whether the character is part of VariationSelectorsSupplement UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsVariationSelectorsSupplement(int code) { - return(((code >= 0xE0100) && (code <= 0xE01EF))); -} - -/** - * xmlUCSIsYiRadicals: - * @code: UCS code point - * - * Check whether the character is part of YiRadicals UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsYiRadicals(int code) { - return(((code >= 0xA490) && (code <= 0xA4CF))); -} - -/** - * xmlUCSIsYiSyllables: - * @code: UCS code point - * - * Check whether the character is part of YiSyllables UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsYiSyllables(int code) { - return(((code >= 0xA000) && (code <= 0xA48F))); -} - -/** - * xmlUCSIsYijingHexagramSymbols: - * @code: UCS code point - * - * Check whether the character is part of YijingHexagramSymbols UCS Block - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsYijingHexagramSymbols(int code) { - return(((code >= 0x4DC0) && (code <= 0x4DFF))); -} - -/** - * xmlUCSIsBlock: - * @code: UCS code point - * @block: UCS block name - * - * Check whether the character is part of the UCS Block - * - * Returns 1 if true, 0 if false and -1 on unknown block - */ -int -xmlUCSIsBlock(int code, const char *block) { - xmlIntFunc *func; - - func = xmlUnicodeLookup(&xmlUnicodeBlockTbl, block); - if (func == NULL) - return (-1); - return (func(code)); -} - -/** - * xmlUCSIsCatC: - * @code: UCS code point - * - * Check whether the character is part of C UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatC(int code) { - return(xmlCharInRange((unsigned int)code, &xmlCG)); -} - -/** - * xmlUCSIsCatCc: - * @code: UCS code point - * - * Check whether the character is part of Cc UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatCc(int code) { - return(((code >= 0x0) && (code <= 0x1f)) || - ((code >= 0x7f) && (code <= 0x9f))); -} - -/** - * xmlUCSIsCatCf: - * @code: UCS code point - * - * Check whether the character is part of Cf UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatCf(int code) { - return(xmlCharInRange((unsigned int)code, &xmlCfG)); -} - -/** - * xmlUCSIsCatCo: - * @code: UCS code point - * - * Check whether the character is part of Co UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatCo(int code) { - return((code == 0xe000) || - (code == 0xf8ff) || - (code == 0xf0000) || - (code == 0xffffd) || - (code == 0x100000) || - (code == 0x10fffd)); -} - -/** - * xmlUCSIsCatCs: - * @code: UCS code point - * - * Check whether the character is part of Cs UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatCs(int code) { - return((code == 0xd800) || - ((code >= 0xdb7f) && (code <= 0xdb80)) || - ((code >= 0xdbff) && (code <= 0xdc00)) || - (code == 0xdfff)); -} - -/** - * xmlUCSIsCatL: - * @code: UCS code point - * - * Check whether the character is part of L UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatL(int code) { - return(xmlCharInRange((unsigned int)code, &xmlLG)); -} - -/** - * xmlUCSIsCatLl: - * @code: UCS code point - * - * Check whether the character is part of Ll UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatLl(int code) { - return(xmlCharInRange((unsigned int)code, &xmlLlG)); -} - -/** - * xmlUCSIsCatLm: - * @code: UCS code point - * - * Check whether the character is part of Lm UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatLm(int code) { - return(xmlCharInRange((unsigned int)code, &xmlLmG)); -} - -/** - * xmlUCSIsCatLo: - * @code: UCS code point - * - * Check whether the character is part of Lo UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatLo(int code) { - return(xmlCharInRange((unsigned int)code, &xmlLoG)); -} - -/** - * xmlUCSIsCatLt: - * @code: UCS code point - * - * Check whether the character is part of Lt UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatLt(int code) { - return(xmlCharInRange((unsigned int)code, &xmlLtG)); -} - -/** - * xmlUCSIsCatLu: - * @code: UCS code point - * - * Check whether the character is part of Lu UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatLu(int code) { - return(xmlCharInRange((unsigned int)code, &xmlLuG)); -} - -/** - * xmlUCSIsCatM: - * @code: UCS code point - * - * Check whether the character is part of M UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatM(int code) { - return(xmlCharInRange((unsigned int)code, &xmlMG)); -} - -/** - * xmlUCSIsCatMc: - * @code: UCS code point - * - * Check whether the character is part of Mc UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatMc(int code) { - return(xmlCharInRange((unsigned int)code, &xmlMcG)); -} - -/** - * xmlUCSIsCatMe: - * @code: UCS code point - * - * Check whether the character is part of Me UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatMe(int code) { - return(((code >= 0x488) && (code <= 0x489)) || - (code == 0x6de) || - ((code >= 0x20dd) && (code <= 0x20e0)) || - ((code >= 0x20e2) && (code <= 0x20e4))); -} - -/** - * xmlUCSIsCatMn: - * @code: UCS code point - * - * Check whether the character is part of Mn UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatMn(int code) { - return(xmlCharInRange((unsigned int)code, &xmlMnG)); -} - -/** - * xmlUCSIsCatN: - * @code: UCS code point - * - * Check whether the character is part of N UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatN(int code) { - return(xmlCharInRange((unsigned int)code, &xmlNG)); -} - -/** - * xmlUCSIsCatNd: - * @code: UCS code point - * - * Check whether the character is part of Nd UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatNd(int code) { - return(xmlCharInRange((unsigned int)code, &xmlNdG)); -} - -/** - * xmlUCSIsCatNl: - * @code: UCS code point - * - * Check whether the character is part of Nl UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatNl(int code) { - return(((code >= 0x16ee) && (code <= 0x16f0)) || - ((code >= 0x2160) && (code <= 0x2183)) || - (code == 0x3007) || - ((code >= 0x3021) && (code <= 0x3029)) || - ((code >= 0x3038) && (code <= 0x303a)) || - (code == 0x1034a)); -} - -/** - * xmlUCSIsCatNo: - * @code: UCS code point - * - * Check whether the character is part of No UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatNo(int code) { - return(xmlCharInRange((unsigned int)code, &xmlNoG)); -} - -/** - * xmlUCSIsCatP: - * @code: UCS code point - * - * Check whether the character is part of P UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatP(int code) { - return(xmlCharInRange((unsigned int)code, &xmlPG)); -} - -/** - * xmlUCSIsCatPc: - * @code: UCS code point - * - * Check whether the character is part of Pc UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatPc(int code) { - return((code == 0x5f) || - ((code >= 0x203f) && (code <= 0x2040)) || - (code == 0x2054) || - (code == 0x30fb) || - ((code >= 0xfe33) && (code <= 0xfe34)) || - ((code >= 0xfe4d) && (code <= 0xfe4f)) || - (code == 0xff3f) || - (code == 0xff65)); -} - -/** - * xmlUCSIsCatPd: - * @code: UCS code point - * - * Check whether the character is part of Pd UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatPd(int code) { - return(xmlCharInRange((unsigned int)code, &xmlPdG)); -} - -/** - * xmlUCSIsCatPe: - * @code: UCS code point - * - * Check whether the character is part of Pe UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatPe(int code) { - return(xmlCharInRange((unsigned int)code, &xmlPeG)); -} - -/** - * xmlUCSIsCatPf: - * @code: UCS code point - * - * Check whether the character is part of Pf UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatPf(int code) { - return((code == 0xbb) || - (code == 0x2019) || - (code == 0x201d) || - (code == 0x203a)); -} - -/** - * xmlUCSIsCatPi: - * @code: UCS code point - * - * Check whether the character is part of Pi UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatPi(int code) { - return((code == 0xab) || - (code == 0x2018) || - ((code >= 0x201b) && (code <= 0x201c)) || - (code == 0x201f) || - (code == 0x2039)); -} - -/** - * xmlUCSIsCatPo: - * @code: UCS code point - * - * Check whether the character is part of Po UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatPo(int code) { - return(xmlCharInRange((unsigned int)code, &xmlPoG)); -} - -/** - * xmlUCSIsCatPs: - * @code: UCS code point - * - * Check whether the character is part of Ps UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatPs(int code) { - return(xmlCharInRange((unsigned int)code, &xmlPsG)); -} - -/** - * xmlUCSIsCatS: - * @code: UCS code point - * - * Check whether the character is part of S UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatS(int code) { - return(xmlCharInRange((unsigned int)code, &xmlSG)); -} - -/** - * xmlUCSIsCatSc: - * @code: UCS code point - * - * Check whether the character is part of Sc UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatSc(int code) { - return(xmlCharInRange((unsigned int)code, &xmlScG)); -} - -/** - * xmlUCSIsCatSk: - * @code: UCS code point - * - * Check whether the character is part of Sk UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatSk(int code) { - return(xmlCharInRange((unsigned int)code, &xmlSkG)); -} - -/** - * xmlUCSIsCatSm: - * @code: UCS code point - * - * Check whether the character is part of Sm UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatSm(int code) { - return(xmlCharInRange((unsigned int)code, &xmlSmG)); -} - -/** - * xmlUCSIsCatSo: - * @code: UCS code point - * - * Check whether the character is part of So UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatSo(int code) { - return(xmlCharInRange((unsigned int)code, &xmlSoG)); -} - -/** - * xmlUCSIsCatZ: - * @code: UCS code point - * - * Check whether the character is part of Z UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatZ(int code) { - return(xmlCharInRange((unsigned int)code, &xmlZG)); -} - -/** - * xmlUCSIsCatZl: - * @code: UCS code point - * - * Check whether the character is part of Zl UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatZl(int code) { - return((code == 0x2028)); -} - -/** - * xmlUCSIsCatZp: - * @code: UCS code point - * - * Check whether the character is part of Zp UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatZp(int code) { - return((code == 0x2029)); -} - -/** - * xmlUCSIsCatZs: - * @code: UCS code point - * - * Check whether the character is part of Zs UCS Category - * - * Returns 1 if true 0 otherwise - */ -int -xmlUCSIsCatZs(int code) { - return((code == 0x20) || - (code == 0xa0) || - (code == 0x1680) || - (code == 0x180e) || - ((code >= 0x2000) && (code <= 0x200a)) || - (code == 0x202f) || - (code == 0x205f) || - (code == 0x3000)); -} - -/** - * xmlUCSIsCat: - * @code: UCS code point - * @cat: UCS Category name - * - * Check whether the character is part of the UCS Category - * - * Returns 1 if true, 0 if false and -1 on unknown category - */ -int -xmlUCSIsCat(int code, const char *cat) { - xmlIntFunc *func; - - func = xmlUnicodeLookup(&xmlUnicodeCatTbl, cat); - if (func == NULL) - return (-1); - return (func(code)); -} - -#define bottom_xmlunicode -#include "elfgcchack.h" -#endif /* LIBXML_UNICODE_ENABLED */ diff --git a/ThirdParty/libxml2/vtklibxml2/xmlwriter.c b/ThirdParty/libxml2/vtklibxml2/xmlwriter.c deleted file mode 100644 index 37cbdec915e..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xmlwriter.c +++ /dev/null @@ -1,4614 +0,0 @@ - -/* - * xmlwriter.c: XML text writer implementation - * - * For license and disclaimer see the license and disclaimer of - * libxml2. - * - * alfred@mickautsch.de - */ - -#define IN_LIBXML -#include <string.h> - -#include "libxml.h" -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/uri.h> -#include <libxml/HTMLtree.h> - -#ifdef LIBXML_WRITER_ENABLED - -#include <libxml/xmlwriter.h> - -#define B64LINELEN 72 -#define B64CRLF "\r\n" - -/* - * The following VA_COPY was coded following an example in - * the Samba project. It may not be sufficient for some - * esoteric implementations of va_list (i.e. it may need - * something involving a memcpy) but (hopefully) will be - * sufficient for libxml2. - */ -#ifndef VA_COPY - #ifdef HAVE_VA_COPY - #define VA_COPY(dest, src) va_copy(dest, src) - #else - #ifdef HAVE___VA_COPY - #define VA_COPY(dest,src) __va_copy(dest, src) - #else - #define VA_COPY(dest,src) (dest) = (src) - #endif - #endif -#endif - -/* - * Types are kept private - */ -typedef enum { - XML_TEXTWRITER_NONE = 0, - XML_TEXTWRITER_NAME, - XML_TEXTWRITER_ATTRIBUTE, - XML_TEXTWRITER_TEXT, - XML_TEXTWRITER_PI, - XML_TEXTWRITER_PI_TEXT, - XML_TEXTWRITER_CDATA, - XML_TEXTWRITER_DTD, - XML_TEXTWRITER_DTD_TEXT, - XML_TEXTWRITER_DTD_ELEM, - XML_TEXTWRITER_DTD_ELEM_TEXT, - XML_TEXTWRITER_DTD_ATTL, - XML_TEXTWRITER_DTD_ATTL_TEXT, - XML_TEXTWRITER_DTD_ENTY, /* entity */ - XML_TEXTWRITER_DTD_ENTY_TEXT, - XML_TEXTWRITER_DTD_PENT, /* parameter entity */ - XML_TEXTWRITER_COMMENT -} xmlTextWriterState; - -typedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry; - -struct _xmlTextWriterStackEntry { - xmlChar *name; - xmlTextWriterState state; -}; - -typedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry; -struct _xmlTextWriterNsStackEntry { - xmlChar *prefix; - xmlChar *uri; - xmlLinkPtr elem; -}; - -struct _xmlTextWriter { - xmlOutputBufferPtr out; /* output buffer */ - xmlListPtr nodes; /* element name stack */ - xmlListPtr nsstack; /* name spaces stack */ - int level; - int indent; /* enable indent */ - int doindent; /* internal indent flag */ - xmlChar *ichar; /* indent character */ - char qchar; /* character used for quoting attribute values */ - xmlParserCtxtPtr ctxt; - int no_doc_free; - xmlDocPtr doc; -}; - -static void xmlFreeTextWriterStackEntry(xmlLinkPtr lk); -static int xmlCmpTextWriterStackEntry(const void *data0, - const void *data1); -static void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk); -static int xmlCmpTextWriterNsStackEntry(const void *data0, - const void *data1); -static int xmlTextWriterWriteDocCallback(void *context, - const xmlChar * str, int len); -static int xmlTextWriterCloseDocCallback(void *context); - -static xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr); -static int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len, - const unsigned char *data); -static void xmlTextWriterStartDocumentCallback(void *ctx); -static int xmlTextWriterWriteIndent(xmlTextWriterPtr writer); -static int - xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer, - xmlTextWriterStackEntry * p); - -/** - * xmlWriterErrMsg: - * @ctxt: a writer context - * @error: the error number - * @msg: the error message - * - * Handle a writer error - */ -static void -xmlWriterErrMsg(xmlTextWriterPtr ctxt, xmlParserErrors error, - const char *msg) -{ - if (ctxt != NULL) { - __xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt, - NULL, XML_FROM_WRITER, error, XML_ERR_FATAL, - NULL, 0, NULL, NULL, NULL, 0, 0, msg); - } else { - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error, - XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, msg); - } -} - -/** - * xmlWriterErrMsgInt: - * @ctxt: a writer context - * @error: the error number - * @msg: the error message - * @val: an int - * - * Handle a writer error - */ -static void -xmlWriterErrMsgInt(xmlTextWriterPtr ctxt, xmlParserErrors error, - const char *msg, int val) -{ - if (ctxt != NULL) { - __xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt, - NULL, XML_FROM_WRITER, error, XML_ERR_FATAL, - NULL, 0, NULL, NULL, NULL, val, 0, msg, val); - } else { - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error, - XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val); - } -} - -/** - * xmlNewTextWriter: - * @out: an xmlOutputBufferPtr - * - * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr - * NOTE: the @out parameter will be deallocated when the writer is closed - * (if the call succeed.) - * - * Returns the new xmlTextWriterPtr or NULL in case of error - */ -xmlTextWriterPtr -xmlNewTextWriter(xmlOutputBufferPtr out) -{ - xmlTextWriterPtr ret; - - ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter)); - if (ret == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlNewTextWriter : out of memory!\n"); - return NULL; - } - memset(ret, 0, (size_t) sizeof(xmlTextWriter)); - - ret->nodes = xmlListCreate((xmlListDeallocator) - xmlFreeTextWriterStackEntry, - (xmlListDataCompare) - xmlCmpTextWriterStackEntry); - if (ret->nodes == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlNewTextWriter : out of memory!\n"); - xmlFree(ret); - return NULL; - } - - ret->nsstack = xmlListCreate((xmlListDeallocator) - xmlFreeTextWriterNsStackEntry, - (xmlListDataCompare) - xmlCmpTextWriterNsStackEntry); - if (ret->nsstack == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlNewTextWriter : out of memory!\n"); - xmlListDelete(ret->nodes); - xmlFree(ret); - return NULL; - } - - ret->out = out; - ret->ichar = xmlStrdup(BAD_CAST " "); - ret->qchar = '"'; - - if (!ret->ichar) { - xmlListDelete(ret->nodes); - xmlListDelete(ret->nsstack); - xmlFree(ret); - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlNewTextWriter : out of memory!\n"); - return NULL; - } - - ret->doc = xmlNewDoc(NULL); - - ret->no_doc_free = 0; - - return ret; -} - -/** - * xmlNewTextWriterFilename: - * @uri: the URI of the resource for the output - * @compression: compress the output? - * - * Create a new xmlNewTextWriter structure with @uri as output - * - * Returns the new xmlTextWriterPtr or NULL in case of error - */ -xmlTextWriterPtr -xmlNewTextWriterFilename(const char *uri, int compression) -{ - xmlTextWriterPtr ret; - xmlOutputBufferPtr out; - - out = xmlOutputBufferCreateFilename(uri, NULL, compression); - if (out == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlNewTextWriterFilename : out of memory!\n"); - return NULL; - } - - ret = xmlNewTextWriter(out); - if (ret == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlNewTextWriterFilename : out of memory!\n"); - xmlOutputBufferClose(out); - return NULL; - } - - ret->indent = 0; - ret->doindent = 0; - return ret; -} - -/** - * xmlNewTextWriterMemory: - * @buf: xmlBufferPtr - * @compression: compress the output? - * - * Create a new xmlNewTextWriter structure with @buf as output - * TODO: handle compression - * - * Returns the new xmlTextWriterPtr or NULL in case of error - */ -xmlTextWriterPtr -xmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED) -{ - xmlTextWriterPtr ret; - xmlOutputBufferPtr out; - -/*::todo handle compression */ - out = xmlOutputBufferCreateBuffer(buf, NULL); - - if (out == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlNewTextWriterMemory : out of memory!\n"); - return NULL; - } - - ret = xmlNewTextWriter(out); - if (ret == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlNewTextWriterMemory : out of memory!\n"); - xmlOutputBufferClose(out); - return NULL; - } - - return ret; -} - -/** - * xmlNewTextWriterPushParser: - * @ctxt: xmlParserCtxtPtr to hold the new XML document tree - * @compression: compress the output? - * - * Create a new xmlNewTextWriter structure with @ctxt as output - * NOTE: the @ctxt context will be freed with the resulting writer - * (if the call succeeds). - * TODO: handle compression - * - * Returns the new xmlTextWriterPtr or NULL in case of error - */ -xmlTextWriterPtr -xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt, - int compression ATTRIBUTE_UNUSED) -{ - xmlTextWriterPtr ret; - xmlOutputBufferPtr out; - - if (ctxt == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterPushParser : invalid context!\n"); - return NULL; - } - - out = xmlOutputBufferCreateIO((xmlOutputWriteCallback) - xmlTextWriterWriteDocCallback, - (xmlOutputCloseCallback) - xmlTextWriterCloseDocCallback, - (void *) ctxt, NULL); - if (out == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n"); - return NULL; - } - - ret = xmlNewTextWriter(out); - if (ret == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n"); - xmlOutputBufferClose(out); - return NULL; - } - - ret->ctxt = ctxt; - - return ret; -} - -/** - * xmlNewTextWriterDoc: - * @doc: address of a xmlDocPtr to hold the new XML document tree - * @compression: compress the output? - * - * Create a new xmlNewTextWriter structure with @*doc as output - * - * Returns the new xmlTextWriterPtr or NULL in case of error - */ -xmlTextWriterPtr -xmlNewTextWriterDoc(xmlDocPtr * doc, int compression) -{ - xmlTextWriterPtr ret; - xmlSAXHandler saxHandler; - xmlParserCtxtPtr ctxt; - - memset(&saxHandler, '\0', sizeof(saxHandler)); - xmlSAX2InitDefaultSAXHandler(&saxHandler, 1); - saxHandler.startDocument = xmlTextWriterStartDocumentCallback; - saxHandler.startElement = xmlSAX2StartElement; - saxHandler.endElement = xmlSAX2EndElement; - - ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL); - if (ctxt == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n"); - return NULL; - } - /* - * For some reason this seems to completely break if node names - * are interned. - */ - ctxt->dictNames = 0; - - ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); - if (ctxt->myDoc == NULL) { - xmlFreeParserCtxt(ctxt); - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterDoc : error at xmlNewDoc!\n"); - return NULL; - } - - ret = xmlNewTextWriterPushParser(ctxt, compression); - if (ret == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n"); - return NULL; - } - - xmlSetDocCompressMode(ctxt->myDoc, compression); - - if (doc != NULL) { - *doc = ctxt->myDoc; - ret->no_doc_free = 1; - } - - return ret; -} - -/** - * xmlNewTextWriterTree: - * @doc: xmlDocPtr - * @node: xmlNodePtr or NULL for doc->children - * @compression: compress the output? - * - * Create a new xmlNewTextWriter structure with @doc as output - * starting at @node - * - * Returns the new xmlTextWriterPtr or NULL in case of error - */ -xmlTextWriterPtr -xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression) -{ - xmlTextWriterPtr ret; - xmlSAXHandler saxHandler; - xmlParserCtxtPtr ctxt; - - if (doc == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterTree : invalid document tree!\n"); - return NULL; - } - - memset(&saxHandler, '\0', sizeof(saxHandler)); - xmlSAX2InitDefaultSAXHandler(&saxHandler, 1); - saxHandler.startDocument = xmlTextWriterStartDocumentCallback; - saxHandler.startElement = xmlSAX2StartElement; - saxHandler.endElement = xmlSAX2EndElement; - - ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL); - if (ctxt == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n"); - return NULL; - } - /* - * For some reason this seems to completely break if node names - * are interned. - */ - ctxt->dictNames = 0; - - ret = xmlNewTextWriterPushParser(ctxt, compression); - if (ret == NULL) { - xmlFreeParserCtxt(ctxt); - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n"); - return NULL; - } - - ctxt->myDoc = doc; - ctxt->node = node; - ret->no_doc_free = 1; - - xmlSetDocCompressMode(doc, compression); - - return ret; -} - -/** - * xmlFreeTextWriter: - * @writer: the xmlTextWriterPtr - * - * Deallocate all the resources associated to the writer - */ -void -xmlFreeTextWriter(xmlTextWriterPtr writer) -{ - if (writer == NULL) - return; - - if (writer->out != NULL) - xmlOutputBufferClose(writer->out); - - if (writer->nodes != NULL) - xmlListDelete(writer->nodes); - - if (writer->nsstack != NULL) - xmlListDelete(writer->nsstack); - - if (writer->ctxt != NULL) { - if ((writer->ctxt->myDoc != NULL) && (writer->no_doc_free == 0)) { - xmlFreeDoc(writer->ctxt->myDoc); - writer->ctxt->myDoc = NULL; - } - xmlFreeParserCtxt(writer->ctxt); - } - - if (writer->doc != NULL) - xmlFreeDoc(writer->doc); - - if (writer->ichar != NULL) - xmlFree(writer->ichar); - xmlFree(writer); -} - -/** - * xmlTextWriterStartDocument: - * @writer: the xmlTextWriterPtr - * @version: the xml version ("1.0") or NULL for default ("1.0") - * @encoding: the encoding or NULL for default - * @standalone: "yes" or "no" or NULL for default - * - * Start a new xml document - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version, - const char *encoding, const char *standalone) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlCharEncodingHandlerPtr encoder; - - if ((writer == NULL) || (writer->out == NULL)) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterStartDocument : invalid writer!\n"); - return -1; - } - - lk = xmlListFront(writer->nodes); - if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterStartDocument : not allowed in this context!\n"); - return -1; - } - - encoder = NULL; - if (encoding != NULL) { - encoder = xmlFindCharEncodingHandler(encoding); - if (encoder == NULL) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDocument : out of memory!\n"); - return -1; - } - } - - writer->out->encoder = encoder; - if (encoder != NULL) { - writer->out->conv = xmlBufferCreateSize(4000); - xmlCharEncOutFunc(encoder, writer->out->conv, NULL); - if ((writer->doc != NULL) && (writer->doc->encoding == NULL)) - writer->doc->encoding = xmlStrdup((xmlChar *)writer->out->encoder->name); - } else - writer->out->conv = NULL; - - sum = 0; - count = xmlOutputBufferWriteString(writer->out, "<?xml version="); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - if (version != 0) - count = xmlOutputBufferWriteString(writer->out, version); - else - count = xmlOutputBufferWriteString(writer->out, "1.0"); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - if (writer->out->encoder != 0) { - count = xmlOutputBufferWriteString(writer->out, " encoding="); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - count = - xmlOutputBufferWriteString(writer->out, - writer->out->encoder->name); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - } - - if (standalone != 0) { - count = xmlOutputBufferWriteString(writer->out, " standalone="); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, standalone); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, "?>\n"); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterEndDocument: - * @writer: the xmlTextWriterPtr - * - * End an xml document. All open elements are closed - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndDocument(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterEndDocument : invalid writer!\n"); - return -1; - } - - sum = 0; - while ((lk = xmlListFront(writer->nodes)) != NULL) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - break; - switch (p->state) { - case XML_TEXTWRITER_NAME: - case XML_TEXTWRITER_ATTRIBUTE: - case XML_TEXTWRITER_TEXT: - count = xmlTextWriterEndElement(writer); - if (count < 0) - return -1; - sum += count; - break; - case XML_TEXTWRITER_PI: - case XML_TEXTWRITER_PI_TEXT: - count = xmlTextWriterEndPI(writer); - if (count < 0) - return -1; - sum += count; - break; - case XML_TEXTWRITER_CDATA: - count = xmlTextWriterEndCDATA(writer); - if (count < 0) - return -1; - sum += count; - break; - case XML_TEXTWRITER_DTD: - case XML_TEXTWRITER_DTD_TEXT: - case XML_TEXTWRITER_DTD_ELEM: - case XML_TEXTWRITER_DTD_ELEM_TEXT: - case XML_TEXTWRITER_DTD_ATTL: - case XML_TEXTWRITER_DTD_ATTL_TEXT: - case XML_TEXTWRITER_DTD_ENTY: - case XML_TEXTWRITER_DTD_ENTY_TEXT: - case XML_TEXTWRITER_DTD_PENT: - count = xmlTextWriterEndDTD(writer); - if (count < 0) - return -1; - sum += count; - break; - case XML_TEXTWRITER_COMMENT: - count = xmlTextWriterEndComment(writer); - if (count < 0) - return -1; - sum += count; - break; - default: - break; - } - } - - if (!writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - return sum; -} - -/** - * xmlTextWriterStartComment: - * @writer: the xmlTextWriterPtr - * - * Start an xml comment. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartComment(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterStartComment : invalid writer!\n"); - return -1; - } - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_TEXT: - case XML_TEXTWRITER_NONE: - break; - case XML_TEXTWRITER_NAME: - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - if (writer->indent) { - count = - xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - p->state = XML_TEXTWRITER_TEXT; - break; - default: - return -1; - } - } - } - - p = (xmlTextWriterStackEntry *) - xmlMalloc(sizeof(xmlTextWriterStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartElement : out of memory!\n"); - return -1; - } - - p->name = NULL; - p->state = XML_TEXTWRITER_COMMENT; - - xmlListPushFront(writer->nodes, p); - - if (writer->indent) { - count = xmlTextWriterWriteIndent(writer); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, "<!--"); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterEndComment: - * @writer: the xmlTextWriterPtr - * - * End the current xml coment. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndComment(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterEndComment : invalid writer!\n"); - return -1; - } - - lk = xmlListFront(writer->nodes); - if (lk == 0) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterEndComment : not allowed in this context!\n"); - return -1; - } - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - sum = 0; - switch (p->state) { - case XML_TEXTWRITER_COMMENT: - count = xmlOutputBufferWriteString(writer->out, "-->"); - if (count < 0) - return -1; - sum += count; - break; - default: - return -1; - } - - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - - xmlListPopFront(writer->nodes); - return sum; -} - -/** - * xmlTextWriterWriteFormatComment: - * @writer: the xmlTextWriterPtr - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write an xml comment. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer, - const char *format, ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatComment(writer, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatComment: - * @writer: the xmlTextWriterPtr - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write an xml comment. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer, - const char *format, va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteVFormatComment : invalid writer!\n"); - return -1; - } - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteComment(writer, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteComment: - * @writer: the xmlTextWriterPtr - * @content: comment string - * - * Write an xml comment. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content) -{ - int count; - int sum; - - sum = 0; - count = xmlTextWriterStartComment(writer); - if (count < 0) - return -1; - sum += count; - count = xmlTextWriterWriteString(writer, content); - if (count < 0) - return -1; - sum += count; - count = xmlTextWriterEndComment(writer); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartElement: - * @writer: the xmlTextWriterPtr - * @name: element name - * - * Start an xml element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if ((writer == NULL) || (name == NULL) || (*name == '\0')) - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_PI: - case XML_TEXTWRITER_PI_TEXT: - return -1; - case XML_TEXTWRITER_NONE: - break; - case XML_TEXTWRITER_ATTRIBUTE: - count = xmlTextWriterEndAttribute(writer); - if (count < 0) - return -1; - sum += count; - /* fallthrough */ - case XML_TEXTWRITER_NAME: - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - if (writer->indent) - count = - xmlOutputBufferWriteString(writer->out, "\n"); - p->state = XML_TEXTWRITER_TEXT; - break; - default: - break; - } - } - } - - p = (xmlTextWriterStackEntry *) - xmlMalloc(sizeof(xmlTextWriterStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartElement : out of memory!\n"); - return -1; - } - - p->name = xmlStrdup(name); - if (p->name == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartElement : out of memory!\n"); - xmlFree(p); - return -1; - } - p->state = XML_TEXTWRITER_NAME; - - xmlListPushFront(writer->nodes, p); - - if (writer->indent) { - count = xmlTextWriterWriteIndent(writer); - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, "<"); - if (count < 0) - return -1; - sum += count; - count = - xmlOutputBufferWriteString(writer->out, (const char *) p->name); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartElementNS: - * @writer: the xmlTextWriterPtr - * @prefix: namespace prefix or NULL - * @name: element local name - * @namespaceURI: namespace URI or NULL - * - * Start an xml element with namespace support. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartElementNS(xmlTextWriterPtr writer, - const xmlChar * prefix, const xmlChar * name, - const xmlChar * namespaceURI) -{ - int count; - int sum; - xmlChar *buf; - - if ((writer == NULL) || (name == NULL) || (*name == '\0')) - return -1; - - buf = NULL; - if (prefix != 0) { - buf = xmlStrdup(prefix); - buf = xmlStrcat(buf, BAD_CAST ":"); - } - buf = xmlStrcat(buf, name); - - sum = 0; - count = xmlTextWriterStartElement(writer, buf); - xmlFree(buf); - if (count < 0) - return -1; - sum += count; - - if (namespaceURI != 0) { - buf = xmlStrdup(BAD_CAST "xmlns"); - if (prefix != 0) { - buf = xmlStrcat(buf, BAD_CAST ":"); - buf = xmlStrcat(buf, prefix); - } - - count = xmlTextWriterWriteAttribute(writer, buf, namespaceURI); - xmlFree(buf); - if (count < 0) - return -1; - sum += count; - } - - return sum; -} - -/** - * xmlTextWriterEndElement: - * @writer: the xmlTextWriterPtr - * - * End the current xml element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndElement(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - lk = xmlListFront(writer->nodes); - if (lk == 0) - return -1; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - sum = 0; - switch (p->state) { - case XML_TEXTWRITER_ATTRIBUTE: - count = xmlTextWriterEndAttribute(writer); - if (count < 0) - return -1; - sum += count; - /* fallthrough */ - case XML_TEXTWRITER_NAME: - if (writer->indent) /* next element needs indent */ - writer->doindent = 1; - count = xmlOutputBufferWriteString(writer->out, "/>"); - if (count < 0) - return -1; - sum += count; - break; - case XML_TEXTWRITER_TEXT: - if ((writer->indent) && (writer->doindent)) { - count = xmlTextWriterWriteIndent(writer); - sum += count; - writer->doindent = 1; - } else - writer->doindent = 1; - count = xmlOutputBufferWriteString(writer->out, "</"); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, - (const char *) p->name); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - break; - default: - return -1; - } - - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - sum += count; - } - - xmlListPopFront(writer->nodes); - return sum; -} - -/** - * xmlTextWriterFullEndElement: - * @writer: the xmlTextWriterPtr - * - * End the current xml element. Writes an end tag even if the element is empty - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterFullEndElement(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - lk = xmlListFront(writer->nodes); - if (lk == 0) - return -1; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - sum = 0; - switch (p->state) { - case XML_TEXTWRITER_ATTRIBUTE: - count = xmlTextWriterEndAttribute(writer); - if (count < 0) - return -1; - sum += count; - /* fallthrough */ - case XML_TEXTWRITER_NAME: - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - /* fallthrough */ - case XML_TEXTWRITER_TEXT: - count = xmlOutputBufferWriteString(writer->out, "</"); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, - (const char *) p->name); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - break; - default: - return -1; - } - - xmlListPopFront(writer->nodes); - return sum; -} - -/** - * xmlTextWriterWriteFormatRaw: - * @writer: the xmlTextWriterPtr - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted raw xml text. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format, - ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatRaw(writer, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatRaw: - * @writer: the xmlTextWriterPtr - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted raw xml text. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format, - va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteRaw(writer, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteRawLen: - * @writer: the xmlTextWriterPtr - * @content: text string - * @len: length of the text string - * - * Write an xml text. - * TODO: what about entities and special chars?? - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content, - int len) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteRawLen : invalid writer!\n"); - return -1; - } - - if ((content == NULL) || (len < 0)) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteRawLen : invalid content!\n"); - return -1; - } - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - count = xmlTextWriterHandleStateDependencies(writer, p); - if (count < 0) - return -1; - sum += count; - } - - if (writer->indent) - writer->doindent = 0; - - if (content != NULL) { - count = - xmlOutputBufferWrite(writer->out, len, (const char *) content); - if (count < 0) - return -1; - sum += count; - } - - return sum; -} - -/** - * xmlTextWriterWriteRaw: - * @writer: the xmlTextWriterPtr - * @content: text string - * - * Write a raw xml text. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content) -{ - return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content)); -} - -/** - * xmlTextWriterWriteFormatString: - * @writer: the xmlTextWriterPtr - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted xml text. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format, - ...) -{ - int rc; - va_list ap; - - if ((writer == NULL) || (format == NULL)) - return -1; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatString(writer, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatString: - * @writer: the xmlTextWriterPtr - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted xml text. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatString(xmlTextWriterPtr writer, - const char *format, va_list argptr) -{ - int rc; - xmlChar *buf; - - if ((writer == NULL) || (format == NULL)) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteString(writer, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteString: - * @writer: the xmlTextWriterPtr - * @content: text string - * - * Write an xml text. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - xmlChar *buf; - - if ((writer == NULL) || (content == NULL)) - return -1; - - sum = 0; - buf = (xmlChar *) content; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_NAME: - case XML_TEXTWRITER_TEXT: -#if 0 - buf = NULL; - xmlOutputBufferWriteEscape(writer->out, content, NULL); -#endif - buf = xmlEncodeSpecialChars(NULL, content); - break; - case XML_TEXTWRITER_ATTRIBUTE: - buf = NULL; - xmlAttrSerializeTxtContent(writer->out->buffer, writer->doc, - NULL, content); - break; - default: - break; - } - } - } - - if (buf != NULL) { - count = xmlTextWriterWriteRaw(writer, buf); - if (count < 0) - return -1; - sum += count; - - if (buf != content) /* buf was allocated by us, so free it */ - xmlFree(buf); - } - - return sum; -} - -/** - * xmlOutputBufferWriteBase64: - * @out: the xmlOutputBufferPtr - * @data: binary data - * @len: the number of bytes to encode - * - * Write base64 encoded data to an xmlOutputBuffer. - * Adapted from John Walker's base64.c (http://www.fourmilab.ch/). - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -static int -xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len, - const unsigned char *data) -{ - static unsigned char dtable[64] = - {'A','B','C','D','E','F','G','H','I','J','K','L','M', - 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', - 'a','b','c','d','e','f','g','h','i','j','k','l','m', - 'n','o','p','q','r','s','t','u','v','w','x','y','z', - '0','1','2','3','4','5','6','7','8','9','+','/'}; - - int i; - int linelen; - int count; - int sum; - - if ((out == NULL) || (len < 0) || (data == NULL)) - return(-1); - - linelen = 0; - sum = 0; - - i = 0; - while (1) { - unsigned char igroup[3]; - unsigned char ogroup[4]; - int c; - int n; - - igroup[0] = igroup[1] = igroup[2] = 0; - for (n = 0; n < 3 && i < len; n++, i++) { - c = data[i]; - igroup[n] = (unsigned char) c; - } - - if (n > 0) { - ogroup[0] = dtable[igroup[0] >> 2]; - ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; - ogroup[2] = - dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; - ogroup[3] = dtable[igroup[2] & 0x3F]; - - if (n < 3) { - ogroup[3] = '='; - if (n < 2) { - ogroup[2] = '='; - } - } - - if (linelen >= B64LINELEN) { - count = xmlOutputBufferWrite(out, 2, B64CRLF); - if (count == -1) - return -1; - sum += count; - linelen = 0; - } - count = xmlOutputBufferWrite(out, 4, (const char *) ogroup); - if (count == -1) - return -1; - sum += count; - - linelen += 4; - } - - if (i >= len) - break; - } - - return sum; -} - -/** - * xmlTextWriterWriteBase64: - * @writer: the xmlTextWriterPtr - * @data: binary data - * @start: the position within the data of the first byte to encode - * @len: the number of bytes to encode - * - * Write an base64 encoded xml text. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data, - int start, int len) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0)) - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - count = xmlTextWriterHandleStateDependencies(writer, p); - if (count < 0) - return -1; - sum += count; - } - } - - if (writer->indent) - writer->doindent = 0; - - count = - xmlOutputBufferWriteBase64(writer->out, len, - (unsigned char *) data + start); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlOutputBufferWriteBinHex: - * @out: the xmlOutputBufferPtr - * @data: binary data - * @len: the number of bytes to encode - * - * Write hqx encoded data to an xmlOutputBuffer. - * ::todo - * - * Returns the bytes written (may be 0 because of buffering) - * or -1 in case of error - */ -static int -xmlOutputBufferWriteBinHex(xmlOutputBufferPtr out, - int len, const unsigned char *data) -{ - int count; - int sum; - static char hex[16] = - {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; - int i; - - if ((out == NULL) || (data == NULL) || (len < 0)) { - return -1; - } - - sum = 0; - for (i = 0; i < len; i++) { - count = - xmlOutputBufferWrite(out, 1, - (const char *) &hex[data[i] >> 4]); - if (count == -1) - return -1; - sum += count; - count = - xmlOutputBufferWrite(out, 1, - (const char *) &hex[data[i] & 0xF]); - if (count == -1) - return -1; - sum += count; - } - - return sum; -} - -/** - * xmlTextWriterWriteBinHex: - * @writer: the xmlTextWriterPtr - * @data: binary data - * @start: the position within the data of the first byte to encode - * @len: the number of bytes to encode - * - * Write a BinHex encoded xml text. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data, - int start, int len) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0)) - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - count = xmlTextWriterHandleStateDependencies(writer, p); - if (count < 0) - return -1; - sum += count; - } - } - - if (writer->indent) - writer->doindent = 0; - - count = - xmlOutputBufferWriteBinHex(writer->out, len, - (unsigned char *) data + start); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartAttribute: - * @writer: the xmlTextWriterPtr - * @name: element name - * - * Start an xml attribute. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if ((writer == NULL) || (name == NULL) || (*name == '\0')) - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk == 0) - return -1; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - switch (p->state) { - case XML_TEXTWRITER_ATTRIBUTE: - count = xmlTextWriterEndAttribute(writer); - if (count < 0) - return -1; - sum += count; - /* fallthrough */ - case XML_TEXTWRITER_NAME: - count = xmlOutputBufferWriteString(writer->out, " "); - if (count < 0) - return -1; - sum += count; - count = - xmlOutputBufferWriteString(writer->out, - (const char *) name); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, "="); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - p->state = XML_TEXTWRITER_ATTRIBUTE; - break; - default: - return -1; - } - - return sum; -} - -/** - * xmlTextWriterStartAttributeNS: - * @writer: the xmlTextWriterPtr - * @prefix: namespace prefix or NULL - * @name: element local name - * @namespaceURI: namespace URI or NULL - * - * Start an xml attribute with namespace support. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartAttributeNS(xmlTextWriterPtr writer, - const xmlChar * prefix, const xmlChar * name, - const xmlChar * namespaceURI) -{ - int count; - int sum; - xmlChar *buf; - xmlTextWriterNsStackEntry *p; - - if ((writer == NULL) || (name == NULL) || (*name == '\0')) - return -1; - - buf = NULL; - if (prefix != 0) { - buf = xmlStrdup(prefix); - buf = xmlStrcat(buf, BAD_CAST ":"); - } - buf = xmlStrcat(buf, name); - - sum = 0; - count = xmlTextWriterStartAttribute(writer, buf); - xmlFree(buf); - if (count < 0) - return -1; - sum += count; - - if (namespaceURI != 0) { - buf = xmlStrdup(BAD_CAST "xmlns"); - if (prefix != 0) { - buf = xmlStrcat(buf, BAD_CAST ":"); - buf = xmlStrcat(buf, prefix); - } - - p = (xmlTextWriterNsStackEntry *) - xmlMalloc(sizeof(xmlTextWriterNsStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartAttributeNS : out of memory!\n"); - return -1; - } - - p->prefix = buf; - p->uri = xmlStrdup(namespaceURI); - if (p->uri == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartAttributeNS : out of memory!\n"); - xmlFree(p); - return -1; - } - p->elem = xmlListFront(writer->nodes); - - xmlListPushFront(writer->nsstack, p); - } - - return sum; -} - -/** - * xmlTextWriterEndAttribute: - * @writer: the xmlTextWriterPtr - * - * End the current xml element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndAttribute(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - xmlTextWriterNsStackEntry *np; - - if (writer == NULL) - return -1; - - lk = xmlListFront(writer->nodes); - if (lk == 0) { - xmlListDelete(writer->nsstack); - writer->nsstack = NULL; - return -1; - } - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) { - xmlListDelete(writer->nsstack); - writer->nsstack = NULL; - return -1; - } - - sum = 0; - switch (p->state) { - case XML_TEXTWRITER_ATTRIBUTE: - p->state = XML_TEXTWRITER_NAME; - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) { - xmlListDelete(writer->nsstack); - writer->nsstack = NULL; - return -1; - } - sum += count; - - while (!xmlListEmpty(writer->nsstack)) { - xmlChar *namespaceURI = NULL; - xmlChar *prefix = NULL; - - lk = xmlListFront(writer->nsstack); - np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk); - - if (np != 0) { - namespaceURI = xmlStrdup(np->uri); - prefix = xmlStrdup(np->prefix); - } - - xmlListPopFront(writer->nsstack); - - if (np != 0) { - count = - xmlTextWriterWriteAttribute(writer, prefix, - namespaceURI); - xmlFree(namespaceURI); - xmlFree(prefix); - - if (count < 0) { - xmlListDelete(writer->nsstack); - writer->nsstack = NULL; - return -1; - } - sum += count; - } - } - break; - - default: - xmlListClear(writer->nsstack); - return -1; - } - - return sum; -} - -/** - * xmlTextWriterWriteFormatAttribute: - * @writer: the xmlTextWriterPtr - * @name: attribute name - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted xml attribute. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer, - const xmlChar * name, const char *format, - ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatAttribute: - * @writer: the xmlTextWriterPtr - * @name: attribute name - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted xml attribute. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteAttribute(writer, name, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteAttribute: - * @writer: the xmlTextWriterPtr - * @name: attribute name - * @content: attribute content - * - * Write an xml attribute. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name, - const xmlChar * content) -{ - int count; - int sum; - - sum = 0; - count = xmlTextWriterStartAttribute(writer, name); - if (count < 0) - return -1; - sum += count; - count = xmlTextWriterWriteString(writer, content); - if (count < 0) - return -1; - sum += count; - count = xmlTextWriterEndAttribute(writer); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterWriteFormatAttributeNS: - * @writer: the xmlTextWriterPtr - * @prefix: namespace prefix - * @name: attribute local name - * @namespaceURI: namespace URI - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted xml attribute.with namespace support - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer, - const xmlChar * prefix, - const xmlChar * name, - const xmlChar * namespaceURI, - const char *format, ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name, - namespaceURI, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatAttributeNS: - * @writer: the xmlTextWriterPtr - * @prefix: namespace prefix - * @name: attribute local name - * @namespaceURI: namespace URI - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted xml attribute.with namespace support - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer, - const xmlChar * prefix, - const xmlChar * name, - const xmlChar * namespaceURI, - const char *format, va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI, - buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteAttributeNS: - * @writer: the xmlTextWriterPtr - * @prefix: namespace prefix - * @name: attribute local name - * @namespaceURI: namespace URI - * @content: attribute content - * - * Write an xml attribute. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer, - const xmlChar * prefix, const xmlChar * name, - const xmlChar * namespaceURI, - const xmlChar * content) -{ - int count; - int sum; - xmlChar *buf; - - if ((writer == NULL) || (name == NULL) || (*name == '\0')) - return -1; - - buf = NULL; - if (prefix != NULL) { - buf = xmlStrdup(prefix); - buf = xmlStrcat(buf, BAD_CAST ":"); - } - buf = xmlStrcat(buf, name); - - sum = 0; - count = xmlTextWriterWriteAttribute(writer, buf, content); - xmlFree(buf); - if (count < 0) - return -1; - sum += count; - - if (namespaceURI != NULL) { - buf = NULL; - buf = xmlStrdup(BAD_CAST "xmlns"); - if (prefix != NULL) { - buf = xmlStrcat(buf, BAD_CAST ":"); - buf = xmlStrcat(buf, prefix); - } - count = xmlTextWriterWriteAttribute(writer, buf, namespaceURI); - xmlFree(buf); - if (count < 0) - return -1; - sum += count; - } - return sum; -} - -/** - * xmlTextWriterWriteFormatElement: - * @writer: the xmlTextWriterPtr - * @name: element name - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted xml element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer, - const xmlChar * name, const char *format, - ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatElement: - * @writer: the xmlTextWriterPtr - * @name: element name - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted xml element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer, - const xmlChar * name, const char *format, - va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteElement(writer, name, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteElement: - * @writer: the xmlTextWriterPtr - * @name: element name - * @content: element content - * - * Write an xml element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name, - const xmlChar * content) -{ - int count; - int sum; - - sum = 0; - count = xmlTextWriterStartElement(writer, name); - if (count == -1) - return -1; - sum += count; - count = xmlTextWriterWriteString(writer, content); - if (count == -1) - return -1; - sum += count; - count = xmlTextWriterEndElement(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterWriteFormatElementNS: - * @writer: the xmlTextWriterPtr - * @prefix: namespace prefix - * @name: element local name - * @namespaceURI: namespace URI - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted xml element with namespace support. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer, - const xmlChar * prefix, - const xmlChar * name, - const xmlChar * namespaceURI, - const char *format, ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name, - namespaceURI, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatElementNS: - * @writer: the xmlTextWriterPtr - * @prefix: namespace prefix - * @name: element local name - * @namespaceURI: namespace URI - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted xml element with namespace support. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer, - const xmlChar * prefix, - const xmlChar * name, - const xmlChar * namespaceURI, - const char *format, va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI, - buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteElementNS: - * @writer: the xmlTextWriterPtr - * @prefix: namespace prefix - * @name: element local name - * @namespaceURI: namespace URI - * @content: element content - * - * Write an xml element with namespace support. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteElementNS(xmlTextWriterPtr writer, - const xmlChar * prefix, const xmlChar * name, - const xmlChar * namespaceURI, - const xmlChar * content) -{ - int count; - int sum; - - if ((writer == NULL) || (name == NULL) || (*name == '\0')) - return -1; - - sum = 0; - count = - xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI); - if (count < 0) - return -1; - sum += count; - count = xmlTextWriterWriteString(writer, content); - if (count == -1) - return -1; - sum += count; - count = xmlTextWriterEndElement(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartPI: - * @writer: the xmlTextWriterPtr - * @target: PI target - * - * Start an xml PI. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if ((writer == NULL) || (target == NULL) || (*target == '\0')) - return -1; - - if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n"); - return -1; - } - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_ATTRIBUTE: - count = xmlTextWriterEndAttribute(writer); - if (count < 0) - return -1; - sum += count; - /* fallthrough */ - case XML_TEXTWRITER_NAME: - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - p->state = XML_TEXTWRITER_TEXT; - break; - case XML_TEXTWRITER_NONE: - case XML_TEXTWRITER_TEXT: - case XML_TEXTWRITER_DTD: - break; - case XML_TEXTWRITER_PI: - case XML_TEXTWRITER_PI_TEXT: - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterStartPI : nested PI!\n"); - return -1; - default: - return -1; - } - } - } - - p = (xmlTextWriterStackEntry *) - xmlMalloc(sizeof(xmlTextWriterStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartPI : out of memory!\n"); - return -1; - } - - p->name = xmlStrdup(target); - if (p->name == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartPI : out of memory!\n"); - xmlFree(p); - return -1; - } - p->state = XML_TEXTWRITER_PI; - - xmlListPushFront(writer->nodes, p); - - count = xmlOutputBufferWriteString(writer->out, "<?"); - if (count < 0) - return -1; - sum += count; - count = - xmlOutputBufferWriteString(writer->out, (const char *) p->name); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterEndPI: - * @writer: the xmlTextWriterPtr - * - * End the current xml PI. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndPI(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - lk = xmlListFront(writer->nodes); - if (lk == 0) - return 0; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return 0; - - sum = 0; - switch (p->state) { - case XML_TEXTWRITER_PI: - case XML_TEXTWRITER_PI_TEXT: - count = xmlOutputBufferWriteString(writer->out, "?>"); - if (count < 0) - return -1; - sum += count; - break; - default: - return -1; - } - - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - - xmlListPopFront(writer->nodes); - return sum; -} - -/** - * xmlTextWriterWriteFormatPI: - * @writer: the xmlTextWriterPtr - * @target: PI target - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted PI. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target, - const char *format, ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatPI: - * @writer: the xmlTextWriterPtr - * @target: PI target - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted xml PI. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer, - const xmlChar * target, const char *format, - va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWritePI(writer, target, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWritePI: - * @writer: the xmlTextWriterPtr - * @target: PI target - * @content: PI content - * - * Write an xml PI. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target, - const xmlChar * content) -{ - int count; - int sum; - - sum = 0; - count = xmlTextWriterStartPI(writer, target); - if (count == -1) - return -1; - sum += count; - if (content != 0) { - count = xmlTextWriterWriteString(writer, content); - if (count == -1) - return -1; - sum += count; - } - count = xmlTextWriterEndPI(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartCDATA: - * @writer: the xmlTextWriterPtr - * - * Start an xml CDATA section. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartCDATA(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_NONE: - case XML_TEXTWRITER_PI: - case XML_TEXTWRITER_PI_TEXT: - break; - case XML_TEXTWRITER_ATTRIBUTE: - count = xmlTextWriterEndAttribute(writer); - if (count < 0) - return -1; - sum += count; - /* fallthrough */ - case XML_TEXTWRITER_NAME: - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - p->state = XML_TEXTWRITER_TEXT; - break; - case XML_TEXTWRITER_CDATA: - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n"); - return -1; - default: - return -1; - } - } - } - - p = (xmlTextWriterStackEntry *) - xmlMalloc(sizeof(xmlTextWriterStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartCDATA : out of memory!\n"); - return -1; - } - - p->name = NULL; - p->state = XML_TEXTWRITER_CDATA; - - xmlListPushFront(writer->nodes, p); - - count = xmlOutputBufferWriteString(writer->out, "<![CDATA["); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterEndCDATA: - * @writer: the xmlTextWriterPtr - * - * End an xml CDATA section. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndCDATA(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - lk = xmlListFront(writer->nodes); - if (lk == 0) - return -1; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - sum = 0; - switch (p->state) { - case XML_TEXTWRITER_CDATA: - count = xmlOutputBufferWriteString(writer->out, "]]>"); - if (count < 0) - return -1; - sum += count; - break; - default: - return -1; - } - - xmlListPopFront(writer->nodes); - return sum; -} - -/** - * xmlTextWriterWriteFormatCDATA: - * @writer: the xmlTextWriterPtr - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted xml CDATA. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format, - ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatCDATA: - * @writer: the xmlTextWriterPtr - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted xml CDATA. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format, - va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteCDATA(writer, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteCDATA: - * @writer: the xmlTextWriterPtr - * @content: CDATA content - * - * Write an xml CDATA. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content) -{ - int count; - int sum; - - sum = 0; - count = xmlTextWriterStartCDATA(writer); - if (count == -1) - return -1; - sum += count; - if (content != 0) { - count = xmlTextWriterWriteString(writer, content); - if (count == -1) - return -1; - sum += count; - } - count = xmlTextWriterEndCDATA(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartDTD: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD - * @pubid: the public identifier, which is an alternative to the system identifier - * @sysid: the system identifier, which is the URI of the DTD - * - * Start an xml DTD. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartDTD(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, const xmlChar * sysid) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL || name == NULL || *name == '\0') - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterStartDTD : DTD allowed only in prolog!\n"); - return -1; - } - - p = (xmlTextWriterStackEntry *) - xmlMalloc(sizeof(xmlTextWriterStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDTD : out of memory!\n"); - return -1; - } - - p->name = xmlStrdup(name); - if (p->name == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDTD : out of memory!\n"); - xmlFree(p); - return -1; - } - p->state = XML_TEXTWRITER_DTD; - - xmlListPushFront(writer->nodes, p); - - count = xmlOutputBufferWriteString(writer->out, "<!DOCTYPE "); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, (const char *) name); - if (count < 0) - return -1; - sum += count; - - if (pubid != 0) { - if (sysid == 0) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterStartDTD : system identifier needed!\n"); - return -1; - } - - if (writer->indent) - count = xmlOutputBufferWrite(writer->out, 1, "\n"); - else - count = xmlOutputBufferWrite(writer->out, 1, " "); - if (count < 0) - return -1; - sum += count; - - count = xmlOutputBufferWriteString(writer->out, "PUBLIC "); - if (count < 0) - return -1; - sum += count; - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - - count = - xmlOutputBufferWriteString(writer->out, (const char *) pubid); - if (count < 0) - return -1; - sum += count; - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - } - - if (sysid != 0) { - if (pubid == 0) { - if (writer->indent) - count = xmlOutputBufferWrite(writer->out, 1, "\n"); - else - count = xmlOutputBufferWrite(writer->out, 1, " "); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, "SYSTEM "); - if (count < 0) - return -1; - sum += count; - } else { - if (writer->indent) - count = xmlOutputBufferWriteString(writer->out, "\n "); - else - count = xmlOutputBufferWrite(writer->out, 1, " "); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - - count = - xmlOutputBufferWriteString(writer->out, (const char *) sysid); - if (count < 0) - return -1; - sum += count; - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - } - - return sum; -} - -/** - * xmlTextWriterEndDTD: - * @writer: the xmlTextWriterPtr - * - * End an xml DTD. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndDTD(xmlTextWriterPtr writer) -{ - int loop; - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - sum = 0; - loop = 1; - while (loop) { - lk = xmlListFront(writer->nodes); - if (lk == NULL) - break; - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - break; - switch (p->state) { - case XML_TEXTWRITER_DTD_TEXT: - count = xmlOutputBufferWriteString(writer->out, "]"); - if (count < 0) - return -1; - sum += count; - /* fallthrough */ - case XML_TEXTWRITER_DTD: - count = xmlOutputBufferWriteString(writer->out, ">"); - - if (writer->indent) { - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, "\n"); - } - - xmlListPopFront(writer->nodes); - break; - case XML_TEXTWRITER_DTD_ELEM: - case XML_TEXTWRITER_DTD_ELEM_TEXT: - count = xmlTextWriterEndDTDElement(writer); - break; - case XML_TEXTWRITER_DTD_ATTL: - case XML_TEXTWRITER_DTD_ATTL_TEXT: - count = xmlTextWriterEndDTDAttlist(writer); - break; - case XML_TEXTWRITER_DTD_ENTY: - case XML_TEXTWRITER_DTD_PENT: - case XML_TEXTWRITER_DTD_ENTY_TEXT: - count = xmlTextWriterEndDTDEntity(writer); - break; - case XML_TEXTWRITER_COMMENT: - count = xmlTextWriterEndComment(writer); - break; - default: - loop = 0; - continue; - } - - if (count < 0) - return -1; - sum += count; - } - - return sum; -} - -/** - * xmlTextWriterWriteFormatDTD: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD - * @pubid: the public identifier, which is an alternative to the system identifier - * @sysid: the system identifier, which is the URI of the DTD - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a DTD with a formatted markup declarations part. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, const char *format, ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format, - ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatDTD: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD - * @pubid: the public identifier, which is an alternative to the system identifier - * @sysid: the system identifier, which is the URI of the DTD - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a DTD with a formatted markup declarations part. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, - const char *format, va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteDTD: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD - * @pubid: the public identifier, which is an alternative to the system identifier - * @sysid: the system identifier, which is the URI of the DTD - * @subset: string content of the DTD - * - * Write a DTD. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteDTD(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, const xmlChar * subset) -{ - int count; - int sum; - - sum = 0; - count = xmlTextWriterStartDTD(writer, name, pubid, sysid); - if (count == -1) - return -1; - sum += count; - if (subset != 0) { - count = xmlTextWriterWriteString(writer, subset); - if (count == -1) - return -1; - sum += count; - } - count = xmlTextWriterEndDTD(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartDTDElement: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD element - * - * Start an xml DTD element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL || name == NULL || *name == '\0') - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk == 0) { - return -1; - } - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_DTD: - count = xmlOutputBufferWriteString(writer->out, " ["); - if (count < 0) - return -1; - sum += count; - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - p->state = XML_TEXTWRITER_DTD_TEXT; - /* fallthrough */ - case XML_TEXTWRITER_DTD_TEXT: - case XML_TEXTWRITER_NONE: - break; - default: - return -1; - } - } - - p = (xmlTextWriterStackEntry *) - xmlMalloc(sizeof(xmlTextWriterStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDTDElement : out of memory!\n"); - return -1; - } - - p->name = xmlStrdup(name); - if (p->name == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDTDElement : out of memory!\n"); - xmlFree(p); - return -1; - } - p->state = XML_TEXTWRITER_DTD_ELEM; - - xmlListPushFront(writer->nodes, p); - - if (writer->indent) { - count = xmlTextWriterWriteIndent(writer); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, "<!ELEMENT "); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, (const char *) name); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterEndDTDElement: - * @writer: the xmlTextWriterPtr - * - * End an xml DTD element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndDTDElement(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk == 0) - return -1; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - switch (p->state) { - case XML_TEXTWRITER_DTD_ELEM: - case XML_TEXTWRITER_DTD_ELEM_TEXT: - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - break; - default: - return -1; - } - - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - - xmlListPopFront(writer->nodes); - return sum; -} - -/** - * xmlTextWriterWriteFormatDTDElement: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD element - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted DTD element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatDTDElement: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD element - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted DTD element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteDTDElement(writer, name, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteDTDElement: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD element - * @content: content of the element - * - * Write a DTD element. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteDTDElement(xmlTextWriterPtr writer, - const xmlChar * name, const xmlChar * content) -{ - int count; - int sum; - - if (content == NULL) - return -1; - - sum = 0; - count = xmlTextWriterStartDTDElement(writer, name); - if (count == -1) - return -1; - sum += count; - - count = xmlTextWriterWriteString(writer, content); - if (count == -1) - return -1; - sum += count; - - count = xmlTextWriterEndDTDElement(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartDTDAttlist: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD ATTLIST - * - * Start an xml DTD ATTLIST. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL || name == NULL || *name == '\0') - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk == 0) { - return -1; - } - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_DTD: - count = xmlOutputBufferWriteString(writer->out, " ["); - if (count < 0) - return -1; - sum += count; - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - p->state = XML_TEXTWRITER_DTD_TEXT; - /* fallthrough */ - case XML_TEXTWRITER_DTD_TEXT: - case XML_TEXTWRITER_NONE: - break; - default: - return -1; - } - } - - p = (xmlTextWriterStackEntry *) - xmlMalloc(sizeof(xmlTextWriterStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDTDAttlist : out of memory!\n"); - return -1; - } - - p->name = xmlStrdup(name); - if (p->name == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDTDAttlist : out of memory!\n"); - xmlFree(p); - return -1; - } - p->state = XML_TEXTWRITER_DTD_ATTL; - - xmlListPushFront(writer->nodes, p); - - if (writer->indent) { - count = xmlTextWriterWriteIndent(writer); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, "<!ATTLIST "); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, (const char *) name); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterEndDTDAttlist: - * @writer: the xmlTextWriterPtr - * - * End an xml DTD attribute list. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk == 0) - return -1; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - switch (p->state) { - case XML_TEXTWRITER_DTD_ATTL: - case XML_TEXTWRITER_DTD_ATTL_TEXT: - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - break; - default: - return -1; - } - - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - - xmlListPopFront(writer->nodes); - return sum; -} - -/** - * xmlTextWriterWriteFormatDTDAttlist: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD ATTLIST - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted DTD ATTLIST. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatDTDAttlist: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD ATTLIST - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted DTD ATTLIST. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer, - const xmlChar * name, - const char *format, va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteDTDAttlist(writer, name, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteDTDAttlist: - * @writer: the xmlTextWriterPtr - * @name: the name of the DTD ATTLIST - * @content: content of the ATTLIST - * - * Write a DTD ATTLIST. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer, - const xmlChar * name, const xmlChar * content) -{ - int count; - int sum; - - if (content == NULL) - return -1; - - sum = 0; - count = xmlTextWriterStartDTDAttlist(writer, name); - if (count == -1) - return -1; - sum += count; - - count = xmlTextWriterWriteString(writer, content); - if (count == -1) - return -1; - sum += count; - - count = xmlTextWriterEndDTDAttlist(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterStartDTDEntity: - * @writer: the xmlTextWriterPtr - * @pe: TRUE if this is a parameter entity, FALSE if not - * @name: the name of the DTD ATTLIST - * - * Start an xml DTD ATTLIST. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer, - int pe, const xmlChar * name) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL || name == NULL || *name == '\0') - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk != 0) { - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_DTD: - count = xmlOutputBufferWriteString(writer->out, " ["); - if (count < 0) - return -1; - sum += count; - if (writer->indent) { - count = - xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - p->state = XML_TEXTWRITER_DTD_TEXT; - /* fallthrough */ - case XML_TEXTWRITER_DTD_TEXT: - case XML_TEXTWRITER_NONE: - break; - default: - return -1; - } - } - } - - p = (xmlTextWriterStackEntry *) - xmlMalloc(sizeof(xmlTextWriterStackEntry)); - if (p == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDTDElement : out of memory!\n"); - return -1; - } - - p->name = xmlStrdup(name); - if (p->name == 0) { - xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, - "xmlTextWriterStartDTDElement : out of memory!\n"); - xmlFree(p); - return -1; - } - - if (pe != 0) - p->state = XML_TEXTWRITER_DTD_PENT; - else - p->state = XML_TEXTWRITER_DTD_ENTY; - - xmlListPushFront(writer->nodes, p); - - if (writer->indent) { - count = xmlTextWriterWriteIndent(writer); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, "<!ENTITY "); - if (count < 0) - return -1; - sum += count; - - if (pe != 0) { - count = xmlOutputBufferWriteString(writer->out, "% "); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, (const char *) name); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterEndDTDEntity: - * @writer: the xmlTextWriterPtr - * - * End an xml DTD entity. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterEndDTDEntity(xmlTextWriterPtr writer) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk == 0) - return -1; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - switch (p->state) { - case XML_TEXTWRITER_DTD_ENTY_TEXT: - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - case XML_TEXTWRITER_DTD_ENTY: - case XML_TEXTWRITER_DTD_PENT: - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - break; - default: - return -1; - } - - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - - xmlListPopFront(writer->nodes); - return sum; -} - -/** - * xmlTextWriterWriteFormatDTDInternalEntity: - * @writer: the xmlTextWriterPtr - * @pe: TRUE if this is a parameter entity, FALSE if not - * @name: the name of the DTD entity - * @format: format string (see printf) - * @...: extra parameters for the format - * - * Write a formatted DTD internal entity. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int XMLCDECL -xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const char *format, ...) -{ - int rc; - va_list ap; - - va_start(ap, format); - - rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name, - format, ap); - - va_end(ap); - return rc; -} - -/** - * xmlTextWriterWriteVFormatDTDInternalEntity: - * @writer: the xmlTextWriterPtr - * @pe: TRUE if this is a parameter entity, FALSE if not - * @name: the name of the DTD entity - * @format: format string (see printf) - * @argptr: pointer to the first member of the variable argument list. - * - * Write a formatted DTD internal entity. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const char *format, - va_list argptr) -{ - int rc; - xmlChar *buf; - - if (writer == NULL) - return -1; - - buf = xmlTextWriterVSprintf(format, argptr); - if (buf == 0) - return 0; - - rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf); - - xmlFree(buf); - return rc; -} - -/** - * xmlTextWriterWriteDTDEntity: - * @writer: the xmlTextWriterPtr - * @pe: TRUE if this is a parameter entity, FALSE if not - * @name: the name of the DTD entity - * @pubid: the public identifier, which is an alternative to the system identifier - * @sysid: the system identifier, which is the URI of the DTD - * @ndataid: the xml notation name. - * @content: content of the entity - * - * Write a DTD entity. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, - const xmlChar * ndataid, - const xmlChar * content) -{ - if ((content == NULL) && (pubid == NULL) && (sysid == NULL)) - return -1; - if ((pe != 0) && (ndataid != NULL)) - return -1; - - if ((pubid == NULL) && (sysid == NULL)) - return xmlTextWriterWriteDTDInternalEntity(writer, pe, name, - content); - - return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid, - sysid, ndataid); -} - -/** - * xmlTextWriterWriteDTDInternalEntity: - * @writer: the xmlTextWriterPtr - * @pe: TRUE if this is a parameter entity, FALSE if not - * @name: the name of the DTD entity - * @content: content of the entity - * - * Write a DTD internal entity. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const xmlChar * content) -{ - int count; - int sum; - - if ((name == NULL) || (*name == '\0') || (content == NULL)) - return -1; - - sum = 0; - count = xmlTextWriterStartDTDEntity(writer, pe, name); - if (count == -1) - return -1; - sum += count; - - count = xmlTextWriterWriteString(writer, content); - if (count == -1) - return -1; - sum += count; - - count = xmlTextWriterEndDTDEntity(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterWriteDTDExternalEntity: - * @writer: the xmlTextWriterPtr - * @pe: TRUE if this is a parameter entity, FALSE if not - * @name: the name of the DTD entity - * @pubid: the public identifier, which is an alternative to the system identifier - * @sysid: the system identifier, which is the URI of the DTD - * @ndataid: the xml notation name. - * - * Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer, - int pe, - const xmlChar * name, - const xmlChar * pubid, - const xmlChar * sysid, - const xmlChar * ndataid) -{ - int count; - int sum; - - if (((pubid == NULL) && (sysid == NULL))) - return -1; - if ((pe != 0) && (ndataid != NULL)) - return -1; - - sum = 0; - count = xmlTextWriterStartDTDEntity(writer, pe, name); - if (count == -1) - return -1; - sum += count; - - count = - xmlTextWriterWriteDTDExternalEntityContents(writer, pubid, sysid, - ndataid); - if (count < 0) - return -1; - sum += count; - - count = xmlTextWriterEndDTDEntity(writer); - if (count == -1) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterWriteDTDExternalEntityContents: - * @writer: the xmlTextWriterPtr - * @pubid: the public identifier, which is an alternative to the system identifier - * @sysid: the system identifier, which is the URI of the DTD - * @ndataid: the xml notation name. - * - * Write the contents of a DTD external entity. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer, - const xmlChar * pubid, - const xmlChar * sysid, - const xmlChar * ndataid) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteDTDExternalEntityContents: xmlTextWriterPtr invalid!\n"); - return -1; - } - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk == 0) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n"); - return -1; - } - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return -1; - - switch (p->state) { - case XML_TEXTWRITER_DTD_ENTY: - break; - case XML_TEXTWRITER_DTD_PENT: - if (ndataid != NULL) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteDTDExternalEntityContents: notation not allowed with parameter entities!\n"); - return -1; - } - break; - default: - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n"); - return -1; - } - - if (pubid != 0) { - if (sysid == 0) { - xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteDTDExternalEntityContents: system identifier needed!\n"); - return -1; - } - - count = xmlOutputBufferWriteString(writer->out, " PUBLIC "); - if (count < 0) - return -1; - sum += count; - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - - count = - xmlOutputBufferWriteString(writer->out, (const char *) pubid); - if (count < 0) - return -1; - sum += count; - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - } - - if (sysid != 0) { - if (pubid == 0) { - count = xmlOutputBufferWriteString(writer->out, " SYSTEM"); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, " "); - if (count < 0) - return -1; - sum += count; - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - - count = - xmlOutputBufferWriteString(writer->out, (const char *) sysid); - if (count < 0) - return -1; - sum += count; - - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - } - - if (ndataid != NULL) { - count = xmlOutputBufferWriteString(writer->out, " NDATA "); - if (count < 0) - return -1; - sum += count; - - count = - xmlOutputBufferWriteString(writer->out, - (const char *) ndataid); - if (count < 0) - return -1; - sum += count; - } - - return sum; -} - -/** - * xmlTextWriterWriteDTDNotation: - * @writer: the xmlTextWriterPtr - * @name: the name of the xml notation - * @pubid: the public identifier, which is an alternative to the system identifier - * @sysid: the system identifier, which is the URI of the DTD - * - * Write a DTD entity. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer, - const xmlChar * name, - const xmlChar * pubid, const xmlChar * sysid) -{ - int count; - int sum; - xmlLinkPtr lk; - xmlTextWriterStackEntry *p; - - if (writer == NULL || name == NULL || *name == '\0') - return -1; - - sum = 0; - lk = xmlListFront(writer->nodes); - if (lk == 0) { - return -1; - } - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p != 0) { - switch (p->state) { - case XML_TEXTWRITER_DTD: - count = xmlOutputBufferWriteString(writer->out, " ["); - if (count < 0) - return -1; - sum += count; - if (writer->indent) { - count = xmlOutputBufferWriteString(writer->out, "\n"); - if (count < 0) - return -1; - sum += count; - } - p->state = XML_TEXTWRITER_DTD_TEXT; - /* fallthrough */ - case XML_TEXTWRITER_DTD_TEXT: - break; - default: - return -1; - } - } - - if (writer->indent) { - count = xmlTextWriterWriteIndent(writer); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, "<!NOTATION "); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWriteString(writer->out, (const char *) name); - if (count < 0) - return -1; - sum += count; - - if (pubid != 0) { - count = xmlOutputBufferWriteString(writer->out, " PUBLIC "); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - count = - xmlOutputBufferWriteString(writer->out, (const char *) pubid); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - } - - if (sysid != 0) { - if (pubid == 0) { - count = xmlOutputBufferWriteString(writer->out, " SYSTEM"); - if (count < 0) - return -1; - sum += count; - } - count = xmlOutputBufferWriteString(writer->out, " "); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - count = - xmlOutputBufferWriteString(writer->out, (const char *) sysid); - if (count < 0) - return -1; - sum += count; - count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); - if (count < 0) - return -1; - sum += count; - } - - count = xmlOutputBufferWriteString(writer->out, ">"); - if (count < 0) - return -1; - sum += count; - - return sum; -} - -/** - * xmlTextWriterFlush: - * @writer: the xmlTextWriterPtr - * - * Flush the output buffer. - * - * Returns the bytes written (may be 0 because of buffering) or -1 in case of error - */ -int -xmlTextWriterFlush(xmlTextWriterPtr writer) -{ - int count; - - if (writer == NULL) - return -1; - - if (writer->out == NULL) - count = 0; - else - count = xmlOutputBufferFlush(writer->out); - - return count; -} - -/** - * misc - */ - -/** - * xmlFreeTextWriterStackEntry: - * @lk: the xmlLinkPtr - * - * Free callback for the xmlList. - */ -static void -xmlFreeTextWriterStackEntry(xmlLinkPtr lk) -{ - xmlTextWriterStackEntry *p; - - p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return; - - if (p->name != 0) - xmlFree(p->name); - xmlFree(p); -} - -/** - * xmlCmpTextWriterStackEntry: - * @data0: the first data - * @data1: the second data - * - * Compare callback for the xmlList. - * - * Returns -1, 0, 1 - */ -static int -xmlCmpTextWriterStackEntry(const void *data0, const void *data1) -{ - xmlTextWriterStackEntry *p0; - xmlTextWriterStackEntry *p1; - - if (data0 == data1) - return 0; - - if (data0 == 0) - return -1; - - if (data1 == 0) - return 1; - - p0 = (xmlTextWriterStackEntry *) data0; - p1 = (xmlTextWriterStackEntry *) data1; - - return xmlStrcmp(p0->name, p1->name); -} - -/** - * misc - */ - -/** - * xmlFreeTextWriterNsStackEntry: - * @lk: the xmlLinkPtr - * - * Free callback for the xmlList. - */ -static void -xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk) -{ - xmlTextWriterNsStackEntry *p; - - p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk); - if (p == 0) - return; - - if (p->prefix != 0) - xmlFree(p->prefix); - if (p->uri != 0) - xmlFree(p->uri); - - xmlFree(p); -} - -/** - * xmlCmpTextWriterNsStackEntry: - * @data0: the first data - * @data1: the second data - * - * Compare callback for the xmlList. - * - * Returns -1, 0, 1 - */ -static int -xmlCmpTextWriterNsStackEntry(const void *data0, const void *data1) -{ - xmlTextWriterNsStackEntry *p0; - xmlTextWriterNsStackEntry *p1; - int rc; - - if (data0 == data1) - return 0; - - if (data0 == 0) - return -1; - - if (data1 == 0) - return 1; - - p0 = (xmlTextWriterNsStackEntry *) data0; - p1 = (xmlTextWriterNsStackEntry *) data1; - - rc = xmlStrcmp(p0->prefix, p1->prefix); - - if (rc == 0) - rc = p0->elem == p1->elem; - - return rc; -} - -/** - * xmlTextWriterWriteDocCallback: - * @context: the xmlBufferPtr - * @str: the data to write - * @len: the length of the data - * - * Write callback for the xmlOutputBuffer with target xmlBuffer - * - * Returns -1, 0, 1 - */ -static int -xmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context; - int rc; - - if ((rc = xmlParseChunk(ctxt, (const char *) str, len, 0)) != 0) { - xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteDocCallback : XML error %d !\n", - rc); - return -1; - } - - return len; -} - -/** - * xmlTextWriterCloseDocCallback: - * @context: the xmlBufferPtr - * - * Close callback for the xmlOutputBuffer with target xmlBuffer - * - * Returns -1, 0, 1 - */ -static int -xmlTextWriterCloseDocCallback(void *context) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context; - int rc; - - if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) { - xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR, - "xmlTextWriterWriteDocCallback : XML error %d !\n", - rc); - return -1; - } - - return 0; -} - -/** - * xmlTextWriterVSprintf: - * @format: see printf - * @argptr: pointer to the first member of the variable argument list. - * - * Utility function for formatted output - * - * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed. - */ -static xmlChar * -xmlTextWriterVSprintf(const char *format, va_list argptr) -{ - int size; - int count; - xmlChar *buf; - va_list locarg; - - size = BUFSIZ; - buf = (xmlChar *) xmlMalloc(size); - if (buf == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlTextWriterVSprintf : out of memory!\n"); - return NULL; - } - - VA_COPY(locarg, argptr); - while (((count = vsnprintf((char *) buf, size, format, locarg)) < 0) - || (count == size - 1) || (count == size) || (count > size)) { - va_end(locarg); - xmlFree(buf); - size += BUFSIZ; - buf = (xmlChar *) xmlMalloc(size); - if (buf == NULL) { - xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, - "xmlTextWriterVSprintf : out of memory!\n"); - return NULL; - } - VA_COPY(locarg, argptr); - } - va_end(locarg); - - return buf; -} - -/** - * xmlTextWriterStartDocumentCallback: - * @ctx: the user data (XML parser context) - * - * called at the start of document processing. - */ -static void -xmlTextWriterStartDocumentCallback(void *ctx) -{ - xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; - xmlDocPtr doc; - - if (ctxt->html) { -#ifdef LIBXML_HTML_ENABLED - if (ctxt->myDoc == NULL) - ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); - if (ctxt->myDoc == NULL) { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "SAX.startDocument(): out of memory\n"); - ctxt->errNo = XML_ERR_NO_MEMORY; - ctxt->instate = XML_PARSER_EOF; - ctxt->disableSAX = 1; - return; - } -#else - xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, - "libxml2 built without HTML support\n"); - ctxt->errNo = XML_ERR_INTERNAL_ERROR; - ctxt->instate = XML_PARSER_EOF; - ctxt->disableSAX = 1; - return; -#endif - } else { - doc = ctxt->myDoc; - if (doc == NULL) - doc = ctxt->myDoc = xmlNewDoc(ctxt->version); - if (doc != NULL) { - if (doc->children == NULL) { - if (ctxt->encoding != NULL) - doc->encoding = xmlStrdup(ctxt->encoding); - else - doc->encoding = NULL; - doc->standalone = ctxt->standalone; - } - } else { - if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) - ctxt->sax->error(ctxt->userData, - "SAX.startDocument(): out of memory\n"); - ctxt->errNo = XML_ERR_NO_MEMORY; - ctxt->instate = XML_PARSER_EOF; - ctxt->disableSAX = 1; - return; - } - } - if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) && - (ctxt->input != NULL) && (ctxt->input->filename != NULL)) { - ctxt->myDoc->URL = - xmlCanonicPath((const xmlChar *) ctxt->input->filename); - if (ctxt->myDoc->URL == NULL) - ctxt->myDoc->URL = - xmlStrdup((const xmlChar *) ctxt->input->filename); - } -} - -/** - * xmlTextWriterSetIndent: - * @writer: the xmlTextWriterPtr - * @indent: do indentation? - * - * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation. - * - * Returns -1 on error or 0 otherwise. - */ -int -xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent) -{ - if ((writer == NULL) || (indent < 0)) - return -1; - - writer->indent = indent; - writer->doindent = 1; - - return 0; -} - -/** - * xmlTextWriterSetIndentString: - * @writer: the xmlTextWriterPtr - * @str: the xmlChar string - * - * Set string indentation. - * - * Returns -1 on error or 0 otherwise. - */ -int -xmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str) -{ - if ((writer == NULL) || (!str)) - return -1; - - if (writer->ichar != NULL) - xmlFree(writer->ichar); - writer->ichar = xmlStrdup(str); - - if (!writer->ichar) - return -1; - else - return 0; -} - -/** - * xmlTextWriterWriteIndent: - * @writer: the xmlTextWriterPtr - * - * Write indent string. - * - * Returns -1 on error or the number of strings written. - */ -static int -xmlTextWriterWriteIndent(xmlTextWriterPtr writer) -{ - int lksize; - int i; - int ret; - - lksize = xmlListSize(writer->nodes); - if (lksize < 1) - return (-1); /* list is empty */ - for (i = 0; i < (lksize - 1); i++) { - ret = xmlOutputBufferWriteString(writer->out, - (const char *) writer->ichar); - if (ret == -1) - return (-1); - } - - return (lksize - 1); -} - -/** - * xmlTextWriterHandleStateDependencies: - * @writer: the xmlTextWriterPtr - * @p: the xmlTextWriterStackEntry - * - * Write state dependent strings. - * - * Returns -1 on error or the number of characters written. - */ -static int -xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer, - xmlTextWriterStackEntry * p) -{ - int count; - int sum; - char extra[3]; - - if (writer == NULL) - return -1; - - if (p == NULL) - return 0; - - sum = 0; - extra[0] = extra[1] = extra[2] = '\0'; - if (p != 0) { - sum = 0; - switch (p->state) { - case XML_TEXTWRITER_NAME: - extra[0] = '>'; - p->state = XML_TEXTWRITER_TEXT; - break; - case XML_TEXTWRITER_PI: - extra[0] = ' '; - p->state = XML_TEXTWRITER_PI_TEXT; - break; - case XML_TEXTWRITER_DTD: - extra[0] = ' '; - extra[1] = '['; - p->state = XML_TEXTWRITER_DTD_TEXT; - break; - case XML_TEXTWRITER_DTD_ELEM: - extra[0] = ' '; - p->state = XML_TEXTWRITER_DTD_ELEM_TEXT; - break; - case XML_TEXTWRITER_DTD_ATTL: - extra[0] = ' '; - p->state = XML_TEXTWRITER_DTD_ATTL_TEXT; - break; - case XML_TEXTWRITER_DTD_ENTY: - case XML_TEXTWRITER_DTD_PENT: - extra[0] = ' '; - extra[1] = writer->qchar; - p->state = XML_TEXTWRITER_DTD_ENTY_TEXT; - break; - default: - break; - } - } - - if (*extra != '\0') { - count = xmlOutputBufferWriteString(writer->out, extra); - if (count < 0) - return -1; - sum += count; - } - - return sum; -} - -#define bottom_xmlwriter -#include "elfgcchack.h" -#endif diff --git a/ThirdParty/libxml2/vtklibxml2/xpath.c b/ThirdParty/libxml2/vtklibxml2/xpath.c deleted file mode 100644 index 2221313ca4f..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xpath.c +++ /dev/null @@ -1,15069 +0,0 @@ -/* - * xpath.c: XML Path Language implementation - * XPath is a language for addressing parts of an XML document, - * designed to be used by both XSLT and XPointer - *f - * Reference: W3C Recommendation 16 November 1999 - * http://www.w3.org/TR/1999/REC-xpath-19991116 - * Public reference: - * http://www.w3.org/TR/xpath - * - * See Copyright for the status of this software - * - * Author: daniel@veillard.com - * - */ - -#define IN_LIBXML -#include "libxml.h" - -#include <string.h> - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_MATH_H -#include <math.h> -#endif -#ifdef HAVE_FLOAT_H -#include <float.h> -#endif -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif -#ifdef HAVE_SIGNAL_H -#include <signal.h> -#endif - -#include <libxml/xmlmemory.h> -#include <libxml/tree.h> -#include <libxml/valid.h> -#include <libxml/xpath.h> -#include <libxml/xpathInternals.h> -#include <libxml/parserInternals.h> -#include <libxml/hash.h> -#ifdef LIBXML_XPTR_ENABLED -#include <libxml/xpointer.h> -#endif -#ifdef LIBXML_DEBUG_ENABLED -#include <libxml/debugXML.h> -#endif -#include <libxml/xmlerror.h> -#include <libxml/threads.h> -#include <libxml/globals.h> -#ifdef LIBXML_PATTERN_ENABLED -#include <libxml/pattern.h> -#endif - -#ifdef LIBXML_PATTERN_ENABLED -#define XPATH_STREAMING -#endif - -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -/* -* XP_OPTIMIZED_NON_ELEM_COMPARISON: -* If defined, this will use xmlXPathCmpNodesExt() instead of -* xmlXPathCmpNodes(). The new function is optimized comparison of -* non-element nodes; actually it will speed up comparison only if -* xmlXPathOrderDocElems() was called in order to index the elements of -* a tree in document order; Libxslt does such an indexing, thus it will -* benefit from this optimization. -*/ -#define XP_OPTIMIZED_NON_ELEM_COMPARISON - -/* -* XP_OPTIMIZED_FILTER_FIRST: -* If defined, this will optimize expressions like "key('foo', 'val')[b][1]" -* in a way, that it stop evaluation at the first node. -*/ -#define XP_OPTIMIZED_FILTER_FIRST - -/* -* XP_DEBUG_OBJ_USAGE: -* Internal flag to enable tracking of how much XPath objects have been -* created. -*/ -/* #define XP_DEBUG_OBJ_USAGE */ - -/* - * TODO: - * There are a few spots where some tests are done which depend upon ascii - * data. These should be enhanced for full UTF8 support (see particularly - * any use of the macros IS_ASCII_CHARACTER and IS_ASCII_DIGIT) - */ - -#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) - -/************************************************************************ - * * - * Floating point stuff * - * * - ************************************************************************/ - -#ifndef TRIO_REPLACE_STDIO -#define TRIO_PUBLIC static -#endif -#include "trionan.c" - -/* - * The lack of portability of this section of the libc is annoying ! - */ -double xmlXPathNAN = 0; -double xmlXPathPINF = 1; -double xmlXPathNINF = -1; -static double xmlXPathNZERO = 0; /* not exported from headers */ -static int xmlXPathInitialized = 0; - -/** - * xmlXPathInit: - * - * Initialize the XPath environment - */ -void -xmlXPathInit(void) { - if (xmlXPathInitialized) return; - - xmlXPathPINF = trio_pinf(); - xmlXPathNINF = trio_ninf(); - xmlXPathNAN = trio_nan(); - xmlXPathNZERO = trio_nzero(); - - xmlXPathInitialized = 1; -} - -/** - * xmlXPathIsNaN: - * @val: a double value - * - * Provides a portable isnan() function to detect whether a double - * is a NotaNumber. Based on trio code - * http://sourceforge.net/projects/ctrio/ - * - * Returns 1 if the value is a NaN, 0 otherwise - */ -int -xmlXPathIsNaN(double val) { - return(trio_isnan(val)); -} - -/** - * xmlXPathIsInf: - * @val: a double value - * - * Provides a portable isinf() function to detect whether a double - * is a +Infinite or -Infinite. Based on trio code - * http://sourceforge.net/projects/ctrio/ - * - * Returns 1 vi the value is +Infinite, -1 if -Infinite, 0 otherwise - */ -int -xmlXPathIsInf(double val) { - return(trio_isinf(val)); -} - -#endif /* SCHEMAS or XPATH */ -#ifdef LIBXML_XPATH_ENABLED -/** - * xmlXPathGetSign: - * @val: a double value - * - * Provides a portable function to detect the sign of a double - * Modified from trio code - * http://sourceforge.net/projects/ctrio/ - * - * Returns 1 if the value is Negative, 0 if positive - */ -static int -xmlXPathGetSign(double val) { - return(trio_signbit(val)); -} - - -/* - * TODO: when compatibility allows remove all "fake node libxslt" strings - * the test should just be name[0] = ' ' - */ -/* #define DEBUG */ -/* #define DEBUG_STEP */ -/* #define DEBUG_STEP_NTH */ -/* #define DEBUG_EXPR */ -/* #define DEBUG_EVAL_COUNTS */ - -static xmlNs xmlXPathXMLNamespaceStruct = { - NULL, - XML_NAMESPACE_DECL, - XML_XML_NAMESPACE, - BAD_CAST "xml", - NULL, - NULL -}; -static xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct; -#ifndef LIBXML_THREAD_ENABLED -/* - * Optimizer is disabled only when threaded apps are detected while - * the library ain't compiled for thread safety. - */ -static int xmlXPathDisableOptimizer = 0; -#endif - -/************************************************************************ - * * - * Error handling routines * - * * - ************************************************************************/ - -/** - * XP_ERRORNULL: - * @X: the error code - * - * Macro to raise an XPath error and return NULL. - */ -#define XP_ERRORNULL(X) \ - { xmlXPathErr(ctxt, X); return(NULL); } - -/* - * The array xmlXPathErrorMessages corresponds to the enum xmlXPathError - */ -static const char *xmlXPathErrorMessages[] = { - "Ok\n", - "Number encoding\n", - "Unfinished literal\n", - "Start of literal\n", - "Expected $ for variable reference\n", - "Undefined variable\n", - "Invalid predicate\n", - "Invalid expression\n", - "Missing closing curly brace\n", - "Unregistered function\n", - "Invalid operand\n", - "Invalid type\n", - "Invalid number of arguments\n", - "Invalid context size\n", - "Invalid context position\n", - "Memory allocation error\n", - "Syntax error\n", - "Resource error\n", - "Sub resource error\n", - "Undefined namespace prefix\n", - "Encoding error\n", - "Char out of XML range\n", - "Invalid or incomplete context\n", - "?? Unknown error ??\n" /* Must be last in the list! */ -}; -#define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) / \ - sizeof(xmlXPathErrorMessages[0])) - 1) -/** - * xmlXPathErrMemory: - * @ctxt: an XPath context - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -static void -xmlXPathErrMemory(xmlXPathContextPtr ctxt, const char *extra) -{ - if (ctxt != NULL) { - if (extra) { - xmlChar buf[200]; - - xmlStrPrintf(buf, 200, - BAD_CAST "Memory allocation failed : %s\n", - extra); - ctxt->lastError.message = (char *) xmlStrdup(buf); - } else { - ctxt->lastError.message = (char *) - xmlStrdup(BAD_CAST "Memory allocation failed\n"); - } - ctxt->lastError.domain = XML_FROM_XPATH; - ctxt->lastError.code = XML_ERR_NO_MEMORY; - if (ctxt->error != NULL) - ctxt->error(ctxt->userData, &ctxt->lastError); - } else { - if (extra) - __xmlRaiseError(NULL, NULL, NULL, - NULL, NULL, XML_FROM_XPATH, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, - extra, NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); - else - __xmlRaiseError(NULL, NULL, NULL, - NULL, NULL, XML_FROM_XPATH, - XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, - NULL, NULL, NULL, 0, 0, - "Memory allocation failed\n"); - } -} - -/** - * xmlXPathPErrMemory: - * @ctxt: an XPath parser context - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -static void -xmlXPathPErrMemory(xmlXPathParserContextPtr ctxt, const char *extra) -{ - if (ctxt == NULL) - xmlXPathErrMemory(NULL, extra); - else { - ctxt->error = XPATH_MEMORY_ERROR; - xmlXPathErrMemory(ctxt->context, extra); - } -} - -/** - * xmlXPathErr: - * @ctxt: a XPath parser context - * @error: the error code - * - * Handle an XPath error - */ -void -xmlXPathErr(xmlXPathParserContextPtr ctxt, int error) -{ - if ((error < 0) || (error > MAXERRNO)) - error = MAXERRNO; - if (ctxt == NULL) { - __xmlRaiseError(NULL, NULL, NULL, - NULL, NULL, XML_FROM_XPATH, - error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, - XML_ERR_ERROR, NULL, 0, - NULL, NULL, NULL, 0, 0, - xmlXPathErrorMessages[error]); - return; - } - ctxt->error = error; - if (ctxt->context == NULL) { - __xmlRaiseError(NULL, NULL, NULL, - NULL, NULL, XML_FROM_XPATH, - error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, - XML_ERR_ERROR, NULL, 0, - (const char *) ctxt->base, NULL, NULL, - ctxt->cur - ctxt->base, 0, - xmlXPathErrorMessages[error]); - return; - } - - /* cleanup current last error */ - xmlResetError(&ctxt->context->lastError); - - ctxt->context->lastError.domain = XML_FROM_XPATH; - ctxt->context->lastError.code = error + XML_XPATH_EXPRESSION_OK - - XPATH_EXPRESSION_OK; - ctxt->context->lastError.level = XML_ERR_ERROR; - ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base); - ctxt->context->lastError.int1 = ctxt->cur - ctxt->base; - ctxt->context->lastError.node = ctxt->context->debugNode; - if (ctxt->context->error != NULL) { - ctxt->context->error(ctxt->context->userData, - &ctxt->context->lastError); - } else { - __xmlRaiseError(NULL, NULL, NULL, - NULL, ctxt->context->debugNode, XML_FROM_XPATH, - error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, - XML_ERR_ERROR, NULL, 0, - (const char *) ctxt->base, NULL, NULL, - ctxt->cur - ctxt->base, 0, - xmlXPathErrorMessages[error]); - } - -} - -/** - * xmlXPatherror: - * @ctxt: the XPath Parser context - * @file: the file name - * @line: the line number - * @no: the error number - * - * Formats an error message. - */ -void -xmlXPatherror(xmlXPathParserContextPtr ctxt, const char *file ATTRIBUTE_UNUSED, - int line ATTRIBUTE_UNUSED, int no) { - xmlXPathErr(ctxt, no); -} - -/************************************************************************ - * * - * Utilities * - * * - ************************************************************************/ - -/** - * xsltPointerList: - * - * Pointer-list for various purposes. - */ -typedef struct _xmlPointerList xmlPointerList; -typedef xmlPointerList *xmlPointerListPtr; -struct _xmlPointerList { - void **items; - int number; - int size; -}; -/* -* TODO: Since such a list-handling is used in xmlschemas.c and libxslt -* and here, we should make the functions public. -*/ -static int -xmlPointerListAddSize(xmlPointerListPtr list, - void *item, - int initialSize) -{ - if (list->items == NULL) { - if (initialSize <= 0) - initialSize = 1; - list->items = (void **) xmlMalloc( - initialSize * sizeof(void *)); - if (list->items == NULL) { - xmlXPathErrMemory(NULL, - "xmlPointerListCreate: allocating item\n"); - return(-1); - } - list->number = 0; - list->size = initialSize; - } else if (list->size <= list->number) { - list->size *= 2; - list->items = (void **) xmlRealloc(list->items, - list->size * sizeof(void *)); - if (list->items == NULL) { - xmlXPathErrMemory(NULL, - "xmlPointerListCreate: re-allocating item\n"); - list->size = 0; - return(-1); - } - } - list->items[list->number++] = item; - return(0); -} - -/** - * xsltPointerListCreate: - * - * Creates an xsltPointerList structure. - * - * Returns a xsltPointerList structure or NULL in case of an error. - */ -static xmlPointerListPtr -xmlPointerListCreate(int initialSize) -{ - xmlPointerListPtr ret; - - ret = xmlMalloc(sizeof(xmlPointerList)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, - "xmlPointerListCreate: allocating item\n"); - return (NULL); - } - memset(ret, 0, sizeof(xmlPointerList)); - if (initialSize > 0) { - xmlPointerListAddSize(ret, NULL, initialSize); - ret->number = 0; - } - return (ret); -} - -/** - * xsltPointerListFree: - * - * Frees the xsltPointerList structure. This does not free - * the content of the list. - */ -static void -xmlPointerListFree(xmlPointerListPtr list) -{ - if (list == NULL) - return; - if (list->items != NULL) - xmlFree(list->items); - xmlFree(list); -} - -/************************************************************************ - * * - * Parser Types * - * * - ************************************************************************/ - -/* - * Types are private: - */ - -typedef enum { - XPATH_OP_END=0, - XPATH_OP_AND, - XPATH_OP_OR, - XPATH_OP_EQUAL, - XPATH_OP_CMP, - XPATH_OP_PLUS, - XPATH_OP_MULT, - XPATH_OP_UNION, - XPATH_OP_ROOT, - XPATH_OP_NODE, - XPATH_OP_RESET, /* 10 */ - XPATH_OP_COLLECT, - XPATH_OP_VALUE, /* 12 */ - XPATH_OP_VARIABLE, - XPATH_OP_FUNCTION, - XPATH_OP_ARG, - XPATH_OP_PREDICATE, - XPATH_OP_FILTER, /* 17 */ - XPATH_OP_SORT /* 18 */ -#ifdef LIBXML_XPTR_ENABLED - ,XPATH_OP_RANGETO -#endif -} xmlXPathOp; - -typedef enum { - AXIS_ANCESTOR = 1, - AXIS_ANCESTOR_OR_SELF, - AXIS_ATTRIBUTE, - AXIS_CHILD, - AXIS_DESCENDANT, - AXIS_DESCENDANT_OR_SELF, - AXIS_FOLLOWING, - AXIS_FOLLOWING_SIBLING, - AXIS_NAMESPACE, - AXIS_PARENT, - AXIS_PRECEDING, - AXIS_PRECEDING_SIBLING, - AXIS_SELF -} xmlXPathAxisVal; - -typedef enum { - NODE_TEST_NONE = 0, - NODE_TEST_TYPE = 1, - NODE_TEST_PI = 2, - NODE_TEST_ALL = 3, - NODE_TEST_NS = 4, - NODE_TEST_NAME = 5 -} xmlXPathTestVal; - -typedef enum { - NODE_TYPE_NODE = 0, - NODE_TYPE_COMMENT = XML_COMMENT_NODE, - NODE_TYPE_TEXT = XML_TEXT_NODE, - NODE_TYPE_PI = XML_PI_NODE -} xmlXPathTypeVal; - -#define XP_REWRITE_DOS_CHILD_ELEM 1 - -typedef struct _xmlXPathStepOp xmlXPathStepOp; -typedef xmlXPathStepOp *xmlXPathStepOpPtr; -struct _xmlXPathStepOp { - xmlXPathOp op; /* The identifier of the operation */ - int ch1; /* First child */ - int ch2; /* Second child */ - int value; - int value2; - int value3; - void *value4; - void *value5; - void *cache; - void *cacheURI; - int rewriteType; -}; - -struct _xmlXPathCompExpr { - int nbStep; /* Number of steps in this expression */ - int maxStep; /* Maximum number of steps allocated */ - xmlXPathStepOp *steps; /* ops for computation of this expression */ - int last; /* index of last step in expression */ - xmlChar *expr; /* the expression being computed */ - xmlDictPtr dict; /* the dictionnary to use if any */ -#ifdef DEBUG_EVAL_COUNTS - int nb; - xmlChar *string; -#endif -#ifdef XPATH_STREAMING - xmlPatternPtr stream; -#endif -}; - -/************************************************************************ - * * - * Forward declarations * - * * - ************************************************************************/ -static void -xmlXPathFreeValueTree(xmlNodeSetPtr obj); -static void -xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj); -static int -xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, xmlNodePtr *first); -static int -xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, - int isPredicate); - -/************************************************************************ - * * - * Parser Type functions * - * * - ************************************************************************/ - -/** - * xmlXPathNewCompExpr: - * - * Create a new Xpath component - * - * Returns the newly allocated xmlXPathCompExprPtr or NULL in case of error - */ -static xmlXPathCompExprPtr -xmlXPathNewCompExpr(void) { - xmlXPathCompExprPtr cur; - - cur = (xmlXPathCompExprPtr) xmlMalloc(sizeof(xmlXPathCompExpr)); - if (cur == NULL) { - xmlXPathErrMemory(NULL, "allocating component\n"); - return(NULL); - } - memset(cur, 0, sizeof(xmlXPathCompExpr)); - cur->maxStep = 10; - cur->nbStep = 0; - cur->steps = (xmlXPathStepOp *) xmlMalloc(cur->maxStep * - sizeof(xmlXPathStepOp)); - if (cur->steps == NULL) { - xmlXPathErrMemory(NULL, "allocating steps\n"); - xmlFree(cur); - return(NULL); - } - memset(cur->steps, 0, cur->maxStep * sizeof(xmlXPathStepOp)); - cur->last = -1; -#ifdef DEBUG_EVAL_COUNTS - cur->nb = 0; -#endif - return(cur); -} - -/** - * xmlXPathFreeCompExpr: - * @comp: an XPATH comp - * - * Free up the memory allocated by @comp - */ -void -xmlXPathFreeCompExpr(xmlXPathCompExprPtr comp) -{ - xmlXPathStepOpPtr op; - int i; - - if (comp == NULL) - return; - if (comp->dict == NULL) { - for (i = 0; i < comp->nbStep; i++) { - op = &comp->steps[i]; - if (op->value4 != NULL) { - if (op->op == XPATH_OP_VALUE) - xmlXPathFreeObject(op->value4); - else - xmlFree(op->value4); - } - if (op->value5 != NULL) - xmlFree(op->value5); - } - } else { - for (i = 0; i < comp->nbStep; i++) { - op = &comp->steps[i]; - if (op->value4 != NULL) { - if (op->op == XPATH_OP_VALUE) - xmlXPathFreeObject(op->value4); - } - } - xmlDictFree(comp->dict); - } - if (comp->steps != NULL) { - xmlFree(comp->steps); - } -#ifdef DEBUG_EVAL_COUNTS - if (comp->string != NULL) { - xmlFree(comp->string); - } -#endif -#ifdef XPATH_STREAMING - if (comp->stream != NULL) { - xmlFreePatternList(comp->stream); - } -#endif - if (comp->expr != NULL) { - xmlFree(comp->expr); - } - - xmlFree(comp); -} - -/** - * xmlXPathCompExprAdd: - * @comp: the compiled expression - * @ch1: first child index - * @ch2: second child index - * @op: an op - * @value: the first int value - * @value2: the second int value - * @value3: the third int value - * @value4: the first string value - * @value5: the second string value - * - * Add a step to an XPath Compiled Expression - * - * Returns -1 in case of failure, the index otherwise - */ -static int -xmlXPathCompExprAdd(xmlXPathCompExprPtr comp, int ch1, int ch2, - xmlXPathOp op, int value, - int value2, int value3, void *value4, void *value5) { - if (comp->nbStep >= comp->maxStep) { - xmlXPathStepOp *real; - - comp->maxStep *= 2; - real = (xmlXPathStepOp *) xmlRealloc(comp->steps, - comp->maxStep * sizeof(xmlXPathStepOp)); - if (real == NULL) { - comp->maxStep /= 2; - xmlXPathErrMemory(NULL, "adding step\n"); - return(-1); - } - comp->steps = real; - } - comp->last = comp->nbStep; - comp->steps[comp->nbStep].rewriteType = 0; - comp->steps[comp->nbStep].ch1 = ch1; - comp->steps[comp->nbStep].ch2 = ch2; - comp->steps[comp->nbStep].op = op; - comp->steps[comp->nbStep].value = value; - comp->steps[comp->nbStep].value2 = value2; - comp->steps[comp->nbStep].value3 = value3; - if ((comp->dict != NULL) && - ((op == XPATH_OP_FUNCTION) || (op == XPATH_OP_VARIABLE) || - (op == XPATH_OP_COLLECT))) { - if (value4 != NULL) { - comp->steps[comp->nbStep].value4 = (xmlChar *) - (void *)xmlDictLookup(comp->dict, value4, -1); - xmlFree(value4); - } else - comp->steps[comp->nbStep].value4 = NULL; - if (value5 != NULL) { - comp->steps[comp->nbStep].value5 = (xmlChar *) - (void *)xmlDictLookup(comp->dict, value5, -1); - xmlFree(value5); - } else - comp->steps[comp->nbStep].value5 = NULL; - } else { - comp->steps[comp->nbStep].value4 = value4; - comp->steps[comp->nbStep].value5 = value5; - } - comp->steps[comp->nbStep].cache = NULL; - return(comp->nbStep++); -} - -/** - * xmlXPathCompSwap: - * @comp: the compiled expression - * @op: operation index - * - * Swaps 2 operations in the compiled expression - */ -static void -xmlXPathCompSwap(xmlXPathStepOpPtr op) { - int tmp; - -#ifndef LIBXML_THREAD_ENABLED - /* - * Since this manipulates possibly shared variables, this is - * disabled if one detects that the library is used in a multithreaded - * application - */ - if (xmlXPathDisableOptimizer) - return; -#endif - - tmp = op->ch1; - op->ch1 = op->ch2; - op->ch2 = tmp; -} - -#define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5) \ - xmlXPathCompExprAdd(ctxt->comp, (op1), (op2), \ - (op), (val), (val2), (val3), (val4), (val5)) -#define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5) \ - xmlXPathCompExprAdd(ctxt->comp, ctxt->comp->last, -1, \ - (op), (val), (val2), (val3), (val4), (val5)) - -#define PUSH_LEAVE_EXPR(op, val, val2) \ -xmlXPathCompExprAdd(ctxt->comp, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL) - -#define PUSH_UNARY_EXPR(op, ch, val, val2) \ -xmlXPathCompExprAdd(ctxt->comp, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL) - -#define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2) \ -xmlXPathCompExprAdd(ctxt->comp, (ch1), (ch2), (op), \ - (val), (val2), 0 ,NULL ,NULL) - -/************************************************************************ - * * - * XPath object cache structures * - * * - ************************************************************************/ - -/* #define XP_DEFAULT_CACHE_ON */ - -#define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL)) - -typedef struct _xmlXPathContextCache xmlXPathContextCache; -typedef xmlXPathContextCache *xmlXPathContextCachePtr; -struct _xmlXPathContextCache { - xmlPointerListPtr nodesetObjs; /* contains xmlXPathObjectPtr */ - xmlPointerListPtr stringObjs; /* contains xmlXPathObjectPtr */ - xmlPointerListPtr booleanObjs; /* contains xmlXPathObjectPtr */ - xmlPointerListPtr numberObjs; /* contains xmlXPathObjectPtr */ - xmlPointerListPtr miscObjs; /* contains xmlXPathObjectPtr */ - int maxNodeset; - int maxString; - int maxBoolean; - int maxNumber; - int maxMisc; -#ifdef XP_DEBUG_OBJ_USAGE - int dbgCachedAll; - int dbgCachedNodeset; - int dbgCachedString; - int dbgCachedBool; - int dbgCachedNumber; - int dbgCachedPoint; - int dbgCachedRange; - int dbgCachedLocset; - int dbgCachedUsers; - int dbgCachedXSLTTree; - int dbgCachedUndefined; - - - int dbgReusedAll; - int dbgReusedNodeset; - int dbgReusedString; - int dbgReusedBool; - int dbgReusedNumber; - int dbgReusedPoint; - int dbgReusedRange; - int dbgReusedLocset; - int dbgReusedUsers; - int dbgReusedXSLTTree; - int dbgReusedUndefined; - -#endif -}; - -/************************************************************************ - * * - * Debugging related functions * - * * - ************************************************************************/ - -#define STRANGE \ - xmlGenericError(xmlGenericErrorContext, \ - "Internal error at %s:%d\n", \ - __FILE__, __LINE__); - -#ifdef LIBXML_DEBUG_ENABLED -static void -xmlXPathDebugDumpNode(FILE *output, xmlNodePtr cur, int depth) { - int i; - char shift[100]; - - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - if (cur == NULL) { - fprintf(output, shift); - fprintf(output, "Node is NULL !\n"); - return; - - } - - if ((cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - fprintf(output, shift); - fprintf(output, " /\n"); - } else if (cur->type == XML_ATTRIBUTE_NODE) - xmlDebugDumpAttr(output, (xmlAttrPtr)cur, depth); - else - xmlDebugDumpOneNode(output, cur, depth); -} -static void -xmlXPathDebugDumpNodeList(FILE *output, xmlNodePtr cur, int depth) { - xmlNodePtr tmp; - int i; - char shift[100]; - - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - if (cur == NULL) { - fprintf(output, shift); - fprintf(output, "Node is NULL !\n"); - return; - - } - - while (cur != NULL) { - tmp = cur; - cur = cur->next; - xmlDebugDumpOneNode(output, tmp, depth); - } -} - -static void -xmlXPathDebugDumpNodeSet(FILE *output, xmlNodeSetPtr cur, int depth) { - int i; - char shift[100]; - - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - - if (cur == NULL) { - fprintf(output, shift); - fprintf(output, "NodeSet is NULL !\n"); - return; - - } - - if (cur != NULL) { - fprintf(output, "Set contains %d nodes:\n", cur->nodeNr); - for (i = 0;i < cur->nodeNr;i++) { - fprintf(output, shift); - fprintf(output, "%d", i + 1); - xmlXPathDebugDumpNode(output, cur->nodeTab[i], depth + 1); - } - } -} - -static void -xmlXPathDebugDumpValueTree(FILE *output, xmlNodeSetPtr cur, int depth) { - int i; - char shift[100]; - - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - - if ((cur == NULL) || (cur->nodeNr == 0) || (cur->nodeTab[0] == NULL)) { - fprintf(output, shift); - fprintf(output, "Value Tree is NULL !\n"); - return; - - } - - fprintf(output, shift); - fprintf(output, "%d", i + 1); - xmlXPathDebugDumpNodeList(output, cur->nodeTab[0]->children, depth + 1); -} -#if defined(LIBXML_XPTR_ENABLED) -static void -xmlXPathDebugDumpLocationSet(FILE *output, xmlLocationSetPtr cur, int depth) { - int i; - char shift[100]; - - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - - if (cur == NULL) { - fprintf(output, shift); - fprintf(output, "LocationSet is NULL !\n"); - return; - - } - - for (i = 0;i < cur->locNr;i++) { - fprintf(output, shift); - fprintf(output, "%d : ", i + 1); - xmlXPathDebugDumpObject(output, cur->locTab[i], depth + 1); - } -} -#endif /* LIBXML_XPTR_ENABLED */ - -/** - * xmlXPathDebugDumpObject: - * @output: the FILE * to dump the output - * @cur: the object to inspect - * @depth: indentation level - * - * Dump the content of the object for debugging purposes - */ -void -xmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) { - int i; - char shift[100]; - - if (output == NULL) return; - - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - - - fprintf(output, shift); - - if (cur == NULL) { - fprintf(output, "Object is empty (NULL)\n"); - return; - } - switch(cur->type) { - case XPATH_UNDEFINED: - fprintf(output, "Object is uninitialized\n"); - break; - case XPATH_NODESET: - fprintf(output, "Object is a Node Set :\n"); - xmlXPathDebugDumpNodeSet(output, cur->nodesetval, depth); - break; - case XPATH_XSLT_TREE: - fprintf(output, "Object is an XSLT value tree :\n"); - xmlXPathDebugDumpValueTree(output, cur->nodesetval, depth); - break; - case XPATH_BOOLEAN: - fprintf(output, "Object is a Boolean : "); - if (cur->boolval) fprintf(output, "true\n"); - else fprintf(output, "false\n"); - break; - case XPATH_NUMBER: - switch (xmlXPathIsInf(cur->floatval)) { - case 1: - fprintf(output, "Object is a number : Infinity\n"); - break; - case -1: - fprintf(output, "Object is a number : -Infinity\n"); - break; - default: - if (xmlXPathIsNaN(cur->floatval)) { - fprintf(output, "Object is a number : NaN\n"); - } else if (cur->floatval == 0 && xmlXPathGetSign(cur->floatval) != 0) { - fprintf(output, "Object is a number : 0\n"); - } else { - fprintf(output, "Object is a number : %0g\n", cur->floatval); - } - } - break; - case XPATH_STRING: - fprintf(output, "Object is a string : "); - xmlDebugDumpString(output, cur->stringval); - fprintf(output, "\n"); - break; - case XPATH_POINT: - fprintf(output, "Object is a point : index %d in node", cur->index); - xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1); - fprintf(output, "\n"); - break; - case XPATH_RANGE: - if ((cur->user2 == NULL) || - ((cur->user2 == cur->user) && (cur->index == cur->index2))) { - fprintf(output, "Object is a collapsed range :\n"); - fprintf(output, shift); - if (cur->index >= 0) - fprintf(output, "index %d in ", cur->index); - fprintf(output, "node\n"); - xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, - depth + 1); - } else { - fprintf(output, "Object is a range :\n"); - fprintf(output, shift); - fprintf(output, "From "); - if (cur->index >= 0) - fprintf(output, "index %d in ", cur->index); - fprintf(output, "node\n"); - xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, - depth + 1); - fprintf(output, shift); - fprintf(output, "To "); - if (cur->index2 >= 0) - fprintf(output, "index %d in ", cur->index2); - fprintf(output, "node\n"); - xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user2, - depth + 1); - fprintf(output, "\n"); - } - break; - case XPATH_LOCATIONSET: -#if defined(LIBXML_XPTR_ENABLED) - fprintf(output, "Object is a Location Set:\n"); - xmlXPathDebugDumpLocationSet(output, - (xmlLocationSetPtr) cur->user, depth); -#endif - break; - case XPATH_USERS: - fprintf(output, "Object is user defined\n"); - break; - } -} - -static void -xmlXPathDebugDumpStepOp(FILE *output, xmlXPathCompExprPtr comp, - xmlXPathStepOpPtr op, int depth) { - int i; - char shift[100]; - - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - - fprintf(output, shift); - if (op == NULL) { - fprintf(output, "Step is NULL\n"); - return; - } - switch (op->op) { - case XPATH_OP_END: - fprintf(output, "END"); break; - case XPATH_OP_AND: - fprintf(output, "AND"); break; - case XPATH_OP_OR: - fprintf(output, "OR"); break; - case XPATH_OP_EQUAL: - if (op->value) - fprintf(output, "EQUAL ="); - else - fprintf(output, "EQUAL !="); - break; - case XPATH_OP_CMP: - if (op->value) - fprintf(output, "CMP <"); - else - fprintf(output, "CMP >"); - if (!op->value2) - fprintf(output, "="); - break; - case XPATH_OP_PLUS: - if (op->value == 0) - fprintf(output, "PLUS -"); - else if (op->value == 1) - fprintf(output, "PLUS +"); - else if (op->value == 2) - fprintf(output, "PLUS unary -"); - else if (op->value == 3) - fprintf(output, "PLUS unary - -"); - break; - case XPATH_OP_MULT: - if (op->value == 0) - fprintf(output, "MULT *"); - else if (op->value == 1) - fprintf(output, "MULT div"); - else - fprintf(output, "MULT mod"); - break; - case XPATH_OP_UNION: - fprintf(output, "UNION"); break; - case XPATH_OP_ROOT: - fprintf(output, "ROOT"); break; - case XPATH_OP_NODE: - fprintf(output, "NODE"); break; - case XPATH_OP_RESET: - fprintf(output, "RESET"); break; - case XPATH_OP_SORT: - fprintf(output, "SORT"); break; - case XPATH_OP_COLLECT: { - xmlXPathAxisVal axis = (xmlXPathAxisVal)op->value; - xmlXPathTestVal test = (xmlXPathTestVal)op->value2; - xmlXPathTypeVal type = (xmlXPathTypeVal)op->value3; - const xmlChar *prefix = op->value4; - const xmlChar *name = op->value5; - - fprintf(output, "COLLECT "); - switch (axis) { - case AXIS_ANCESTOR: - fprintf(output, " 'ancestors' "); break; - case AXIS_ANCESTOR_OR_SELF: - fprintf(output, " 'ancestors-or-self' "); break; - case AXIS_ATTRIBUTE: - fprintf(output, " 'attributes' "); break; - case AXIS_CHILD: - fprintf(output, " 'child' "); break; - case AXIS_DESCENDANT: - fprintf(output, " 'descendant' "); break; - case AXIS_DESCENDANT_OR_SELF: - fprintf(output, " 'descendant-or-self' "); break; - case AXIS_FOLLOWING: - fprintf(output, " 'following' "); break; - case AXIS_FOLLOWING_SIBLING: - fprintf(output, " 'following-siblings' "); break; - case AXIS_NAMESPACE: - fprintf(output, " 'namespace' "); break; - case AXIS_PARENT: - fprintf(output, " 'parent' "); break; - case AXIS_PRECEDING: - fprintf(output, " 'preceding' "); break; - case AXIS_PRECEDING_SIBLING: - fprintf(output, " 'preceding-sibling' "); break; - case AXIS_SELF: - fprintf(output, " 'self' "); break; - } - switch (test) { - case NODE_TEST_NONE: - fprintf(output, "'none' "); break; - case NODE_TEST_TYPE: - fprintf(output, "'type' "); break; - case NODE_TEST_PI: - fprintf(output, "'PI' "); break; - case NODE_TEST_ALL: - fprintf(output, "'all' "); break; - case NODE_TEST_NS: - fprintf(output, "'namespace' "); break; - case NODE_TEST_NAME: - fprintf(output, "'name' "); break; - } - switch (type) { - case NODE_TYPE_NODE: - fprintf(output, "'node' "); break; - case NODE_TYPE_COMMENT: - fprintf(output, "'comment' "); break; - case NODE_TYPE_TEXT: - fprintf(output, "'text' "); break; - case NODE_TYPE_PI: - fprintf(output, "'PI' "); break; - } - if (prefix != NULL) - fprintf(output, "%s:", prefix); - if (name != NULL) - fprintf(output, "%s", (const char *) name); - break; - - } - case XPATH_OP_VALUE: { - xmlXPathObjectPtr object = (xmlXPathObjectPtr) op->value4; - - fprintf(output, "ELEM "); - xmlXPathDebugDumpObject(output, object, 0); - goto finish; - } - case XPATH_OP_VARIABLE: { - const xmlChar *prefix = op->value5; - const xmlChar *name = op->value4; - - if (prefix != NULL) - fprintf(output, "VARIABLE %s:%s", prefix, name); - else - fprintf(output, "VARIABLE %s", name); - break; - } - case XPATH_OP_FUNCTION: { - int nbargs = op->value; - const xmlChar *prefix = op->value5; - const xmlChar *name = op->value4; - - if (prefix != NULL) - fprintf(output, "FUNCTION %s:%s(%d args)", - prefix, name, nbargs); - else - fprintf(output, "FUNCTION %s(%d args)", name, nbargs); - break; - } - case XPATH_OP_ARG: fprintf(output, "ARG"); break; - case XPATH_OP_PREDICATE: fprintf(output, "PREDICATE"); break; - case XPATH_OP_FILTER: fprintf(output, "FILTER"); break; -#ifdef LIBXML_XPTR_ENABLED - case XPATH_OP_RANGETO: fprintf(output, "RANGETO"); break; -#endif - default: - fprintf(output, "UNKNOWN %d\n", op->op); return; - } - fprintf(output, "\n"); -finish: - if (op->ch1 >= 0) - xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch1], depth + 1); - if (op->ch2 >= 0) - xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch2], depth + 1); -} - -/** - * xmlXPathDebugDumpCompExpr: - * @output: the FILE * for the output - * @comp: the precompiled XPath expression - * @depth: the indentation level. - * - * Dumps the tree of the compiled XPath expression. - */ -void -xmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp, - int depth) { - int i; - char shift[100]; - - if ((output == NULL) || (comp == NULL)) return; - - for (i = 0;((i < depth) && (i < 25));i++) - shift[2 * i] = shift[2 * i + 1] = ' '; - shift[2 * i] = shift[2 * i + 1] = 0; - - fprintf(output, shift); - - fprintf(output, "Compiled Expression : %d elements\n", - comp->nbStep); - i = comp->last; - xmlXPathDebugDumpStepOp(output, comp, &comp->steps[i], depth + 1); -} - -#ifdef XP_DEBUG_OBJ_USAGE - -/* -* XPath object usage related debugging variables. -*/ -static int xmlXPathDebugObjCounterUndefined = 0; -static int xmlXPathDebugObjCounterNodeset = 0; -static int xmlXPathDebugObjCounterBool = 0; -static int xmlXPathDebugObjCounterNumber = 0; -static int xmlXPathDebugObjCounterString = 0; -static int xmlXPathDebugObjCounterPoint = 0; -static int xmlXPathDebugObjCounterRange = 0; -static int xmlXPathDebugObjCounterLocset = 0; -static int xmlXPathDebugObjCounterUsers = 0; -static int xmlXPathDebugObjCounterXSLTTree = 0; -static int xmlXPathDebugObjCounterAll = 0; - -static int xmlXPathDebugObjTotalUndefined = 0; -static int xmlXPathDebugObjTotalNodeset = 0; -static int xmlXPathDebugObjTotalBool = 0; -static int xmlXPathDebugObjTotalNumber = 0; -static int xmlXPathDebugObjTotalString = 0; -static int xmlXPathDebugObjTotalPoint = 0; -static int xmlXPathDebugObjTotalRange = 0; -static int xmlXPathDebugObjTotalLocset = 0; -static int xmlXPathDebugObjTotalUsers = 0; -static int xmlXPathDebugObjTotalXSLTTree = 0; -static int xmlXPathDebugObjTotalAll = 0; - -static int xmlXPathDebugObjMaxUndefined = 0; -static int xmlXPathDebugObjMaxNodeset = 0; -static int xmlXPathDebugObjMaxBool = 0; -static int xmlXPathDebugObjMaxNumber = 0; -static int xmlXPathDebugObjMaxString = 0; -static int xmlXPathDebugObjMaxPoint = 0; -static int xmlXPathDebugObjMaxRange = 0; -static int xmlXPathDebugObjMaxLocset = 0; -static int xmlXPathDebugObjMaxUsers = 0; -static int xmlXPathDebugObjMaxXSLTTree = 0; -static int xmlXPathDebugObjMaxAll = 0; - -/* REVISIT TODO: Make this static when committing */ -static void -xmlXPathDebugObjUsageReset(xmlXPathContextPtr ctxt) -{ - if (ctxt != NULL) { - if (ctxt->cache != NULL) { - xmlXPathContextCachePtr cache = - (xmlXPathContextCachePtr) ctxt->cache; - - cache->dbgCachedAll = 0; - cache->dbgCachedNodeset = 0; - cache->dbgCachedString = 0; - cache->dbgCachedBool = 0; - cache->dbgCachedNumber = 0; - cache->dbgCachedPoint = 0; - cache->dbgCachedRange = 0; - cache->dbgCachedLocset = 0; - cache->dbgCachedUsers = 0; - cache->dbgCachedXSLTTree = 0; - cache->dbgCachedUndefined = 0; - - cache->dbgReusedAll = 0; - cache->dbgReusedNodeset = 0; - cache->dbgReusedString = 0; - cache->dbgReusedBool = 0; - cache->dbgReusedNumber = 0; - cache->dbgReusedPoint = 0; - cache->dbgReusedRange = 0; - cache->dbgReusedLocset = 0; - cache->dbgReusedUsers = 0; - cache->dbgReusedXSLTTree = 0; - cache->dbgReusedUndefined = 0; - } - } - - xmlXPathDebugObjCounterUndefined = 0; - xmlXPathDebugObjCounterNodeset = 0; - xmlXPathDebugObjCounterBool = 0; - xmlXPathDebugObjCounterNumber = 0; - xmlXPathDebugObjCounterString = 0; - xmlXPathDebugObjCounterPoint = 0; - xmlXPathDebugObjCounterRange = 0; - xmlXPathDebugObjCounterLocset = 0; - xmlXPathDebugObjCounterUsers = 0; - xmlXPathDebugObjCounterXSLTTree = 0; - xmlXPathDebugObjCounterAll = 0; - - xmlXPathDebugObjTotalUndefined = 0; - xmlXPathDebugObjTotalNodeset = 0; - xmlXPathDebugObjTotalBool = 0; - xmlXPathDebugObjTotalNumber = 0; - xmlXPathDebugObjTotalString = 0; - xmlXPathDebugObjTotalPoint = 0; - xmlXPathDebugObjTotalRange = 0; - xmlXPathDebugObjTotalLocset = 0; - xmlXPathDebugObjTotalUsers = 0; - xmlXPathDebugObjTotalXSLTTree = 0; - xmlXPathDebugObjTotalAll = 0; - - xmlXPathDebugObjMaxUndefined = 0; - xmlXPathDebugObjMaxNodeset = 0; - xmlXPathDebugObjMaxBool = 0; - xmlXPathDebugObjMaxNumber = 0; - xmlXPathDebugObjMaxString = 0; - xmlXPathDebugObjMaxPoint = 0; - xmlXPathDebugObjMaxRange = 0; - xmlXPathDebugObjMaxLocset = 0; - xmlXPathDebugObjMaxUsers = 0; - xmlXPathDebugObjMaxXSLTTree = 0; - xmlXPathDebugObjMaxAll = 0; - -} - -static void -xmlXPathDebugObjUsageRequested(xmlXPathContextPtr ctxt, - xmlXPathObjectType objType) -{ - int isCached = 0; - - if (ctxt != NULL) { - if (ctxt->cache != NULL) { - xmlXPathContextCachePtr cache = - (xmlXPathContextCachePtr) ctxt->cache; - - isCached = 1; - - cache->dbgReusedAll++; - switch (objType) { - case XPATH_UNDEFINED: - cache->dbgReusedUndefined++; - break; - case XPATH_NODESET: - cache->dbgReusedNodeset++; - break; - case XPATH_BOOLEAN: - cache->dbgReusedBool++; - break; - case XPATH_NUMBER: - cache->dbgReusedNumber++; - break; - case XPATH_STRING: - cache->dbgReusedString++; - break; - case XPATH_POINT: - cache->dbgReusedPoint++; - break; - case XPATH_RANGE: - cache->dbgReusedRange++; - break; - case XPATH_LOCATIONSET: - cache->dbgReusedLocset++; - break; - case XPATH_USERS: - cache->dbgReusedUsers++; - break; - case XPATH_XSLT_TREE: - cache->dbgReusedXSLTTree++; - break; - default: - break; - } - } - } - - switch (objType) { - case XPATH_UNDEFINED: - if (! isCached) - xmlXPathDebugObjTotalUndefined++; - xmlXPathDebugObjCounterUndefined++; - if (xmlXPathDebugObjCounterUndefined > - xmlXPathDebugObjMaxUndefined) - xmlXPathDebugObjMaxUndefined = - xmlXPathDebugObjCounterUndefined; - break; - case XPATH_NODESET: - if (! isCached) - xmlXPathDebugObjTotalNodeset++; - xmlXPathDebugObjCounterNodeset++; - if (xmlXPathDebugObjCounterNodeset > - xmlXPathDebugObjMaxNodeset) - xmlXPathDebugObjMaxNodeset = - xmlXPathDebugObjCounterNodeset; - break; - case XPATH_BOOLEAN: - if (! isCached) - xmlXPathDebugObjTotalBool++; - xmlXPathDebugObjCounterBool++; - if (xmlXPathDebugObjCounterBool > - xmlXPathDebugObjMaxBool) - xmlXPathDebugObjMaxBool = - xmlXPathDebugObjCounterBool; - break; - case XPATH_NUMBER: - if (! isCached) - xmlXPathDebugObjTotalNumber++; - xmlXPathDebugObjCounterNumber++; - if (xmlXPathDebugObjCounterNumber > - xmlXPathDebugObjMaxNumber) - xmlXPathDebugObjMaxNumber = - xmlXPathDebugObjCounterNumber; - break; - case XPATH_STRING: - if (! isCached) - xmlXPathDebugObjTotalString++; - xmlXPathDebugObjCounterString++; - if (xmlXPathDebugObjCounterString > - xmlXPathDebugObjMaxString) - xmlXPathDebugObjMaxString = - xmlXPathDebugObjCounterString; - break; - case XPATH_POINT: - if (! isCached) - xmlXPathDebugObjTotalPoint++; - xmlXPathDebugObjCounterPoint++; - if (xmlXPathDebugObjCounterPoint > - xmlXPathDebugObjMaxPoint) - xmlXPathDebugObjMaxPoint = - xmlXPathDebugObjCounterPoint; - break; - case XPATH_RANGE: - if (! isCached) - xmlXPathDebugObjTotalRange++; - xmlXPathDebugObjCounterRange++; - if (xmlXPathDebugObjCounterRange > - xmlXPathDebugObjMaxRange) - xmlXPathDebugObjMaxRange = - xmlXPathDebugObjCounterRange; - break; - case XPATH_LOCATIONSET: - if (! isCached) - xmlXPathDebugObjTotalLocset++; - xmlXPathDebugObjCounterLocset++; - if (xmlXPathDebugObjCounterLocset > - xmlXPathDebugObjMaxLocset) - xmlXPathDebugObjMaxLocset = - xmlXPathDebugObjCounterLocset; - break; - case XPATH_USERS: - if (! isCached) - xmlXPathDebugObjTotalUsers++; - xmlXPathDebugObjCounterUsers++; - if (xmlXPathDebugObjCounterUsers > - xmlXPathDebugObjMaxUsers) - xmlXPathDebugObjMaxUsers = - xmlXPathDebugObjCounterUsers; - break; - case XPATH_XSLT_TREE: - if (! isCached) - xmlXPathDebugObjTotalXSLTTree++; - xmlXPathDebugObjCounterXSLTTree++; - if (xmlXPathDebugObjCounterXSLTTree > - xmlXPathDebugObjMaxXSLTTree) - xmlXPathDebugObjMaxXSLTTree = - xmlXPathDebugObjCounterXSLTTree; - break; - default: - break; - } - if (! isCached) - xmlXPathDebugObjTotalAll++; - xmlXPathDebugObjCounterAll++; - if (xmlXPathDebugObjCounterAll > - xmlXPathDebugObjMaxAll) - xmlXPathDebugObjMaxAll = - xmlXPathDebugObjCounterAll; -} - -static void -xmlXPathDebugObjUsageReleased(xmlXPathContextPtr ctxt, - xmlXPathObjectType objType) -{ - int isCached = 0; - - if (ctxt != NULL) { - if (ctxt->cache != NULL) { - xmlXPathContextCachePtr cache = - (xmlXPathContextCachePtr) ctxt->cache; - - isCached = 1; - - cache->dbgCachedAll++; - switch (objType) { - case XPATH_UNDEFINED: - cache->dbgCachedUndefined++; - break; - case XPATH_NODESET: - cache->dbgCachedNodeset++; - break; - case XPATH_BOOLEAN: - cache->dbgCachedBool++; - break; - case XPATH_NUMBER: - cache->dbgCachedNumber++; - break; - case XPATH_STRING: - cache->dbgCachedString++; - break; - case XPATH_POINT: - cache->dbgCachedPoint++; - break; - case XPATH_RANGE: - cache->dbgCachedRange++; - break; - case XPATH_LOCATIONSET: - cache->dbgCachedLocset++; - break; - case XPATH_USERS: - cache->dbgCachedUsers++; - break; - case XPATH_XSLT_TREE: - cache->dbgCachedXSLTTree++; - break; - default: - break; - } - - } - } - switch (objType) { - case XPATH_UNDEFINED: - xmlXPathDebugObjCounterUndefined--; - break; - case XPATH_NODESET: - xmlXPathDebugObjCounterNodeset--; - break; - case XPATH_BOOLEAN: - xmlXPathDebugObjCounterBool--; - break; - case XPATH_NUMBER: - xmlXPathDebugObjCounterNumber--; - break; - case XPATH_STRING: - xmlXPathDebugObjCounterString--; - break; - case XPATH_POINT: - xmlXPathDebugObjCounterPoint--; - break; - case XPATH_RANGE: - xmlXPathDebugObjCounterRange--; - break; - case XPATH_LOCATIONSET: - xmlXPathDebugObjCounterLocset--; - break; - case XPATH_USERS: - xmlXPathDebugObjCounterUsers--; - break; - case XPATH_XSLT_TREE: - xmlXPathDebugObjCounterXSLTTree--; - break; - default: - break; - } - xmlXPathDebugObjCounterAll--; -} - -/* REVISIT TODO: Make this static when committing */ -static void -xmlXPathDebugObjUsageDisplay(xmlXPathContextPtr ctxt) -{ - int reqAll, reqNodeset, reqString, reqBool, reqNumber, - reqXSLTTree, reqUndefined; - int caAll = 0, caNodeset = 0, caString = 0, caBool = 0, - caNumber = 0, caXSLTTree = 0, caUndefined = 0; - int reAll = 0, reNodeset = 0, reString = 0, reBool = 0, - reNumber = 0, reXSLTTree = 0, reUndefined = 0; - int leftObjs = xmlXPathDebugObjCounterAll; - - reqAll = xmlXPathDebugObjTotalAll; - reqNodeset = xmlXPathDebugObjTotalNodeset; - reqString = xmlXPathDebugObjTotalString; - reqBool = xmlXPathDebugObjTotalBool; - reqNumber = xmlXPathDebugObjTotalNumber; - reqXSLTTree = xmlXPathDebugObjTotalXSLTTree; - reqUndefined = xmlXPathDebugObjTotalUndefined; - - printf("# XPath object usage:\n"); - - if (ctxt != NULL) { - if (ctxt->cache != NULL) { - xmlXPathContextCachePtr cache = - (xmlXPathContextCachePtr) ctxt->cache; - - reAll = cache->dbgReusedAll; - reqAll += reAll; - reNodeset = cache->dbgReusedNodeset; - reqNodeset += reNodeset; - reString = cache->dbgReusedString; - reqString += reString; - reBool = cache->dbgReusedBool; - reqBool += reBool; - reNumber = cache->dbgReusedNumber; - reqNumber += reNumber; - reXSLTTree = cache->dbgReusedXSLTTree; - reqXSLTTree += reXSLTTree; - reUndefined = cache->dbgReusedUndefined; - reqUndefined += reUndefined; - - caAll = cache->dbgCachedAll; - caBool = cache->dbgCachedBool; - caNodeset = cache->dbgCachedNodeset; - caString = cache->dbgCachedString; - caNumber = cache->dbgCachedNumber; - caXSLTTree = cache->dbgCachedXSLTTree; - caUndefined = cache->dbgCachedUndefined; - - if (cache->nodesetObjs) - leftObjs -= cache->nodesetObjs->number; - if (cache->stringObjs) - leftObjs -= cache->stringObjs->number; - if (cache->booleanObjs) - leftObjs -= cache->booleanObjs->number; - if (cache->numberObjs) - leftObjs -= cache->numberObjs->number; - if (cache->miscObjs) - leftObjs -= cache->miscObjs->number; - } - } - - printf("# all\n"); - printf("# total : %d\n", reqAll); - printf("# left : %d\n", leftObjs); - printf("# created: %d\n", xmlXPathDebugObjTotalAll); - printf("# reused : %d\n", reAll); - printf("# max : %d\n", xmlXPathDebugObjMaxAll); - - printf("# node-sets\n"); - printf("# total : %d\n", reqNodeset); - printf("# created: %d\n", xmlXPathDebugObjTotalNodeset); - printf("# reused : %d\n", reNodeset); - printf("# max : %d\n", xmlXPathDebugObjMaxNodeset); - - printf("# strings\n"); - printf("# total : %d\n", reqString); - printf("# created: %d\n", xmlXPathDebugObjTotalString); - printf("# reused : %d\n", reString); - printf("# max : %d\n", xmlXPathDebugObjMaxString); - - printf("# booleans\n"); - printf("# total : %d\n", reqBool); - printf("# created: %d\n", xmlXPathDebugObjTotalBool); - printf("# reused : %d\n", reBool); - printf("# max : %d\n", xmlXPathDebugObjMaxBool); - - printf("# numbers\n"); - printf("# total : %d\n", reqNumber); - printf("# created: %d\n", xmlXPathDebugObjTotalNumber); - printf("# reused : %d\n", reNumber); - printf("# max : %d\n", xmlXPathDebugObjMaxNumber); - - printf("# XSLT result tree fragments\n"); - printf("# total : %d\n", reqXSLTTree); - printf("# created: %d\n", xmlXPathDebugObjTotalXSLTTree); - printf("# reused : %d\n", reXSLTTree); - printf("# max : %d\n", xmlXPathDebugObjMaxXSLTTree); - - printf("# undefined\n"); - printf("# total : %d\n", reqUndefined); - printf("# created: %d\n", xmlXPathDebugObjTotalUndefined); - printf("# reused : %d\n", reUndefined); - printf("# max : %d\n", xmlXPathDebugObjMaxUndefined); - -} - -#endif /* XP_DEBUG_OBJ_USAGE */ - -#endif /* LIBXML_DEBUG_ENABLED */ - -/************************************************************************ - * * - * XPath object caching * - * * - ************************************************************************/ - -/** - * xmlXPathNewCache: - * - * Create a new object cache - * - * Returns the xmlXPathCache just allocated. - */ -static xmlXPathContextCachePtr -xmlXPathNewCache(void) -{ - xmlXPathContextCachePtr ret; - - ret = (xmlXPathContextCachePtr) xmlMalloc(sizeof(xmlXPathContextCache)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating object cache\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathContextCache)); - ret->maxNodeset = 100; - ret->maxString = 100; - ret->maxBoolean = 100; - ret->maxNumber = 100; - ret->maxMisc = 100; - return(ret); -} - -static void -xmlXPathCacheFreeObjectList(xmlPointerListPtr list) -{ - int i; - xmlXPathObjectPtr obj; - - if (list == NULL) - return; - - for (i = 0; i < list->number; i++) { - obj = list->items[i]; - /* - * Note that it is already assured that we don't need to - * look out for namespace nodes in the node-set. - */ - if (obj->nodesetval != NULL) { - if (obj->nodesetval->nodeTab != NULL) - xmlFree(obj->nodesetval->nodeTab); - xmlFree(obj->nodesetval); - } - xmlFree(obj); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjCounterAll--; -#endif - } - xmlPointerListFree(list); -} - -static void -xmlXPathFreeCache(xmlXPathContextCachePtr cache) -{ - if (cache == NULL) - return; - if (cache->nodesetObjs) - xmlXPathCacheFreeObjectList(cache->nodesetObjs); - if (cache->stringObjs) - xmlXPathCacheFreeObjectList(cache->stringObjs); - if (cache->booleanObjs) - xmlXPathCacheFreeObjectList(cache->booleanObjs); - if (cache->numberObjs) - xmlXPathCacheFreeObjectList(cache->numberObjs); - if (cache->miscObjs) - xmlXPathCacheFreeObjectList(cache->miscObjs); - xmlFree(cache); -} - -/** - * xmlXPathContextSetCache: - * - * @ctxt: the XPath context - * @active: enables/disables (creates/frees) the cache - * @value: a value with semantics dependant on @options - * @options: options (currently only the value 0 is used) - * - * Creates/frees an object cache on the XPath context. - * If activates XPath objects (xmlXPathObject) will be cached internally - * to be reused. - * @options: - * 0: This will set the XPath object caching: - * @value: - * This will set the maximum number of XPath objects - * to be cached per slot - * There are 5 slots for: node-set, string, number, boolean, and - * misc objects. Use <0 for the default number (100). - * Other values for @options have currently no effect. - * - * Returns 0 if the setting succeeded, and -1 on API or internal errors. - */ -int -xmlXPathContextSetCache(xmlXPathContextPtr ctxt, - int active, - int value, - int options) -{ - if (ctxt == NULL) - return(-1); - if (active) { - xmlXPathContextCachePtr cache; - - if (ctxt->cache == NULL) { - ctxt->cache = xmlXPathNewCache(); - if (ctxt->cache == NULL) - return(-1); - } - cache = (xmlXPathContextCachePtr) ctxt->cache; - if (options == 0) { - if (value < 0) - value = 100; - cache->maxNodeset = value; - cache->maxString = value; - cache->maxNumber = value; - cache->maxBoolean = value; - cache->maxMisc = value; - } - } else if (ctxt->cache != NULL) { - xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); - ctxt->cache = NULL; - } - return(0); -} - -/** - * xmlXPathCacheWrapNodeSet: - * @ctxt: the XPath context - * @val: the NodePtr value - * - * This is the cached version of xmlXPathWrapNodeSet(). - * Wrap the Nodeset @val in a new xmlXPathObjectPtr - * - * Returns the created or reused object. - */ -static xmlXPathObjectPtr -xmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr val) -{ - if ((ctxt != NULL) && (ctxt->cache != NULL)) { - xmlXPathContextCachePtr cache = - (xmlXPathContextCachePtr) ctxt->cache; - - if ((cache->miscObjs != NULL) && - (cache->miscObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->miscObjs->items[--cache->miscObjs->number]; - ret->type = XPATH_NODESET; - ret->nodesetval = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); -#endif - return(ret); - } - } - - return(xmlXPathWrapNodeSet(val)); - -} - -/** - * xmlXPathCacheWrapString: - * @ctxt: the XPath context - * @val: the xmlChar * value - * - * This is the cached version of xmlXPathWrapString(). - * Wraps the @val string into an XPath object. - * - * Returns the created or reused object. - */ -static xmlXPathObjectPtr -xmlXPathCacheWrapString(xmlXPathContextPtr ctxt, xmlChar *val) -{ - if ((ctxt != NULL) && (ctxt->cache != NULL)) { - xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; - - if ((cache->stringObjs != NULL) && - (cache->stringObjs->number != 0)) - { - - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->stringObjs->items[--cache->stringObjs->number]; - ret->type = XPATH_STRING; - ret->stringval = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); -#endif - return(ret); - } else if ((cache->miscObjs != NULL) && - (cache->miscObjs->number != 0)) - { - xmlXPathObjectPtr ret; - /* - * Fallback to misc-cache. - */ - ret = (xmlXPathObjectPtr) - cache->miscObjs->items[--cache->miscObjs->number]; - - ret->type = XPATH_STRING; - ret->stringval = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); -#endif - return(ret); - } - } - return(xmlXPathWrapString(val)); -} - -/** - * xmlXPathCacheNewNodeSet: - * @ctxt: the XPath context - * @val: the NodePtr value - * - * This is the cached version of xmlXPathNewNodeSet(). - * Acquire an xmlXPathObjectPtr of type NodeSet and initialize - * it with the single Node @val - * - * Returns the created or reused object. - */ -static xmlXPathObjectPtr -xmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val) -{ - if ((ctxt != NULL) && (ctxt->cache)) { - xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; - - if ((cache->nodesetObjs != NULL) && - (cache->nodesetObjs->number != 0)) - { - xmlXPathObjectPtr ret; - /* - * Use the nodset-cache. - */ - ret = (xmlXPathObjectPtr) - cache->nodesetObjs->items[--cache->nodesetObjs->number]; - ret->type = XPATH_NODESET; - ret->boolval = 0; - if (val) { - if ((ret->nodesetval->nodeMax == 0) || - (val->type == XML_NAMESPACE_DECL)) - { - xmlXPathNodeSetAddUnique(ret->nodesetval, val); - } else { - ret->nodesetval->nodeTab[0] = val; - ret->nodesetval->nodeNr = 1; - } - } -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); -#endif - return(ret); - } else if ((cache->miscObjs != NULL) && - (cache->miscObjs->number != 0)) - { - xmlXPathObjectPtr ret; - /* - * Fallback to misc-cache. - */ - - ret = (xmlXPathObjectPtr) - cache->miscObjs->items[--cache->miscObjs->number]; - - ret->type = XPATH_NODESET; - ret->boolval = 0; - ret->nodesetval = xmlXPathNodeSetCreate(val); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); -#endif - return(ret); - } - } - return(xmlXPathNewNodeSet(val)); -} - -/** - * xmlXPathCacheNewCString: - * @ctxt: the XPath context - * @val: the char * value - * - * This is the cached version of xmlXPathNewCString(). - * Acquire an xmlXPathObjectPtr of type string and of value @val - * - * Returns the created or reused object. - */ -static xmlXPathObjectPtr -xmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val) -{ - if ((ctxt != NULL) && (ctxt->cache)) { - xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; - - if ((cache->stringObjs != NULL) && - (cache->stringObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->stringObjs->items[--cache->stringObjs->number]; - - ret->type = XPATH_STRING; - ret->stringval = xmlStrdup(BAD_CAST val); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); -#endif - return(ret); - } else if ((cache->miscObjs != NULL) && - (cache->miscObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->miscObjs->items[--cache->miscObjs->number]; - - ret->type = XPATH_STRING; - ret->stringval = xmlStrdup(BAD_CAST val); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); -#endif - return(ret); - } - } - return(xmlXPathNewCString(val)); -} - -/** - * xmlXPathCacheNewString: - * @ctxt: the XPath context - * @val: the xmlChar * value - * - * This is the cached version of xmlXPathNewString(). - * Acquire an xmlXPathObjectPtr of type string and of value @val - * - * Returns the created or reused object. - */ -static xmlXPathObjectPtr -xmlXPathCacheNewString(xmlXPathContextPtr ctxt, const xmlChar *val) -{ - if ((ctxt != NULL) && (ctxt->cache)) { - xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; - - if ((cache->stringObjs != NULL) && - (cache->stringObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->stringObjs->items[--cache->stringObjs->number]; - ret->type = XPATH_STRING; - if (val != NULL) - ret->stringval = xmlStrdup(val); - else - ret->stringval = xmlStrdup((const xmlChar *)""); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); -#endif - return(ret); - } else if ((cache->miscObjs != NULL) && - (cache->miscObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->miscObjs->items[--cache->miscObjs->number]; - - ret->type = XPATH_STRING; - if (val != NULL) - ret->stringval = xmlStrdup(val); - else - ret->stringval = xmlStrdup((const xmlChar *)""); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); -#endif - return(ret); - } - } - return(xmlXPathNewString(val)); -} - -/** - * xmlXPathCacheNewBoolean: - * @ctxt: the XPath context - * @val: the boolean value - * - * This is the cached version of xmlXPathNewBoolean(). - * Acquires an xmlXPathObjectPtr of type boolean and of value @val - * - * Returns the created or reused object. - */ -static xmlXPathObjectPtr -xmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt, int val) -{ - if ((ctxt != NULL) && (ctxt->cache)) { - xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; - - if ((cache->booleanObjs != NULL) && - (cache->booleanObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->booleanObjs->items[--cache->booleanObjs->number]; - ret->type = XPATH_BOOLEAN; - ret->boolval = (val != 0); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); -#endif - return(ret); - } else if ((cache->miscObjs != NULL) && - (cache->miscObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->miscObjs->items[--cache->miscObjs->number]; - - ret->type = XPATH_BOOLEAN; - ret->boolval = (val != 0); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); -#endif - return(ret); - } - } - return(xmlXPathNewBoolean(val)); -} - -/** - * xmlXPathCacheNewFloat: - * @ctxt: the XPath context - * @val: the double value - * - * This is the cached version of xmlXPathNewFloat(). - * Acquires an xmlXPathObjectPtr of type double and of value @val - * - * Returns the created or reused object. - */ -static xmlXPathObjectPtr -xmlXPathCacheNewFloat(xmlXPathContextPtr ctxt, double val) -{ - if ((ctxt != NULL) && (ctxt->cache)) { - xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; - - if ((cache->numberObjs != NULL) && - (cache->numberObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->numberObjs->items[--cache->numberObjs->number]; - ret->type = XPATH_NUMBER; - ret->floatval = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); -#endif - return(ret); - } else if ((cache->miscObjs != NULL) && - (cache->miscObjs->number != 0)) - { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) - cache->miscObjs->items[--cache->miscObjs->number]; - - ret->type = XPATH_NUMBER; - ret->floatval = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); -#endif - return(ret); - } - } - return(xmlXPathNewFloat(val)); -} - -/** - * xmlXPathCacheConvertString: - * @ctxt: the XPath context - * @val: an XPath object - * - * This is the cached version of xmlXPathConvertString(). - * Converts an existing object to its string() equivalent - * - * Returns a created or reused object, the old one is freed (cached) - * (or the operation is done directly on @val) - */ - -static xmlXPathObjectPtr -xmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { - xmlChar *res = NULL; - - if (val == NULL) - return(xmlXPathCacheNewCString(ctxt, "")); - - switch (val->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); -#endif - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - res = xmlXPathCastNodeSetToString(val->nodesetval); - break; - case XPATH_STRING: - return(val); - case XPATH_BOOLEAN: - res = xmlXPathCastBooleanToString(val->boolval); - break; - case XPATH_NUMBER: - res = xmlXPathCastNumberToString(val->floatval); - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO; - break; - } - xmlXPathReleaseObject(ctxt, val); - if (res == NULL) - return(xmlXPathCacheNewCString(ctxt, "")); - return(xmlXPathCacheWrapString(ctxt, res)); -} - -/** - * xmlXPathCacheObjectCopy: - * @ctxt: the XPath context - * @val: the original object - * - * This is the cached version of xmlXPathObjectCopy(). - * Acquire a copy of a given object - * - * Returns a created or reused created object. - */ -static xmlXPathObjectPtr -xmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) -{ - if (val == NULL) - return(NULL); - - if (XP_HAS_CACHE(ctxt)) { - switch (val->type) { - case XPATH_NODESET: - return(xmlXPathCacheWrapNodeSet(ctxt, - xmlXPathNodeSetMerge(NULL, val->nodesetval))); - case XPATH_STRING: - return(xmlXPathCacheNewString(ctxt, val->stringval)); - case XPATH_BOOLEAN: - return(xmlXPathCacheNewBoolean(ctxt, val->boolval)); - case XPATH_NUMBER: - return(xmlXPathCacheNewFloat(ctxt, val->floatval)); - default: - break; - } - } - return(xmlXPathObjectCopy(val)); -} - -/** - * xmlXPathCacheConvertBoolean: - * @ctxt: the XPath context - * @val: an XPath object - * - * This is the cached version of xmlXPathConvertBoolean(). - * Converts an existing object to its boolean() equivalent - * - * Returns a created or reused object, the old one is freed (or the operation - * is done directly on @val) - */ -static xmlXPathObjectPtr -xmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { - xmlXPathObjectPtr ret; - - if (val == NULL) - return(xmlXPathCacheNewBoolean(ctxt, 0)); - if (val->type == XPATH_BOOLEAN) - return(val); - ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(val)); - xmlXPathReleaseObject(ctxt, val); - return(ret); -} - -/** - * xmlXPathCacheConvertNumber: - * @ctxt: the XPath context - * @val: an XPath object - * - * This is the cached version of xmlXPathConvertNumber(). - * Converts an existing object to its number() equivalent - * - * Returns a created or reused object, the old one is freed (or the operation - * is done directly on @val) - */ -static xmlXPathObjectPtr -xmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { - xmlXPathObjectPtr ret; - - if (val == NULL) - return(xmlXPathCacheNewFloat(ctxt, 0.0)); - if (val->type == XPATH_NUMBER) - return(val); - ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(val)); - xmlXPathReleaseObject(ctxt, val); - return(ret); -} - -/************************************************************************ - * * - * Parser stacks related functions and macros * - * * - ************************************************************************/ - -/** - * valuePop: - * @ctxt: an XPath evaluation context - * - * Pops the top XPath object from the value stack - * - * Returns the XPath object just removed - */ -xmlXPathObjectPtr -valuePop(xmlXPathParserContextPtr ctxt) -{ - xmlXPathObjectPtr ret; - - if ((ctxt == NULL) || (ctxt->valueNr <= 0)) - return (NULL); - ctxt->valueNr--; - if (ctxt->valueNr > 0) - ctxt->value = ctxt->valueTab[ctxt->valueNr - 1]; - else - ctxt->value = NULL; - ret = ctxt->valueTab[ctxt->valueNr]; - ctxt->valueTab[ctxt->valueNr] = NULL; - return (ret); -} -/** - * valuePush: - * @ctxt: an XPath evaluation context - * @value: the XPath object - * - * Pushes a new XPath object on top of the value stack - * - * returns the number of items on the value stack - */ -int -valuePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value) -{ - if ((ctxt == NULL) || (value == NULL)) return(-1); - if (ctxt->valueNr >= ctxt->valueMax) { - xmlXPathObjectPtr *tmp; - - tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab, - 2 * ctxt->valueMax * - sizeof(ctxt->valueTab[0])); - if (tmp == NULL) { - xmlGenericError(xmlGenericErrorContext, "realloc failed !\n"); - return (0); - } - ctxt->valueMax *= 2; - ctxt->valueTab = tmp; - } - ctxt->valueTab[ctxt->valueNr] = value; - ctxt->value = value; - return (ctxt->valueNr++); -} - -/** - * xmlXPathPopBoolean: - * @ctxt: an XPath parser context - * - * Pops a boolean from the stack, handling conversion if needed. - * Check error with #xmlXPathCheckError. - * - * Returns the boolean - */ -int -xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr obj; - int ret; - - obj = valuePop(ctxt); - if (obj == NULL) { - xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); - return(0); - } - if (obj->type != XPATH_BOOLEAN) - ret = xmlXPathCastToBoolean(obj); - else - ret = obj->boolval; - xmlXPathReleaseObject(ctxt->context, obj); - return(ret); -} - -/** - * xmlXPathPopNumber: - * @ctxt: an XPath parser context - * - * Pops a number from the stack, handling conversion if needed. - * Check error with #xmlXPathCheckError. - * - * Returns the number - */ -double -xmlXPathPopNumber (xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr obj; - double ret; - - obj = valuePop(ctxt); - if (obj == NULL) { - xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); - return(0); - } - if (obj->type != XPATH_NUMBER) - ret = xmlXPathCastToNumber(obj); - else - ret = obj->floatval; - xmlXPathReleaseObject(ctxt->context, obj); - return(ret); -} - -/** - * xmlXPathPopString: - * @ctxt: an XPath parser context - * - * Pops a string from the stack, handling conversion if needed. - * Check error with #xmlXPathCheckError. - * - * Returns the string - */ -xmlChar * -xmlXPathPopString (xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr obj; - xmlChar * ret; - - obj = valuePop(ctxt); - if (obj == NULL) { - xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); - return(NULL); - } - ret = xmlXPathCastToString(obj); /* this does required strdup */ - /* TODO: needs refactoring somewhere else */ - if (obj->stringval == ret) - obj->stringval = NULL; - xmlXPathReleaseObject(ctxt->context, obj); - return(ret); -} - -/** - * xmlXPathPopNodeSet: - * @ctxt: an XPath parser context - * - * Pops a node-set from the stack, handling conversion if needed. - * Check error with #xmlXPathCheckError. - * - * Returns the node-set - */ -xmlNodeSetPtr -xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr obj; - xmlNodeSetPtr ret; - - if (ctxt == NULL) return(NULL); - if (ctxt->value == NULL) { - xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); - return(NULL); - } - if (!xmlXPathStackIsNodeSet(ctxt)) { - xmlXPathSetTypeError(ctxt); - return(NULL); - } - obj = valuePop(ctxt); - ret = obj->nodesetval; -#if 0 - /* to fix memory leak of not clearing obj->user */ - if (obj->boolval && obj->user != NULL) - xmlFreeNodeList((xmlNodePtr) obj->user); -#endif - obj->nodesetval = NULL; - xmlXPathReleaseObject(ctxt->context, obj); - return(ret); -} - -/** - * xmlXPathPopExternal: - * @ctxt: an XPath parser context - * - * Pops an external object from the stack, handling conversion if needed. - * Check error with #xmlXPathCheckError. - * - * Returns the object - */ -void * -xmlXPathPopExternal (xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr obj; - void * ret; - - if ((ctxt == NULL) || (ctxt->value == NULL)) { - xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); - return(NULL); - } - if (ctxt->value->type != XPATH_USERS) { - xmlXPathSetTypeError(ctxt); - return(NULL); - } - obj = valuePop(ctxt); - ret = obj->user; - obj->user = NULL; - xmlXPathReleaseObject(ctxt->context, obj); - return(ret); -} - -/* - * Macros for accessing the content. Those should be used only by the parser, - * and not exported. - * - * Dirty macros, i.e. one need to make assumption on the context to use them - * - * CUR_PTR return the current pointer to the xmlChar to be parsed. - * CUR returns the current xmlChar value, i.e. a 8 bit value - * in ISO-Latin or UTF-8. - * This should be used internally by the parser - * only to compare to ASCII values otherwise it would break when - * running with UTF-8 encoding. - * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only - * to compare on ASCII based substring. - * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined - * strings within the parser. - * CURRENT Returns the current char value, with the full decoding of - * UTF-8 if we are using this mode. It returns an int. - * NEXT Skip to the next character, this does the proper decoding - * in UTF-8 mode. It also pop-up unfinished entities on the fly. - * It returns the pointer to the current xmlChar. - */ - -#define CUR (*ctxt->cur) -#define SKIP(val) ctxt->cur += (val) -#define NXT(val) ctxt->cur[(val)] -#define CUR_PTR ctxt->cur -#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l) - -#define COPY_BUF(l,b,i,v) \ - if (l == 1) b[i++] = (xmlChar) v; \ - else i += xmlCopyChar(l,&b[i],v) - -#define NEXTL(l) ctxt->cur += l - -#define SKIP_BLANKS \ - while (IS_BLANK_CH(*(ctxt->cur))) NEXT - -#define CURRENT (*ctxt->cur) -#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) - - -#ifndef DBL_DIG -#define DBL_DIG 16 -#endif -#ifndef DBL_EPSILON -#define DBL_EPSILON 1E-9 -#endif - -#define UPPER_DOUBLE 1E9 -#define LOWER_DOUBLE 1E-5 - -#define INTEGER_DIGITS DBL_DIG -#define FRACTION_DIGITS (DBL_DIG + 1) -#define EXPONENT_DIGITS (3 + 2) - -/** - * xmlXPathFormatNumber: - * @number: number to format - * @buffer: output buffer - * @buffersize: size of output buffer - * - * Convert the number into a string representation. - */ -static void -xmlXPathFormatNumber(double number, char buffer[], int buffersize) -{ - switch (xmlXPathIsInf(number)) { - case 1: - if (buffersize > (int)sizeof("Infinity")) - snprintf(buffer, buffersize, "Infinity"); - break; - case -1: - if (buffersize > (int)sizeof("-Infinity")) - snprintf(buffer, buffersize, "-Infinity"); - break; - default: - if (xmlXPathIsNaN(number)) { - if (buffersize > (int)sizeof("NaN")) - snprintf(buffer, buffersize, "NaN"); - } else if (number == 0 && xmlXPathGetSign(number) != 0) { - snprintf(buffer, buffersize, "0"); - } else if (number == ((int) number)) { - char work[30]; - char *ptr, *cur; - int value = (int) number; - - ptr = &buffer[0]; - if (value == 0) { - *ptr++ = '0'; - } else { - snprintf(work, 29, "%d", value); - cur = &work[0]; - while ((*cur) && (ptr - buffer < buffersize)) { - *ptr++ = *cur++; - } - } - if (ptr - buffer < buffersize) { - *ptr = 0; - } else if (buffersize > 0) { - ptr--; - *ptr = 0; - } - } else { - /* 3 is sign, decimal point, and terminating zero */ - char work[DBL_DIG + EXPONENT_DIGITS + 3]; - int integer_place, fraction_place; - char *ptr; - char *after_fraction; - double absolute_value; - int size; - - absolute_value = fabs(number); - - /* - * First choose format - scientific or regular floating point. - * In either case, result is in work, and after_fraction points - * just past the fractional part. - */ - if ( ((absolute_value > UPPER_DOUBLE) || - (absolute_value < LOWER_DOUBLE)) && - (absolute_value != 0.0) ) { - /* Use scientific notation */ - integer_place = DBL_DIG + EXPONENT_DIGITS + 1; - fraction_place = DBL_DIG - 1; - size = snprintf(work, sizeof(work),"%*.*e", - integer_place, fraction_place, number); - while ((size > 0) && (work[size] != 'e')) size--; - after_fraction = work + size; - - } - else { - /* Use regular notation */ - if (absolute_value > 0.0) - integer_place = 1 + (int)log10(absolute_value); - else - integer_place = 0; - fraction_place = (integer_place > 0) - ? DBL_DIG - integer_place - : DBL_DIG; - size = snprintf(work, sizeof(work), "%0.*f", - fraction_place, number); - after_fraction = work + size; - } - - /* Remove fractional trailing zeroes */ - ptr = after_fraction; - while (*(--ptr) == '0') - ; - if (*ptr != '.') - ptr++; - while ((*ptr++ = *after_fraction++) != 0); - - /* Finally copy result back to caller */ - size = strlen(work) + 1; - if (size > buffersize) { - work[buffersize - 1] = 0; - size = buffersize; - } - memmove(buffer, work, size); - } - break; - } -} - - -/************************************************************************ - * * - * Routines to handle NodeSets * - * * - ************************************************************************/ - -/** - * xmlXPathOrderDocElems: - * @doc: an input document - * - * Call this routine to speed up XPath computation on static documents. - * This stamps all the element nodes with the document order - * Like for line information, the order is kept in the element->content - * field, the value stored is actually - the node number (starting at -1) - * to be able to differentiate from line numbers. - * - * Returns the number of elements found in the document or -1 in case - * of error. - */ -long -xmlXPathOrderDocElems(xmlDocPtr doc) { - long count = 0; - xmlNodePtr cur; - - if (doc == NULL) - return(-1); - cur = doc->children; - while (cur != NULL) { - if (cur->type == XML_ELEMENT_NODE) { - cur->content = (void *) (-(++count)); - if (cur->children != NULL) { - cur = cur->children; - continue; - } - } - if (cur->next != NULL) { - cur = cur->next; - continue; - } - do { - cur = cur->parent; - if (cur == NULL) - break; - if (cur == (xmlNodePtr) doc) { - cur = NULL; - break; - } - if (cur->next != NULL) { - cur = cur->next; - break; - } - } while (cur != NULL); - } - return(count); -} - -/** - * xmlXPathCmpNodes: - * @node1: the first node - * @node2: the second node - * - * Compare two nodes w.r.t document order - * - * Returns -2 in case of error 1 if first point < second point, 0 if - * it's the same node, -1 otherwise - */ -int -xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { - int depth1, depth2; - int attr1 = 0, attr2 = 0; - xmlNodePtr attrNode1 = NULL, attrNode2 = NULL; - xmlNodePtr cur, root; - - if ((node1 == NULL) || (node2 == NULL)) - return(-2); - /* - * a couple of optimizations which will avoid computations in most cases - */ - if (node1->type == XML_ATTRIBUTE_NODE) { - attr1 = 1; - attrNode1 = node1; - node1 = node1->parent; - } - if (node2->type == XML_ATTRIBUTE_NODE) { - attr2 = 1; - attrNode2 = node2; - node2 = node2->parent; - } - if (node1 == node2) { - if (attr1 == attr2) { - /* not required, but we keep attributes in order */ - if (attr1 != 0) { - cur = attrNode2->prev; - while (cur != NULL) { - if (cur == attrNode1) - return (1); - cur = cur->prev; - } - return (-1); - } - return(0); - } - if (attr2 == 1) - return(1); - return(-1); - } - if ((node1->type == XML_NAMESPACE_DECL) || - (node2->type == XML_NAMESPACE_DECL)) - return(1); - if (node1 == node2->prev) - return(1); - if (node1 == node2->next) - return(-1); - - /* - * Speedup using document order if availble. - */ - if ((node1->type == XML_ELEMENT_NODE) && - (node2->type == XML_ELEMENT_NODE) && - (0 > (long) node1->content) && - (0 > (long) node2->content) && - (node1->doc == node2->doc)) { - long l1, l2; - - l1 = -((long) node1->content); - l2 = -((long) node2->content); - if (l1 < l2) - return(1); - if (l1 > l2) - return(-1); - } - - /* - * compute depth to root - */ - for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { - if (cur == node1) - return(1); - depth2++; - } - root = cur; - for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { - if (cur == node2) - return(-1); - depth1++; - } - /* - * Distinct document (or distinct entities :-( ) case. - */ - if (root != cur) { - return(-2); - } - /* - * get the nearest common ancestor. - */ - while (depth1 > depth2) { - depth1--; - node1 = node1->parent; - } - while (depth2 > depth1) { - depth2--; - node2 = node2->parent; - } - while (node1->parent != node2->parent) { - node1 = node1->parent; - node2 = node2->parent; - /* should not happen but just in case ... */ - if ((node1 == NULL) || (node2 == NULL)) - return(-2); - } - /* - * Find who's first. - */ - if (node1 == node2->prev) - return(1); - if (node1 == node2->next) - return(-1); - /* - * Speedup using document order if availble. - */ - if ((node1->type == XML_ELEMENT_NODE) && - (node2->type == XML_ELEMENT_NODE) && - (0 > (long) node1->content) && - (0 > (long) node2->content) && - (node1->doc == node2->doc)) { - long l1, l2; - - l1 = -((long) node1->content); - l2 = -((long) node2->content); - if (l1 < l2) - return(1); - if (l1 > l2) - return(-1); - } - - for (cur = node1->next;cur != NULL;cur = cur->next) - if (cur == node2) - return(1); - return(-1); /* assume there is no sibling list corruption */ -} - -#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON -/** - * xmlXPathCmpNodesExt: - * @node1: the first node - * @node2: the second node - * - * Compare two nodes w.r.t document order. - * This one is optimized for handling of non-element nodes. - * - * Returns -2 in case of error 1 if first point < second point, 0 if - * it's the same node, -1 otherwise - */ -static int -xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { - int depth1, depth2; - int misc = 0, precedence1 = 0, precedence2 = 0; - xmlNodePtr miscNode1 = NULL, miscNode2 = NULL; - xmlNodePtr cur, root; - long l1, l2; - - if ((node1 == NULL) || (node2 == NULL)) - return(-2); - - if (node1 == node2) - return(0); - - /* - * a couple of optimizations which will avoid computations in most cases - */ - switch (node1->type) { - case XML_ELEMENT_NODE: - if (node2->type == XML_ELEMENT_NODE) { - if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */ - (0 > (long) node2->content) && - (node1->doc == node2->doc)) - { - l1 = -((long) node1->content); - l2 = -((long) node2->content); - if (l1 < l2) - return(1); - if (l1 > l2) - return(-1); - } else - goto turtle_comparison; - } - break; - case XML_ATTRIBUTE_NODE: - precedence1 = 1; /* element is owner */ - miscNode1 = node1; - node1 = node1->parent; - misc = 1; - break; - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_COMMENT_NODE: - case XML_PI_NODE: { - miscNode1 = node1; - /* - * Find nearest element node. - */ - if (node1->prev != NULL) { - do { - node1 = node1->prev; - if (node1->type == XML_ELEMENT_NODE) { - precedence1 = 3; /* element in prev-sibl axis */ - break; - } - if (node1->prev == NULL) { - precedence1 = 2; /* element is parent */ - /* - * URGENT TODO: Are there any cases, where the - * parent of such a node is not an element node? - */ - node1 = node1->parent; - break; - } - } while (1); - } else { - precedence1 = 2; /* element is parent */ - node1 = node1->parent; - } - if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE)) { - /* - * Fallback for whatever case. - */ - node1 = miscNode1; - precedence1 = 0; - } else - misc = 1; - } - break; - case XML_NAMESPACE_DECL: - /* - * TODO: why do we return 1 for namespace nodes? - */ - return(1); - default: - break; - } - switch (node2->type) { - case XML_ELEMENT_NODE: - break; - case XML_ATTRIBUTE_NODE: - precedence2 = 1; /* element is owner */ - miscNode2 = node2; - node2 = node2->parent; - misc = 1; - break; - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_COMMENT_NODE: - case XML_PI_NODE: { - miscNode2 = node2; - if (node2->prev != NULL) { - do { - node2 = node2->prev; - if (node2->type == XML_ELEMENT_NODE) { - precedence2 = 3; /* element in prev-sibl axis */ - break; - } - if (node2->prev == NULL) { - precedence2 = 2; /* element is parent */ - node2 = node2->parent; - break; - } - } while (1); - } else { - precedence2 = 2; /* element is parent */ - node2 = node2->parent; - } - if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) || - (0 <= (long) node1->content)) - { - node2 = miscNode2; - precedence2 = 0; - } else - misc = 1; - } - break; - case XML_NAMESPACE_DECL: - return(1); - default: - break; - } - if (misc) { - if (node1 == node2) { - if (precedence1 == precedence2) { - /* - * The ugly case; but normally there aren't many - * adjacent non-element nodes around. - */ - cur = miscNode2->prev; - while (cur != NULL) { - if (cur == miscNode1) - return(1); - if (cur->type == XML_ELEMENT_NODE) - return(-1); - cur = cur->prev; - } - return (-1); - } else { - /* - * Evaluate based on higher precedence wrt to the element. - * TODO: This assumes attributes are sorted before content. - * Is this 100% correct? - */ - if (precedence1 < precedence2) - return(1); - else - return(-1); - } - } - /* - * Special case: One of the helper-elements is contained by the other. - * <foo> - * <node2> - * <node1>Text-1(precedence1 == 2)</node1> - * </node2> - * Text-6(precedence2 == 3) - * </foo> - */ - if ((precedence2 == 3) && (precedence1 > 1)) { - cur = node1->parent; - while (cur) { - if (cur == node2) - return(1); - cur = cur->parent; - } - } - if ((precedence1 == 3) && (precedence2 > 1)) { - cur = node2->parent; - while (cur) { - if (cur == node1) - return(-1); - cur = cur->parent; - } - } - } - - /* - * Speedup using document order if availble. - */ - if ((node1->type == XML_ELEMENT_NODE) && - (node2->type == XML_ELEMENT_NODE) && - (0 > (long) node1->content) && - (0 > (long) node2->content) && - (node1->doc == node2->doc)) { - - l1 = -((long) node1->content); - l2 = -((long) node2->content); - if (l1 < l2) - return(1); - if (l1 > l2) - return(-1); - } - -turtle_comparison: - - if (node1 == node2->prev) - return(1); - if (node1 == node2->next) - return(-1); - /* - * compute depth to root - */ - for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { - if (cur == node1) - return(1); - depth2++; - } - root = cur; - for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { - if (cur == node2) - return(-1); - depth1++; - } - /* - * Distinct document (or distinct entities :-( ) case. - */ - if (root != cur) { - return(-2); - } - /* - * get the nearest common ancestor. - */ - while (depth1 > depth2) { - depth1--; - node1 = node1->parent; - } - while (depth2 > depth1) { - depth2--; - node2 = node2->parent; - } - while (node1->parent != node2->parent) { - node1 = node1->parent; - node2 = node2->parent; - /* should not happen but just in case ... */ - if ((node1 == NULL) || (node2 == NULL)) - return(-2); - } - /* - * Find who's first. - */ - if (node1 == node2->prev) - return(1); - if (node1 == node2->next) - return(-1); - /* - * Speedup using document order if availble. - */ - if ((node1->type == XML_ELEMENT_NODE) && - (node2->type == XML_ELEMENT_NODE) && - (0 > (long) node1->content) && - (0 > (long) node2->content) && - (node1->doc == node2->doc)) { - - l1 = -((long) node1->content); - l2 = -((long) node2->content); - if (l1 < l2) - return(1); - if (l1 > l2) - return(-1); - } - - for (cur = node1->next;cur != NULL;cur = cur->next) - if (cur == node2) - return(1); - return(-1); /* assume there is no sibling list corruption */ -} -#endif /* XP_OPTIMIZED_NON_ELEM_COMPARISON */ - -/** - * xmlXPathNodeSetSort: - * @set: the node set - * - * Sort the node set in document order - */ -void -xmlXPathNodeSetSort(xmlNodeSetPtr set) { - int i, j, incr, len; - xmlNodePtr tmp; - - if (set == NULL) - return; - - /* Use Shell's sort to sort the node-set */ - len = set->nodeNr; - for (incr = len / 2; incr > 0; incr /= 2) { - for (i = incr; i < len; i++) { - j = i - incr; - while (j >= 0) { -#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON - if (xmlXPathCmpNodesExt(set->nodeTab[j], - set->nodeTab[j + incr]) == -1) -#else - if (xmlXPathCmpNodes(set->nodeTab[j], - set->nodeTab[j + incr]) == -1) -#endif - { - tmp = set->nodeTab[j]; - set->nodeTab[j] = set->nodeTab[j + incr]; - set->nodeTab[j + incr] = tmp; - j -= incr; - } else - break; - } - } - } -} - -#define XML_NODESET_DEFAULT 10 -/** - * xmlXPathNodeSetDupNs: - * @node: the parent node of the namespace XPath node - * @ns: the libxml namespace declaration node. - * - * Namespace node in libxml don't match the XPath semantic. In a node set - * the namespace nodes are duplicated and the next pointer is set to the - * parent node in the XPath semantic. - * - * Returns the newly created object. - */ -static xmlNodePtr -xmlXPathNodeSetDupNs(xmlNodePtr node, xmlNsPtr ns) { - xmlNsPtr cur; - - if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) - return(NULL); - if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) - return((xmlNodePtr) ns); - - /* - * Allocate a new Namespace and fill the fields. - */ - cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); - if (cur == NULL) { - xmlXPathErrMemory(NULL, "duplicating namespace\n"); - return(NULL); - } - memset(cur, 0, sizeof(xmlNs)); - cur->type = XML_NAMESPACE_DECL; - if (ns->href != NULL) - cur->href = xmlStrdup(ns->href); - if (ns->prefix != NULL) - cur->prefix = xmlStrdup(ns->prefix); - cur->next = (xmlNsPtr) node; - return((xmlNodePtr) cur); -} - -/** - * xmlXPathNodeSetFreeNs: - * @ns: the XPath namespace node found in a nodeset. - * - * Namespace nodes in libxml don't match the XPath semantic. In a node set - * the namespace nodes are duplicated and the next pointer is set to the - * parent node in the XPath semantic. Check if such a node needs to be freed - */ -void -xmlXPathNodeSetFreeNs(xmlNsPtr ns) { - if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) - return; - - if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) { - if (ns->href != NULL) - xmlFree((xmlChar *)ns->href); - if (ns->prefix != NULL) - xmlFree((xmlChar *)ns->prefix); - xmlFree(ns); - } -} - -/** - * xmlXPathNodeSetCreate: - * @val: an initial xmlNodePtr, or NULL - * - * Create a new xmlNodeSetPtr of type double and of value @val - * - * Returns the newly created object. - */ -xmlNodeSetPtr -xmlXPathNodeSetCreate(xmlNodePtr val) { - xmlNodeSetPtr ret; - - ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating nodeset\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); - if (val != NULL) { - ret->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * - sizeof(xmlNodePtr)); - if (ret->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "creating nodeset\n"); - xmlFree(ret); - return(NULL); - } - memset(ret->nodeTab, 0 , - XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); - ret->nodeMax = XML_NODESET_DEFAULT; - if (val->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) val; - - ret->nodeTab[ret->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - } else - ret->nodeTab[ret->nodeNr++] = val; - } - return(ret); -} - -/** - * xmlXPathNodeSetCreateSize: - * @size: the initial size of the set - * - * Create a new xmlNodeSetPtr of type double and of value @val - * - * Returns the newly created object. - */ -static xmlNodeSetPtr -xmlXPathNodeSetCreateSize(int size) { - xmlNodeSetPtr ret; - - ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating nodeset\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); - if (size < XML_NODESET_DEFAULT) - size = XML_NODESET_DEFAULT; - ret->nodeTab = (xmlNodePtr *) xmlMalloc(size * sizeof(xmlNodePtr)); - if (ret->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "creating nodeset\n"); - xmlFree(ret); - return(NULL); - } - memset(ret->nodeTab, 0 , size * (size_t) sizeof(xmlNodePtr)); - ret->nodeMax = size; - return(ret); -} - -/** - * xmlXPathNodeSetContains: - * @cur: the node-set - * @val: the node - * - * checks whether @cur contains @val - * - * Returns true (1) if @cur contains @val, false (0) otherwise - */ -int -xmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val) { - int i; - - if ((cur == NULL) || (val == NULL)) return(0); - if (val->type == XML_NAMESPACE_DECL) { - for (i = 0; i < cur->nodeNr; i++) { - if (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns1, ns2; - - ns1 = (xmlNsPtr) val; - ns2 = (xmlNsPtr) cur->nodeTab[i]; - if (ns1 == ns2) - return(1); - if ((ns1->next != NULL) && (ns2->next == ns1->next) && - (xmlStrEqual(ns1->prefix, ns2->prefix))) - return(1); - } - } - } else { - for (i = 0; i < cur->nodeNr; i++) { - if (cur->nodeTab[i] == val) - return(1); - } - } - return(0); -} - -/** - * xmlXPathNodeSetAddNs: - * @cur: the initial node set - * @node: the hosting node - * @ns: a the namespace node - * - * add a new namespace node to an existing NodeSet - */ -void -xmlXPathNodeSetAddNs(xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns) { - int i; - - - if ((cur == NULL) || (ns == NULL) || (node == NULL) || - (ns->type != XML_NAMESPACE_DECL) || - (node->type != XML_ELEMENT_NODE)) - return; - - /* @@ with_ns to check whether namespace nodes should be looked at @@ */ - /* - * prevent duplicates - */ - for (i = 0;i < cur->nodeNr;i++) { - if ((cur->nodeTab[i] != NULL) && - (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) && - (((xmlNsPtr)cur->nodeTab[i])->next == (xmlNsPtr) node) && - (xmlStrEqual(ns->prefix, ((xmlNsPtr)cur->nodeTab[i])->prefix))) - return; - } - - /* - * grow the nodeTab if needed - */ - if (cur->nodeMax == 0) { - cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * - sizeof(xmlNodePtr)); - if (cur->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "growing nodeset\n"); - return; - } - memset(cur->nodeTab, 0 , - XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); - cur->nodeMax = XML_NODESET_DEFAULT; - } else if (cur->nodeNr == cur->nodeMax) { - xmlNodePtr *temp; - - cur->nodeMax *= 2; - temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * - sizeof(xmlNodePtr)); - if (temp == NULL) { - xmlXPathErrMemory(NULL, "growing nodeset\n"); - return; - } - cur->nodeTab = temp; - } - cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs(node, ns); -} - -/** - * xmlXPathNodeSetAdd: - * @cur: the initial node set - * @val: a new xmlNodePtr - * - * add a new xmlNodePtr to an existing NodeSet - */ -void -xmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val) { - int i; - - if ((cur == NULL) || (val == NULL)) return; - -#if 0 - if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' ')) - return; /* an XSLT fake node */ -#endif - - /* @@ with_ns to check whether namespace nodes should be looked at @@ */ - /* - * prevent duplcates - */ - for (i = 0;i < cur->nodeNr;i++) - if (cur->nodeTab[i] == val) return; - - /* - * grow the nodeTab if needed - */ - if (cur->nodeMax == 0) { - cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * - sizeof(xmlNodePtr)); - if (cur->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "growing nodeset\n"); - return; - } - memset(cur->nodeTab, 0 , - XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); - cur->nodeMax = XML_NODESET_DEFAULT; - } else if (cur->nodeNr == cur->nodeMax) { - xmlNodePtr *temp; - - cur->nodeMax *= 2; - temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * - sizeof(xmlNodePtr)); - if (temp == NULL) { - xmlXPathErrMemory(NULL, "growing nodeset\n"); - return; - } - cur->nodeTab = temp; - } - if (val->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) val; - - cur->nodeTab[cur->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - } else - cur->nodeTab[cur->nodeNr++] = val; -} - -/** - * xmlXPathNodeSetAddUnique: - * @cur: the initial node set - * @val: a new xmlNodePtr - * - * add a new xmlNodePtr to an existing NodeSet, optimized version - * when we are sure the node is not already in the set. - */ -void -xmlXPathNodeSetAddUnique(xmlNodeSetPtr cur, xmlNodePtr val) { - if ((cur == NULL) || (val == NULL)) return; - -#if 0 - if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' ')) - return; /* an XSLT fake node */ -#endif - - /* @@ with_ns to check whether namespace nodes should be looked at @@ */ - /* - * grow the nodeTab if needed - */ - if (cur->nodeMax == 0) { - cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * - sizeof(xmlNodePtr)); - if (cur->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "growing nodeset\n"); - return; - } - memset(cur->nodeTab, 0 , - XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); - cur->nodeMax = XML_NODESET_DEFAULT; - } else if (cur->nodeNr == cur->nodeMax) { - xmlNodePtr *temp; - - cur->nodeMax *= 2; - temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * - sizeof(xmlNodePtr)); - if (temp == NULL) { - xmlXPathErrMemory(NULL, "growing nodeset\n"); - return; - } - cur->nodeTab = temp; - } - if (val->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) val; - - cur->nodeTab[cur->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - } else - cur->nodeTab[cur->nodeNr++] = val; -} - -/** - * xmlXPathNodeSetMerge: - * @val1: the first NodeSet or NULL - * @val2: the second NodeSet - * - * Merges two nodesets, all nodes from @val2 are added to @val1 - * if @val1 is NULL, a new set is created and copied from @val2 - * - * Returns @val1 once extended or NULL in case of error. - */ -xmlNodeSetPtr -xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { - int i, j, initNr, skip; - xmlNodePtr n1, n2; - - if (val2 == NULL) return(val1); - if (val1 == NULL) { - val1 = xmlXPathNodeSetCreate(NULL); -#if 0 - /* - * TODO: The optimization won't work in every case, since - * those nasty namespace nodes need to be added with - * xmlXPathNodeSetDupNs() to the set; thus a pure - * memcpy is not possible. - * If there was a flag on the nodesetval, indicating that - * some temporary nodes are in, that would be helpfull. - */ - /* - * Optimization: Create an equally sized node-set - * and memcpy the content. - */ - val1 = xmlXPathNodeSetCreateSize(val2->nodeNr); - if (val1 == NULL) - return(NULL); - if (val2->nodeNr != 0) { - if (val2->nodeNr == 1) - *(val1->nodeTab) = *(val2->nodeTab); - else { - memcpy(val1->nodeTab, val2->nodeTab, - val2->nodeNr * sizeof(xmlNodePtr)); - } - val1->nodeNr = val2->nodeNr; - } - return(val1); -#endif - } - - /* @@ with_ns to check whether namespace nodes should be looked at @@ */ - initNr = val1->nodeNr; - - for (i = 0;i < val2->nodeNr;i++) { - n2 = val2->nodeTab[i]; - /* - * check against duplicates - */ - skip = 0; - for (j = 0; j < initNr; j++) { - n1 = val1->nodeTab[j]; - if (n1 == n2) { - skip = 1; - break; - } else if ((n1->type == XML_NAMESPACE_DECL) && - (n2->type == XML_NAMESPACE_DECL)) { - if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && - (xmlStrEqual(((xmlNsPtr) n1)->prefix, - ((xmlNsPtr) n2)->prefix))) - { - skip = 1; - break; - } - } - } - if (skip) - continue; - - /* - * grow the nodeTab if needed - */ - if (val1->nodeMax == 0) { - val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * - sizeof(xmlNodePtr)); - if (val1->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); - } - memset(val1->nodeTab, 0 , - XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); - val1->nodeMax = XML_NODESET_DEFAULT; - } else if (val1->nodeNr == val1->nodeMax) { - xmlNodePtr *temp; - - val1->nodeMax *= 2; - temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * - sizeof(xmlNodePtr)); - if (temp == NULL) { - xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); - } - val1->nodeTab = temp; - } - if (n2->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) n2; - - val1->nodeTab[val1->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - } else - val1->nodeTab[val1->nodeNr++] = n2; - } - - return(val1); -} - -#if 0 /* xmlXPathNodeSetMergeUnique() is currently not used anymore */ -/** - * xmlXPathNodeSetMergeUnique: - * @val1: the first NodeSet or NULL - * @val2: the second NodeSet - * - * Merges two nodesets, all nodes from @val2 are added to @val1 - * if @val1 is NULL, a new set is created and copied from @val2 - * - * Returns @val1 once extended or NULL in case of error. - */ -static xmlNodeSetPtr -xmlXPathNodeSetMergeUnique(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { - int i; - - if (val2 == NULL) return(val1); - if (val1 == NULL) { - val1 = xmlXPathNodeSetCreate(NULL); - } - - /* @@ with_ns to check whether namespace nodes should be looked at @@ */ - - for (i = 0;i < val2->nodeNr;i++) { - /* - * grow the nodeTab if needed - */ - if (val1->nodeMax == 0) { - val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * - sizeof(xmlNodePtr)); - if (val1->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); - } - memset(val1->nodeTab, 0 , - XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); - val1->nodeMax = XML_NODESET_DEFAULT; - } else if (val1->nodeNr == val1->nodeMax) { - xmlNodePtr *temp; - - val1->nodeMax *= 2; - temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * - sizeof(xmlNodePtr)); - if (temp == NULL) { - xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); - } - val1->nodeTab = temp; - } - if (val2->nodeTab[i]->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) val2->nodeTab[i]; - - val1->nodeTab[val1->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - } else - val1->nodeTab[val1->nodeNr++] = val2->nodeTab[i]; - } - - return(val1); -} -#endif /* xmlXPathNodeSetMergeUnique() is currently not used anymore */ - -/** - * xmlXPathNodeSetMergeAndClear: - * @set1: the first NodeSet or NULL - * @set2: the second NodeSet - * @hasSet2NsNodes: 1 if set2 contains namespaces nodes - * - * Merges two nodesets, all nodes from @set2 are added to @set1 - * if @set1 is NULL, a new set is created and copied from @set2. - * Checks for duplicate nodes. Clears set2. - * - * Returns @set1 once extended or NULL in case of error. - */ -static xmlNodeSetPtr -xmlXPathNodeSetMergeAndClear(xmlNodeSetPtr set1, xmlNodeSetPtr set2, - int hasNullEntries) -{ - if ((set1 == NULL) && (hasNullEntries == 0)) { - /* - * Note that doing a memcpy of the list, namespace nodes are - * just assigned to set1, since set2 is cleared anyway. - */ - set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); - if (set1 == NULL) - return(NULL); - if (set2->nodeNr != 0) { - memcpy(set1->nodeTab, set2->nodeTab, - set2->nodeNr * sizeof(xmlNodePtr)); - set1->nodeNr = set2->nodeNr; - } - } else { - int i, j, initNbSet1; - xmlNodePtr n1, n2; - - if (set1 == NULL) - set1 = xmlXPathNodeSetCreate(NULL); - - initNbSet1 = set1->nodeNr; - for (i = 0;i < set2->nodeNr;i++) { - n2 = set2->nodeTab[i]; - /* - * Skip NULLed entries. - */ - if (n2 == NULL) - continue; - /* - * Skip duplicates. - */ - for (j = 0; j < initNbSet1; j++) { - n1 = set1->nodeTab[j]; - if (n1 == n2) { - goto skip_node; - } else if ((n1->type == XML_NAMESPACE_DECL) && - (n2->type == XML_NAMESPACE_DECL)) - { - if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && - (xmlStrEqual(((xmlNsPtr) n1)->prefix, - ((xmlNsPtr) n2)->prefix))) - { - /* - * Free the namespace node. - */ - set2->nodeTab[i] = NULL; - xmlXPathNodeSetFreeNs((xmlNsPtr) n2); - goto skip_node; - } - } - } - /* - * grow the nodeTab if needed - */ - if (set1->nodeMax == 0) { - set1->nodeTab = (xmlNodePtr *) xmlMalloc( - XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); - if (set1->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); - } - memset(set1->nodeTab, 0, - XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); - set1->nodeMax = XML_NODESET_DEFAULT; - } else if (set1->nodeNr >= set1->nodeMax) { - xmlNodePtr *temp; - - set1->nodeMax *= 2; - temp = (xmlNodePtr *) xmlRealloc( - set1->nodeTab, set1->nodeMax * sizeof(xmlNodePtr)); - if (temp == NULL) { - xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); - } - set1->nodeTab = temp; - } - if (n2->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) n2; - - set1->nodeTab[set1->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - } else - set1->nodeTab[set1->nodeNr++] = n2; -skip_node: - {} - } - } - set2->nodeNr = 0; - return(set1); -} - -/** - * xmlXPathNodeSetMergeAndClearNoDupls: - * @set1: the first NodeSet or NULL - * @set2: the second NodeSet - * @hasSet2NsNodes: 1 if set2 contains namespaces nodes - * - * Merges two nodesets, all nodes from @set2 are added to @set1 - * if @set1 is NULL, a new set is created and copied from @set2. - * Doesn't chack for duplicate nodes. Clears set2. - * - * Returns @set1 once extended or NULL in case of error. - */ -static xmlNodeSetPtr -xmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2, - int hasNullEntries) -{ - if (set2 == NULL) - return(set1); - if ((set1 == NULL) && (hasNullEntries == 0)) { - /* - * Note that doing a memcpy of the list, namespace nodes are - * just assigned to set1, since set2 is cleared anyway. - */ - set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); - if (set1 == NULL) - return(NULL); - if (set2->nodeNr != 0) { - memcpy(set1->nodeTab, set2->nodeTab, - set2->nodeNr * sizeof(xmlNodePtr)); - set1->nodeNr = set2->nodeNr; - } - } else { - int i; - xmlNodePtr n2; - - if (set1 == NULL) - set1 = xmlXPathNodeSetCreate(NULL); - - for (i = 0;i < set2->nodeNr;i++) { - n2 = set2->nodeTab[i]; - /* - * Skip NULLed entries. - */ - if (n2 == NULL) - continue; - if (set1->nodeMax == 0) { - set1->nodeTab = (xmlNodePtr *) xmlMalloc( - XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); - if (set1->nodeTab == NULL) { - xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); - } - memset(set1->nodeTab, 0, - XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); - set1->nodeMax = XML_NODESET_DEFAULT; - } else if (set1->nodeNr >= set1->nodeMax) { - xmlNodePtr *temp; - - set1->nodeMax *= 2; - temp = (xmlNodePtr *) xmlRealloc( - set1->nodeTab, set1->nodeMax * sizeof(xmlNodePtr)); - if (temp == NULL) { - xmlXPathErrMemory(NULL, "merging nodeset\n"); - return(NULL); - } - set1->nodeTab = temp; - } - set1->nodeTab[set1->nodeNr++] = n2; - } - } - set2->nodeNr = 0; - return(set1); -} - -/** - * xmlXPathNodeSetDel: - * @cur: the initial node set - * @val: an xmlNodePtr - * - * Removes an xmlNodePtr from an existing NodeSet - */ -void -xmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val) { - int i; - - if (cur == NULL) return; - if (val == NULL) return; - - /* - * find node in nodeTab - */ - for (i = 0;i < cur->nodeNr;i++) - if (cur->nodeTab[i] == val) break; - - if (i >= cur->nodeNr) { /* not found */ -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n", - val->name); -#endif - return; - } - if ((cur->nodeTab[i] != NULL) && - (cur->nodeTab[i]->type == XML_NAMESPACE_DECL)) - xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[i]); - cur->nodeNr--; - for (;i < cur->nodeNr;i++) - cur->nodeTab[i] = cur->nodeTab[i + 1]; - cur->nodeTab[cur->nodeNr] = NULL; -} - -/** - * xmlXPathNodeSetRemove: - * @cur: the initial node set - * @val: the index to remove - * - * Removes an entry from an existing NodeSet list. - */ -void -xmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val) { - if (cur == NULL) return; - if (val >= cur->nodeNr) return; - if ((cur->nodeTab[val] != NULL) && - (cur->nodeTab[val]->type == XML_NAMESPACE_DECL)) - xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[val]); - cur->nodeNr--; - for (;val < cur->nodeNr;val++) - cur->nodeTab[val] = cur->nodeTab[val + 1]; - cur->nodeTab[cur->nodeNr] = NULL; -} - -/** - * xmlXPathFreeNodeSet: - * @obj: the xmlNodeSetPtr to free - * - * Free the NodeSet compound (not the actual nodes !). - */ -void -xmlXPathFreeNodeSet(xmlNodeSetPtr obj) { - if (obj == NULL) return; - if (obj->nodeTab != NULL) { - int i; - - /* @@ with_ns to check whether namespace nodes should be looked at @@ */ - for (i = 0;i < obj->nodeNr;i++) - if ((obj->nodeTab[i] != NULL) && - (obj->nodeTab[i]->type == XML_NAMESPACE_DECL)) - xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); - xmlFree(obj->nodeTab); - } - xmlFree(obj); -} - -/** - * xmlXPathNodeSetClear: - * @set: the node set to clear - * - * Clears the list from all temporary XPath objects (e.g. namespace nodes - * are feed), but does *not* free the list itself. Sets the length of the - * list to 0. - */ -static void -xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes) -{ - if ((set == NULL) || (set->nodeNr <= 0)) - return; - else if (hasNsNodes) { - int i; - xmlNodePtr node; - - for (i = 0; i < set->nodeNr; i++) { - node = set->nodeTab[i]; - if ((node != NULL) && - (node->type == XML_NAMESPACE_DECL)) - xmlXPathNodeSetFreeNs((xmlNsPtr) node); - } - } - set->nodeNr = 0; -} - -/** - * xmlXPathNodeSetClearFromPos: - * @set: the node set to be cleared - * @pos: the start position to clear from - * - * Clears the list from temporary XPath objects (e.g. namespace nodes - * are feed) starting with the entry at @pos, but does *not* free the list - * itself. Sets the length of the list to @pos. - */ -static void -xmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes) -{ - if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr)) - return; - else if ((hasNsNodes)) { - int i; - xmlNodePtr node; - - for (i = pos; i < set->nodeNr; i++) { - node = set->nodeTab[i]; - if ((node != NULL) && - (node->type == XML_NAMESPACE_DECL)) - xmlXPathNodeSetFreeNs((xmlNsPtr) node); - } - } - set->nodeNr = pos; -} - -/** - * xmlXPathFreeValueTree: - * @obj: the xmlNodeSetPtr to free - * - * Free the NodeSet compound and the actual tree, this is different - * from xmlXPathFreeNodeSet() - */ -static void -xmlXPathFreeValueTree(xmlNodeSetPtr obj) { - int i; - - if (obj == NULL) return; - - if (obj->nodeTab != NULL) { - for (i = 0;i < obj->nodeNr;i++) { - if (obj->nodeTab[i] != NULL) { - if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) { - xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); - } else { - xmlFreeNodeList(obj->nodeTab[i]); - } - } - } - xmlFree(obj->nodeTab); - } - xmlFree(obj); -} - -#if defined(DEBUG) || defined(DEBUG_STEP) -/** - * xmlGenericErrorContextNodeSet: - * @output: a FILE * for the output - * @obj: the xmlNodeSetPtr to display - * - * Quick display of a NodeSet - */ -void -xmlGenericErrorContextNodeSet(FILE *output, xmlNodeSetPtr obj) { - int i; - - if (output == NULL) output = xmlGenericErrorContext; - if (obj == NULL) { - fprintf(output, "NodeSet == NULL !\n"); - return; - } - if (obj->nodeNr == 0) { - fprintf(output, "NodeSet is empty\n"); - return; - } - if (obj->nodeTab == NULL) { - fprintf(output, " nodeTab == NULL !\n"); - return; - } - for (i = 0; i < obj->nodeNr; i++) { - if (obj->nodeTab[i] == NULL) { - fprintf(output, " NULL !\n"); - return; - } - if ((obj->nodeTab[i]->type == XML_DOCUMENT_NODE) || - (obj->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE)) - fprintf(output, " /"); - else if (obj->nodeTab[i]->name == NULL) - fprintf(output, " noname!"); - else fprintf(output, " %s", obj->nodeTab[i]->name); - } - fprintf(output, "\n"); -} -#endif - -/** - * xmlXPathNewNodeSet: - * @val: the NodePtr value - * - * Create a new xmlXPathObjectPtr of type NodeSet and initialize - * it with the single Node @val - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathNewNodeSet(xmlNodePtr val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating nodeset\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_NODESET; - ret->boolval = 0; - ret->nodesetval = xmlXPathNodeSetCreate(val); - /* @@ with_ns to check whether namespace nodes should be looked at @@ */ -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); -#endif - return(ret); -} - -/** - * xmlXPathNewValueTree: - * @val: the NodePtr value - * - * Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize - * it with the tree root @val - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathNewValueTree(xmlNodePtr val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating result value tree\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_XSLT_TREE; - ret->boolval = 1; - ret->user = (void *) val; - ret->nodesetval = xmlXPathNodeSetCreate(val); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_XSLT_TREE); -#endif - return(ret); -} - -/** - * xmlXPathNewNodeSetList: - * @val: an existing NodeSet - * - * Create a new xmlXPathObjectPtr of type NodeSet and initialize - * it with the Nodeset @val - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathNewNodeSetList(xmlNodeSetPtr val) -{ - xmlXPathObjectPtr ret; - int i; - - if (val == NULL) - ret = NULL; - else if (val->nodeTab == NULL) - ret = xmlXPathNewNodeSet(NULL); - else { - ret = xmlXPathNewNodeSet(val->nodeTab[0]); - for (i = 1; i < val->nodeNr; ++i) - xmlXPathNodeSetAddUnique(ret->nodesetval, val->nodeTab[i]); - } - - return (ret); -} - -/** - * xmlXPathWrapNodeSet: - * @val: the NodePtr value - * - * Wrap the Nodeset @val in a new xmlXPathObjectPtr - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathWrapNodeSet(xmlNodeSetPtr val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating node set object\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_NODESET; - ret->nodesetval = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); -#endif - return(ret); -} - -/** - * xmlXPathFreeNodeSetList: - * @obj: an existing NodeSetList object - * - * Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in - * the list contrary to xmlXPathFreeObject(). - */ -void -xmlXPathFreeNodeSetList(xmlXPathObjectPtr obj) { - if (obj == NULL) return; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageReleased(NULL, obj->type); -#endif - xmlFree(obj); -} - -/** - * xmlXPathDifference: - * @nodes1: a node-set - * @nodes2: a node-set - * - * Implements the EXSLT - Sets difference() function: - * node-set set:difference (node-set, node-set) - * - * Returns the difference between the two node sets, or nodes1 if - * nodes2 is empty - */ -xmlNodeSetPtr -xmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { - xmlNodeSetPtr ret; - int i, l1; - xmlNodePtr cur; - - if (xmlXPathNodeSetIsEmpty(nodes2)) - return(nodes1); - - ret = xmlXPathNodeSetCreate(NULL); - if (xmlXPathNodeSetIsEmpty(nodes1)) - return(ret); - - l1 = xmlXPathNodeSetGetLength(nodes1); - - for (i = 0; i < l1; i++) { - cur = xmlXPathNodeSetItem(nodes1, i); - if (!xmlXPathNodeSetContains(nodes2, cur)) - xmlXPathNodeSetAddUnique(ret, cur); - } - return(ret); -} - -/** - * xmlXPathIntersection: - * @nodes1: a node-set - * @nodes2: a node-set - * - * Implements the EXSLT - Sets intersection() function: - * node-set set:intersection (node-set, node-set) - * - * Returns a node set comprising the nodes that are within both the - * node sets passed as arguments - */ -xmlNodeSetPtr -xmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { - xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL); - int i, l1; - xmlNodePtr cur; - - if (xmlXPathNodeSetIsEmpty(nodes1)) - return(ret); - if (xmlXPathNodeSetIsEmpty(nodes2)) - return(ret); - - l1 = xmlXPathNodeSetGetLength(nodes1); - - for (i = 0; i < l1; i++) { - cur = xmlXPathNodeSetItem(nodes1, i); - if (xmlXPathNodeSetContains(nodes2, cur)) - xmlXPathNodeSetAddUnique(ret, cur); - } - return(ret); -} - -/** - * xmlXPathDistinctSorted: - * @nodes: a node-set, sorted by document order - * - * Implements the EXSLT - Sets distinct() function: - * node-set set:distinct (node-set) - * - * Returns a subset of the nodes contained in @nodes, or @nodes if - * it is empty - */ -xmlNodeSetPtr -xmlXPathDistinctSorted (xmlNodeSetPtr nodes) { - xmlNodeSetPtr ret; - xmlHashTablePtr hash; - int i, l; - xmlChar * strval; - xmlNodePtr cur; - - if (xmlXPathNodeSetIsEmpty(nodes)) - return(nodes); - - ret = xmlXPathNodeSetCreate(NULL); - l = xmlXPathNodeSetGetLength(nodes); - hash = xmlHashCreate (l); - for (i = 0; i < l; i++) { - cur = xmlXPathNodeSetItem(nodes, i); - strval = xmlXPathCastNodeToString(cur); - if (xmlHashLookup(hash, strval) == NULL) { - xmlHashAddEntry(hash, strval, strval); - xmlXPathNodeSetAddUnique(ret, cur); - } else { - xmlFree(strval); - } - } - xmlHashFree(hash, (xmlHashDeallocator) xmlFree); - return(ret); -} - -/** - * xmlXPathDistinct: - * @nodes: a node-set - * - * Implements the EXSLT - Sets distinct() function: - * node-set set:distinct (node-set) - * @nodes is sorted by document order, then #exslSetsDistinctSorted - * is called with the sorted node-set - * - * Returns a subset of the nodes contained in @nodes, or @nodes if - * it is empty - */ -xmlNodeSetPtr -xmlXPathDistinct (xmlNodeSetPtr nodes) { - if (xmlXPathNodeSetIsEmpty(nodes)) - return(nodes); - - xmlXPathNodeSetSort(nodes); - return(xmlXPathDistinctSorted(nodes)); -} - -/** - * xmlXPathHasSameNodes: - * @nodes1: a node-set - * @nodes2: a node-set - * - * Implements the EXSLT - Sets has-same-nodes function: - * boolean set:has-same-node(node-set, node-set) - * - * Returns true (1) if @nodes1 shares any node with @nodes2, false (0) - * otherwise - */ -int -xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { - int i, l; - xmlNodePtr cur; - - if (xmlXPathNodeSetIsEmpty(nodes1) || - xmlXPathNodeSetIsEmpty(nodes2)) - return(0); - - l = xmlXPathNodeSetGetLength(nodes1); - for (i = 0; i < l; i++) { - cur = xmlXPathNodeSetItem(nodes1, i); - if (xmlXPathNodeSetContains(nodes2, cur)) - return(1); - } - return(0); -} - -/** - * xmlXPathNodeLeadingSorted: - * @nodes: a node-set, sorted by document order - * @node: a node - * - * Implements the EXSLT - Sets leading() function: - * node-set set:leading (node-set, node-set) - * - * Returns the nodes in @nodes that precede @node in document order, - * @nodes if @node is NULL or an empty node-set if @nodes - * doesn't contain @node - */ -xmlNodeSetPtr -xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { - int i, l; - xmlNodePtr cur; - xmlNodeSetPtr ret; - - if (node == NULL) - return(nodes); - - ret = xmlXPathNodeSetCreate(NULL); - if (xmlXPathNodeSetIsEmpty(nodes) || - (!xmlXPathNodeSetContains(nodes, node))) - return(ret); - - l = xmlXPathNodeSetGetLength(nodes); - for (i = 0; i < l; i++) { - cur = xmlXPathNodeSetItem(nodes, i); - if (cur == node) - break; - xmlXPathNodeSetAddUnique(ret, cur); - } - return(ret); -} - -/** - * xmlXPathNodeLeading: - * @nodes: a node-set - * @node: a node - * - * Implements the EXSLT - Sets leading() function: - * node-set set:leading (node-set, node-set) - * @nodes is sorted by document order, then #exslSetsNodeLeadingSorted - * is called. - * - * Returns the nodes in @nodes that precede @node in document order, - * @nodes if @node is NULL or an empty node-set if @nodes - * doesn't contain @node - */ -xmlNodeSetPtr -xmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node) { - xmlXPathNodeSetSort(nodes); - return(xmlXPathNodeLeadingSorted(nodes, node)); -} - -/** - * xmlXPathLeadingSorted: - * @nodes1: a node-set, sorted by document order - * @nodes2: a node-set, sorted by document order - * - * Implements the EXSLT - Sets leading() function: - * node-set set:leading (node-set, node-set) - * - * Returns the nodes in @nodes1 that precede the first node in @nodes2 - * in document order, @nodes1 if @nodes2 is NULL or empty or - * an empty node-set if @nodes1 doesn't contain @nodes2 - */ -xmlNodeSetPtr -xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { - if (xmlXPathNodeSetIsEmpty(nodes2)) - return(nodes1); - return(xmlXPathNodeLeadingSorted(nodes1, - xmlXPathNodeSetItem(nodes2, 1))); -} - -/** - * xmlXPathLeading: - * @nodes1: a node-set - * @nodes2: a node-set - * - * Implements the EXSLT - Sets leading() function: - * node-set set:leading (node-set, node-set) - * @nodes1 and @nodes2 are sorted by document order, then - * #exslSetsLeadingSorted is called. - * - * Returns the nodes in @nodes1 that precede the first node in @nodes2 - * in document order, @nodes1 if @nodes2 is NULL or empty or - * an empty node-set if @nodes1 doesn't contain @nodes2 - */ -xmlNodeSetPtr -xmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { - if (xmlXPathNodeSetIsEmpty(nodes2)) - return(nodes1); - if (xmlXPathNodeSetIsEmpty(nodes1)) - return(xmlXPathNodeSetCreate(NULL)); - xmlXPathNodeSetSort(nodes1); - xmlXPathNodeSetSort(nodes2); - return(xmlXPathNodeLeadingSorted(nodes1, - xmlXPathNodeSetItem(nodes2, 1))); -} - -/** - * xmlXPathNodeTrailingSorted: - * @nodes: a node-set, sorted by document order - * @node: a node - * - * Implements the EXSLT - Sets trailing() function: - * node-set set:trailing (node-set, node-set) - * - * Returns the nodes in @nodes that follow @node in document order, - * @nodes if @node is NULL or an empty node-set if @nodes - * doesn't contain @node - */ -xmlNodeSetPtr -xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { - int i, l; - xmlNodePtr cur; - xmlNodeSetPtr ret; - - if (node == NULL) - return(nodes); - - ret = xmlXPathNodeSetCreate(NULL); - if (xmlXPathNodeSetIsEmpty(nodes) || - (!xmlXPathNodeSetContains(nodes, node))) - return(ret); - - l = xmlXPathNodeSetGetLength(nodes); - for (i = l; i > 0; i--) { - cur = xmlXPathNodeSetItem(nodes, i); - if (cur == node) - break; - xmlXPathNodeSetAddUnique(ret, cur); - } - return(ret); -} - -/** - * xmlXPathNodeTrailing: - * @nodes: a node-set - * @node: a node - * - * Implements the EXSLT - Sets trailing() function: - * node-set set:trailing (node-set, node-set) - * @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted - * is called. - * - * Returns the nodes in @nodes that follow @node in document order, - * @nodes if @node is NULL or an empty node-set if @nodes - * doesn't contain @node - */ -xmlNodeSetPtr -xmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node) { - xmlXPathNodeSetSort(nodes); - return(xmlXPathNodeTrailingSorted(nodes, node)); -} - -/** - * xmlXPathTrailingSorted: - * @nodes1: a node-set, sorted by document order - * @nodes2: a node-set, sorted by document order - * - * Implements the EXSLT - Sets trailing() function: - * node-set set:trailing (node-set, node-set) - * - * Returns the nodes in @nodes1 that follow the first node in @nodes2 - * in document order, @nodes1 if @nodes2 is NULL or empty or - * an empty node-set if @nodes1 doesn't contain @nodes2 - */ -xmlNodeSetPtr -xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { - if (xmlXPathNodeSetIsEmpty(nodes2)) - return(nodes1); - return(xmlXPathNodeTrailingSorted(nodes1, - xmlXPathNodeSetItem(nodes2, 0))); -} - -/** - * xmlXPathTrailing: - * @nodes1: a node-set - * @nodes2: a node-set - * - * Implements the EXSLT - Sets trailing() function: - * node-set set:trailing (node-set, node-set) - * @nodes1 and @nodes2 are sorted by document order, then - * #xmlXPathTrailingSorted is called. - * - * Returns the nodes in @nodes1 that follow the first node in @nodes2 - * in document order, @nodes1 if @nodes2 is NULL or empty or - * an empty node-set if @nodes1 doesn't contain @nodes2 - */ -xmlNodeSetPtr -xmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { - if (xmlXPathNodeSetIsEmpty(nodes2)) - return(nodes1); - if (xmlXPathNodeSetIsEmpty(nodes1)) - return(xmlXPathNodeSetCreate(NULL)); - xmlXPathNodeSetSort(nodes1); - xmlXPathNodeSetSort(nodes2); - return(xmlXPathNodeTrailingSorted(nodes1, - xmlXPathNodeSetItem(nodes2, 0))); -} - -/************************************************************************ - * * - * Routines to handle extra functions * - * * - ************************************************************************/ - -/** - * xmlXPathRegisterFunc: - * @ctxt: the XPath context - * @name: the function name - * @f: the function implementation or NULL - * - * Register a new function. If @f is NULL it unregisters the function - * - * Returns 0 in case of success, -1 in case of error - */ -int -xmlXPathRegisterFunc(xmlXPathContextPtr ctxt, const xmlChar *name, - xmlXPathFunction f) { - return(xmlXPathRegisterFuncNS(ctxt, name, NULL, f)); -} - -/** - * xmlXPathRegisterFuncNS: - * @ctxt: the XPath context - * @name: the function name - * @ns_uri: the function namespace URI - * @f: the function implementation or NULL - * - * Register a new function. If @f is NULL it unregisters the function - * - * Returns 0 in case of success, -1 in case of error - */ -int -xmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt, const xmlChar *name, - const xmlChar *ns_uri, xmlXPathFunction f) { - if (ctxt == NULL) - return(-1); - if (name == NULL) - return(-1); - - if (ctxt->funcHash == NULL) - ctxt->funcHash = xmlHashCreate(0); - if (ctxt->funcHash == NULL) - return(-1); - if (f == NULL) - return(xmlHashRemoveEntry2(ctxt->funcHash, name, ns_uri, NULL)); - return(xmlHashAddEntry2(ctxt->funcHash, name, ns_uri, - (void*)XML_CAST_FPTR(f))); -} - -/** - * xmlXPathRegisterFuncLookup: - * @ctxt: the XPath context - * @f: the lookup function - * @funcCtxt: the lookup data - * - * Registers an external mechanism to do function lookup. - */ -void -xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, - xmlXPathFuncLookupFunc f, - void *funcCtxt) { - if (ctxt == NULL) - return; - ctxt->funcLookupFunc = f; - ctxt->funcLookupData = funcCtxt; -} - -/** - * xmlXPathFunctionLookup: - * @ctxt: the XPath context - * @name: the function name - * - * Search in the Function array of the context for the given - * function. - * - * Returns the xmlXPathFunction or NULL if not found - */ -xmlXPathFunction -xmlXPathFunctionLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { - if (ctxt == NULL) - return (NULL); - - if (ctxt->funcLookupFunc != NULL) { - xmlXPathFunction ret; - xmlXPathFuncLookupFunc f; - - f = ctxt->funcLookupFunc; - ret = f(ctxt->funcLookupData, name, NULL); - if (ret != NULL) - return(ret); - } - return(xmlXPathFunctionLookupNS(ctxt, name, NULL)); -} - -/** - * xmlXPathFunctionLookupNS: - * @ctxt: the XPath context - * @name: the function name - * @ns_uri: the function namespace URI - * - * Search in the Function array of the context for the given - * function. - * - * Returns the xmlXPathFunction or NULL if not found - */ -xmlXPathFunction -xmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, - const xmlChar *ns_uri) { - xmlXPathFunction ret; - - if (ctxt == NULL) - return(NULL); - if (name == NULL) - return(NULL); - - if (ctxt->funcLookupFunc != NULL) { - xmlXPathFuncLookupFunc f; - - f = ctxt->funcLookupFunc; - ret = f(ctxt->funcLookupData, name, ns_uri); - if (ret != NULL) - return(ret); - } - - if (ctxt->funcHash == NULL) - return(NULL); - - XML_CAST_FPTR(ret) = - (xmlXPathFunction)xmlHashLookup2(ctxt->funcHash, name, ns_uri); - return(ret); -} - -/** - * xmlXPathRegisteredFuncsCleanup: - * @ctxt: the XPath context - * - * Cleanup the XPath context data associated to registered functions - */ -void -xmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) { - if (ctxt == NULL) - return; - - xmlHashFree(ctxt->funcHash, NULL); - ctxt->funcHash = NULL; -} - -/************************************************************************ - * * - * Routines to handle Variables * - * * - ************************************************************************/ - -/** - * xmlXPathRegisterVariable: - * @ctxt: the XPath context - * @name: the variable name - * @value: the variable value or NULL - * - * Register a new variable value. If @value is NULL it unregisters - * the variable - * - * Returns 0 in case of success, -1 in case of error - */ -int -xmlXPathRegisterVariable(xmlXPathContextPtr ctxt, const xmlChar *name, - xmlXPathObjectPtr value) { - return(xmlXPathRegisterVariableNS(ctxt, name, NULL, value)); -} - -/** - * xmlXPathRegisterVariableNS: - * @ctxt: the XPath context - * @name: the variable name - * @ns_uri: the variable namespace URI - * @value: the variable value or NULL - * - * Register a new variable value. If @value is NULL it unregisters - * the variable - * - * Returns 0 in case of success, -1 in case of error - */ -int -xmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt, const xmlChar *name, - const xmlChar *ns_uri, - xmlXPathObjectPtr value) { - if (ctxt == NULL) - return(-1); - if (name == NULL) - return(-1); - - if (ctxt->varHash == NULL) - ctxt->varHash = xmlHashCreate(0); - if (ctxt->varHash == NULL) - return(-1); - if (value == NULL) - return(xmlHashRemoveEntry2(ctxt->varHash, name, ns_uri, - (xmlHashDeallocator)xmlXPathFreeObject)); - return(xmlHashUpdateEntry2(ctxt->varHash, name, ns_uri, - (void *) value, - (xmlHashDeallocator)xmlXPathFreeObject)); -} - -/** - * xmlXPathRegisterVariableLookup: - * @ctxt: the XPath context - * @f: the lookup function - * @data: the lookup data - * - * register an external mechanism to do variable lookup - */ -void -xmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt, - xmlXPathVariableLookupFunc f, void *data) { - if (ctxt == NULL) - return; - ctxt->varLookupFunc = f; - ctxt->varLookupData = data; -} - -/** - * xmlXPathVariableLookup: - * @ctxt: the XPath context - * @name: the variable name - * - * Search in the Variable array of the context for the given - * variable value. - * - * Returns a copy of the value or NULL if not found - */ -xmlXPathObjectPtr -xmlXPathVariableLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { - if (ctxt == NULL) - return(NULL); - - if (ctxt->varLookupFunc != NULL) { - xmlXPathObjectPtr ret; - - ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) - (ctxt->varLookupData, name, NULL); - return(ret); - } - return(xmlXPathVariableLookupNS(ctxt, name, NULL)); -} - -/** - * xmlXPathVariableLookupNS: - * @ctxt: the XPath context - * @name: the variable name - * @ns_uri: the variable namespace URI - * - * Search in the Variable array of the context for the given - * variable value. - * - * Returns the a copy of the value or NULL if not found - */ -xmlXPathObjectPtr -xmlXPathVariableLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, - const xmlChar *ns_uri) { - if (ctxt == NULL) - return(NULL); - - if (ctxt->varLookupFunc != NULL) { - xmlXPathObjectPtr ret; - - ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) - (ctxt->varLookupData, name, ns_uri); - if (ret != NULL) return(ret); - } - - if (ctxt->varHash == NULL) - return(NULL); - if (name == NULL) - return(NULL); - - return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr) - xmlHashLookup2(ctxt->varHash, name, ns_uri))); -} - -/** - * xmlXPathRegisteredVariablesCleanup: - * @ctxt: the XPath context - * - * Cleanup the XPath context data associated to registered variables - */ -void -xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) { - if (ctxt == NULL) - return; - - xmlHashFree(ctxt->varHash, (xmlHashDeallocator)xmlXPathFreeObject); - ctxt->varHash = NULL; -} - -/** - * xmlXPathRegisterNs: - * @ctxt: the XPath context - * @prefix: the namespace prefix - * @ns_uri: the namespace name - * - * Register a new namespace. If @ns_uri is NULL it unregisters - * the namespace - * - * Returns 0 in case of success, -1 in case of error - */ -int -xmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix, - const xmlChar *ns_uri) { - if (ctxt == NULL) - return(-1); - if (prefix == NULL) - return(-1); - - if (ctxt->nsHash == NULL) - ctxt->nsHash = xmlHashCreate(10); - if (ctxt->nsHash == NULL) - return(-1); - if (ns_uri == NULL) - return(xmlHashRemoveEntry(ctxt->nsHash, prefix, - (xmlHashDeallocator)xmlFree)); - return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri), - (xmlHashDeallocator)xmlFree)); -} - -/** - * xmlXPathNsLookup: - * @ctxt: the XPath context - * @prefix: the namespace prefix value - * - * Search in the namespace declaration array of the context for the given - * namespace name associated to the given prefix - * - * Returns the value or NULL if not found - */ -const xmlChar * -xmlXPathNsLookup(xmlXPathContextPtr ctxt, const xmlChar *prefix) { - if (ctxt == NULL) - return(NULL); - if (prefix == NULL) - return(NULL); - -#ifdef XML_XML_NAMESPACE - if (xmlStrEqual(prefix, (const xmlChar *) "xml")) - return(XML_XML_NAMESPACE); -#endif - - if (ctxt->namespaces != NULL) { - int i; - - for (i = 0;i < ctxt->nsNr;i++) { - if ((ctxt->namespaces[i] != NULL) && - (xmlStrEqual(ctxt->namespaces[i]->prefix, prefix))) - return(ctxt->namespaces[i]->href); - } - } - - return((const xmlChar *) xmlHashLookup(ctxt->nsHash, prefix)); -} - -/** - * xmlXPathRegisteredNsCleanup: - * @ctxt: the XPath context - * - * Cleanup the XPath context data associated to registered variables - */ -void -xmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) { - if (ctxt == NULL) - return; - - xmlHashFree(ctxt->nsHash, (xmlHashDeallocator)xmlFree); - ctxt->nsHash = NULL; -} - -/************************************************************************ - * * - * Routines to handle Values * - * * - ************************************************************************/ - -/* Allocations are terrible, one needs to optimize all this !!! */ - -/** - * xmlXPathNewFloat: - * @val: the double value - * - * Create a new xmlXPathObjectPtr of type double and of value @val - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathNewFloat(double val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating float object\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_NUMBER; - ret->floatval = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_NUMBER); -#endif - return(ret); -} - -/** - * xmlXPathNewBoolean: - * @val: the boolean value - * - * Create a new xmlXPathObjectPtr of type boolean and of value @val - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathNewBoolean(int val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating boolean object\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_BOOLEAN; - ret->boolval = (val != 0); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_BOOLEAN); -#endif - return(ret); -} - -/** - * xmlXPathNewString: - * @val: the xmlChar * value - * - * Create a new xmlXPathObjectPtr of type string and of value @val - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathNewString(const xmlChar *val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating string object\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_STRING; - if (val != NULL) - ret->stringval = xmlStrdup(val); - else - ret->stringval = xmlStrdup((const xmlChar *)""); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); -#endif - return(ret); -} - -/** - * xmlXPathWrapString: - * @val: the xmlChar * value - * - * Wraps the @val string into an XPath object. - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathWrapString (xmlChar *val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating string object\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_STRING; - ret->stringval = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); -#endif - return(ret); -} - -/** - * xmlXPathNewCString: - * @val: the char * value - * - * Create a new xmlXPathObjectPtr of type string and of value @val - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathNewCString(const char *val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating string object\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_STRING; - ret->stringval = xmlStrdup(BAD_CAST val); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); -#endif - return(ret); -} - -/** - * xmlXPathWrapCString: - * @val: the char * value - * - * Wraps a string into an XPath object. - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathWrapCString (char * val) { - return(xmlXPathWrapString((xmlChar *)(val))); -} - -/** - * xmlXPathWrapExternal: - * @val: the user data - * - * Wraps the @val data into an XPath object. - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathWrapExternal (void *val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating user object\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_USERS; - ret->user = val; -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, XPATH_USERS); -#endif - return(ret); -} - -/** - * xmlXPathObjectCopy: - * @val: the original object - * - * allocate a new copy of a given object - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPathObjectCopy(xmlXPathObjectPtr val) { - xmlXPathObjectPtr ret; - - if (val == NULL) - return(NULL); - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "copying object\n"); - return(NULL); - } - memcpy(ret, val , (size_t) sizeof(xmlXPathObject)); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageRequested(NULL, val->type); -#endif - switch (val->type) { - case XPATH_BOOLEAN: - case XPATH_NUMBER: - case XPATH_POINT: - case XPATH_RANGE: - break; - case XPATH_STRING: - ret->stringval = xmlStrdup(val->stringval); - break; - case XPATH_XSLT_TREE: -#if 0 -/* - Removed 11 July 2004 - the current handling of xslt tmpRVT nodes means that - this previous handling is no longer correct, and can cause some serious - problems (ref. bug 145547) -*/ - if ((val->nodesetval != NULL) && - (val->nodesetval->nodeTab != NULL)) { - xmlNodePtr cur, tmp; - xmlDocPtr top; - - ret->boolval = 1; - top = xmlNewDoc(NULL); - top->name = (char *) - xmlStrdup(val->nodesetval->nodeTab[0]->name); - ret->user = top; - if (top != NULL) { - top->doc = top; - cur = val->nodesetval->nodeTab[0]->children; - while (cur != NULL) { - tmp = xmlDocCopyNode(cur, top, 1); - xmlAddChild((xmlNodePtr) top, tmp); - cur = cur->next; - } - } - - ret->nodesetval = xmlXPathNodeSetCreate((xmlNodePtr) top); - } else - ret->nodesetval = xmlXPathNodeSetCreate(NULL); - /* Deallocate the copied tree value */ - break; -#endif - case XPATH_NODESET: - ret->nodesetval = xmlXPathNodeSetMerge(NULL, val->nodesetval); - /* Do not deallocate the copied tree value */ - ret->boolval = 0; - break; - case XPATH_LOCATIONSET: -#ifdef LIBXML_XPTR_ENABLED - { - xmlLocationSetPtr loc = val->user; - ret->user = (void *) xmlXPtrLocationSetMerge(NULL, loc); - break; - } -#endif - case XPATH_USERS: - ret->user = val->user; - break; - case XPATH_UNDEFINED: - xmlGenericError(xmlGenericErrorContext, - "xmlXPathObjectCopy: unsupported type %d\n", - val->type); - break; - } - return(ret); -} - -/** - * xmlXPathFreeObject: - * @obj: the object to free - * - * Free up an xmlXPathObjectPtr object. - */ -void -xmlXPathFreeObject(xmlXPathObjectPtr obj) { - if (obj == NULL) return; - if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { - if (obj->boolval) { -#if 0 - if (obj->user != NULL) { - xmlXPathFreeNodeSet(obj->nodesetval); - xmlFreeNodeList((xmlNodePtr) obj->user); - } else -#endif - obj->type = XPATH_XSLT_TREE; /* TODO: Just for debugging. */ - if (obj->nodesetval != NULL) - xmlXPathFreeValueTree(obj->nodesetval); - } else { - if (obj->nodesetval != NULL) - xmlXPathFreeNodeSet(obj->nodesetval); - } -#ifdef LIBXML_XPTR_ENABLED - } else if (obj->type == XPATH_LOCATIONSET) { - if (obj->user != NULL) - xmlXPtrFreeLocationSet(obj->user); -#endif - } else if (obj->type == XPATH_STRING) { - if (obj->stringval != NULL) - xmlFree(obj->stringval); - } -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageReleased(NULL, obj->type); -#endif - xmlFree(obj); -} - -/** - * xmlXPathReleaseObject: - * @obj: the xmlXPathObjectPtr to free or to cache - * - * Depending on the state of the cache this frees the given - * XPath object or stores it in the cache. - */ -static void -xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj) -{ -#define XP_CACHE_ADD(sl, o) if (sl == NULL) { \ - sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \ - if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj; - -#define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n)) - - if (obj == NULL) - return; - if ((ctxt == NULL) || (ctxt->cache == NULL)) { - xmlXPathFreeObject(obj); - } else { - xmlXPathContextCachePtr cache = - (xmlXPathContextCachePtr) ctxt->cache; - - switch (obj->type) { - case XPATH_NODESET: - case XPATH_XSLT_TREE: - if (obj->nodesetval != NULL) { - if (obj->boolval) { - /* - * It looks like the @boolval is used for - * evaluation if this an XSLT Result Tree Fragment. - * TODO: Check if this assumption is correct. - */ - obj->type = XPATH_XSLT_TREE; /* just for debugging */ - xmlXPathFreeValueTree(obj->nodesetval); - obj->nodesetval = NULL; - } else if ((obj->nodesetval->nodeMax <= 40) && - (XP_CACHE_WANTS(cache->nodesetObjs, - cache->maxNodeset))) - { - XP_CACHE_ADD(cache->nodesetObjs, obj); - goto obj_cached; - } else { - xmlXPathFreeNodeSet(obj->nodesetval); - obj->nodesetval = NULL; - } - } - break; - case XPATH_STRING: - if (obj->stringval != NULL) - xmlFree(obj->stringval); - - if (XP_CACHE_WANTS(cache->stringObjs, cache->maxString)) { - XP_CACHE_ADD(cache->stringObjs, obj); - goto obj_cached; - } - break; - case XPATH_BOOLEAN: - if (XP_CACHE_WANTS(cache->booleanObjs, cache->maxBoolean)) { - XP_CACHE_ADD(cache->booleanObjs, obj); - goto obj_cached; - } - break; - case XPATH_NUMBER: - if (XP_CACHE_WANTS(cache->numberObjs, cache->maxNumber)) { - XP_CACHE_ADD(cache->numberObjs, obj); - goto obj_cached; - } - break; -#ifdef LIBXML_XPTR_ENABLED - case XPATH_LOCATIONSET: - if (obj->user != NULL) { - xmlXPtrFreeLocationSet(obj->user); - } - goto free_obj; -#endif - default: - goto free_obj; - } - - /* - * Fallback to adding to the misc-objects slot. - */ - if (XP_CACHE_WANTS(cache->miscObjs, cache->maxMisc)) { - XP_CACHE_ADD(cache->miscObjs, obj); - } else - goto free_obj; - -obj_cached: - -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageReleased(ctxt, obj->type); -#endif - - if (obj->nodesetval != NULL) { - xmlNodeSetPtr tmpset = obj->nodesetval; - - /* - * TODO: Due to those nasty ns-nodes, we need to traverse - * the list and free the ns-nodes. - * URGENT TODO: Check if it's actually slowing things down. - * Maybe we shouldn't try to preserve the list. - */ - if (tmpset->nodeNr > 1) { - int i; - xmlNodePtr node; - - for (i = 0; i < tmpset->nodeNr; i++) { - node = tmpset->nodeTab[i]; - if ((node != NULL) && - (node->type == XML_NAMESPACE_DECL)) - { - xmlXPathNodeSetFreeNs((xmlNsPtr) node); - } - } - } else if (tmpset->nodeNr == 1) { - if ((tmpset->nodeTab[0] != NULL) && - (tmpset->nodeTab[0]->type == XML_NAMESPACE_DECL)) - xmlXPathNodeSetFreeNs((xmlNsPtr) tmpset->nodeTab[0]); - } - tmpset->nodeNr = 0; - memset(obj, 0, sizeof(xmlXPathObject)); - obj->nodesetval = tmpset; - } else - memset(obj, 0, sizeof(xmlXPathObject)); - - return; - -free_obj: - /* - * Cache is full; free the object. - */ - if (obj->nodesetval != NULL) - xmlXPathFreeNodeSet(obj->nodesetval); -#ifdef XP_DEBUG_OBJ_USAGE - xmlXPathDebugObjUsageReleased(NULL, obj->type); -#endif - xmlFree(obj); - } - return; -} - - -/************************************************************************ - * * - * Type Casting Routines * - * * - ************************************************************************/ - -/** - * xmlXPathCastBooleanToString: - * @val: a boolean - * - * Converts a boolean to its string value. - * - * Returns a newly allocated string. - */ -xmlChar * -xmlXPathCastBooleanToString (int val) { - xmlChar *ret; - if (val) - ret = xmlStrdup((const xmlChar *) "true"); - else - ret = xmlStrdup((const xmlChar *) "false"); - return(ret); -} - -/** - * xmlXPathCastNumberToString: - * @val: a number - * - * Converts a number to its string value. - * - * Returns a newly allocated string. - */ -xmlChar * -xmlXPathCastNumberToString (double val) { - xmlChar *ret; - switch (xmlXPathIsInf(val)) { - case 1: - ret = xmlStrdup((const xmlChar *) "Infinity"); - break; - case -1: - ret = xmlStrdup((const xmlChar *) "-Infinity"); - break; - default: - if (xmlXPathIsNaN(val)) { - ret = xmlStrdup((const xmlChar *) "NaN"); - } else if (val == 0 && xmlXPathGetSign(val) != 0) { - ret = xmlStrdup((const xmlChar *) "0"); - } else { - /* could be improved */ - char buf[100]; - xmlXPathFormatNumber(val, buf, 99); - buf[99] = 0; - ret = xmlStrdup((const xmlChar *) buf); - } - } - return(ret); -} - -/** - * xmlXPathCastNodeToString: - * @node: a node - * - * Converts a node to its string value. - * - * Returns a newly allocated string. - */ -xmlChar * -xmlXPathCastNodeToString (xmlNodePtr node) { - return(xmlNodeGetContent(node)); -} - -/** - * xmlXPathCastNodeSetToString: - * @ns: a node-set - * - * Converts a node-set to its string value. - * - * Returns a newly allocated string. - */ -xmlChar * -xmlXPathCastNodeSetToString (xmlNodeSetPtr ns) { - if ((ns == NULL) || (ns->nodeNr == 0) || (ns->nodeTab == NULL)) - return(xmlStrdup((const xmlChar *) "")); - - if (ns->nodeNr > 1) - xmlXPathNodeSetSort(ns); - return(xmlXPathCastNodeToString(ns->nodeTab[0])); -} - -/** - * xmlXPathCastToString: - * @val: an XPath object - * - * Converts an existing object to its string() equivalent - * - * Returns the allocated string value of the object, NULL in case of error. - * It's up to the caller to free the string memory with xmlFree(). - */ -xmlChar * -xmlXPathCastToString(xmlXPathObjectPtr val) { - xmlChar *ret = NULL; - - if (val == NULL) - return(xmlStrdup((const xmlChar *) "")); - switch (val->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, "String: undefined\n"); -#endif - ret = xmlStrdup((const xmlChar *) ""); - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - ret = xmlXPathCastNodeSetToString(val->nodesetval); - break; - case XPATH_STRING: - return(xmlStrdup(val->stringval)); - case XPATH_BOOLEAN: - ret = xmlXPathCastBooleanToString(val->boolval); - break; - case XPATH_NUMBER: { - ret = xmlXPathCastNumberToString(val->floatval); - break; - } - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO - ret = xmlStrdup((const xmlChar *) ""); - break; - } - return(ret); -} - -/** - * xmlXPathConvertString: - * @val: an XPath object - * - * Converts an existing object to its string() equivalent - * - * Returns the new object, the old one is freed (or the operation - * is done directly on @val) - */ -xmlXPathObjectPtr -xmlXPathConvertString(xmlXPathObjectPtr val) { - xmlChar *res = NULL; - - if (val == NULL) - return(xmlXPathNewCString("")); - - switch (val->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); -#endif - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - res = xmlXPathCastNodeSetToString(val->nodesetval); - break; - case XPATH_STRING: - return(val); - case XPATH_BOOLEAN: - res = xmlXPathCastBooleanToString(val->boolval); - break; - case XPATH_NUMBER: - res = xmlXPathCastNumberToString(val->floatval); - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO; - break; - } - xmlXPathFreeObject(val); - if (res == NULL) - return(xmlXPathNewCString("")); - return(xmlXPathWrapString(res)); -} - -/** - * xmlXPathCastBooleanToNumber: - * @val: a boolean - * - * Converts a boolean to its number value - * - * Returns the number value - */ -double -xmlXPathCastBooleanToNumber(int val) { - if (val) - return(1.0); - return(0.0); -} - -/** - * xmlXPathCastStringToNumber: - * @val: a string - * - * Converts a string to its number value - * - * Returns the number value - */ -double -xmlXPathCastStringToNumber(const xmlChar * val) { - return(xmlXPathStringEvalNumber(val)); -} - -/** - * xmlXPathCastNodeToNumber: - * @node: a node - * - * Converts a node to its number value - * - * Returns the number value - */ -double -xmlXPathCastNodeToNumber (xmlNodePtr node) { - xmlChar *strval; - double ret; - - if (node == NULL) - return(xmlXPathNAN); - strval = xmlXPathCastNodeToString(node); - if (strval == NULL) - return(xmlXPathNAN); - ret = xmlXPathCastStringToNumber(strval); - xmlFree(strval); - - return(ret); -} - -/** - * xmlXPathCastNodeSetToNumber: - * @ns: a node-set - * - * Converts a node-set to its number value - * - * Returns the number value - */ -double -xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns) { - xmlChar *str; - double ret; - - if (ns == NULL) - return(xmlXPathNAN); - str = xmlXPathCastNodeSetToString(ns); - ret = xmlXPathCastStringToNumber(str); - xmlFree(str); - return(ret); -} - -/** - * xmlXPathCastToNumber: - * @val: an XPath object - * - * Converts an XPath object to its number value - * - * Returns the number value - */ -double -xmlXPathCastToNumber(xmlXPathObjectPtr val) { - double ret = 0.0; - - if (val == NULL) - return(xmlXPathNAN); - switch (val->type) { - case XPATH_UNDEFINED: -#ifdef DEGUB_EXPR - xmlGenericError(xmlGenericErrorContext, "NUMBER: undefined\n"); -#endif - ret = xmlXPathNAN; - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - ret = xmlXPathCastNodeSetToNumber(val->nodesetval); - break; - case XPATH_STRING: - ret = xmlXPathCastStringToNumber(val->stringval); - break; - case XPATH_NUMBER: - ret = val->floatval; - break; - case XPATH_BOOLEAN: - ret = xmlXPathCastBooleanToNumber(val->boolval); - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO; - ret = xmlXPathNAN; - break; - } - return(ret); -} - -/** - * xmlXPathConvertNumber: - * @val: an XPath object - * - * Converts an existing object to its number() equivalent - * - * Returns the new object, the old one is freed (or the operation - * is done directly on @val) - */ -xmlXPathObjectPtr -xmlXPathConvertNumber(xmlXPathObjectPtr val) { - xmlXPathObjectPtr ret; - - if (val == NULL) - return(xmlXPathNewFloat(0.0)); - if (val->type == XPATH_NUMBER) - return(val); - ret = xmlXPathNewFloat(xmlXPathCastToNumber(val)); - xmlXPathFreeObject(val); - return(ret); -} - -/** - * xmlXPathCastNumberToBoolean: - * @val: a number - * - * Converts a number to its boolean value - * - * Returns the boolean value - */ -int -xmlXPathCastNumberToBoolean (double val) { - if (xmlXPathIsNaN(val) || (val == 0.0)) - return(0); - return(1); -} - -/** - * xmlXPathCastStringToBoolean: - * @val: a string - * - * Converts a string to its boolean value - * - * Returns the boolean value - */ -int -xmlXPathCastStringToBoolean (const xmlChar *val) { - if ((val == NULL) || (xmlStrlen(val) == 0)) - return(0); - return(1); -} - -/** - * xmlXPathCastNodeSetToBoolean: - * @ns: a node-set - * - * Converts a node-set to its boolean value - * - * Returns the boolean value - */ -int -xmlXPathCastNodeSetToBoolean (xmlNodeSetPtr ns) { - if ((ns == NULL) || (ns->nodeNr == 0)) - return(0); - return(1); -} - -/** - * xmlXPathCastToBoolean: - * @val: an XPath object - * - * Converts an XPath object to its boolean value - * - * Returns the boolean value - */ -int -xmlXPathCastToBoolean (xmlXPathObjectPtr val) { - int ret = 0; - - if (val == NULL) - return(0); - switch (val->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, "BOOLEAN: undefined\n"); -#endif - ret = 0; - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - ret = xmlXPathCastNodeSetToBoolean(val->nodesetval); - break; - case XPATH_STRING: - ret = xmlXPathCastStringToBoolean(val->stringval); - break; - case XPATH_NUMBER: - ret = xmlXPathCastNumberToBoolean(val->floatval); - break; - case XPATH_BOOLEAN: - ret = val->boolval; - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO; - ret = 0; - break; - } - return(ret); -} - - -/** - * xmlXPathConvertBoolean: - * @val: an XPath object - * - * Converts an existing object to its boolean() equivalent - * - * Returns the new object, the old one is freed (or the operation - * is done directly on @val) - */ -xmlXPathObjectPtr -xmlXPathConvertBoolean(xmlXPathObjectPtr val) { - xmlXPathObjectPtr ret; - - if (val == NULL) - return(xmlXPathNewBoolean(0)); - if (val->type == XPATH_BOOLEAN) - return(val); - ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(val)); - xmlXPathFreeObject(val); - return(ret); -} - -/************************************************************************ - * * - * Routines to handle XPath contexts * - * * - ************************************************************************/ - -/** - * xmlXPathNewContext: - * @doc: the XML document - * - * Create a new xmlXPathContext - * - * Returns the xmlXPathContext just allocated. The caller will need to free it. - */ -xmlXPathContextPtr -xmlXPathNewContext(xmlDocPtr doc) { - xmlXPathContextPtr ret; - - ret = (xmlXPathContextPtr) xmlMalloc(sizeof(xmlXPathContext)); - if (ret == NULL) { - xmlXPathErrMemory(NULL, "creating context\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathContext)); - ret->doc = doc; - ret->node = NULL; - - ret->varHash = NULL; - - ret->nb_types = 0; - ret->max_types = 0; - ret->types = NULL; - - ret->funcHash = xmlHashCreate(0); - - ret->nb_axis = 0; - ret->max_axis = 0; - ret->axis = NULL; - - ret->nsHash = NULL; - ret->user = NULL; - - ret->contextSize = -1; - ret->proximityPosition = -1; - -#ifdef XP_DEFAULT_CACHE_ON - if (xmlXPathContextSetCache(ret, 1, -1, 0) == -1) { - xmlXPathFreeContext(ret); - return(NULL); - } -#endif - - xmlXPathRegisterAllFunctions(ret); - - return(ret); -} - -/** - * xmlXPathFreeContext: - * @ctxt: the context to free - * - * Free up an xmlXPathContext - */ -void -xmlXPathFreeContext(xmlXPathContextPtr ctxt) { - if (ctxt == NULL) return; - - if (ctxt->cache != NULL) - xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); - xmlXPathRegisteredNsCleanup(ctxt); - xmlXPathRegisteredFuncsCleanup(ctxt); - xmlXPathRegisteredVariablesCleanup(ctxt); - xmlResetError(&ctxt->lastError); - xmlFree(ctxt); -} - -/************************************************************************ - * * - * Routines to handle XPath parser contexts * - * * - ************************************************************************/ - -#define CHECK_CTXT(ctxt) \ - if (ctxt == NULL) { \ - __xmlRaiseError(NULL, NULL, NULL, \ - NULL, NULL, XML_FROM_XPATH, \ - XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ - __FILE__, __LINE__, \ - NULL, NULL, NULL, 0, 0, \ - "NULL context pointer\n"); \ - return(NULL); \ - } \ - -#define CHECK_CTXT_NEG(ctxt) \ - if (ctxt == NULL) { \ - __xmlRaiseError(NULL, NULL, NULL, \ - NULL, NULL, XML_FROM_XPATH, \ - XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ - __FILE__, __LINE__, \ - NULL, NULL, NULL, 0, 0, \ - "NULL context pointer\n"); \ - return(-1); \ - } \ - - -#define CHECK_CONTEXT(ctxt) \ - if ((ctxt == NULL) || (ctxt->doc == NULL) || \ - (ctxt->doc->children == NULL)) { \ - xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT); \ - return(NULL); \ - } - - -/** - * xmlXPathNewParserContext: - * @str: the XPath expression - * @ctxt: the XPath context - * - * Create a new xmlXPathParserContext - * - * Returns the xmlXPathParserContext just allocated. - */ -xmlXPathParserContextPtr -xmlXPathNewParserContext(const xmlChar *str, xmlXPathContextPtr ctxt) { - xmlXPathParserContextPtr ret; - - ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); - if (ret == NULL) { - xmlXPathErrMemory(ctxt, "creating parser context\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); - ret->cur = ret->base = str; - ret->context = ctxt; - - ret->comp = xmlXPathNewCompExpr(); - if (ret->comp == NULL) { - xmlFree(ret->valueTab); - xmlFree(ret); - return(NULL); - } - if ((ctxt != NULL) && (ctxt->dict != NULL)) { - ret->comp->dict = ctxt->dict; - xmlDictReference(ret->comp->dict); - } - - return(ret); -} - -/** - * xmlXPathCompParserContext: - * @comp: the XPath compiled expression - * @ctxt: the XPath context - * - * Create a new xmlXPathParserContext when processing a compiled expression - * - * Returns the xmlXPathParserContext just allocated. - */ -static xmlXPathParserContextPtr -xmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) { - xmlXPathParserContextPtr ret; - - ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); - if (ret == NULL) { - xmlXPathErrMemory(ctxt, "creating evaluation context\n"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); - - /* Allocate the value stack */ - ret->valueTab = (xmlXPathObjectPtr *) - xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); - if (ret->valueTab == NULL) { - xmlFree(ret); - xmlXPathErrMemory(ctxt, "creating evaluation context\n"); - return(NULL); - } - ret->valueNr = 0; - ret->valueMax = 10; - ret->value = NULL; - - ret->context = ctxt; - ret->comp = comp; - - return(ret); -} - -/** - * xmlXPathFreeParserContext: - * @ctxt: the context to free - * - * Free up an xmlXPathParserContext - */ -void -xmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) { - if (ctxt->valueTab != NULL) { - xmlFree(ctxt->valueTab); - } - if (ctxt->comp != NULL) { -#ifdef XPATH_STREAMING - if (ctxt->comp->stream != NULL) { - xmlFreePatternList(ctxt->comp->stream); - ctxt->comp->stream = NULL; - } -#endif - xmlXPathFreeCompExpr(ctxt->comp); - } - xmlFree(ctxt); -} - -/************************************************************************ - * * - * The implicit core function library * - * * - ************************************************************************/ - -/** - * xmlXPathNodeValHash: - * @node: a node pointer - * - * Function computing the beginning of the string value of the node, - * used to speed up comparisons - * - * Returns an int usable as a hash - */ -static unsigned int -xmlXPathNodeValHash(xmlNodePtr node) { - int len = 2; - const xmlChar * string = NULL; - xmlNodePtr tmp = NULL; - unsigned int ret = 0; - - if (node == NULL) - return(0); - - if (node->type == XML_DOCUMENT_NODE) { - tmp = xmlDocGetRootElement((xmlDocPtr) node); - if (tmp == NULL) - node = node->children; - else - node = tmp; - - if (node == NULL) - return(0); - } - - switch (node->type) { - case XML_COMMENT_NODE: - case XML_PI_NODE: - case XML_CDATA_SECTION_NODE: - case XML_TEXT_NODE: - string = node->content; - if (string == NULL) - return(0); - if (string[0] == 0) - return(0); - return(((unsigned int) string[0]) + - (((unsigned int) string[1]) << 8)); - case XML_NAMESPACE_DECL: - string = ((xmlNsPtr)node)->href; - if (string == NULL) - return(0); - if (string[0] == 0) - return(0); - return(((unsigned int) string[0]) + - (((unsigned int) string[1]) << 8)); - case XML_ATTRIBUTE_NODE: - tmp = ((xmlAttrPtr) node)->children; - break; - case XML_ELEMENT_NODE: - tmp = node->children; - break; - default: - return(0); - } - while (tmp != NULL) { - switch (tmp->type) { - case XML_COMMENT_NODE: - case XML_PI_NODE: - case XML_CDATA_SECTION_NODE: - case XML_TEXT_NODE: - string = tmp->content; - break; - case XML_NAMESPACE_DECL: - string = ((xmlNsPtr)tmp)->href; - break; - default: - break; - } - if ((string != NULL) && (string[0] != 0)) { - if (len == 1) { - return(ret + (((unsigned int) string[0]) << 8)); - } - if (string[1] == 0) { - len = 1; - ret = (unsigned int) string[0]; - } else { - return(((unsigned int) string[0]) + - (((unsigned int) string[1]) << 8)); - } - } - /* - * Skip to next node - */ - if ((tmp->children != NULL) && (tmp->type != XML_DTD_NODE)) { - if (tmp->children->type != XML_ENTITY_DECL) { - tmp = tmp->children; - continue; - } - } - if (tmp == node) - break; - - if (tmp->next != NULL) { - tmp = tmp->next; - continue; - } - - do { - tmp = tmp->parent; - if (tmp == NULL) - break; - if (tmp == node) { - tmp = NULL; - break; - } - if (tmp->next != NULL) { - tmp = tmp->next; - break; - } - } while (tmp != NULL); - } - return(ret); -} - -/** - * xmlXPathStringHash: - * @string: a string - * - * Function computing the beginning of the string value of the node, - * used to speed up comparisons - * - * Returns an int usable as a hash - */ -static unsigned int -xmlXPathStringHash(const xmlChar * string) { - if (string == NULL) - return((unsigned int) 0); - if (string[0] == 0) - return(0); - return(((unsigned int) string[0]) + - (((unsigned int) string[1]) << 8)); -} - -/** - * xmlXPathCompareNodeSetFloat: - * @ctxt: the XPath Parser context - * @inf: less than (1) or greater than (0) - * @strict: is the comparison strict - * @arg: the node set - * @f: the value - * - * Implement the compare operation between a nodeset and a number - * @ns < @val (1, 1, ... - * @ns <= @val (1, 0, ... - * @ns > @val (0, 1, ... - * @ns >= @val (0, 0, ... - * - * If one object to be compared is a node-set and the other is a number, - * then the comparison will be true if and only if there is a node in the - * node-set such that the result of performing the comparison on the number - * to be compared and on the result of converting the string-value of that - * node to a number using the number function is true. - * - * Returns 0 or 1 depending on the results of the test. - */ -static int -xmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt, int inf, int strict, - xmlXPathObjectPtr arg, xmlXPathObjectPtr f) { - int i, ret = 0; - xmlNodeSetPtr ns; - xmlChar *str2; - - if ((f == NULL) || (arg == NULL) || - ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { - xmlXPathReleaseObject(ctxt->context, arg); - xmlXPathReleaseObject(ctxt->context, f); - return(0); - } - ns = arg->nodesetval; - if (ns != NULL) { - for (i = 0;i < ns->nodeNr;i++) { - str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); - if (str2 != NULL) { - valuePush(ctxt, - xmlXPathCacheNewString(ctxt->context, str2)); - xmlFree(str2); - xmlXPathNumberFunction(ctxt, 1); - valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, f)); - ret = xmlXPathCompareValues(ctxt, inf, strict); - if (ret) - break; - } - } - } - xmlXPathReleaseObject(ctxt->context, arg); - xmlXPathReleaseObject(ctxt->context, f); - return(ret); -} - -/** - * xmlXPathCompareNodeSetString: - * @ctxt: the XPath Parser context - * @inf: less than (1) or greater than (0) - * @strict: is the comparison strict - * @arg: the node set - * @s: the value - * - * Implement the compare operation between a nodeset and a string - * @ns < @val (1, 1, ... - * @ns <= @val (1, 0, ... - * @ns > @val (0, 1, ... - * @ns >= @val (0, 0, ... - * - * If one object to be compared is a node-set and the other is a string, - * then the comparison will be true if and only if there is a node in - * the node-set such that the result of performing the comparison on the - * string-value of the node and the other string is true. - * - * Returns 0 or 1 depending on the results of the test. - */ -static int -xmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt, int inf, int strict, - xmlXPathObjectPtr arg, xmlXPathObjectPtr s) { - int i, ret = 0; - xmlNodeSetPtr ns; - xmlChar *str2; - - if ((s == NULL) || (arg == NULL) || - ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { - xmlXPathReleaseObject(ctxt->context, arg); - xmlXPathReleaseObject(ctxt->context, s); - return(0); - } - ns = arg->nodesetval; - if (ns != NULL) { - for (i = 0;i < ns->nodeNr;i++) { - str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); - if (str2 != NULL) { - valuePush(ctxt, - xmlXPathCacheNewString(ctxt->context, str2)); - xmlFree(str2); - valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, s)); - ret = xmlXPathCompareValues(ctxt, inf, strict); - if (ret) - break; - } - } - } - xmlXPathReleaseObject(ctxt->context, arg); - xmlXPathReleaseObject(ctxt->context, s); - return(ret); -} - -/** - * xmlXPathCompareNodeSets: - * @inf: less than (1) or greater than (0) - * @strict: is the comparison strict - * @arg1: the first node set object - * @arg2: the second node set object - * - * Implement the compare operation on nodesets: - * - * If both objects to be compared are node-sets, then the comparison - * will be true if and only if there is a node in the first node-set - * and a node in the second node-set such that the result of performing - * the comparison on the string-values of the two nodes is true. - * .... - * When neither object to be compared is a node-set and the operator - * is <=, <, >= or >, then the objects are compared by converting both - * objects to numbers and comparing the numbers according to IEEE 754. - * .... - * The number function converts its argument to a number as follows: - * - a string that consists of optional whitespace followed by an - * optional minus sign followed by a Number followed by whitespace - * is converted to the IEEE 754 number that is nearest (according - * to the IEEE 754 round-to-nearest rule) to the mathematical value - * represented by the string; any other string is converted to NaN - * - * Conclusion all nodes need to be converted first to their string value - * and then the comparison must be done when possible - */ -static int -xmlXPathCompareNodeSets(int inf, int strict, - xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { - int i, j, init = 0; - double val1; - double *values2; - int ret = 0; - xmlNodeSetPtr ns1; - xmlNodeSetPtr ns2; - - if ((arg1 == NULL) || - ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) { - xmlXPathFreeObject(arg2); - return(0); - } - if ((arg2 == NULL) || - ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) { - xmlXPathFreeObject(arg1); - xmlXPathFreeObject(arg2); - return(0); - } - - ns1 = arg1->nodesetval; - ns2 = arg2->nodesetval; - - if ((ns1 == NULL) || (ns1->nodeNr <= 0)) { - xmlXPathFreeObject(arg1); - xmlXPathFreeObject(arg2); - return(0); - } - if ((ns2 == NULL) || (ns2->nodeNr <= 0)) { - xmlXPathFreeObject(arg1); - xmlXPathFreeObject(arg2); - return(0); - } - - values2 = (double *) xmlMalloc(ns2->nodeNr * sizeof(double)); - if (values2 == NULL) { - xmlXPathErrMemory(NULL, "comparing nodesets\n"); - xmlXPathFreeObject(arg1); - xmlXPathFreeObject(arg2); - return(0); - } - for (i = 0;i < ns1->nodeNr;i++) { - val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[i]); - if (xmlXPathIsNaN(val1)) - continue; - for (j = 0;j < ns2->nodeNr;j++) { - if (init == 0) { - values2[j] = xmlXPathCastNodeToNumber(ns2->nodeTab[j]); - } - if (xmlXPathIsNaN(values2[j])) - continue; - if (inf && strict) - ret = (val1 < values2[j]); - else if (inf && !strict) - ret = (val1 <= values2[j]); - else if (!inf && strict) - ret = (val1 > values2[j]); - else if (!inf && !strict) - ret = (val1 >= values2[j]); - if (ret) - break; - } - if (ret) - break; - init = 1; - } - xmlFree(values2); - xmlXPathFreeObject(arg1); - xmlXPathFreeObject(arg2); - return(ret); -} - -/** - * xmlXPathCompareNodeSetValue: - * @ctxt: the XPath Parser context - * @inf: less than (1) or greater than (0) - * @strict: is the comparison strict - * @arg: the node set - * @val: the value - * - * Implement the compare operation between a nodeset and a value - * @ns < @val (1, 1, ... - * @ns <= @val (1, 0, ... - * @ns > @val (0, 1, ... - * @ns >= @val (0, 0, ... - * - * If one object to be compared is a node-set and the other is a boolean, - * then the comparison will be true if and only if the result of performing - * the comparison on the boolean and on the result of converting - * the node-set to a boolean using the boolean function is true. - * - * Returns 0 or 1 depending on the results of the test. - */ -static int -xmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt, int inf, int strict, - xmlXPathObjectPtr arg, xmlXPathObjectPtr val) { - if ((val == NULL) || (arg == NULL) || - ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) - return(0); - - switch(val->type) { - case XPATH_NUMBER: - return(xmlXPathCompareNodeSetFloat(ctxt, inf, strict, arg, val)); - case XPATH_NODESET: - case XPATH_XSLT_TREE: - return(xmlXPathCompareNodeSets(inf, strict, arg, val)); - case XPATH_STRING: - return(xmlXPathCompareNodeSetString(ctxt, inf, strict, arg, val)); - case XPATH_BOOLEAN: - valuePush(ctxt, arg); - xmlXPathBooleanFunction(ctxt, 1); - valuePush(ctxt, val); - return(xmlXPathCompareValues(ctxt, inf, strict)); - default: - TODO - } - return(0); -} - -/** - * xmlXPathEqualNodeSetString: - * @arg: the nodeset object argument - * @str: the string to compare to. - * @neq: flag to show whether for '=' (0) or '!=' (1) - * - * Implement the equal operation on XPath objects content: @arg1 == @arg2 - * If one object to be compared is a node-set and the other is a string, - * then the comparison will be true if and only if there is a node in - * the node-set such that the result of performing the comparison on the - * string-value of the node and the other string is true. - * - * Returns 0 or 1 depending on the results of the test. - */ -static int -xmlXPathEqualNodeSetString(xmlXPathObjectPtr arg, const xmlChar * str, int neq) -{ - int i; - xmlNodeSetPtr ns; - xmlChar *str2; - unsigned int hash; - - if ((str == NULL) || (arg == NULL) || - ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) - return (0); - ns = arg->nodesetval; - /* - * A NULL nodeset compared with a string is always false - * (since there is no node equal, and no node not equal) - */ - if ((ns == NULL) || (ns->nodeNr <= 0) ) - return (0); - hash = xmlXPathStringHash(str); - for (i = 0; i < ns->nodeNr; i++) { - if (xmlXPathNodeValHash(ns->nodeTab[i]) == hash) { - str2 = xmlNodeGetContent(ns->nodeTab[i]); - if ((str2 != NULL) && (xmlStrEqual(str, str2))) { - xmlFree(str2); - if (neq) - continue; - return (1); - } else if ((str2 == NULL) && (xmlStrEqual(str, BAD_CAST ""))) { - if (neq) - continue; - return (1); - } else if (neq) { - if (str2 != NULL) - xmlFree(str2); - return (1); - } - if (str2 != NULL) - xmlFree(str2); - } else if (neq) - return (1); - } - return (0); -} - -/** - * xmlXPathEqualNodeSetFloat: - * @arg: the nodeset object argument - * @f: the float to compare to - * @neq: flag to show whether to compare '=' (0) or '!=' (1) - * - * Implement the equal operation on XPath objects content: @arg1 == @arg2 - * If one object to be compared is a node-set and the other is a number, - * then the comparison will be true if and only if there is a node in - * the node-set such that the result of performing the comparison on the - * number to be compared and on the result of converting the string-value - * of that node to a number using the number function is true. - * - * Returns 0 or 1 depending on the results of the test. - */ -static int -xmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt, - xmlXPathObjectPtr arg, double f, int neq) { - int i, ret=0; - xmlNodeSetPtr ns; - xmlChar *str2; - xmlXPathObjectPtr val; - double v; - - if ((arg == NULL) || - ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) - return(0); - - ns = arg->nodesetval; - if (ns != NULL) { - for (i=0;i<ns->nodeNr;i++) { - str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); - if (str2 != NULL) { - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2)); - xmlFree(str2); - xmlXPathNumberFunction(ctxt, 1); - val = valuePop(ctxt); - v = val->floatval; - xmlXPathReleaseObject(ctxt->context, val); - if (!xmlXPathIsNaN(v)) { - if ((!neq) && (v==f)) { - ret = 1; - break; - } else if ((neq) && (v!=f)) { - ret = 1; - break; - } - } else { /* NaN is unequal to any value */ - if (neq) - ret = 1; - } - } - } - } - - return(ret); -} - - -/** - * xmlXPathEqualNodeSets: - * @arg1: first nodeset object argument - * @arg2: second nodeset object argument - * @neq: flag to show whether to test '=' (0) or '!=' (1) - * - * Implement the equal / not equal operation on XPath nodesets: - * @arg1 == @arg2 or @arg1 != @arg2 - * If both objects to be compared are node-sets, then the comparison - * will be true if and only if there is a node in the first node-set and - * a node in the second node-set such that the result of performing the - * comparison on the string-values of the two nodes is true. - * - * (needless to say, this is a costly operation) - * - * Returns 0 or 1 depending on the results of the test. - */ -static int -xmlXPathEqualNodeSets(xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2, int neq) { - int i, j; - unsigned int *hashs1; - unsigned int *hashs2; - xmlChar **values1; - xmlChar **values2; - int ret = 0; - xmlNodeSetPtr ns1; - xmlNodeSetPtr ns2; - - if ((arg1 == NULL) || - ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) - return(0); - if ((arg2 == NULL) || - ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) - return(0); - - ns1 = arg1->nodesetval; - ns2 = arg2->nodesetval; - - if ((ns1 == NULL) || (ns1->nodeNr <= 0)) - return(0); - if ((ns2 == NULL) || (ns2->nodeNr <= 0)) - return(0); - - /* - * for equal, check if there is a node pertaining to both sets - */ - if (neq == 0) - for (i = 0;i < ns1->nodeNr;i++) - for (j = 0;j < ns2->nodeNr;j++) - if (ns1->nodeTab[i] == ns2->nodeTab[j]) - return(1); - - values1 = (xmlChar **) xmlMalloc(ns1->nodeNr * sizeof(xmlChar *)); - if (values1 == NULL) { - xmlXPathErrMemory(NULL, "comparing nodesets\n"); - return(0); - } - hashs1 = (unsigned int *) xmlMalloc(ns1->nodeNr * sizeof(unsigned int)); - if (hashs1 == NULL) { - xmlXPathErrMemory(NULL, "comparing nodesets\n"); - xmlFree(values1); - return(0); - } - memset(values1, 0, ns1->nodeNr * sizeof(xmlChar *)); - values2 = (xmlChar **) xmlMalloc(ns2->nodeNr * sizeof(xmlChar *)); - if (values2 == NULL) { - xmlXPathErrMemory(NULL, "comparing nodesets\n"); - xmlFree(hashs1); - xmlFree(values1); - return(0); - } - hashs2 = (unsigned int *) xmlMalloc(ns2->nodeNr * sizeof(unsigned int)); - if (hashs2 == NULL) { - xmlXPathErrMemory(NULL, "comparing nodesets\n"); - xmlFree(hashs1); - xmlFree(values1); - xmlFree(values2); - return(0); - } - memset(values2, 0, ns2->nodeNr * sizeof(xmlChar *)); - for (i = 0;i < ns1->nodeNr;i++) { - hashs1[i] = xmlXPathNodeValHash(ns1->nodeTab[i]); - for (j = 0;j < ns2->nodeNr;j++) { - if (i == 0) - hashs2[j] = xmlXPathNodeValHash(ns2->nodeTab[j]); - if (hashs1[i] != hashs2[j]) { - if (neq) { - ret = 1; - break; - } - } - else { - if (values1[i] == NULL) - values1[i] = xmlNodeGetContent(ns1->nodeTab[i]); - if (values2[j] == NULL) - values2[j] = xmlNodeGetContent(ns2->nodeTab[j]); - ret = xmlStrEqual(values1[i], values2[j]) ^ neq; - if (ret) - break; - } - } - if (ret) - break; - } - for (i = 0;i < ns1->nodeNr;i++) - if (values1[i] != NULL) - xmlFree(values1[i]); - for (j = 0;j < ns2->nodeNr;j++) - if (values2[j] != NULL) - xmlFree(values2[j]); - xmlFree(values1); - xmlFree(values2); - xmlFree(hashs1); - xmlFree(hashs2); - return(ret); -} - -static int -xmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt, - xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { - int ret = 0; - /* - *At this point we are assured neither arg1 nor arg2 - *is a nodeset, so we can just pick the appropriate routine. - */ - switch (arg1->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "Equal: undefined\n"); -#endif - break; - case XPATH_BOOLEAN: - switch (arg2->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "Equal: undefined\n"); -#endif - break; - case XPATH_BOOLEAN: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "Equal: %d boolean %d \n", - arg1->boolval, arg2->boolval); -#endif - ret = (arg1->boolval == arg2->boolval); - break; - case XPATH_NUMBER: - ret = (arg1->boolval == - xmlXPathCastNumberToBoolean(arg2->floatval)); - break; - case XPATH_STRING: - if ((arg2->stringval == NULL) || - (arg2->stringval[0] == 0)) ret = 0; - else - ret = 1; - ret = (arg1->boolval == ret); - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - break; - } - break; - case XPATH_NUMBER: - switch (arg2->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "Equal: undefined\n"); -#endif - break; - case XPATH_BOOLEAN: - ret = (arg2->boolval== - xmlXPathCastNumberToBoolean(arg1->floatval)); - break; - case XPATH_STRING: - valuePush(ctxt, arg2); - xmlXPathNumberFunction(ctxt, 1); - arg2 = valuePop(ctxt); - /* no break on purpose */ - case XPATH_NUMBER: - /* Hand check NaN and Infinity equalities */ - if (xmlXPathIsNaN(arg1->floatval) || - xmlXPathIsNaN(arg2->floatval)) { - ret = 0; - } else if (xmlXPathIsInf(arg1->floatval) == 1) { - if (xmlXPathIsInf(arg2->floatval) == 1) - ret = 1; - else - ret = 0; - } else if (xmlXPathIsInf(arg1->floatval) == -1) { - if (xmlXPathIsInf(arg2->floatval) == -1) - ret = 1; - else - ret = 0; - } else if (xmlXPathIsInf(arg2->floatval) == 1) { - if (xmlXPathIsInf(arg1->floatval) == 1) - ret = 1; - else - ret = 0; - } else if (xmlXPathIsInf(arg2->floatval) == -1) { - if (xmlXPathIsInf(arg1->floatval) == -1) - ret = 1; - else - ret = 0; - } else { - ret = (arg1->floatval == arg2->floatval); - } - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - break; - } - break; - case XPATH_STRING: - switch (arg2->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "Equal: undefined\n"); -#endif - break; - case XPATH_BOOLEAN: - if ((arg1->stringval == NULL) || - (arg1->stringval[0] == 0)) ret = 0; - else - ret = 1; - ret = (arg2->boolval == ret); - break; - case XPATH_STRING: - ret = xmlStrEqual(arg1->stringval, arg2->stringval); - break; - case XPATH_NUMBER: - valuePush(ctxt, arg1); - xmlXPathNumberFunction(ctxt, 1); - arg1 = valuePop(ctxt); - /* Hand check NaN and Infinity equalities */ - if (xmlXPathIsNaN(arg1->floatval) || - xmlXPathIsNaN(arg2->floatval)) { - ret = 0; - } else if (xmlXPathIsInf(arg1->floatval) == 1) { - if (xmlXPathIsInf(arg2->floatval) == 1) - ret = 1; - else - ret = 0; - } else if (xmlXPathIsInf(arg1->floatval) == -1) { - if (xmlXPathIsInf(arg2->floatval) == -1) - ret = 1; - else - ret = 0; - } else if (xmlXPathIsInf(arg2->floatval) == 1) { - if (xmlXPathIsInf(arg1->floatval) == 1) - ret = 1; - else - ret = 0; - } else if (xmlXPathIsInf(arg2->floatval) == -1) { - if (xmlXPathIsInf(arg1->floatval) == -1) - ret = 1; - else - ret = 0; - } else { - ret = (arg1->floatval == arg2->floatval); - } - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - break; - } - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - break; - } - xmlXPathReleaseObject(ctxt->context, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - return(ret); -} - -/** - * xmlXPathEqualValues: - * @ctxt: the XPath Parser context - * - * Implement the equal operation on XPath objects content: @arg1 == @arg2 - * - * Returns 0 or 1 depending on the results of the test. - */ -int -xmlXPathEqualValues(xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr arg1, arg2, argtmp; - int ret = 0; - - if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); - arg2 = valuePop(ctxt); - arg1 = valuePop(ctxt); - if ((arg1 == NULL) || (arg2 == NULL)) { - if (arg1 != NULL) - xmlXPathReleaseObject(ctxt->context, arg1); - else - xmlXPathReleaseObject(ctxt->context, arg2); - XP_ERROR0(XPATH_INVALID_OPERAND); - } - - if (arg1 == arg2) { -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "Equal: by pointer\n"); -#endif - xmlXPathFreeObject(arg1); - return(1); - } - - /* - *If either argument is a nodeset, it's a 'special case' - */ - if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || - (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { - /* - *Hack it to assure arg1 is the nodeset - */ - if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { - argtmp = arg2; - arg2 = arg1; - arg1 = argtmp; - } - switch (arg2->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "Equal: undefined\n"); -#endif - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - ret = xmlXPathEqualNodeSets(arg1, arg2, 0); - break; - case XPATH_BOOLEAN: - if ((arg1->nodesetval == NULL) || - (arg1->nodesetval->nodeNr == 0)) ret = 0; - else - ret = 1; - ret = (ret == arg2->boolval); - break; - case XPATH_NUMBER: - ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 0); - break; - case XPATH_STRING: - ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval, 0); - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO - break; - } - xmlXPathReleaseObject(ctxt->context, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - return(ret); - } - - return (xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); -} - -/** - * xmlXPathNotEqualValues: - * @ctxt: the XPath Parser context - * - * Implement the equal operation on XPath objects content: @arg1 == @arg2 - * - * Returns 0 or 1 depending on the results of the test. - */ -int -xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr arg1, arg2, argtmp; - int ret = 0; - - if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); - arg2 = valuePop(ctxt); - arg1 = valuePop(ctxt); - if ((arg1 == NULL) || (arg2 == NULL)) { - if (arg1 != NULL) - xmlXPathReleaseObject(ctxt->context, arg1); - else - xmlXPathReleaseObject(ctxt->context, arg2); - XP_ERROR0(XPATH_INVALID_OPERAND); - } - - if (arg1 == arg2) { -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "NotEqual: by pointer\n"); -#endif - xmlXPathReleaseObject(ctxt->context, arg1); - return(0); - } - - /* - *If either argument is a nodeset, it's a 'special case' - */ - if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || - (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { - /* - *Hack it to assure arg1 is the nodeset - */ - if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { - argtmp = arg2; - arg2 = arg1; - arg1 = argtmp; - } - switch (arg2->type) { - case XPATH_UNDEFINED: -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "NotEqual: undefined\n"); -#endif - break; - case XPATH_NODESET: - case XPATH_XSLT_TREE: - ret = xmlXPathEqualNodeSets(arg1, arg2, 1); - break; - case XPATH_BOOLEAN: - if ((arg1->nodesetval == NULL) || - (arg1->nodesetval->nodeNr == 0)) ret = 0; - else - ret = 1; - ret = (ret != arg2->boolval); - break; - case XPATH_NUMBER: - ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 1); - break; - case XPATH_STRING: - ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval,1); - break; - case XPATH_USERS: - case XPATH_POINT: - case XPATH_RANGE: - case XPATH_LOCATIONSET: - TODO - break; - } - xmlXPathReleaseObject(ctxt->context, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - return(ret); - } - - return (!xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); -} - -/** - * xmlXPathCompareValues: - * @ctxt: the XPath Parser context - * @inf: less than (1) or greater than (0) - * @strict: is the comparison strict - * - * Implement the compare operation on XPath objects: - * @arg1 < @arg2 (1, 1, ... - * @arg1 <= @arg2 (1, 0, ... - * @arg1 > @arg2 (0, 1, ... - * @arg1 >= @arg2 (0, 0, ... - * - * When neither object to be compared is a node-set and the operator is - * <=, <, >=, >, then the objects are compared by converted both objects - * to numbers and comparing the numbers according to IEEE 754. The < - * comparison will be true if and only if the first number is less than the - * second number. The <= comparison will be true if and only if the first - * number is less than or equal to the second number. The > comparison - * will be true if and only if the first number is greater than the second - * number. The >= comparison will be true if and only if the first number - * is greater than or equal to the second number. - * - * Returns 1 if the comparison succeeded, 0 if it failed - */ -int -xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict) { - int ret = 0, arg1i = 0, arg2i = 0; - xmlXPathObjectPtr arg1, arg2; - - if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); - arg2 = valuePop(ctxt); - arg1 = valuePop(ctxt); - if ((arg1 == NULL) || (arg2 == NULL)) { - if (arg1 != NULL) - xmlXPathReleaseObject(ctxt->context, arg1); - else - xmlXPathReleaseObject(ctxt->context, arg2); - XP_ERROR0(XPATH_INVALID_OPERAND); - } - - if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || - (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { - /* - * If either argument is a XPATH_NODESET or XPATH_XSLT_TREE the two arguments - * are not freed from within this routine; they will be freed from the - * called routine, e.g. xmlXPathCompareNodeSets or xmlXPathCompareNodeSetValue - */ - if (((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE)) && - ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE))){ - ret = xmlXPathCompareNodeSets(inf, strict, arg1, arg2); - } else { - if ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { - ret = xmlXPathCompareNodeSetValue(ctxt, inf, strict, - arg1, arg2); - } else { - ret = xmlXPathCompareNodeSetValue(ctxt, !inf, strict, - arg2, arg1); - } - } - return(ret); - } - - if (arg1->type != XPATH_NUMBER) { - valuePush(ctxt, arg1); - xmlXPathNumberFunction(ctxt, 1); - arg1 = valuePop(ctxt); - } - if (arg1->type != XPATH_NUMBER) { - xmlXPathFreeObject(arg1); - xmlXPathFreeObject(arg2); - XP_ERROR0(XPATH_INVALID_OPERAND); - } - if (arg2->type != XPATH_NUMBER) { - valuePush(ctxt, arg2); - xmlXPathNumberFunction(ctxt, 1); - arg2 = valuePop(ctxt); - } - if (arg2->type != XPATH_NUMBER) { - xmlXPathReleaseObject(ctxt->context, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - XP_ERROR0(XPATH_INVALID_OPERAND); - } - /* - * Add tests for infinity and nan - * => feedback on 3.4 for Inf and NaN - */ - /* Hand check NaN and Infinity comparisons */ - if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) { - ret=0; - } else { - arg1i=xmlXPathIsInf(arg1->floatval); - arg2i=xmlXPathIsInf(arg2->floatval); - if (inf && strict) { - if ((arg1i == -1 && arg2i != -1) || - (arg2i == 1 && arg1i != 1)) { - ret = 1; - } else if (arg1i == 0 && arg2i == 0) { - ret = (arg1->floatval < arg2->floatval); - } else { - ret = 0; - } - } - else if (inf && !strict) { - if (arg1i == -1 || arg2i == 1) { - ret = 1; - } else if (arg1i == 0 && arg2i == 0) { - ret = (arg1->floatval <= arg2->floatval); - } else { - ret = 0; - } - } - else if (!inf && strict) { - if ((arg1i == 1 && arg2i != 1) || - (arg2i == -1 && arg1i != -1)) { - ret = 1; - } else if (arg1i == 0 && arg2i == 0) { - ret = (arg1->floatval > arg2->floatval); - } else { - ret = 0; - } - } - else if (!inf && !strict) { - if (arg1i == 1 || arg2i == -1) { - ret = 1; - } else if (arg1i == 0 && arg2i == 0) { - ret = (arg1->floatval >= arg2->floatval); - } else { - ret = 0; - } - } - } - xmlXPathReleaseObject(ctxt->context, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - return(ret); -} - -/** - * xmlXPathValueFlipSign: - * @ctxt: the XPath Parser context - * - * Implement the unary - operation on an XPath object - * The numeric operators convert their operands to numbers as if - * by calling the number function. - */ -void -xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return; - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - if (xmlXPathIsNaN(ctxt->value->floatval)) - ctxt->value->floatval=xmlXPathNAN; - else if (xmlXPathIsInf(ctxt->value->floatval) == 1) - ctxt->value->floatval=xmlXPathNINF; - else if (xmlXPathIsInf(ctxt->value->floatval) == -1) - ctxt->value->floatval=xmlXPathPINF; - else if (ctxt->value->floatval == 0) { - if (xmlXPathGetSign(ctxt->value->floatval) == 0) - ctxt->value->floatval = xmlXPathNZERO; - else - ctxt->value->floatval = 0; - } - else - ctxt->value->floatval = - ctxt->value->floatval; -} - -/** - * xmlXPathAddValues: - * @ctxt: the XPath Parser context - * - * Implement the add operation on XPath objects: - * The numeric operators convert their operands to numbers as if - * by calling the number function. - */ -void -xmlXPathAddValues(xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr arg; - double val; - - arg = valuePop(ctxt); - if (arg == NULL) - XP_ERROR(XPATH_INVALID_OPERAND); - val = xmlXPathCastToNumber(arg); - xmlXPathReleaseObject(ctxt->context, arg); - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - ctxt->value->floatval += val; -} - -/** - * xmlXPathSubValues: - * @ctxt: the XPath Parser context - * - * Implement the subtraction operation on XPath objects: - * The numeric operators convert their operands to numbers as if - * by calling the number function. - */ -void -xmlXPathSubValues(xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr arg; - double val; - - arg = valuePop(ctxt); - if (arg == NULL) - XP_ERROR(XPATH_INVALID_OPERAND); - val = xmlXPathCastToNumber(arg); - xmlXPathReleaseObject(ctxt->context, arg); - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - ctxt->value->floatval -= val; -} - -/** - * xmlXPathMultValues: - * @ctxt: the XPath Parser context - * - * Implement the multiply operation on XPath objects: - * The numeric operators convert their operands to numbers as if - * by calling the number function. - */ -void -xmlXPathMultValues(xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr arg; - double val; - - arg = valuePop(ctxt); - if (arg == NULL) - XP_ERROR(XPATH_INVALID_OPERAND); - val = xmlXPathCastToNumber(arg); - xmlXPathReleaseObject(ctxt->context, arg); - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - ctxt->value->floatval *= val; -} - -/** - * xmlXPathDivValues: - * @ctxt: the XPath Parser context - * - * Implement the div operation on XPath objects @arg1 / @arg2: - * The numeric operators convert their operands to numbers as if - * by calling the number function. - */ -void -xmlXPathDivValues(xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr arg; - double val; - - arg = valuePop(ctxt); - if (arg == NULL) - XP_ERROR(XPATH_INVALID_OPERAND); - val = xmlXPathCastToNumber(arg); - xmlXPathReleaseObject(ctxt->context, arg); - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - if (xmlXPathIsNaN(val) || xmlXPathIsNaN(ctxt->value->floatval)) - ctxt->value->floatval = xmlXPathNAN; - else if (val == 0 && xmlXPathGetSign(val) != 0) { - if (ctxt->value->floatval == 0) - ctxt->value->floatval = xmlXPathNAN; - else if (ctxt->value->floatval > 0) - ctxt->value->floatval = xmlXPathNINF; - else if (ctxt->value->floatval < 0) - ctxt->value->floatval = xmlXPathPINF; - } - else if (val == 0) { - if (ctxt->value->floatval == 0) - ctxt->value->floatval = xmlXPathNAN; - else if (ctxt->value->floatval > 0) - ctxt->value->floatval = xmlXPathPINF; - else if (ctxt->value->floatval < 0) - ctxt->value->floatval = xmlXPathNINF; - } else - ctxt->value->floatval /= val; -} - -/** - * xmlXPathModValues: - * @ctxt: the XPath Parser context - * - * Implement the mod operation on XPath objects: @arg1 / @arg2 - * The numeric operators convert their operands to numbers as if - * by calling the number function. - */ -void -xmlXPathModValues(xmlXPathParserContextPtr ctxt) { - xmlXPathObjectPtr arg; - double arg1, arg2; - - arg = valuePop(ctxt); - if (arg == NULL) - XP_ERROR(XPATH_INVALID_OPERAND); - arg2 = xmlXPathCastToNumber(arg); - xmlXPathReleaseObject(ctxt->context, arg); - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - arg1 = ctxt->value->floatval; - if (arg2 == 0) - ctxt->value->floatval = xmlXPathNAN; - else { - ctxt->value->floatval = fmod(arg1, arg2); - } -} - -/************************************************************************ - * * - * The traversal functions * - * * - ************************************************************************/ - -/* - * A traversal function enumerates nodes along an axis. - * Initially it must be called with NULL, and it indicates - * termination on the axis by returning NULL. - */ -typedef xmlNodePtr (*xmlXPathTraversalFunction) - (xmlXPathParserContextPtr ctxt, xmlNodePtr cur); - -/* - * xmlXPathTraversalFunctionExt: - * A traversal function enumerates nodes along an axis. - * Initially it must be called with NULL, and it indicates - * termination on the axis by returning NULL. - * The context node of the traversal is specified via @contextNode. - */ -typedef xmlNodePtr (*xmlXPathTraversalFunctionExt) - (xmlNodePtr cur, xmlNodePtr contextNode); - -/* - * xmlXPathNodeSetMergeFunction: - * Used for merging node sets in xmlXPathCollectAndTest(). - */ -typedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction) - (xmlNodeSetPtr, xmlNodeSetPtr, int); - - -/** - * xmlXPathNextSelf: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "self" direction - * The self axis contains just the context node itself - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) - return(ctxt->context->node); - return(NULL); -} - -/** - * xmlXPathNextChild: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "child" direction - * The child axis contains the children of the context node in document order. - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) { - if (ctxt->context->node == NULL) return(NULL); - switch (ctxt->context->node->type) { - case XML_ELEMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - return(ctxt->context->node->children); - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return(((xmlDocPtr) ctxt->context->node)->children); - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_ATTRIBUTE_NODE: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - return(NULL); - } - return(NULL); - } - if ((cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) - return(NULL); - return(cur->next); -} - -/** - * xmlXPathNextChildElement: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "child" direction and nodes of type element. - * The child axis contains the children of the context node in document order. - * - * Returns the next element following that axis - */ -static xmlNodePtr -xmlXPathNextChildElement(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) { - cur = ctxt->context->node; - if (cur == NULL) return(NULL); - /* - * Get the first element child. - */ - switch (cur->type) { - case XML_ELEMENT_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_ENTITY_REF_NODE: /* URGENT TODO: entify-refs as well? */ - case XML_ENTITY_NODE: - cur = cur->children; - if (cur != NULL) { - if (cur->type == XML_ELEMENT_NODE) - return(cur); - do { - cur = cur->next; - } while ((cur != NULL) && - (cur->type != XML_ELEMENT_NODE)); - return(cur); - } - return(NULL); - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return(xmlDocGetRootElement((xmlDocPtr) cur)); - default: - return(NULL); - } - return(NULL); - } - /* - * Get the next sibling element node. - */ - switch (cur->type) { - case XML_ELEMENT_NODE: - case XML_TEXT_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_CDATA_SECTION_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_XINCLUDE_END: - break; - /* case XML_DTD_NODE: */ /* URGENT TODO: DTD-node as well? */ - default: - return(NULL); - } - if (cur->next != NULL) { - if (cur->next->type == XML_ELEMENT_NODE) - return(cur->next); - cur = cur->next; - do { - cur = cur->next; - } while ((cur != NULL) && (cur->type != XML_ELEMENT_NODE)); - return(cur); - } - return(NULL); -} - -/** - * xmlXPathNextDescendantOrSelfElemParent: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "descendant-or-self" axis. - * Additionally it returns only nodes which can be parents of - * element nodes. - * - * - * Returns the next element following that axis - */ -static xmlNodePtr -xmlXPathNextDescendantOrSelfElemParent(xmlNodePtr cur, - xmlNodePtr contextNode) -{ - if (cur == NULL) { - if (contextNode == NULL) - return(NULL); - switch (contextNode->type) { - case XML_ELEMENT_NODE: - case XML_XINCLUDE_START: - case XML_DOCUMENT_FRAG_NODE: - case XML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_HTML_DOCUMENT_NODE: - return(contextNode); - default: - return(NULL); - } - return(NULL); - } else { - xmlNodePtr start = cur; - - while (cur != NULL) { - switch (cur->type) { - case XML_ELEMENT_NODE: - /* TODO: OK to have XInclude here? */ - case XML_XINCLUDE_START: - case XML_DOCUMENT_FRAG_NODE: - if (cur != start) - return(cur); - if (cur->children != NULL) { - cur = cur->children; - continue; - } - break; -#ifdef LIBXML_DOCB_ENABLED - /* Not sure if we need those here. */ - case XML_DOCUMENT_NODE: - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_HTML_DOCUMENT_NODE: - if (cur != start) - return(cur); - return(xmlDocGetRootElement((xmlDocPtr) cur)); - default: - break; - } - -next_sibling: - if ((cur == NULL) || (cur == contextNode)) - return(NULL); - if (cur->next != NULL) { - cur = cur->next; - } else { - cur = cur->parent; - goto next_sibling; - } - } - } - return(NULL); -} - -/** - * xmlXPathNextDescendant: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "descendant" direction - * the descendant axis contains the descendants of the context node in document - * order; a descendant is a child or a child of a child and so on. - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) { - if (ctxt->context->node == NULL) - return(NULL); - if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || - (ctxt->context->node->type == XML_NAMESPACE_DECL)) - return(NULL); - - if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) - return(ctxt->context->doc->children); - return(ctxt->context->node->children); - } - - if (cur->children != NULL) { - /* - * Do not descend on entities declarations - */ - if (cur->children->type != XML_ENTITY_DECL) { - cur = cur->children; - /* - * Skip DTDs - */ - if (cur->type != XML_DTD_NODE) - return(cur); - } - } - - if (cur == ctxt->context->node) return(NULL); - - while (cur->next != NULL) { - cur = cur->next; - if ((cur->type != XML_ENTITY_DECL) && - (cur->type != XML_DTD_NODE)) - return(cur); - } - - do { - cur = cur->parent; - if (cur == NULL) break; - if (cur == ctxt->context->node) return(NULL); - if (cur->next != NULL) { - cur = cur->next; - return(cur); - } - } while (cur != NULL); - return(cur); -} - -/** - * xmlXPathNextDescendantOrSelf: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "descendant-or-self" direction - * the descendant-or-self axis contains the context node and the descendants - * of the context node in document order; thus the context node is the first - * node on the axis, and the first child of the context node is the second node - * on the axis - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) { - if (ctxt->context->node == NULL) - return(NULL); - if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || - (ctxt->context->node->type == XML_NAMESPACE_DECL)) - return(NULL); - return(ctxt->context->node); - } - - return(xmlXPathNextDescendant(ctxt, cur)); -} - -/** - * xmlXPathNextParent: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "parent" direction - * The parent axis contains the parent of the context node, if there is one. - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - /* - * the parent of an attribute or namespace node is the element - * to which the attribute or namespace node is attached - * Namespace handling !!! - */ - if (cur == NULL) { - if (ctxt->context->node == NULL) return(NULL); - switch (ctxt->context->node->type) { - case XML_ELEMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - case XML_ENTITY_DECL: - if (ctxt->context->node->parent == NULL) - return((xmlNodePtr) ctxt->context->doc); - if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && - ((ctxt->context->node->parent->name[0] == ' ') || - (xmlStrEqual(ctxt->context->node->parent->name, - BAD_CAST "fake node libxslt")))) - return(NULL); - return(ctxt->context->node->parent); - case XML_ATTRIBUTE_NODE: { - xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; - - return(att->parent); - } - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return(NULL); - case XML_NAMESPACE_DECL: { - xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; - - if ((ns->next != NULL) && - (ns->next->type != XML_NAMESPACE_DECL)) - return((xmlNodePtr) ns->next); - return(NULL); - } - } - } - return(NULL); -} - -/** - * xmlXPathNextAncestor: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "ancestor" direction - * the ancestor axis contains the ancestors of the context node; the ancestors - * of the context node consist of the parent of context node and the parent's - * parent and so on; the nodes are ordered in reverse document order; thus the - * parent is the first node on the axis, and the parent's parent is the second - * node on the axis - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - /* - * the parent of an attribute or namespace node is the element - * to which the attribute or namespace node is attached - * !!!!!!!!!!!!! - */ - if (cur == NULL) { - if (ctxt->context->node == NULL) return(NULL); - switch (ctxt->context->node->type) { - case XML_ELEMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_NOTATION_NODE: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - if (ctxt->context->node->parent == NULL) - return((xmlNodePtr) ctxt->context->doc); - if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && - ((ctxt->context->node->parent->name[0] == ' ') || - (xmlStrEqual(ctxt->context->node->parent->name, - BAD_CAST "fake node libxslt")))) - return(NULL); - return(ctxt->context->node->parent); - case XML_ATTRIBUTE_NODE: { - xmlAttrPtr tmp = (xmlAttrPtr) ctxt->context->node; - - return(tmp->parent); - } - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return(NULL); - case XML_NAMESPACE_DECL: { - xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; - - if ((ns->next != NULL) && - (ns->next->type != XML_NAMESPACE_DECL)) - return((xmlNodePtr) ns->next); - /* Bad, how did that namespace end up here ? */ - return(NULL); - } - } - return(NULL); - } - if (cur == ctxt->context->doc->children) - return((xmlNodePtr) ctxt->context->doc); - if (cur == (xmlNodePtr) ctxt->context->doc) - return(NULL); - switch (cur->type) { - case XML_ELEMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - if (cur->parent == NULL) - return(NULL); - if ((cur->parent->type == XML_ELEMENT_NODE) && - ((cur->parent->name[0] == ' ') || - (xmlStrEqual(cur->parent->name, - BAD_CAST "fake node libxslt")))) - return(NULL); - return(cur->parent); - case XML_ATTRIBUTE_NODE: { - xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; - - return(att->parent); - } - case XML_NAMESPACE_DECL: { - xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; - - if ((ns->next != NULL) && - (ns->next->type != XML_NAMESPACE_DECL)) - return((xmlNodePtr) ns->next); - /* Bad, how did that namespace end up here ? */ - return(NULL); - } - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - return(NULL); - } - return(NULL); -} - -/** - * xmlXPathNextAncestorOrSelf: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "ancestor-or-self" direction - * he ancestor-or-self axis contains the context node and ancestors of - * the context node in reverse document order; thus the context node is - * the first node on the axis, and the context node's parent the second; - * parent here is defined the same as with the parent axis. - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) - return(ctxt->context->node); - return(xmlXPathNextAncestor(ctxt, cur)); -} - -/** - * xmlXPathNextFollowingSibling: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "following-sibling" direction - * The following-sibling axis contains the following siblings of the context - * node in document order. - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || - (ctxt->context->node->type == XML_NAMESPACE_DECL)) - return(NULL); - if (cur == (xmlNodePtr) ctxt->context->doc) - return(NULL); - if (cur == NULL) - return(ctxt->context->node->next); - return(cur->next); -} - -/** - * xmlXPathNextPrecedingSibling: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "preceding-sibling" direction - * The preceding-sibling axis contains the preceding siblings of the context - * node in reverse document order; the first preceding sibling is first on the - * axis; the sibling preceding that node is the second on the axis and so on. - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || - (ctxt->context->node->type == XML_NAMESPACE_DECL)) - return(NULL); - if (cur == (xmlNodePtr) ctxt->context->doc) - return(NULL); - if (cur == NULL) - return(ctxt->context->node->prev); - if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) { - cur = cur->prev; - if (cur == NULL) - return(ctxt->context->node->prev); - } - return(cur->prev); -} - -/** - * xmlXPathNextFollowing: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "following" direction - * The following axis contains all nodes in the same document as the context - * node that are after the context node in document order, excluding any - * descendants and excluding attribute nodes and namespace nodes; the nodes - * are ordered in document order - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur != NULL && cur->children != NULL) - return cur->children ; - if (cur == NULL) cur = ctxt->context->node; - if (cur == NULL) return(NULL) ; /* ERROR */ - if (cur->next != NULL) return(cur->next) ; - do { - cur = cur->parent; - if (cur == NULL) break; - if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL); - if (cur->next != NULL) return(cur->next); - } while (cur != NULL); - return(cur); -} - -/* - * xmlXPathIsAncestor: - * @ancestor: the ancestor node - * @node: the current node - * - * Check that @ancestor is a @node's ancestor - * - * returns 1 if @ancestor is a @node's ancestor, 0 otherwise. - */ -static int -xmlXPathIsAncestor(xmlNodePtr ancestor, xmlNodePtr node) { - if ((ancestor == NULL) || (node == NULL)) return(0); - /* nodes need to be in the same document */ - if (ancestor->doc != node->doc) return(0); - /* avoid searching if ancestor or node is the root node */ - if (ancestor == (xmlNodePtr) node->doc) return(1); - if (node == (xmlNodePtr) ancestor->doc) return(0); - while (node->parent != NULL) { - if (node->parent == ancestor) - return(1); - node = node->parent; - } - return(0); -} - -/** - * xmlXPathNextPreceding: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "preceding" direction - * the preceding axis contains all nodes in the same document as the context - * node that are before the context node in document order, excluding any - * ancestors and excluding attribute nodes and namespace nodes; the nodes are - * ordered in reverse document order - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) -{ - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) - cur = ctxt->context->node; - if (cur == NULL) - return (NULL); - if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) - cur = cur->prev; - do { - if (cur->prev != NULL) { - for (cur = cur->prev; cur->last != NULL; cur = cur->last) ; - return (cur); - } - - cur = cur->parent; - if (cur == NULL) - return (NULL); - if (cur == ctxt->context->doc->children) - return (NULL); - } while (xmlXPathIsAncestor(cur, ctxt->context->node)); - return (cur); -} - -/** - * xmlXPathNextPrecedingInternal: - * @ctxt: the XPath Parser context - * @cur: the current node in the traversal - * - * Traversal function for the "preceding" direction - * the preceding axis contains all nodes in the same document as the context - * node that are before the context node in document order, excluding any - * ancestors and excluding attribute nodes and namespace nodes; the nodes are - * ordered in reverse document order - * This is a faster implementation but internal only since it requires a - * state kept in the parser context: ctxt->ancestor. - * - * Returns the next element following that axis - */ -static xmlNodePtr -xmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt, - xmlNodePtr cur) -{ - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (cur == NULL) { - cur = ctxt->context->node; - if (cur == NULL) - return (NULL); - if (cur->type == XML_NAMESPACE_DECL) - cur = (xmlNodePtr)((xmlNsPtr)cur)->next; - ctxt->ancestor = cur->parent; - } - if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) - cur = cur->prev; - while (cur->prev == NULL) { - cur = cur->parent; - if (cur == NULL) - return (NULL); - if (cur == ctxt->context->doc->children) - return (NULL); - if (cur != ctxt->ancestor) - return (cur); - ctxt->ancestor = cur->parent; - } - cur = cur->prev; - while (cur->last != NULL) - cur = cur->last; - return (cur); -} - -/** - * xmlXPathNextNamespace: - * @ctxt: the XPath Parser context - * @cur: the current attribute in the traversal - * - * Traversal function for the "namespace" direction - * the namespace axis contains the namespace nodes of the context node; - * the order of nodes on this axis is implementation-defined; the axis will - * be empty unless the context node is an element - * - * We keep the XML namespace node at the end of the list. - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL); - if (ctxt->context->tmpNsList == NULL && cur != (xmlNodePtr) xmlXPathXMLNamespace) { - if (ctxt->context->tmpNsList != NULL) - xmlFree(ctxt->context->tmpNsList); - ctxt->context->tmpNsList = - xmlGetNsList(ctxt->context->doc, ctxt->context->node); - ctxt->context->tmpNsNr = 0; - if (ctxt->context->tmpNsList != NULL) { - while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] != NULL) { - ctxt->context->tmpNsNr++; - } - } - return((xmlNodePtr) xmlXPathXMLNamespace); - } - if (ctxt->context->tmpNsNr > 0) { - return (xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr]; - } else { - if (ctxt->context->tmpNsList != NULL) - xmlFree(ctxt->context->tmpNsList); - ctxt->context->tmpNsList = NULL; - return(NULL); - } -} - -/** - * xmlXPathNextAttribute: - * @ctxt: the XPath Parser context - * @cur: the current attribute in the traversal - * - * Traversal function for the "attribute" direction - * TODO: support DTD inherited default attributes - * - * Returns the next element following that axis - */ -xmlNodePtr -xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { - if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); - if (ctxt->context->node == NULL) - return(NULL); - if (ctxt->context->node->type != XML_ELEMENT_NODE) - return(NULL); - if (cur == NULL) { - if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) - return(NULL); - return((xmlNodePtr)ctxt->context->node->properties); - } - return((xmlNodePtr)cur->next); -} - -/************************************************************************ - * * - * NodeTest Functions * - * * - ************************************************************************/ - -#define IS_FUNCTION 200 - - -/************************************************************************ - * * - * Implicit tree core function library * - * * - ************************************************************************/ - -/** - * xmlXPathRoot: - * @ctxt: the XPath Parser context - * - * Initialize the context to the root of the document - */ -void -xmlXPathRoot(xmlXPathParserContextPtr ctxt) { - if ((ctxt == NULL) || (ctxt->context == NULL)) - return; - ctxt->context->node = (xmlNodePtr) ctxt->context->doc; - valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node)); -} - -/************************************************************************ - * * - * The explicit core function library * - *http://www.w3.org/Style/XSL/Group/1999/07/xpath-19990705.html#corelib * - * * - ************************************************************************/ - - -/** - * xmlXPathLastFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the last() XPath function - * number last() - * The last function returns the number of nodes in the context node list. - */ -void -xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs) { - CHECK_ARITY(0); - if (ctxt->context->contextSize >= 0) { - valuePush(ctxt, - xmlXPathCacheNewFloat(ctxt->context, - (double) ctxt->context->contextSize)); -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, - "last() : %d\n", ctxt->context->contextSize); -#endif - } else { - XP_ERROR(XPATH_INVALID_CTXT_SIZE); - } -} - -/** - * xmlXPathPositionFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the position() XPath function - * number position() - * The position function returns the position of the context node in the - * context node list. The first position is 1, and so the last position - * will be equal to last(). - */ -void -xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs) { - CHECK_ARITY(0); - if (ctxt->context->proximityPosition >= 0) { - valuePush(ctxt, - xmlXPathCacheNewFloat(ctxt->context, - (double) ctxt->context->proximityPosition)); -#ifdef DEBUG_EXPR - xmlGenericError(xmlGenericErrorContext, "position() : %d\n", - ctxt->context->proximityPosition); -#endif - } else { - XP_ERROR(XPATH_INVALID_CTXT_POSITION); - } -} - -/** - * xmlXPathCountFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the count() XPath function - * number count(node-set) - */ -void -xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur; - - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_NODESET) && - (ctxt->value->type != XPATH_XSLT_TREE))) - XP_ERROR(XPATH_INVALID_TYPE); - cur = valuePop(ctxt); - - if ((cur == NULL) || (cur->nodesetval == NULL)) - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); - else if ((cur->type == XPATH_NODESET) || (cur->type == XPATH_XSLT_TREE)) { - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, - (double) cur->nodesetval->nodeNr)); - } else { - if ((cur->nodesetval->nodeNr != 1) || - (cur->nodesetval->nodeTab == NULL)) { - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); - } else { - xmlNodePtr tmp; - int i = 0; - - tmp = cur->nodesetval->nodeTab[0]; - if (tmp != NULL) { - tmp = tmp->children; - while (tmp != NULL) { - tmp = tmp->next; - i++; - } - } - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) i)); - } - } - xmlXPathReleaseObject(ctxt->context, cur); -} - -/** - * xmlXPathGetElementsByIds: - * @doc: the document - * @ids: a whitespace separated list of IDs - * - * Selects elements by their unique ID. - * - * Returns a node-set of selected elements. - */ -static xmlNodeSetPtr -xmlXPathGetElementsByIds (xmlDocPtr doc, const xmlChar *ids) { - xmlNodeSetPtr ret; - const xmlChar *cur = ids; - xmlChar *ID; - xmlAttrPtr attr; - xmlNodePtr elem = NULL; - - if (ids == NULL) return(NULL); - - ret = xmlXPathNodeSetCreate(NULL); - - while (IS_BLANK_CH(*cur)) cur++; - while (*cur != 0) { - while ((!IS_BLANK_CH(*cur)) && (*cur != 0)) - cur++; - - ID = xmlStrndup(ids, cur - ids); - if (ID != NULL) { - /* - * We used to check the fact that the value passed - * was an NCName, but this generated much troubles for - * me and Aleksey Sanin, people blatantly violated that - * constaint, like Visa3D spec. - * if (xmlValidateNCName(ID, 1) == 0) - */ - attr = xmlGetID(doc, ID); - if (attr != NULL) { - if (attr->type == XML_ATTRIBUTE_NODE) - elem = attr->parent; - else if (attr->type == XML_ELEMENT_NODE) - elem = (xmlNodePtr) attr; - else - elem = NULL; - if (elem != NULL) - xmlXPathNodeSetAdd(ret, elem); - } - xmlFree(ID); - } - - while (IS_BLANK_CH(*cur)) cur++; - ids = cur; - } - return(ret); -} - -/** - * xmlXPathIdFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the id() XPath function - * node-set id(object) - * The id function selects elements by their unique ID - * (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, - * then the result is the union of the result of applying id to the - * string value of each of the nodes in the argument node-set. When the - * argument to id is of any other type, the argument is converted to a - * string as if by a call to the string function; the string is split - * into a whitespace-separated list of tokens (whitespace is any sequence - * of characters matching the production S); the result is a node-set - * containing the elements in the same document as the context node that - * have a unique ID equal to any of the tokens in the list. - */ -void -xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlChar *tokens; - xmlNodeSetPtr ret; - xmlXPathObjectPtr obj; - - CHECK_ARITY(1); - obj = valuePop(ctxt); - if (obj == NULL) XP_ERROR(XPATH_INVALID_OPERAND); - if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { - xmlNodeSetPtr ns; - int i; - - ret = xmlXPathNodeSetCreate(NULL); - - if (obj->nodesetval != NULL) { - for (i = 0; i < obj->nodesetval->nodeNr; i++) { - tokens = - xmlXPathCastNodeToString(obj->nodesetval->nodeTab[i]); - ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens); - ret = xmlXPathNodeSetMerge(ret, ns); - xmlXPathFreeNodeSet(ns); - if (tokens != NULL) - xmlFree(tokens); - } - } - xmlXPathReleaseObject(ctxt->context, obj); - valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); - return; - } - obj = xmlXPathCacheConvertString(ctxt->context, obj); - ret = xmlXPathGetElementsByIds(ctxt->context->doc, obj->stringval); - valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); - xmlXPathReleaseObject(ctxt->context, obj); - return; -} - -/** - * xmlXPathLocalNameFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the local-name() XPath function - * string local-name(node-set?) - * The local-name function returns a string containing the local part - * of the name of the node in the argument node-set that is first in - * document order. If the node-set is empty or the first node has no - * name, an empty string is returned. If the argument is omitted it - * defaults to the context node. - */ -void -xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur; - - if (ctxt == NULL) return; - - if (nargs == 0) { - valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node)); - nargs = 1; - } - - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_NODESET) && - (ctxt->value->type != XPATH_XSLT_TREE))) - XP_ERROR(XPATH_INVALID_TYPE); - cur = valuePop(ctxt); - - if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { - valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); - } else { - int i = 0; /* Should be first in document order !!!!! */ - switch (cur->nodesetval->nodeTab[i]->type) { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - case XML_PI_NODE: - if (cur->nodesetval->nodeTab[i]->name[0] == ' ') - valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); - else - valuePush(ctxt, - xmlXPathCacheNewString(ctxt->context, - cur->nodesetval->nodeTab[i]->name)); - break; - case XML_NAMESPACE_DECL: - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, - ((xmlNsPtr)cur->nodesetval->nodeTab[i])->prefix)); - break; - default: - valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); - } - } - xmlXPathReleaseObject(ctxt->context, cur); -} - -/** - * xmlXPathNamespaceURIFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the namespace-uri() XPath function - * string namespace-uri(node-set?) - * The namespace-uri function returns a string containing the - * namespace URI of the expanded name of the node in the argument - * node-set that is first in document order. If the node-set is empty, - * the first node has no name, or the expanded name has no namespace - * URI, an empty string is returned. If the argument is omitted it - * defaults to the context node. - */ -void -xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur; - - if (ctxt == NULL) return; - - if (nargs == 0) { - valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node)); - nargs = 1; - } - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_NODESET) && - (ctxt->value->type != XPATH_XSLT_TREE))) - XP_ERROR(XPATH_INVALID_TYPE); - cur = valuePop(ctxt); - - if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { - valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); - } else { - int i = 0; /* Should be first in document order !!!!! */ - switch (cur->nodesetval->nodeTab[i]->type) { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - if (cur->nodesetval->nodeTab[i]->ns == NULL) - valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); - else - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, - cur->nodesetval->nodeTab[i]->ns->href)); - break; - default: - valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); - } - } - xmlXPathReleaseObject(ctxt->context, cur); -} - -/** - * xmlXPathNameFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the name() XPath function - * string name(node-set?) - * The name function returns a string containing a QName representing - * the name of the node in the argument node-set that is first in document - * order. The QName must represent the name with respect to the namespace - * declarations in effect on the node whose name is being represented. - * Typically, this will be the form in which the name occurred in the XML - * source. This need not be the case if there are namespace declarations - * in effect on the node that associate multiple prefixes with the same - * namespace. However, an implementation may include information about - * the original prefix in its representation of nodes; in this case, an - * implementation can ensure that the returned string is always the same - * as the QName used in the XML source. If the argument it omitted it - * defaults to the context node. - * Libxml keep the original prefix so the "real qualified name" used is - * returned. - */ -static void -xmlXPathNameFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - xmlXPathObjectPtr cur; - - if (nargs == 0) { - valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node)); - nargs = 1; - } - - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_NODESET) && - (ctxt->value->type != XPATH_XSLT_TREE))) - XP_ERROR(XPATH_INVALID_TYPE); - cur = valuePop(ctxt); - - if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { - valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); - } else { - int i = 0; /* Should be first in document order !!!!! */ - - switch (cur->nodesetval->nodeTab[i]->type) { - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - if (cur->nodesetval->nodeTab[i]->name[0] == ' ') - valuePush(ctxt, - xmlXPathCacheNewCString(ctxt->context, "")); - else if ((cur->nodesetval->nodeTab[i]->ns == NULL) || - (cur->nodesetval->nodeTab[i]->ns->prefix == NULL)) { - valuePush(ctxt, - xmlXPathCacheNewString(ctxt->context, - cur->nodesetval->nodeTab[i]->name)); - } else { - xmlChar *fullname; - - fullname = xmlBuildQName(cur->nodesetval->nodeTab[i]->name, - cur->nodesetval->nodeTab[i]->ns->prefix, - NULL, 0); - if (fullname == cur->nodesetval->nodeTab[i]->name) - fullname = xmlStrdup(cur->nodesetval->nodeTab[i]->name); - if (fullname == NULL) { - XP_ERROR(XPATH_MEMORY_ERROR); - } - valuePush(ctxt, xmlXPathCacheWrapString( - ctxt->context, fullname)); - } - break; - default: - valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, - cur->nodesetval->nodeTab[i])); - xmlXPathLocalNameFunction(ctxt, 1); - } - } - xmlXPathReleaseObject(ctxt->context, cur); -} - - -/** - * xmlXPathStringFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the string() XPath function - * string string(object?) - * The string function converts an object to a string as follows: - * - A node-set is converted to a string by returning the value of - * the node in the node-set that is first in document order. - * If the node-set is empty, an empty string is returned. - * - A number is converted to a string as follows - * + NaN is converted to the string NaN - * + positive zero is converted to the string 0 - * + negative zero is converted to the string 0 - * + positive infinity is converted to the string Infinity - * + negative infinity is converted to the string -Infinity - * + if the number is an integer, the number is represented in - * decimal form as a Number with no decimal point and no leading - * zeros, preceded by a minus sign (-) if the number is negative - * + otherwise, the number is represented in decimal form as a - * Number including a decimal point with at least one digit - * before the decimal point and at least one digit after the - * decimal point, preceded by a minus sign (-) if the number - * is negative; there must be no leading zeros before the decimal - * point apart possibly from the one required digit immediately - * before the decimal point; beyond the one required digit - * after the decimal point there must be as many, but only as - * many, more digits as are needed to uniquely distinguish the - * number from all other IEEE 754 numeric values. - * - The boolean false value is converted to the string false. - * The boolean true value is converted to the string true. - * - * If the argument is omitted, it defaults to a node-set with the - * context node as its only member. - */ -void -xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur; - - if (ctxt == NULL) return; - if (nargs == 0) { - valuePush(ctxt, - xmlXPathCacheWrapString(ctxt->context, - xmlXPathCastNodeToString(ctxt->context->node))); - return; - } - - CHECK_ARITY(1); - cur = valuePop(ctxt); - if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); - valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context, cur)); -} - -/** - * xmlXPathStringLengthFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the string-length() XPath function - * number string-length(string?) - * The string-length returns the number of characters in the string - * (see [3.6 Strings]). If the argument is omitted, it defaults to - * the context node converted to a string, in other words the value - * of the context node. - */ -void -xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur; - - if (nargs == 0) { - if ((ctxt == NULL) || (ctxt->context == NULL)) - return; - if (ctxt->context->node == NULL) { - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0)); - } else { - xmlChar *content; - - content = xmlXPathCastNodeToString(ctxt->context->node); - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, - xmlUTF8Strlen(content))); - xmlFree(content); - } - return; - } - CHECK_ARITY(1); - CAST_TO_STRING; - CHECK_TYPE(XPATH_STRING); - cur = valuePop(ctxt); - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, - xmlUTF8Strlen(cur->stringval))); - xmlXPathReleaseObject(ctxt->context, cur); -} - -/** - * xmlXPathConcatFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the concat() XPath function - * string concat(string, string, string*) - * The concat function returns the concatenation of its arguments. - */ -void -xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur, newobj; - xmlChar *tmp; - - if (ctxt == NULL) return; - if (nargs < 2) { - CHECK_ARITY(2); - } - - CAST_TO_STRING; - cur = valuePop(ctxt); - if ((cur == NULL) || (cur->type != XPATH_STRING)) { - xmlXPathReleaseObject(ctxt->context, cur); - return; - } - nargs--; - - while (nargs > 0) { - CAST_TO_STRING; - newobj = valuePop(ctxt); - if ((newobj == NULL) || (newobj->type != XPATH_STRING)) { - xmlXPathReleaseObject(ctxt->context, newobj); - xmlXPathReleaseObject(ctxt->context, cur); - XP_ERROR(XPATH_INVALID_TYPE); - } - tmp = xmlStrcat(newobj->stringval, cur->stringval); - newobj->stringval = cur->stringval; - cur->stringval = tmp; - xmlXPathReleaseObject(ctxt->context, newobj); - nargs--; - } - valuePush(ctxt, cur); -} - -/** - * xmlXPathContainsFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the contains() XPath function - * boolean contains(string, string) - * The contains function returns true if the first argument string - * contains the second argument string, and otherwise returns false. - */ -void -xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr hay, needle; - - CHECK_ARITY(2); - CAST_TO_STRING; - CHECK_TYPE(XPATH_STRING); - needle = valuePop(ctxt); - CAST_TO_STRING; - hay = valuePop(ctxt); - - if ((hay == NULL) || (hay->type != XPATH_STRING)) { - xmlXPathReleaseObject(ctxt->context, hay); - xmlXPathReleaseObject(ctxt->context, needle); - XP_ERROR(XPATH_INVALID_TYPE); - } - if (xmlStrstr(hay->stringval, needle->stringval)) - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); - else - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); - xmlXPathReleaseObject(ctxt->context, hay); - xmlXPathReleaseObject(ctxt->context, needle); -} - -/** - * xmlXPathStartsWithFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the starts-with() XPath function - * boolean starts-with(string, string) - * The starts-with function returns true if the first argument string - * starts with the second argument string, and otherwise returns false. - */ -void -xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr hay, needle; - int n; - - CHECK_ARITY(2); - CAST_TO_STRING; - CHECK_TYPE(XPATH_STRING); - needle = valuePop(ctxt); - CAST_TO_STRING; - hay = valuePop(ctxt); - - if ((hay == NULL) || (hay->type != XPATH_STRING)) { - xmlXPathReleaseObject(ctxt->context, hay); - xmlXPathReleaseObject(ctxt->context, needle); - XP_ERROR(XPATH_INVALID_TYPE); - } - n = xmlStrlen(needle->stringval); - if (xmlStrncmp(hay->stringval, needle->stringval, n)) - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); - else - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); - xmlXPathReleaseObject(ctxt->context, hay); - xmlXPathReleaseObject(ctxt->context, needle); -} - -/** - * xmlXPathSubstringFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the substring() XPath function - * string substring(string, number, number?) - * The substring function returns the substring of the first argument - * starting at the position specified in the second argument with - * length specified in the third argument. For example, - * substring("12345",2,3) returns "234". If the third argument is not - * specified, it returns the substring starting at the position specified - * in the second argument and continuing to the end of the string. For - * example, substring("12345",2) returns "2345". More precisely, each - * character in the string (see [3.6 Strings]) is considered to have a - * numeric position: the position of the first character is 1, the position - * of the second character is 2 and so on. The returned substring contains - * those characters for which the position of the character is greater than - * or equal to the second argument and, if the third argument is specified, - * less than the sum of the second and third arguments; the comparisons - * and addition used for the above follow the standard IEEE 754 rules. Thus: - * - substring("12345", 1.5, 2.6) returns "234" - * - substring("12345", 0, 3) returns "12" - * - substring("12345", 0 div 0, 3) returns "" - * - substring("12345", 1, 0 div 0) returns "" - * - substring("12345", -42, 1 div 0) returns "12345" - * - substring("12345", -1 div 0, 1 div 0) returns "" - */ -void -xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr str, start, len; - double le=0, in; - int i, l, m; - xmlChar *ret; - - if (nargs < 2) { - CHECK_ARITY(2); - } - if (nargs > 3) { - CHECK_ARITY(3); - } - /* - * take care of possible last (position) argument - */ - if (nargs == 3) { - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - len = valuePop(ctxt); - le = len->floatval; - xmlXPathReleaseObject(ctxt->context, len); - } - - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - start = valuePop(ctxt); - in = start->floatval; - xmlXPathReleaseObject(ctxt->context, start); - CAST_TO_STRING; - CHECK_TYPE(XPATH_STRING); - str = valuePop(ctxt); - m = xmlUTF8Strlen((const unsigned char *)str->stringval); - - /* - * If last pos not present, calculate last position - */ - if (nargs != 3) { - le = (double)m; - if (in < 1.0) - in = 1.0; - } - - /* Need to check for the special cases where either - * the index is NaN, the length is NaN, or both - * arguments are infinity (relying on Inf + -Inf = NaN) - */ - if (!xmlXPathIsNaN(in + le) && !xmlXPathIsInf(in)) { - /* - * To meet the requirements of the spec, the arguments - * must be converted to integer format before - * initial index calculations are done - * - * First we go to integer form, rounding up - * and checking for special cases - */ - i = (int) in; - if (((double)i)+0.5 <= in) i++; - - if (xmlXPathIsInf(le) == 1) { - l = m; - if (i < 1) - i = 1; - } - else if (xmlXPathIsInf(le) == -1 || le < 0.0) - l = 0; - else { - l = (int) le; - if (((double)l)+0.5 <= le) l++; - } - - /* Now we normalize inidices */ - i -= 1; - l += i; - if (i < 0) - i = 0; - if (l > m) - l = m; - - /* number of chars to copy */ - l -= i; - - ret = xmlUTF8Strsub(str->stringval, i, l); - } - else { - ret = NULL; - } - if (ret == NULL) - valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); - else { - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, ret)); - xmlFree(ret); - } - xmlXPathReleaseObject(ctxt->context, str); -} - -/** - * xmlXPathSubstringBeforeFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the substring-before() XPath function - * string substring-before(string, string) - * The substring-before function returns the substring of the first - * argument string that precedes the first occurrence of the second - * argument string in the first argument string, or the empty string - * if the first argument string does not contain the second argument - * string. For example, substring-before("1999/04/01","/") returns 1999. - */ -void -xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr str; - xmlXPathObjectPtr find; - xmlBufferPtr target; - const xmlChar *point; - int offset; - - CHECK_ARITY(2); - CAST_TO_STRING; - find = valuePop(ctxt); - CAST_TO_STRING; - str = valuePop(ctxt); - - target = xmlBufferCreate(); - if (target) { - point = xmlStrstr(str->stringval, find->stringval); - if (point) { - offset = (int)(point - str->stringval); - xmlBufferAdd(target, str->stringval, offset); - } - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, - xmlBufferContent(target))); - xmlBufferFree(target); - } - xmlXPathReleaseObject(ctxt->context, str); - xmlXPathReleaseObject(ctxt->context, find); -} - -/** - * xmlXPathSubstringAfterFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the substring-after() XPath function - * string substring-after(string, string) - * The substring-after function returns the substring of the first - * argument string that follows the first occurrence of the second - * argument string in the first argument string, or the empty stringi - * if the first argument string does not contain the second argument - * string. For example, substring-after("1999/04/01","/") returns 04/01, - * and substring-after("1999/04/01","19") returns 99/04/01. - */ -void -xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr str; - xmlXPathObjectPtr find; - xmlBufferPtr target; - const xmlChar *point; - int offset; - - CHECK_ARITY(2); - CAST_TO_STRING; - find = valuePop(ctxt); - CAST_TO_STRING; - str = valuePop(ctxt); - - target = xmlBufferCreate(); - if (target) { - point = xmlStrstr(str->stringval, find->stringval); - if (point) { - offset = (int)(point - str->stringval) + xmlStrlen(find->stringval); - xmlBufferAdd(target, &str->stringval[offset], - xmlStrlen(str->stringval) - offset); - } - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, - xmlBufferContent(target))); - xmlBufferFree(target); - } - xmlXPathReleaseObject(ctxt->context, str); - xmlXPathReleaseObject(ctxt->context, find); -} - -/** - * xmlXPathNormalizeFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the normalize-space() XPath function - * string normalize-space(string?) - * The normalize-space function returns the argument string with white - * space normalized by stripping leading and trailing whitespace - * and replacing sequences of whitespace characters by a single - * space. Whitespace characters are the same allowed by the S production - * in XML. If the argument is omitted, it defaults to the context - * node converted to a string, in other words the value of the context node. - */ -void -xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr obj = NULL; - xmlChar *source = NULL; - xmlBufferPtr target; - xmlChar blank; - - if (ctxt == NULL) return; - if (nargs == 0) { - /* Use current context node */ - valuePush(ctxt, - xmlXPathCacheWrapString(ctxt->context, - xmlXPathCastNodeToString(ctxt->context->node))); - nargs = 1; - } - - CHECK_ARITY(1); - CAST_TO_STRING; - CHECK_TYPE(XPATH_STRING); - obj = valuePop(ctxt); - source = obj->stringval; - - target = xmlBufferCreate(); - if (target && source) { - - /* Skip leading whitespaces */ - while (IS_BLANK_CH(*source)) - source++; - - /* Collapse intermediate whitespaces, and skip trailing whitespaces */ - blank = 0; - while (*source) { - if (IS_BLANK_CH(*source)) { - blank = 0x20; - } else { - if (blank) { - xmlBufferAdd(target, &blank, 1); - blank = 0; - } - xmlBufferAdd(target, source, 1); - } - source++; - } - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, - xmlBufferContent(target))); - xmlBufferFree(target); - } - xmlXPathReleaseObject(ctxt->context, obj); -} - -/** - * xmlXPathTranslateFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the translate() XPath function - * string translate(string, string, string) - * The translate function returns the first argument string with - * occurrences of characters in the second argument string replaced - * by the character at the corresponding position in the third argument - * string. For example, translate("bar","abc","ABC") returns the string - * BAr. If there is a character in the second argument string with no - * character at a corresponding position in the third argument string - * (because the second argument string is longer than the third argument - * string), then occurrences of that character in the first argument - * string are removed. For example, translate("--aaa--","abc-","ABC") - * returns "AAA". If a character occurs more than once in second - * argument string, then the first occurrence determines the replacement - * character. If the third argument string is longer than the second - * argument string, then excess characters are ignored. - */ -void -xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr str; - xmlXPathObjectPtr from; - xmlXPathObjectPtr to; - xmlBufferPtr target; - int offset, max; - xmlChar ch; - const xmlChar *point; - xmlChar *cptr; - - CHECK_ARITY(3); - - CAST_TO_STRING; - to = valuePop(ctxt); - CAST_TO_STRING; - from = valuePop(ctxt); - CAST_TO_STRING; - str = valuePop(ctxt); - - target = xmlBufferCreate(); - if (target) { - max = xmlUTF8Strlen(to->stringval); - for (cptr = str->stringval; (ch=*cptr); ) { - offset = xmlUTF8Strloc(from->stringval, cptr); - if (offset >= 0) { - if (offset < max) { - point = xmlUTF8Strpos(to->stringval, offset); - if (point) - xmlBufferAdd(target, point, xmlUTF8Strsize(point, 1)); - } - } else - xmlBufferAdd(target, cptr, xmlUTF8Strsize(cptr, 1)); - - /* Step to next character in input */ - cptr++; - if ( ch & 0x80 ) { - /* if not simple ascii, verify proper format */ - if ( (ch & 0xc0) != 0xc0 ) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathTranslateFunction: Invalid UTF8 string\n"); - break; - } - /* then skip over remaining bytes for this char */ - while ( (ch <<= 1) & 0x80 ) - if ( (*cptr++ & 0xc0) != 0x80 ) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathTranslateFunction: Invalid UTF8 string\n"); - break; - } - if (ch & 0x80) /* must have had error encountered */ - break; - } - } - } - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, - xmlBufferContent(target))); - xmlBufferFree(target); - xmlXPathReleaseObject(ctxt->context, str); - xmlXPathReleaseObject(ctxt->context, from); - xmlXPathReleaseObject(ctxt->context, to); -} - -/** - * xmlXPathBooleanFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the boolean() XPath function - * boolean boolean(object) - * The boolean function converts its argument to a boolean as follows: - * - a number is true if and only if it is neither positive or - * negative zero nor NaN - * - a node-set is true if and only if it is non-empty - * - a string is true if and only if its length is non-zero - */ -void -xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur; - - CHECK_ARITY(1); - cur = valuePop(ctxt); - if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); - cur = xmlXPathCacheConvertBoolean(ctxt->context, cur); - valuePush(ctxt, cur); -} - -/** - * xmlXPathNotFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the not() XPath function - * boolean not(boolean) - * The not function returns true if its argument is false, - * and false otherwise. - */ -void -xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs) { - CHECK_ARITY(1); - CAST_TO_BOOLEAN; - CHECK_TYPE(XPATH_BOOLEAN); - ctxt->value->boolval = ! ctxt->value->boolval; -} - -/** - * xmlXPathTrueFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the true() XPath function - * boolean true() - */ -void -xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs) { - CHECK_ARITY(0); - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); -} - -/** - * xmlXPathFalseFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the false() XPath function - * boolean false() - */ -void -xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs) { - CHECK_ARITY(0); - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); -} - -/** - * xmlXPathLangFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the lang() XPath function - * boolean lang(string) - * The lang function returns true or false depending on whether the - * language of the context node as specified by xml:lang attributes - * is the same as or is a sublanguage of the language specified by - * the argument string. The language of the context node is determined - * by the value of the xml:lang attribute on the context node, or, if - * the context node has no xml:lang attribute, by the value of the - * xml:lang attribute on the nearest ancestor of the context node that - * has an xml:lang attribute. If there is no such attribute, then lang - * returns false. If there is such an attribute, then lang returns - * true if the attribute value is equal to the argument ignoring case, - * or if there is some suffix starting with - such that the attribute - * value is equal to the argument ignoring that suffix of the attribute - * value and ignoring case. - */ -void -xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr val = NULL; - const xmlChar *theLang = NULL; - const xmlChar *lang; - int ret = 0; - int i; - - CHECK_ARITY(1); - CAST_TO_STRING; - CHECK_TYPE(XPATH_STRING); - val = valuePop(ctxt); - lang = val->stringval; - theLang = xmlNodeGetLang(ctxt->context->node); - if ((theLang != NULL) && (lang != NULL)) { - for (i = 0;lang[i] != 0;i++) - if (toupper(lang[i]) != toupper(theLang[i])) - goto not_equal; - if ((theLang[i] == 0) || (theLang[i] == '-')) - ret = 1; - } -not_equal: - if (theLang != NULL) - xmlFree((void *)theLang); - - xmlXPathReleaseObject(ctxt->context, val); - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); -} - -/** - * xmlXPathNumberFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the number() XPath function - * number number(object?) - */ -void -xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur; - double res; - - if (ctxt == NULL) return; - if (nargs == 0) { - if (ctxt->context->node == NULL) { - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0)); - } else { - xmlChar* content = xmlNodeGetContent(ctxt->context->node); - - res = xmlXPathStringEvalNumber(content); - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); - xmlFree(content); - } - return; - } - - CHECK_ARITY(1); - cur = valuePop(ctxt); - valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context, cur)); -} - -/** - * xmlXPathSumFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the sum() XPath function - * number sum(node-set) - * The sum function returns the sum of the values of the nodes in - * the argument node-set. - */ -void -xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr cur; - int i; - double res = 0.0; - - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_NODESET) && - (ctxt->value->type != XPATH_XSLT_TREE))) - XP_ERROR(XPATH_INVALID_TYPE); - cur = valuePop(ctxt); - - if ((cur->nodesetval != NULL) && (cur->nodesetval->nodeNr != 0)) { - for (i = 0; i < cur->nodesetval->nodeNr; i++) { - res += xmlXPathCastNodeToNumber(cur->nodesetval->nodeTab[i]); - } - } - valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); - xmlXPathReleaseObject(ctxt->context, cur); -} - -/* - * To assure working code on multiple platforms, we want to only depend - * upon the characteristic truncation of converting a floating point value - * to an integer. Unfortunately, because of the different storage sizes - * of our internal floating point value (double) and integer (int), we - * can't directly convert (see bug 301162). This macro is a messy - * 'workaround' - */ -#define XTRUNC(f, v) \ - f = fmod((v), INT_MAX); \ - f = (v) - (f) + (double)((int)(f)); - -/** - * xmlXPathFloorFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the floor() XPath function - * number floor(number) - * The floor function returns the largest (closest to positive infinity) - * number that is not greater than the argument and that is an integer. - */ -void -xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) { - double f; - - CHECK_ARITY(1); - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - - XTRUNC(f, ctxt->value->floatval); - if (f != ctxt->value->floatval) { - if (ctxt->value->floatval > 0) - ctxt->value->floatval = f; - else - ctxt->value->floatval = f - 1; - } -} - -/** - * xmlXPathCeilingFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the ceiling() XPath function - * number ceiling(number) - * The ceiling function returns the smallest (closest to negative infinity) - * number that is not less than the argument and that is an integer. - */ -void -xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) { - double f; - - CHECK_ARITY(1); - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - -#if 0 - ctxt->value->floatval = ceil(ctxt->value->floatval); -#else - XTRUNC(f, ctxt->value->floatval); - if (f != ctxt->value->floatval) { - if (ctxt->value->floatval > 0) - ctxt->value->floatval = f + 1; - else { - if (ctxt->value->floatval < 0 && f == 0) - ctxt->value->floatval = xmlXPathNZERO; - else - ctxt->value->floatval = f; - } - - } -#endif -} - -/** - * xmlXPathRoundFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the round() XPath function - * number round(number) - * The round function returns the number that is closest to the - * argument and that is an integer. If there are two such numbers, - * then the one that is even is returned. - */ -void -xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) { - double f; - - CHECK_ARITY(1); - CAST_TO_NUMBER; - CHECK_TYPE(XPATH_NUMBER); - - if ((xmlXPathIsNaN(ctxt->value->floatval)) || - (xmlXPathIsInf(ctxt->value->floatval) == 1) || - (xmlXPathIsInf(ctxt->value->floatval) == -1) || - (ctxt->value->floatval == 0.0)) - return; - - XTRUNC(f, ctxt->value->floatval); - if (ctxt->value->floatval < 0) { - if (ctxt->value->floatval < f - 0.5) - ctxt->value->floatval = f - 1; - else - ctxt->value->floatval = f; - if (ctxt->value->floatval == 0) - ctxt->value->floatval = xmlXPathNZERO; - } else { - if (ctxt->value->floatval < f + 0.5) - ctxt->value->floatval = f; - else - ctxt->value->floatval = f + 1; - } -} - -/************************************************************************ - * * - * The Parser * - * * - ************************************************************************/ - -/* - * a few forward declarations since we use a recursive call based - * implementation. - */ -static void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort); -static void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter); -static void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt); -static void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt); -static xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, - int qualified); - -/** - * xmlXPathCurrentChar: - * @ctxt: the XPath parser context - * @cur: pointer to the beginning of the char - * @len: pointer to the length of the char read - * - * The current char value, if using UTF-8 this may actually span multiple - * bytes in the input buffer. - * - * Returns the current char value and its length - */ - -static int -xmlXPathCurrentChar(xmlXPathParserContextPtr ctxt, int *len) { - unsigned char c; - unsigned int val; - const xmlChar *cur; - - if (ctxt == NULL) - return(0); - cur = ctxt->cur; - - /* - * We are supposed to handle UTF8, check it's valid - * From rfc2044: encoding of the Unicode values on UTF-8: - * - * UCS-4 range (hex.) UTF-8 octet sequence (binary) - * 0000 0000-0000 007F 0xxxxxxx - * 0000 0080-0000 07FF 110xxxxx 10xxxxxx - * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx - * - * Check for the 0x110000 limit too - */ - c = *cur; - if (c & 0x80) { - if ((cur[1] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xe0) == 0xe0) { - - if ((cur[2] & 0xc0) != 0x80) - goto encoding_error; - if ((c & 0xf0) == 0xf0) { - if (((c & 0xf8) != 0xf0) || - ((cur[3] & 0xc0) != 0x80)) - goto encoding_error; - /* 4-byte code */ - *len = 4; - val = (cur[0] & 0x7) << 18; - val |= (cur[1] & 0x3f) << 12; - val |= (cur[2] & 0x3f) << 6; - val |= cur[3] & 0x3f; - } else { - /* 3-byte code */ - *len = 3; - val = (cur[0] & 0xf) << 12; - val |= (cur[1] & 0x3f) << 6; - val |= cur[2] & 0x3f; - } - } else { - /* 2-byte code */ - *len = 2; - val = (cur[0] & 0x1f) << 6; - val |= cur[1] & 0x3f; - } - if (!IS_CHAR(val)) { - XP_ERROR0(XPATH_INVALID_CHAR_ERROR); - } - return(val); - } else { - /* 1-byte code */ - *len = 1; - return((int) *cur); - } -encoding_error: - /* - * If we detect an UTF8 error that probably means that the - * input encoding didn't get properly advertised in the - * declaration header. Report the error and switch the encoding - * to ISO-Latin-1 (if you don't like this policy, just declare the - * encoding !) - */ - *len = 0; - XP_ERROR0(XPATH_ENCODING_ERROR); -} - -/** - * xmlXPathParseNCName: - * @ctxt: the XPath Parser context - * - * parse an XML namespace non qualified name. - * - * [NS 3] NCName ::= (Letter | '_') (NCNameChar)* - * - * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | - * CombiningChar | Extender - * - * Returns the namespace name or NULL - */ - -xmlChar * -xmlXPathParseNCName(xmlXPathParserContextPtr ctxt) { - const xmlChar *in; - xmlChar *ret; - int count = 0; - - if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); - /* - * Accelerator for simple ASCII names - */ - in = ctxt->cur; - if (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - (*in == '_')) { - in++; - while (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - ((*in >= 0x30) && (*in <= 0x39)) || - (*in == '_') || (*in == '.') || - (*in == '-')) - in++; - if ((*in == ' ') || (*in == '>') || (*in == '/') || - (*in == '[') || (*in == ']') || (*in == ':') || - (*in == '@') || (*in == '*')) { - count = in - ctxt->cur; - if (count == 0) - return(NULL); - ret = xmlStrndup(ctxt->cur, count); - ctxt->cur = in; - return(ret); - } - } - return(xmlXPathParseNameComplex(ctxt, 0)); -} - - -/** - * xmlXPathParseQName: - * @ctxt: the XPath Parser context - * @prefix: a xmlChar ** - * - * parse an XML qualified name - * - * [NS 5] QName ::= (Prefix ':')? LocalPart - * - * [NS 6] Prefix ::= NCName - * - * [NS 7] LocalPart ::= NCName - * - * Returns the function returns the local part, and prefix is updated - * to get the Prefix if any. - */ - -static xmlChar * -xmlXPathParseQName(xmlXPathParserContextPtr ctxt, xmlChar **prefix) { - xmlChar *ret = NULL; - - *prefix = NULL; - ret = xmlXPathParseNCName(ctxt); - if (CUR == ':') { - *prefix = ret; - NEXT; - ret = xmlXPathParseNCName(ctxt); - } - return(ret); -} - -/** - * xmlXPathParseName: - * @ctxt: the XPath Parser context - * - * parse an XML name - * - * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | - * CombiningChar | Extender - * - * [5] Name ::= (Letter | '_' | ':') (NameChar)* - * - * Returns the namespace name or NULL - */ - -xmlChar * -xmlXPathParseName(xmlXPathParserContextPtr ctxt) { - const xmlChar *in; - xmlChar *ret; - int count = 0; - - if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); - /* - * Accelerator for simple ASCII names - */ - in = ctxt->cur; - if (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - (*in == '_') || (*in == ':')) { - in++; - while (((*in >= 0x61) && (*in <= 0x7A)) || - ((*in >= 0x41) && (*in <= 0x5A)) || - ((*in >= 0x30) && (*in <= 0x39)) || - (*in == '_') || (*in == '-') || - (*in == ':') || (*in == '.')) - in++; - if ((*in > 0) && (*in < 0x80)) { - count = in - ctxt->cur; - ret = xmlStrndup(ctxt->cur, count); - ctxt->cur = in; - return(ret); - } - } - return(xmlXPathParseNameComplex(ctxt, 1)); -} - -static xmlChar * -xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, int qualified) { - xmlChar buf[XML_MAX_NAMELEN + 5]; - int len = 0, l; - int c; - - /* - * Handler for more complex cases - */ - c = CUR_CHAR(l); - if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ - (c == '[') || (c == ']') || (c == '@') || /* accelerators */ - (c == '*') || /* accelerators */ - (!IS_LETTER(c) && (c != '_') && - ((qualified) && (c != ':')))) { - return(NULL); - } - - while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ - ((IS_LETTER(c)) || (IS_DIGIT(c)) || - (c == '.') || (c == '-') || - (c == '_') || ((qualified) && (c == ':')) || - (IS_COMBINING(c)) || - (IS_EXTENDER(c)))) { - COPY_BUF(l,buf,len,c); - NEXTL(l); - c = CUR_CHAR(l); - if (len >= XML_MAX_NAMELEN) { - /* - * Okay someone managed to make a huge name, so he's ready to pay - * for the processing speed. - */ - xmlChar *buffer; - int max = len * 2; - - buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); - if (buffer == NULL) { - XP_ERRORNULL(XPATH_MEMORY_ERROR); - } - memcpy(buffer, buf, len); - while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigname.xml */ - (c == '.') || (c == '-') || - (c == '_') || ((qualified) && (c == ':')) || - (IS_COMBINING(c)) || - (IS_EXTENDER(c))) { - if (len + 10 > max) { - max *= 2; - buffer = (xmlChar *) xmlRealloc(buffer, - max * sizeof(xmlChar)); - if (buffer == NULL) { - XP_ERRORNULL(XPATH_MEMORY_ERROR); - } - } - COPY_BUF(l,buffer,len,c); - NEXTL(l); - c = CUR_CHAR(l); - } - buffer[len] = 0; - return(buffer); - } - } - if (len == 0) - return(NULL); - return(xmlStrndup(buf, len)); -} - -#define MAX_FRAC 20 - -/* - * These are used as divisors for the fractional part of a number. - * Since the table includes 1.0 (representing '0' fractional digits), - * it must be dimensioned at MAX_FRAC+1 (bug 133921) - */ -static double my_pow10[MAX_FRAC+1] = { - 1.0, 10.0, 100.0, 1000.0, 10000.0, - 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, - 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, - 100000000000000.0, - 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, - 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0 -}; - -/** - * xmlXPathStringEvalNumber: - * @str: A string to scan - * - * [30a] Float ::= Number ('e' Digits?)? - * - * [30] Number ::= Digits ('.' Digits?)? - * | '.' Digits - * [31] Digits ::= [0-9]+ - * - * Compile a Number in the string - * In complement of the Number expression, this function also handles - * negative values : '-' Number. - * - * Returns the double value. - */ -double -xmlXPathStringEvalNumber(const xmlChar *str) { - const xmlChar *cur = str; - double ret; - int ok = 0; - int isneg = 0; - int exponent = 0; - int is_exponent_negative = 0; -#ifdef __GNUC__ - unsigned long tmp = 0; - double temp; -#endif - if (cur == NULL) return(0); - while (IS_BLANK_CH(*cur)) cur++; - if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) { - return(xmlXPathNAN); - } - if (*cur == '-') { - isneg = 1; - cur++; - } - -#ifdef __GNUC__ - /* - * tmp/temp is a workaround against a gcc compiler bug - * http://veillard.com/gcc.bug - */ - ret = 0; - while ((*cur >= '0') && (*cur <= '9')) { - ret = ret * 10; - tmp = (*cur - '0'); - ok = 1; - cur++; - temp = (double) tmp; - ret = ret + temp; - } -#else - ret = 0; - while ((*cur >= '0') && (*cur <= '9')) { - ret = ret * 10 + (*cur - '0'); - ok = 1; - cur++; - } -#endif - - if (*cur == '.') { - int v, frac = 0; - double fraction = 0; - - cur++; - if (((*cur < '0') || (*cur > '9')) && (!ok)) { - return(xmlXPathNAN); - } - while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) { - v = (*cur - '0'); - fraction = fraction * 10 + v; - frac = frac + 1; - cur++; - } - fraction /= my_pow10[frac]; - ret = ret + fraction; - while ((*cur >= '0') && (*cur <= '9')) - cur++; - } - if ((*cur == 'e') || (*cur == 'E')) { - cur++; - if (*cur == '-') { - is_exponent_negative = 1; - cur++; - } else if (*cur == '+') { - cur++; - } - while ((*cur >= '0') && (*cur <= '9')) { - exponent = exponent * 10 + (*cur - '0'); - cur++; - } - } - while (IS_BLANK_CH(*cur)) cur++; - if (*cur != 0) return(xmlXPathNAN); - if (isneg) ret = -ret; - if (is_exponent_negative) exponent = -exponent; - ret *= pow(10.0, (double)exponent); - return(ret); -} - -/** - * xmlXPathCompNumber: - * @ctxt: the XPath Parser context - * - * [30] Number ::= Digits ('.' Digits?)? - * | '.' Digits - * [31] Digits ::= [0-9]+ - * - * Compile a Number, then push it on the stack - * - */ -static void -xmlXPathCompNumber(xmlXPathParserContextPtr ctxt) -{ - double ret = 0.0; - double mult = 1; - int ok = 0; - int exponent = 0; - int is_exponent_negative = 0; -#ifdef __GNUC__ - unsigned long tmp = 0; - double temp; -#endif - - CHECK_ERROR; - if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) { - XP_ERROR(XPATH_NUMBER_ERROR); - } -#ifdef __GNUC__ - /* - * tmp/temp is a workaround against a gcc compiler bug - * http://veillard.com/gcc.bug - */ - ret = 0; - while ((CUR >= '0') && (CUR <= '9')) { - ret = ret * 10; - tmp = (CUR - '0'); - ok = 1; - NEXT; - temp = (double) tmp; - ret = ret + temp; - } -#else - ret = 0; - while ((CUR >= '0') && (CUR <= '9')) { - ret = ret * 10 + (CUR - '0'); - ok = 1; - NEXT; - } -#endif - if (CUR == '.') { - NEXT; - if (((CUR < '0') || (CUR > '9')) && (!ok)) { - XP_ERROR(XPATH_NUMBER_ERROR); - } - while ((CUR >= '0') && (CUR <= '9')) { - mult /= 10; - ret = ret + (CUR - '0') * mult; - NEXT; - } - } - if ((CUR == 'e') || (CUR == 'E')) { - NEXT; - if (CUR == '-') { - is_exponent_negative = 1; - NEXT; - } else if (CUR == '+') { - NEXT; - } - while ((CUR >= '0') && (CUR <= '9')) { - exponent = exponent * 10 + (CUR - '0'); - NEXT; - } - if (is_exponent_negative) - exponent = -exponent; - ret *= pow(10.0, (double) exponent); - } - PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0, - xmlXPathCacheNewFloat(ctxt->context, ret), NULL); -} - -/** - * xmlXPathParseLiteral: - * @ctxt: the XPath Parser context - * - * Parse a Literal - * - * [29] Literal ::= '"' [^"]* '"' - * | "'" [^']* "'" - * - * Returns the value found or NULL in case of error - */ -static xmlChar * -xmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) { - const xmlChar *q; - xmlChar *ret = NULL; - - if (CUR == '"') { - NEXT; - q = CUR_PTR; - while ((IS_CHAR_CH(CUR)) && (CUR != '"')) - NEXT; - if (!IS_CHAR_CH(CUR)) { - XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); - } else { - ret = xmlStrndup(q, CUR_PTR - q); - NEXT; - } - } else if (CUR == '\'') { - NEXT; - q = CUR_PTR; - while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) - NEXT; - if (!IS_CHAR_CH(CUR)) { - XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); - } else { - ret = xmlStrndup(q, CUR_PTR - q); - NEXT; - } - } else { - XP_ERRORNULL(XPATH_START_LITERAL_ERROR); - } - return(ret); -} - -/** - * xmlXPathCompLiteral: - * @ctxt: the XPath Parser context - * - * Parse a Literal and push it on the stack. - * - * [29] Literal ::= '"' [^"]* '"' - * | "'" [^']* "'" - * - * TODO: xmlXPathCompLiteral memory allocation could be improved. - */ -static void -xmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) { - const xmlChar *q; - xmlChar *ret = NULL; - - if (CUR == '"') { - NEXT; - q = CUR_PTR; - while ((IS_CHAR_CH(CUR)) && (CUR != '"')) - NEXT; - if (!IS_CHAR_CH(CUR)) { - XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); - } else { - ret = xmlStrndup(q, CUR_PTR - q); - NEXT; - } - } else if (CUR == '\'') { - NEXT; - q = CUR_PTR; - while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) - NEXT; - if (!IS_CHAR_CH(CUR)) { - XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); - } else { - ret = xmlStrndup(q, CUR_PTR - q); - NEXT; - } - } else { - XP_ERROR(XPATH_START_LITERAL_ERROR); - } - if (ret == NULL) return; - PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0, - xmlXPathCacheNewString(ctxt->context, ret), NULL); - xmlFree(ret); -} - -/** - * xmlXPathCompVariableReference: - * @ctxt: the XPath Parser context - * - * Parse a VariableReference, evaluate it and push it on the stack. - * - * The variable bindings consist of a mapping from variable names - * to variable values. The value of a variable is an object, which can be - * of any of the types that are possible for the value of an expression, - * and may also be of additional types not specified here. - * - * Early evaluation is possible since: - * The variable bindings [...] used to evaluate a subexpression are - * always the same as those used to evaluate the containing expression. - * - * [36] VariableReference ::= '$' QName - */ -static void -xmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) { - xmlChar *name; - xmlChar *prefix; - - SKIP_BLANKS; - if (CUR != '$') { - XP_ERROR(XPATH_VARIABLE_REF_ERROR); - } - NEXT; - name = xmlXPathParseQName(ctxt, &prefix); - if (name == NULL) { - XP_ERROR(XPATH_VARIABLE_REF_ERROR); - } - ctxt->comp->last = -1; - PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0, - name, prefix); - SKIP_BLANKS; - if ((ctxt->context != NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) { - XP_ERROR(XPATH_UNDEF_VARIABLE_ERROR); - } -} - -/** - * xmlXPathIsNodeType: - * @name: a name string - * - * Is the name given a NodeType one. - * - * [38] NodeType ::= 'comment' - * | 'text' - * | 'processing-instruction' - * | 'node' - * - * Returns 1 if true 0 otherwise - */ -int -xmlXPathIsNodeType(const xmlChar *name) { - if (name == NULL) - return(0); - - if (xmlStrEqual(name, BAD_CAST "node")) - return(1); - if (xmlStrEqual(name, BAD_CAST "text")) - return(1); - if (xmlStrEqual(name, BAD_CAST "comment")) - return(1); - if (xmlStrEqual(name, BAD_CAST "processing-instruction")) - return(1); - return(0); -} - -/** - * xmlXPathCompFunctionCall: - * @ctxt: the XPath Parser context - * - * [16] FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument)*)? ')' - * [17] Argument ::= Expr - * - * Compile a function call, the evaluation of all arguments are - * pushed on the stack - */ -static void -xmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) { - xmlChar *name; - xmlChar *prefix; - int nbargs = 0; - int sort = 1; - - name = xmlXPathParseQName(ctxt, &prefix); - if (name == NULL) { - XP_ERROR(XPATH_EXPR_ERROR); - } - SKIP_BLANKS; -#ifdef DEBUG_EXPR - if (prefix == NULL) - xmlGenericError(xmlGenericErrorContext, "Calling function %s\n", - name); - else - xmlGenericError(xmlGenericErrorContext, "Calling function %s:%s\n", - prefix, name); -#endif - - if (CUR != '(') { - XP_ERROR(XPATH_EXPR_ERROR); - } - NEXT; - SKIP_BLANKS; - - /* - * Optimization for count(): we don't need the node-set to be sorted. - */ - if ((prefix == NULL) && (name[0] == 'c') && - xmlStrEqual(name, BAD_CAST "count")) - { - sort = 0; - } - ctxt->comp->last = -1; - if (CUR != ')') { - while (CUR != 0) { - int op1 = ctxt->comp->last; - ctxt->comp->last = -1; - xmlXPathCompileExpr(ctxt, sort); - CHECK_ERROR; - PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0); - nbargs++; - if (CUR == ')') break; - if (CUR != ',') { - XP_ERROR(XPATH_EXPR_ERROR); - } - NEXT; - SKIP_BLANKS; - } - } - PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0, - name, prefix); - NEXT; - SKIP_BLANKS; -} - -/** - * xmlXPathCompPrimaryExpr: - * @ctxt: the XPath Parser context - * - * [15] PrimaryExpr ::= VariableReference - * | '(' Expr ')' - * | Literal - * | Number - * | FunctionCall - * - * Compile a primary expression. - */ -static void -xmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) { - SKIP_BLANKS; - if (CUR == '$') xmlXPathCompVariableReference(ctxt); - else if (CUR == '(') { - NEXT; - SKIP_BLANKS; - xmlXPathCompileExpr(ctxt, 1); - CHECK_ERROR; - if (CUR != ')') { - XP_ERROR(XPATH_EXPR_ERROR); - } - NEXT; - SKIP_BLANKS; - } else if (IS_ASCII_DIGIT(CUR) || (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { - xmlXPathCompNumber(ctxt); - } else if ((CUR == '\'') || (CUR == '"')) { - xmlXPathCompLiteral(ctxt); - } else { - xmlXPathCompFunctionCall(ctxt); - } - SKIP_BLANKS; -} - -/** - * xmlXPathCompFilterExpr: - * @ctxt: the XPath Parser context - * - * [20] FilterExpr ::= PrimaryExpr - * | FilterExpr Predicate - * - * Compile a filter expression. - * Square brackets are used to filter expressions in the same way that - * they are used in location paths. It is an error if the expression to - * be filtered does not evaluate to a node-set. The context node list - * used for evaluating the expression in square brackets is the node-set - * to be filtered listed in document order. - */ - -static void -xmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) { - xmlXPathCompPrimaryExpr(ctxt); - CHECK_ERROR; - SKIP_BLANKS; - - while (CUR == '[') { - xmlXPathCompPredicate(ctxt, 1); - SKIP_BLANKS; - } - - -} - -/** - * xmlXPathScanName: - * @ctxt: the XPath Parser context - * - * Trickery: parse an XML name but without consuming the input flow - * Needed to avoid insanity in the parser state. - * - * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | - * CombiningChar | Extender - * - * [5] Name ::= (Letter | '_' | ':') (NameChar)* - * - * [6] Names ::= Name (S Name)* - * - * Returns the Name parsed or NULL - */ - -static xmlChar * -xmlXPathScanName(xmlXPathParserContextPtr ctxt) { - int len = 0, l; - int c; - const xmlChar *cur; - xmlChar *ret; - - cur = ctxt->cur; - - c = CUR_CHAR(l); - if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ - (!IS_LETTER(c) && (c != '_') && - (c != ':'))) { - return(NULL); - } - - while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ - ((IS_LETTER(c)) || (IS_DIGIT(c)) || - (c == '.') || (c == '-') || - (c == '_') || (c == ':') || - (IS_COMBINING(c)) || - (IS_EXTENDER(c)))) { - len += l; - NEXTL(l); - c = CUR_CHAR(l); - } - ret = xmlStrndup(cur, ctxt->cur - cur); - ctxt->cur = cur; - return(ret); -} - -/** - * xmlXPathCompPathExpr: - * @ctxt: the XPath Parser context - * - * [19] PathExpr ::= LocationPath - * | FilterExpr - * | FilterExpr '/' RelativeLocationPath - * | FilterExpr '//' RelativeLocationPath - * - * Compile a path expression. - * The / operator and // operators combine an arbitrary expression - * and a relative location path. It is an error if the expression - * does not evaluate to a node-set. - * The / operator does composition in the same way as when / is - * used in a location path. As in location paths, // is short for - * /descendant-or-self::node()/. - */ - -static void -xmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) { - int lc = 1; /* Should we branch to LocationPath ? */ - xmlChar *name = NULL; /* we may have to preparse a name to find out */ - - SKIP_BLANKS; - if ((CUR == '$') || (CUR == '(') || - (IS_ASCII_DIGIT(CUR)) || - (CUR == '\'') || (CUR == '"') || - (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { - lc = 0; - } else if (CUR == '*') { - /* relative or absolute location path */ - lc = 1; - } else if (CUR == '/') { - /* relative or absolute location path */ - lc = 1; - } else if (CUR == '@') { - /* relative abbreviated attribute location path */ - lc = 1; - } else if (CUR == '.') { - /* relative abbreviated attribute location path */ - lc = 1; - } else { - /* - * Problem is finding if we have a name here whether it's: - * - a nodetype - * - a function call in which case it's followed by '(' - * - an axis in which case it's followed by ':' - * - a element name - * We do an a priori analysis here rather than having to - * maintain parsed token content through the recursive function - * calls. This looks uglier but makes the code easier to - * read/write/debug. - */ - SKIP_BLANKS; - name = xmlXPathScanName(ctxt); - if ((name != NULL) && (xmlStrstr(name, (xmlChar *) "::") != NULL)) { -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "PathExpr: Axis\n"); -#endif - lc = 1; - xmlFree(name); - } else if (name != NULL) { - int len =xmlStrlen(name); - - - while (NXT(len) != 0) { - if (NXT(len) == '/') { - /* element name */ -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "PathExpr: AbbrRelLocation\n"); -#endif - lc = 1; - break; - } else if (IS_BLANK_CH(NXT(len))) { - /* ignore blanks */ - ; - } else if (NXT(len) == ':') { -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "PathExpr: AbbrRelLocation\n"); -#endif - lc = 1; - break; - } else if ((NXT(len) == '(')) { - /* Note Type or Function */ - if (xmlXPathIsNodeType(name)) { -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "PathExpr: Type search\n"); -#endif - lc = 1; - } else { -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "PathExpr: function call\n"); -#endif - lc = 0; - } - break; - } else if ((NXT(len) == '[')) { - /* element name */ -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "PathExpr: AbbrRelLocation\n"); -#endif - lc = 1; - break; - } else if ((NXT(len) == '<') || (NXT(len) == '>') || - (NXT(len) == '=')) { - lc = 1; - break; - } else { - lc = 1; - break; - } - len++; - } - if (NXT(len) == 0) { -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "PathExpr: AbbrRelLocation\n"); -#endif - /* element name */ - lc = 1; - } - xmlFree(name); - } else { - /* make sure all cases are covered explicitly */ - XP_ERROR(XPATH_EXPR_ERROR); - } - } - - if (lc) { - if (CUR == '/') { - PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0); - } else { - PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); - } - xmlXPathCompLocationPath(ctxt); - } else { - xmlXPathCompFilterExpr(ctxt); - CHECK_ERROR; - if ((CUR == '/') && (NXT(1) == '/')) { - SKIP(2); - SKIP_BLANKS; - - PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, - NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); - PUSH_UNARY_EXPR(XPATH_OP_RESET, ctxt->comp->last, 1, 0); - - xmlXPathCompRelativeLocationPath(ctxt); - } else if (CUR == '/') { - xmlXPathCompRelativeLocationPath(ctxt); - } - } - SKIP_BLANKS; -} - -/** - * xmlXPathCompUnionExpr: - * @ctxt: the XPath Parser context - * - * [18] UnionExpr ::= PathExpr - * | UnionExpr '|' PathExpr - * - * Compile an union expression. - */ - -static void -xmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) { - xmlXPathCompPathExpr(ctxt); - CHECK_ERROR; - SKIP_BLANKS; - while (CUR == '|') { - int op1 = ctxt->comp->last; - PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); - - NEXT; - SKIP_BLANKS; - xmlXPathCompPathExpr(ctxt); - - PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0); - - SKIP_BLANKS; - } -} - -/** - * xmlXPathCompUnaryExpr: - * @ctxt: the XPath Parser context - * - * [27] UnaryExpr ::= UnionExpr - * | '-' UnaryExpr - * - * Compile an unary expression. - */ - -static void -xmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) { - int minus = 0; - int found = 0; - - SKIP_BLANKS; - while (CUR == '-') { - minus = 1 - minus; - found = 1; - NEXT; - SKIP_BLANKS; - } - - xmlXPathCompUnionExpr(ctxt); - CHECK_ERROR; - if (found) { - if (minus) - PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0); - else - PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0); - } -} - -/** - * xmlXPathCompMultiplicativeExpr: - * @ctxt: the XPath Parser context - * - * [26] MultiplicativeExpr ::= UnaryExpr - * | MultiplicativeExpr MultiplyOperator UnaryExpr - * | MultiplicativeExpr 'div' UnaryExpr - * | MultiplicativeExpr 'mod' UnaryExpr - * [34] MultiplyOperator ::= '*' - * - * Compile an Additive expression. - */ - -static void -xmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) { - xmlXPathCompUnaryExpr(ctxt); - CHECK_ERROR; - SKIP_BLANKS; - while ((CUR == '*') || - ((CUR == 'd') && (NXT(1) == 'i') && (NXT(2) == 'v')) || - ((CUR == 'm') && (NXT(1) == 'o') && (NXT(2) == 'd'))) { - int op = -1; - int op1 = ctxt->comp->last; - - if (CUR == '*') { - op = 0; - NEXT; - } else if (CUR == 'd') { - op = 1; - SKIP(3); - } else if (CUR == 'm') { - op = 2; - SKIP(3); - } - SKIP_BLANKS; - xmlXPathCompUnaryExpr(ctxt); - CHECK_ERROR; - PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last, op, 0); - SKIP_BLANKS; - } -} - -/** - * xmlXPathCompAdditiveExpr: - * @ctxt: the XPath Parser context - * - * [25] AdditiveExpr ::= MultiplicativeExpr - * | AdditiveExpr '+' MultiplicativeExpr - * | AdditiveExpr '-' MultiplicativeExpr - * - * Compile an Additive expression. - */ - -static void -xmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) { - - xmlXPathCompMultiplicativeExpr(ctxt); - CHECK_ERROR; - SKIP_BLANKS; - while ((CUR == '+') || (CUR == '-')) { - int plus; - int op1 = ctxt->comp->last; - - if (CUR == '+') plus = 1; - else plus = 0; - NEXT; - SKIP_BLANKS; - xmlXPathCompMultiplicativeExpr(ctxt); - CHECK_ERROR; - PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last, plus, 0); - SKIP_BLANKS; - } -} - -/** - * xmlXPathCompRelationalExpr: - * @ctxt: the XPath Parser context - * - * [24] RelationalExpr ::= AdditiveExpr - * | RelationalExpr '<' AdditiveExpr - * | RelationalExpr '>' AdditiveExpr - * | RelationalExpr '<=' AdditiveExpr - * | RelationalExpr '>=' AdditiveExpr - * - * A <= B > C is allowed ? Answer from James, yes with - * (AdditiveExpr <= AdditiveExpr) > AdditiveExpr - * which is basically what got implemented. - * - * Compile a Relational expression, then push the result - * on the stack - */ - -static void -xmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) { - xmlXPathCompAdditiveExpr(ctxt); - CHECK_ERROR; - SKIP_BLANKS; - while ((CUR == '<') || - (CUR == '>') || - ((CUR == '<') && (NXT(1) == '=')) || - ((CUR == '>') && (NXT(1) == '='))) { - int inf, strict; - int op1 = ctxt->comp->last; - - if (CUR == '<') inf = 1; - else inf = 0; - if (NXT(1) == '=') strict = 0; - else strict = 1; - NEXT; - if (!strict) NEXT; - SKIP_BLANKS; - xmlXPathCompAdditiveExpr(ctxt); - CHECK_ERROR; - PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf, strict); - SKIP_BLANKS; - } -} - -/** - * xmlXPathCompEqualityExpr: - * @ctxt: the XPath Parser context - * - * [23] EqualityExpr ::= RelationalExpr - * | EqualityExpr '=' RelationalExpr - * | EqualityExpr '!=' RelationalExpr - * - * A != B != C is allowed ? Answer from James, yes with - * (RelationalExpr = RelationalExpr) = RelationalExpr - * (RelationalExpr != RelationalExpr) != RelationalExpr - * which is basically what got implemented. - * - * Compile an Equality expression. - * - */ -static void -xmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) { - xmlXPathCompRelationalExpr(ctxt); - CHECK_ERROR; - SKIP_BLANKS; - while ((CUR == '=') || ((CUR == '!') && (NXT(1) == '='))) { - int eq; - int op1 = ctxt->comp->last; - - if (CUR == '=') eq = 1; - else eq = 0; - NEXT; - if (!eq) NEXT; - SKIP_BLANKS; - xmlXPathCompRelationalExpr(ctxt); - CHECK_ERROR; - PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last, eq, 0); - SKIP_BLANKS; - } -} - -/** - * xmlXPathCompAndExpr: - * @ctxt: the XPath Parser context - * - * [22] AndExpr ::= EqualityExpr - * | AndExpr 'and' EqualityExpr - * - * Compile an AND expression. - * - */ -static void -xmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) { - xmlXPathCompEqualityExpr(ctxt); - CHECK_ERROR; - SKIP_BLANKS; - while ((CUR == 'a') && (NXT(1) == 'n') && (NXT(2) == 'd')) { - int op1 = ctxt->comp->last; - SKIP(3); - SKIP_BLANKS; - xmlXPathCompEqualityExpr(ctxt); - CHECK_ERROR; - PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0); - SKIP_BLANKS; - } -} - -/** - * xmlXPathCompileExpr: - * @ctxt: the XPath Parser context - * - * [14] Expr ::= OrExpr - * [21] OrExpr ::= AndExpr - * | OrExpr 'or' AndExpr - * - * Parse and compile an expression - */ -static void -xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort) { - xmlXPathCompAndExpr(ctxt); - CHECK_ERROR; - SKIP_BLANKS; - while ((CUR == 'o') && (NXT(1) == 'r')) { - int op1 = ctxt->comp->last; - SKIP(2); - SKIP_BLANKS; - xmlXPathCompAndExpr(ctxt); - CHECK_ERROR; - PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0); - op1 = ctxt->comp->nbStep; - SKIP_BLANKS; - } - if ((sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) { - /* more ops could be optimized too */ - /* - * This is the main place to eliminate sorting for - * operations which don't require a sorted node-set. - * E.g. count(). - */ - PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0); - } -} - -/** - * xmlXPathCompPredicate: - * @ctxt: the XPath Parser context - * @filter: act as a filter - * - * [8] Predicate ::= '[' PredicateExpr ']' - * [9] PredicateExpr ::= Expr - * - * Compile a predicate expression - */ -static void -xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter) { - int op1 = ctxt->comp->last; - - SKIP_BLANKS; - if (CUR != '[') { - XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); - } - NEXT; - SKIP_BLANKS; - - ctxt->comp->last = -1; - /* - * This call to xmlXPathCompileExpr() will deactivate sorting - * of the predicate result. - * TODO: Sorting is still activated for filters, since I'm not - * sure if needed. Normally sorting should not be needed, since - * a filter can only diminish the number of items in a sequence, - * but won't change its order; so if the initial sequence is sorted, - * subsequent sorting is not needed. - */ - if (! filter) - xmlXPathCompileExpr(ctxt, 0); - else - xmlXPathCompileExpr(ctxt, 1); - CHECK_ERROR; - - if (CUR != ']') { - XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); - } - - if (filter) - PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0); - else - PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0); - - NEXT; - SKIP_BLANKS; -} - -/** - * xmlXPathCompNodeTest: - * @ctxt: the XPath Parser context - * @test: pointer to a xmlXPathTestVal - * @type: pointer to a xmlXPathTypeVal - * @prefix: placeholder for a possible name prefix - * - * [7] NodeTest ::= NameTest - * | NodeType '(' ')' - * | 'processing-instruction' '(' Literal ')' - * - * [37] NameTest ::= '*' - * | NCName ':' '*' - * | QName - * [38] NodeType ::= 'comment' - * | 'text' - * | 'processing-instruction' - * | 'node' - * - * Returns the name found and updates @test, @type and @prefix appropriately - */ -static xmlChar * -xmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *test, - xmlXPathTypeVal *type, const xmlChar **prefix, - xmlChar *name) { - int blanks; - - if ((test == NULL) || (type == NULL) || (prefix == NULL)) { - STRANGE; - return(NULL); - } - *type = (xmlXPathTypeVal) 0; - *test = (xmlXPathTestVal) 0; - *prefix = NULL; - SKIP_BLANKS; - - if ((name == NULL) && (CUR == '*')) { - /* - * All elements - */ - NEXT; - *test = NODE_TEST_ALL; - return(NULL); - } - - if (name == NULL) - name = xmlXPathParseNCName(ctxt); - if (name == NULL) { - XP_ERRORNULL(XPATH_EXPR_ERROR); - } - - blanks = IS_BLANK_CH(CUR); - SKIP_BLANKS; - if (CUR == '(') { - NEXT; - /* - * NodeType or PI search - */ - if (xmlStrEqual(name, BAD_CAST "comment")) - *type = NODE_TYPE_COMMENT; - else if (xmlStrEqual(name, BAD_CAST "node")) - *type = NODE_TYPE_NODE; - else if (xmlStrEqual(name, BAD_CAST "processing-instruction")) - *type = NODE_TYPE_PI; - else if (xmlStrEqual(name, BAD_CAST "text")) - *type = NODE_TYPE_TEXT; - else { - if (name != NULL) - xmlFree(name); - XP_ERRORNULL(XPATH_EXPR_ERROR); - } - - *test = NODE_TEST_TYPE; - - SKIP_BLANKS; - if (*type == NODE_TYPE_PI) { - /* - * Specific case: search a PI by name. - */ - if (name != NULL) - xmlFree(name); - name = NULL; - if (CUR != ')') { - name = xmlXPathParseLiteral(ctxt); - CHECK_ERROR NULL; - *test = NODE_TEST_PI; - SKIP_BLANKS; - } - } - if (CUR != ')') { - if (name != NULL) - xmlFree(name); - XP_ERRORNULL(XPATH_UNCLOSED_ERROR); - } - NEXT; - return(name); - } - *test = NODE_TEST_NAME; - if ((!blanks) && (CUR == ':')) { - NEXT; - - /* - * Since currently the parser context don't have a - * namespace list associated: - * The namespace name for this prefix can be computed - * only at evaluation time. The compilation is done - * outside of any context. - */ -#if 0 - *prefix = xmlXPathNsLookup(ctxt->context, name); - if (name != NULL) - xmlFree(name); - if (*prefix == NULL) { - XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); - } -#else - *prefix = name; -#endif - - if (CUR == '*') { - /* - * All elements - */ - NEXT; - *test = NODE_TEST_ALL; - return(NULL); - } - - name = xmlXPathParseNCName(ctxt); - if (name == NULL) { - XP_ERRORNULL(XPATH_EXPR_ERROR); - } - } - return(name); -} - -/** - * xmlXPathIsAxisName: - * @name: a preparsed name token - * - * [6] AxisName ::= 'ancestor' - * | 'ancestor-or-self' - * | 'attribute' - * | 'child' - * | 'descendant' - * | 'descendant-or-self' - * | 'following' - * | 'following-sibling' - * | 'namespace' - * | 'parent' - * | 'preceding' - * | 'preceding-sibling' - * | 'self' - * - * Returns the axis or 0 - */ -static xmlXPathAxisVal -xmlXPathIsAxisName(const xmlChar *name) { - xmlXPathAxisVal ret = (xmlXPathAxisVal) 0; - switch (name[0]) { - case 'a': - if (xmlStrEqual(name, BAD_CAST "ancestor")) - ret = AXIS_ANCESTOR; - if (xmlStrEqual(name, BAD_CAST "ancestor-or-self")) - ret = AXIS_ANCESTOR_OR_SELF; - if (xmlStrEqual(name, BAD_CAST "attribute")) - ret = AXIS_ATTRIBUTE; - break; - case 'c': - if (xmlStrEqual(name, BAD_CAST "child")) - ret = AXIS_CHILD; - break; - case 'd': - if (xmlStrEqual(name, BAD_CAST "descendant")) - ret = AXIS_DESCENDANT; - if (xmlStrEqual(name, BAD_CAST "descendant-or-self")) - ret = AXIS_DESCENDANT_OR_SELF; - break; - case 'f': - if (xmlStrEqual(name, BAD_CAST "following")) - ret = AXIS_FOLLOWING; - if (xmlStrEqual(name, BAD_CAST "following-sibling")) - ret = AXIS_FOLLOWING_SIBLING; - break; - case 'n': - if (xmlStrEqual(name, BAD_CAST "namespace")) - ret = AXIS_NAMESPACE; - break; - case 'p': - if (xmlStrEqual(name, BAD_CAST "parent")) - ret = AXIS_PARENT; - if (xmlStrEqual(name, BAD_CAST "preceding")) - ret = AXIS_PRECEDING; - if (xmlStrEqual(name, BAD_CAST "preceding-sibling")) - ret = AXIS_PRECEDING_SIBLING; - break; - case 's': - if (xmlStrEqual(name, BAD_CAST "self")) - ret = AXIS_SELF; - break; - } - return(ret); -} - -/** - * xmlXPathCompStep: - * @ctxt: the XPath Parser context - * - * [4] Step ::= AxisSpecifier NodeTest Predicate* - * | AbbreviatedStep - * - * [12] AbbreviatedStep ::= '.' | '..' - * - * [5] AxisSpecifier ::= AxisName '::' - * | AbbreviatedAxisSpecifier - * - * [13] AbbreviatedAxisSpecifier ::= '@'? - * - * Modified for XPtr range support as: - * - * [4xptr] Step ::= AxisSpecifier NodeTest Predicate* - * | AbbreviatedStep - * | 'range-to' '(' Expr ')' Predicate* - * - * Compile one step in a Location Path - * A location step of . is short for self::node(). This is - * particularly useful in conjunction with //. For example, the - * location path .//para is short for - * self::node()/descendant-or-self::node()/child::para - * and so will select all para descendant elements of the context - * node. - * Similarly, a location step of .. is short for parent::node(). - * For example, ../title is short for parent::node()/child::title - * and so will select the title children of the parent of the context - * node. - */ -static void -xmlXPathCompStep(xmlXPathParserContextPtr ctxt) { -#ifdef LIBXML_XPTR_ENABLED - int rangeto = 0; - int op2 = -1; -#endif - - SKIP_BLANKS; - if ((CUR == '.') && (NXT(1) == '.')) { - SKIP(2); - SKIP_BLANKS; - PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT, - NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); - } else if (CUR == '.') { - NEXT; - SKIP_BLANKS; - } else { - xmlChar *name = NULL; - const xmlChar *prefix = NULL; - xmlXPathTestVal test = (xmlXPathTestVal) 0; - xmlXPathAxisVal axis = (xmlXPathAxisVal) 0; - xmlXPathTypeVal type = (xmlXPathTypeVal) 0; - int op1; - - /* - * The modification needed for XPointer change to the production - */ -#ifdef LIBXML_XPTR_ENABLED - if (ctxt->xptr) { - name = xmlXPathParseNCName(ctxt); - if ((name != NULL) && (xmlStrEqual(name, BAD_CAST "range-to"))) { - op2 = ctxt->comp->last; - xmlFree(name); - SKIP_BLANKS; - if (CUR != '(') { - XP_ERROR(XPATH_EXPR_ERROR); - } - NEXT; - SKIP_BLANKS; - - xmlXPathCompileExpr(ctxt, 1); - /* PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, ctxt->comp->last, 0, 0); */ - CHECK_ERROR; - - SKIP_BLANKS; - if (CUR != ')') { - XP_ERROR(XPATH_EXPR_ERROR); - } - NEXT; - rangeto = 1; - goto eval_predicates; - } - } -#endif - if (CUR == '*') { - axis = AXIS_CHILD; - } else { - if (name == NULL) - name = xmlXPathParseNCName(ctxt); - if (name != NULL) { - axis = xmlXPathIsAxisName(name); - if (axis != 0) { - SKIP_BLANKS; - if ((CUR == ':') && (NXT(1) == ':')) { - SKIP(2); - xmlFree(name); - name = NULL; - } else { - /* an element name can conflict with an axis one :-\ */ - axis = AXIS_CHILD; - } - } else { - axis = AXIS_CHILD; - } - } else if (CUR == '@') { - NEXT; - axis = AXIS_ATTRIBUTE; - } else { - axis = AXIS_CHILD; - } - } - - CHECK_ERROR; - - name = xmlXPathCompNodeTest(ctxt, &test, &type, &prefix, name); - if (test == 0) - return; - - if ((prefix != NULL) && (ctxt->context != NULL) && - (ctxt->context->flags & XML_XPATH_CHECKNS)) { - if (xmlXPathNsLookup(ctxt->context, prefix) == NULL) { - xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR); - } - } -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "Basis : computing new set\n"); -#endif - -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, "Basis : "); - if (ctxt->value == NULL) - xmlGenericError(xmlGenericErrorContext, "no value\n"); - else if (ctxt->value->nodesetval == NULL) - xmlGenericError(xmlGenericErrorContext, "Empty\n"); - else - xmlGenericErrorContextNodeSet(stdout, ctxt->value->nodesetval); -#endif - -#ifdef LIBXML_XPTR_ENABLED -eval_predicates: -#endif - op1 = ctxt->comp->last; - ctxt->comp->last = -1; - - SKIP_BLANKS; - while (CUR == '[') { - xmlXPathCompPredicate(ctxt, 0); - } - -#ifdef LIBXML_XPTR_ENABLED - if (rangeto) { - PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0); - } else -#endif - PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis, - test, type, (void *)prefix, (void *)name); - - } -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, "Step : "); - if (ctxt->value == NULL) - xmlGenericError(xmlGenericErrorContext, "no value\n"); - else if (ctxt->value->nodesetval == NULL) - xmlGenericError(xmlGenericErrorContext, "Empty\n"); - else - xmlGenericErrorContextNodeSet(xmlGenericErrorContext, - ctxt->value->nodesetval); -#endif -} - -/** - * xmlXPathCompRelativeLocationPath: - * @ctxt: the XPath Parser context - * - * [3] RelativeLocationPath ::= Step - * | RelativeLocationPath '/' Step - * | AbbreviatedRelativeLocationPath - * [11] AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step - * - * Compile a relative location path. - */ -static void -xmlXPathCompRelativeLocationPath -(xmlXPathParserContextPtr ctxt) { - SKIP_BLANKS; - if ((CUR == '/') && (NXT(1) == '/')) { - SKIP(2); - SKIP_BLANKS; - PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, - NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); - } else if (CUR == '/') { - NEXT; - SKIP_BLANKS; - } - xmlXPathCompStep(ctxt); - SKIP_BLANKS; - while (CUR == '/') { - if ((CUR == '/') && (NXT(1) == '/')) { - SKIP(2); - SKIP_BLANKS; - PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, - NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); - xmlXPathCompStep(ctxt); - } else if (CUR == '/') { - NEXT; - SKIP_BLANKS; - xmlXPathCompStep(ctxt); - } - SKIP_BLANKS; - } -} - -/** - * xmlXPathCompLocationPath: - * @ctxt: the XPath Parser context - * - * [1] LocationPath ::= RelativeLocationPath - * | AbsoluteLocationPath - * [2] AbsoluteLocationPath ::= '/' RelativeLocationPath? - * | AbbreviatedAbsoluteLocationPath - * [10] AbbreviatedAbsoluteLocationPath ::= - * '//' RelativeLocationPath - * - * Compile a location path - * - * // is short for /descendant-or-self::node()/. For example, - * //para is short for /descendant-or-self::node()/child::para and - * so will select any para element in the document (even a para element - * that is a document element will be selected by //para since the - * document element node is a child of the root node); div//para is - * short for div/descendant-or-self::node()/child::para and so will - * select all para descendants of div children. - */ -static void -xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) { - SKIP_BLANKS; - if (CUR != '/') { - xmlXPathCompRelativeLocationPath(ctxt); - } else { - while (CUR == '/') { - if ((CUR == '/') && (NXT(1) == '/')) { - SKIP(2); - SKIP_BLANKS; - PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, - NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); - xmlXPathCompRelativeLocationPath(ctxt); - } else if (CUR == '/') { - NEXT; - SKIP_BLANKS; - if ((CUR != 0 ) && - ((IS_ASCII_LETTER(CUR)) || (CUR == '_') || (CUR == '.') || - (CUR == '@') || (CUR == '*'))) - xmlXPathCompRelativeLocationPath(ctxt); - } - } - } -} - -/************************************************************************ - * * - * XPath precompiled expression evaluation * - * * - ************************************************************************/ - -static int -xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op); - -#ifdef DEBUG_STEP -static void -xmlXPathDebugDumpStepAxis(xmlXPathAxisVal axis, - xmlXPathTestVal test, - int nbNodes) -{ - xmlGenericError(xmlGenericErrorContext, "new step : "); - switch (axis) { - case AXIS_ANCESTOR: - xmlGenericError(xmlGenericErrorContext, "axis 'ancestors' "); - break; - case AXIS_ANCESTOR_OR_SELF: - xmlGenericError(xmlGenericErrorContext, - "axis 'ancestors-or-self' "); - break; - case AXIS_ATTRIBUTE: - xmlGenericError(xmlGenericErrorContext, "axis 'attributes' "); - break; - case AXIS_CHILD: - xmlGenericError(xmlGenericErrorContext, "axis 'child' "); - break; - case AXIS_DESCENDANT: - xmlGenericError(xmlGenericErrorContext, "axis 'descendant' "); - break; - case AXIS_DESCENDANT_OR_SELF: - xmlGenericError(xmlGenericErrorContext, - "axis 'descendant-or-self' "); - break; - case AXIS_FOLLOWING: - xmlGenericError(xmlGenericErrorContext, "axis 'following' "); - break; - case AXIS_FOLLOWING_SIBLING: - xmlGenericError(xmlGenericErrorContext, - "axis 'following-siblings' "); - break; - case AXIS_NAMESPACE: - xmlGenericError(xmlGenericErrorContext, "axis 'namespace' "); - break; - case AXIS_PARENT: - xmlGenericError(xmlGenericErrorContext, "axis 'parent' "); - break; - case AXIS_PRECEDING: - xmlGenericError(xmlGenericErrorContext, "axis 'preceding' "); - break; - case AXIS_PRECEDING_SIBLING: - xmlGenericError(xmlGenericErrorContext, - "axis 'preceding-sibling' "); - break; - case AXIS_SELF: - xmlGenericError(xmlGenericErrorContext, "axis 'self' "); - break; - } - xmlGenericError(xmlGenericErrorContext, - " context contains %d nodes\n", nbNodes); - switch (test) { - case NODE_TEST_NONE: - xmlGenericError(xmlGenericErrorContext, - " searching for none !!!\n"); - break; - case NODE_TEST_TYPE: - xmlGenericError(xmlGenericErrorContext, - " searching for type %d\n", type); - break; - case NODE_TEST_PI: - xmlGenericError(xmlGenericErrorContext, - " searching for PI !!!\n"); - break; - case NODE_TEST_ALL: - xmlGenericError(xmlGenericErrorContext, - " searching for *\n"); - break; - case NODE_TEST_NS: - xmlGenericError(xmlGenericErrorContext, - " searching for namespace %s\n", - prefix); - break; - case NODE_TEST_NAME: - xmlGenericError(xmlGenericErrorContext, - " searching for name %s\n", name); - if (prefix != NULL) - xmlGenericError(xmlGenericErrorContext, - " with namespace %s\n", prefix); - break; - } - xmlGenericError(xmlGenericErrorContext, "Testing : "); -} -#endif /* DEBUG_STEP */ - -static int -xmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, - xmlNodeSetPtr set, - int contextSize, - int hasNsNodes) -{ - if (op->ch1 != -1) { - xmlXPathCompExprPtr comp = ctxt->comp; - /* - * Process inner predicates first. - */ - if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { - /* - * TODO: raise an internal error. - */ - } - contextSize = xmlXPathCompOpEvalPredicate(ctxt, - &comp->steps[op->ch1], set, contextSize, hasNsNodes); - CHECK_ERROR0; - if (contextSize <= 0) - return(0); - } - if (op->ch2 != -1) { - xmlXPathContextPtr xpctxt = ctxt->context; - xmlNodePtr contextNode, oldContextNode; - xmlDocPtr oldContextDoc; - int i, res, contextPos = 0, newContextSize; - xmlXPathStepOpPtr exprOp; - xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; - -#ifdef LIBXML_XPTR_ENABLED - /* - * URGENT TODO: Check the following: - * We don't expect location sets if evaluating prediates, right? - * Only filters should expect location sets, right? - */ -#endif - /* - * SPEC XPath 1.0: - * "For each node in the node-set to be filtered, the - * PredicateExpr is evaluated with that node as the - * context node, with the number of nodes in the - * node-set as the context size, and with the proximity - * position of the node in the node-set with respect to - * the axis as the context position;" - * @oldset is the node-set" to be filtered. - * - * SPEC XPath 1.0: - * "only predicates change the context position and - * context size (see [2.4 Predicates])." - * Example: - * node-set context pos - * nA 1 - * nB 2 - * nC 3 - * After applying predicate [position() > 1] : - * node-set context pos - * nB 1 - * nC 2 - */ - oldContextNode = xpctxt->node; - oldContextDoc = xpctxt->doc; - /* - * Get the expression of this predicate. - */ - exprOp = &ctxt->comp->steps[op->ch2]; - newContextSize = 0; - for (i = 0; i < set->nodeNr; i++) { - if (set->nodeTab[i] == NULL) - continue; - - contextNode = set->nodeTab[i]; - xpctxt->node = contextNode; - xpctxt->contextSize = contextSize; - xpctxt->proximityPosition = ++contextPos; - - /* - * Also set the xpath document in case things like - * key() are evaluated in the predicate. - */ - if ((contextNode->type != XML_NAMESPACE_DECL) && - (contextNode->doc != NULL)) - xpctxt->doc = contextNode->doc; - /* - * Evaluate the predicate expression with 1 context node - * at a time; this node is packaged into a node set; this - * node set is handed over to the evaluation mechanism. - */ - if (contextObj == NULL) - contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); - else - xmlXPathNodeSetAddUnique(contextObj->nodesetval, - contextNode); - - valuePush(ctxt, contextObj); - - res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); - - if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) - goto evaluation_error; - - if (res != 0) { - newContextSize++; - } else { - /* - * Remove the entry from the initial node set. - */ - set->nodeTab[i] = NULL; - if (contextNode->type == XML_NAMESPACE_DECL) - xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); - } - if (ctxt->value == contextObj) { - /* - * Don't free the temporary XPath object holding the - * context node, in order to avoid massive recreation - * inside this loop. - */ - valuePop(ctxt); - xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); - } else { - /* - * TODO: The object was lost in the evaluation machinery. - * Can this happen? Maybe in internal-error cases. - */ - contextObj = NULL; - } - } - goto evaluation_exit; - -evaluation_error: - xmlXPathNodeSetClear(set, hasNsNodes); - newContextSize = 0; - -evaluation_exit: - if (contextObj != NULL) { - if (ctxt->value == contextObj) - valuePop(ctxt); - xmlXPathReleaseObject(xpctxt, contextObj); - } - if (exprRes != NULL) - xmlXPathReleaseObject(ctxt->context, exprRes); - /* - * Reset/invalidate the context. - */ - xpctxt->node = oldContextNode; - xpctxt->doc = oldContextDoc; - xpctxt->contextSize = -1; - xpctxt->proximityPosition = -1; - return(newContextSize); - } - return(contextSize); -} - -static int -xmlXPathCompOpEvalPositionalPredicate(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, - xmlNodeSetPtr set, - int contextSize, - int minPos, - int maxPos, - int hasNsNodes) -{ - if (op->ch1 != -1) { - xmlXPathCompExprPtr comp = ctxt->comp; - if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { - /* - * TODO: raise an internal error. - */ - } - contextSize = xmlXPathCompOpEvalPredicate(ctxt, - &comp->steps[op->ch1], set, contextSize, hasNsNodes); - CHECK_ERROR0; - if (contextSize <= 0) - return(0); - } - /* - * Check if the node set contains a sufficient number of nodes for - * the requested range. - */ - if (contextSize < minPos) { - xmlXPathNodeSetClear(set, hasNsNodes); - return(0); - } - if (op->ch2 == -1) { - /* - * TODO: Can this ever happen? - */ - return (contextSize); - } else { - xmlDocPtr oldContextDoc; - int i, pos = 0, newContextSize = 0, contextPos = 0, res; - xmlXPathStepOpPtr exprOp; - xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; - xmlNodePtr oldContextNode, contextNode = NULL; - xmlXPathContextPtr xpctxt = ctxt->context; - -#ifdef LIBXML_XPTR_ENABLED - /* - * URGENT TODO: Check the following: - * We don't expect location sets if evaluating prediates, right? - * Only filters should expect location sets, right? - */ -#endif /* LIBXML_XPTR_ENABLED */ - - /* - * Save old context. - */ - oldContextNode = xpctxt->node; - oldContextDoc = xpctxt->doc; - /* - * Get the expression of this predicate. - */ - exprOp = &ctxt->comp->steps[op->ch2]; - for (i = 0; i < set->nodeNr; i++) { - if (set->nodeTab[i] == NULL) - continue; - - contextNode = set->nodeTab[i]; - xpctxt->node = contextNode; - xpctxt->contextSize = contextSize; - xpctxt->proximityPosition = ++contextPos; - - /* - * Initialize the new set. - * Also set the xpath document in case things like - * key() evaluation are attempted on the predicate - */ - if ((contextNode->type != XML_NAMESPACE_DECL) && - (contextNode->doc != NULL)) - xpctxt->doc = contextNode->doc; - /* - * Evaluate the predicate expression with 1 context node - * at a time; this node is packaged into a node set; this - * node set is handed over to the evaluation mechanism. - */ - if (contextObj == NULL) - contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); - else - xmlXPathNodeSetAddUnique(contextObj->nodesetval, - contextNode); - - valuePush(ctxt, contextObj); - res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); - - if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) - goto evaluation_error; - - if (res) - pos++; - - if (res && (pos >= minPos) && (pos <= maxPos)) { - /* - * Fits in the requested range. - */ - newContextSize++; - if (minPos == maxPos) { - /* - * Only 1 node was requested. - */ - if (contextNode->type == XML_NAMESPACE_DECL) { - /* - * As always: take care of those nasty - * namespace nodes. - */ - set->nodeTab[i] = NULL; - } - xmlXPathNodeSetClear(set, hasNsNodes); - set->nodeNr = 1; - set->nodeTab[0] = contextNode; - goto evaluation_exit; - } - if (pos == maxPos) { - /* - * We are done. - */ - xmlXPathNodeSetClearFromPos(set, i +1, hasNsNodes); - goto evaluation_exit; - } - } else { - /* - * Remove the entry from the initial node set. - */ - set->nodeTab[i] = NULL; - if (contextNode->type == XML_NAMESPACE_DECL) - xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); - } - if (exprRes != NULL) { - xmlXPathReleaseObject(ctxt->context, exprRes); - exprRes = NULL; - } - if (ctxt->value == contextObj) { - /* - * Don't free the temporary XPath object holding the - * context node, in order to avoid massive recreation - * inside this loop. - */ - valuePop(ctxt); - xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); - } else { - /* - * The object was lost in the evaluation machinery. - * Can this happen? Maybe in case of internal-errors. - */ - contextObj = NULL; - } - } - goto evaluation_exit; - -evaluation_error: - xmlXPathNodeSetClear(set, hasNsNodes); - newContextSize = 0; - -evaluation_exit: - if (contextObj != NULL) { - if (ctxt->value == contextObj) - valuePop(ctxt); - xmlXPathReleaseObject(xpctxt, contextObj); - } - if (exprRes != NULL) - xmlXPathReleaseObject(ctxt->context, exprRes); - /* - * Reset/invalidate the context. - */ - xpctxt->node = oldContextNode; - xpctxt->doc = oldContextDoc; - xpctxt->contextSize = -1; - xpctxt->proximityPosition = -1; - return(newContextSize); - } - return(contextSize); -} - -static int -xmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, - int *maxPos) -{ - - xmlXPathStepOpPtr exprOp; - - /* - * BIG NOTE: This is not intended for XPATH_OP_FILTER yet! - */ - - /* - * If not -1, then ch1 will point to: - * 1) For predicates (XPATH_OP_PREDICATE): - * - an inner predicate operator - * 2) For filters (XPATH_OP_FILTER): - * - an inner filter operater OR - * - an expression selecting the node set. - * E.g. "key('a', 'b')" or "(//foo | //bar)". - */ - if ((op->op != XPATH_OP_PREDICATE) && (op->op != XPATH_OP_FILTER)) - return(0); - - if (op->ch2 != -1) { - exprOp = &ctxt->comp->steps[op->ch2]; - } else - return(0); - - if ((exprOp != NULL) && - (exprOp->op == XPATH_OP_VALUE) && - (exprOp->value4 != NULL) && - (((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER)) - { - /* - * We have a "[n]" predicate here. - * TODO: Unfortunately this simplistic test here is not - * able to detect a position() predicate in compound - * expressions like "[@attr = 'a" and position() = 1], - * and even not the usage of position() in - * "[position() = 1]"; thus - obviously - a position-range, - * like it "[position() < 5]", is also not detected. - * Maybe we could rewrite the AST to ease the optimization. - */ - *maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval; - - if (((xmlXPathObjectPtr) exprOp->value4)->floatval == - (float) *maxPos) - { - return(1); - } - } - return(0); -} - -static int -xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, - xmlNodePtr * first, xmlNodePtr * last, - int toBool) -{ - -#define XP_TEST_HIT \ - if (hasAxisRange != 0) { \ - if (++pos == maxPos) { \ - addNode(seq, cur); \ - goto axis_range_end; } \ - } else { \ - addNode(seq, cur); \ - if (breakOnFirstHit) goto first_hit; } - -#define XP_TEST_HIT_NS \ - if (hasAxisRange != 0) { \ - if (++pos == maxPos) { \ - hasNsNodes = 1; \ - xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur); \ - goto axis_range_end; } \ - } else { \ - hasNsNodes = 1; \ - xmlXPathNodeSetAddNs(seq, \ - xpctxt->node, (xmlNsPtr) cur); \ - if (breakOnFirstHit) goto first_hit; } - - xmlXPathAxisVal axis = (xmlXPathAxisVal) op->value; - xmlXPathTestVal test = (xmlXPathTestVal) op->value2; - xmlXPathTypeVal type = (xmlXPathTypeVal) op->value3; - const xmlChar *prefix = op->value4; - const xmlChar *name = op->value5; - const xmlChar *URI = NULL; - -#ifdef DEBUG_STEP - int nbMatches = 0, prevMatches = 0; -#endif - int total = 0, hasNsNodes = 0; - /* The popped object holding the context nodes */ - xmlXPathObjectPtr obj; - /* The set of context nodes for the node tests */ - xmlNodeSetPtr contextSeq; - int contextIdx; - xmlNodePtr contextNode; - /* The context node for a compound traversal */ - xmlNodePtr outerContextNode; - /* The final resulting node set wrt to all context nodes */ - xmlNodeSetPtr outSeq; - /* - * The temporary resulting node set wrt 1 context node. - * Used to feed predicate evaluation. - */ - xmlNodeSetPtr seq; - xmlNodePtr cur; - /* First predicate operator */ - xmlXPathStepOpPtr predOp; - int maxPos; /* The requested position() (when a "[n]" predicate) */ - int hasPredicateRange, hasAxisRange, pos, size, newSize; - int breakOnFirstHit; - - xmlXPathTraversalFunction next = NULL; - /* compound axis traversal */ - xmlXPathTraversalFunctionExt outerNext = NULL; - void (*addNode) (xmlNodeSetPtr, xmlNodePtr); - xmlXPathNodeSetMergeFunction mergeAndClear; - xmlNodePtr oldContextNode; - xmlXPathContextPtr xpctxt = ctxt->context; - - - CHECK_TYPE0(XPATH_NODESET); - obj = valuePop(ctxt); - /* - * Setup namespaces. - */ - if (prefix != NULL) { - URI = xmlXPathNsLookup(xpctxt, prefix); - if (URI == NULL) { - xmlXPathReleaseObject(xpctxt, obj); - XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); - } - } - /* - * Setup axis. - * - * MAYBE FUTURE TODO: merging optimizations: - * - If the nodes to be traversed wrt to the initial nodes and - * the current axis cannot overlap, then we could avoid searching - * for duplicates during the merge. - * But the question is how/when to evaluate if they cannot overlap. - * Example: if we know that for two initial nodes, the one is - * not in the ancestor-or-self axis of the other, then we could safely - * avoid a duplicate-aware merge, if the axis to be traversed is e.g. - * the descendant-or-self axis. - */ - addNode = xmlXPathNodeSetAdd; - mergeAndClear = xmlXPathNodeSetMergeAndClear; - switch (axis) { - case AXIS_ANCESTOR: - first = NULL; - next = xmlXPathNextAncestor; - break; - case AXIS_ANCESTOR_OR_SELF: - first = NULL; - next = xmlXPathNextAncestorOrSelf; - break; - case AXIS_ATTRIBUTE: - first = NULL; - last = NULL; - next = xmlXPathNextAttribute; - mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; - break; - case AXIS_CHILD: - last = NULL; - if (op->rewriteType == XP_REWRITE_DOS_CHILD_ELEM) { - /* - * This iterator will give us only nodes which can - * hold element nodes. - */ - outerNext = xmlXPathNextDescendantOrSelfElemParent; - } - if (((test == NODE_TEST_NAME) || (test == NODE_TEST_ALL)) && - (type == NODE_TYPE_NODE)) - { - /* - * Optimization if an element node type is 'element'. - */ - next = xmlXPathNextChildElement; - } else - next = xmlXPathNextChild; - mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; - break; - case AXIS_DESCENDANT: - last = NULL; - next = xmlXPathNextDescendant; - break; - case AXIS_DESCENDANT_OR_SELF: - last = NULL; - next = xmlXPathNextDescendantOrSelf; - break; - case AXIS_FOLLOWING: - last = NULL; - next = xmlXPathNextFollowing; - break; - case AXIS_FOLLOWING_SIBLING: - last = NULL; - next = xmlXPathNextFollowingSibling; - break; - case AXIS_NAMESPACE: - first = NULL; - last = NULL; - next = (xmlXPathTraversalFunction) xmlXPathNextNamespace; - mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; - break; - case AXIS_PARENT: - first = NULL; - next = xmlXPathNextParent; - break; - case AXIS_PRECEDING: - first = NULL; - next = xmlXPathNextPrecedingInternal; - break; - case AXIS_PRECEDING_SIBLING: - first = NULL; - next = xmlXPathNextPrecedingSibling; - break; - case AXIS_SELF: - first = NULL; - last = NULL; - next = xmlXPathNextSelf; - mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; - break; - } - -#ifdef DEBUG_STEP - xmlXPathDebugDumpStepAxis(axis, test, - (obj->nodesetval != NULL) ? obj->nodsetval->nodeNr : 0); -#endif - - if (next == NULL) { - xmlXPathReleaseObject(xpctxt, obj); - return(0); - } - contextSeq = obj->nodesetval; - if ((contextSeq == NULL) || (contextSeq->nodeNr <= 0)) { - xmlXPathReleaseObject(xpctxt, obj); - valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, NULL)); - return(0); - } - /* - * Predicate optimization --------------------------------------------- - * If this step has a last predicate, which contains a position(), - * then we'll optimize (although not exactly "position()", but only - * the short-hand form, i.e., "[n]". - * - * Example - expression "/foo[parent::bar][1]": - * - * COLLECT 'child' 'name' 'node' foo -- op (we are here) - * ROOT -- op->ch1 - * PREDICATE -- op->ch2 (predOp) - * PREDICATE -- predOp->ch1 = [parent::bar] - * SORT - * COLLECT 'parent' 'name' 'node' bar - * NODE - * ELEM Object is a number : 1 -- predOp->ch2 = [1] - * - */ - maxPos = 0; - predOp = NULL; - hasPredicateRange = 0; - hasAxisRange = 0; - if (op->ch2 != -1) { - /* - * There's at least one predicate. 16 == XPATH_OP_PREDICATE - */ - predOp = &ctxt->comp->steps[op->ch2]; - if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) { - if (predOp->ch1 != -1) { - /* - * Use the next inner predicate operator. - */ - predOp = &ctxt->comp->steps[predOp->ch1]; - hasPredicateRange = 1; - } else { - /* - * There's no other predicate than the [n] predicate. - */ - predOp = NULL; - hasAxisRange = 1; - } - } - } - breakOnFirstHit = ((toBool) && (predOp == NULL)) ? 1 : 0; - /* - * Axis traversal ----------------------------------------------------- - */ - /* - * 2.3 Node Tests - * - For the attribute axis, the principal node type is attribute. - * - For the namespace axis, the principal node type is namespace. - * - For other axes, the principal node type is element. - * - * A node test * is true for any node of the - * principal node type. For example, child::* will - * select all element children of the context node - */ - oldContextNode = xpctxt->node; - addNode = xmlXPathNodeSetAddUnique; - outSeq = NULL; - seq = NULL; - outerContextNode = NULL; - contextNode = NULL; - contextIdx = 0; - - - while ((contextIdx < contextSeq->nodeNr) || (contextNode != NULL)) { - if (outerNext != NULL) { - /* - * This is a compound traversal. - */ - if (contextNode == NULL) { - /* - * Set the context for the outer traversal. - */ - outerContextNode = contextSeq->nodeTab[contextIdx++]; - contextNode = outerNext(NULL, outerContextNode); - } else - contextNode = outerNext(contextNode, outerContextNode); - if (contextNode == NULL) - continue; - /* - * Set the context for the main traversal. - */ - xpctxt->node = contextNode; - } else - xpctxt->node = contextSeq->nodeTab[contextIdx++]; - - if (seq == NULL) { - seq = xmlXPathNodeSetCreate(NULL); - if (seq == NULL) { - total = 0; - goto error; - } - } - /* - * Traverse the axis and test the nodes. - */ - pos = 0; - cur = NULL; - hasNsNodes = 0; - do { - cur = next(ctxt, cur); - if (cur == NULL) - break; - - /* - * QUESTION TODO: What does the "first" and "last" stuff do? - */ - if ((first != NULL) && (*first != NULL)) { - if (*first == cur) - break; - if (((total % 256) == 0) && -#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON - (xmlXPathCmpNodesExt(*first, cur) >= 0)) -#else - (xmlXPathCmpNodes(*first, cur) >= 0)) -#endif - { - break; - } - } - if ((last != NULL) && (*last != NULL)) { - if (*last == cur) - break; - if (((total % 256) == 0) && -#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON - (xmlXPathCmpNodesExt(cur, *last) >= 0)) -#else - (xmlXPathCmpNodes(cur, *last) >= 0)) -#endif - { - break; - } - } - - total++; - -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, " %s", cur->name); -#endif - switch (test) { - case NODE_TEST_NONE: - total = 0; - STRANGE - goto error; - case NODE_TEST_TYPE: - /* - * TODO: Don't we need to use - * xmlXPathNodeSetAddNs() for namespace nodes here? - * Surprisingly, some c14n tests fail, if we do this. - */ - if (type == NODE_TYPE_NODE) { - switch (cur->type) { - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_ELEMENT_NODE: - case XML_ATTRIBUTE_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_TEXT_NODE: - case XML_NAMESPACE_DECL: - XP_TEST_HIT - break; - default: - break; - } - } else if (cur->type == type) { - if (type == XML_NAMESPACE_DECL) - XP_TEST_HIT_NS - else - XP_TEST_HIT - } else if ((type == NODE_TYPE_TEXT) && - (cur->type == XML_CDATA_SECTION_NODE)) - { - XP_TEST_HIT - } - break; - case NODE_TEST_PI: - if ((cur->type == XML_PI_NODE) && - ((name == NULL) || xmlStrEqual(name, cur->name))) - { - XP_TEST_HIT - } - break; - case NODE_TEST_ALL: - if (axis == AXIS_ATTRIBUTE) { - if (cur->type == XML_ATTRIBUTE_NODE) - { - XP_TEST_HIT - } - } else if (axis == AXIS_NAMESPACE) { - if (cur->type == XML_NAMESPACE_DECL) - { - XP_TEST_HIT_NS - } - } else { - if (cur->type == XML_ELEMENT_NODE) { - if (prefix == NULL) - { - XP_TEST_HIT - - } else if ((cur->ns != NULL) && - (xmlStrEqual(URI, cur->ns->href))) - { - XP_TEST_HIT - } - } - } - break; - case NODE_TEST_NS:{ - TODO; - break; - } - case NODE_TEST_NAME: - switch (cur->type) { - case XML_ELEMENT_NODE: - if (xmlStrEqual(name, cur->name)) { - if (prefix == NULL) { - if (cur->ns == NULL) - { - XP_TEST_HIT - } - } else { - if ((cur->ns != NULL) && - (xmlStrEqual(URI, cur->ns->href))) - { - XP_TEST_HIT - } - } - } - break; - case XML_ATTRIBUTE_NODE:{ - xmlAttrPtr attr = (xmlAttrPtr) cur; - - if (xmlStrEqual(name, attr->name)) { - if (prefix == NULL) { - if ((attr->ns == NULL) || - (attr->ns->prefix == NULL)) - { - XP_TEST_HIT - } - } else { - if ((attr->ns != NULL) && - (xmlStrEqual(URI, - attr->ns->href))) - { - XP_TEST_HIT - } - } - } - break; - } - case XML_NAMESPACE_DECL: - if (cur->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) cur; - - if ((ns->prefix != NULL) && (name != NULL) - && (xmlStrEqual(ns->prefix, name))) - { - XP_TEST_HIT_NS - } - } - break; - default: - break; - } - break; - } /* switch(test) */ - } while (cur != NULL); - - goto apply_predicates; - -axis_range_end: /* ----------------------------------------------------- */ - /* - * We have a "/foo[n]", and position() = n was reached. - * Note that we can have as well "/foo/::parent::foo[1]", so - * a duplicate-aware merge is still needed. - * Merge with the result. - */ - if (outSeq == NULL) { - outSeq = seq; - seq = NULL; - } else - outSeq = mergeAndClear(outSeq, seq, 0); - /* - * Break if only a true/false result was requested. - */ - if (toBool) - break; - continue; - -first_hit: /* ---------------------------------------------------------- */ - /* - * Break if only a true/false result was requested and - * no predicates existed and a node test succeeded. - */ - if (outSeq == NULL) { - outSeq = seq; - seq = NULL; - } else - outSeq = mergeAndClear(outSeq, seq, 0); - break; - -#ifdef DEBUG_STEP - if (seq != NULL) - nbMatches += seq->nodeNr; -#endif - -apply_predicates: /* --------------------------------------------------- */ - /* - * Apply predicates. - */ - if ((predOp != NULL) && (seq->nodeNr > 0)) { - /* - * E.g. when we have a "/foo[some expression][n]". - */ - /* - * QUESTION TODO: The old predicate evaluation took into - * account location-sets. - * (E.g. ctxt->value->type == XPATH_LOCATIONSET) - * Do we expect such a set here? - * All what I learned now from the evaluation semantics - * does not indicate that a location-set will be processed - * here, so this looks OK. - */ - /* - * Iterate over all predicates, starting with the outermost - * predicate. - * TODO: Problem: we cannot execute the inner predicates first - * since we cannot go back *up* the operator tree! - * Options we have: - * 1) Use of recursive functions (like is it currently done - * via xmlXPathCompOpEval()) - * 2) Add a predicate evaluation information stack to the - * context struct - * 3) Change the way the operators are linked; we need a - * "parent" field on xmlXPathStepOp - * - * For the moment, I'll try to solve this with a recursive - * function: xmlXPathCompOpEvalPredicate(). - */ - size = seq->nodeNr; - if (hasPredicateRange != 0) - newSize = xmlXPathCompOpEvalPositionalPredicate(ctxt, - predOp, seq, size, maxPos, maxPos, hasNsNodes); - else - newSize = xmlXPathCompOpEvalPredicate(ctxt, - predOp, seq, size, hasNsNodes); - - if (ctxt->error != XPATH_EXPRESSION_OK) { - total = 0; - goto error; - } - /* - * Add the filtered set of nodes to the result node set. - */ - if (newSize == 0) { - /* - * The predicates filtered all nodes out. - */ - xmlXPathNodeSetClear(seq, hasNsNodes); - } else if (seq->nodeNr > 0) { - /* - * Add to result set. - */ - if (outSeq == NULL) { - if (size != newSize) { - /* - * We need to merge and clear here, since - * the sequence will contained NULLed entries. - */ - outSeq = mergeAndClear(NULL, seq, 1); - } else { - outSeq = seq; - seq = NULL; - } - } else - outSeq = mergeAndClear(outSeq, seq, - (size != newSize) ? 1: 0); - /* - * Break if only a true/false result was requested. - */ - if (toBool) - break; - } - } else if (seq->nodeNr > 0) { - /* - * Add to result set. - */ - if (outSeq == NULL) { - outSeq = seq; - seq = NULL; - } else { - outSeq = mergeAndClear(outSeq, seq, 0); - } - } - } - -error: - if ((obj->boolval) && (obj->user != NULL)) { - /* - * QUESTION TODO: What does this do and why? - * TODO: Do we have to do this also for the "error" - * cleanup further down? - */ - ctxt->value->boolval = 1; - ctxt->value->user = obj->user; - obj->user = NULL; - obj->boolval = 0; - } - xmlXPathReleaseObject(xpctxt, obj); - - /* - * Ensure we return at least an emtpy set. - */ - if (outSeq == NULL) { - if ((seq != NULL) && (seq->nodeNr == 0)) - outSeq = seq; - else - outSeq = xmlXPathNodeSetCreate(NULL); - } - if ((seq != NULL) && (seq != outSeq)) { - xmlXPathFreeNodeSet(seq); - } - /* - * Hand over the result. Better to push the set also in - * case of errors. - */ - valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq)); - /* - * Reset the context node. - */ - xpctxt->node = oldContextNode; - -#ifdef DEBUG_STEP - xmlGenericError(xmlGenericErrorContext, - "\nExamined %d nodes, found %d nodes at that step\n", - total, nbMatches); -#endif - - return(total); -} - -static int -xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, xmlNodePtr * first); - -/** - * xmlXPathCompOpEvalFirst: - * @ctxt: the XPath parser context with the compiled expression - * @op: an XPath compiled operation - * @first: the first elem found so far - * - * Evaluate the Precompiled XPath operation searching only the first - * element in document order - * - * Returns the number of examined objects. - */ -static int -xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, xmlNodePtr * first) -{ - int total = 0, cur; - xmlXPathCompExprPtr comp; - xmlXPathObjectPtr arg1, arg2; - - CHECK_ERROR0; - comp = ctxt->comp; - switch (op->op) { - case XPATH_OP_END: - return (0); - case XPATH_OP_UNION: - total = - xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], - first); - CHECK_ERROR0; - if ((ctxt->value != NULL) - && (ctxt->value->type == XPATH_NODESET) - && (ctxt->value->nodesetval != NULL) - && (ctxt->value->nodesetval->nodeNr >= 1)) { - /* - * limit tree traversing to first node in the result - */ - /* - * OPTIMIZE TODO: This implicitely sorts - * the result, even if not needed. E.g. if the argument - * of the count() function, no sorting is needed. - * OPTIMIZE TODO: How do we know if the node-list wasn't - * aready sorted? - */ - if (ctxt->value->nodesetval->nodeNr > 1) - xmlXPathNodeSetSort(ctxt->value->nodesetval); - *first = ctxt->value->nodesetval->nodeTab[0]; - } - cur = - xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2], - first); - CHECK_ERROR0; - CHECK_TYPE0(XPATH_NODESET); - arg2 = valuePop(ctxt); - - CHECK_TYPE0(XPATH_NODESET); - arg1 = valuePop(ctxt); - - arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, - arg2->nodesetval); - valuePush(ctxt, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - /* optimizer */ - if (total > cur) - xmlXPathCompSwap(op); - return (total + cur); - case XPATH_OP_ROOT: - xmlXPathRoot(ctxt); - return (0); - case XPATH_OP_NODE: - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node)); - return (total); - case XPATH_OP_RESET: - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - ctxt->context->node = NULL; - return (total); - case XPATH_OP_COLLECT:{ - if (op->ch1 == -1) - return (total); - - total = xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - - total += xmlXPathNodeCollectAndTest(ctxt, op, first, NULL, 0); - return (total); - } - case XPATH_OP_VALUE: - valuePush(ctxt, - xmlXPathCacheObjectCopy(ctxt->context, - (xmlXPathObjectPtr) op->value4)); - return (0); - case XPATH_OP_SORT: - if (op->ch1 != -1) - total += - xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], - first); - CHECK_ERROR0; - if ((ctxt->value != NULL) - && (ctxt->value->type == XPATH_NODESET) - && (ctxt->value->nodesetval != NULL) - && (ctxt->value->nodesetval->nodeNr > 1)) - xmlXPathNodeSetSort(ctxt->value->nodesetval); - return (total); -#ifdef XP_OPTIMIZED_FILTER_FIRST - case XPATH_OP_FILTER: - total =+ xmlXPathCompOpEvalFilterFirst(ctxt, op, first); - return (total); -#endif - default: - return (xmlXPathCompOpEval(ctxt, op)); - } -} - -/** - * xmlXPathCompOpEvalLast: - * @ctxt: the XPath parser context with the compiled expression - * @op: an XPath compiled operation - * @last: the last elem found so far - * - * Evaluate the Precompiled XPath operation searching only the last - * element in document order - * - * Returns the number of nodes traversed - */ -static int -xmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, - xmlNodePtr * last) -{ - int total = 0, cur; - xmlXPathCompExprPtr comp; - xmlXPathObjectPtr arg1, arg2; - xmlNodePtr bak; - xmlDocPtr bakd; - int pp; - int cs; - - CHECK_ERROR0; - comp = ctxt->comp; - switch (op->op) { - case XPATH_OP_END: - return (0); - case XPATH_OP_UNION: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - total = - xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], last); - CHECK_ERROR0; - if ((ctxt->value != NULL) - && (ctxt->value->type == XPATH_NODESET) - && (ctxt->value->nodesetval != NULL) - && (ctxt->value->nodesetval->nodeNr >= 1)) { - /* - * limit tree traversing to first node in the result - */ - if (ctxt->value->nodesetval->nodeNr > 1) - xmlXPathNodeSetSort(ctxt->value->nodesetval); - *last = - ctxt->value->nodesetval->nodeTab[ctxt->value-> - nodesetval->nodeNr - - 1]; - } - ctxt->context->doc = bakd; - ctxt->context->node = bak; - ctxt->context->proximityPosition = pp; - ctxt->context->contextSize = cs; - cur = - xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch2], last); - CHECK_ERROR0; - if ((ctxt->value != NULL) - && (ctxt->value->type == XPATH_NODESET) - && (ctxt->value->nodesetval != NULL) - && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */ - } - CHECK_TYPE0(XPATH_NODESET); - arg2 = valuePop(ctxt); - - CHECK_TYPE0(XPATH_NODESET); - arg1 = valuePop(ctxt); - - arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, - arg2->nodesetval); - valuePush(ctxt, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - /* optimizer */ - if (total > cur) - xmlXPathCompSwap(op); - return (total + cur); - case XPATH_OP_ROOT: - xmlXPathRoot(ctxt); - return (0); - case XPATH_OP_NODE: - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node)); - return (total); - case XPATH_OP_RESET: - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - ctxt->context->node = NULL; - return (total); - case XPATH_OP_COLLECT:{ - if (op->ch1 == -1) - return (0); - - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - - total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, last, 0); - return (total); - } - case XPATH_OP_VALUE: - valuePush(ctxt, - xmlXPathCacheObjectCopy(ctxt->context, - (xmlXPathObjectPtr) op->value4)); - return (0); - case XPATH_OP_SORT: - if (op->ch1 != -1) - total += - xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], - last); - CHECK_ERROR0; - if ((ctxt->value != NULL) - && (ctxt->value->type == XPATH_NODESET) - && (ctxt->value->nodesetval != NULL) - && (ctxt->value->nodesetval->nodeNr > 1)) - xmlXPathNodeSetSort(ctxt->value->nodesetval); - return (total); - default: - return (xmlXPathCompOpEval(ctxt, op)); - } -} - -#ifdef XP_OPTIMIZED_FILTER_FIRST -static int -xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, xmlNodePtr * first) -{ - int total = 0; - xmlXPathCompExprPtr comp; - xmlXPathObjectPtr res; - xmlXPathObjectPtr obj; - xmlNodeSetPtr oldset; - xmlNodePtr oldnode; - xmlDocPtr oldDoc; - int i; - - CHECK_ERROR0; - comp = ctxt->comp; - /* - * Optimization for ()[last()] selection i.e. the last elem - */ - if ((op->ch1 != -1) && (op->ch2 != -1) && - (comp->steps[op->ch1].op == XPATH_OP_SORT) && - (comp->steps[op->ch2].op == XPATH_OP_SORT)) { - int f = comp->steps[op->ch2].ch1; - - if ((f != -1) && - (comp->steps[f].op == XPATH_OP_FUNCTION) && - (comp->steps[f].value5 == NULL) && - (comp->steps[f].value == 0) && - (comp->steps[f].value4 != NULL) && - (xmlStrEqual - (comp->steps[f].value4, BAD_CAST "last"))) { - xmlNodePtr last = NULL; - - total += - xmlXPathCompOpEvalLast(ctxt, - &comp->steps[op->ch1], - &last); - CHECK_ERROR0; - /* - * The nodeset should be in document order, - * Keep only the last value - */ - if ((ctxt->value != NULL) && - (ctxt->value->type == XPATH_NODESET) && - (ctxt->value->nodesetval != NULL) && - (ctxt->value->nodesetval->nodeTab != NULL) && - (ctxt->value->nodesetval->nodeNr > 1)) { - ctxt->value->nodesetval->nodeTab[0] = - ctxt->value->nodesetval->nodeTab[ctxt-> - value-> - nodesetval-> - nodeNr - - 1]; - ctxt->value->nodesetval->nodeNr = 1; - *first = *(ctxt->value->nodesetval->nodeTab); - } - return (total); - } - } - - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 == -1) - return (total); - if (ctxt->value == NULL) - return (total); - -#ifdef LIBXML_XPTR_ENABLED - oldnode = ctxt->context->node; - /* - * Hum are we filtering the result of an XPointer expression - */ - if (ctxt->value->type == XPATH_LOCATIONSET) { - xmlXPathObjectPtr tmp = NULL; - xmlLocationSetPtr newlocset = NULL; - xmlLocationSetPtr oldlocset; - - /* - * Extract the old locset, and then evaluate the result of the - * expression for all the element in the locset. use it to grow - * up a new locset. - */ - CHECK_TYPE0(XPATH_LOCATIONSET); - obj = valuePop(ctxt); - oldlocset = obj->user; - ctxt->context->node = NULL; - - if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { - ctxt->context->contextSize = 0; - ctxt->context->proximityPosition = 0; - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - res = valuePop(ctxt); - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - valuePush(ctxt, obj); - CHECK_ERROR0; - return (total); - } - newlocset = xmlXPtrLocationSetCreate(NULL); - - for (i = 0; i < oldlocset->locNr; i++) { - /* - * Run the evaluation with a node list made of a - * single item in the nodelocset. - */ - ctxt->context->node = oldlocset->locTab[i]->user; - ctxt->context->contextSize = oldlocset->locNr; - ctxt->context->proximityPosition = i + 1; - if (tmp == NULL) { - tmp = xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node); - } else { - xmlXPathNodeSetAddUnique(tmp->nodesetval, - ctxt->context->node); - } - valuePush(ctxt, tmp); - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeObject(obj); - return(0); - } - /* - * The result of the evaluation need to be tested to - * decided whether the filter succeeded or not - */ - res = valuePop(ctxt); - if (xmlXPathEvaluatePredicateResult(ctxt, res)) { - xmlXPtrLocationSetAdd(newlocset, - xmlXPathCacheObjectCopy(ctxt->context, - oldlocset->locTab[i])); - } - /* - * Cleanup - */ - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - if (ctxt->value == tmp) { - valuePop(ctxt); - xmlXPathNodeSetClear(tmp->nodesetval, 1); - /* - * REVISIT TODO: Don't create a temporary nodeset - * for everly iteration. - */ - /* OLD: xmlXPathFreeObject(res); */ - } else - tmp = NULL; - ctxt->context->node = NULL; - /* - * Only put the first node in the result, then leave. - */ - if (newlocset->locNr > 0) { - *first = (xmlNodePtr) oldlocset->locTab[i]->user; - break; - } - } - if (tmp != NULL) { - xmlXPathReleaseObject(ctxt->context, tmp); - } - /* - * The result is used as the new evaluation locset. - */ - xmlXPathReleaseObject(ctxt->context, obj); - ctxt->context->node = NULL; - ctxt->context->contextSize = -1; - ctxt->context->proximityPosition = -1; - valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); - ctxt->context->node = oldnode; - return (total); - } -#endif /* LIBXML_XPTR_ENABLED */ - - /* - * Extract the old set, and then evaluate the result of the - * expression for all the element in the set. use it to grow - * up a new set. - */ - CHECK_TYPE0(XPATH_NODESET); - obj = valuePop(ctxt); - oldset = obj->nodesetval; - - oldnode = ctxt->context->node; - oldDoc = ctxt->context->doc; - ctxt->context->node = NULL; - - if ((oldset == NULL) || (oldset->nodeNr == 0)) { - ctxt->context->contextSize = 0; - ctxt->context->proximityPosition = 0; - /* QUESTION TODO: Why was this code commented out? - if (op->ch2 != -1) - total += - xmlXPathCompOpEval(ctxt, - &comp->steps[op->ch2]); - CHECK_ERROR0; - res = valuePop(ctxt); - if (res != NULL) - xmlXPathFreeObject(res); - */ - valuePush(ctxt, obj); - ctxt->context->node = oldnode; - CHECK_ERROR0; - } else { - xmlNodeSetPtr newset; - xmlXPathObjectPtr tmp = NULL; - /* - * Initialize the new set. - * Also set the xpath document in case things like - * key() evaluation are attempted on the predicate - */ - newset = xmlXPathNodeSetCreate(NULL); - - for (i = 0; i < oldset->nodeNr; i++) { - /* - * Run the evaluation with a node list made of - * a single item in the nodeset. - */ - ctxt->context->node = oldset->nodeTab[i]; - if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && - (oldset->nodeTab[i]->doc != NULL)) - ctxt->context->doc = oldset->nodeTab[i]->doc; - if (tmp == NULL) { - tmp = xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node); - } else { - xmlXPathNodeSetAddUnique(tmp->nodesetval, - ctxt->context->node); - } - valuePush(ctxt, tmp); - ctxt->context->contextSize = oldset->nodeNr; - ctxt->context->proximityPosition = i + 1; - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeNodeSet(newset); - xmlXPathFreeObject(obj); - return(0); - } - /* - * The result of the evaluation needs to be tested to - * decide whether the filter succeeded or not - */ - res = valuePop(ctxt); - if (xmlXPathEvaluatePredicateResult(ctxt, res)) { - xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]); - } - /* - * Cleanup - */ - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - if (ctxt->value == tmp) { - valuePop(ctxt); - /* - * Don't free the temporary nodeset - * in order to avoid massive recreation inside this - * loop. - */ - xmlXPathNodeSetClear(tmp->nodesetval, 1); - } else - tmp = NULL; - ctxt->context->node = NULL; - /* - * Only put the first node in the result, then leave. - */ - if (newset->nodeNr > 0) { - *first = *(newset->nodeTab); - break; - } - } - if (tmp != NULL) { - xmlXPathReleaseObject(ctxt->context, tmp); - } - /* - * The result is used as the new evaluation set. - */ - xmlXPathReleaseObject(ctxt->context, obj); - ctxt->context->node = NULL; - ctxt->context->contextSize = -1; - ctxt->context->proximityPosition = -1; - /* may want to move this past the '}' later */ - ctxt->context->doc = oldDoc; - valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, newset)); - } - ctxt->context->node = oldnode; - return(total); -} -#endif /* XP_OPTIMIZED_FILTER_FIRST */ - -/** - * xmlXPathCompOpEval: - * @ctxt: the XPath parser context with the compiled expression - * @op: an XPath compiled operation - * - * Evaluate the Precompiled XPath operation - * Returns the number of nodes traversed - */ -static int -xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op) -{ - int total = 0; - int equal, ret; - xmlXPathCompExprPtr comp; - xmlXPathObjectPtr arg1, arg2; - xmlNodePtr bak; - xmlDocPtr bakd; - int pp; - int cs; - - CHECK_ERROR0; - comp = ctxt->comp; - switch (op->op) { - case XPATH_OP_END: - return (0); - case XPATH_OP_AND: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - xmlXPathBooleanFunction(ctxt, 1); - if ((ctxt->value == NULL) || (ctxt->value->boolval == 0)) - return (total); - arg2 = valuePop(ctxt); - ctxt->context->doc = bakd; - ctxt->context->node = bak; - ctxt->context->proximityPosition = pp; - ctxt->context->contextSize = cs; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - if (ctxt->error) { - xmlXPathFreeObject(arg2); - return(0); - } - xmlXPathBooleanFunction(ctxt, 1); - arg1 = valuePop(ctxt); - arg1->boolval &= arg2->boolval; - valuePush(ctxt, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - return (total); - case XPATH_OP_OR: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - xmlXPathBooleanFunction(ctxt, 1); - if ((ctxt->value == NULL) || (ctxt->value->boolval == 1)) - return (total); - arg2 = valuePop(ctxt); - ctxt->context->doc = bakd; - ctxt->context->node = bak; - ctxt->context->proximityPosition = pp; - ctxt->context->contextSize = cs; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - if (ctxt->error) { - xmlXPathFreeObject(arg2); - return(0); - } - xmlXPathBooleanFunction(ctxt, 1); - arg1 = valuePop(ctxt); - arg1->boolval |= arg2->boolval; - valuePush(ctxt, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - return (total); - case XPATH_OP_EQUAL: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - ctxt->context->doc = bakd; - ctxt->context->node = bak; - ctxt->context->proximityPosition = pp; - ctxt->context->contextSize = cs; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - if (op->value) - equal = xmlXPathEqualValues(ctxt); - else - equal = xmlXPathNotEqualValues(ctxt); - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, equal)); - return (total); - case XPATH_OP_CMP: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - ctxt->context->doc = bakd; - ctxt->context->node = bak; - ctxt->context->proximityPosition = pp; - ctxt->context->contextSize = cs; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - ret = xmlXPathCompareValues(ctxt, op->value, op->value2); - valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); - return (total); - case XPATH_OP_PLUS: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 != -1) { - ctxt->context->doc = bakd; - ctxt->context->node = bak; - ctxt->context->proximityPosition = pp; - ctxt->context->contextSize = cs; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - } - CHECK_ERROR0; - if (op->value == 0) - xmlXPathSubValues(ctxt); - else if (op->value == 1) - xmlXPathAddValues(ctxt); - else if (op->value == 2) - xmlXPathValueFlipSign(ctxt); - else if (op->value == 3) { - CAST_TO_NUMBER; - CHECK_TYPE0(XPATH_NUMBER); - } - return (total); - case XPATH_OP_MULT: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - ctxt->context->doc = bakd; - ctxt->context->node = bak; - ctxt->context->proximityPosition = pp; - ctxt->context->contextSize = cs; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - if (op->value == 0) - xmlXPathMultValues(ctxt); - else if (op->value == 1) - xmlXPathDivValues(ctxt); - else if (op->value == 2) - xmlXPathModValues(ctxt); - return (total); - case XPATH_OP_UNION: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - ctxt->context->doc = bakd; - ctxt->context->node = bak; - ctxt->context->proximityPosition = pp; - ctxt->context->contextSize = cs; - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - CHECK_TYPE0(XPATH_NODESET); - arg2 = valuePop(ctxt); - - CHECK_TYPE0(XPATH_NODESET); - arg1 = valuePop(ctxt); - - if ((arg1->nodesetval == NULL) || - ((arg2->nodesetval != NULL) && - (arg2->nodesetval->nodeNr != 0))) - { - arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, - arg2->nodesetval); - } - - valuePush(ctxt, arg1); - xmlXPathReleaseObject(ctxt->context, arg2); - return (total); - case XPATH_OP_ROOT: - xmlXPathRoot(ctxt); - return (total); - case XPATH_OP_NODE: - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node)); - return (total); - case XPATH_OP_RESET: - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - CHECK_ERROR0; - ctxt->context->node = NULL; - return (total); - case XPATH_OP_COLLECT:{ - if (op->ch1 == -1) - return (total); - - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - - total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 0); - return (total); - } - case XPATH_OP_VALUE: - valuePush(ctxt, - xmlXPathCacheObjectCopy(ctxt->context, - (xmlXPathObjectPtr) op->value4)); - return (total); - case XPATH_OP_VARIABLE:{ - xmlXPathObjectPtr val; - - if (op->ch1 != -1) - total += - xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - if (op->value5 == NULL) { - val = xmlXPathVariableLookup(ctxt->context, op->value4); - if (val == NULL) { - ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; - return(0); - } - valuePush(ctxt, val); - } else { - const xmlChar *URI; - - URI = xmlXPathNsLookup(ctxt->context, op->value5); - if (URI == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n", - op->value4, op->value5); - return (total); - } - val = xmlXPathVariableLookupNS(ctxt->context, - op->value4, URI); - if (val == NULL) { - ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; - return(0); - } - valuePush(ctxt, val); - } - return (total); - } - case XPATH_OP_FUNCTION:{ - xmlXPathFunction func; - const xmlChar *oldFunc, *oldFuncURI; - int i; - - if (op->ch1 != -1) - total += - xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - if (ctxt->valueNr < op->value) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompOpEval: parameter error\n"); - ctxt->error = XPATH_INVALID_OPERAND; - return (total); - } - for (i = 0; i < op->value; i++) - if (ctxt->valueTab[(ctxt->valueNr - 1) - i] == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompOpEval: parameter error\n"); - ctxt->error = XPATH_INVALID_OPERAND; - return (total); - } - if (op->cache != NULL) - XML_CAST_FPTR(func) = (xmlXPathFunction)op->cache; - else { - const xmlChar *URI = NULL; - - if (op->value5 == NULL) - func = - xmlXPathFunctionLookup(ctxt->context, - op->value4); - else { - URI = xmlXPathNsLookup(ctxt->context, op->value5); - if (URI == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n", - op->value4, op->value5); - return (total); - } - func = xmlXPathFunctionLookupNS(ctxt->context, - op->value4, URI); - } - if (func == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompOpEval: function %s not found\n", - op->value4); - XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR); - } - op->cache = (void*)XML_CAST_FPTR(func); - op->cacheURI = (void *) URI; - } - oldFunc = ctxt->context->function; - oldFuncURI = ctxt->context->functionURI; - ctxt->context->function = op->value4; - ctxt->context->functionURI = op->cacheURI; - func(ctxt, op->value); - ctxt->context->function = oldFunc; - ctxt->context->functionURI = oldFuncURI; - return (total); - } - case XPATH_OP_ARG: - bakd = ctxt->context->doc; - bak = ctxt->context->node; - pp = ctxt->context->proximityPosition; - cs = ctxt->context->contextSize; - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - ctxt->context->contextSize = cs; - ctxt->context->proximityPosition = pp; - ctxt->context->node = bak; - ctxt->context->doc = bakd; - CHECK_ERROR0; - if (op->ch2 != -1) { - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); - ctxt->context->doc = bakd; - ctxt->context->node = bak; - CHECK_ERROR0; - } - return (total); - case XPATH_OP_PREDICATE: - case XPATH_OP_FILTER:{ - xmlXPathObjectPtr res; - xmlXPathObjectPtr obj, tmp; - xmlNodeSetPtr newset = NULL; - xmlNodeSetPtr oldset; - xmlNodePtr oldnode; - xmlDocPtr oldDoc; - int i; - - /* - * Optimization for ()[1] selection i.e. the first elem - */ - if ((op->ch1 != -1) && (op->ch2 != -1) && -#ifdef XP_OPTIMIZED_FILTER_FIRST - /* - * FILTER TODO: Can we assume that the inner processing - * will result in an ordered list if we have an - * XPATH_OP_FILTER? - * What about an additional field or flag on - * xmlXPathObject like @sorted ? This way we wouln'd need - * to assume anything, so it would be more robust and - * easier to optimize. - */ - ((comp->steps[op->ch1].op == XPATH_OP_SORT) || /* 18 */ - (comp->steps[op->ch1].op == XPATH_OP_FILTER)) && /* 17 */ -#else - (comp->steps[op->ch1].op == XPATH_OP_SORT) && -#endif - (comp->steps[op->ch2].op == XPATH_OP_VALUE)) { /* 12 */ - xmlXPathObjectPtr val; - - val = comp->steps[op->ch2].value4; - if ((val != NULL) && (val->type == XPATH_NUMBER) && - (val->floatval == 1.0)) { - xmlNodePtr first = NULL; - - total += - xmlXPathCompOpEvalFirst(ctxt, - &comp->steps[op->ch1], - &first); - CHECK_ERROR0; - /* - * The nodeset should be in document order, - * Keep only the first value - */ - if ((ctxt->value != NULL) && - (ctxt->value->type == XPATH_NODESET) && - (ctxt->value->nodesetval != NULL) && - (ctxt->value->nodesetval->nodeNr > 1)) - ctxt->value->nodesetval->nodeNr = 1; - return (total); - } - } - /* - * Optimization for ()[last()] selection i.e. the last elem - */ - if ((op->ch1 != -1) && (op->ch2 != -1) && - (comp->steps[op->ch1].op == XPATH_OP_SORT) && - (comp->steps[op->ch2].op == XPATH_OP_SORT)) { - int f = comp->steps[op->ch2].ch1; - - if ((f != -1) && - (comp->steps[f].op == XPATH_OP_FUNCTION) && - (comp->steps[f].value5 == NULL) && - (comp->steps[f].value == 0) && - (comp->steps[f].value4 != NULL) && - (xmlStrEqual - (comp->steps[f].value4, BAD_CAST "last"))) { - xmlNodePtr last = NULL; - - total += - xmlXPathCompOpEvalLast(ctxt, - &comp->steps[op->ch1], - &last); - CHECK_ERROR0; - /* - * The nodeset should be in document order, - * Keep only the last value - */ - if ((ctxt->value != NULL) && - (ctxt->value->type == XPATH_NODESET) && - (ctxt->value->nodesetval != NULL) && - (ctxt->value->nodesetval->nodeTab != NULL) && - (ctxt->value->nodesetval->nodeNr > 1)) { - ctxt->value->nodesetval->nodeTab[0] = - ctxt->value->nodesetval->nodeTab[ctxt-> - value-> - nodesetval-> - nodeNr - - 1]; - ctxt->value->nodesetval->nodeNr = 1; - } - return (total); - } - } - /* - * Process inner predicates first. - * Example "index[parent::book][1]": - * ... - * PREDICATE <-- we are here "[1]" - * PREDICATE <-- process "[parent::book]" first - * SORT - * COLLECT 'parent' 'name' 'node' book - * NODE - * ELEM Object is a number : 1 - */ - if (op->ch1 != -1) - total += - xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if (op->ch2 == -1) - return (total); - if (ctxt->value == NULL) - return (total); - - oldnode = ctxt->context->node; - -#ifdef LIBXML_XPTR_ENABLED - /* - * Hum are we filtering the result of an XPointer expression - */ - if (ctxt->value->type == XPATH_LOCATIONSET) { - xmlLocationSetPtr newlocset = NULL; - xmlLocationSetPtr oldlocset; - - /* - * Extract the old locset, and then evaluate the result of the - * expression for all the element in the locset. use it to grow - * up a new locset. - */ - CHECK_TYPE0(XPATH_LOCATIONSET); - obj = valuePop(ctxt); - oldlocset = obj->user; - ctxt->context->node = NULL; - - if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { - ctxt->context->contextSize = 0; - ctxt->context->proximityPosition = 0; - if (op->ch2 != -1) - total += - xmlXPathCompOpEval(ctxt, - &comp->steps[op->ch2]); - res = valuePop(ctxt); - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - valuePush(ctxt, obj); - CHECK_ERROR0; - return (total); - } - newlocset = xmlXPtrLocationSetCreate(NULL); - - for (i = 0; i < oldlocset->locNr; i++) { - /* - * Run the evaluation with a node list made of a - * single item in the nodelocset. - */ - ctxt->context->node = oldlocset->locTab[i]->user; - ctxt->context->contextSize = oldlocset->locNr; - ctxt->context->proximityPosition = i + 1; - tmp = xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node); - valuePush(ctxt, tmp); - - if (op->ch2 != -1) - total += - xmlXPathCompOpEval(ctxt, - &comp->steps[op->ch2]); - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeObject(obj); - return(0); - } - - /* - * The result of the evaluation need to be tested to - * decided whether the filter succeeded or not - */ - res = valuePop(ctxt); - if (xmlXPathEvaluatePredicateResult(ctxt, res)) { - xmlXPtrLocationSetAdd(newlocset, - xmlXPathObjectCopy - (oldlocset->locTab[i])); - } - - /* - * Cleanup - */ - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - if (ctxt->value == tmp) { - res = valuePop(ctxt); - xmlXPathReleaseObject(ctxt->context, res); - } - - ctxt->context->node = NULL; - } - - /* - * The result is used as the new evaluation locset. - */ - xmlXPathReleaseObject(ctxt->context, obj); - ctxt->context->node = NULL; - ctxt->context->contextSize = -1; - ctxt->context->proximityPosition = -1; - valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); - ctxt->context->node = oldnode; - return (total); - } -#endif /* LIBXML_XPTR_ENABLED */ - - /* - * Extract the old set, and then evaluate the result of the - * expression for all the element in the set. use it to grow - * up a new set. - */ - CHECK_TYPE0(XPATH_NODESET); - obj = valuePop(ctxt); - oldset = obj->nodesetval; - - oldnode = ctxt->context->node; - oldDoc = ctxt->context->doc; - ctxt->context->node = NULL; - - if ((oldset == NULL) || (oldset->nodeNr == 0)) { - ctxt->context->contextSize = 0; - ctxt->context->proximityPosition = 0; -/* - if (op->ch2 != -1) - total += - xmlXPathCompOpEval(ctxt, - &comp->steps[op->ch2]); - CHECK_ERROR0; - res = valuePop(ctxt); - if (res != NULL) - xmlXPathFreeObject(res); -*/ - valuePush(ctxt, obj); - ctxt->context->node = oldnode; - CHECK_ERROR0; - } else { - tmp = NULL; - /* - * Initialize the new set. - * Also set the xpath document in case things like - * key() evaluation are attempted on the predicate - */ - newset = xmlXPathNodeSetCreate(NULL); - /* - * SPEC XPath 1.0: - * "For each node in the node-set to be filtered, the - * PredicateExpr is evaluated with that node as the - * context node, with the number of nodes in the - * node-set as the context size, and with the proximity - * position of the node in the node-set with respect to - * the axis as the context position;" - * @oldset is the node-set" to be filtered. - * - * SPEC XPath 1.0: - * "only predicates change the context position and - * context size (see [2.4 Predicates])." - * Example: - * node-set context pos - * nA 1 - * nB 2 - * nC 3 - * After applying predicate [position() > 1] : - * node-set context pos - * nB 1 - * nC 2 - * - * removed the first node in the node-set, then - * the context position of the - */ - for (i = 0; i < oldset->nodeNr; i++) { - /* - * Run the evaluation with a node list made of - * a single item in the nodeset. - */ - ctxt->context->node = oldset->nodeTab[i]; - if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && - (oldset->nodeTab[i]->doc != NULL)) - ctxt->context->doc = oldset->nodeTab[i]->doc; - if (tmp == NULL) { - tmp = xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node); - } else { - xmlXPathNodeSetAddUnique(tmp->nodesetval, - ctxt->context->node); - } - valuePush(ctxt, tmp); - ctxt->context->contextSize = oldset->nodeNr; - ctxt->context->proximityPosition = i + 1; - /* - * Evaluate the predicate against the context node. - * Can/should we optimize position() predicates - * here (e.g. "[1]")? - */ - if (op->ch2 != -1) - total += - xmlXPathCompOpEval(ctxt, - &comp->steps[op->ch2]); - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeNodeSet(newset); - xmlXPathFreeObject(obj); - return(0); - } - - /* - * The result of the evaluation needs to be tested to - * decide whether the filter succeeded or not - */ - /* - * OPTIMIZE TODO: Can we use - * xmlXPathNodeSetAdd*Unique()* instead? - */ - res = valuePop(ctxt); - if (xmlXPathEvaluatePredicateResult(ctxt, res)) { - xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]); - } - - /* - * Cleanup - */ - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - if (ctxt->value == tmp) { - valuePop(ctxt); - xmlXPathNodeSetClear(tmp->nodesetval, 1); - /* - * Don't free the temporary nodeset - * in order to avoid massive recreation inside this - * loop. - */ - } else - tmp = NULL; - ctxt->context->node = NULL; - } - if (tmp != NULL) - xmlXPathReleaseObject(ctxt->context, tmp); - /* - * The result is used as the new evaluation set. - */ - xmlXPathReleaseObject(ctxt->context, obj); - ctxt->context->node = NULL; - ctxt->context->contextSize = -1; - ctxt->context->proximityPosition = -1; - /* may want to move this past the '}' later */ - ctxt->context->doc = oldDoc; - valuePush(ctxt, - xmlXPathCacheWrapNodeSet(ctxt->context, newset)); - } - ctxt->context->node = oldnode; - return (total); - } - case XPATH_OP_SORT: - if (op->ch1 != -1) - total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - CHECK_ERROR0; - if ((ctxt->value != NULL) && - (ctxt->value->type == XPATH_NODESET) && - (ctxt->value->nodesetval != NULL) && - (ctxt->value->nodesetval->nodeNr > 1)) - { - xmlXPathNodeSetSort(ctxt->value->nodesetval); - } - return (total); -#ifdef LIBXML_XPTR_ENABLED - case XPATH_OP_RANGETO:{ - xmlXPathObjectPtr range; - xmlXPathObjectPtr res, obj; - xmlXPathObjectPtr tmp; - xmlLocationSetPtr newlocset = NULL; - xmlLocationSetPtr oldlocset; - xmlNodeSetPtr oldset; - int i, j; - - if (op->ch1 != -1) - total += - xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); - if (op->ch2 == -1) - return (total); - - if (ctxt->value->type == XPATH_LOCATIONSET) { - /* - * Extract the old locset, and then evaluate the result of the - * expression for all the element in the locset. use it to grow - * up a new locset. - */ - CHECK_TYPE0(XPATH_LOCATIONSET); - obj = valuePop(ctxt); - oldlocset = obj->user; - - if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { - ctxt->context->node = NULL; - ctxt->context->contextSize = 0; - ctxt->context->proximityPosition = 0; - total += xmlXPathCompOpEval(ctxt,&comp->steps[op->ch2]); - res = valuePop(ctxt); - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - valuePush(ctxt, obj); - CHECK_ERROR0; - return (total); - } - newlocset = xmlXPtrLocationSetCreate(NULL); - - for (i = 0; i < oldlocset->locNr; i++) { - /* - * Run the evaluation with a node list made of a - * single item in the nodelocset. - */ - ctxt->context->node = oldlocset->locTab[i]->user; - ctxt->context->contextSize = oldlocset->locNr; - ctxt->context->proximityPosition = i + 1; - tmp = xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node); - valuePush(ctxt, tmp); - - if (op->ch2 != -1) - total += - xmlXPathCompOpEval(ctxt, - &comp->steps[op->ch2]); - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeObject(obj); - return(0); - } - - res = valuePop(ctxt); - if (res->type == XPATH_LOCATIONSET) { - xmlLocationSetPtr rloc = - (xmlLocationSetPtr)res->user; - for (j=0; j<rloc->locNr; j++) { - range = xmlXPtrNewRange( - oldlocset->locTab[i]->user, - oldlocset->locTab[i]->index, - rloc->locTab[j]->user2, - rloc->locTab[j]->index2); - if (range != NULL) { - xmlXPtrLocationSetAdd(newlocset, range); - } - } - } else { - range = xmlXPtrNewRangeNodeObject( - (xmlNodePtr)oldlocset->locTab[i]->user, res); - if (range != NULL) { - xmlXPtrLocationSetAdd(newlocset,range); - } - } - - /* - * Cleanup - */ - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - if (ctxt->value == tmp) { - res = valuePop(ctxt); - xmlXPathReleaseObject(ctxt->context, res); - } - - ctxt->context->node = NULL; - } - } else { /* Not a location set */ - CHECK_TYPE0(XPATH_NODESET); - obj = valuePop(ctxt); - oldset = obj->nodesetval; - ctxt->context->node = NULL; - - newlocset = xmlXPtrLocationSetCreate(NULL); - - if (oldset != NULL) { - for (i = 0; i < oldset->nodeNr; i++) { - /* - * Run the evaluation with a node list made of a single item - * in the nodeset. - */ - ctxt->context->node = oldset->nodeTab[i]; - /* - * OPTIMIZE TODO: Avoid recreation for every iteration. - */ - tmp = xmlXPathCacheNewNodeSet(ctxt->context, - ctxt->context->node); - valuePush(ctxt, tmp); - - if (op->ch2 != -1) - total += - xmlXPathCompOpEval(ctxt, - &comp->steps[op->ch2]); - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeObject(obj); - return(0); - } - - res = valuePop(ctxt); - range = - xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], - res); - if (range != NULL) { - xmlXPtrLocationSetAdd(newlocset, range); - } - - /* - * Cleanup - */ - if (res != NULL) { - xmlXPathReleaseObject(ctxt->context, res); - } - if (ctxt->value == tmp) { - res = valuePop(ctxt); - xmlXPathReleaseObject(ctxt->context, res); - } - - ctxt->context->node = NULL; - } - } - } - - /* - * The result is used as the new evaluation set. - */ - xmlXPathReleaseObject(ctxt->context, obj); - ctxt->context->node = NULL; - ctxt->context->contextSize = -1; - ctxt->context->proximityPosition = -1; - valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); - return (total); - } -#endif /* LIBXML_XPTR_ENABLED */ - } - xmlGenericError(xmlGenericErrorContext, - "XPath: unknown precompiled operation %d\n", op->op); - return (total); -} - -/** - * xmlXPathCompOpEvalToBoolean: - * @ctxt: the XPath parser context - * - * Evaluates if the expression evaluates to true. - * - * Returns 1 if true, 0 if false and -1 on API or internal errors. - */ -static int -xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, - xmlXPathStepOpPtr op, - int isPredicate) -{ - xmlXPathObjectPtr resObj = NULL; - -start: - /* comp = ctxt->comp; */ - switch (op->op) { - case XPATH_OP_END: - return (0); - case XPATH_OP_VALUE: - resObj = (xmlXPathObjectPtr) op->value4; - if (isPredicate) - return(xmlXPathEvaluatePredicateResult(ctxt, resObj)); - return(xmlXPathCastToBoolean(resObj)); - case XPATH_OP_SORT: - /* - * We don't need sorting for boolean results. Skip this one. - */ - if (op->ch1 != -1) { - op = &ctxt->comp->steps[op->ch1]; - goto start; - } - return(0); - case XPATH_OP_COLLECT: - if (op->ch1 == -1) - return(0); - - xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[op->ch1]); - if (ctxt->error != XPATH_EXPRESSION_OK) - return(-1); - - xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 1); - if (ctxt->error != XPATH_EXPRESSION_OK) - return(-1); - - resObj = valuePop(ctxt); - if (resObj == NULL) - return(-1); - break; - default: - /* - * Fallback to call xmlXPathCompOpEval(). - */ - xmlXPathCompOpEval(ctxt, op); - if (ctxt->error != XPATH_EXPRESSION_OK) - return(-1); - - resObj = valuePop(ctxt); - if (resObj == NULL) - return(-1); - break; - } - - if (resObj) { - int res; - - if (resObj->type == XPATH_BOOLEAN) { - res = resObj->boolval; - } else if (isPredicate) { - /* - * For predicates a result of type "number" is handled - * differently: - * SPEC XPath 1.0: - * "If the result is a number, the result will be converted - * to true if the number is equal to the context position - * and will be converted to false otherwise;" - */ - res = xmlXPathEvaluatePredicateResult(ctxt, resObj); - } else { - res = xmlXPathCastToBoolean(resObj); - } - xmlXPathReleaseObject(ctxt->context, resObj); - return(res); - } - - return(0); -} - -#ifdef XPATH_STREAMING -/** - * xmlXPathRunStreamEval: - * @ctxt: the XPath parser context with the compiled expression - * - * Evaluate the Precompiled Streamable XPath expression in the given context. - */ -static int -xmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp, - xmlXPathObjectPtr *resultSeq, int toBool) -{ - int max_depth, min_depth; - int from_root; - int ret, depth; - int eval_all_nodes; - xmlNodePtr cur = NULL, limit = NULL; - xmlStreamCtxtPtr patstream = NULL; - - int nb_nodes = 0; - - if ((ctxt == NULL) || (comp == NULL)) - return(-1); - max_depth = xmlPatternMaxDepth(comp); - if (max_depth == -1) - return(-1); - if (max_depth == -2) - max_depth = 10000; - min_depth = xmlPatternMinDepth(comp); - if (min_depth == -1) - return(-1); - from_root = xmlPatternFromRoot(comp); - if (from_root < 0) - return(-1); -#if 0 - printf("stream eval: depth %d from root %d\n", max_depth, from_root); -#endif - - if (! toBool) { - if (resultSeq == NULL) - return(-1); - *resultSeq = xmlXPathCacheNewNodeSet(ctxt, NULL); - if (*resultSeq == NULL) - return(-1); - } - - /* - * handle the special cases of "/" amd "." being matched - */ - if (min_depth == 0) { - if (from_root) { - /* Select "/" */ - if (toBool) - return(1); - xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, - (xmlNodePtr) ctxt->doc); - } else { - /* Select "self::node()" */ - if (toBool) - return(1); - xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node); - } - } - if (max_depth == 0) { - return(0); - } - - if (from_root) { - cur = (xmlNodePtr)ctxt->doc; - } else if (ctxt->node != NULL) { - switch (ctxt->node->type) { - case XML_ELEMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - cur = ctxt->node; - break; - case XML_ATTRIBUTE_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_DOCUMENT_TYPE_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - case XML_NAMESPACE_DECL: - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - break; - } - limit = cur; - } - if (cur == NULL) { - return(0); - } - - patstream = xmlPatternGetStreamCtxt(comp); - if (patstream == NULL) { - /* - * QUESTION TODO: Is this an error? - */ - return(0); - } - - eval_all_nodes = xmlStreamWantsAnyNode(patstream); - - if (from_root) { - ret = xmlStreamPush(patstream, NULL, NULL); - if (ret < 0) { - } else if (ret == 1) { - if (toBool) - goto return_1; - xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur); - } - } - depth = 0; - goto scan_children; -next_node: - do { - nb_nodes++; - - switch (cur->type) { - case XML_ELEMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_COMMENT_NODE: - case XML_PI_NODE: - if (cur->type == XML_ELEMENT_NODE) { - ret = xmlStreamPush(patstream, cur->name, - (cur->ns ? cur->ns->href : NULL)); - } else if (eval_all_nodes) - ret = xmlStreamPushNode(patstream, NULL, NULL, cur->type); - else - break; - - if (ret < 0) { - /* NOP. */ - } else if (ret == 1) { - if (toBool) - goto return_1; - xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur); - } - if ((cur->children == NULL) || (depth >= max_depth)) { - ret = xmlStreamPop(patstream); - while (cur->next != NULL) { - cur = cur->next; - if ((cur->type != XML_ENTITY_DECL) && - (cur->type != XML_DTD_NODE)) - goto next_node; - } - } - default: - break; - } - -scan_children: - if ((cur->children != NULL) && (depth < max_depth)) { - /* - * Do not descend on entities declarations - */ - if (cur->children->type != XML_ENTITY_DECL) { - cur = cur->children; - depth++; - /* - * Skip DTDs - */ - if (cur->type != XML_DTD_NODE) - continue; - } - } - - if (cur == limit) - break; - - while (cur->next != NULL) { - cur = cur->next; - if ((cur->type != XML_ENTITY_DECL) && - (cur->type != XML_DTD_NODE)) - goto next_node; - } - - do { - cur = cur->parent; - depth--; - if ((cur == NULL) || (cur == limit)) - goto done; - if (cur->type == XML_ELEMENT_NODE) { - ret = xmlStreamPop(patstream); - } else if ((eval_all_nodes) && - ((cur->type == XML_TEXT_NODE) || - (cur->type == XML_CDATA_SECTION_NODE) || - (cur->type == XML_COMMENT_NODE) || - (cur->type == XML_PI_NODE))) - { - ret = xmlStreamPop(patstream); - } - if (cur->next != NULL) { - cur = cur->next; - break; - } - } while (cur != NULL); - - } while ((cur != NULL) && (depth >= 0)); - -done: - -#if 0 - printf("stream eval: checked %d nodes selected %d\n", - nb_nodes, retObj->nodesetval->nodeNr); -#endif - - if (patstream) - xmlFreeStreamCtxt(patstream); - return(0); - -return_1: - if (patstream) - xmlFreeStreamCtxt(patstream); - return(1); -} -#endif /* XPATH_STREAMING */ - -/** - * xmlXPathRunEval: - * @ctxt: the XPath parser context with the compiled expression - * @toBool: evaluate to a boolean result - * - * Evaluate the Precompiled XPath expression in the given context. - */ -static int -xmlXPathRunEval(xmlXPathParserContextPtr ctxt, int toBool) -{ - xmlXPathCompExprPtr comp; - - if ((ctxt == NULL) || (ctxt->comp == NULL)) - return(-1); - - if (ctxt->valueTab == NULL) { - /* Allocate the value stack */ - ctxt->valueTab = (xmlXPathObjectPtr *) - xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); - if (ctxt->valueTab == NULL) { - xmlXPathPErrMemory(ctxt, "creating evaluation context\n"); - xmlFree(ctxt); - } - ctxt->valueNr = 0; - ctxt->valueMax = 10; - ctxt->value = NULL; - } -#ifdef XPATH_STREAMING - if (ctxt->comp->stream) { - int res; - - if (toBool) { - /* - * Evaluation to boolean result. - */ - res = xmlXPathRunStreamEval(ctxt->context, - ctxt->comp->stream, NULL, 1); - if (res != -1) - return(res); - } else { - xmlXPathObjectPtr resObj = NULL; - - /* - * Evaluation to a sequence. - */ - res = xmlXPathRunStreamEval(ctxt->context, - ctxt->comp->stream, &resObj, 0); - - if ((res != -1) && (resObj != NULL)) { - valuePush(ctxt, resObj); - return(0); - } - if (resObj != NULL) - xmlXPathReleaseObject(ctxt->context, resObj); - } - /* - * QUESTION TODO: This falls back to normal XPath evaluation - * if res == -1. Is this intended? - */ - } -#endif - comp = ctxt->comp; - if (comp->last < 0) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathRunEval: last is less than zero\n"); - return(-1); - } - if (toBool) - return(xmlXPathCompOpEvalToBoolean(ctxt, - &comp->steps[comp->last], 0)); - else - xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]); - - return(0); -} - -/************************************************************************ - * * - * Public interfaces * - * * - ************************************************************************/ - -/** - * xmlXPathEvalPredicate: - * @ctxt: the XPath context - * @res: the Predicate Expression evaluation result - * - * Evaluate a predicate result for the current node. - * A PredicateExpr is evaluated by evaluating the Expr and converting - * the result to a boolean. If the result is a number, the result will - * be converted to true if the number is equal to the position of the - * context node in the context node list (as returned by the position - * function) and will be converted to false otherwise; if the result - * is not a number, then the result will be converted as if by a call - * to the boolean function. - * - * Returns 1 if predicate is true, 0 otherwise - */ -int -xmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr res) { - if ((ctxt == NULL) || (res == NULL)) return(0); - switch (res->type) { - case XPATH_BOOLEAN: - return(res->boolval); - case XPATH_NUMBER: - return(res->floatval == ctxt->proximityPosition); - case XPATH_NODESET: - case XPATH_XSLT_TREE: - if (res->nodesetval == NULL) - return(0); - return(res->nodesetval->nodeNr != 0); - case XPATH_STRING: - return((res->stringval != NULL) && - (xmlStrlen(res->stringval) != 0)); - default: - STRANGE - } - return(0); -} - -/** - * xmlXPathEvaluatePredicateResult: - * @ctxt: the XPath Parser context - * @res: the Predicate Expression evaluation result - * - * Evaluate a predicate result for the current node. - * A PredicateExpr is evaluated by evaluating the Expr and converting - * the result to a boolean. If the result is a number, the result will - * be converted to true if the number is equal to the position of the - * context node in the context node list (as returned by the position - * function) and will be converted to false otherwise; if the result - * is not a number, then the result will be converted as if by a call - * to the boolean function. - * - * Returns 1 if predicate is true, 0 otherwise - */ -int -xmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt, - xmlXPathObjectPtr res) { - if ((ctxt == NULL) || (res == NULL)) return(0); - switch (res->type) { - case XPATH_BOOLEAN: - return(res->boolval); - case XPATH_NUMBER: -#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200)) - return((res->floatval == ctxt->context->proximityPosition) && - (!xmlXPathIsNaN(res->floatval))); /* MSC pbm Mark Vakoc !*/ -#else - return(res->floatval == ctxt->context->proximityPosition); -#endif - case XPATH_NODESET: - case XPATH_XSLT_TREE: - if (res->nodesetval == NULL) - return(0); - return(res->nodesetval->nodeNr != 0); - case XPATH_STRING: - return((res->stringval != NULL) && (res->stringval[0] != 0)); -#ifdef LIBXML_XPTR_ENABLED - case XPATH_LOCATIONSET:{ - xmlLocationSetPtr ptr = res->user; - if (ptr == NULL) - return(0); - return (ptr->locNr != 0); - } -#endif - default: - STRANGE - } - return(0); -} - -#ifdef XPATH_STREAMING -/** - * xmlXPathTryStreamCompile: - * @ctxt: an XPath context - * @str: the XPath expression - * - * Try to compile the XPath expression as a streamable subset. - * - * Returns the compiled expression or NULL if failed to compile. - */ -static xmlXPathCompExprPtr -xmlXPathTryStreamCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { - /* - * Optimization: use streaming patterns when the XPath expression can - * be compiled to a stream lookup - */ - xmlPatternPtr stream; - xmlXPathCompExprPtr comp; - xmlDictPtr dict = NULL; - const xmlChar **namespaces = NULL; - xmlNsPtr ns; - int i, j; - - if ((!xmlStrchr(str, '[')) && (!xmlStrchr(str, '(')) && - (!xmlStrchr(str, '@'))) { - const xmlChar *tmp; - - /* - * We don't try to handle expressions using the verbose axis - * specifiers ("::"), just the simplied form at this point. - * Additionally, if there is no list of namespaces available and - * there's a ":" in the expression, indicating a prefixed QName, - * then we won't try to compile either. xmlPatterncompile() needs - * to have a list of namespaces at compilation time in order to - * compile prefixed name tests. - */ - tmp = xmlStrchr(str, ':'); - if ((tmp != NULL) && - ((ctxt == NULL) || (ctxt->nsNr == 0) || (tmp[1] == ':'))) - return(NULL); - - if (ctxt != NULL) { - dict = ctxt->dict; - if (ctxt->nsNr > 0) { - namespaces = xmlMalloc(2 * (ctxt->nsNr + 1) * sizeof(xmlChar*)); - if (namespaces == NULL) { - xmlXPathErrMemory(ctxt, "allocating namespaces array\n"); - return(NULL); - } - for (i = 0, j = 0; (j < ctxt->nsNr); j++) { - ns = ctxt->namespaces[j]; - namespaces[i++] = ns->href; - namespaces[i++] = ns->prefix; - } - namespaces[i++] = NULL; - namespaces[i++] = NULL; - } - } - - stream = xmlPatterncompile(str, dict, XML_PATTERN_XPATH, - &namespaces[0]); - if (namespaces != NULL) { - xmlFree((xmlChar **)namespaces); - } - if ((stream != NULL) && (xmlPatternStreamable(stream) == 1)) { - comp = xmlXPathNewCompExpr(); - if (comp == NULL) { - xmlXPathErrMemory(ctxt, "allocating streamable expression\n"); - return(NULL); - } - comp->stream = stream; - comp->dict = dict; - if (comp->dict) - xmlDictReference(comp->dict); - return(comp); - } - xmlFreePattern(stream); - } - return(NULL); -} -#endif /* XPATH_STREAMING */ - -static int -xmlXPathCanRewriteDosExpression(xmlChar *expr) -{ - if (expr == NULL) - return(0); - do { - if ((*expr == '/') && (*(++expr) == '/')) - return(1); - } while (*expr++); - return(0); -} -static void -xmlXPathRewriteDOSExpression(xmlXPathCompExprPtr comp, xmlXPathStepOpPtr op) -{ - /* - * Try to rewrite "descendant-or-self::node()/foo" to an optimized - * internal representation. - */ - if (op->ch1 != -1) { - if ((op->op == XPATH_OP_COLLECT /* 11 */) && - ((xmlXPathAxisVal) op->value == AXIS_CHILD /* 4 */) && - ((xmlXPathTestVal) op->value2 == NODE_TEST_NAME /* 5 */) && - ((xmlXPathTypeVal) op->value3 == NODE_TYPE_NODE /* 0 */)) - { - /* - * This is a "child::foo" - */ - xmlXPathStepOpPtr prevop = &comp->steps[op->ch1]; - - if ((prevop->op == XPATH_OP_COLLECT /* 11 */) && - (prevop->ch1 != -1) && - ((xmlXPathAxisVal) prevop->value == - AXIS_DESCENDANT_OR_SELF) && - (prevop->ch2 == -1) && - ((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) && - ((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE) && - (comp->steps[prevop->ch1].op == XPATH_OP_ROOT)) - { - /* - * This is a "/descendant-or-self::node()" without predicates. - * Eliminate it. - */ - op->ch1 = prevop->ch1; - op->rewriteType = XP_REWRITE_DOS_CHILD_ELEM; - } - } - if (op->ch1 != -1) - xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch1]); - } - if (op->ch2 != -1) - xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch2]); -} - -/** - * xmlXPathCtxtCompile: - * @ctxt: an XPath context - * @str: the XPath expression - * - * Compile an XPath expression - * - * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. - * the caller has to free the object. - */ -xmlXPathCompExprPtr -xmlXPathCtxtCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { - xmlXPathParserContextPtr pctxt; - xmlXPathCompExprPtr comp; - -#ifdef XPATH_STREAMING - comp = xmlXPathTryStreamCompile(ctxt, str); - if (comp != NULL) - return(comp); -#endif - - xmlXPathInit(); - - pctxt = xmlXPathNewParserContext(str, ctxt); - xmlXPathCompileExpr(pctxt, 1); - - if( pctxt->error != XPATH_EXPRESSION_OK ) - { - xmlXPathFreeParserContext(pctxt); - return(NULL); - } - - if (*pctxt->cur != 0) { - /* - * aleksey: in some cases this line prints *second* error message - * (see bug #78858) and probably this should be fixed. - * However, we are not sure that all error messages are printed - * out in other places. It's not critical so we leave it as-is for now - */ - xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); - comp = NULL; - } else { - comp = pctxt->comp; - pctxt->comp = NULL; - } - xmlXPathFreeParserContext(pctxt); - - if (comp != NULL) { - comp->expr = xmlStrdup(str); -#ifdef DEBUG_EVAL_COUNTS - comp->string = xmlStrdup(str); - comp->nb = 0; -#endif - if ((comp->expr != NULL) && - (comp->nbStep > 2) && - (comp->last >= 0) && - (xmlXPathCanRewriteDosExpression(comp->expr) == 1)) - { - xmlXPathRewriteDOSExpression(comp, &comp->steps[comp->last]); - } - } - return(comp); -} - -/** - * xmlXPathCompile: - * @str: the XPath expression - * - * Compile an XPath expression - * - * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. - * the caller has to free the object. - */ -xmlXPathCompExprPtr -xmlXPathCompile(const xmlChar *str) { - return(xmlXPathCtxtCompile(NULL, str)); -} - -/** - * xmlXPathCompiledEvalInternal: - * @comp: the compiled XPath expression - * @ctxt: the XPath context - * @resObj: the resulting XPath object or NULL - * @toBool: 1 if only a boolean result is requested - * - * Evaluate the Precompiled XPath expression in the given context. - * The caller has to free @resObj. - * - * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. - * the caller has to free the object. - */ -static int -xmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp, - xmlXPathContextPtr ctxt, - xmlXPathObjectPtr *resObj, - int toBool) -{ - xmlXPathParserContextPtr pctxt; -#ifndef LIBXML_THREAD_ENABLED - static int reentance = 0; -#endif - int res; - - CHECK_CTXT_NEG(ctxt) - - if (comp == NULL) - return(-1); - xmlXPathInit(); - -#ifndef LIBXML_THREAD_ENABLED - reentance++; - if (reentance > 1) - xmlXPathDisableOptimizer = 1; -#endif - -#ifdef DEBUG_EVAL_COUNTS - comp->nb++; - if ((comp->string != NULL) && (comp->nb > 100)) { - fprintf(stderr, "100 x %s\n", comp->string); - comp->nb = 0; - } -#endif - pctxt = xmlXPathCompParserContext(comp, ctxt); - res = xmlXPathRunEval(pctxt, toBool); - - if (resObj) { - if (pctxt->value == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompiledEval: evaluation failed\n"); - *resObj = NULL; - } else { - *resObj = valuePop(pctxt); - } - } - - /* - * Pop all remaining objects from the stack. - */ - if (pctxt->valueNr > 0) { - xmlXPathObjectPtr tmp; - int stack = 0; - - do { - tmp = valuePop(pctxt); - if (tmp != NULL) { - if (tmp != NULL) - stack++; - xmlXPathReleaseObject(ctxt, tmp); - } - } while (tmp != NULL); - if ((stack != 0) && - ((toBool) || ((resObj) && (*resObj)))) - { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompiledEval: %d objects left on the stack.\n", - stack); - } - } - - if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) { - xmlXPathFreeObject(*resObj); - *resObj = NULL; - } - pctxt->comp = NULL; - xmlXPathFreeParserContext(pctxt); -#ifndef LIBXML_THREAD_ENABLED - reentance--; -#endif - - return(res); -} - -/** - * xmlXPathCompiledEval: - * @comp: the compiled XPath expression - * @ctx: the XPath context - * - * Evaluate the Precompiled XPath expression in the given context. - * - * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. - * the caller has to free the object. - */ -xmlXPathObjectPtr -xmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx) -{ - xmlXPathObjectPtr res = NULL; - - xmlXPathCompiledEvalInternal(comp, ctx, &res, 0); - return(res); -} - -/** - * xmlXPathCompiledEvalToBoolean: - * @comp: the compiled XPath expression - * @ctxt: the XPath context - * - * Applies the XPath boolean() function on the result of the given - * compiled expression. - * - * Returns 1 if the expression evaluated to true, 0 if to false and - * -1 in API and internal errors. - */ -int -xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, - xmlXPathContextPtr ctxt) -{ - return(xmlXPathCompiledEvalInternal(comp, ctxt, NULL, 1)); -} - -/** - * xmlXPathEvalExpr: - * @ctxt: the XPath Parser context - * - * Parse and evaluate an XPath expression in the given context, - * then push the result on the context stack - */ -void -xmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) { -#ifdef XPATH_STREAMING - xmlXPathCompExprPtr comp; -#endif - - if (ctxt == NULL) return; - -#ifdef XPATH_STREAMING - comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base); - if (comp != NULL) { - if (ctxt->comp != NULL) - xmlXPathFreeCompExpr(ctxt->comp); - ctxt->comp = comp; - if (ctxt->cur != NULL) - while (*ctxt->cur != 0) ctxt->cur++; - } else -#endif - { - xmlXPathCompileExpr(ctxt, 1); - /* - * In this scenario the expression string will sit in ctxt->base. - */ - if ((ctxt->error == XPATH_EXPRESSION_OK) && - (ctxt->comp != NULL) && - (ctxt->base != NULL) && - (ctxt->comp->nbStep > 2) && - (ctxt->comp->last >= 0) && - (xmlXPathCanRewriteDosExpression((xmlChar *) ctxt->base) == 1)) - { - xmlXPathRewriteDOSExpression(ctxt->comp, - &ctxt->comp->steps[ctxt->comp->last]); - } - } - CHECK_ERROR; - xmlXPathRunEval(ctxt, 0); -} - -/** - * xmlXPathEval: - * @str: the XPath expression - * @ctx: the XPath context - * - * Evaluate the XPath Location Path in the given context. - * - * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. - * the caller has to free the object. - */ -xmlXPathObjectPtr -xmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) { - xmlXPathParserContextPtr ctxt; - xmlXPathObjectPtr res, tmp, init = NULL; - int stack = 0; - - CHECK_CTXT(ctx) - - xmlXPathInit(); - - ctxt = xmlXPathNewParserContext(str, ctx); - xmlXPathEvalExpr(ctxt); - - if (ctxt->value == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathEval: evaluation failed\n"); - res = NULL; - } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL) -#ifdef XPATH_STREAMING - && (ctxt->comp->stream == NULL) -#endif - ) { - xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); - res = NULL; - } else { - res = valuePop(ctxt); - } - - do { - tmp = valuePop(ctxt); - if (tmp != NULL) { - if (tmp != init) - stack++; - xmlXPathReleaseObject(ctx, tmp); - } - } while (tmp != NULL); - if ((stack != 0) && (res != NULL)) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathEval: %d object left on the stack\n", - stack); - } - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeObject(res); - res = NULL; - } - - xmlXPathFreeParserContext(ctxt); - return(res); -} - -/** - * xmlXPathEvalExpression: - * @str: the XPath expression - * @ctxt: the XPath context - * - * Evaluate the XPath expression in the given context. - * - * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. - * the caller has to free the object. - */ -xmlXPathObjectPtr -xmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) { - xmlXPathParserContextPtr pctxt; - xmlXPathObjectPtr res, tmp; - int stack = 0; - - CHECK_CTXT(ctxt) - - xmlXPathInit(); - - pctxt = xmlXPathNewParserContext(str, ctxt); - xmlXPathEvalExpr(pctxt); - - if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) { - xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); - res = NULL; - } else { - res = valuePop(pctxt); - } - do { - tmp = valuePop(pctxt); - if (tmp != NULL) { - xmlXPathReleaseObject(ctxt, tmp); - stack++; - } - } while (tmp != NULL); - if ((stack != 0) && (res != NULL)) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathEvalExpression: %d object left on the stack\n", - stack); - } - xmlXPathFreeParserContext(pctxt); - return(res); -} - -/************************************************************************ - * * - * Extra functions not pertaining to the XPath spec * - * * - ************************************************************************/ -/** - * xmlXPathEscapeUriFunction: - * @ctxt: the XPath Parser context - * @nargs: the number of arguments - * - * Implement the escape-uri() XPath function - * string escape-uri(string $str, bool $escape-reserved) - * - * This function applies the URI escaping rules defined in section 2 of [RFC - * 2396] to the string supplied as $uri-part, which typically represents all - * or part of a URI. The effect of the function is to replace any special - * character in the string by an escape sequence of the form %xx%yy..., - * where xxyy... is the hexadecimal representation of the octets used to - * represent the character in UTF-8. - * - * The set of characters that are escaped depends on the setting of the - * boolean argument $escape-reserved. - * - * If $escape-reserved is true, all characters are escaped other than lower - * case letters a-z, upper case letters A-Z, digits 0-9, and the characters - * referred to in [RFC 2396] as "marks": specifically, "-" | "_" | "." | "!" - * | "~" | "*" | "'" | "(" | ")". The "%" character itself is escaped only - * if it is not followed by two hexadecimal digits (that is, 0-9, a-f, and - * A-F). - * - * If $escape-reserved is false, the behavior differs in that characters - * referred to in [RFC 2396] as reserved characters are not escaped. These - * characters are ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ",". - * - * [RFC 2396] does not define whether escaped URIs should use lower case or - * upper case for hexadecimal digits. To ensure that escaped URIs can be - * compared using string comparison functions, this function must always use - * the upper-case letters A-F. - * - * Generally, $escape-reserved should be set to true when escaping a string - * that is to form a single part of a URI, and to false when escaping an - * entire URI or URI reference. - * - * In the case of non-ascii characters, the string is encoded according to - * utf-8 and then converted according to RFC 2396. - * - * Examples - * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), true()) - * returns "gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCalifornia%2FLos%20Angeles%23ocean" - * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), false()) - * returns "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles%23ocean" - * - */ -static void -xmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr str; - int escape_reserved; - xmlBufferPtr target; - xmlChar *cptr; - xmlChar escape[4]; - - CHECK_ARITY(2); - - escape_reserved = xmlXPathPopBoolean(ctxt); - - CAST_TO_STRING; - str = valuePop(ctxt); - - target = xmlBufferCreate(); - - escape[0] = '%'; - escape[3] = 0; - - if (target) { - for (cptr = str->stringval; *cptr; cptr++) { - if ((*cptr >= 'A' && *cptr <= 'Z') || - (*cptr >= 'a' && *cptr <= 'z') || - (*cptr >= '0' && *cptr <= '9') || - *cptr == '-' || *cptr == '_' || *cptr == '.' || - *cptr == '!' || *cptr == '~' || *cptr == '*' || - *cptr == '\''|| *cptr == '(' || *cptr == ')' || - (*cptr == '%' && - ((cptr[1] >= 'A' && cptr[1] <= 'F') || - (cptr[1] >= 'a' && cptr[1] <= 'f') || - (cptr[1] >= '0' && cptr[1] <= '9')) && - ((cptr[2] >= 'A' && cptr[2] <= 'F') || - (cptr[2] >= 'a' && cptr[2] <= 'f') || - (cptr[2] >= '0' && cptr[2] <= '9'))) || - (!escape_reserved && - (*cptr == ';' || *cptr == '/' || *cptr == '?' || - *cptr == ':' || *cptr == '@' || *cptr == '&' || - *cptr == '=' || *cptr == '+' || *cptr == '$' || - *cptr == ','))) { - xmlBufferAdd(target, cptr, 1); - } else { - if ((*cptr >> 4) < 10) - escape[1] = '0' + (*cptr >> 4); - else - escape[1] = 'A' - 10 + (*cptr >> 4); - if ((*cptr & 0xF) < 10) - escape[2] = '0' + (*cptr & 0xF); - else - escape[2] = 'A' - 10 + (*cptr & 0xF); - - xmlBufferAdd(target, &escape[0], 3); - } - } - } - valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, - xmlBufferContent(target))); - xmlBufferFree(target); - xmlXPathReleaseObject(ctxt->context, str); -} - -/** - * xmlXPathRegisterAllFunctions: - * @ctxt: the XPath context - * - * Registers all default XPath functions in this context - */ -void -xmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt) -{ - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"boolean", - xmlXPathBooleanFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"ceiling", - xmlXPathCeilingFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"count", - xmlXPathCountFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"concat", - xmlXPathConcatFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"contains", - xmlXPathContainsFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"id", - xmlXPathIdFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"false", - xmlXPathFalseFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"floor", - xmlXPathFloorFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"last", - xmlXPathLastFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"lang", - xmlXPathLangFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"local-name", - xmlXPathLocalNameFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"not", - xmlXPathNotFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"name", - xmlXPathNameFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"namespace-uri", - xmlXPathNamespaceURIFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"normalize-space", - xmlXPathNormalizeFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"number", - xmlXPathNumberFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"position", - xmlXPathPositionFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"round", - xmlXPathRoundFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string", - xmlXPathStringFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string-length", - xmlXPathStringLengthFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"starts-with", - xmlXPathStartsWithFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring", - xmlXPathSubstringFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-before", - xmlXPathSubstringBeforeFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-after", - xmlXPathSubstringAfterFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"sum", - xmlXPathSumFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"true", - xmlXPathTrueFunction); - xmlXPathRegisterFunc(ctxt, (const xmlChar *)"translate", - xmlXPathTranslateFunction); - - xmlXPathRegisterFuncNS(ctxt, (const xmlChar *)"escape-uri", - (const xmlChar *)"http://www.w3.org/2002/08/xquery-functions", - xmlXPathEscapeUriFunction); -} - -#endif /* LIBXML_XPATH_ENABLED */ -#define bottom_xpath -#include "elfgcchack.h" diff --git a/ThirdParty/libxml2/vtklibxml2/xpointer.c b/ThirdParty/libxml2/vtklibxml2/xpointer.c deleted file mode 100644 index f4016549d25..00000000000 --- a/ThirdParty/libxml2/vtklibxml2/xpointer.c +++ /dev/null @@ -1,3003 +0,0 @@ -/* - * xpointer.c : Code to handle XML Pointer - * - * Base implementation was made accordingly to - * W3C Candidate Recommendation 7 June 2000 - * http://www.w3.org/TR/2000/CR-xptr-20000607 - * - * Added support for the element() scheme described in: - * W3C Proposed Recommendation 13 November 2002 - * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ - * - * See Copyright for the status of this software. - * - * daniel@veillard.com - */ - -#define IN_LIBXML -#include "libxml.h" - -/* - * TODO: better handling of error cases, the full expression should - * be parsed beforehand instead of a progressive evaluation - * TODO: Access into entities references are not supported now ... - * need a start to be able to pop out of entities refs since - * parent is the endity declaration, not the ref. - */ - -#include <string.h> -#include <libxml/xpointer.h> -#include <libxml/xmlmemory.h> -#include <libxml/parserInternals.h> -#include <libxml/uri.h> -#include <libxml/xpath.h> -#include <libxml/xpathInternals.h> -#include <libxml/xmlerror.h> -#include <libxml/globals.h> - -#ifdef LIBXML_XPTR_ENABLED - -/* Add support of the xmlns() xpointer scheme to initialize the namespaces */ -#define XPTR_XMLNS_SCHEME - -/* #define DEBUG_RANGES */ -#ifdef DEBUG_RANGES -#ifdef LIBXML_DEBUG_ENABLED -#include <libxml/debugXML.h> -#endif -#endif - -#define TODO \ - xmlGenericError(xmlGenericErrorContext, \ - "Unimplemented block at %s:%d\n", \ - __FILE__, __LINE__); - -#define STRANGE \ - xmlGenericError(xmlGenericErrorContext, \ - "Internal error at %s:%d\n", \ - __FILE__, __LINE__); - -/************************************************************************ - * * - * Some factorized error routines * - * * - ************************************************************************/ - -/** - * xmlXPtrErrMemory: - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -static void -xmlXPtrErrMemory(const char *extra) -{ - __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_XPOINTER, - XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, extra, - NULL, NULL, 0, 0, - "Memory allocation failed : %s\n", extra); -} - -/** - * xmlXPtrErr: - * @ctxt: an XPTR evaluation context - * @extra: extra informations - * - * Handle a redefinition of attribute error - */ -static void -xmlXPtrErr(xmlXPathParserContextPtr ctxt, int error, - const char * msg, const xmlChar *extra) -{ - if (ctxt != NULL) - ctxt->error = error; - if ((ctxt == NULL) || (ctxt->context == NULL)) { - __xmlRaiseError(NULL, NULL, NULL, - NULL, NULL, XML_FROM_XPOINTER, error, - XML_ERR_ERROR, NULL, 0, - (const char *) extra, NULL, NULL, 0, 0, - msg, extra); - return; - } - ctxt->context->lastError.domain = XML_FROM_XPOINTER; - ctxt->context->lastError.code = error; - ctxt->context->lastError.level = XML_ERR_ERROR; - ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base); - ctxt->context->lastError.int1 = ctxt->cur - ctxt->base; - ctxt->context->lastError.node = ctxt->context->debugNode; - if (ctxt->context->error != NULL) { - ctxt->context->error(ctxt->context->userData, - &ctxt->context->lastError); - } else { - __xmlRaiseError(NULL, NULL, NULL, - NULL, ctxt->context->debugNode, XML_FROM_XPOINTER, - error, XML_ERR_ERROR, NULL, 0, - (const char *) extra, (const char *) ctxt->base, NULL, - ctxt->cur - ctxt->base, 0, - msg, extra); - } -} - -/************************************************************************ - * * - * A few helper functions for child sequences * - * * - ************************************************************************/ -/* xmlXPtrAdvanceNode is a private function, but used by xinclude.c */ -xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *level); -/** - * xmlXPtrGetArity: - * @cur: the node - * - * Returns the number of child for an element, -1 in case of error - */ -static int -xmlXPtrGetArity(xmlNodePtr cur) { - int i; - if (cur == NULL) - return(-1); - cur = cur->children; - for (i = 0;cur != NULL;cur = cur->next) { - if ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - i++; - } - } - return(i); -} - -/** - * xmlXPtrGetIndex: - * @cur: the node - * - * Returns the index of the node in its parent children list, -1 - * in case of error - */ -static int -xmlXPtrGetIndex(xmlNodePtr cur) { - int i; - if (cur == NULL) - return(-1); - for (i = 1;cur != NULL;cur = cur->prev) { - if ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - i++; - } - } - return(i); -} - -/** - * xmlXPtrGetNthChild: - * @cur: the node - * @no: the child number - * - * Returns the @no'th element child of @cur or NULL - */ -static xmlNodePtr -xmlXPtrGetNthChild(xmlNodePtr cur, int no) { - int i; - if (cur == NULL) - return(cur); - cur = cur->children; - for (i = 0;i <= no;cur = cur->next) { - if (cur == NULL) - return(cur); - if ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - i++; - if (i == no) - break; - } - } - return(cur); -} - -/************************************************************************ - * * - * Handling of XPointer specific types * - * * - ************************************************************************/ - -/** - * xmlXPtrCmpPoints: - * @node1: the first node - * @index1: the first index - * @node2: the second node - * @index2: the second index - * - * Compare two points w.r.t document order - * - * Returns -2 in case of error 1 if first point < second point, 0 if - * that's the same point, -1 otherwise - */ -static int -xmlXPtrCmpPoints(xmlNodePtr node1, int index1, xmlNodePtr node2, int index2) { - if ((node1 == NULL) || (node2 == NULL)) - return(-2); - /* - * a couple of optimizations which will avoid computations in most cases - */ - if (node1 == node2) { - if (index1 < index2) - return(1); - if (index1 > index2) - return(-1); - return(0); - } - return(xmlXPathCmpNodes(node1, node2)); -} - -/** - * xmlXPtrNewPoint: - * @node: the xmlNodePtr - * @indx: the indx within the node - * - * Create a new xmlXPathObjectPtr of type point - * - * Returns the newly created object. - */ -static xmlXPathObjectPtr -xmlXPtrNewPoint(xmlNodePtr node, int indx) { - xmlXPathObjectPtr ret; - - if (node == NULL) - return(NULL); - if (indx < 0) - return(NULL); - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating point"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_POINT; - ret->user = (void *) node; - ret->index = indx; - return(ret); -} - -/** - * xmlXPtrRangeCheckOrder: - * @range: an object range - * - * Make sure the points in the range are in the right order - */ -static void -xmlXPtrRangeCheckOrder(xmlXPathObjectPtr range) { - int tmp; - xmlNodePtr tmp2; - if (range == NULL) - return; - if (range->type != XPATH_RANGE) - return; - if (range->user2 == NULL) - return; - tmp = xmlXPtrCmpPoints(range->user, range->index, - range->user2, range->index2); - if (tmp == -1) { - tmp2 = range->user; - range->user = range->user2; - range->user2 = tmp2; - tmp = range->index; - range->index = range->index2; - range->index2 = tmp; - } -} - -/** - * xmlXPtrRangesEqual: - * @range1: the first range - * @range2: the second range - * - * Compare two ranges - * - * Returns 1 if equal, 0 otherwise - */ -static int -xmlXPtrRangesEqual(xmlXPathObjectPtr range1, xmlXPathObjectPtr range2) { - if (range1 == range2) - return(1); - if ((range1 == NULL) || (range2 == NULL)) - return(0); - if (range1->type != range2->type) - return(0); - if (range1->type != XPATH_RANGE) - return(0); - if (range1->user != range2->user) - return(0); - if (range1->index != range2->index) - return(0); - if (range1->user2 != range2->user2) - return(0); - if (range1->index2 != range2->index2) - return(0); - return(1); -} - -/** - * xmlXPtrNewRange: - * @start: the starting node - * @startindex: the start index - * @end: the ending point - * @endindex: the ending index - * - * Create a new xmlXPathObjectPtr of type range - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewRange(xmlNodePtr start, int startindex, - xmlNodePtr end, int endindex) { - xmlXPathObjectPtr ret; - - if (start == NULL) - return(NULL); - if (end == NULL) - return(NULL); - if (startindex < 0) - return(NULL); - if (endindex < 0) - return(NULL); - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating range"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_RANGE; - ret->user = start; - ret->index = startindex; - ret->user2 = end; - ret->index2 = endindex; - xmlXPtrRangeCheckOrder(ret); - return(ret); -} - -/** - * xmlXPtrNewRangePoints: - * @start: the starting point - * @end: the ending point - * - * Create a new xmlXPathObjectPtr of type range using 2 Points - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) { - xmlXPathObjectPtr ret; - - if (start == NULL) - return(NULL); - if (end == NULL) - return(NULL); - if (start->type != XPATH_POINT) - return(NULL); - if (end->type != XPATH_POINT) - return(NULL); - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating range"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_RANGE; - ret->user = start->user; - ret->index = start->index; - ret->user2 = end->user; - ret->index2 = end->index; - xmlXPtrRangeCheckOrder(ret); - return(ret); -} - -/** - * xmlXPtrNewRangePointNode: - * @start: the starting point - * @end: the ending node - * - * Create a new xmlXPathObjectPtr of type range from a point to a node - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) { - xmlXPathObjectPtr ret; - - if (start == NULL) - return(NULL); - if (end == NULL) - return(NULL); - if (start->type != XPATH_POINT) - return(NULL); - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating range"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_RANGE; - ret->user = start->user; - ret->index = start->index; - ret->user2 = end; - ret->index2 = -1; - xmlXPtrRangeCheckOrder(ret); - return(ret); -} - -/** - * xmlXPtrNewRangeNodePoint: - * @start: the starting node - * @end: the ending point - * - * Create a new xmlXPathObjectPtr of type range from a node to a point - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) { - xmlXPathObjectPtr ret; - - if (start == NULL) - return(NULL); - if (end == NULL) - return(NULL); - if (start->type != XPATH_POINT) - return(NULL); - if (end->type != XPATH_POINT) - return(NULL); - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating range"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_RANGE; - ret->user = start; - ret->index = -1; - ret->user2 = end->user; - ret->index2 = end->index; - xmlXPtrRangeCheckOrder(ret); - return(ret); -} - -/** - * xmlXPtrNewRangeNodes: - * @start: the starting node - * @end: the ending node - * - * Create a new xmlXPathObjectPtr of type range using 2 nodes - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) { - xmlXPathObjectPtr ret; - - if (start == NULL) - return(NULL); - if (end == NULL) - return(NULL); - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating range"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_RANGE; - ret->user = start; - ret->index = -1; - ret->user2 = end; - ret->index2 = -1; - xmlXPtrRangeCheckOrder(ret); - return(ret); -} - -/** - * xmlXPtrNewCollapsedRange: - * @start: the starting and ending node - * - * Create a new xmlXPathObjectPtr of type range using a single nodes - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewCollapsedRange(xmlNodePtr start) { - xmlXPathObjectPtr ret; - - if (start == NULL) - return(NULL); - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating range"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_RANGE; - ret->user = start; - ret->index = -1; - ret->user2 = NULL; - ret->index2 = -1; - return(ret); -} - -/** - * xmlXPtrNewRangeNodeObject: - * @start: the starting node - * @end: the ending object - * - * Create a new xmlXPathObjectPtr of type range from a not to an object - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { - xmlXPathObjectPtr ret; - - if (start == NULL) - return(NULL); - if (end == NULL) - return(NULL); - switch (end->type) { - case XPATH_POINT: - case XPATH_RANGE: - break; - case XPATH_NODESET: - /* - * Empty set ... - */ - if (end->nodesetval->nodeNr <= 0) - return(NULL); - break; - default: - /* TODO */ - return(NULL); - } - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating range"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_RANGE; - ret->user = start; - ret->index = -1; - switch (end->type) { - case XPATH_POINT: - ret->user2 = end->user; - ret->index2 = end->index; - break; - case XPATH_RANGE: - ret->user2 = end->user2; - ret->index2 = end->index2; - break; - case XPATH_NODESET: { - ret->user2 = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; - ret->index2 = -1; - break; - } - default: - STRANGE - return(NULL); - } - xmlXPtrRangeCheckOrder(ret); - return(ret); -} - -#define XML_RANGESET_DEFAULT 10 - -/** - * xmlXPtrLocationSetCreate: - * @val: an initial xmlXPathObjectPtr, or NULL - * - * Create a new xmlLocationSetPtr of type double and of value @val - * - * Returns the newly created object. - */ -xmlLocationSetPtr -xmlXPtrLocationSetCreate(xmlXPathObjectPtr val) { - xmlLocationSetPtr ret; - - ret = (xmlLocationSetPtr) xmlMalloc(sizeof(xmlLocationSet)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating locationset"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlLocationSet)); - if (val != NULL) { - ret->locTab = (xmlXPathObjectPtr *) xmlMalloc(XML_RANGESET_DEFAULT * - sizeof(xmlXPathObjectPtr)); - if (ret->locTab == NULL) { - xmlXPtrErrMemory("allocating locationset"); - xmlFree(ret); - return(NULL); - } - memset(ret->locTab, 0 , - XML_RANGESET_DEFAULT * (size_t) sizeof(xmlXPathObjectPtr)); - ret->locMax = XML_RANGESET_DEFAULT; - ret->locTab[ret->locNr++] = val; - } - return(ret); -} - -/** - * xmlXPtrLocationSetAdd: - * @cur: the initial range set - * @val: a new xmlXPathObjectPtr - * - * add a new xmlXPathObjectPtr to an existing LocationSet - * If the location already exist in the set @val is freed. - */ -void -xmlXPtrLocationSetAdd(xmlLocationSetPtr cur, xmlXPathObjectPtr val) { - int i; - - if ((cur == NULL) || (val == NULL)) return; - - /* - * check against doublons - */ - for (i = 0;i < cur->locNr;i++) { - if (xmlXPtrRangesEqual(cur->locTab[i], val)) { - xmlXPathFreeObject(val); - return; - } - } - - /* - * grow the locTab if needed - */ - if (cur->locMax == 0) { - cur->locTab = (xmlXPathObjectPtr *) xmlMalloc(XML_RANGESET_DEFAULT * - sizeof(xmlXPathObjectPtr)); - if (cur->locTab == NULL) { - xmlXPtrErrMemory("adding location to set"); - return; - } - memset(cur->locTab, 0 , - XML_RANGESET_DEFAULT * (size_t) sizeof(xmlXPathObjectPtr)); - cur->locMax = XML_RANGESET_DEFAULT; - } else if (cur->locNr == cur->locMax) { - xmlXPathObjectPtr *temp; - - cur->locMax *= 2; - temp = (xmlXPathObjectPtr *) xmlRealloc(cur->locTab, cur->locMax * - sizeof(xmlXPathObjectPtr)); - if (temp == NULL) { - xmlXPtrErrMemory("adding location to set"); - return; - } - cur->locTab = temp; - } - cur->locTab[cur->locNr++] = val; -} - -/** - * xmlXPtrLocationSetMerge: - * @val1: the first LocationSet - * @val2: the second LocationSet - * - * Merges two rangesets, all ranges from @val2 are added to @val1 - * - * Returns val1 once extended or NULL in case of error. - */ -xmlLocationSetPtr -xmlXPtrLocationSetMerge(xmlLocationSetPtr val1, xmlLocationSetPtr val2) { - int i; - - if (val1 == NULL) return(NULL); - if (val2 == NULL) return(val1); - - /* - * !!!!! this can be optimized a lot, knowing that both - * val1 and val2 already have unicity of their values. - */ - - for (i = 0;i < val2->locNr;i++) - xmlXPtrLocationSetAdd(val1, val2->locTab[i]); - - return(val1); -} - -/** - * xmlXPtrLocationSetDel: - * @cur: the initial range set - * @val: an xmlXPathObjectPtr - * - * Removes an xmlXPathObjectPtr from an existing LocationSet - */ -void -xmlXPtrLocationSetDel(xmlLocationSetPtr cur, xmlXPathObjectPtr val) { - int i; - - if (cur == NULL) return; - if (val == NULL) return; - - /* - * check against doublons - */ - for (i = 0;i < cur->locNr;i++) - if (cur->locTab[i] == val) break; - - if (i >= cur->locNr) { -#ifdef DEBUG - xmlGenericError(xmlGenericErrorContext, - "xmlXPtrLocationSetDel: Range wasn't found in RangeList\n"); -#endif - return; - } - cur->locNr--; - for (;i < cur->locNr;i++) - cur->locTab[i] = cur->locTab[i + 1]; - cur->locTab[cur->locNr] = NULL; -} - -/** - * xmlXPtrLocationSetRemove: - * @cur: the initial range set - * @val: the index to remove - * - * Removes an entry from an existing LocationSet list. - */ -void -xmlXPtrLocationSetRemove(xmlLocationSetPtr cur, int val) { - if (cur == NULL) return; - if (val >= cur->locNr) return; - cur->locNr--; - for (;val < cur->locNr;val++) - cur->locTab[val] = cur->locTab[val + 1]; - cur->locTab[cur->locNr] = NULL; -} - -/** - * xmlXPtrFreeLocationSet: - * @obj: the xmlLocationSetPtr to free - * - * Free the LocationSet compound (not the actual ranges !). - */ -void -xmlXPtrFreeLocationSet(xmlLocationSetPtr obj) { - int i; - - if (obj == NULL) return; - if (obj->locTab != NULL) { - for (i = 0;i < obj->locNr; i++) { - xmlXPathFreeObject(obj->locTab[i]); - } - xmlFree(obj->locTab); - } - xmlFree(obj); -} - -/** - * xmlXPtrNewLocationSetNodes: - * @start: the start NodePtr value - * @end: the end NodePtr value or NULL - * - * Create a new xmlXPathObjectPtr of type LocationSet and initialize - * it with the single range made of the two nodes @start and @end - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewLocationSetNodes(xmlNodePtr start, xmlNodePtr end) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating locationset"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_LOCATIONSET; - if (end == NULL) - ret->user = xmlXPtrLocationSetCreate(xmlXPtrNewCollapsedRange(start)); - else - ret->user = xmlXPtrLocationSetCreate(xmlXPtrNewRangeNodes(start,end)); - return(ret); -} - -/** - * xmlXPtrNewLocationSetNodeSet: - * @set: a node set - * - * Create a new xmlXPathObjectPtr of type LocationSet and initialize - * it with all the nodes from @set - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrNewLocationSetNodeSet(xmlNodeSetPtr set) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating locationset"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_LOCATIONSET; - if (set != NULL) { - int i; - xmlLocationSetPtr newset; - - newset = xmlXPtrLocationSetCreate(NULL); - if (newset == NULL) - return(ret); - - for (i = 0;i < set->nodeNr;i++) - xmlXPtrLocationSetAdd(newset, - xmlXPtrNewCollapsedRange(set->nodeTab[i])); - - ret->user = (void *) newset; - } - return(ret); -} - -/** - * xmlXPtrWrapLocationSet: - * @val: the LocationSet value - * - * Wrap the LocationSet @val in a new xmlXPathObjectPtr - * - * Returns the newly created object. - */ -xmlXPathObjectPtr -xmlXPtrWrapLocationSet(xmlLocationSetPtr val) { - xmlXPathObjectPtr ret; - - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); - if (ret == NULL) { - xmlXPtrErrMemory("allocating locationset"); - return(NULL); - } - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); - ret->type = XPATH_LOCATIONSET; - ret->user = (void *) val; - return(ret); -} - -/************************************************************************ - * * - * The parser * - * * - ************************************************************************/ - -static void xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name); - -/* - * Macros for accessing the content. Those should be used only by the parser, - * and not exported. - * - * Dirty macros, i.e. one need to make assumption on the context to use them - * - * CUR_PTR return the current pointer to the xmlChar to be parsed. - * CUR returns the current xmlChar value, i.e. a 8 bit value - * in ISO-Latin or UTF-8. - * This should be used internally by the parser - * only to compare to ASCII values otherwise it would break when - * running with UTF-8 encoding. - * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only - * to compare on ASCII based substring. - * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined - * strings within the parser. - * CURRENT Returns the current char value, with the full decoding of - * UTF-8 if we are using this mode. It returns an int. - * NEXT Skip to the next character, this does the proper decoding - * in UTF-8 mode. It also pop-up unfinished entities on the fly. - * It returns the pointer to the current xmlChar. - */ - -#define CUR (*ctxt->cur) -#define SKIP(val) ctxt->cur += (val) -#define NXT(val) ctxt->cur[(val)] -#define CUR_PTR ctxt->cur - -#define SKIP_BLANKS \ - while (IS_BLANK_CH(*(ctxt->cur))) NEXT - -#define CURRENT (*ctxt->cur) -#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) - -/* - * xmlXPtrGetChildNo: - * @ctxt: the XPointer Parser context - * @index: the child number - * - * Move the current node of the nodeset on the stack to the - * given child if found - */ -static void -xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int indx) { - xmlNodePtr cur = NULL; - xmlXPathObjectPtr obj; - xmlNodeSetPtr oldset; - - CHECK_TYPE(XPATH_NODESET); - obj = valuePop(ctxt); - oldset = obj->nodesetval; - if ((indx <= 0) || (oldset == NULL) || (oldset->nodeNr != 1)) { - xmlXPathFreeObject(obj); - valuePush(ctxt, xmlXPathNewNodeSet(NULL)); - return; - } - cur = xmlXPtrGetNthChild(oldset->nodeTab[0], indx); - if (cur == NULL) { - xmlXPathFreeObject(obj); - valuePush(ctxt, xmlXPathNewNodeSet(NULL)); - return; - } - oldset->nodeTab[0] = cur; - valuePush(ctxt, obj); -} - -/** - * xmlXPtrEvalXPtrPart: - * @ctxt: the XPointer Parser context - * @name: the preparsed Scheme for the XPtrPart - * - * XPtrPart ::= 'xpointer' '(' XPtrExpr ')' - * | Scheme '(' SchemeSpecificExpr ')' - * - * Scheme ::= NCName - 'xpointer' [VC: Non-XPointer schemes] - * - * SchemeSpecificExpr ::= StringWithBalancedParens - * - * StringWithBalancedParens ::= - * [^()]* ('(' StringWithBalancedParens ')' [^()]*)* - * [VC: Parenthesis escaping] - * - * XPtrExpr ::= Expr [VC: Parenthesis escaping] - * - * VC: Parenthesis escaping: - * The end of an XPointer part is signaled by the right parenthesis ")" - * character that is balanced with the left parenthesis "(" character - * that began the part. Any unbalanced parenthesis character inside the - * expression, even within literals, must be escaped with a circumflex (^) - * character preceding it. If the expression contains any literal - * occurrences of the circumflex, each must be escaped with an additional - * circumflex (that is, ^^). If the unescaped parentheses in the expression - * are not balanced, a syntax error results. - * - * Parse and evaluate an XPtrPart. Basically it generates the unescaped - * string and if the scheme is 'xpointer' it will call the XPath interpreter. - * - * TODO: there is no new scheme registration mechanism - */ - -static void -xmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xmlChar *name) { - xmlChar *buffer, *cur; - int len; - int level; - - if (name == NULL) - name = xmlXPathParseName(ctxt); - if (name == NULL) - XP_ERROR(XPATH_EXPR_ERROR); - - if (CUR != '(') - XP_ERROR(XPATH_EXPR_ERROR); - NEXT; - level = 1; - - len = xmlStrlen(ctxt->cur); - len++; - buffer = (xmlChar *) xmlMallocAtomic(len * sizeof (xmlChar)); - if (buffer == NULL) { - xmlXPtrErrMemory("allocating buffer"); - return; - } - - cur = buffer; - while (CUR != 0) { - if (CUR == ')') { - level--; - if (level == 0) { - NEXT; - break; - } - *cur++ = CUR; - } else if (CUR == '(') { - level++; - *cur++ = CUR; - } else if (CUR == '^') { - NEXT; - if ((CUR == ')') || (CUR == '(') || (CUR == '^')) { - *cur++ = CUR; - } else { - *cur++ = '^'; - *cur++ = CUR; - } - } else { - *cur++ = CUR; - } - NEXT; - } - *cur = 0; - - if ((level != 0) && (CUR == 0)) { - xmlFree(buffer); - XP_ERROR(XPTR_SYNTAX_ERROR); - } - - if (xmlStrEqual(name, (xmlChar *) "xpointer")) { - const xmlChar *left = CUR_PTR; - - CUR_PTR = buffer; - /* - * To evaluate an xpointer scheme element (4.3) we need: - * context initialized to the root - * context position initalized to 1 - * context size initialized to 1 - */ - ctxt->context->node = (xmlNodePtr)ctxt->context->doc; - ctxt->context->proximityPosition = 1; - ctxt->context->contextSize = 1; - xmlXPathEvalExpr(ctxt); - CUR_PTR=left; - } else if (xmlStrEqual(name, (xmlChar *) "element")) { - const xmlChar *left = CUR_PTR; - xmlChar *name2; - - CUR_PTR = buffer; - if (buffer[0] == '/') { - xmlXPathRoot(ctxt); - xmlXPtrEvalChildSeq(ctxt, NULL); - } else { - name2 = xmlXPathParseName(ctxt); - if (name2 == NULL) { - CUR_PTR = left; - xmlFree(buffer); - XP_ERROR(XPATH_EXPR_ERROR); - } - xmlXPtrEvalChildSeq(ctxt, name2); - } - CUR_PTR = left; -#ifdef XPTR_XMLNS_SCHEME - } else if (xmlStrEqual(name, (xmlChar *) "xmlns")) { - const xmlChar *left = CUR_PTR; - xmlChar *prefix; - xmlChar *URI; - xmlURIPtr value; - - CUR_PTR = buffer; - prefix = xmlXPathParseNCName(ctxt); - if (prefix == NULL) { - xmlFree(buffer); - xmlFree(name); - XP_ERROR(XPTR_SYNTAX_ERROR); - } - SKIP_BLANKS; - if (CUR != '=') { - xmlFree(prefix); - xmlFree(buffer); - xmlFree(name); - XP_ERROR(XPTR_SYNTAX_ERROR); - } - NEXT; - SKIP_BLANKS; - /* @@ check escaping in the XPointer WD */ - - value = xmlParseURI((const char *)ctxt->cur); - if (value == NULL) { - xmlFree(prefix); - xmlFree(buffer); - xmlFree(name); - XP_ERROR(XPTR_SYNTAX_ERROR); - } - URI = xmlSaveUri(value); - xmlFreeURI(value); - if (URI == NULL) { - xmlFree(prefix); - xmlFree(buffer); - xmlFree(name); - XP_ERROR(XPATH_MEMORY_ERROR); - } - - xmlXPathRegisterNs(ctxt->context, prefix, URI); - CUR_PTR = left; - xmlFree(URI); - xmlFree(prefix); -#endif /* XPTR_XMLNS_SCHEME */ - } else { - xmlXPtrErr(ctxt, XML_XPTR_UNKNOWN_SCHEME, - "unsupported scheme '%s'\n", name); - } - xmlFree(buffer); - xmlFree(name); -} - -/** - * xmlXPtrEvalFullXPtr: - * @ctxt: the XPointer Parser context - * @name: the preparsed Scheme for the first XPtrPart - * - * FullXPtr ::= XPtrPart (S? XPtrPart)* - * - * As the specs says: - * ----------- - * When multiple XPtrParts are provided, they must be evaluated in - * left-to-right order. If evaluation of one part fails, the nexti - * is evaluated. The following conditions cause XPointer part failure: - * - * - An unknown scheme - * - A scheme that does not locate any sub-resource present in the resource - * - A scheme that is not applicable to the media type of the resource - * - * The XPointer application must consume a failed XPointer part and - * attempt to evaluate the next one, if any. The result of the first - * XPointer part whose evaluation succeeds is taken to be the fragment - * located by the XPointer as a whole. If all the parts fail, the result - * for the XPointer as a whole is a sub-resource error. - * ----------- - * - * Parse and evaluate a Full XPtr i.e. possibly a cascade of XPath based - * expressions or other schemes. - */ -static void -xmlXPtrEvalFullXPtr(xmlXPathParserContextPtr ctxt, xmlChar *name) { - if (name == NULL) - name = xmlXPathParseName(ctxt); - if (name == NULL) - XP_ERROR(XPATH_EXPR_ERROR); - while (name != NULL) { - xmlXPtrEvalXPtrPart(ctxt, name); - - /* in case of syntax error, break here */ - if (ctxt->error != XPATH_EXPRESSION_OK) - return; - - /* - * If the returned value is a non-empty nodeset - * or location set, return here. - */ - if (ctxt->value != NULL) { - xmlXPathObjectPtr obj = ctxt->value; - - switch (obj->type) { - case XPATH_LOCATIONSET: { - xmlLocationSetPtr loc = ctxt->value->user; - if ((loc != NULL) && (loc->locNr > 0)) - return; - break; - } - case XPATH_NODESET: { - xmlNodeSetPtr loc = ctxt->value->nodesetval; - if ((loc != NULL) && (loc->nodeNr > 0)) - return; - break; - } - default: - break; - } - - /* - * Evaluating to improper values is equivalent to - * a sub-resource error, clean-up the stack - */ - do { - obj = valuePop(ctxt); - if (obj != NULL) { - xmlXPathFreeObject(obj); - } - } while (obj != NULL); - } - - /* - * Is there another XPointer part. - */ - SKIP_BLANKS; - name = xmlXPathParseName(ctxt); - } -} - -/** - * xmlXPtrEvalChildSeq: - * @ctxt: the XPointer Parser context - * @name: a possible ID name of the child sequence - * - * ChildSeq ::= '/1' ('/' [0-9]*)* - * | Name ('/' [0-9]*)+ - * - * Parse and evaluate a Child Sequence. This routine also handle the - * case of a Bare Name used to get a document ID. - */ -static void -xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name) { - /* - * XPointer don't allow by syntax to address in mutirooted trees - * this might prove useful in some cases, warn about it. - */ - if ((name == NULL) && (CUR == '/') && (NXT(1) != '1')) { - xmlXPtrErr(ctxt, XML_XPTR_CHILDSEQ_START, - "warning: ChildSeq not starting by /1\n", NULL); - } - - if (name != NULL) { - valuePush(ctxt, xmlXPathNewString(name)); - xmlFree(name); - xmlXPathIdFunction(ctxt, 1); - CHECK_ERROR; - } - - while (CUR == '/') { - int child = 0; - NEXT; - - while ((CUR >= '0') && (CUR <= '9')) { - child = child * 10 + (CUR - '0'); - NEXT; - } - xmlXPtrGetChildNo(ctxt, child); - } -} - - -/** - * xmlXPtrEvalXPointer: - * @ctxt: the XPointer Parser context - * - * XPointer ::= Name - * | ChildSeq - * | FullXPtr - * - * Parse and evaluate an XPointer - */ -static void -xmlXPtrEvalXPointer(xmlXPathParserContextPtr ctxt) { - if (ctxt->valueTab == NULL) { - /* Allocate the value stack */ - ctxt->valueTab = (xmlXPathObjectPtr *) - xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); - if (ctxt->valueTab == NULL) { - xmlXPtrErrMemory("allocating evaluation context"); - return; - } - ctxt->valueNr = 0; - ctxt->valueMax = 10; - ctxt->value = NULL; - } - SKIP_BLANKS; - if (CUR == '/') { - xmlXPathRoot(ctxt); - xmlXPtrEvalChildSeq(ctxt, NULL); - } else { - xmlChar *name; - - name = xmlXPathParseName(ctxt); - if (name == NULL) - XP_ERROR(XPATH_EXPR_ERROR); - if (CUR == '(') { - xmlXPtrEvalFullXPtr(ctxt, name); - /* Short evaluation */ - return; - } else { - /* this handle both Bare Names and Child Sequences */ - xmlXPtrEvalChildSeq(ctxt, name); - } - } - SKIP_BLANKS; - if (CUR != 0) - XP_ERROR(XPATH_EXPR_ERROR); -} - - -/************************************************************************ - * * - * General routines * - * * - ************************************************************************/ - -void xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs); -void xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs); -void xmlXPtrEndPointFunction(xmlXPathParserContextPtr ctxt, int nargs); -void xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int nargs); -void xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, int nargs); -void xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs); -void xmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs); - -/** - * xmlXPtrNewContext: - * @doc: the XML document - * @here: the node that directly contains the XPointer being evaluated or NULL - * @origin: the element from which a user or program initiated traversal of - * the link, or NULL. - * - * Create a new XPointer context - * - * Returns the xmlXPathContext just allocated. - */ -xmlXPathContextPtr -xmlXPtrNewContext(xmlDocPtr doc, xmlNodePtr here, xmlNodePtr origin) { - xmlXPathContextPtr ret; - - ret = xmlXPathNewContext(doc); - if (ret == NULL) - return(ret); - ret->xptr = 1; - ret->here = here; - ret->origin = origin; - - xmlXPathRegisterFunc(ret, (xmlChar *)"range-to", - xmlXPtrRangeToFunction); - xmlXPathRegisterFunc(ret, (xmlChar *)"range", - xmlXPtrRangeFunction); - xmlXPathRegisterFunc(ret, (xmlChar *)"range-inside", - xmlXPtrRangeInsideFunction); - xmlXPathRegisterFunc(ret, (xmlChar *)"string-range", - xmlXPtrStringRangeFunction); - xmlXPathRegisterFunc(ret, (xmlChar *)"start-point", - xmlXPtrStartPointFunction); - xmlXPathRegisterFunc(ret, (xmlChar *)"end-point", - xmlXPtrEndPointFunction); - xmlXPathRegisterFunc(ret, (xmlChar *)"here", - xmlXPtrHereFunction); - xmlXPathRegisterFunc(ret, (xmlChar *)" origin", - xmlXPtrOriginFunction); - - return(ret); -} - -/** - * xmlXPtrEval: - * @str: the XPointer expression - * @ctx: the XPointer context - * - * Evaluate the XPath Location Path in the given context. - * - * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. - * the caller has to free the object. - */ -xmlXPathObjectPtr -xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) { - xmlXPathParserContextPtr ctxt; - xmlXPathObjectPtr res = NULL, tmp; - xmlXPathObjectPtr init = NULL; - int stack = 0; - - xmlXPathInit(); - - if ((ctx == NULL) || (str == NULL)) - return(NULL); - - ctxt = xmlXPathNewParserContext(str, ctx); - ctxt->xptr = 1; - xmlXPtrEvalXPointer(ctxt); - - if ((ctxt->value != NULL) && - (ctxt->value->type != XPATH_NODESET) && - (ctxt->value->type != XPATH_LOCATIONSET)) { - xmlXPtrErr(ctxt, XML_XPTR_EVAL_FAILED, - "xmlXPtrEval: evaluation failed to return a node set\n", - NULL); - } else { - res = valuePop(ctxt); - } - - do { - tmp = valuePop(ctxt); - if (tmp != NULL) { - if (tmp != init) { - if (tmp->type == XPATH_NODESET) { - /* - * Evaluation may push a root nodeset which is unused - */ - xmlNodeSetPtr set; - set = tmp->nodesetval; - if ((set->nodeNr != 1) || - (set->nodeTab[0] != (xmlNodePtr) ctx->doc)) - stack++; - } else - stack++; - } - xmlXPathFreeObject(tmp); - } - } while (tmp != NULL); - if (stack != 0) { - xmlXPtrErr(ctxt, XML_XPTR_EXTRA_OBJECTS, - "xmlXPtrEval: object(s) left on the eval stack\n", - NULL); - } - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeObject(res); - res = NULL; - } - - xmlXPathFreeParserContext(ctxt); - return(res); -} - -/** - * xmlXPtrBuildRangeNodeList: - * @range: a range object - * - * Build a node list tree copy of the range - * - * Returns an xmlNodePtr list or NULL. - * the caller has to free the node tree. - */ -static xmlNodePtr -xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { - /* pointers to generated nodes */ - xmlNodePtr list = NULL, last = NULL, parent = NULL, tmp; - /* pointers to traversal nodes */ - xmlNodePtr start, cur, end; - int index1, index2; - - if (range == NULL) - return(NULL); - if (range->type != XPATH_RANGE) - return(NULL); - start = (xmlNodePtr) range->user; - - if (start == NULL) - return(NULL); - end = range->user2; - if (end == NULL) - return(xmlCopyNode(start, 1)); - - cur = start; - index1 = range->index; - index2 = range->index2; - while (cur != NULL) { - if (cur == end) { - if (cur->type == XML_TEXT_NODE) { - const xmlChar *content = cur->content; - int len; - - if (content == NULL) { - tmp = xmlNewTextLen(NULL, 0); - } else { - len = index2; - if ((cur == start) && (index1 > 1)) { - content += (index1 - 1); - len -= (index1 - 1); - index1 = 0; - } else { - len = index2; - } - tmp = xmlNewTextLen(content, len); - } - /* single sub text node selection */ - if (list == NULL) - return(tmp); - /* prune and return full set */ - if (last != NULL) - xmlAddNextSibling(last, tmp); - else - xmlAddChild(parent, tmp); - return(list); - } else { - tmp = xmlCopyNode(cur, 0); - if (list == NULL) - list = tmp; - else { - if (last != NULL) - xmlAddNextSibling(last, tmp); - else - xmlAddChild(parent, tmp); - } - last = NULL; - parent = tmp; - - if (index2 > 1) { - end = xmlXPtrGetNthChild(cur, index2 - 1); - index2 = 0; - } - if ((cur == start) && (index1 > 1)) { - cur = xmlXPtrGetNthChild(cur, index1 - 1); - index1 = 0; - } else { - cur = cur->children; - } - /* - * Now gather the remaining nodes from cur to end - */ - continue; /* while */ - } - } else if ((cur == start) && - (list == NULL) /* looks superfluous but ... */ ) { - if ((cur->type == XML_TEXT_NODE) || - (cur->type == XML_CDATA_SECTION_NODE)) { - const xmlChar *content = cur->content; - - if (content == NULL) { - tmp = xmlNewTextLen(NULL, 0); - } else { - if (index1 > 1) { - content += (index1 - 1); - } - tmp = xmlNewText(content); - } - last = list = tmp; - } else { - if ((cur == start) && (index1 > 1)) { - tmp = xmlCopyNode(cur, 0); - list = tmp; - parent = tmp; - last = NULL; - cur = xmlXPtrGetNthChild(cur, index1 - 1); - index1 = 0; - /* - * Now gather the remaining nodes from cur to end - */ - continue; /* while */ - } - tmp = xmlCopyNode(cur, 1); - list = tmp; - parent = NULL; - last = tmp; - } - } else { - tmp = NULL; - switch (cur->type) { - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_NODE: - /* Do not copy DTD informations */ - break; - case XML_ENTITY_DECL: - TODO /* handle crossing entities -> stack needed */ - break; - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - /* don't consider it part of the tree content */ - break; - case XML_ATTRIBUTE_NODE: - /* Humm, should not happen ! */ - STRANGE - break; - default: - tmp = xmlCopyNode(cur, 1); - break; - } - if (tmp != NULL) { - if ((list == NULL) || ((last == NULL) && (parent == NULL))) { - STRANGE - return(NULL); - } - if (last != NULL) - xmlAddNextSibling(last, tmp); - else { - xmlAddChild(parent, tmp); - last = tmp; - } - } - } - /* - * Skip to next node in document order - */ - if ((list == NULL) || ((last == NULL) && (parent == NULL))) { - STRANGE - return(NULL); - } - cur = xmlXPtrAdvanceNode(cur, NULL); - } - return(list); -} - -/** - * xmlXPtrBuildNodeList: - * @obj: the XPointer result from the evaluation. - * - * Build a node list tree copy of the XPointer result. - * This will drop Attributes and Namespace declarations. - * - * Returns an xmlNodePtr list or NULL. - * the caller has to free the node tree. - */ -xmlNodePtr -xmlXPtrBuildNodeList(xmlXPathObjectPtr obj) { - xmlNodePtr list = NULL, last = NULL; - int i; - - if (obj == NULL) - return(NULL); - switch (obj->type) { - case XPATH_NODESET: { - xmlNodeSetPtr set = obj->nodesetval; - if (set == NULL) - return(NULL); - for (i = 0;i < set->nodeNr;i++) { - if (set->nodeTab[i] == NULL) - continue; - switch (set->nodeTab[i]->type) { - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ELEMENT_NODE: - case XML_ENTITY_REF_NODE: - case XML_ENTITY_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_HTML_DOCUMENT_NODE: -#ifdef LIBXML_DOCB_ENABLED - case XML_DOCB_DOCUMENT_NODE: -#endif - case XML_XINCLUDE_START: - case XML_XINCLUDE_END: - break; - case XML_ATTRIBUTE_NODE: - case XML_NAMESPACE_DECL: - case XML_DOCUMENT_TYPE_NODE: - case XML_DOCUMENT_FRAG_NODE: - case XML_NOTATION_NODE: - case XML_DTD_NODE: - case XML_ELEMENT_DECL: - case XML_ATTRIBUTE_DECL: - case XML_ENTITY_DECL: - continue; /* for */ - } - if (last == NULL) - list = last = xmlCopyNode(set->nodeTab[i], 1); - else { - xmlAddNextSibling(last, xmlCopyNode(set->nodeTab[i], 1)); - if (last->next != NULL) - last = last->next; - } - } - break; - } - case XPATH_LOCATIONSET: { - xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user; - if (set == NULL) - return(NULL); - for (i = 0;i < set->locNr;i++) { - if (last == NULL) - list = last = xmlXPtrBuildNodeList(set->locTab[i]); - else - xmlAddNextSibling(last, - xmlXPtrBuildNodeList(set->locTab[i])); - if (last != NULL) { - while (last->next != NULL) - last = last->next; - } - } - break; - } - case XPATH_RANGE: - return(xmlXPtrBuildRangeNodeList(obj)); - case XPATH_POINT: - return(xmlCopyNode(obj->user, 0)); - default: - break; - } - return(list); -} - -/************************************************************************ - * * - * XPointer functions * - * * - ************************************************************************/ - -/** - * xmlXPtrNbLocChildren: - * @node: an xmlNodePtr - * - * Count the number of location children of @node or the length of the - * string value in case of text/PI/Comments nodes - * - * Returns the number of location children - */ -static int -xmlXPtrNbLocChildren(xmlNodePtr node) { - int ret = 0; - if (node == NULL) - return(-1); - switch (node->type) { - case XML_HTML_DOCUMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_ELEMENT_NODE: - node = node->children; - while (node != NULL) { - if (node->type == XML_ELEMENT_NODE) - ret++; - node = node->next; - } - break; - case XML_ATTRIBUTE_NODE: - return(-1); - - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - ret = xmlStrlen(node->content); - break; - default: - return(-1); - } - return(ret); -} - -/** - * xmlXPtrHereFunction: - * @ctxt: the XPointer Parser context - * @nargs: the number of args - * - * Function implementing here() operation - * as described in 5.4.3 - */ -void -xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int nargs) { - CHECK_ARITY(0); - - if (ctxt->context->here == NULL) - XP_ERROR(XPTR_SYNTAX_ERROR); - - valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->here, NULL)); -} - -/** - * xmlXPtrOriginFunction: - * @ctxt: the XPointer Parser context - * @nargs: the number of args - * - * Function implementing origin() operation - * as described in 5.4.3 - */ -void -xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, int nargs) { - CHECK_ARITY(0); - - if (ctxt->context->origin == NULL) - XP_ERROR(XPTR_SYNTAX_ERROR); - - valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->origin, NULL)); -} - -/** - * xmlXPtrStartPointFunction: - * @ctxt: the XPointer Parser context - * @nargs: the number of args - * - * Function implementing start-point() operation - * as described in 5.4.3 - * ---------------- - * location-set start-point(location-set) - * - * For each location x in the argument location-set, start-point adds a - * location of type point to the result location-set. That point represents - * the start point of location x and is determined by the following rules: - * - * - If x is of type point, the start point is x. - * - If x is of type range, the start point is the start point of x. - * - If x is of type root, element, text, comment, or processing instruction, - * - the container node of the start point is x and the index is 0. - * - If x is of type attribute or namespace, the function must signal a - * syntax error. - * ---------------- - * - */ -void -xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr tmp, obj, point; - xmlLocationSetPtr newset = NULL; - xmlLocationSetPtr oldset = NULL; - - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_LOCATIONSET) && - (ctxt->value->type != XPATH_NODESET))) - XP_ERROR(XPATH_INVALID_TYPE) - - obj = valuePop(ctxt); - if (obj->type == XPATH_NODESET) { - /* - * First convert to a location set - */ - tmp = xmlXPtrNewLocationSetNodeSet(obj->nodesetval); - xmlXPathFreeObject(obj); - obj = tmp; - } - - newset = xmlXPtrLocationSetCreate(NULL); - if (newset == NULL) { - xmlXPathFreeObject(obj); - XP_ERROR(XPATH_MEMORY_ERROR); - } - oldset = (xmlLocationSetPtr) obj->user; - if (oldset != NULL) { - int i; - - for (i = 0; i < oldset->locNr; i++) { - tmp = oldset->locTab[i]; - if (tmp == NULL) - continue; - point = NULL; - switch (tmp->type) { - case XPATH_POINT: - point = xmlXPtrNewPoint(tmp->user, tmp->index); - break; - case XPATH_RANGE: { - xmlNodePtr node = tmp->user; - if (node != NULL) { - if (node->type == XML_ATTRIBUTE_NODE) { - /* TODO: Namespace Nodes ??? */ - xmlXPathFreeObject(obj); - xmlXPtrFreeLocationSet(newset); - XP_ERROR(XPTR_SYNTAX_ERROR); - } - point = xmlXPtrNewPoint(node, tmp->index); - } - break; - } - default: - /*** Should we raise an error ? - xmlXPathFreeObject(obj); - xmlXPathFreeObject(newset); - XP_ERROR(XPATH_INVALID_TYPE) - ***/ - break; - } - if (point != NULL) - xmlXPtrLocationSetAdd(newset, point); - } - } - xmlXPathFreeObject(obj); - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); -} - -/** - * xmlXPtrEndPointFunction: - * @ctxt: the XPointer Parser context - * @nargs: the number of args - * - * Function implementing end-point() operation - * as described in 5.4.3 - * ---------------------------- - * location-set end-point(location-set) - * - * For each location x in the argument location-set, end-point adds a - * location of type point to the result location-set. That point represents - * the end point of location x and is determined by the following rules: - * - * - If x is of type point, the resulting point is x. - * - If x is of type range, the resulting point is the end point of x. - * - If x is of type root or element, the container node of the resulting - * point is x and the index is the number of location children of x. - * - If x is of type text, comment, or processing instruction, the container - * node of the resulting point is x and the index is the length of the - * string-value of x. - * - If x is of type attribute or namespace, the function must signal a - * syntax error. - * ---------------------------- - */ -void -xmlXPtrEndPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr tmp, obj, point; - xmlLocationSetPtr newset = NULL; - xmlLocationSetPtr oldset = NULL; - - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_LOCATIONSET) && - (ctxt->value->type != XPATH_NODESET))) - XP_ERROR(XPATH_INVALID_TYPE) - - obj = valuePop(ctxt); - if (obj->type == XPATH_NODESET) { - /* - * First convert to a location set - */ - tmp = xmlXPtrNewLocationSetNodeSet(obj->nodesetval); - xmlXPathFreeObject(obj); - obj = tmp; - } - - newset = xmlXPtrLocationSetCreate(NULL); - oldset = (xmlLocationSetPtr) obj->user; - if (oldset != NULL) { - int i; - - for (i = 0; i < oldset->locNr; i++) { - tmp = oldset->locTab[i]; - if (tmp == NULL) - continue; - point = NULL; - switch (tmp->type) { - case XPATH_POINT: - point = xmlXPtrNewPoint(tmp->user, tmp->index); - break; - case XPATH_RANGE: { - xmlNodePtr node = tmp->user2; - if (node != NULL) { - if (node->type == XML_ATTRIBUTE_NODE) { - /* TODO: Namespace Nodes ??? */ - xmlXPathFreeObject(obj); - xmlXPtrFreeLocationSet(newset); - XP_ERROR(XPTR_SYNTAX_ERROR); - } - point = xmlXPtrNewPoint(node, tmp->index2); - } else if (tmp->user == NULL) { - point = xmlXPtrNewPoint(node, - xmlXPtrNbLocChildren(node)); - } - break; - } - default: - /*** Should we raise an error ? - xmlXPathFreeObject(obj); - xmlXPathFreeObject(newset); - XP_ERROR(XPATH_INVALID_TYPE) - ***/ - break; - } - if (point != NULL) - xmlXPtrLocationSetAdd(newset, point); - } - } - xmlXPathFreeObject(obj); - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); -} - - -/** - * xmlXPtrCoveringRange: - * @ctxt: the XPointer Parser context - * @loc: the location for which the covering range must be computed - * - * A covering range is a range that wholly encompasses a location - * Section 5.3.3. Covering Ranges for All Location Types - * http://www.w3.org/TR/xptr#N2267 - * - * Returns a new location or NULL in case of error - */ -static xmlXPathObjectPtr -xmlXPtrCoveringRange(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr loc) { - if (loc == NULL) - return(NULL); - if ((ctxt == NULL) || (ctxt->context == NULL) || - (ctxt->context->doc == NULL)) - return(NULL); - switch (loc->type) { - case XPATH_POINT: - return(xmlXPtrNewRange(loc->user, loc->index, - loc->user, loc->index)); - case XPATH_RANGE: - if (loc->user2 != NULL) { - return(xmlXPtrNewRange(loc->user, loc->index, - loc->user2, loc->index2)); - } else { - xmlNodePtr node = (xmlNodePtr) loc->user; - if (node == (xmlNodePtr) ctxt->context->doc) { - return(xmlXPtrNewRange(node, 0, node, - xmlXPtrGetArity(node))); - } else { - switch (node->type) { - case XML_ATTRIBUTE_NODE: - /* !!! our model is slightly different than XPath */ - return(xmlXPtrNewRange(node, 0, node, - xmlXPtrGetArity(node))); - case XML_ELEMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: - case XML_ENTITY_REF_NODE: - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_DOCUMENT_NODE: - case XML_NOTATION_NODE: - case XML_HTML_DOCUMENT_NODE: { - int indx = xmlXPtrGetIndex(node); - - node = node->parent; - return(xmlXPtrNewRange(node, indx - 1, - node, indx + 1)); - } - default: - return(NULL); - } - } - } - default: - TODO /* missed one case ??? */ - } - return(NULL); -} - -/** - * xmlXPtrRangeFunction: - * @ctxt: the XPointer Parser context - * @nargs: the number of args - * - * Function implementing the range() function 5.4.3 - * location-set range(location-set ) - * - * The range function returns ranges covering the locations in - * the argument location-set. For each location x in the argument - * location-set, a range location representing the covering range of - * x is added to the result location-set. - */ -void -xmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { - int i; - xmlXPathObjectPtr set; - xmlLocationSetPtr oldset; - xmlLocationSetPtr newset; - - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_LOCATIONSET) && - (ctxt->value->type != XPATH_NODESET))) - XP_ERROR(XPATH_INVALID_TYPE) - - set = valuePop(ctxt); - if (set->type == XPATH_NODESET) { - xmlXPathObjectPtr tmp; - - /* - * First convert to a location set - */ - tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); - xmlXPathFreeObject(set); - set = tmp; - } - oldset = (xmlLocationSetPtr) set->user; - - /* - * The loop is to compute the covering range for each item and add it - */ - newset = xmlXPtrLocationSetCreate(NULL); - for (i = 0;i < oldset->locNr;i++) { - xmlXPtrLocationSetAdd(newset, - xmlXPtrCoveringRange(ctxt, oldset->locTab[i])); - } - - /* - * Save the new value and cleanup - */ - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); - xmlXPathFreeObject(set); -} - -/** - * xmlXPtrInsideRange: - * @ctxt: the XPointer Parser context - * @loc: the location for which the inside range must be computed - * - * A inside range is a range described in the range-inside() description - * - * Returns a new location or NULL in case of error - */ -static xmlXPathObjectPtr -xmlXPtrInsideRange(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr loc) { - if (loc == NULL) - return(NULL); - if ((ctxt == NULL) || (ctxt->context == NULL) || - (ctxt->context->doc == NULL)) - return(NULL); - switch (loc->type) { - case XPATH_POINT: { - xmlNodePtr node = (xmlNodePtr) loc->user; - switch (node->type) { - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: { - if (node->content == NULL) { - return(xmlXPtrNewRange(node, 0, node, 0)); - } else { - return(xmlXPtrNewRange(node, 0, node, - xmlStrlen(node->content))); - } - } - case XML_ATTRIBUTE_NODE: - case XML_ELEMENT_NODE: - case XML_ENTITY_REF_NODE: - case XML_DOCUMENT_NODE: - case XML_NOTATION_NODE: - case XML_HTML_DOCUMENT_NODE: { - return(xmlXPtrNewRange(node, 0, node, - xmlXPtrGetArity(node))); - } - default: - break; - } - return(NULL); - } - case XPATH_RANGE: { - xmlNodePtr node = (xmlNodePtr) loc->user; - if (loc->user2 != NULL) { - return(xmlXPtrNewRange(node, loc->index, - loc->user2, loc->index2)); - } else { - switch (node->type) { - case XML_PI_NODE: - case XML_COMMENT_NODE: - case XML_TEXT_NODE: - case XML_CDATA_SECTION_NODE: { - if (node->content == NULL) { - return(xmlXPtrNewRange(node, 0, node, 0)); - } else { - return(xmlXPtrNewRange(node, 0, node, - xmlStrlen(node->content))); - } - } - case XML_ATTRIBUTE_NODE: - case XML_ELEMENT_NODE: - case XML_ENTITY_REF_NODE: - case XML_DOCUMENT_NODE: - case XML_NOTATION_NODE: - case XML_HTML_DOCUMENT_NODE: { - return(xmlXPtrNewRange(node, 0, node, - xmlXPtrGetArity(node))); - } - default: - break; - } - return(NULL); - } - } - default: - TODO /* missed one case ??? */ - } - return(NULL); -} - -/** - * xmlXPtrRangeInsideFunction: - * @ctxt: the XPointer Parser context - * @nargs: the number of args - * - * Function implementing the range-inside() function 5.4.3 - * location-set range-inside(location-set ) - * - * The range-inside function returns ranges covering the contents of - * the locations in the argument location-set. For each location x in - * the argument location-set, a range location is added to the result - * location-set. If x is a range location, then x is added to the - * result location-set. If x is not a range location, then x is used - * as the container location of the start and end points of the range - * location to be added; the index of the start point of the range is - * zero; if the end point is a character point then its index is the - * length of the string-value of x, and otherwise is the number of - * location children of x. - * - */ -void -xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) { - int i; - xmlXPathObjectPtr set; - xmlLocationSetPtr oldset; - xmlLocationSetPtr newset; - - CHECK_ARITY(1); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_LOCATIONSET) && - (ctxt->value->type != XPATH_NODESET))) - XP_ERROR(XPATH_INVALID_TYPE) - - set = valuePop(ctxt); - if (set->type == XPATH_NODESET) { - xmlXPathObjectPtr tmp; - - /* - * First convert to a location set - */ - tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); - xmlXPathFreeObject(set); - set = tmp; - } - oldset = (xmlLocationSetPtr) set->user; - - /* - * The loop is to compute the covering range for each item and add it - */ - newset = xmlXPtrLocationSetCreate(NULL); - for (i = 0;i < oldset->locNr;i++) { - xmlXPtrLocationSetAdd(newset, - xmlXPtrInsideRange(ctxt, oldset->locTab[i])); - } - - /* - * Save the new value and cleanup - */ - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); - xmlXPathFreeObject(set); -} - -/** - * xmlXPtrRangeToFunction: - * @ctxt: the XPointer Parser context - * @nargs: the number of args - * - * Implement the range-to() XPointer function - */ -void -xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) { - xmlXPathObjectPtr range; - const xmlChar *cur; - xmlXPathObjectPtr res, obj; - xmlXPathObjectPtr tmp; - xmlLocationSetPtr newset = NULL; - xmlNodeSetPtr oldset; - int i; - - if (ctxt == NULL) return; - CHECK_ARITY(1); - /* - * Save the expression pointer since we will have to evaluate - * it multiple times. Initialize the new set. - */ - CHECK_TYPE(XPATH_NODESET); - obj = valuePop(ctxt); - oldset = obj->nodesetval; - ctxt->context->node = NULL; - - cur = ctxt->cur; - newset = xmlXPtrLocationSetCreate(NULL); - - for (i = 0; i < oldset->nodeNr; i++) { - ctxt->cur = cur; - - /* - * Run the evaluation with a node list made of a single item - * in the nodeset. - */ - ctxt->context->node = oldset->nodeTab[i]; - tmp = xmlXPathNewNodeSet(ctxt->context->node); - valuePush(ctxt, tmp); - - xmlXPathEvalExpr(ctxt); - CHECK_ERROR; - - /* - * The result of the evaluation need to be tested to - * decided whether the filter succeeded or not - */ - res = valuePop(ctxt); - range = xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], res); - if (range != NULL) { - xmlXPtrLocationSetAdd(newset, range); - } - - /* - * Cleanup - */ - if (res != NULL) - xmlXPathFreeObject(res); - if (ctxt->value == tmp) { - res = valuePop(ctxt); - xmlXPathFreeObject(res); - } - - ctxt->context->node = NULL; - } - - /* - * The result is used as the new evaluation set. - */ - xmlXPathFreeObject(obj); - ctxt->context->node = NULL; - ctxt->context->contextSize = -1; - ctxt->context->proximityPosition = -1; - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); -} - -/** - * xmlXPtrAdvanceNode: - * @cur: the node - * @level: incremented/decremented to show level in tree - * - * Advance to the next element or text node in document order - * TODO: add a stack for entering/exiting entities - * - * Returns -1 in case of failure, 0 otherwise - */ -xmlNodePtr -xmlXPtrAdvanceNode(xmlNodePtr cur, int *level) { -next: - if (cur == NULL) - return(NULL); - if (cur->children != NULL) { - cur = cur->children ; - if (level != NULL) - (*level)++; - goto found; - } -skip: /* This label should only be needed if something is wrong! */ - if (cur->next != NULL) { - cur = cur->next; - goto found; - } - do { - cur = cur->parent; - if (level != NULL) - (*level)--; - if (cur == NULL) return(NULL); - if (cur->next != NULL) { - cur = cur->next; - goto found; - } - } while (cur != NULL); - -found: - if ((cur->type != XML_ELEMENT_NODE) && - (cur->type != XML_TEXT_NODE) && - (cur->type != XML_DOCUMENT_NODE) && - (cur->type != XML_HTML_DOCUMENT_NODE) && - (cur->type != XML_CDATA_SECTION_NODE)) { - if (cur->type == XML_ENTITY_REF_NODE) { /* Shouldn't happen */ - TODO - goto skip; - } - goto next; - } - return(cur); -} - -/** - * xmlXPtrAdvanceChar: - * @node: the node - * @indx: the indx - * @bytes: the number of bytes - * - * Advance a point of the associated number of bytes (not UTF8 chars) - * - * Returns -1 in case of failure, 0 otherwise - */ -static int -xmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int bytes) { - xmlNodePtr cur; - int pos; - int len; - - if ((node == NULL) || (indx == NULL)) - return(-1); - cur = *node; - if (cur == NULL) - return(-1); - pos = *indx; - - while (bytes >= 0) { - /* - * First position to the beginning of the first text node - * corresponding to this point - */ - while ((cur != NULL) && - ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE))) { - if (pos > 0) { - cur = xmlXPtrGetNthChild(cur, pos); - pos = 0; - } else { - cur = xmlXPtrAdvanceNode(cur, NULL); - pos = 0; - } - } - - if (cur == NULL) { - *node = NULL; - *indx = 0; - return(-1); - } - - /* - * if there is no move needed return the current value. - */ - if (pos == 0) pos = 1; - if (bytes == 0) { - *node = cur; - *indx = pos; - return(0); - } - /* - * We should have a text (or cdata) node ... - */ - len = 0; - if ((cur->type != XML_ELEMENT_NODE) && - (cur->content != NULL)) { - len = xmlStrlen(cur->content); - } - if (pos > len) { - /* Strange, the indx in the text node is greater than it's len */ - STRANGE - pos = len; - } - if (pos + bytes >= len) { - bytes -= (len - pos); - cur = xmlXPtrAdvanceNode(cur, NULL); - pos = 0; - } else if (pos + bytes < len) { - pos += bytes; - *node = cur; - *indx = pos; - return(0); - } - } - return(-1); -} - -/** - * xmlXPtrMatchString: - * @string: the string to search - * @start: the start textnode - * @startindex: the start index - * @end: the end textnode IN/OUT - * @endindex: the end index IN/OUT - * - * Check whether the document contains @string at the position - * (@start, @startindex) and limited by the (@end, @endindex) point - * - * Returns -1 in case of failure, 0 if not found, 1 if found in which case - * (@start, @startindex) will indicate the position of the beginning - * of the range and (@end, @endindex) will indicate the end - * of the range - */ -static int -xmlXPtrMatchString(const xmlChar *string, xmlNodePtr start, int startindex, - xmlNodePtr *end, int *endindex) { - xmlNodePtr cur; - int pos; /* 0 based */ - int len; /* in bytes */ - int stringlen; /* in bytes */ - int match; - - if (string == NULL) - return(-1); - if (start == NULL) - return(-1); - if ((end == NULL) || (endindex == NULL)) - return(-1); - cur = start; - if (cur == NULL) - return(-1); - pos = startindex - 1; - stringlen = xmlStrlen(string); - - while (stringlen > 0) { - if ((cur == *end) && (pos + stringlen > *endindex)) - return(0); - - if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { - len = xmlStrlen(cur->content); - if (len >= pos + stringlen) { - match = (!xmlStrncmp(&cur->content[pos], string, stringlen)); - if (match) { -#ifdef DEBUG_RANGES - xmlGenericError(xmlGenericErrorContext, - "found range %d bytes at index %d of ->", - stringlen, pos + 1); - xmlDebugDumpString(stdout, cur->content); - xmlGenericError(xmlGenericErrorContext, "\n"); -#endif - *end = cur; - *endindex = pos + stringlen; - return(1); - } else { - return(0); - } - } else { - int sub = len - pos; - match = (!xmlStrncmp(&cur->content[pos], string, sub)); - if (match) { -#ifdef DEBUG_RANGES - xmlGenericError(xmlGenericErrorContext, - "found subrange %d bytes at index %d of ->", - sub, pos + 1); - xmlDebugDumpString(stdout, cur->content); - xmlGenericError(xmlGenericErrorContext, "\n"); -#endif - string = &string[sub]; - stringlen -= sub; - } else { - return(0); - } - } - } - cur = xmlXPtrAdvanceNode(cur, NULL); - if (cur == NULL) - return(0); - pos = 0; - } - return(1); -} - -/** - * xmlXPtrSearchString: - * @string: the string to search - * @start: the start textnode IN/OUT - * @startindex: the start index IN/OUT - * @end: the end textnode - * @endindex: the end index - * - * Search the next occurrence of @string within the document content - * until the (@end, @endindex) point is reached - * - * Returns -1 in case of failure, 0 if not found, 1 if found in which case - * (@start, @startindex) will indicate the position of the beginning - * of the range and (@end, @endindex) will indicate the end - * of the range - */ -static int -xmlXPtrSearchString(const xmlChar *string, xmlNodePtr *start, int *startindex, - xmlNodePtr *end, int *endindex) { - xmlNodePtr cur; - const xmlChar *str; - int pos; /* 0 based */ - int len; /* in bytes */ - xmlChar first; - - if (string == NULL) - return(-1); - if ((start == NULL) || (startindex == NULL)) - return(-1); - if ((end == NULL) || (endindex == NULL)) - return(-1); - cur = *start; - if (cur == NULL) - return(-1); - pos = *startindex - 1; - first = string[0]; - - while (cur != NULL) { - if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { - len = xmlStrlen(cur->content); - while (pos <= len) { - if (first != 0) { - str = xmlStrchr(&cur->content[pos], first); - if (str != NULL) { - pos = (str - (xmlChar *)(cur->content)); -#ifdef DEBUG_RANGES - xmlGenericError(xmlGenericErrorContext, - "found '%c' at index %d of ->", - first, pos + 1); - xmlDebugDumpString(stdout, cur->content); - xmlGenericError(xmlGenericErrorContext, "\n"); -#endif - if (xmlXPtrMatchString(string, cur, pos + 1, - end, endindex)) { - *start = cur; - *startindex = pos + 1; - return(1); - } - pos++; - } else { - pos = len + 1; - } - } else { - /* - * An empty string is considered to match before each - * character of the string-value and after the final - * character. - */ -#ifdef DEBUG_RANGES - xmlGenericError(xmlGenericErrorContext, - "found '' at index %d of ->", - pos + 1); - xmlDebugDumpString(stdout, cur->content); - xmlGenericError(xmlGenericErrorContext, "\n"); -#endif - *start = cur; - *startindex = pos + 1; - *end = cur; - *endindex = pos + 1; - return(1); - } - } - } - if ((cur == *end) && (pos >= *endindex)) - return(0); - cur = xmlXPtrAdvanceNode(cur, NULL); - if (cur == NULL) - return(0); - pos = 1; - } - return(0); -} - -/** - * xmlXPtrGetLastChar: - * @node: the node - * @index: the index - * - * Computes the point coordinates of the last char of this point - * - * Returns -1 in case of failure, 0 otherwise - */ -static int -xmlXPtrGetLastChar(xmlNodePtr *node, int *indx) { - xmlNodePtr cur; - int pos, len = 0; - - if ((node == NULL) || (indx == NULL)) - return(-1); - cur = *node; - pos = *indx; - - if (cur == NULL) - return(-1); - - if ((cur->type == XML_ELEMENT_NODE) || - (cur->type == XML_DOCUMENT_NODE) || - (cur->type == XML_HTML_DOCUMENT_NODE)) { - if (pos > 0) { - cur = xmlXPtrGetNthChild(cur, pos); - pos = 0; - } - } - while (cur != NULL) { - if (cur->last != NULL) - cur = cur->last; - else if ((cur->type != XML_ELEMENT_NODE) && - (cur->content != NULL)) { - len = xmlStrlen(cur->content); - break; - } else { - return(-1); - } - } - if (cur == NULL) - return(-1); - *node = cur; - *indx = len; - return(0); -} - -/** - * xmlXPtrGetStartPoint: - * @obj: an range - * @node: the resulting node - * @indx: the resulting index - * - * read the object and return the start point coordinates. - * - * Returns -1 in case of failure, 0 otherwise - */ -static int -xmlXPtrGetStartPoint(xmlXPathObjectPtr obj, xmlNodePtr *node, int *indx) { - if ((obj == NULL) || (node == NULL) || (indx == NULL)) - return(-1); - - switch (obj->type) { - case XPATH_POINT: - *node = obj->user; - if (obj->index <= 0) - *indx = 0; - else - *indx = obj->index; - return(0); - case XPATH_RANGE: - *node = obj->user; - if (obj->index <= 0) - *indx = 0; - else - *indx = obj->index; - return(0); - default: - break; - } - return(-1); -} - -/** - * xmlXPtrGetEndPoint: - * @obj: an range - * @node: the resulting node - * @indx: the resulting indx - * - * read the object and return the end point coordinates. - * - * Returns -1 in case of failure, 0 otherwise - */ -static int -xmlXPtrGetEndPoint(xmlXPathObjectPtr obj, xmlNodePtr *node, int *indx) { - if ((obj == NULL) || (node == NULL) || (indx == NULL)) - return(-1); - - switch (obj->type) { - case XPATH_POINT: - *node = obj->user; - if (obj->index <= 0) - *indx = 0; - else - *indx = obj->index; - return(0); - case XPATH_RANGE: - *node = obj->user; - if (obj->index <= 0) - *indx = 0; - else - *indx = obj->index; - return(0); - default: - break; - } - return(-1); -} - -/** - * xmlXPtrStringRangeFunction: - * @ctxt: the XPointer Parser context - * @nargs: the number of args - * - * Function implementing the string-range() function - * range as described in 5.4.2 - * - * ------------------------------ - * [Definition: For each location in the location-set argument, - * string-range returns a set of string ranges, a set of substrings in a - * string. Specifically, the string-value of the location is searched for - * substrings that match the string argument, and the resulting location-set - * will contain a range location for each non-overlapping match.] - * An empty string is considered to match before each character of the - * string-value and after the final character. Whitespace in a string - * is matched literally, with no normalization except that provided by - * XML for line ends. The third argument gives the position of the first - * character to be in the resulting range, relative to the start of the - * match. The default value is 1, which makes the range start immediately - * before the first character of the matched string. The fourth argument - * gives the number of characters in the range; the default is that the - * range extends to the end of the matched string. - * - * Element boundaries, as well as entire embedded nodes such as processing - * instructions and comments, are ignored as defined in [XPath]. - * - * If the string in the second argument is not found in the string-value - * of the location, or if a value in the third or fourth argument indicates - * a string that is beyond the beginning or end of the document, the - * expression fails. - * - * The points of the range-locations in the returned location-set will - * all be character points. - * ------------------------------ - */ -void -xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { - int i, startindex, endindex = 0, fendindex; - xmlNodePtr start, end = 0, fend; - xmlXPathObjectPtr set; - xmlLocationSetPtr oldset; - xmlLocationSetPtr newset; - xmlXPathObjectPtr string; - xmlXPathObjectPtr position = NULL; - xmlXPathObjectPtr number = NULL; - int found, pos = 0, num = 0; - - /* - * Grab the arguments - */ - if ((nargs < 2) || (nargs > 4)) - XP_ERROR(XPATH_INVALID_ARITY); - - if (nargs >= 4) { - CHECK_TYPE(XPATH_NUMBER); - number = valuePop(ctxt); - if (number != NULL) - num = (int) number->floatval; - } - if (nargs >= 3) { - CHECK_TYPE(XPATH_NUMBER); - position = valuePop(ctxt); - if (position != NULL) - pos = (int) position->floatval; - } - CHECK_TYPE(XPATH_STRING); - string = valuePop(ctxt); - if ((ctxt->value == NULL) || - ((ctxt->value->type != XPATH_LOCATIONSET) && - (ctxt->value->type != XPATH_NODESET))) - XP_ERROR(XPATH_INVALID_TYPE) - - set = valuePop(ctxt); - newset = xmlXPtrLocationSetCreate(NULL); - if (set->nodesetval == NULL) { - goto error; - } - if (set->type == XPATH_NODESET) { - xmlXPathObjectPtr tmp; - - /* - * First convert to a location set - */ - tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); - xmlXPathFreeObject(set); - set = tmp; - } - oldset = (xmlLocationSetPtr) set->user; - - /* - * The loop is to search for each element in the location set - * the list of location set corresponding to that search - */ - for (i = 0;i < oldset->locNr;i++) { -#ifdef DEBUG_RANGES - xmlXPathDebugDumpObject(stdout, oldset->locTab[i], 0); -#endif - - xmlXPtrGetStartPoint(oldset->locTab[i], &start, &startindex); - xmlXPtrGetEndPoint(oldset->locTab[i], &end, &endindex); - xmlXPtrAdvanceChar(&start, &startindex, 0); - xmlXPtrGetLastChar(&end, &endindex); - -#ifdef DEBUG_RANGES - xmlGenericError(xmlGenericErrorContext, - "from index %d of ->", startindex); - xmlDebugDumpString(stdout, start->content); - xmlGenericError(xmlGenericErrorContext, "\n"); - xmlGenericError(xmlGenericErrorContext, - "to index %d of ->", endindex); - xmlDebugDumpString(stdout, end->content); - xmlGenericError(xmlGenericErrorContext, "\n"); -#endif - do { - fend = end; - fendindex = endindex; - found = xmlXPtrSearchString(string->stringval, &start, &startindex, - &fend, &fendindex); - if (found == 1) { - if (position == NULL) { - xmlXPtrLocationSetAdd(newset, - xmlXPtrNewRange(start, startindex, fend, fendindex)); - } else if (xmlXPtrAdvanceChar(&start, &startindex, - pos - 1) == 0) { - if ((number != NULL) && (num > 0)) { - int rindx; - xmlNodePtr rend; - rend = start; - rindx = startindex - 1; - if (xmlXPtrAdvanceChar(&rend, &rindx, - num) == 0) { - xmlXPtrLocationSetAdd(newset, - xmlXPtrNewRange(start, startindex, - rend, rindx)); - } - } else if ((number != NULL) && (num <= 0)) { - xmlXPtrLocationSetAdd(newset, - xmlXPtrNewRange(start, startindex, - start, startindex)); - } else { - xmlXPtrLocationSetAdd(newset, - xmlXPtrNewRange(start, startindex, - fend, fendindex)); - } - } - start = fend; - startindex = fendindex; - if (string->stringval[0] == 0) - startindex++; - } - } while (found == 1); - } - - /* - * Save the new value and cleanup - */ -error: - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); - xmlXPathFreeObject(set); - xmlXPathFreeObject(string); - if (position) xmlXPathFreeObject(position); - if (number) xmlXPathFreeObject(number); -} - -/** - * xmlXPtrEvalRangePredicate: - * @ctxt: the XPointer Parser context - * - * [8] Predicate ::= '[' PredicateExpr ']' - * [9] PredicateExpr ::= Expr - * - * Evaluate a predicate as in xmlXPathEvalPredicate() but for - * a Location Set instead of a node set - */ -void -xmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctxt) { - const xmlChar *cur; - xmlXPathObjectPtr res; - xmlXPathObjectPtr obj, tmp; - xmlLocationSetPtr newset = NULL; - xmlLocationSetPtr oldset; - int i; - - if (ctxt == NULL) return; - - SKIP_BLANKS; - if (CUR != '[') { - XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); - } - NEXT; - SKIP_BLANKS; - - /* - * Extract the old set, and then evaluate the result of the - * expression for all the element in the set. use it to grow - * up a new set. - */ - CHECK_TYPE(XPATH_LOCATIONSET); - obj = valuePop(ctxt); - oldset = obj->user; - ctxt->context->node = NULL; - - if ((oldset == NULL) || (oldset->locNr == 0)) { - ctxt->context->contextSize = 0; - ctxt->context->proximityPosition = 0; - xmlXPathEvalExpr(ctxt); - res = valuePop(ctxt); - if (res != NULL) - xmlXPathFreeObject(res); - valuePush(ctxt, obj); - CHECK_ERROR; - } else { - /* - * Save the expression pointer since we will have to evaluate - * it multiple times. Initialize the new set. - */ - cur = ctxt->cur; - newset = xmlXPtrLocationSetCreate(NULL); - - for (i = 0; i < oldset->locNr; i++) { - ctxt->cur = cur; - - /* - * Run the evaluation with a node list made of a single item - * in the nodeset. - */ - ctxt->context->node = oldset->locTab[i]->user; - tmp = xmlXPathNewNodeSet(ctxt->context->node); - valuePush(ctxt, tmp); - ctxt->context->contextSize = oldset->locNr; - ctxt->context->proximityPosition = i + 1; - - xmlXPathEvalExpr(ctxt); - CHECK_ERROR; - - /* - * The result of the evaluation need to be tested to - * decided whether the filter succeeded or not - */ - res = valuePop(ctxt); - if (xmlXPathEvaluatePredicateResult(ctxt, res)) { - xmlXPtrLocationSetAdd(newset, - xmlXPathObjectCopy(oldset->locTab[i])); - } - - /* - * Cleanup - */ - if (res != NULL) - xmlXPathFreeObject(res); - if (ctxt->value == tmp) { - res = valuePop(ctxt); - xmlXPathFreeObject(res); - } - - ctxt->context->node = NULL; - } - - /* - * The result is used as the new evaluation set. - */ - xmlXPathFreeObject(obj); - ctxt->context->node = NULL; - ctxt->context->contextSize = -1; - ctxt->context->proximityPosition = -1; - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); - } - if (CUR != ']') { - XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); - } - - NEXT; - SKIP_BLANKS; -} - -#define bottom_xpointer -#include "elfgcchack.h" -#endif - -- GitLab