diff --git a/.appveyor.yml b/.appveyor.yml index efd72a9d..8f85e140 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,8 +1,8 @@ -version: '{build}' +version: "{build}" os: Visual Studio 2015 cache: -- vcpkg -> .appveyor.yml + - vcpkg -> .appveyor.yml platform: - x64 @@ -12,15 +12,16 @@ configuration: environment: matrix: - - STATIC: OFF - - STATIC: ON - + - STATIC: OFF + - STATIC: ON + matrix: fast_finish: true init: [] before_build: + - git submodule update --init --recursive - mkdir build - cd build - cmake -G "Visual Studio 14 2015" -D CMAKE_GENERATOR_PLATFORM=%platform% -D STATIC=%STATIC% -D SAMPLES=ON -D BENCHMARKS=ON .. diff --git a/.circleci/config.yml b/.circleci/config.yml index 3319b667..fa2b3186 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,25 +25,26 @@ jobs: type: string steps: - checkout + - run: git submodule update --init --recursive - run: cmake -D XLNT_CXX_LANG=<< parameters.cxx-ver >> -D STATIC=<< parameters.static >> -D BENCHMARKS=<< parameters.benchmarks >> -D SAMPLES=<< parameters.samples >> -D COVERAGE=<< parameters.coverage >> -D CMAKE_BUILD_TYPE=<< parameters.build-type >> . - run: cmake --build . -- -j2 - run: ./tests/xlnt.test - when: condition: - equal: [ "ON", << parameters.samples >> ] + equal: ["ON", << parameters.samples >>] steps: - run: ./samples/sample-decrypt - run: ./samples/sample-img2xlsx ./samples/data/penguin.jpg img.xlsx - run: ./samples/sample-documentation - when: condition: - equal: [ "ON", << parameters.benchmarks >> ] + equal: ["ON", << parameters.benchmarks >>] steps: - run: ./benchmarks/benchmark-styles - run: ./benchmarks/benchmark-writer - when: condition: - equal: [ "ON", << parameters.coverage >> ] + equal: ["ON", << parameters.coverage >>] steps: - run: lcov --directory source/CMakeFiles/xlnt.dir --capture --output-file coverage.info --base-directory ../source --no-external --gcov-tool /usr/bin/gcov-6 - run: lcov --output-file coverage.info --remove coverage.info source/detail/serialization/miniz.cpp diff --git a/.gitmodules b/.gitmodules index e69de29b..0612ce37 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "third-party/libstudxml"] + path = third-party/libstudxml + url = https://git.codesynthesis.com/libstudxml/libstudxml.git diff --git a/include/xlnt/utils/numeric.hpp b/include/xlnt/utils/numeric.hpp index 1f6c182a..1d401c79 100644 --- a/include/xlnt/utils/numeric.hpp +++ b/include/xlnt/utils/numeric.hpp @@ -32,6 +32,9 @@ #include #include +#undef min +#undef max + namespace xlnt { namespace detail { diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 1ed7f9a2..2d092e11 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -18,7 +18,7 @@ set(XLNT_SOURCE_DIR ${XLNT_ROOT_DIR}/source) set(THIRD_PARTY_DIR ${XLNT_ROOT_DIR}/third-party) # Include libstudxml library -add_subdirectory(${THIRD_PARTY_DIR}/libstudxml +add_subdirectory(${THIRD_PARTY_DIR}/libstudxml.build ${CMAKE_CURRENT_BINARY_DIR}/third-party/libstudxml) if(COVERAGE) diff --git a/source/detail/external/include_libstudxml.hpp b/source/detail/external/include_libstudxml.hpp index e4b9ba4d..fa7dfb34 100644 --- a/source/detail/external/include_libstudxml.hpp +++ b/source/detail/external/include_libstudxml.hpp @@ -26,6 +26,7 @@ #pragma clang diagnostic ignored "-Wweak-vtables" #pragma clang diagnostic ignored "-Wextra-semi" #pragma clang diagnostic ignored "-Wdeprecated" +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #include #include #include diff --git a/source/detail/serialization/xlsx_consumer.cpp b/source/detail/serialization/xlsx_consumer.cpp index a27eb985..b13a7dde 100644 --- a/source/detail/serialization/xlsx_consumer.cpp +++ b/source/detail/serialization/xlsx_consumer.cpp @@ -3180,6 +3180,12 @@ rich_text xlsx_consumer::read_rich_text(const xml::qname &parent) run.second.get().underline(font::underline_style::single); } } + else if (current_run_property_element == xml::qname(xmlns, "strike")) + { + run.second.get().strikethrough(parser().attribute_present("val") + ? is_true(parser().attribute("val")) + : true); + } else { unexpected_element(current_run_property_element); diff --git a/source/utils/date.cpp b/source/utils/date.cpp index 96afc161..90e87b23 100644 --- a/source/utils/date.cpp +++ b/source/utils/date.cpp @@ -126,11 +126,10 @@ date date::today() int date::weekday() const { -#ifndef _MSC_VER - std::tm tm{0, 0, 0, day, month - 1, year - 1900, 0, 0, 0, 0, nullptr}; -#else - std::tm tm{0, 0, 0, day, month - 1, year - 1900, 0, 0, 0}; -#endif + std::tm tm{0}; + tm.tm_mday = day; + tm.tm_mon = month - 1; + tm.tm_year = year - 1900; std::time_t time = std::mktime(&tm); return safe_localtime(time).tm_wday; diff --git a/tests/data/excel_test_sheet.xlsx b/tests/data/excel_test_sheet.xlsx new file mode 100644 index 00000000..c6ad039b Binary files /dev/null and b/tests/data/excel_test_sheet.xlsx differ diff --git a/tests/workbook/serialization_test_suite.cpp b/tests/workbook/serialization_test_suite.cpp index fb4fc377..bac47b51 100644 --- a/tests/workbook/serialization_test_suite.cpp +++ b/tests/workbook/serialization_test_suite.cpp @@ -95,6 +95,7 @@ public: register_test(test_Issue445_inline_str_streaming_read); register_test(test_Issue492_stream_empty_row); register_test(test_Issue503_external_link_load); + register_test(test_formatting); } bool workbook_matches_file(xlnt::workbook &wb, const xlnt::path &file) @@ -764,6 +765,45 @@ public: auto cell = ws.cell("A1"); xlnt_assert_equals(cell.value(), std::string("WDG_IC_00000003.aut")); } + + void test_formatting() + { + xlnt::workbook wb; + wb.load(path_helper::test_file("excel_test_sheet.xlsx")); + auto ws = wb.active_sheet(); + auto cell = ws.cell("A1"); + + xlnt_assert_equals(cell.value(), std::string("Bolder Text mixed with normal \ntext first line Bold And Underline")); + + auto rt = cell.value(); + xlnt_assert_equals(rt.runs().size(), 12); + + auto assert_run = [](xlnt::rich_text_run run, std::string text, std::string typeface, xlnt::color color, std::size_t size, bool bold, bool strike, xlnt::font::underline_style underline) + { + xlnt_assert_equals(run.first, text); + xlnt_assert(run.second.is_set()); + auto font = run.second.get(); + xlnt_assert_equals(font.name(), typeface); + xlnt_assert_equals(font.size(), size); + xlnt_assert_equals(font.bold(), bold); + xlnt_assert_equals(font.color(), color); + xlnt_assert_equals(font.strikethrough(), strike); + xlnt_assert_equals(font.underline(), underline); + }; + + assert_run(rt.runs()[0], "Bolder", "Calibri (Body)", xlnt::theme_color(1), 12, true, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[1], " Text ", "Calibri", xlnt::theme_color(1), 12, true, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[2], "mixed ", "Calibri", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[3], "wit", "Calibri (Body)", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::single); + assert_run(rt.runs()[4], "h", "Calibri", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::single); + assert_run(rt.runs()[5], " ", "Calibri", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[6], "normal", "Calibri (Body)", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[7], " ", "Calibri", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[8], "\n", "Calibri", xlnt::theme_color(1), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[9], "text", "Helvetica Neue", xlnt::theme_color(1), 12, false, true, xlnt::font::underline_style::none); + assert_run(rt.runs()[10], " first line ", "Calibri", xlnt::theme_color(1), 12, true, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[11], "Bold And Underline", "Calibri (Body)", xlnt::theme_color(1), 12, true, false, xlnt::font::underline_style::single); + } }; static serialization_test_suite x; diff --git a/third-party/libstudxml b/third-party/libstudxml new file mode 160000 index 00000000..e729667b --- /dev/null +++ b/third-party/libstudxml @@ -0,0 +1 @@ +Subproject commit e729667b0f34a39ce4a61339843af4154648667b diff --git a/third-party/libstudxml/CMakeLists.txt b/third-party/libstudxml.build/CMakeLists.txt similarity index 95% rename from third-party/libstudxml/CMakeLists.txt rename to third-party/libstudxml.build/CMakeLists.txt index 8504e492..3e2232ba 100644 --- a/third-party/libstudxml/CMakeLists.txt +++ b/third-party/libstudxml.build/CMakeLists.txt @@ -5,8 +5,8 @@ project(libstudxml) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(LIBSTUDXML_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(LIBSTUDXML_INCLUDE_DIR ${LIBSTUDXML_ROOT_DIR}) +set(LIBSTUDXML_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libstudxml) +set(LIBSTUDXML_INCLUDE_DIR ${LIBSTUDXML_ROOT_DIR}/../libstudxml) if(STATIC_CRT) include(${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/ucm.cmake) diff --git a/third-party/libstudxml/LICENSE b/third-party/libstudxml/LICENSE deleted file mode 100644 index 94be864c..00000000 --- a/third-party/libstudxml/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Summary: Everything is licensed under the MIT License (text below). - -Code found in the xml/details/expat/ directory is distributed under -the MIT License (see the xml/details/expat/LICENSE file for copyright -information). - -Code found in the xml/details/genx/ directory is distributed under -the MIT License (see the xml/details/genx/LICENSE file for copyright -information). - -The rest is Copyright (c) 2013-2019 Code Synthesis Tools CC and is -distributed under the MIT License: - -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 furnished 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, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/third-party/libstudxml/libstudxml/buildfile b/third-party/libstudxml/libstudxml/buildfile deleted file mode 100644 index cc5a1ca8..00000000 --- a/third-party/libstudxml/libstudxml/buildfile +++ /dev/null @@ -1,82 +0,0 @@ -# file : libstudxml/buildfile -# copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -# license : MIT; see accompanying LICENSE file - -lib{studxml}: {hxx ixx txx cxx}{** -version} {hxx}{version} \ - details/{h}{config*} - -# Expat. Note that we treat a whole bunch of its sources as files since they -# are private and #include's (including .c file). -# -lib{studxml}: details/expat/{ \ - h{expat expat_external} \ - c{xmlparse xmlrole xmltok} \ -file{ascii.h asciitab.h config.h iasciitab.h internal.h latin1tab.h nametab.h \ - utf8tab.h xmlrole.h xmltok.h xmltok_impl.h xmltok_impl.c xmltok_ns.c} \ - doc{LICENSE README} \ -} - -details/expat/doc{README}@./: install = false -details/expat/doc{LICENSE}@./: install = doc/EXPAT-LICENSE - -# Genx. -# -lib{studxml}: details/genx/{h{*} c{*} doc{LICENSE README}} - -# Include the generated version header into the distribution (so that we don't -# pick up an installed one) and don't remove it when cleaning in src (so that -# clean results in a state identical to distributed). -# -hxx{version}: in{version} $src_root/manifest -hxx{version}: -{ - dist = true - clean = ($src_root != $out_root) -} - -# Build options. -# -if ($c.class == 'gcc') -{ - # Disable warnings that pop up with -Wextra (e.g, -fimplicit-fallthrough) - # in C implementation details. - # - details/expat/ c.coptions += -Wno-extra - details/genx/ c.coptions += -Wno-extra -} - -# We are a mixed C/C++ library, though C is implementation-only, kind of: we -# need headers but not symbols. -# -cc.poptions =+ "-I$out_root" "-I$src_root" - -obja{*}: cc.poptions += -DLIBSTUDXML_STATIC_BUILD -objs{*}: cc.poptions += -DLIBSTUDXML_SHARED_BUILD - -# Export options. -# -lib{studxml}: cc.export.poptions = "-I$out_root" "-I$src_root" - -liba{studxml}: cc.export.poptions += -DLIBSTUDXML_STATIC -libs{studxml}: cc.export.poptions += -DLIBSTUDXML_SHARED - -# For pre-releases use the complete version to make sure they cannot be used -# in place of another pre-release or the final version. See the version module -# for details on the version.* variable values. -# -if $version.pre_release - lib{studxml}: bin.lib.version = @"-$version.project_id" -else - lib{studxml}: bin.lib.version = @"-$version.major.$version.minor" - -# Install into the libstudxml/ subdirectory of, say, /usr/include/ -# recreating subdirectories. -# -{h hxx ixx txx}{*}: -{ - install = include/libstudxml/ - install.subdirs = true -} - -details/genx/doc{README}@./: install = false -details/genx/doc{LICENSE}@./: install = doc/GENX-LICENSE diff --git a/third-party/libstudxml/libstudxml/content.hxx b/third-party/libstudxml/libstudxml/content.hxx deleted file mode 100644 index 4e352240..00000000 --- a/third-party/libstudxml/libstudxml/content.hxx +++ /dev/null @@ -1,35 +0,0 @@ -// file : libstudxml/content.hxx -*- C++ -*- -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_CONTENT_HXX -#define LIBSTUDXML_CONTENT_HXX - -#include - -namespace xml -{ - // XML content model. C++11 enum class emulated for C++98. - // - struct content - { - enum value - { - // element characters whitespaces notes - empty, // no no ignored - simple, // no yes preserved content accumulated - complex, // yes no ignored - mixed // yes yes preserved - }; - - content (value v): v_ (v) {}; - operator value () const {return v_;} - - private: - value v_; - }; -} - -#include - -#endif // LIBSTUDXML_CONTENT_HXX diff --git a/third-party/libstudxml/libstudxml/details/config-vc.h b/third-party/libstudxml/libstudxml/details/config-vc.h deleted file mode 100644 index 2fc23635..00000000 --- a/third-party/libstudxml/libstudxml/details/config-vc.h +++ /dev/null @@ -1,15 +0,0 @@ -/* file : libstudxml/details/config-vc.h - * copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC - * license : MIT; see accompanying LICENSE file - */ - -/* Configuration file for Windows/VC++ for the build2 build. */ - -#ifndef LIBSTUDXML_DETAILS_CONFIG_VC_H -#define LIBSTUDXML_DETAILS_CONFIG_VC_H - -// Always little-endian, at least on i686 and x86_64. -// -#define LIBSTUDXML_BYTEORDER 1234 - -#endif /* LIBSTUDXML_DETAILS_CONFIG_VC_H */ diff --git a/third-party/libstudxml/libstudxml/details/config.h b/third-party/libstudxml/libstudxml/details/config.h deleted file mode 100644 index aec5f666..00000000 --- a/third-party/libstudxml/libstudxml/details/config.h +++ /dev/null @@ -1,40 +0,0 @@ -/* file : libstudxml/details/build2/config.h - * copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC - * license : MIT; see accompanying LICENSE file - */ - -/* Static configuration file for the build2 build. */ - -#ifndef LIBSTUDXML_DETAILS_CONFIG_H -#define LIBSTUDXML_DETAILS_CONFIG_H - -#ifdef __FreeBSD__ -# include /* BYTE_ORDER */ -#else -# if defined(_WIN32) -# ifndef BYTE_ORDER -# define BIG_ENDIAN 4321 -# define LITTLE_ENDIAN 1234 -# define BYTE_ORDER LITTLE_ENDIAN -# endif -# else -# include /* BYTE_ORDER/__BYTE_ORDER */ -# ifndef BYTE_ORDER -# ifdef __BYTE_ORDER -# define BYTE_ORDER __BYTE_ORDER -# define BIG_ENDIAN __BIG_ENDIAN -# define LITTLE_ENDIAN __LITTLE_ENDIAN -# else -# error no BYTE_ORDER/__BYTE_ORDER define -# endif -# endif -# endif -#endif - -#if BYTE_ORDER == BIG_ENDIAN -# define LIBSTUDXML_BYTEORDER 4321 -#else -# define LIBSTUDXML_BYTEORDER 1234 -#endif - -#endif /* LIBSTUDXML_DETAILS_CONFIG_H */ diff --git a/third-party/libstudxml/libstudxml/details/config.hxx b/third-party/libstudxml/libstudxml/details/config.hxx deleted file mode 100644 index d6147814..00000000 --- a/third-party/libstudxml/libstudxml/details/config.hxx +++ /dev/null @@ -1,40 +0,0 @@ -// file : libstudxml/details/config.hxx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_DETAILS_CONFIG_HXX -#define LIBSTUDXML_DETAILS_CONFIG_HXX - -// C++11 support. -// -#ifdef _MSC_VER -# if _MSC_VER >= 1900 -# define STUDXML_CXX11_NOEXCEPT -# endif -#else -# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L -# ifdef __clang__ // Pretends to be a really old __GNUC__ on some platforms. -# define STUDXML_CXX11_NOEXCEPT -# elif defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || __GNUC__ > 4 -# define STUDXML_CXX11_NOEXCEPT -# endif -# else -# define STUDXML_CXX11_NOEXCEPT -# endif -# endif -#endif - -#ifdef STUDXML_CXX11_NOEXCEPT -# define STUDXML_NOTHROW_NOEXCEPT noexcept -#else -# define STUDXML_NOTHROW_NOEXCEPT throw() -#endif - -#ifdef _MSC_VER -# include -#else -# include -#endif - -#endif // LIBSTUDXML_DETAILS_CONFIG_HXX diff --git a/third-party/libstudxml/libstudxml/details/expat/LICENSE b/third-party/libstudxml/libstudxml/details/expat/LICENSE deleted file mode 100644 index dcb45064..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - and Clark Cooper -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. - -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 furnished 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, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/third-party/libstudxml/libstudxml/details/expat/README b/third-party/libstudxml/libstudxml/details/expat/README deleted file mode 100644 index 3b1ced27..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/README +++ /dev/null @@ -1,2 +0,0 @@ -This directory contains the Expat XML parser library for internal -use by libstudxml. diff --git a/third-party/libstudxml/libstudxml/details/expat/ascii.h b/third-party/libstudxml/libstudxml/details/expat/ascii.h deleted file mode 100644 index d10530b0..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/ascii.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#define ASCII_A 0x41 -#define ASCII_B 0x42 -#define ASCII_C 0x43 -#define ASCII_D 0x44 -#define ASCII_E 0x45 -#define ASCII_F 0x46 -#define ASCII_G 0x47 -#define ASCII_H 0x48 -#define ASCII_I 0x49 -#define ASCII_J 0x4A -#define ASCII_K 0x4B -#define ASCII_L 0x4C -#define ASCII_M 0x4D -#define ASCII_N 0x4E -#define ASCII_O 0x4F -#define ASCII_P 0x50 -#define ASCII_Q 0x51 -#define ASCII_R 0x52 -#define ASCII_S 0x53 -#define ASCII_T 0x54 -#define ASCII_U 0x55 -#define ASCII_V 0x56 -#define ASCII_W 0x57 -#define ASCII_X 0x58 -#define ASCII_Y 0x59 -#define ASCII_Z 0x5A - -#define ASCII_a 0x61 -#define ASCII_b 0x62 -#define ASCII_c 0x63 -#define ASCII_d 0x64 -#define ASCII_e 0x65 -#define ASCII_f 0x66 -#define ASCII_g 0x67 -#define ASCII_h 0x68 -#define ASCII_i 0x69 -#define ASCII_j 0x6A -#define ASCII_k 0x6B -#define ASCII_l 0x6C -#define ASCII_m 0x6D -#define ASCII_n 0x6E -#define ASCII_o 0x6F -#define ASCII_p 0x70 -#define ASCII_q 0x71 -#define ASCII_r 0x72 -#define ASCII_s 0x73 -#define ASCII_t 0x74 -#define ASCII_u 0x75 -#define ASCII_v 0x76 -#define ASCII_w 0x77 -#define ASCII_x 0x78 -#define ASCII_y 0x79 -#define ASCII_z 0x7A - -#define ASCII_0 0x30 -#define ASCII_1 0x31 -#define ASCII_2 0x32 -#define ASCII_3 0x33 -#define ASCII_4 0x34 -#define ASCII_5 0x35 -#define ASCII_6 0x36 -#define ASCII_7 0x37 -#define ASCII_8 0x38 -#define ASCII_9 0x39 - -#define ASCII_TAB 0x09 -#define ASCII_SPACE 0x20 -#define ASCII_EXCL 0x21 -#define ASCII_QUOT 0x22 -#define ASCII_AMP 0x26 -#define ASCII_APOS 0x27 -#define ASCII_MINUS 0x2D -#define ASCII_PERIOD 0x2E -#define ASCII_COLON 0x3A -#define ASCII_SEMI 0x3B -#define ASCII_LT 0x3C -#define ASCII_EQUALS 0x3D -#define ASCII_GT 0x3E -#define ASCII_LSQB 0x5B -#define ASCII_RSQB 0x5D -#define ASCII_UNDERSCORE 0x5F -#define ASCII_LPAREN 0x28 -#define ASCII_RPAREN 0x29 -#define ASCII_FF 0x0C -#define ASCII_SLASH 0x2F -#define ASCII_HASH 0x23 -#define ASCII_PIPE 0x7C -#define ASCII_COMMA 0x2C diff --git a/third-party/libstudxml/libstudxml/details/expat/asciitab.h b/third-party/libstudxml/libstudxml/details/expat/asciitab.h deleted file mode 100644 index 79a15c28..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/asciitab.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/third-party/libstudxml/libstudxml/details/expat/config.h b/third-party/libstudxml/libstudxml/details/expat/config.h deleted file mode 100644 index 99fa673e..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/config.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef EXPAT_CONFIG_H -#define EXPAT_CONFIG_H - -#ifdef _MSC_VER -# include -#else -# include -#endif - -#define BYTEORDER LIBSTUDXML_BYTEORDER - -#define XML_NS 1 -#define XML_DTD 1 -#define XML_CONTEXT_BYTES 1024 - -#define UNUSED(x) (void)x; - -#ifdef _WIN32 -/* Windows - * - */ -#define WIN32_LEAN_AND_MEAN -#include -#undef WIN32_LEAN_AND_MEAN - -#define HAVE_MEMMOVE 1 - -#else -/* POSIX - * - */ -#define HAVE_MEMMOVE 1 -#endif - -#endif /* EXPAT_CONFIG_H */ diff --git a/third-party/libstudxml/libstudxml/details/expat/expat.h b/third-party/libstudxml/libstudxml/details/expat/expat.h deleted file mode 100644 index 9671b736..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/expat.h +++ /dev/null @@ -1,1047 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef Expat_INCLUDED -#define Expat_INCLUDED 1 - -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler -#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler -#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler -#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg -#endif - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct XML_ParserStruct; -typedef struct XML_ParserStruct *XML_Parser; - -/* Should this be defined using stdbool.h when C99 is available? */ -typedef unsigned char XML_Bool; -#define XML_TRUE ((XML_Bool) 1) -#define XML_FALSE ((XML_Bool) 0) - -/* The XML_Status enum gives the possible return values for several - API functions. The preprocessor #defines are included so this - stanza can be added to code that still needs to support older - versions of Expat 1.95.x: - - #ifndef XML_STATUS_OK - #define XML_STATUS_OK 1 - #define XML_STATUS_ERROR 0 - #endif - - Otherwise, the #define hackery is quite ugly and would have been - dropped. -*/ -enum XML_Status { - XML_STATUS_ERROR = 0, -#define XML_STATUS_ERROR XML_STATUS_ERROR - XML_STATUS_OK = 1, -#define XML_STATUS_OK XML_STATUS_OK - XML_STATUS_SUSPENDED = 2 -#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED -}; - -enum XML_Error { - XML_ERROR_NONE, - XML_ERROR_NO_MEMORY, - XML_ERROR_SYNTAX, - XML_ERROR_NO_ELEMENTS, - XML_ERROR_INVALID_TOKEN, - XML_ERROR_UNCLOSED_TOKEN, - XML_ERROR_PARTIAL_CHAR, - XML_ERROR_TAG_MISMATCH, - XML_ERROR_DUPLICATE_ATTRIBUTE, - XML_ERROR_JUNK_AFTER_DOC_ELEMENT, - XML_ERROR_PARAM_ENTITY_REF, - XML_ERROR_UNDEFINED_ENTITY, - XML_ERROR_RECURSIVE_ENTITY_REF, - XML_ERROR_ASYNC_ENTITY, - XML_ERROR_BAD_CHAR_REF, - XML_ERROR_BINARY_ENTITY_REF, - XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, - XML_ERROR_MISPLACED_XML_PI, - XML_ERROR_UNKNOWN_ENCODING, - XML_ERROR_INCORRECT_ENCODING, - XML_ERROR_UNCLOSED_CDATA_SECTION, - XML_ERROR_EXTERNAL_ENTITY_HANDLING, - XML_ERROR_NOT_STANDALONE, - XML_ERROR_UNEXPECTED_STATE, - XML_ERROR_ENTITY_DECLARED_IN_PE, - XML_ERROR_FEATURE_REQUIRES_XML_DTD, - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, - /* Added in 1.95.7. */ - XML_ERROR_UNBOUND_PREFIX, - /* Added in 1.95.8. */ - XML_ERROR_UNDECLARING_PREFIX, - XML_ERROR_INCOMPLETE_PE, - XML_ERROR_XML_DECL, - XML_ERROR_TEXT_DECL, - XML_ERROR_PUBLICID, - XML_ERROR_SUSPENDED, - XML_ERROR_NOT_SUSPENDED, - XML_ERROR_ABORTED, - XML_ERROR_FINISHED, - XML_ERROR_SUSPEND_PE, - /* Added in 2.0. */ - XML_ERROR_RESERVED_PREFIX_XML, - XML_ERROR_RESERVED_PREFIX_XMLNS, - XML_ERROR_RESERVED_NAMESPACE_URI -}; - -enum XML_Content_Type { - XML_CTYPE_EMPTY = 1, - XML_CTYPE_ANY, - XML_CTYPE_MIXED, - XML_CTYPE_NAME, - XML_CTYPE_CHOICE, - XML_CTYPE_SEQ -}; - -enum XML_Content_Quant { - XML_CQUANT_NONE, - XML_CQUANT_OPT, - XML_CQUANT_REP, - XML_CQUANT_PLUS -}; - -/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be - XML_CQUANT_NONE, and the other fields will be zero or NULL. - If type == XML_CTYPE_MIXED, then quant will be NONE or REP and - numchildren will contain number of elements that may be mixed in - and children point to an array of XML_Content cells that will be - all of XML_CTYPE_NAME type with no quantification. - - If type == XML_CTYPE_NAME, then the name points to the name, and - the numchildren field will be zero and children will be NULL. The - quant fields indicates any quantifiers placed on the name. - - CHOICE and SEQ will have name NULL, the number of children in - numchildren and children will point, recursively, to an array - of XML_Content cells. - - The EMPTY, ANY, and MIXED types will only occur at top level. -*/ - -typedef struct XML_cp XML_Content; - -struct XML_cp { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - XML_Char * name; - unsigned int numchildren; - XML_Content * children; -}; - - -/* This is called for an element declaration. See above for - description of the model argument. It's the caller's responsibility - to free model when finished with it. -*/ -typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, - const XML_Char *name, - XML_Content *model); - -XMLPARSEAPI(void) -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl); - -/* The Attlist declaration handler is called for *each* attribute. So - a single Attlist declaration with multiple attributes declared will - generate multiple calls to this handler. The "default" parameter - may be NULL in the case of the "#IMPLIED" or "#REQUIRED" - keyword. The "isrequired" parameter will be true and the default - value will be NULL in the case of "#REQUIRED". If "isrequired" is - true and default is non-NULL, then this is a "#FIXED" default. -*/ -typedef void (XMLCALL *XML_AttlistDeclHandler) ( - void *userData, - const XML_Char *elname, - const XML_Char *attname, - const XML_Char *att_type, - const XML_Char *dflt, - int isrequired); - -XMLPARSEAPI(void) -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl); - -/* The XML declaration handler is called for *both* XML declarations - and text declarations. The way to distinguish is that the version - parameter will be NULL for text declarations. The encoding - parameter may be NULL for XML declarations. The standalone - parameter will be -1, 0, or 1 indicating respectively that there - was no standalone parameter in the declaration, that it was given - as no, or that it was given as yes. -*/ -typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, - const XML_Char *version, - const XML_Char *encoding, - int standalone); - -XMLPARSEAPI(void) -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler xmldecl); - - -typedef struct { - void *(*malloc_fcn)(size_t size); - void *(*realloc_fcn)(void *ptr, size_t size); - void (*free_fcn)(void *ptr); -} XML_Memory_Handling_Suite; - -/* Constructs a new parser; encoding is the encoding specified by the - external protocol or NULL if there is none specified. -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreate(const XML_Char *encoding); - -/* Constructs a new parser and namespace processor. Element type - names and attribute names that belong to a namespace will be - expanded; unprefixed attribute names are never expanded; unprefixed - element type names are expanded only if there is a default - namespace. The expanded name is the concatenation of the namespace - URI, the namespace separator character, and the local part of the - name. If the namespace separator is '\0' then the namespace URI - and the local part will be concatenated without any separator. - It is a programming error to use the separator '\0' with namespace - triplets (see XML_SetReturnNSTriplet). -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); - - -/* Constructs a new parser using the memory management suite referred to - by memsuite. If memsuite is NULL, then use the standard library memory - suite. If namespaceSeparator is non-NULL it creates a parser with - namespace processing as described above. The character pointed at - will serve as the namespace separator. - - All further memory operations used for the created parser will come from - the given suite. -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreate_MM(const XML_Char *encoding, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *namespaceSeparator); - -/* Prepare a parser object to be re-used. This is particularly - valuable when memory allocation overhead is disproportionatly high, - such as when a large number of small documnents need to be parsed. - All handlers are cleared from the parser, except for the - unknownEncodingHandler. The parser's external state is re-initialized - except for the values of ns and ns_triplets. - - Added in Expat 1.95.3. -*/ -XMLPARSEAPI(XML_Bool) -XML_ParserReset(XML_Parser parser, const XML_Char *encoding); - -/* atts is array of name/value pairs, terminated by 0; - names and values are 0 terminated. -*/ -typedef void (XMLCALL *XML_StartElementHandler) (void *userData, - const XML_Char *name, - const XML_Char **atts); - -typedef void (XMLCALL *XML_EndElementHandler) (void *userData, - const XML_Char *name); - - -/* s is not 0 terminated. */ -typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, - const XML_Char *s, - int len); - -/* target and data are 0 terminated */ -typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( - void *userData, - const XML_Char *target, - const XML_Char *data); - -/* data is 0 terminated */ -typedef void (XMLCALL *XML_CommentHandler) (void *userData, - const XML_Char *data); - -typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); -typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); - -/* This is called for any characters in the XML document for which - there is no applicable handler. This includes both characters that - are part of markup which is of a kind that is not reported - (comments, markup declarations), or characters that are part of a - construct which could be reported but for which no handler has been - supplied. The characters are passed exactly as they were in the XML - document except that they will be encoded in UTF-8 or UTF-16. - Line boundaries are not normalized. Note that a byte order mark - character is not passed to the default handler. There are no - guarantees about how characters are divided between calls to the - default handler: for example, a comment might be split between - multiple calls. -*/ -typedef void (XMLCALL *XML_DefaultHandler) (void *userData, - const XML_Char *s, - int len); - -/* This is called for the start of the DOCTYPE declaration, before - any DTD or internal subset is parsed. -*/ -typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( - void *userData, - const XML_Char *doctypeName, - const XML_Char *sysid, - const XML_Char *pubid, - int has_internal_subset); - -/* This is called for the start of the DOCTYPE declaration when the - closing > is encountered, but after processing any external - subset. -*/ -typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); - -/* This is called for entity declarations. The is_parameter_entity - argument will be non-zero if the entity is a parameter entity, zero - otherwise. - - For internal entities (), value will - be non-NULL and systemId, publicID, and notationName will be NULL. - The value string is NOT nul-terminated; the length is provided in - the value_length argument. Since it is legal to have zero-length - values, do not use this argument to test for internal entities. - - For external entities, value will be NULL and systemId will be - non-NULL. The publicId argument will be NULL unless a public - identifier was provided. The notationName argument will have a - non-NULL value only for unparsed entity declarations. - - Note that is_parameter_entity can't be changed to XML_Bool, since - that would break binary compatibility. -*/ -typedef void (XMLCALL *XML_EntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); - -XMLPARSEAPI(void) -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler); - -/* OBSOLETE -- OBSOLETE -- OBSOLETE - This handler has been superceded by the EntityDeclHandler above. - It is provided here for backward compatibility. - - This is called for a declaration of an unparsed (NDATA) entity. - The base argument is whatever was set by XML_SetBase. The - entityName, systemId and notationName arguments will never be - NULL. The other arguments may be. -*/ -typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); - -/* This is called for a declaration of notation. The base argument is - whatever was set by XML_SetBase. The notationName will never be - NULL. The other arguments can be. -*/ -typedef void (XMLCALL *XML_NotationDeclHandler) ( - void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); - -/* When namespace processing is enabled, these are called once for - each namespace declaration. The call to the start and end element - handlers occur between the calls to the start and end namespace - declaration handlers. For an xmlns attribute, prefix will be - NULL. For an xmlns="" attribute, uri will be NULL. -*/ -typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix, - const XML_Char *uri); - -typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix); - -/* This is called if the document is not standalone, that is, it has an - external subset or a reference to a parameter entity, but does not - have standalone="yes". If this handler returns XML_STATUS_ERROR, - then processing will not continue, and the parser will return a - XML_ERROR_NOT_STANDALONE error. - If parameter entity parsing is enabled, then in addition to the - conditions above this handler will only be called if the referenced - entity was actually read. -*/ -typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); - -/* This is called for a reference to an external parsed general - entity. The referenced entity is not automatically parsed. The - application can parse it immediately or later using - XML_ExternalEntityParserCreate. - - The parser argument is the parser parsing the entity containing the - reference; it can be passed as the parser argument to - XML_ExternalEntityParserCreate. The systemId argument is the - system identifier as specified in the entity declaration; it will - not be NULL. - - The base argument is the system identifier that should be used as - the base for resolving systemId if systemId was relative; this is - set by XML_SetBase; it may be NULL. - - The publicId argument is the public identifier as specified in the - entity declaration, or NULL if none was specified; the whitespace - in the public identifier will have been normalized as required by - the XML spec. - - The context argument specifies the parsing context in the format - expected by the context argument to XML_ExternalEntityParserCreate; - context is valid only until the handler returns, so if the - referenced entity is to be parsed later, it must be copied. - context is NULL only when the entity is a parameter entity. - - The handler should return XML_STATUS_ERROR if processing should not - continue because of a fatal error in the handling of the external - entity. In this case the calling parser will return an - XML_ERROR_EXTERNAL_ENTITY_HANDLING error. - - Note that unlike other handlers the first argument is the parser, - not userData. -*/ -typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( - XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); - -/* This is called in two situations: - 1) An entity reference is encountered for which no declaration - has been read *and* this is not an error. - 2) An internal entity reference is read, but not expanded, because - XML_SetDefaultHandler has been called. - Note: skipped parameter entities in declarations and skipped general - entities in attribute values cannot be reported, because - the event would be out of sync with the reporting of the - declarations or attribute values -*/ -typedef void (XMLCALL *XML_SkippedEntityHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity); - -/* This structure is filled in by the XML_UnknownEncodingHandler to - provide information to the parser about encodings that are unknown - to the parser. - - The map[b] member gives information about byte sequences whose - first byte is b. - - If map[b] is c where c is >= 0, then b by itself encodes the - Unicode scalar value c. - - If map[b] is -1, then the byte sequence is malformed. - - If map[b] is -n, where n >= 2, then b is the first byte of an - n-byte sequence that encodes a single Unicode scalar value. - - The data member will be passed as the first argument to the convert - function. - - The convert function is used to convert multibyte sequences; s will - point to a n-byte sequence where map[(unsigned char)*s] == -n. The - convert function must return the Unicode scalar value represented - by this byte sequence or -1 if the byte sequence is malformed. - - The convert function may be NULL if the encoding is a single-byte - encoding, that is if map[b] >= -1 for all bytes b. - - When the parser is finished with the encoding, then if release is - not NULL, it will call release passing it the data member; once - release has been called, the convert function will not be called - again. - - Expat places certain restrictions on the encodings that are supported - using this mechanism. - - 1. Every ASCII character that can appear in a well-formed XML document, - other than the characters - - $@\^`{}~ - - must be represented by a single byte, and that byte must be the - same byte that represents that character in ASCII. - - 2. No character may require more than 4 bytes to encode. - - 3. All characters encoded must have Unicode scalar values <= - 0xFFFF, (i.e., characters that would be encoded by surrogates in - UTF-16 are not allowed). Note that this restriction doesn't - apply to the built-in support for UTF-8 and UTF-16. - - 4. No Unicode character may be encoded by more than one distinct - sequence of bytes. -*/ -typedef struct { - int map[256]; - void *data; - int (XMLCALL *convert)(void *data, const char *s); - void (XMLCALL *release)(void *data); -} XML_Encoding; - -/* This is called for an encoding that is unknown to the parser. - - The encodingHandlerData argument is that which was passed as the - second argument to XML_SetUnknownEncodingHandler. - - The name argument gives the name of the encoding as specified in - the encoding declaration. - - If the callback can provide information about the encoding, it must - fill in the XML_Encoding structure, and return XML_STATUS_OK. - Otherwise it must return XML_STATUS_ERROR. - - If info does not describe a suitable encoding, then the parser will - return an XML_UNKNOWN_ENCODING error. -*/ -typedef int (XMLCALL *XML_UnknownEncodingHandler) ( - void *encodingHandlerData, - const XML_Char *name, - XML_Encoding *info); - -XMLPARSEAPI(void) -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end); - -XMLPARSEAPI(void) -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler handler); - -XMLPARSEAPI(void) -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler handler); - -XMLPARSEAPI(void) -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler); - -XMLPARSEAPI(void) -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler); -XMLPARSEAPI(void) -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler); - -XMLPARSEAPI(void) -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end); - -XMLPARSEAPI(void) -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start); - -XMLPARSEAPI(void) -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end); - -/* This sets the default handler and also inhibits expansion of - internal entities. These entity references will be passed to the - default handler, or to the skipped entity handler, if one is set. -*/ -XMLPARSEAPI(void) -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler); - -/* This sets the default handler but does not inhibit expansion of - internal entities. The entity reference will not be passed to the - default handler. -*/ -XMLPARSEAPI(void) -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler); - -XMLPARSEAPI(void) -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end); - -XMLPARSEAPI(void) -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start); - -XMLPARSEAPI(void) -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end); - -XMLPARSEAPI(void) -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler); - -XMLPARSEAPI(void) -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler); - -XMLPARSEAPI(void) -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end); - -XMLPARSEAPI(void) -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start); - -XMLPARSEAPI(void) -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end); - -XMLPARSEAPI(void) -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler); - -XMLPARSEAPI(void) -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler); - -/* If a non-NULL value for arg is specified here, then it will be - passed as the first argument to the external entity ref handler - instead of the parser object. -*/ -XMLPARSEAPI(void) -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, - void *arg); - -XMLPARSEAPI(void) -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler); - -XMLPARSEAPI(void) -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *encodingHandlerData); - -/* This can be called within a handler for a start element, end - element, processing instruction or character data. It causes the - corresponding markup to be passed to the default handler. -*/ -XMLPARSEAPI(void) -XML_DefaultCurrent(XML_Parser parser); - -/* If do_nst is non-zero, and namespace processing is in effect, and - a name has a prefix (i.e. an explicit namespace qualifier) then - that name is returned as a triplet in a single string separated by - the separator character specified when the parser was created: URI - + sep + local_name + sep + prefix. - - If do_nst is zero, then namespace information is returned in the - default manner (URI + sep + local_name) whether or not the name - has a prefix. - - Note: Calling XML_SetReturnNSTriplet after XML_Parse or - XML_ParseBuffer has no effect. -*/ - -XMLPARSEAPI(void) -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); - -/* This value is passed as the userData argument to callbacks. */ -XMLPARSEAPI(void) -XML_SetUserData(XML_Parser parser, void *userData); - -/* Returns the last value set by XML_SetUserData or NULL. */ -#define XML_GetUserData(parser) (*(void **)(parser)) - -/* This is equivalent to supplying an encoding argument to - XML_ParserCreate. On success XML_SetEncoding returns non-zero, - zero otherwise. - Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer - has no effect and returns XML_STATUS_ERROR. -*/ -XMLPARSEAPI(enum XML_Status) -XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); - -/* If this function is called, then the parser will be passed as the - first argument to callbacks instead of userData. The userData will - still be accessible using XML_GetUserData. -*/ -XMLPARSEAPI(void) -XML_UseParserAsHandlerArg(XML_Parser parser); - -/* If useDTD == XML_TRUE is passed to this function, then the parser - will assume that there is an external subset, even if none is - specified in the document. In such a case the parser will call the - externalEntityRefHandler with a value of NULL for the systemId - argument (the publicId and context arguments will be NULL as well). - Note: For the purpose of checking WFC: Entity Declared, passing - useDTD == XML_TRUE will make the parser behave as if the document - had a DTD with an external subset. - Note: If this function is called, then this must be done before - the first call to XML_Parse or XML_ParseBuffer, since it will - have no effect after that. Returns - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. - Note: If the document does not have a DOCTYPE declaration at all, - then startDoctypeDeclHandler and endDoctypeDeclHandler will not - be called, despite an external subset being parsed. - Note: If XML_DTD is not defined when Expat is compiled, returns - XML_ERROR_FEATURE_REQUIRES_XML_DTD. -*/ -XMLPARSEAPI(enum XML_Error) -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); - - -/* Sets the base to be used for resolving relative URIs in system - identifiers in declarations. Resolving relative identifiers is - left to the application: this value will be passed through as the - base argument to the XML_ExternalEntityRefHandler, - XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base - argument will be copied. Returns XML_STATUS_ERROR if out of memory, - XML_STATUS_OK otherwise. -*/ -XMLPARSEAPI(enum XML_Status) -XML_SetBase(XML_Parser parser, const XML_Char *base); - -XMLPARSEAPI(const XML_Char *) -XML_GetBase(XML_Parser parser); - -/* Returns the number of the attribute/value pairs passed in last call - to the XML_StartElementHandler that were specified in the start-tag - rather than defaulted. Each attribute/value pair counts as 2; thus - this correspondds to an index into the atts array passed to the - XML_StartElementHandler. -*/ -XMLPARSEAPI(int) -XML_GetSpecifiedAttributeCount(XML_Parser parser); - -/* Returns the index of the ID attribute passed in the last call to - XML_StartElementHandler, or -1 if there is no ID attribute. Each - attribute/value pair counts as 2; thus this correspondds to an - index into the atts array passed to the XML_StartElementHandler. -*/ -XMLPARSEAPI(int) -XML_GetIdAttributeIndex(XML_Parser parser); - -#ifdef XML_ATTR_INFO -/* Source file byte offsets for the start and end of attribute names and values. - The value indices are exclusive of surrounding quotes; thus in a UTF-8 source - file an attribute value of "blah" will yield: - info->valueEnd - info->valueStart = 4 bytes. -*/ -typedef struct { - XML_Index nameStart; /* Offset to beginning of the attribute name. */ - XML_Index nameEnd; /* Offset after the attribute name's last byte. */ - XML_Index valueStart; /* Offset to beginning of the attribute value. */ - XML_Index valueEnd; /* Offset after the attribute value's last byte. */ -} XML_AttrInfo; - -/* Returns an array of XML_AttrInfo structures for the attribute/value pairs - passed in last call to the XML_StartElementHandler that were specified - in the start-tag rather than defaulted. Each attribute/value pair counts - as 1; thus the number of entries in the array is - XML_GetSpecifiedAttributeCount(parser) / 2. -*/ -XMLPARSEAPI(const XML_AttrInfo *) -XML_GetAttributeInfo(XML_Parser parser); -#endif - -/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is - detected. The last call to XML_Parse must have isFinal true; len - may be zero for this call (or any other). - - Though the return values for these functions has always been - described as a Boolean value, the implementation, at least for the - 1.95.x series, has always returned exactly one of the XML_Status - values. -*/ -XMLPARSEAPI(enum XML_Status) -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); - -XMLPARSEAPI(void *) -XML_GetBuffer(XML_Parser parser, int len); - -XMLPARSEAPI(enum XML_Status) -XML_ParseBuffer(XML_Parser parser, int len, int isFinal); - -/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. - Must be called from within a call-back handler, except when aborting - (resumable = 0) an already suspended parser. Some call-backs may - still follow because they would otherwise get lost. Examples: - - endElementHandler() for empty elements when stopped in - startElementHandler(), - - endNameSpaceDeclHandler() when stopped in endElementHandler(), - and possibly others. - - Can be called from most handlers, including DTD related call-backs, - except when parsing an external parameter entity and resumable != 0. - Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. - Possible error codes: - - XML_ERROR_SUSPENDED: when suspending an already suspended parser. - - XML_ERROR_FINISHED: when the parser has already finished. - - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. - - When resumable != 0 (true) then parsing is suspended, that is, - XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. - Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() - return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. - - *Note*: - This will be applied to the current parser instance only, that is, if - there is a parent parser then it will continue parsing when the - externalEntityRefHandler() returns. It is up to the implementation of - the externalEntityRefHandler() to call XML_StopParser() on the parent - parser (recursively), if one wants to stop parsing altogether. - - When suspended, parsing can be resumed by calling XML_ResumeParser(). -*/ -XMLPARSEAPI(enum XML_Status) -XML_StopParser(XML_Parser parser, XML_Bool resumable); - -/* Resumes parsing after it has been suspended with XML_StopParser(). - Must not be called from within a handler call-back. Returns same - status codes as XML_Parse() or XML_ParseBuffer(). - Additional error code XML_ERROR_NOT_SUSPENDED possible. - - *Note*: - This must be called on the most deeply nested child parser instance - first, and on its parent parser only after the child parser has finished, - to be applied recursively until the document entity's parser is restarted. - That is, the parent parser will not resume by itself and it is up to the - application to call XML_ResumeParser() on it at the appropriate moment. -*/ -XMLPARSEAPI(enum XML_Status) -XML_ResumeParser(XML_Parser parser); - -enum XML_Parsing { - XML_INITIALIZED, - XML_PARSING, - XML_FINISHED, - XML_SUSPENDED -}; - -typedef struct { - enum XML_Parsing parsing; - XML_Bool finalBuffer; -} XML_ParsingStatus; - -/* Returns status of parser with respect to being initialized, parsing, - finished, or suspended and processing the final buffer. - XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, - XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED -*/ -XMLPARSEAPI(void) -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); - -/* Creates an XML_Parser object that can parse an external general - entity; context is a '\0'-terminated string specifying the parse - context; encoding is a '\0'-terminated string giving the name of - the externally specified encoding, or NULL if there is no - externally specified encoding. The context string consists of a - sequence of tokens separated by formfeeds (\f); a token consisting - of a name specifies that the general entity of the name is open; a - token of the form prefix=uri specifies the namespace for a - particular prefix; a token of the form =uri specifies the default - namespace. This can be called at any point after the first call to - an ExternalEntityRefHandler so longer as the parser has not yet - been freed. The new parser is completely independent and may - safely be used in a separate thread. The handlers and userData are - initialized from the parser argument. Returns NULL if out of memory. - Otherwise returns a new XML_Parser object. -*/ -XMLPARSEAPI(XML_Parser) -XML_ExternalEntityParserCreate(XML_Parser parser, - const XML_Char *context, - const XML_Char *encoding); - -enum XML_ParamEntityParsing { - XML_PARAM_ENTITY_PARSING_NEVER, - XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, - XML_PARAM_ENTITY_PARSING_ALWAYS -}; - -/* Controls parsing of parameter entities (including the external DTD - subset). If parsing of parameter entities is enabled, then - references to external parameter entities (including the external - DTD subset) will be passed to the handler set with - XML_SetExternalEntityRefHandler. The context passed will be 0. - - Unlike external general entities, external parameter entities can - only be parsed synchronously. If the external parameter entity is - to be parsed, it must be parsed during the call to the external - entity ref handler: the complete sequence of - XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and - XML_ParserFree calls must be made during this call. After - XML_ExternalEntityParserCreate has been called to create the parser - for the external parameter entity (context must be 0 for this - call), it is illegal to make any calls on the old parser until - XML_ParserFree has been called on the newly created parser. - If the library has been compiled without support for parameter - entity parsing (ie without XML_DTD being defined), then - XML_SetParamEntityParsing will return 0 if parsing of parameter - entities is requested; otherwise it will return non-zero. - Note: If XML_SetParamEntityParsing is called after XML_Parse or - XML_ParseBuffer, then it has no effect and will always return 0. -*/ -XMLPARSEAPI(int) -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing parsing); - -/* Sets the hash salt to use for internal hash calculations. - Helps in preventing DoS attacks based on predicting hash - function behavior. This must be called before parsing is started. - Returns 1 if successful, 0 when called after parsing has started. -*/ -XMLPARSEAPI(int) -XML_SetHashSalt(XML_Parser parser, - unsigned long hash_salt); - -/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then - XML_GetErrorCode returns information about the error. -*/ -XMLPARSEAPI(enum XML_Error) -XML_GetErrorCode(XML_Parser parser); - -/* These functions return information about the current parse - location. They may be called from any callback called to report - some parse event; in this case the location is the location of the - first of the sequence of characters that generated the event. When - called from callbacks generated by declarations in the document - prologue, the location identified isn't as neatly defined, but will - be within the relevant markup. When called outside of the callback - functions, the position indicated will be just past the last parse - event (regardless of whether there was an associated callback). - - They may also be called after returning from a call to XML_Parse - or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then - the location is the location of the character at which the error - was detected; otherwise the location is the location of the last - parse event, as described above. -*/ -XMLPARSEAPI(XML_Size) XML_GetCurrentLineNumber(XML_Parser parser); -XMLPARSEAPI(XML_Size) XML_GetCurrentColumnNumber(XML_Parser parser); -XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser); - -/* Return the number of bytes in the current event. - Returns 0 if the event is in an internal entity. -*/ -XMLPARSEAPI(int) -XML_GetCurrentByteCount(XML_Parser parser); - -/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets - the integer pointed to by offset to the offset within this buffer - of the current parse position, and sets the integer pointed to by size - to the size of this buffer (the number of input bytes). Otherwise - returns a NULL pointer. Also returns a NULL pointer if a parse isn't - active. - - NOTE: The character pointer returned should not be used outside - the handler that makes the call. -*/ -XMLPARSEAPI(const char *) -XML_GetInputContext(XML_Parser parser, - int *offset, - int *size); - -/* For backwards compatibility with previous versions. */ -#define XML_GetErrorLineNumber XML_GetCurrentLineNumber -#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber -#define XML_GetErrorByteIndex XML_GetCurrentByteIndex - -/* Frees the content model passed to the element declaration handler */ -XMLPARSEAPI(void) -XML_FreeContentModel(XML_Parser parser, XML_Content *model); - -/* Exposing the memory handling functions used in Expat */ -XMLPARSEAPI(void *) -XML_MemMalloc(XML_Parser parser, size_t size); - -XMLPARSEAPI(void *) -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); - -XMLPARSEAPI(void) -XML_MemFree(XML_Parser parser, void *ptr); - -/* Frees memory used by the parser. */ -XMLPARSEAPI(void) -XML_ParserFree(XML_Parser parser); - -/* Returns a string describing the error. */ -XMLPARSEAPI(const XML_LChar *) -XML_ErrorString(enum XML_Error code); - -/* Return a string containing the version number of this expat */ -XMLPARSEAPI(const XML_LChar *) -XML_ExpatVersion(void); - -typedef struct { - int major; - int minor; - int micro; -} XML_Expat_Version; - -/* Return an XML_Expat_Version structure containing numeric version - number information for this version of expat. -*/ -XMLPARSEAPI(XML_Expat_Version) -XML_ExpatVersionInfo(void); - -/* Added in Expat 1.95.5. */ -enum XML_FeatureEnum { - XML_FEATURE_END = 0, - XML_FEATURE_UNICODE, - XML_FEATURE_UNICODE_WCHAR_T, - XML_FEATURE_DTD, - XML_FEATURE_CONTEXT_BYTES, - XML_FEATURE_MIN_SIZE, - XML_FEATURE_SIZEOF_XML_CHAR, - XML_FEATURE_SIZEOF_XML_LCHAR, - XML_FEATURE_NS, - XML_FEATURE_LARGE_SIZE, - XML_FEATURE_ATTR_INFO - /* Additional features must be added to the end of this enum. */ -}; - -typedef struct { - enum XML_FeatureEnum feature; - const XML_LChar *name; - long int value; -} XML_Feature; - -XMLPARSEAPI(const XML_Feature *) -XML_GetFeatureList(void); - - -/* Expat follows the GNU/Linux convention of odd number minor version for - beta/development releases and even number minor version for stable - releases. Micro is bumped with each release, and set to 0 with each - change to major or minor version. -*/ -#define XML_MAJOR_VERSION 2 -#define XML_MINOR_VERSION 1 -#define XML_MICRO_VERSION 0 - -#ifdef __cplusplus -} -#endif - -#endif /* not Expat_INCLUDED */ diff --git a/third-party/libstudxml/libstudxml/details/expat/expat_external.h b/third-party/libstudxml/libstudxml/details/expat/expat_external.h deleted file mode 100644 index 926e32c0..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/expat_external.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef Expat_External_INCLUDED -#define Expat_External_INCLUDED 1 - -/* Link to Expat API statically */ - -#define XML_STATIC 1 - -/* External API definitions */ - -#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) -#define XML_USE_MSC_EXTENSIONS 1 -#endif - -/* Expat tries very hard to make the API boundary very specifically - defined. There are two macros defined to control this boundary; - each of these can be defined before including this header to - achieve some different behavior, but doing so it not recommended or - tested frequently. - - XMLCALL - The calling convention to use for all calls across the - "library boundary." This will default to cdecl, and - try really hard to tell the compiler that's what we - want. - - XMLIMPORT - Whatever magic is needed to note that a function is - to be imported from a dynamically loaded library - (.dll, .so, or .sl, depending on your platform). - - The XMLCALL macro was added in Expat 1.95.7. The only one which is - expected to be directly useful in client code is XMLCALL. - - Note that on at least some Unix versions, the Expat library must be - compiled with the cdecl calling convention as the default since - system headers may assume the cdecl convention. -*/ -#ifndef XMLCALL -#if defined(_MSC_VER) -#define XMLCALL __cdecl -#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER) -#define XMLCALL __attribute__((cdecl)) -#else -/* For any platform which uses this definition and supports more than - one calling convention, we need to extend this definition to - declare the convention used on that platform, if it's possible to - do so. - - If this is the case for your platform, please file a bug report - with information on how to identify your platform via the C - pre-processor and how to specify the same calling convention as the - platform's malloc() implementation. -*/ -#define XMLCALL -#endif -#endif /* not defined XMLCALL */ - - -#if !defined(XML_STATIC) && !defined(XMLIMPORT) -#ifndef XML_BUILDING_EXPAT -/* using Expat from an application */ - -#ifdef XML_USE_MSC_EXTENSIONS -#define XMLIMPORT __declspec(dllimport) -#endif - -#endif -#endif /* not defined XML_STATIC */ - - -/* If we didn't define it above, define it away: */ -#ifndef XMLIMPORT -#define XMLIMPORT -#endif - - -#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef XML_UNICODE_WCHAR_T -#define XML_UNICODE -#endif - -#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ -#ifdef XML_UNICODE_WCHAR_T -typedef wchar_t XML_Char; -typedef wchar_t XML_LChar; -#else -typedef unsigned short XML_Char; -typedef char XML_LChar; -#endif /* XML_UNICODE_WCHAR_T */ -#else /* Information is UTF-8 encoded. */ -typedef char XML_Char; -typedef char XML_LChar; -#endif /* XML_UNICODE */ - -#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */ -#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 -typedef __int64 XML_Index; -typedef unsigned __int64 XML_Size; -#else -typedef long long XML_Index; -typedef unsigned long long XML_Size; -#endif -#else -typedef long XML_Index; -typedef unsigned long XML_Size; -#endif /* XML_LARGE_SIZE */ - -#ifdef __cplusplus -} -#endif - -#endif /* not Expat_External_INCLUDED */ diff --git a/third-party/libstudxml/libstudxml/details/expat/iasciitab.h b/third-party/libstudxml/libstudxml/details/expat/iasciitab.h deleted file mode 100644 index 24a1d5cc..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/iasciitab.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ -/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/third-party/libstudxml/libstudxml/details/expat/internal.h b/third-party/libstudxml/libstudxml/details/expat/internal.h deleted file mode 100644 index dd545483..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/internal.h +++ /dev/null @@ -1,73 +0,0 @@ -/* internal.h - - Internal definitions used by Expat. This is not needed to compile - client code. - - The following calling convention macros are defined for frequently - called functions: - - FASTCALL - Used for those internal functions that have a simple - body and a low number of arguments and local variables. - - PTRCALL - Used for functions called though function pointers. - - PTRFASTCALL - Like PTRCALL, but for low number of arguments. - - inline - Used for selected internal functions for which inlining - may improve performance on some platforms. - - Note: Use of these macros is based on judgement, not hard rules, - and therefore subject to change. -*/ - -#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__) -/* We'll use this version by default only where we know it helps. - - regparm() generates warnings on Solaris boxes. See SF bug #692878. - - Instability reported with egcs on a RedHat Linux 7.3. - Let's comment out: - #define FASTCALL __attribute__((stdcall, regparm(3))) - and let's try this: -*/ -#define FASTCALL __attribute__((regparm(3))) -#define PTRFASTCALL __attribute__((regparm(3))) -#endif - -/* Using __fastcall seems to have an unexpected negative effect under - MS VC++, especially for function pointers, so we won't use it for - now on that platform. It may be reconsidered for a future release - if it can be made more effective. - Likely reason: __fastcall on Windows is like stdcall, therefore - the compiler cannot perform stack optimizations for call clusters. -*/ - -/* Make sure all of these are defined if they aren't already. */ - -#ifndef FASTCALL -#define FASTCALL -#endif - -#ifndef PTRCALL -#define PTRCALL -#endif - -#ifndef PTRFASTCALL -#define PTRFASTCALL -#endif - -#ifndef XML_MIN_SIZE -#if !defined(__cplusplus) && !defined(inline) -#ifdef __GNUC__ -#define inline __inline -#endif /* __GNUC__ */ -#endif -#endif /* XML_MIN_SIZE */ - -#ifdef __cplusplus -#define inline inline -#else -#ifndef inline -#define inline -#endif -#endif diff --git a/third-party/libstudxml/libstudxml/details/expat/latin1tab.h b/third-party/libstudxml/libstudxml/details/expat/latin1tab.h deleted file mode 100644 index 53c25d76..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/latin1tab.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, -/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, diff --git a/third-party/libstudxml/libstudxml/details/expat/nametab.h b/third-party/libstudxml/libstudxml/details/expat/nametab.h deleted file mode 100644 index b05e62c7..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/nametab.h +++ /dev/null @@ -1,150 +0,0 @@ -static const unsigned namingBitmap[] = { -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, -0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, -0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, -0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, -0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, -0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, -0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, -0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, -0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, -0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, -0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, -0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, -0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, -0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, -0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, -0x40000000, 0xF580C900, 0x00000007, 0x02010800, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, -0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, -0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, -0x00000000, 0x00004C40, 0x00000000, 0x00000000, -0x00000007, 0x00000000, 0x00000000, 0x00000000, -0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, -0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, -0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, -0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, -0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, -0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, -0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, -0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, -0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, -0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, -0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, -0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, -0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, -0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, -0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, -0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, -0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, -0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, -}; -static const unsigned char nmstrtPages[] = { -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, -0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x15, 0x16, 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, 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, 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, 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, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 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, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -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 unsigned char namePages[] = { -0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, -0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x27, 0x16, 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, 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, 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, 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, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 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, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -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, -}; diff --git a/third-party/libstudxml/libstudxml/details/expat/utf8tab.h b/third-party/libstudxml/libstudxml/details/expat/utf8tab.h deleted file mode 100644 index 7bb3e776..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/utf8tab.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - - -/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, -/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, diff --git a/third-party/libstudxml/libstudxml/details/expat/xmlparse.c b/third-party/libstudxml/libstudxml/details/expat/xmlparse.c deleted file mode 100644 index 5bc63731..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/xmlparse.c +++ /dev/null @@ -1,6397 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include -#include /* memset(), memcpy() */ -#include -#include /* UINT_MAX */ -#include /* time() */ - -#define XML_BUILDING_EXPAT 1 - -#include - -#include -#include - -#ifdef XML_UNICODE -#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX -#define XmlConvert XmlUtf16Convert -#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS -#define XmlEncode XmlUtf16Encode -/* Using pointer subtraction to convert to integer type. */ -#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) -typedef unsigned short ICHAR; -#else -#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX -#define XmlConvert XmlUtf8Convert -#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS -#define XmlEncode XmlUtf8Encode -#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) -typedef char ICHAR; -#endif - - -#ifndef XML_NS - -#define XmlInitEncodingNS XmlInitEncoding -#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding -#undef XmlGetInternalEncodingNS -#define XmlGetInternalEncodingNS XmlGetInternalEncoding -#define XmlParseXmlDeclNS XmlParseXmlDecl - -#endif - -#ifdef XML_UNICODE - -#ifdef XML_UNICODE_WCHAR_T -#define XML_T(x) (const wchar_t)x -#define XML_L(x) L ## x -#else -#define XML_T(x) (const unsigned short)x -#define XML_L(x) x -#endif - -#else - -#define XML_T(x) x -#define XML_L(x) x - -#endif - -/* Round up n to be a multiple of sz, where sz is a power of 2. */ -#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) - -/* Handle the case where memmove() doesn't exist. */ -#ifndef HAVE_MEMMOVE -#ifdef HAVE_BCOPY -#define memmove(d,s,l) bcopy((s),(d),(l)) -#else -#error memmove does not exist on this platform, nor is a substitute available -#endif /* HAVE_BCOPY */ -#endif /* HAVE_MEMMOVE */ - -#include -#include -#include - -typedef const XML_Char *KEY; - -typedef struct { - KEY name; -} NAMED; - -typedef struct { - NAMED **v; - unsigned char power; - size_t size; - size_t used; - const XML_Memory_Handling_Suite *mem; -} HASH_TABLE; - -/* Basic character hash algorithm, taken from Python's string hash: - h = h * 1000003 ^ character, the constant being a prime number. - -*/ -#ifdef XML_UNICODE -#define CHAR_HASH(h, c) \ - (((h) * 0xF4243) ^ (unsigned short)(c)) -#else -#define CHAR_HASH(h, c) \ - (((h) * 0xF4243) ^ (unsigned char)(c)) -#endif - -/* For probing (after a collision) we need a step size relative prime - to the hash table size, which is a power of 2. We use double-hashing, - since we can calculate a second hash value cheaply by taking those bits - of the first hash value that were discarded (masked out) when the table - index was calculated: index = hash & mask, where mask = table->size - 1. - We limit the maximum step size to table->size / 4 (mask >> 2) and make - it odd, since odd numbers are always relative prime to a power of 2. -*/ -#define SECOND_HASH(hash, mask, power) \ - ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) -#define PROBE_STEP(hash, mask, power) \ - ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) - -typedef struct { - NAMED **p; - NAMED **end; -} HASH_TABLE_ITER; - -#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ -#define INIT_DATA_BUF_SIZE 1024 -#define INIT_ATTS_SIZE 16 -#define INIT_ATTS_VERSION 0xFFFFFFFF -#define INIT_BLOCK_SIZE 1024 -#define INIT_BUFFER_SIZE 1024 - -#define EXPAND_SPARE 24 - -typedef struct binding { - struct prefix *prefix; - struct binding *nextTagBinding; - struct binding *prevPrefixBinding; - const struct attribute_id *attId; - XML_Char *uri; - int uriLen; - int uriAlloc; -} BINDING; - -typedef struct prefix { - const XML_Char *name; - BINDING *binding; -} PREFIX; - -typedef struct { - const XML_Char *str; - const XML_Char *localPart; - const XML_Char *prefix; - int strLen; - int uriLen; - int prefixLen; -} TAG_NAME; - -/* TAG represents an open element. - The name of the element is stored in both the document and API - encodings. The memory buffer 'buf' is a separately-allocated - memory area which stores the name. During the XML_Parse()/ - XMLParseBuffer() when the element is open, the memory for the 'raw' - version of the name (in the document encoding) is shared with the - document buffer. If the element is open across calls to - XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to - contain the 'raw' name as well. - - A parser re-uses these structures, maintaining a list of allocated - TAG objects in a free list. -*/ -typedef struct tag { - struct tag *parent; /* parent of this element */ - const char *rawName; /* tagName in the original encoding */ - int rawNameLength; - TAG_NAME name; /* tagName in the API encoding */ - char *buf; /* buffer for name components */ - char *bufEnd; /* end of the buffer */ - BINDING *bindings; -} TAG; - -typedef struct { - const XML_Char *name; - const XML_Char *textPtr; - int textLen; /* length in XML_Chars */ - int processed; /* # of processed bytes - when suspended */ - const XML_Char *systemId; - const XML_Char *base; - const XML_Char *publicId; - const XML_Char *notation; - XML_Bool open; - XML_Bool is_param; - XML_Bool is_internal; /* true if declared in internal subset outside PE */ -} ENTITY; - -typedef struct { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - const XML_Char * name; - int firstchild; - int lastchild; - int childcnt; - int nextsib; -} CONTENT_SCAFFOLD; - -#define INIT_SCAFFOLD_ELEMENTS 32 - -typedef struct block { - struct block *next; - int size; - XML_Char s[1]; -} BLOCK; - -typedef struct { - BLOCK *blocks; - BLOCK *freeBlocks; - const XML_Char *end; - XML_Char *ptr; - XML_Char *start; - const XML_Memory_Handling_Suite *mem; -} STRING_POOL; - -/* The XML_Char before the name is used to determine whether - an attribute has been specified. */ -typedef struct attribute_id { - XML_Char *name; - PREFIX *prefix; - XML_Bool maybeTokenized; - XML_Bool xmlns; -} ATTRIBUTE_ID; - -typedef struct { - const ATTRIBUTE_ID *id; - XML_Bool isCdata; - const XML_Char *value; -} DEFAULT_ATTRIBUTE; - -typedef struct { - unsigned long version; - unsigned long hash; - const XML_Char *uriName; -} NS_ATT; - -typedef struct { - const XML_Char *name; - PREFIX *prefix; - const ATTRIBUTE_ID *idAtt; - int nDefaultAtts; - int allocDefaultAtts; - DEFAULT_ATTRIBUTE *defaultAtts; -} ELEMENT_TYPE; - -typedef struct { - HASH_TABLE generalEntities; - HASH_TABLE elementTypes; - HASH_TABLE attributeIds; - HASH_TABLE prefixes; - STRING_POOL pool; - STRING_POOL entityValuePool; - /* false once a parameter entity reference has been skipped */ - XML_Bool keepProcessing; - /* true once an internal or external PE reference has been encountered; - this includes the reference to an external subset */ - XML_Bool hasParamEntityRefs; - XML_Bool standalone; -#ifdef XML_DTD - /* indicates if external PE has been read */ - XML_Bool paramEntityRead; - HASH_TABLE paramEntities; -#endif /* XML_DTD */ - PREFIX defaultPrefix; - /* === scaffolding for building content model === */ - XML_Bool in_eldecl; - CONTENT_SCAFFOLD *scaffold; - unsigned contentStringLen; - unsigned scaffSize; - unsigned scaffCount; - int scaffLevel; - int *scaffIndex; -} DTD; - -typedef struct open_internal_entity { - const char *internalEventPtr; - const char *internalEventEndPtr; - struct open_internal_entity *next; - ENTITY *entity; - int startTagLevel; - XML_Bool betweenDecl; /* WFC: PE Between Declarations */ -} OPEN_INTERNAL_ENTITY; - -typedef enum XML_Error PTRCALL Processor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr); - -static Processor prologProcessor; -static Processor prologInitProcessor; -static Processor contentProcessor; -static Processor cdataSectionProcessor; -#ifdef XML_DTD -static Processor ignoreSectionProcessor; -static Processor externalParEntProcessor; -static Processor externalParEntInitProcessor; -static Processor entityValueProcessor; -static Processor entityValueInitProcessor; -#endif /* XML_DTD */ -static Processor epilogProcessor; -static Processor errorProcessor; -static Processor externalEntityInitProcessor; -static Processor externalEntityInitProcessor2; -static Processor externalEntityInitProcessor3; -static Processor externalEntityContentProcessor; -static Processor internalEntityProcessor; - -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next); -static enum XML_Error -initializeEncoding(XML_Parser parser); -static enum XML_Error -doProlog(XML_Parser parser, const ENCODING *enc, const char *s, - const char *end, int tok, const char *next, const char **nextPtr, - XML_Bool haveMore); -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl); -static enum XML_Error -doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, - const char *start, const char *end, const char **endPtr, - XML_Bool haveMore); -static enum XML_Error -doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); -#ifdef XML_DTD -static enum XML_Error -doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); -#endif /* XML_DTD */ - -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *, const char *s, - TAG_NAME *tagNamePtr, BINDING **bindingsPtr); -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr); -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, - XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); -static enum XML_Error -storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end); -static int -reportComment(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static void -reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); - -static const XML_Char * getContext(XML_Parser parser); -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context); - -static void FASTCALL normalizePublicId(XML_Char *s); - -static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); -/* do not call if parentParser != NULL */ -static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); -static int -dtdCopy(XML_Parser oldParser, - DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); -static int -copyEntityTable(XML_Parser oldParser, - HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); -static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize); -static void FASTCALL -hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); -static void FASTCALL hashTableClear(HASH_TABLE *); -static void FASTCALL hashTableDestroy(HASH_TABLE *); -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); -static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); - -static void FASTCALL -poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); -static void FASTCALL poolClear(STRING_POOL *); -static void FASTCALL poolDestroy(STRING_POOL *); -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s); -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s); - -static int FASTCALL nextScaffoldPart(XML_Parser parser); -static XML_Content * build_model(XML_Parser parser); -static ELEMENT_TYPE * -getElementType(XML_Parser parser, const ENCODING *enc, - const char *ptr, const char *end); - -static unsigned long generate_hash_secret_salt(void); -static XML_Bool startParsing(XML_Parser parser); - -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd); - -static void -parserInit(XML_Parser parser, const XML_Char *encodingName); - -#define poolStart(pool) ((pool)->start) -#define poolEnd(pool) ((pool)->ptr) -#define poolLength(pool) ((pool)->ptr - (pool)->start) -#define poolChop(pool) ((void)--(pool->ptr)) -#define poolLastChar(pool) (((pool)->ptr)[-1]) -#define poolDiscard(pool) ((pool)->ptr = (pool)->start) -#define poolFinish(pool) ((pool)->start = (pool)->ptr) -#define poolAppendChar(pool, c) \ - (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ - ? 0 \ - : ((*((pool)->ptr)++ = c), 1)) - -struct XML_ParserStruct { - /* The first member must be userData so that the XML_GetUserData - macro works. */ - void *m_userData; - void *m_handlerArg; - char *m_buffer; - const XML_Memory_Handling_Suite m_mem; - /* first character to be parsed */ - const char *m_bufferPtr; - /* past last character to be parsed */ - char *m_bufferEnd; - /* allocated end of buffer */ - const char *m_bufferLim; - XML_Index m_parseEndByteIndex; - const char *m_parseEndPtr; - XML_Char *m_dataBuf; - XML_Char *m_dataBufEnd; - XML_StartElementHandler m_startElementHandler; - XML_EndElementHandler m_endElementHandler; - XML_CharacterDataHandler m_characterDataHandler; - XML_ProcessingInstructionHandler m_processingInstructionHandler; - XML_CommentHandler m_commentHandler; - XML_StartCdataSectionHandler m_startCdataSectionHandler; - XML_EndCdataSectionHandler m_endCdataSectionHandler; - XML_DefaultHandler m_defaultHandler; - XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; - XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; - XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; - XML_NotationDeclHandler m_notationDeclHandler; - XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; - XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; - XML_NotStandaloneHandler m_notStandaloneHandler; - XML_ExternalEntityRefHandler m_externalEntityRefHandler; - XML_Parser m_externalEntityRefHandlerArg; - XML_SkippedEntityHandler m_skippedEntityHandler; - XML_UnknownEncodingHandler m_unknownEncodingHandler; - XML_ElementDeclHandler m_elementDeclHandler; - XML_AttlistDeclHandler m_attlistDeclHandler; - XML_EntityDeclHandler m_entityDeclHandler; - XML_XmlDeclHandler m_xmlDeclHandler; - const ENCODING *m_encoding; - INIT_ENCODING m_initEncoding; - const ENCODING *m_internalEncoding; - const XML_Char *m_protocolEncodingName; - XML_Bool m_ns; - XML_Bool m_ns_triplets; - void *m_unknownEncodingMem; - void *m_unknownEncodingData; - void *m_unknownEncodingHandlerData; - void (XMLCALL *m_unknownEncodingRelease)(void *); - PROLOG_STATE m_prologState; - Processor *m_processor; - enum XML_Error m_errorCode; - const char *m_eventPtr; - const char *m_eventEndPtr; - const char *m_positionPtr; - OPEN_INTERNAL_ENTITY *m_openInternalEntities; - OPEN_INTERNAL_ENTITY *m_freeInternalEntities; - XML_Bool m_defaultExpandInternalEntities; - int m_tagLevel; - ENTITY *m_declEntity; - const XML_Char *m_doctypeName; - const XML_Char *m_doctypeSysid; - const XML_Char *m_doctypePubid; - const XML_Char *m_declAttributeType; - const XML_Char *m_declNotationName; - const XML_Char *m_declNotationPublicId; - ELEMENT_TYPE *m_declElementType; - ATTRIBUTE_ID *m_declAttributeId; - XML_Bool m_declAttributeIsCdata; - XML_Bool m_declAttributeIsId; - DTD *m_dtd; - const XML_Char *m_curBase; - TAG *m_tagStack; - TAG *m_freeTagList; - BINDING *m_inheritedBindings; - BINDING *m_freeBindingList; - int m_attsSize; - int m_nSpecifiedAtts; - int m_idAttIndex; - ATTRIBUTE *m_atts; - NS_ATT *m_nsAtts; - unsigned long m_nsAttsVersion; - unsigned char m_nsAttsPower; -#ifdef XML_ATTR_INFO - XML_AttrInfo *m_attInfo; -#endif - POSITION m_position; - STRING_POOL m_tempPool; - STRING_POOL m_temp2Pool; - char *m_groupConnector; - unsigned int m_groupSize; - XML_Char m_namespaceSeparator; - XML_Parser m_parentParser; - XML_ParsingStatus m_parsingStatus; -#ifdef XML_DTD - XML_Bool m_isParamEntity; - XML_Bool m_useForeignDTD; - enum XML_ParamEntityParsing m_paramEntityParsing; -#endif - unsigned long m_hash_secret_salt; -}; - -#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) -#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) -#define FREE(p) (parser->m_mem.free_fcn((p))) - -#define userData (parser->m_userData) -#define handlerArg (parser->m_handlerArg) -#define startElementHandler (parser->m_startElementHandler) -#define endElementHandler (parser->m_endElementHandler) -#define characterDataHandler (parser->m_characterDataHandler) -#define processingInstructionHandler \ - (parser->m_processingInstructionHandler) -#define commentHandler (parser->m_commentHandler) -#define startCdataSectionHandler \ - (parser->m_startCdataSectionHandler) -#define endCdataSectionHandler (parser->m_endCdataSectionHandler) -#define defaultHandler (parser->m_defaultHandler) -#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) -#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) -#define unparsedEntityDeclHandler \ - (parser->m_unparsedEntityDeclHandler) -#define notationDeclHandler (parser->m_notationDeclHandler) -#define startNamespaceDeclHandler \ - (parser->m_startNamespaceDeclHandler) -#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) -#define notStandaloneHandler (parser->m_notStandaloneHandler) -#define externalEntityRefHandler \ - (parser->m_externalEntityRefHandler) -#define externalEntityRefHandlerArg \ - (parser->m_externalEntityRefHandlerArg) -#define internalEntityRefHandler \ - (parser->m_internalEntityRefHandler) -#define skippedEntityHandler (parser->m_skippedEntityHandler) -#define unknownEncodingHandler (parser->m_unknownEncodingHandler) -#define elementDeclHandler (parser->m_elementDeclHandler) -#define attlistDeclHandler (parser->m_attlistDeclHandler) -#define entityDeclHandler (parser->m_entityDeclHandler) -#define xmlDeclHandler (parser->m_xmlDeclHandler) -#define encoding (parser->m_encoding) -#define initEncoding (parser->m_initEncoding) -#define internalEncoding (parser->m_internalEncoding) -#define unknownEncodingMem (parser->m_unknownEncodingMem) -#define unknownEncodingData (parser->m_unknownEncodingData) -#define unknownEncodingHandlerData \ - (parser->m_unknownEncodingHandlerData) -#define unknownEncodingRelease (parser->m_unknownEncodingRelease) -#define protocolEncodingName (parser->m_protocolEncodingName) -#define ns (parser->m_ns) -#define ns_triplets (parser->m_ns_triplets) -#define prologState (parser->m_prologState) -#define processor (parser->m_processor) -#define errorCode (parser->m_errorCode) -#define eventPtr (parser->m_eventPtr) -#define eventEndPtr (parser->m_eventEndPtr) -#define positionPtr (parser->m_positionPtr) -#define position (parser->m_position) -#define openInternalEntities (parser->m_openInternalEntities) -#define freeInternalEntities (parser->m_freeInternalEntities) -#define defaultExpandInternalEntities \ - (parser->m_defaultExpandInternalEntities) -#define tagLevel (parser->m_tagLevel) -#define buffer (parser->m_buffer) -#define bufferPtr (parser->m_bufferPtr) -#define bufferEnd (parser->m_bufferEnd) -#define parseEndByteIndex (parser->m_parseEndByteIndex) -#define parseEndPtr (parser->m_parseEndPtr) -#define bufferLim (parser->m_bufferLim) -#define dataBuf (parser->m_dataBuf) -#define dataBufEnd (parser->m_dataBufEnd) -#define _dtd (parser->m_dtd) -#define curBase (parser->m_curBase) -#define declEntity (parser->m_declEntity) -#define doctypeName (parser->m_doctypeName) -#define doctypeSysid (parser->m_doctypeSysid) -#define doctypePubid (parser->m_doctypePubid) -#define declAttributeType (parser->m_declAttributeType) -#define declNotationName (parser->m_declNotationName) -#define declNotationPublicId (parser->m_declNotationPublicId) -#define declElementType (parser->m_declElementType) -#define declAttributeId (parser->m_declAttributeId) -#define declAttributeIsCdata (parser->m_declAttributeIsCdata) -#define declAttributeIsId (parser->m_declAttributeIsId) -#define freeTagList (parser->m_freeTagList) -#define freeBindingList (parser->m_freeBindingList) -#define inheritedBindings (parser->m_inheritedBindings) -#define tagStack (parser->m_tagStack) -#define atts (parser->m_atts) -#define attsSize (parser->m_attsSize) -#define nSpecifiedAtts (parser->m_nSpecifiedAtts) -#define idAttIndex (parser->m_idAttIndex) -#define nsAtts (parser->m_nsAtts) -#define nsAttsVersion (parser->m_nsAttsVersion) -#define nsAttsPower (parser->m_nsAttsPower) -#define attInfo (parser->m_attInfo) -#define tempPool (parser->m_tempPool) -#define temp2Pool (parser->m_temp2Pool) -#define groupConnector (parser->m_groupConnector) -#define groupSize (parser->m_groupSize) -#define namespaceSeparator (parser->m_namespaceSeparator) -#define parentParser (parser->m_parentParser) -#define ps_parsing (parser->m_parsingStatus.parsing) -#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer) -#ifdef XML_DTD -#define isParamEntity (parser->m_isParamEntity) -#define useForeignDTD (parser->m_useForeignDTD) -#define paramEntityParsing (parser->m_paramEntityParsing) -#endif /* XML_DTD */ -#define hash_secret_salt (parser->m_hash_secret_salt) - -XML_Parser XMLCALL -XML_ParserCreate(const XML_Char *encodingName) -{ - return XML_ParserCreate_MM(encodingName, NULL, NULL); -} - -XML_Parser XMLCALL -XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) -{ - XML_Char tmp[2]; - *tmp = nsSep; - return XML_ParserCreate_MM(encodingName, NULL, tmp); -} - -static const XML_Char implicitContext[] = { - ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, - ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, - ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, - ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, - ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, - ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' -}; - -static unsigned long -generate_hash_secret_salt(void) -{ - unsigned int seed = time(NULL) % UINT_MAX; - srand(seed); - return rand(); -} - -static XML_Bool /* only valid for root parser */ -startParsing(XML_Parser parser) -{ - /* hash functions must be initialized before setContext() is called */ - if (hash_secret_salt == 0) - hash_secret_salt = generate_hash_secret_salt(); - if (ns) { - /* implicit context only set for root parser, since child - parsers (i.e. external entity parsers) will inherit it - */ - return setContext(parser, implicitContext); - } - return XML_TRUE; -} - -XML_Parser XMLCALL -XML_ParserCreate_MM(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep) -{ - return parserCreate(encodingName, memsuite, nameSep, NULL); -} - -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd) -{ - XML_Parser parser; - - if (memsuite) { - XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser) - memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); - if (parser != NULL) { - mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = memsuite->malloc_fcn; - mtemp->realloc_fcn = memsuite->realloc_fcn; - mtemp->free_fcn = memsuite->free_fcn; - } - } - else { - XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); - if (parser != NULL) { - mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = malloc; - mtemp->realloc_fcn = realloc; - mtemp->free_fcn = free; - } - } - - if (!parser) - return parser; - - buffer = NULL; - bufferLim = NULL; - - attsSize = INIT_ATTS_SIZE; - atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); - if (atts == NULL) { - FREE(parser); - return NULL; - } -#ifdef XML_ATTR_INFO - attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo)); - if (attInfo == NULL) { - FREE(atts); - FREE(parser); - return NULL; - } -#endif - dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); - if (dataBuf == NULL) { - FREE(atts); -#ifdef XML_ATTR_INFO - FREE(attInfo); -#endif - FREE(parser); - return NULL; - } - dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; - - if (dtd) - _dtd = dtd; - else { - _dtd = dtdCreate(&parser->m_mem); - if (_dtd == NULL) { - FREE(dataBuf); - FREE(atts); -#ifdef XML_ATTR_INFO - FREE(attInfo); -#endif - FREE(parser); - return NULL; - } - } - - freeBindingList = NULL; - freeTagList = NULL; - freeInternalEntities = NULL; - - groupSize = 0; - groupConnector = NULL; - - unknownEncodingHandler = NULL; - unknownEncodingHandlerData = NULL; - - namespaceSeparator = ASCII_EXCL; - ns = XML_FALSE; - ns_triplets = XML_FALSE; - - nsAtts = NULL; - nsAttsVersion = 0; - nsAttsPower = 0; - - poolInit(&tempPool, &(parser->m_mem)); - poolInit(&temp2Pool, &(parser->m_mem)); - parserInit(parser, encodingName); - - if (encodingName && !protocolEncodingName) { - XML_ParserFree(parser); - return NULL; - } - - if (nameSep) { - ns = XML_TRUE; - internalEncoding = XmlGetInternalEncodingNS(); - namespaceSeparator = *nameSep; - } - else { - internalEncoding = XmlGetInternalEncoding(); - } - - return parser; -} - -static void -parserInit(XML_Parser parser, const XML_Char *encodingName) -{ - processor = prologInitProcessor; - XmlPrologStateInit(&prologState); - protocolEncodingName = (encodingName != NULL - ? poolCopyString(&tempPool, encodingName) - : NULL); - curBase = NULL; - XmlInitEncoding(&initEncoding, &encoding, 0); - userData = NULL; - handlerArg = NULL; - startElementHandler = NULL; - endElementHandler = NULL; - characterDataHandler = NULL; - processingInstructionHandler = NULL; - commentHandler = NULL; - startCdataSectionHandler = NULL; - endCdataSectionHandler = NULL; - defaultHandler = NULL; - startDoctypeDeclHandler = NULL; - endDoctypeDeclHandler = NULL; - unparsedEntityDeclHandler = NULL; - notationDeclHandler = NULL; - startNamespaceDeclHandler = NULL; - endNamespaceDeclHandler = NULL; - notStandaloneHandler = NULL; - externalEntityRefHandler = NULL; - externalEntityRefHandlerArg = parser; - skippedEntityHandler = NULL; - elementDeclHandler = NULL; - attlistDeclHandler = NULL; - entityDeclHandler = NULL; - xmlDeclHandler = NULL; - bufferPtr = buffer; - bufferEnd = buffer; - parseEndByteIndex = 0; - parseEndPtr = NULL; - declElementType = NULL; - declAttributeId = NULL; - declEntity = NULL; - doctypeName = NULL; - doctypeSysid = NULL; - doctypePubid = NULL; - declAttributeType = NULL; - declNotationName = NULL; - declNotationPublicId = NULL; - declAttributeIsCdata = XML_FALSE; - declAttributeIsId = XML_FALSE; - memset(&position, 0, sizeof(POSITION)); - errorCode = XML_ERROR_NONE; - eventPtr = NULL; - eventEndPtr = NULL; - positionPtr = NULL; - openInternalEntities = NULL; - defaultExpandInternalEntities = XML_TRUE; - tagLevel = 0; - tagStack = NULL; - inheritedBindings = NULL; - nSpecifiedAtts = 0; - unknownEncodingMem = NULL; - unknownEncodingRelease = NULL; - unknownEncodingData = NULL; - parentParser = NULL; - ps_parsing = XML_INITIALIZED; -#ifdef XML_DTD - isParamEntity = XML_FALSE; - useForeignDTD = XML_FALSE; - paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; -#endif - hash_secret_salt = 0; -} - -/* moves list of bindings to freeBindingList */ -static void FASTCALL -moveToFreeBindingList(XML_Parser parser, BINDING *bindings) -{ - while (bindings) { - BINDING *b = bindings; - bindings = bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - } -} - -XML_Bool XMLCALL -XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) -{ - TAG *tStk; - OPEN_INTERNAL_ENTITY *openEntityList; - if (parentParser) - return XML_FALSE; - /* move tagStack to freeTagList */ - tStk = tagStack; - while (tStk) { - TAG *tag = tStk; - tStk = tStk->parent; - tag->parent = freeTagList; - moveToFreeBindingList(parser, tag->bindings); - tag->bindings = NULL; - freeTagList = tag; - } - /* move openInternalEntities to freeInternalEntities */ - openEntityList = openInternalEntities; - while (openEntityList) { - OPEN_INTERNAL_ENTITY *openEntity = openEntityList; - openEntityList = openEntity->next; - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - moveToFreeBindingList(parser, inheritedBindings); - FREE(unknownEncodingMem); - if (unknownEncodingRelease) - unknownEncodingRelease(unknownEncodingData); - poolClear(&tempPool); - poolClear(&temp2Pool); - parserInit(parser, encodingName); - dtdReset(_dtd, &parser->m_mem); - return XML_TRUE; -} - -enum XML_Status XMLCALL -XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) -{ - /* Block after XML_Parse()/XML_ParseBuffer() has been called. - XXX There's no way for the caller to determine which of the - XXX possible error cases caused the XML_STATUS_ERROR return. - */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return XML_STATUS_ERROR; - if (encodingName == NULL) - protocolEncodingName = NULL; - else { - protocolEncodingName = poolCopyString(&tempPool, encodingName); - if (!protocolEncodingName) - return XML_STATUS_ERROR; - } - return XML_STATUS_OK; -} - -XML_Parser XMLCALL -XML_ExternalEntityParserCreate(XML_Parser oldParser, - const XML_Char *context, - const XML_Char *encodingName) -{ - XML_Parser parser = oldParser; - DTD *newDtd = NULL; - DTD *oldDtd = _dtd; - XML_StartElementHandler oldStartElementHandler = startElementHandler; - XML_EndElementHandler oldEndElementHandler = endElementHandler; - XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; - XML_ProcessingInstructionHandler oldProcessingInstructionHandler - = processingInstructionHandler; - XML_CommentHandler oldCommentHandler = commentHandler; - XML_StartCdataSectionHandler oldStartCdataSectionHandler - = startCdataSectionHandler; - XML_EndCdataSectionHandler oldEndCdataSectionHandler - = endCdataSectionHandler; - XML_DefaultHandler oldDefaultHandler = defaultHandler; - XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler - = unparsedEntityDeclHandler; - XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; - XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler - = startNamespaceDeclHandler; - XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler - = endNamespaceDeclHandler; - XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; - XML_ExternalEntityRefHandler oldExternalEntityRefHandler - = externalEntityRefHandler; - XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; - XML_UnknownEncodingHandler oldUnknownEncodingHandler - = unknownEncodingHandler; - XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; - XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; - XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; - XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; - ELEMENT_TYPE * oldDeclElementType = declElementType; - - void *oldUserData = userData; - void *oldHandlerArg = handlerArg; - XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; - XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; -#ifdef XML_DTD - enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; - int oldInEntityValue = prologState.inEntityValue; -#endif - XML_Bool oldns_triplets = ns_triplets; - /* Note that the new parser shares the same hash secret as the old - parser, so that dtdCopy and copyEntityTable can lookup values - from hash tables associated with either parser without us having - to worry which hash secrets each table has. - */ - unsigned long oldhash_secret_salt = hash_secret_salt; - -#ifdef XML_DTD - if (!context) - newDtd = oldDtd; -#endif /* XML_DTD */ - - /* Note that the magical uses of the pre-processor to make field - access look more like C++ require that `parser' be overwritten - here. This makes this function more painful to follow than it - would be otherwise. - */ - if (ns) { - XML_Char tmp[2]; - *tmp = namespaceSeparator; - parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); - } - else { - parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); - } - - if (!parser) - return NULL; - - startElementHandler = oldStartElementHandler; - endElementHandler = oldEndElementHandler; - characterDataHandler = oldCharacterDataHandler; - processingInstructionHandler = oldProcessingInstructionHandler; - commentHandler = oldCommentHandler; - startCdataSectionHandler = oldStartCdataSectionHandler; - endCdataSectionHandler = oldEndCdataSectionHandler; - defaultHandler = oldDefaultHandler; - unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; - notationDeclHandler = oldNotationDeclHandler; - startNamespaceDeclHandler = oldStartNamespaceDeclHandler; - endNamespaceDeclHandler = oldEndNamespaceDeclHandler; - notStandaloneHandler = oldNotStandaloneHandler; - externalEntityRefHandler = oldExternalEntityRefHandler; - skippedEntityHandler = oldSkippedEntityHandler; - unknownEncodingHandler = oldUnknownEncodingHandler; - elementDeclHandler = oldElementDeclHandler; - attlistDeclHandler = oldAttlistDeclHandler; - entityDeclHandler = oldEntityDeclHandler; - xmlDeclHandler = oldXmlDeclHandler; - declElementType = oldDeclElementType; - userData = oldUserData; - if (oldUserData == oldHandlerArg) - handlerArg = userData; - else - handlerArg = parser; - if (oldExternalEntityRefHandlerArg != oldParser) - externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; - defaultExpandInternalEntities = oldDefaultExpandInternalEntities; - ns_triplets = oldns_triplets; - hash_secret_salt = oldhash_secret_salt; - parentParser = oldParser; -#ifdef XML_DTD - paramEntityParsing = oldParamEntityParsing; - prologState.inEntityValue = oldInEntityValue; - if (context) { -#endif /* XML_DTD */ - if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem) - || !setContext(parser, context)) { - XML_ParserFree(parser); - return NULL; - } - processor = externalEntityInitProcessor; -#ifdef XML_DTD - } - else { - /* The DTD instance referenced by _dtd is shared between the document's - root parser and external PE parsers, therefore one does not need to - call setContext. In addition, one also *must* not call setContext, - because this would overwrite existing prefix->binding pointers in - _dtd with ones that get destroyed with the external PE parser. - This would leave those prefixes with dangling pointers. - */ - isParamEntity = XML_TRUE; - XmlPrologStateInitExternalEntity(&prologState); - processor = externalParEntInitProcessor; - } -#endif /* XML_DTD */ - return parser; -} - -static void FASTCALL -destroyBindings(BINDING *bindings, XML_Parser parser) -{ - for (;;) { - BINDING *b = bindings; - if (!b) - break; - bindings = b->nextTagBinding; - FREE(b->uri); - FREE(b); - } -} - -void XMLCALL -XML_ParserFree(XML_Parser parser) -{ - TAG *tagList; - OPEN_INTERNAL_ENTITY *entityList; - if (parser == NULL) - return; - /* free tagStack and freeTagList */ - tagList = tagStack; - for (;;) { - TAG *p; - if (tagList == NULL) { - if (freeTagList == NULL) - break; - tagList = freeTagList; - freeTagList = NULL; - } - p = tagList; - tagList = tagList->parent; - FREE(p->buf); - destroyBindings(p->bindings, parser); - FREE(p); - } - /* free openInternalEntities and freeInternalEntities */ - entityList = openInternalEntities; - for (;;) { - OPEN_INTERNAL_ENTITY *openEntity; - if (entityList == NULL) { - if (freeInternalEntities == NULL) - break; - entityList = freeInternalEntities; - freeInternalEntities = NULL; - } - openEntity = entityList; - entityList = entityList->next; - FREE(openEntity); - } - - destroyBindings(freeBindingList, parser); - destroyBindings(inheritedBindings, parser); - poolDestroy(&tempPool); - poolDestroy(&temp2Pool); -#ifdef XML_DTD - /* external parameter entity parsers share the DTD structure - parser->m_dtd with the root parser, so we must not destroy it - */ - if (!isParamEntity && _dtd) -#else - if (_dtd) -#endif /* XML_DTD */ - dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); - FREE((void *)atts); -#ifdef XML_ATTR_INFO - FREE((void *)attInfo); -#endif - FREE(groupConnector); - FREE(buffer); - FREE(dataBuf); - FREE(nsAtts); - FREE(unknownEncodingMem); - if (unknownEncodingRelease) - unknownEncodingRelease(unknownEncodingData); - FREE(parser); -} - -void XMLCALL -XML_UseParserAsHandlerArg(XML_Parser parser) -{ - handlerArg = parser; -} - -enum XML_Error XMLCALL -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) -{ -#ifdef XML_DTD - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; - useForeignDTD = useDTD; - return XML_ERROR_NONE; -#else - return XML_ERROR_FEATURE_REQUIRES_XML_DTD; -#endif -} - -void XMLCALL -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return; - ns_triplets = do_nst ? XML_TRUE : XML_FALSE; -} - -void XMLCALL -XML_SetUserData(XML_Parser parser, void *p) -{ - if (handlerArg == userData) - handlerArg = userData = p; - else - userData = p; -} - -enum XML_Status XMLCALL -XML_SetBase(XML_Parser parser, const XML_Char *p) -{ - if (p) { - p = poolCopyString(&_dtd->pool, p); - if (!p) - return XML_STATUS_ERROR; - curBase = p; - } - else - curBase = NULL; - return XML_STATUS_OK; -} - -const XML_Char * XMLCALL -XML_GetBase(XML_Parser parser) -{ - return curBase; -} - -int XMLCALL -XML_GetSpecifiedAttributeCount(XML_Parser parser) -{ - return nSpecifiedAtts; -} - -int XMLCALL -XML_GetIdAttributeIndex(XML_Parser parser) -{ - return idAttIndex; -} - -#ifdef XML_ATTR_INFO -const XML_AttrInfo * XMLCALL -XML_GetAttributeInfo(XML_Parser parser) -{ - return attInfo; -} -#endif - -void XMLCALL -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end) -{ - startElementHandler = start; - endElementHandler = end; -} - -void XMLCALL -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler start) { - startElementHandler = start; -} - -void XMLCALL -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler end) { - endElementHandler = end; -} - -void XMLCALL -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler) -{ - characterDataHandler = handler; -} - -void XMLCALL -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler) -{ - processingInstructionHandler = handler; -} - -void XMLCALL -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler) -{ - commentHandler = handler; -} - -void XMLCALL -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end) -{ - startCdataSectionHandler = start; - endCdataSectionHandler = end; -} - -void XMLCALL -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start) { - startCdataSectionHandler = start; -} - -void XMLCALL -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end) { - endCdataSectionHandler = end; -} - -void XMLCALL -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler) -{ - defaultHandler = handler; - defaultExpandInternalEntities = XML_FALSE; -} - -void XMLCALL -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler) -{ - defaultHandler = handler; - defaultExpandInternalEntities = XML_TRUE; -} - -void XMLCALL -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end) -{ - startDoctypeDeclHandler = start; - endDoctypeDeclHandler = end; -} - -void XMLCALL -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start) { - startDoctypeDeclHandler = start; -} - -void XMLCALL -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end) { - endDoctypeDeclHandler = end; -} - -void XMLCALL -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler) -{ - unparsedEntityDeclHandler = handler; -} - -void XMLCALL -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler) -{ - notationDeclHandler = handler; -} - -void XMLCALL -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end) -{ - startNamespaceDeclHandler = start; - endNamespaceDeclHandler = end; -} - -void XMLCALL -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start) { - startNamespaceDeclHandler = start; -} - -void XMLCALL -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end) { - endNamespaceDeclHandler = end; -} - -void XMLCALL -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler) -{ - notStandaloneHandler = handler; -} - -void XMLCALL -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler) -{ - externalEntityRefHandler = handler; -} - -void XMLCALL -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) -{ - if (arg) - externalEntityRefHandlerArg = (XML_Parser)arg; - else - externalEntityRefHandlerArg = parser; -} - -void XMLCALL -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler) -{ - skippedEntityHandler = handler; -} - -void XMLCALL -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *data) -{ - unknownEncodingHandler = handler; - unknownEncodingHandlerData = data; -} - -void XMLCALL -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl) -{ - elementDeclHandler = eldecl; -} - -void XMLCALL -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl) -{ - attlistDeclHandler = attdecl; -} - -void XMLCALL -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler) -{ - entityDeclHandler = handler; -} - -void XMLCALL -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler handler) { - xmlDeclHandler = handler; -} - -int XMLCALL -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing peParsing) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return 0; -#ifdef XML_DTD - paramEntityParsing = peParsing; - return 1; -#else - return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; -#endif -} - -int XMLCALL -XML_SetHashSalt(XML_Parser parser, - unsigned long hash_salt) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return 0; - hash_secret_salt = hash_salt; - return 1; -} - -enum XML_Status XMLCALL -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - case XML_INITIALIZED: - if (parentParser == NULL && !startParsing(parser)) { - errorCode = XML_ERROR_NO_MEMORY; - return XML_STATUS_ERROR; - } - default: - ps_parsing = XML_PARSING; - } - - if (len == 0) { - ps_finalBuffer = (XML_Bool)isFinal; - if (!isFinal) - return XML_STATUS_OK; - positionPtr = bufferPtr; - parseEndPtr = bufferEnd; - - /* If data are left over from last buffer, and we now know that these - data are the final chunk of input, then we have to check them again - to detect errors based on that fact. - */ - errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); - - if (errorCode == XML_ERROR_NONE) { - switch (ps_parsing) { - case XML_SUSPENDED: - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return XML_STATUS_SUSPENDED; - case XML_INITIALIZED: - case XML_PARSING: - ps_parsing = XML_FINISHED; - /* fall through */ - default: - return XML_STATUS_OK; - } - } - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } -#ifndef XML_CONTEXT_BYTES - else if (bufferPtr == bufferEnd) { - const char *end; - int nLeftOver; - enum XML_Error result; - parseEndByteIndex += len; - positionPtr = s; - ps_finalBuffer = (XML_Bool)isFinal; - - errorCode = processor(parser, s, parseEndPtr = s + len, &end); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - ps_parsing = XML_FINISHED; - return XML_STATUS_OK; - } - /* fall through */ - default: - result = XML_STATUS_OK; - } - } - - XmlUpdatePosition(encoding, positionPtr, end, &position); - nLeftOver = s + len - end; - if (nLeftOver) { - if (buffer == NULL || nLeftOver > bufferLim - buffer) { - /* FIXME avoid integer overflow */ - char *temp; - temp = (buffer == NULL - ? (char *)MALLOC(len * 2) - : (char *)REALLOC(buffer, len * 2)); - if (temp == NULL) { - errorCode = XML_ERROR_NO_MEMORY; - eventPtr = eventEndPtr = NULL; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - buffer = temp; - bufferLim = buffer + len * 2; - } - memcpy(buffer, end, nLeftOver); - } - bufferPtr = buffer; - bufferEnd = buffer + nLeftOver; - positionPtr = bufferPtr; - parseEndPtr = bufferEnd; - eventPtr = bufferPtr; - eventEndPtr = bufferPtr; - return result; - } -#endif /* not defined XML_CONTEXT_BYTES */ - else { - void *buff = XML_GetBuffer(parser, len); - if (buff == NULL) - return XML_STATUS_ERROR; - else { - memcpy(buff, s, len); - return XML_ParseBuffer(parser, len, isFinal); - } - } -} - -enum XML_Status XMLCALL -XML_ParseBuffer(XML_Parser parser, int len, int isFinal) -{ - const char *start; - enum XML_Status result = XML_STATUS_OK; - - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - case XML_INITIALIZED: - if (parentParser == NULL && !startParsing(parser)) { - errorCode = XML_ERROR_NO_MEMORY; - return XML_STATUS_ERROR; - } - default: - ps_parsing = XML_PARSING; - } - - start = bufferPtr; - positionPtr = start; - bufferEnd += len; - parseEndPtr = bufferEnd; - parseEndByteIndex += len; - ps_finalBuffer = (XML_Bool)isFinal; - - errorCode = processor(parser, start, parseEndPtr, &bufferPtr); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - ps_parsing = XML_FINISHED; - return result; - } - default: ; /* should not happen */ - } - } - - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return result; -} - -void * XMLCALL -XML_GetBuffer(XML_Parser parser, int len) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return NULL; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return NULL; - default: ; - } - - if (len > bufferLim - bufferEnd) { - /* FIXME avoid integer overflow */ - int neededSize = len + (int)(bufferEnd - bufferPtr); -#ifdef XML_CONTEXT_BYTES - int keep = (int)(bufferPtr - buffer); - - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; - neededSize += keep; -#endif /* defined XML_CONTEXT_BYTES */ - if (neededSize <= bufferLim - buffer) { -#ifdef XML_CONTEXT_BYTES - if (keep < bufferPtr - buffer) { - int offset = (int)(bufferPtr - buffer) - keep; - memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); - bufferEnd -= offset; - bufferPtr -= offset; - } -#else - memmove(buffer, bufferPtr, bufferEnd - bufferPtr); - bufferEnd = buffer + (bufferEnd - bufferPtr); - bufferPtr = buffer; -#endif /* not defined XML_CONTEXT_BYTES */ - } - else { - char *newBuf; - int bufferSize = (int)(bufferLim - bufferPtr); - if (bufferSize == 0) - bufferSize = INIT_BUFFER_SIZE; - do { - bufferSize *= 2; - } while (bufferSize < neededSize); - newBuf = (char *)MALLOC(bufferSize); - if (newBuf == 0) { - errorCode = XML_ERROR_NO_MEMORY; - return NULL; - } - bufferLim = newBuf + bufferSize; -#ifdef XML_CONTEXT_BYTES - if (bufferPtr) { - int keep = (int)(bufferPtr - buffer); - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; - memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); - FREE(buffer); - buffer = newBuf; - bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; - bufferPtr = buffer + keep; - } - else { - bufferEnd = newBuf + (bufferEnd - bufferPtr); - bufferPtr = buffer = newBuf; - } -#else - if (bufferPtr) { - memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); - FREE(buffer); - } - bufferEnd = newBuf + (bufferEnd - bufferPtr); - bufferPtr = buffer = newBuf; -#endif /* not defined XML_CONTEXT_BYTES */ - } - eventPtr = eventEndPtr = NULL; - positionPtr = NULL; - } - return bufferEnd; -} - -enum XML_Status XMLCALL -XML_StopParser(XML_Parser parser, XML_Bool resumable) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - if (resumable) { - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - } - ps_parsing = XML_FINISHED; - break; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - default: - if (resumable) { -#ifdef XML_DTD - if (isParamEntity) { - errorCode = XML_ERROR_SUSPEND_PE; - return XML_STATUS_ERROR; - } -#endif - ps_parsing = XML_SUSPENDED; - } - else - ps_parsing = XML_FINISHED; - } - return XML_STATUS_OK; -} - -enum XML_Status XMLCALL -XML_ResumeParser(XML_Parser parser) -{ - enum XML_Status result = XML_STATUS_OK; - - if (ps_parsing != XML_SUSPENDED) { - errorCode = XML_ERROR_NOT_SUSPENDED; - return XML_STATUS_ERROR; - } - ps_parsing = XML_PARSING; - - errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (ps_finalBuffer) { - ps_parsing = XML_FINISHED; - return result; - } - default: ; - } - } - - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return result; -} - -void XMLCALL -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) -{ - assert(status != NULL); - *status = parser->m_parsingStatus; -} - -enum XML_Error XMLCALL -XML_GetErrorCode(XML_Parser parser) -{ - return errorCode; -} - -XML_Index XMLCALL -XML_GetCurrentByteIndex(XML_Parser parser) -{ - if (eventPtr) - return (XML_Index) (parseEndByteIndex - (parseEndPtr - eventPtr)); - return -1; -} - -int XMLCALL -XML_GetCurrentByteCount(XML_Parser parser) -{ - if (eventEndPtr && eventPtr) - return (int)(eventEndPtr - eventPtr); - return 0; -} - -const char * XMLCALL -XML_GetInputContext(XML_Parser parser, int *offset, int *size) -{ -#ifdef XML_CONTEXT_BYTES - if (eventPtr && buffer) { - *offset = (int)(eventPtr - buffer); - *size = (int)(bufferEnd - buffer); - return buffer; - } -#endif /* defined XML_CONTEXT_BYTES */ - return (char *) 0; -} - -XML_Size XMLCALL -XML_GetCurrentLineNumber(XML_Parser parser) -{ - if (eventPtr && eventPtr >= positionPtr) { - XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); - positionPtr = eventPtr; - } - return position.lineNumber + 1; -} - -XML_Size XMLCALL -XML_GetCurrentColumnNumber(XML_Parser parser) -{ - if (eventPtr && eventPtr >= positionPtr) { - XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); - positionPtr = eventPtr; - } - return position.columnNumber; -} - -void XMLCALL -XML_FreeContentModel(XML_Parser parser, XML_Content *model) -{ - FREE(model); -} - -void * XMLCALL -XML_MemMalloc(XML_Parser parser, size_t size) -{ - return MALLOC(size); -} - -void * XMLCALL -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) -{ - return REALLOC(ptr, size); -} - -void XMLCALL -XML_MemFree(XML_Parser parser, void *ptr) -{ - FREE(ptr); -} - -void XMLCALL -XML_DefaultCurrent(XML_Parser parser) -{ - if (defaultHandler) { - if (openInternalEntities) - reportDefault(parser, - internalEncoding, - openInternalEntities->internalEventPtr, - openInternalEntities->internalEventEndPtr); - else - reportDefault(parser, encoding, eventPtr, eventEndPtr); - } -} - -const XML_LChar * XMLCALL -XML_ErrorString(enum XML_Error code) -{ - static const XML_LChar* const message[] = { - 0, - XML_L("out of memory"), - XML_L("syntax error"), - XML_L("no element found"), - XML_L("not well-formed (invalid token)"), - XML_L("unclosed token"), - XML_L("partial character"), - XML_L("mismatched tag"), - XML_L("duplicate attribute"), - XML_L("junk after document element"), - XML_L("illegal parameter entity reference"), - XML_L("undefined entity"), - XML_L("recursive entity reference"), - XML_L("asynchronous entity"), - XML_L("reference to invalid character number"), - XML_L("reference to binary entity"), - XML_L("reference to external entity in attribute"), - XML_L("XML or text declaration not at start of entity"), - XML_L("unknown encoding"), - XML_L("encoding specified in XML declaration is incorrect"), - XML_L("unclosed CDATA section"), - XML_L("error in processing external entity reference"), - XML_L("document is not standalone"), - XML_L("unexpected parser state - please send a bug report"), - XML_L("entity declared in parameter entity"), - XML_L("requested feature requires XML_DTD support in Expat"), - XML_L("cannot change setting once parsing has begun"), - XML_L("unbound prefix"), - XML_L("must not undeclare prefix"), - XML_L("incomplete markup in parameter entity"), - XML_L("XML declaration not well-formed"), - XML_L("text declaration not well-formed"), - XML_L("illegal character(s) in public id"), - XML_L("parser suspended"), - XML_L("parser not suspended"), - XML_L("parsing aborted"), - XML_L("parsing finished"), - XML_L("cannot suspend in external parameter entity"), - XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"), - XML_L("reserved prefix (xmlns) must not be declared or undeclared"), - XML_L("prefix must not be bound to one of the reserved namespace names") - }; - if (code > 0 && code < sizeof(message)/sizeof(message[0])) - return message[code]; - return NULL; -} - -const XML_LChar * XMLCALL -XML_ExpatVersion(void) { - - /* V1 is used to string-ize the version number. However, it would - string-ize the actual version macro *names* unless we get them - substituted before being passed to V1. CPP is defined to expand - a macro, then rescan for more expansions. Thus, we use V2 to expand - the version macros, then CPP will expand the resulting V1() macro - with the correct numerals. */ - /* ### I'm assuming cpp is portable in this respect... */ - -#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) -#define V2(a,b,c) XML_L("expat_")V1(a,b,c) - - return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); - -#undef V1 -#undef V2 -} - -XML_Expat_Version XMLCALL -XML_ExpatVersionInfo(void) -{ - XML_Expat_Version version; - - version.major = XML_MAJOR_VERSION; - version.minor = XML_MINOR_VERSION; - version.micro = XML_MICRO_VERSION; - - return version; -} - -const XML_Feature * XMLCALL -XML_GetFeatureList(void) -{ - static const XML_Feature features[] = { - {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), - sizeof(XML_Char)}, - {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), - sizeof(XML_LChar)}, -#ifdef XML_UNICODE - {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, -#endif -#ifdef XML_UNICODE_WCHAR_T - {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, -#endif -#ifdef XML_DTD - {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, -#endif -#ifdef XML_CONTEXT_BYTES - {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), - XML_CONTEXT_BYTES}, -#endif -#ifdef XML_MIN_SIZE - {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, -#endif -#ifdef XML_NS - {XML_FEATURE_NS, XML_L("XML_NS"), 0}, -#endif -#ifdef XML_LARGE_SIZE - {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, -#endif -#ifdef XML_ATTR_INFO - {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, -#endif - {XML_FEATURE_END, NULL, 0} - }; - - return features; -} - -/* Initially tag->rawName always points into the parse buffer; - for those TAG instances opened while the current parse buffer was - processed, and not yet closed, we need to store tag->rawName in a more - permanent location, since the parse buffer is about to be discarded. -*/ -static XML_Bool -storeRawNames(XML_Parser parser) -{ - TAG *tag = tagStack; - while (tag) { - int bufSize; - int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); - char *rawNameBuf = tag->buf + nameLen; - /* Stop if already stored. Since tagStack is a stack, we can stop - at the first entry that has already been copied; everything - below it in the stack is already been accounted for in a - previous call to this function. - */ - if (tag->rawName == rawNameBuf) - break; - /* For re-use purposes we need to ensure that the - size of tag->buf is a multiple of sizeof(XML_Char). - */ - bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); - if (bufSize > tag->bufEnd - tag->buf) { - char *temp = (char *)REALLOC(tag->buf, bufSize); - if (temp == NULL) - return XML_FALSE; - /* if tag->name.str points to tag->buf (only when namespace - processing is off) then we have to update it - */ - if (tag->name.str == (XML_Char *)tag->buf) - tag->name.str = (XML_Char *)temp; - /* if tag->name.localPart is set (when namespace processing is on) - then update it as well, since it will always point into tag->buf - */ - if (tag->name.localPart) - tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - - (XML_Char *)tag->buf); - tag->buf = temp; - tag->bufEnd = temp + bufSize; - rawNameBuf = temp + nameLen; - } - memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); - tag->rawName = rawNameBuf; - tag = tag->parent; - } - return XML_TRUE; -} - -static enum XML_Error PTRCALL -contentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 0, encoding, start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; - } - return result; -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - processor = externalEntityInitProcessor2; - return externalEntityInitProcessor2(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor2(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - const char *next = start; /* XmlContentTok doesn't always set the last arg */ - int tok = XmlContentTok(encoding, start, end, &next); - switch (tok) { - case XML_TOK_BOM: - /* If we are at the end of the buffer, this would cause the next stage, - i.e. externalEntityInitProcessor3, to pass control directly to - doContent (by detecting XML_TOK_NONE) without processing any xml text - declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. - */ - if (next == end && !ps_finalBuffer) { - *endPtr = next; - return XML_ERROR_NONE; - } - start = next; - break; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - eventPtr = start; - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - eventPtr = start; - return XML_ERROR_PARTIAL_CHAR; - } - processor = externalEntityInitProcessor3; - return externalEntityInitProcessor3(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor3(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - int tok; - const char *next = start; /* XmlContentTok doesn't always set the last arg */ - eventPtr = start; - tok = XmlContentTok(encoding, start, end, &next); - eventEndPtr = next; - - switch (tok) { - case XML_TOK_XML_DECL: - { - enum XML_Error result; - result = processXmlDecl(parser, 1, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (ps_parsing) { - case XML_SUSPENDED: - *endPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - start = next; - } - } - break; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - } - processor = externalEntityContentProcessor; - tagLevel = 1; - return externalEntityContentProcessor(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityContentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 1, encoding, start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; - } - return result; -} - -static enum XML_Error -doContent(XML_Parser parser, - int startTagLevel, - const ENCODING *enc, - const char *s, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - /* save one level of indirection */ - DTD * const dtd = _dtd; - - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - - for (;;) { - const char *next = s; /* XmlContentTok doesn't always set the last arg */ - int tok = XmlContentTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_TRAILING_CR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - *eventEndPP = end; - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) - return XML_ERROR_NO_ELEMENTS; - if (tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (startTagLevel > 0) { - if (tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_NO_ELEMENTS; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (characterDataHandler) - characterDataHandler(handlerArg, &ch, 1); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&dtd->pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity or default handler. - */ - if (!dtd->hasParamEntityRefs || dtd->standalone) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->notation) - return XML_ERROR_BINARY_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - if (!defaultExpandInternalEntities) { - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, entity->name, 0); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - result = processInternalEntity(parser, entity, XML_FALSE); - if (result != XML_ERROR_NONE) - return result; - } - else if (externalEntityRefHandler) { - const XML_Char *context; - entity->open = XML_TRUE; - context = getContext(parser); - entity->open = XML_FALSE; - if (!context) - return XML_ERROR_NO_MEMORY; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - context, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - poolDiscard(&tempPool); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - case XML_TOK_START_TAG_NO_ATTS: - /* fall through */ - case XML_TOK_START_TAG_WITH_ATTS: - { - TAG *tag; - enum XML_Error result; - XML_Char *toPtr; - if (freeTagList) { - tag = freeTagList; - freeTagList = freeTagList->parent; - } - else { - tag = (TAG *)MALLOC(sizeof(TAG)); - if (!tag) - return XML_ERROR_NO_MEMORY; - tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); - if (!tag->buf) { - FREE(tag); - return XML_ERROR_NO_MEMORY; - } - tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; - } - tag->bindings = NULL; - tag->parent = tagStack; - tagStack = tag; - tag->name.localPart = NULL; - tag->name.prefix = NULL; - tag->rawName = s + enc->minBytesPerChar; - tag->rawNameLength = XmlNameLength(enc, tag->rawName); - ++tagLevel; - { - const char *rawNameEnd = tag->rawName + tag->rawNameLength; - const char *fromPtr = tag->rawName; - toPtr = (XML_Char *)tag->buf; - for (;;) { - int bufSize; - int convLen; - XmlConvert(enc, - &fromPtr, rawNameEnd, - (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); - convLen = (int)(toPtr - (XML_Char *)tag->buf); - if (fromPtr == rawNameEnd) { - tag->name.strLen = convLen; - break; - } - bufSize = (int)(tag->bufEnd - tag->buf) << 1; - { - char *temp = (char *)REALLOC(tag->buf, bufSize); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - tag->buf = temp; - tag->bufEnd = temp + bufSize; - toPtr = (XML_Char *)temp + convLen; - } - } - } - tag->name.str = (XML_Char *)tag->buf; - *toPtr = XML_T('\0'); - result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); - if (result) - return result; - if (startElementHandler) - startElementHandler(handlerArg, tag->name.str, - (const XML_Char **)atts); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&tempPool); - break; - } - case XML_TOK_EMPTY_ELEMENT_NO_ATTS: - /* fall through */ - case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: - { - const char *rawName = s + enc->minBytesPerChar; - enum XML_Error result; - BINDING *bindings = NULL; - XML_Bool noElmHandlers = XML_TRUE; - TAG_NAME name; - name.str = poolStoreString(&tempPool, enc, rawName, - rawName + XmlNameLength(enc, rawName)); - if (!name.str) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - result = storeAtts(parser, enc, s, &name, &bindings); - if (result) - return result; - poolFinish(&tempPool); - if (startElementHandler) { - startElementHandler(handlerArg, name.str, (const XML_Char **)atts); - noElmHandlers = XML_FALSE; - } - if (endElementHandler) { - if (startElementHandler) - *eventPP = *eventEndPP; - endElementHandler(handlerArg, name.str); - noElmHandlers = XML_FALSE; - } - if (noElmHandlers && defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&tempPool); - while (bindings) { - BINDING *b = bindings; - if (endNamespaceDeclHandler) - endNamespaceDeclHandler(handlerArg, b->prefix->name); - bindings = bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; - } - } - if (tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - break; - case XML_TOK_END_TAG: - if (tagLevel == startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - else { - int len; - const char *rawName; - TAG *tag = tagStack; - tagStack = tag->parent; - tag->parent = freeTagList; - freeTagList = tag; - rawName = s + enc->minBytesPerChar*2; - len = XmlNameLength(enc, rawName); - if (len != tag->rawNameLength - || memcmp(tag->rawName, rawName, len) != 0) { - *eventPP = rawName; - return XML_ERROR_TAG_MISMATCH; - } - --tagLevel; - if (endElementHandler) { - const XML_Char *localPart; - const XML_Char *prefix; - XML_Char *uri; - localPart = tag->name.localPart; - if (ns && localPart) { - /* localPart and prefix may have been overwritten in - tag->name.str, since this points to the binding->uri - buffer which gets re-used; so we have to add them again - */ - uri = (XML_Char *)tag->name.str + tag->name.uriLen; - /* don't need to check for space - already done in storeAtts() */ - while (*localPart) *uri++ = *localPart++; - prefix = (XML_Char *)tag->name.prefix; - if (ns_triplets && prefix) { - *uri++ = namespaceSeparator; - while (*prefix) *uri++ = *prefix++; - } - *uri = XML_T('\0'); - } - endElementHandler(handlerArg, tag->name.str); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - while (tag->bindings) { - BINDING *b = tag->bindings; - if (endNamespaceDeclHandler) - endNamespaceDeclHandler(handlerArg, b->prefix->name); - tag->bindings = tag->bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; - } - if (tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - } - break; - case XML_TOK_CHAR_REF: - { - int n = XmlCharRefNumber(enc, s); - if (n < 0) - return XML_ERROR_BAD_CHAR_REF; - if (characterDataHandler) { - XML_Char buf[XML_ENCODE_MAX]; - characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - case XML_TOK_DATA_NEWLINE: - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_CDATA_SECT_OPEN: - { - enum XML_Error result; - if (startCdataSectionHandler) - startCdataSectionHandler(handlerArg); -#if 0 - /* Suppose you doing a transformation on a document that involves - changing only the character data. You set up a defaultHandler - and a characterDataHandler. The defaultHandler simply copies - characters through. The characterDataHandler does the - transformation and writes the characters out escaping them as - necessary. This case will fail to work if we leave out the - following two lines (because & and < inside CDATA sections will - be incorrectly escaped). - - However, now we have a start/endCdataSectionHandler, so it seems - easier to let the user deal with this. - */ - else if (characterDataHandler) - characterDataHandler(handlerArg, dataBuf, 0); -#endif - else if (defaultHandler) - reportDefault(parser, enc, s, next); - result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - processor = cdataSectionProcessor; - return result; - } - } - break; - case XML_TOK_TRAILING_RSQB: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (characterDataHandler) { - if (MUST_CONVERT(enc, s)) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); - characterDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - } - else - characterDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)end - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) { - *eventPP = end; - return XML_ERROR_NO_ELEMENTS; - } - if (tagLevel != startTagLevel) { - *eventPP = end; - return XML_ERROR_ASYNC_ENTITY; - } - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = s; - charDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - if (s == next) - break; - *eventPP = s; - } - } - else - charDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (!reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - default: - if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - *eventPP = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } - /* not reached */ -} - -/* Precondition: all arguments must be non-NULL; - Purpose: - - normalize attributes - - check attributes for well-formedness - - generate namespace aware attribute names (URI, prefix) - - build list of attributes for startElementHandler - - default attributes - - process namespace declarations (check and report them) - - generate namespace aware element name (URI, prefix) -*/ -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *enc, - const char *attStr, TAG_NAME *tagNamePtr, - BINDING **bindingsPtr) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - ELEMENT_TYPE *elementType; - int nDefaultAtts; - const XML_Char **appAtts; /* the attribute list for the application */ - int attIndex = 0; - int prefixLen; - int i; - int n; - XML_Char *uri; - int nPrefixes = 0; - BINDING *binding; - const XML_Char *localPart; - - /* lookup the element type name */ - elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0); - if (!elementType) { - const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); - if (!name) - return XML_ERROR_NO_MEMORY; - elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, - sizeof(ELEMENT_TYPE)); - if (!elementType) - return XML_ERROR_NO_MEMORY; - if (ns && !setElementTypePrefix(parser, elementType)) - return XML_ERROR_NO_MEMORY; - } - nDefaultAtts = elementType->nDefaultAtts; - - /* get the attributes from the tokenizer */ - n = XmlGetAttributes(enc, attStr, attsSize, atts); - if (n + nDefaultAtts > attsSize) { - int oldAttsSize = attsSize; - ATTRIBUTE *temp; -#ifdef XML_ATTR_INFO - XML_AttrInfo *temp2; -#endif - attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; - temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - atts = temp; -#ifdef XML_ATTR_INFO - temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo)); - if (temp2 == NULL) - return XML_ERROR_NO_MEMORY; - attInfo = temp2; -#endif - if (n > oldAttsSize) - XmlGetAttributes(enc, attStr, n, atts); - } - - appAtts = (const XML_Char **)atts; - for (i = 0; i < n; i++) { - ATTRIBUTE *currAtt = &atts[i]; -#ifdef XML_ATTR_INFO - XML_AttrInfo *currAttInfo = &attInfo[i]; -#endif - /* add the name and value to the attribute list */ - ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name, - currAtt->name - + XmlNameLength(enc, currAtt->name)); - if (!attId) - return XML_ERROR_NO_MEMORY; -#ifdef XML_ATTR_INFO - currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name); - currAttInfo->nameEnd = currAttInfo->nameStart + - XmlNameLength(enc, currAtt->name); - currAttInfo->valueStart = parseEndByteIndex - - (parseEndPtr - currAtt->valuePtr); - currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd); -#endif - /* Detect duplicate attributes by their QNames. This does not work when - namespace processing is turned on and different prefixes for the same - namespace are used. For this case we have a check further down. - */ - if ((attId->name)[-1]) { - if (enc == encoding) - eventPtr = atts[i].name; - return XML_ERROR_DUPLICATE_ATTRIBUTE; - } - (attId->name)[-1] = 1; - appAtts[attIndex++] = attId->name; - if (!atts[i].normalized) { - enum XML_Error result; - XML_Bool isCdata = XML_TRUE; - - /* figure out whether declared as other than CDATA */ - if (attId->maybeTokenized) { - int j; - for (j = 0; j < nDefaultAtts; j++) { - if (attId == elementType->defaultAtts[j].id) { - isCdata = elementType->defaultAtts[j].isCdata; - break; - } - } - } - - /* normalize the attribute value */ - result = storeAttributeValue(parser, enc, isCdata, - atts[i].valuePtr, atts[i].valueEnd, - &tempPool); - if (result) - return result; - appAtts[attIndex] = poolStart(&tempPool); - poolFinish(&tempPool); - } - else { - /* the value did not need normalizing */ - appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, - atts[i].valueEnd); - if (appAtts[attIndex] == 0) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - } - /* handle prefixed attribute names */ - if (attId->prefix) { - if (attId->xmlns) { - /* deal with namespace declarations here */ - enum XML_Error result = addBinding(parser, attId->prefix, attId, - appAtts[attIndex], bindingsPtr); - if (result) - return result; - --attIndex; - } - else { - /* deal with other prefixed names later */ - attIndex++; - nPrefixes++; - (attId->name)[-1] = 2; - } - } - else - attIndex++; - } - - /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ - nSpecifiedAtts = attIndex; - if (elementType->idAtt && (elementType->idAtt->name)[-1]) { - for (i = 0; i < attIndex; i += 2) - if (appAtts[i] == elementType->idAtt->name) { - idAttIndex = i; - break; - } - } - else - idAttIndex = -1; - - /* do attribute defaulting */ - for (i = 0; i < nDefaultAtts; i++) { - const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; - if (!(da->id->name)[-1] && da->value) { - if (da->id->prefix) { - if (da->id->xmlns) { - enum XML_Error result = addBinding(parser, da->id->prefix, da->id, - da->value, bindingsPtr); - if (result) - return result; - } - else { - (da->id->name)[-1] = 2; - nPrefixes++; - appAtts[attIndex++] = da->id->name; - appAtts[attIndex++] = da->value; - } - } - else { - (da->id->name)[-1] = 1; - appAtts[attIndex++] = da->id->name; - appAtts[attIndex++] = da->value; - } - } - } - appAtts[attIndex] = 0; - - /* expand prefixed attribute names, check for duplicates, - and clear flags that say whether attributes were specified */ - i = 0; - if (nPrefixes) { - int j; /* hash table index */ - unsigned long version = nsAttsVersion; - int nsAttsSize = (int)1 << nsAttsPower; - /* size of hash table must be at least 2 * (# of prefixed attributes) */ - if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ - NS_ATT *temp; - /* hash table size must also be a power of 2 and >= 8 */ - while (nPrefixes >> nsAttsPower++); - if (nsAttsPower < 3) - nsAttsPower = 3; - nsAttsSize = (int)1 << nsAttsPower; - temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); - if (!temp) - return XML_ERROR_NO_MEMORY; - nsAtts = temp; - version = 0; /* force re-initialization of nsAtts hash table */ - } - /* using a version flag saves us from initializing nsAtts every time */ - if (!version) { /* initialize version flags when version wraps around */ - version = INIT_ATTS_VERSION; - for (j = nsAttsSize; j != 0; ) - nsAtts[--j].version = version; - } - nsAttsVersion = --version; - - /* expand prefixed names and check for duplicates */ - for (; i < attIndex; i += 2) { - const XML_Char *s = appAtts[i]; - if (s[-1] == 2) { /* prefixed */ - ATTRIBUTE_ID *id; - const BINDING *b; - unsigned long uriHash = hash_secret_salt; - ((XML_Char *)s)[-1] = 0; /* clear flag */ - id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); - b = id->prefix->binding; - if (!b) - return XML_ERROR_UNBOUND_PREFIX; - - /* as we expand the name we also calculate its hash value */ - for (j = 0; j < b->uriLen; j++) { - const XML_Char c = b->uri[j]; - if (!poolAppendChar(&tempPool, c)) - return XML_ERROR_NO_MEMORY; - uriHash = CHAR_HASH(uriHash, c); - } - while (*s++ != XML_T(ASCII_COLON)) - ; - do { /* copies null terminator */ - const XML_Char c = *s; - if (!poolAppendChar(&tempPool, *s)) - return XML_ERROR_NO_MEMORY; - uriHash = CHAR_HASH(uriHash, c); - } while (*s++); - - { /* Check hash table for duplicate of expanded name (uriName). - Derived from code in lookup(parser, HASH_TABLE *table, ...). - */ - unsigned char step = 0; - unsigned long mask = nsAttsSize - 1; - j = uriHash & mask; /* index into hash table */ - while (nsAtts[j].version == version) { - /* for speed we compare stored hash values first */ - if (uriHash == nsAtts[j].hash) { - const XML_Char *s1 = poolStart(&tempPool); - const XML_Char *s2 = nsAtts[j].uriName; - /* s1 is null terminated, but not s2 */ - for (; *s1 == *s2 && *s1 != 0; s1++, s2++); - if (*s1 == 0) - return XML_ERROR_DUPLICATE_ATTRIBUTE; - } - if (!step) - step = PROBE_STEP(uriHash, mask, nsAttsPower); - j < step ? (j += nsAttsSize - step) : (j -= step); - } - } - - if (ns_triplets) { /* append namespace separator and prefix */ - tempPool.ptr[-1] = namespaceSeparator; - s = b->prefix->name; - do { - if (!poolAppendChar(&tempPool, *s)) - return XML_ERROR_NO_MEMORY; - } while (*s++); - } - - /* store expanded name in attribute list */ - s = poolStart(&tempPool); - poolFinish(&tempPool); - appAtts[i] = s; - - /* fill empty slot with new version, uriName and hash value */ - nsAtts[j].version = version; - nsAtts[j].hash = uriHash; - nsAtts[j].uriName = s; - - if (!--nPrefixes) { - i += 2; - break; - } - } - else /* not prefixed */ - ((XML_Char *)s)[-1] = 0; /* clear flag */ - } - } - /* clear flags for the remaining attributes */ - for (; i < attIndex; i += 2) - ((XML_Char *)(appAtts[i]))[-1] = 0; - for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) - binding->attId->name[-1] = 0; - - if (!ns) - return XML_ERROR_NONE; - - /* expand the element type name */ - if (elementType->prefix) { - binding = elementType->prefix->binding; - if (!binding) - return XML_ERROR_UNBOUND_PREFIX; - localPart = tagNamePtr->str; - while (*localPart++ != XML_T(ASCII_COLON)) - ; - } - else if (dtd->defaultPrefix.binding) { - binding = dtd->defaultPrefix.binding; - localPart = tagNamePtr->str; - } - else - return XML_ERROR_NONE; - prefixLen = 0; - if (ns_triplets && binding->prefix->name) { - for (; binding->prefix->name[prefixLen++];) - ; /* prefixLen includes null terminator */ - } - tagNamePtr->localPart = localPart; - tagNamePtr->uriLen = binding->uriLen; - tagNamePtr->prefix = binding->prefix->name; - tagNamePtr->prefixLen = prefixLen; - for (i = 0; localPart[i++];) - ; /* i includes null terminator */ - n = i + binding->uriLen + prefixLen; - if (n > binding->uriAlloc) { - TAG *p; - uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); - if (!uri) - return XML_ERROR_NO_MEMORY; - binding->uriAlloc = n + EXPAND_SPARE; - memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); - for (p = tagStack; p; p = p->parent) - if (p->name.str == binding->uri) - p->name.str = uri; - FREE(binding->uri); - binding->uri = uri; - } - /* if namespaceSeparator != '\0' then uri includes it already */ - uri = binding->uri + binding->uriLen; - memcpy(uri, localPart, i * sizeof(XML_Char)); - /* we always have a namespace separator between localPart and prefix */ - if (prefixLen) { - uri += i - 1; - *uri = namespaceSeparator; /* replace null terminator */ - memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); - } - tagNamePtr->str = binding->uri; - return XML_ERROR_NONE; -} - -/* addBinding() overwrites the value of prefix->binding without checking. - Therefore one must keep track of the old value outside of addBinding(). -*/ -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr) -{ - static const XML_Char xmlNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, - ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, - ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, - ASCII_e, '\0' - }; - static const int xmlLen = - (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; - static const XML_Char xmlnsNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, - ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, - ASCII_SLASH, '\0' - }; - static const int xmlnsLen = - (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; - - XML_Bool mustBeXML = XML_FALSE; - XML_Bool isXML = XML_TRUE; - XML_Bool isXMLNS = XML_TRUE; - - BINDING *b; - int len; - - /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ - if (*uri == XML_T('\0') && prefix->name) - return XML_ERROR_UNDECLARING_PREFIX; - - if (prefix->name - && prefix->name[0] == XML_T(ASCII_x) - && prefix->name[1] == XML_T(ASCII_m) - && prefix->name[2] == XML_T(ASCII_l)) { - - /* Not allowed to bind xmlns */ - if (prefix->name[3] == XML_T(ASCII_n) - && prefix->name[4] == XML_T(ASCII_s) - && prefix->name[5] == XML_T('\0')) - return XML_ERROR_RESERVED_PREFIX_XMLNS; - - if (prefix->name[3] == XML_T('\0')) - mustBeXML = XML_TRUE; - } - - for (len = 0; uri[len]; len++) { - if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) - isXML = XML_FALSE; - - if (!mustBeXML && isXMLNS - && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) - isXMLNS = XML_FALSE; - } - isXML = isXML && len == xmlLen; - isXMLNS = isXMLNS && len == xmlnsLen; - - if (mustBeXML != isXML) - return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML - : XML_ERROR_RESERVED_NAMESPACE_URI; - - if (isXMLNS) - return XML_ERROR_RESERVED_NAMESPACE_URI; - - if (namespaceSeparator) - len++; - if (freeBindingList) { - b = freeBindingList; - if (len > b->uriAlloc) { - XML_Char *temp = (XML_Char *)REALLOC(b->uri, - sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - b->uri = temp; - b->uriAlloc = len + EXPAND_SPARE; - } - freeBindingList = b->nextTagBinding; - } - else { - b = (BINDING *)MALLOC(sizeof(BINDING)); - if (!b) - return XML_ERROR_NO_MEMORY; - b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (!b->uri) { - FREE(b); - return XML_ERROR_NO_MEMORY; - } - b->uriAlloc = len + EXPAND_SPARE; - } - b->uriLen = len; - memcpy(b->uri, uri, len * sizeof(XML_Char)); - if (namespaceSeparator) - b->uri[len - 1] = namespaceSeparator; - b->prefix = prefix; - b->attId = attId; - b->prevPrefixBinding = prefix->binding; - /* NULL binding when default namespace undeclared */ - if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) - prefix->binding = NULL; - else - prefix->binding = b; - b->nextTagBinding = *bindingsPtr; - *bindingsPtr = b; - /* if attId == NULL then we are not starting a namespace scope */ - if (attId && startNamespaceDeclHandler) - startNamespaceDeclHandler(handlerArg, prefix->name, - prefix->binding ? uri : 0); - return XML_ERROR_NONE; -} - -/* The idea here is to avoid using stack for each CDATA section when - the whole file is parsed with one call. -*/ -static enum XML_Error PTRCALL -cdataSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doCdataSection(parser, encoding, &start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result != XML_ERROR_NONE) - return result; - if (start) { - if (parentParser) { /* we are parsing an external entity */ - processor = externalEntityContentProcessor; - return externalEntityContentProcessor(parser, start, end, endPtr); - } - else { - processor = contentProcessor; - return contentProcessor(parser, start, end, endPtr); - } - } - return result; -} - -/* startPtr gets set to non-null if the section is closed, and to null if - the section is not yet closed. -*/ -static enum XML_Error -doCdataSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - const char *s = *startPtr; - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - *eventPP = s; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - *startPtr = NULL; - - for (;;) { - const char *next; - int tok = XmlCdataSectionTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_CDATA_SECT_CLOSE: - if (endCdataSectionHandler) - endCdataSectionHandler(handlerArg); -#if 0 - /* see comment under XML_TOK_CDATA_SECT_OPEN */ - else if (characterDataHandler) - characterDataHandler(handlerArg, dataBuf, 0); -#endif - else if (defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_DATA_NEWLINE: - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = next; - charDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - if (s == next) - break; - *eventPP = s; - } - } - else - charDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_CDATA_SECTION; - default: - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - } - - *eventPP = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } - /* not reached */ -} - -#ifdef XML_DTD - -/* The idea here is to avoid using stack for each IGNORE section when - the whole file is parsed with one call. -*/ -static enum XML_Error PTRCALL -ignoreSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result != XML_ERROR_NONE) - return result; - if (start) { - processor = prologProcessor; - return prologProcessor(parser, start, end, endPtr); - } - return result; -} - -/* startPtr gets set to non-null is the section is closed, and to null - if the section is not yet closed. -*/ -static enum XML_Error -doIgnoreSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - const char *next; - int tok; - const char *s = *startPtr; - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - *eventPP = s; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - *startPtr = NULL; - tok = XmlIgnoreSectionTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_IGNORE_SECT: - if (defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ - default: - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - } - /* not reached */ -} - -#endif /* XML_DTD */ - -static enum XML_Error -initializeEncoding(XML_Parser parser) -{ - const char *s; -#ifdef XML_UNICODE - char encodingBuf[128]; - if (!protocolEncodingName) - s = NULL; - else { - int i; - for (i = 0; protocolEncodingName[i]; i++) { - if (i == sizeof(encodingBuf) - 1 - || (protocolEncodingName[i] & ~0x7f) != 0) { - encodingBuf[0] = '\0'; - break; - } - encodingBuf[i] = (char)protocolEncodingName[i]; - } - encodingBuf[i] = '\0'; - s = encodingBuf; - } -#else - s = protocolEncodingName; -#endif - if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) - return XML_ERROR_NONE; - return handleUnknownEncoding(parser, protocolEncodingName); -} - -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next) -{ - const char *encodingName = NULL; - const XML_Char *storedEncName = NULL; - const ENCODING *newEncoding = NULL; - const char *version = NULL; - const char *versionend; - const XML_Char *storedversion = NULL; - int standalone = -1; - if (!(ns - ? XmlParseXmlDeclNS - : XmlParseXmlDecl)(isGeneralTextEntity, - encoding, - s, - next, - &eventPtr, - &version, - &versionend, - &encodingName, - &newEncoding, - &standalone)) { - if (isGeneralTextEntity) - return XML_ERROR_TEXT_DECL; - else - return XML_ERROR_XML_DECL; - } - if (!isGeneralTextEntity && standalone == 1) { - _dtd->standalone = XML_TRUE; -#ifdef XML_DTD - if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) - paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; -#endif /* XML_DTD */ - } - if (xmlDeclHandler) { - if (encodingName != NULL) { - storedEncName = poolStoreString(&temp2Pool, - encoding, - encodingName, - encodingName - + XmlNameLength(encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; - poolFinish(&temp2Pool); - } - if (version) { - storedversion = poolStoreString(&temp2Pool, - encoding, - version, - versionend - encoding->minBytesPerChar); - if (!storedversion) - return XML_ERROR_NO_MEMORY; - } - xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); - } - else if (defaultHandler) - reportDefault(parser, encoding, s, next); - if (protocolEncodingName == NULL) { - if (newEncoding) { - if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { - eventPtr = encodingName; - return XML_ERROR_INCORRECT_ENCODING; - } - encoding = newEncoding; - } - else if (encodingName) { - enum XML_Error result; - if (!storedEncName) { - storedEncName = poolStoreString( - &temp2Pool, encoding, encodingName, - encodingName + XmlNameLength(encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; - } - result = handleUnknownEncoding(parser, storedEncName); - poolClear(&temp2Pool); - if (result == XML_ERROR_UNKNOWN_ENCODING) - eventPtr = encodingName; - return result; - } - } - - if (storedEncName || storedversion) - poolClear(&temp2Pool); - - return XML_ERROR_NONE; -} - -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) -{ - if (unknownEncodingHandler) { - XML_Encoding info; - int i; - for (i = 0; i < 256; i++) - info.map[i] = -1; - info.convert = NULL; - info.data = NULL; - info.release = NULL; - if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, - &info)) { - ENCODING *enc; - unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); - if (!unknownEncodingMem) { - if (info.release) - info.release(info.data); - return XML_ERROR_NO_MEMORY; - } - enc = (ns - ? XmlInitUnknownEncodingNS - : XmlInitUnknownEncoding)(unknownEncodingMem, - info.map, - info.convert, - info.data); - if (enc) { - unknownEncodingData = info.data; - unknownEncodingRelease = info.release; - encoding = enc; - return XML_ERROR_NONE; - } - } - if (info.release != NULL) - info.release(info.data); - } - return XML_ERROR_UNKNOWN_ENCODING; -} - -static enum XML_Error PTRCALL -prologInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - processor = prologProcessor; - return prologProcessor(parser, s, end, nextPtr); -} - -#ifdef XML_DTD - -static enum XML_Error PTRCALL -externalParEntInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - - /* we know now that XML_Parse(Buffer) has been called, - so we consider the external parameter entity read */ - _dtd->paramEntityRead = XML_TRUE; - - if (prologState.inEntityValue) { - processor = entityValueInitProcessor; - return entityValueInitProcessor(parser, s, end, nextPtr); - } - else { - processor = externalParEntProcessor; - return externalParEntProcessor(parser, s, end, nextPtr); - } -} - -static enum XML_Error PTRCALL -entityValueInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - int tok; - const char *start = s; - const char *next = start; - eventPtr = start; - - for (;;) { - tok = XmlPrologTok(encoding, start, end, &next); - eventEndPtr = next; - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - /* found end of entity value - can store it now */ - return storeEntityValue(parser, encoding, s, end); - } - else if (tok == XML_TOK_XML_DECL) { - enum XML_Error result; - result = processXmlDecl(parser, 0, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - *nextPtr = next; - } - /* stop scanning for text declaration - we found one */ - processor = entityValueProcessor; - return entityValueProcessor(parser, next, end, nextPtr); - } - /* If we are at the end of the buffer, this would cause XmlPrologTok to - return XML_TOK_NONE on the next call, which would then cause the - function to exit with *nextPtr set to s - that is what we want for other - tokens, but not for the BOM - we would rather like to skip it; - then, when this routine is entered the next time, XmlPrologTok will - return XML_TOK_INVALID, since the BOM is still in the buffer - */ - else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) { - *nextPtr = next; - return XML_ERROR_NONE; - } - start = next; - eventPtr = start; - } -} - -static enum XML_Error PTRCALL -externalParEntProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *next = s; - int tok; - - tok = XmlPrologTok(encoding, s, end, &next); - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - } - /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. - However, when parsing an external subset, doProlog will not accept a BOM - as valid, and report a syntax error, so we have to skip the BOM - */ - else if (tok == XML_TOK_BOM) { - s = next; - tok = XmlPrologTok(encoding, s, end, &next); - } - - processor = prologProcessor; - return doProlog(parser, encoding, s, end, tok, next, - nextPtr, (XML_Bool)!ps_finalBuffer); -} - -static enum XML_Error PTRCALL -entityValueProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *start = s; - const char *next = s; - const ENCODING *enc = encoding; - int tok; - - for (;;) { - tok = XmlPrologTok(enc, start, end, &next); - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - /* found end of entity value - can store it now */ - return storeEntityValue(parser, enc, s, end); - } - start = next; - } -} - -#endif /* XML_DTD */ - -static enum XML_Error PTRCALL -prologProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *next = s; - int tok = XmlPrologTok(encoding, s, end, &next); - return doProlog(parser, encoding, s, end, tok, next, - nextPtr, (XML_Bool)!ps_finalBuffer); -} - -static enum XML_Error -doProlog(XML_Parser parser, - const ENCODING *enc, - const char *s, - const char *end, - int tok, - const char *next, - const char **nextPtr, - XML_Bool haveMore) -{ -#ifdef XML_DTD - static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; -#endif /* XML_DTD */ - static const XML_Char atypeCDATA[] = - { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; - static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; - static const XML_Char atypeIDREF[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; - static const XML_Char atypeIDREFS[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; - static const XML_Char atypeENTITY[] = - { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; - static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N, - ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; - static const XML_Char atypeNMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; - static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, - ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; - static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T, - ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' }; - static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' }; - static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; - - /* save one level of indirection */ - DTD * const dtd = _dtd; - - const char **eventPP; - const char **eventEndPP; - enum XML_Content_Quant quant; - - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - - for (;;) { - int role; - XML_Bool handleDefault = XML_TRUE; - *eventPP = s; - *eventEndPP = next; - if (tok <= 0) { - if (haveMore && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case -XML_TOK_PROLOG_S: - tok = -tok; - break; - case XML_TOK_NONE: -#ifdef XML_DTD - /* for internal PE NOT referenced between declarations */ - if (enc != encoding && !openInternalEntities->betweenDecl) { - *nextPtr = s; - return XML_ERROR_NONE; - } - /* WFC: PE Between Declarations - must check that PE contains - complete markup, not only for external PEs, but also for - internal PEs if the reference occurs between declarations. - */ - if (isParamEntity || enc != encoding) { - if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) - == XML_ROLE_ERROR) - return XML_ERROR_INCOMPLETE_PE; - *nextPtr = s; - return XML_ERROR_NONE; - } -#endif /* XML_DTD */ - return XML_ERROR_NO_ELEMENTS; - default: - tok = -tok; - next = end; - break; - } - } - role = XmlTokenRole(&prologState, tok, s, next, enc); - switch (role) { - case XML_ROLE_XML_DECL: - { - enum XML_Error result = processXmlDecl(parser, 0, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = encoding; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_NAME: - if (startDoctypeDeclHandler) { - doctypeName = poolStoreString(&tempPool, enc, s, next); - if (!doctypeName) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - doctypePubid = NULL; - handleDefault = XML_FALSE; - } - doctypeSysid = NULL; /* always initialize to NULL */ - break; - case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: - if (startDoctypeDeclHandler) { - startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, - doctypePubid, 1); - doctypeName = NULL; - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - break; -#ifdef XML_DTD - case XML_ROLE_TEXT_DECL: - { - enum XML_Error result = processXmlDecl(parser, 1, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = encoding; - handleDefault = XML_FALSE; - } - break; -#endif /* XML_DTD */ - case XML_ROLE_DOCTYPE_PUBLIC_ID: -#ifdef XML_DTD - useForeignDTD = XML_FALSE; - declEntity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (startDoctypeDeclHandler) { - XML_Char *pubId; - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - pubId = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!pubId) - return XML_ERROR_NO_MEMORY; - normalizePublicId(pubId); - poolFinish(&tempPool); - doctypePubid = pubId; - handleDefault = XML_FALSE; - goto alreadyChecked; - } - /* fall through */ - case XML_ROLE_ENTITY_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - alreadyChecked: - if (dtd->keepProcessing && declEntity) { - XML_Char *tem = poolStoreString(&dtd->pool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - declEntity->publicId = tem; - poolFinish(&dtd->pool); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_CLOSE: - if (doctypeName) { - startDoctypeDeclHandler(handlerArg, doctypeName, - doctypeSysid, doctypePubid, 0); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - /* doctypeSysid will be non-NULL in the case of a previous - XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler - was not set, indicating an external subset - */ -#ifdef XML_DTD - if (doctypeSysid || useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (paramEntityParsing && externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) - return XML_ERROR_NO_MEMORY; - if (useForeignDTD) - entity->base = curBase; - dtd->paramEntityRead = XML_FALSE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else if (!doctypeSysid) - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - useForeignDTD = XML_FALSE; - } -#endif /* XML_DTD */ - if (endDoctypeDeclHandler) { - endDoctypeDeclHandler(handlerArg); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_INSTANCE_START: -#ifdef XML_DTD - /* if there is no DOCTYPE declaration then now is the - last chance to read the foreign DTD - */ - if (useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (paramEntityParsing && externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) - return XML_ERROR_NO_MEMORY; - entity->base = curBase; - dtd->paramEntityRead = XML_FALSE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - } -#endif /* XML_DTD */ - processor = contentProcessor; - return contentProcessor(parser, s, end, nextPtr); - case XML_ROLE_ATTLIST_ELEMENT_NAME: - declElementType = getElementType(parser, enc, s, next); - if (!declElementType) - return XML_ERROR_NO_MEMORY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_NAME: - declAttributeId = getAttributeId(parser, enc, s, next); - if (!declAttributeId) - return XML_ERROR_NO_MEMORY; - declAttributeIsCdata = XML_FALSE; - declAttributeType = NULL; - declAttributeIsId = XML_FALSE; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_CDATA: - declAttributeIsCdata = XML_TRUE; - declAttributeType = atypeCDATA; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ID: - declAttributeIsId = XML_TRUE; - declAttributeType = atypeID; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREF: - declAttributeType = atypeIDREF; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: - declAttributeType = atypeIDREFS; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: - declAttributeType = atypeENTITY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: - declAttributeType = atypeENTITIES; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: - declAttributeType = atypeNMTOKEN; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: - declAttributeType = atypeNMTOKENS; - checkAttListDeclHandler: - if (dtd->keepProcessing && attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTRIBUTE_ENUM_VALUE: - case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: - if (dtd->keepProcessing && attlistDeclHandler) { - const XML_Char *prefix; - if (declAttributeType) { - prefix = enumValueSep; - } - else { - prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE - ? notationPrefix - : enumValueStart); - } - if (!poolAppendString(&tempPool, prefix)) - return XML_ERROR_NO_MEMORY; - if (!poolAppend(&tempPool, enc, s, next)) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: - case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - if (!defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, declAttributeIsId, - 0, parser)) - return XML_ERROR_NO_MEMORY; - if (attlistDeclHandler && declAttributeType) { - if (*declAttributeType == XML_T(ASCII_LPAREN) - || (*declAttributeType == XML_T(ASCII_N) - && declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - poolFinish(&tempPool); - } - *eventEndPP = s; - attlistDeclHandler(handlerArg, declElementType->name, - declAttributeId->name, declAttributeType, - 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: - case XML_ROLE_FIXED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - const XML_Char *attVal; - enum XML_Error result = - storeAttributeValue(parser, enc, declAttributeIsCdata, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar, - &dtd->pool); - if (result) - return result; - attVal = poolStart(&dtd->pool); - poolFinish(&dtd->pool); - /* ID attributes aren't allowed to have a default */ - if (!defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, XML_FALSE, attVal, parser)) - return XML_ERROR_NO_MEMORY; - if (attlistDeclHandler && declAttributeType) { - if (*declAttributeType == XML_T(ASCII_LPAREN) - || (*declAttributeType == XML_T(ASCII_N) - && declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - poolFinish(&tempPool); - } - *eventEndPP = s; - attlistDeclHandler(handlerArg, declElementType->name, - declAttributeId->name, declAttributeType, - attVal, - role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_ENTITY_VALUE: - if (dtd->keepProcessing) { - enum XML_Error result = storeEntityValue(parser, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (declEntity) { - declEntity->textPtr = poolStart(&dtd->entityValuePool); - declEntity->textLen = (int)(poolLength(&dtd->entityValuePool)); - poolFinish(&dtd->entityValuePool); - if (entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - declEntity->is_param, - declEntity->textPtr, - declEntity->textLen, - curBase, 0, 0, 0); - handleDefault = XML_FALSE; - } - } - else - poolDiscard(&dtd->entityValuePool); - if (result != XML_ERROR_NONE) - return result; - } - break; - case XML_ROLE_DOCTYPE_SYSTEM_ID: -#ifdef XML_DTD - useForeignDTD = XML_FALSE; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (startDoctypeDeclHandler) { - doctypeSysid = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (doctypeSysid == NULL) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } -#ifdef XML_DTD - else - /* use externalSubsetName to make doctypeSysid non-NULL - for the case where no startDoctypeDeclHandler is set */ - doctypeSysid = externalSubsetName; -#endif /* XML_DTD */ - if (!dtd->standalone -#ifdef XML_DTD - && !paramEntityParsing -#endif /* XML_DTD */ - && notStandaloneHandler - && !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; -#ifndef XML_DTD - break; -#else /* XML_DTD */ - if (!declEntity) { - declEntity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - declEntity->publicId = NULL; - } - /* fall through */ -#endif /* XML_DTD */ - case XML_ROLE_ENTITY_SYSTEM_ID: - if (dtd->keepProcessing && declEntity) { - declEntity->systemId = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!declEntity->systemId) - return XML_ERROR_NO_MEMORY; - declEntity->base = curBase; - poolFinish(&dtd->pool); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_COMPLETE: - if (dtd->keepProcessing && declEntity && entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - declEntity->is_param, - 0,0, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - 0); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_NOTATION_NAME: - if (dtd->keepProcessing && declEntity) { - declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); - if (!declEntity->notation) - return XML_ERROR_NO_MEMORY; - poolFinish(&dtd->pool); - if (unparsedEntityDeclHandler) { - *eventEndPP = s; - unparsedEntityDeclHandler(handlerArg, - declEntity->name, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - declEntity->notation); - handleDefault = XML_FALSE; - } - else if (entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - 0,0,0, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - declEntity->notation); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_GENERAL_ENTITY_NAME: - { - if (XmlPredefinedEntityName(enc, s, next)) { - declEntity = NULL; - break; - } - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - if (declEntity->name != name) { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - declEntity->publicId = NULL; - declEntity->is_param = XML_FALSE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - declEntity->is_internal = !(parentParser || openInternalEntities); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - } - break; - case XML_ROLE_PARAM_ENTITY_NAME: -#ifdef XML_DTD - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, - name, sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - if (declEntity->name != name) { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - declEntity->publicId = NULL; - declEntity->is_param = XML_TRUE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - declEntity->is_internal = !(parentParser || openInternalEntities); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { - poolDiscard(&dtd->pool); - declEntity = NULL; - } -#else /* not XML_DTD */ - declEntity = NULL; -#endif /* XML_DTD */ - break; - case XML_ROLE_NOTATION_NAME: - declNotationPublicId = NULL; - declNotationName = NULL; - if (notationDeclHandler) { - declNotationName = poolStoreString(&tempPool, enc, s, next); - if (!declNotationName) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - if (declNotationName) { /* means notationDeclHandler != NULL */ - XML_Char *tem = poolStoreString(&tempPool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - declNotationPublicId = tem; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_SYSTEM_ID: - if (declNotationName && notationDeclHandler) { - const XML_Char *systemId - = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!systemId) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - notationDeclHandler(handlerArg, - declNotationName, - curBase, - systemId, - declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&tempPool); - break; - case XML_ROLE_NOTATION_NO_SYSTEM_ID: - if (declNotationPublicId && notationDeclHandler) { - *eventEndPP = s; - notationDeclHandler(handlerArg, - declNotationName, - curBase, - 0, - declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&tempPool); - break; - case XML_ROLE_ERROR: - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: - /* PE references in internal subset are - not allowed within declarations. */ - return XML_ERROR_PARAM_ENTITY_REF; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - default: - return XML_ERROR_SYNTAX; - } -#ifdef XML_DTD - case XML_ROLE_IGNORE_SECT: - { - enum XML_Error result; - if (defaultHandler) - reportDefault(parser, enc, s, next); - handleDefault = XML_FALSE; - result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - processor = ignoreSectionProcessor; - return result; - } - } - break; -#endif /* XML_DTD */ - case XML_ROLE_GROUP_OPEN: - if (prologState.level >= groupSize) { - if (groupSize) { - char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - groupConnector = temp; - if (dtd->scaffIndex) { - int *temp = (int *)REALLOC(dtd->scaffIndex, - groupSize * sizeof(int)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex = temp; - } - } - else { - groupConnector = (char *)MALLOC(groupSize = 32); - if (!groupConnector) - return XML_ERROR_NO_MEMORY; - } - } - groupConnector[prologState.level] = 0; - if (dtd->in_eldecl) { - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex[dtd->scaffLevel] = myindex; - dtd->scaffLevel++; - dtd->scaffold[myindex].type = XML_CTYPE_SEQ; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_GROUP_SEQUENCE: - if (groupConnector[prologState.level] == ASCII_PIPE) - return XML_ERROR_SYNTAX; - groupConnector[prologState.level] = ASCII_COMMA; - if (dtd->in_eldecl && elementDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_GROUP_CHOICE: - if (groupConnector[prologState.level] == ASCII_COMMA) - return XML_ERROR_SYNTAX; - if (dtd->in_eldecl - && !groupConnector[prologState.level] - && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - != XML_CTYPE_MIXED) - ) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_CHOICE; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - groupConnector[prologState.level] = ASCII_PIPE; - break; - case XML_ROLE_PARAM_ENTITY_REF: -#ifdef XML_DTD - case XML_ROLE_INNER_PARAM_ENTITY_REF: - dtd->hasParamEntityRefs = XML_TRUE; - if (!paramEntityParsing) - dtd->keepProcessing = dtd->standalone; - else { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); - poolDiscard(&dtd->pool); - /* first, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity handler - */ - if (prologState.documentEntity && - (dtd->standalone - ? !openInternalEntities - : !dtd->hasParamEntityRefs)) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - dtd->keepProcessing = dtd->standalone; - /* cannot report skipped entities in declarations */ - if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { - skippedEntityHandler(handlerArg, name, 1); - handleDefault = XML_FALSE; - } - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - XML_Bool betweenDecl = - (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); - result = processInternalEntity(parser, entity, betweenDecl); - if (result != XML_ERROR_NONE) - return result; - handleDefault = XML_FALSE; - break; - } - if (externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { - entity->open = XML_FALSE; - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - } - entity->open = XML_FALSE; - handleDefault = XML_FALSE; - if (!dtd->paramEntityRead) { - dtd->keepProcessing = dtd->standalone; - break; - } - } - else { - dtd->keepProcessing = dtd->standalone; - break; - } - } -#endif /* XML_DTD */ - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - break; - - /* Element declaration stuff */ - - case XML_ROLE_ELEMENT_NAME: - if (elementDeclHandler) { - declElementType = getElementType(parser, enc, s, next); - if (!declElementType) - return XML_ERROR_NO_MEMORY; - dtd->scaffLevel = 0; - dtd->scaffCount = 0; - dtd->in_eldecl = XML_TRUE; - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ANY: - case XML_ROLE_CONTENT_EMPTY: - if (dtd->in_eldecl) { - if (elementDeclHandler) { - XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); - if (!content) - return XML_ERROR_NO_MEMORY; - content->quant = XML_CQUANT_NONE; - content->name = NULL; - content->numchildren = 0; - content->children = NULL; - content->type = ((role == XML_ROLE_CONTENT_ANY) ? - XML_CTYPE_ANY : - XML_CTYPE_EMPTY); - *eventEndPP = s; - elementDeclHandler(handlerArg, declElementType->name, content); - handleDefault = XML_FALSE; - } - dtd->in_eldecl = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_PCDATA: - if (dtd->in_eldecl) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_MIXED; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ELEMENT: - quant = XML_CQUANT_NONE; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_OPT: - quant = XML_CQUANT_OPT; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_REP: - quant = XML_CQUANT_REP; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_PLUS: - quant = XML_CQUANT_PLUS; - elementContent: - if (dtd->in_eldecl) { - ELEMENT_TYPE *el; - const XML_Char *name; - int nameLen; - const char *nxt = (quant == XML_CQUANT_NONE - ? next - : next - enc->minBytesPerChar); - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffold[myindex].type = XML_CTYPE_NAME; - dtd->scaffold[myindex].quant = quant; - el = getElementType(parser, enc, s, nxt); - if (!el) - return XML_ERROR_NO_MEMORY; - name = el->name; - dtd->scaffold[myindex].name = name; - nameLen = 0; - for (; name[nameLen++]; ); - dtd->contentStringLen += nameLen; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_GROUP_CLOSE: - quant = XML_CQUANT_NONE; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_OPT: - quant = XML_CQUANT_OPT; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_REP: - quant = XML_CQUANT_REP; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_PLUS: - quant = XML_CQUANT_PLUS; - closeGroup: - if (dtd->in_eldecl) { - if (elementDeclHandler) - handleDefault = XML_FALSE; - dtd->scaffLevel--; - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; - if (dtd->scaffLevel == 0) { - if (!handleDefault) { - XML_Content *model = build_model(parser); - if (!model) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - elementDeclHandler(handlerArg, declElementType->name, model); - } - dtd->in_eldecl = XML_FALSE; - dtd->contentStringLen = 0; - } - } - break; - /* End element declaration stuff */ - - case XML_ROLE_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_COMMENT: - if (!reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_NONE: - switch (tok) { - case XML_TOK_BOM: - handleDefault = XML_FALSE; - break; - } - break; - case XML_ROLE_DOCTYPE_NONE: - if (startDoctypeDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ENTITY_NONE: - if (dtd->keepProcessing && entityDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_NOTATION_NONE: - if (notationDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTLIST_NONE: - if (dtd->keepProcessing && attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ELEMENT_NONE: - if (elementDeclHandler) - handleDefault = XML_FALSE; - break; - } /* end of big switch */ - - if (handleDefault && defaultHandler) - reportDefault(parser, enc, s, next); - - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - s = next; - tok = XmlPrologTok(enc, s, end, &next); - } - } - /* not reached */ -} - -static enum XML_Error PTRCALL -epilogProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - processor = epilogProcessor; - eventPtr = s; - for (;;) { - const char *next = NULL; - int tok = XmlPrologTok(encoding, s, end, &next); - eventEndPtr = next; - switch (tok) { - /* report partial linebreak - it might be the last token */ - case -XML_TOK_PROLOG_S: - if (defaultHandler) { - reportDefault(parser, encoding, s, next); - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - } - *nextPtr = next; - return XML_ERROR_NONE; - case XML_TOK_NONE: - *nextPtr = s; - return XML_ERROR_NONE; - case XML_TOK_PROLOG_S: - if (defaultHandler) - reportDefault(parser, encoding, s, next); - break; - case XML_TOK_PI: - if (!reportProcessingInstruction(parser, encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (!reportComment(parser, encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_INVALID: - eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - default: - return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; - } - eventPtr = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } -} - -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl) -{ - const char *textStart, *textEnd; - const char *next; - enum XML_Error result; - OPEN_INTERNAL_ENTITY *openEntity; - - if (freeInternalEntities) { - openEntity = freeInternalEntities; - freeInternalEntities = openEntity->next; - } - else { - openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY)); - if (!openEntity) - return XML_ERROR_NO_MEMORY; - } - entity->open = XML_TRUE; - entity->processed = 0; - openEntity->next = openInternalEntities; - openInternalEntities = openEntity; - openEntity->entity = entity; - openEntity->startTagLevel = tagLevel; - openEntity->betweenDecl = betweenDecl; - openEntity->internalEventPtr = NULL; - openEntity->internalEventEndPtr = NULL; - textStart = (char *)entity->textPtr; - textEnd = (char *)(entity->textPtr + entity->textLen); - -#ifdef XML_DTD - if (entity->is_param) { - int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else -#endif /* XML_DTD */ - result = doContent(parser, tagLevel, internalEncoding, textStart, - textEnd, &next, XML_FALSE); - - if (result == XML_ERROR_NONE) { - if (textEnd != next && ps_parsing == XML_SUSPENDED) { - entity->processed = (int)(next - textStart); - processor = internalEntityProcessor; - } - else { - entity->open = XML_FALSE; - openInternalEntities = openEntity->next; - /* put openEntity back in list of free instances */ - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - } - return result; -} - -static enum XML_Error PTRCALL -internalEntityProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - ENTITY *entity; - const char *textStart, *textEnd; - const char *next; - enum XML_Error result; - OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities; - if (!openEntity) - return XML_ERROR_UNEXPECTED_STATE; - - entity = openEntity->entity; - textStart = ((char *)entity->textPtr) + entity->processed; - textEnd = (char *)(entity->textPtr + entity->textLen); - -#ifdef XML_DTD - if (entity->is_param) { - int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else -#endif /* XML_DTD */ - result = doContent(parser, openEntity->startTagLevel, internalEncoding, - textStart, textEnd, &next, XML_FALSE); - - if (result != XML_ERROR_NONE) - return result; - else if (textEnd != next && ps_parsing == XML_SUSPENDED) { - entity->processed = (int)(next - (char *)entity->textPtr); - return result; - } - else { - entity->open = XML_FALSE; - openInternalEntities = openEntity->next; - /* put openEntity back in list of free instances */ - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - -#ifdef XML_DTD - if (entity->is_param) { - int tok; - processor = prologProcessor; - tok = XmlPrologTok(encoding, s, end, &next); - return doProlog(parser, encoding, s, end, tok, next, nextPtr, - (XML_Bool)!ps_finalBuffer); - } - else -#endif /* XML_DTD */ - { - processor = contentProcessor; - /* see externalEntityContentProcessor vs contentProcessor */ - return doContent(parser, parentParser ? 1 : 0, encoding, s, end, - nextPtr, (XML_Bool)!ps_finalBuffer); - } -} - -static enum XML_Error PTRCALL -errorProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - UNUSED(s); - UNUSED(end); - UNUSED(nextPtr); - - return errorCode; -} - -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, - end, pool); - if (result) - return result; - if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) - poolChop(pool); - if (!poolAppendChar(pool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - return XML_ERROR_NONE; -} - -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - for (;;) { - const char *next; - int tok = XmlAttributeValueTok(enc, ptr, end, &next); - switch (tok) { - case XML_TOK_NONE: - return XML_ERROR_NONE; - case XML_TOK_INVALID: - if (enc == encoding) - eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, ptr); - if (n < 0) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - if (!isCdata - && n == 0x20 /* space */ - && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - n = XmlEncode(n, (ICHAR *)buf); - if (!n) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - for (i = 0; i < n; i++) { - if (!poolAppendChar(pool, buf[i])) - return XML_ERROR_NO_MEMORY; - } - } - break; - case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, ptr, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_TRAILING_CR: - next = ptr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_ATTRIBUTE_VALUE_S: - case XML_TOK_DATA_NEWLINE: - if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - if (!poolAppendChar(pool, 0x20)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - char checkEntityDecl; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (!poolAppendChar(pool, ch)) - return XML_ERROR_NO_MEMORY; - break; - } - name = poolStoreString(&temp2Pool, enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&temp2Pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal. - */ - if (pool == &dtd->pool) /* are we called from prolog? */ - checkEntityDecl = -#ifdef XML_DTD - prologState.documentEntity && -#endif /* XML_DTD */ - (dtd->standalone - ? !openInternalEntities - : !dtd->hasParamEntityRefs); - else /* if (pool == &tempPool): we are called from content */ - checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; - if (checkEntityDecl) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - /* Cannot report skipped entity here - see comments on - skippedEntityHandler. - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - */ - /* Cannot call the default handler because this would be - out of sync with the call to the startElementHandler. - if ((pool == &tempPool) && defaultHandler) - reportDefault(parser, enc, ptr, next); - */ - break; - } - if (entity->open) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_RECURSIVE_ENTITY_REF; - } - if (entity->notation) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BINARY_ENTITY_REF; - } - if (!entity->textPtr) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; - } - else { - enum XML_Error result; - const XML_Char *textEnd = entity->textPtr + entity->textLen; - entity->open = XML_TRUE; - result = appendAttributeValue(parser, internalEncoding, isCdata, - (char *)entity->textPtr, - (char *)textEnd, pool); - entity->open = XML_FALSE; - if (result) - return result; - } - } - break; - default: - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_UNEXPECTED_STATE; - } - ptr = next; - } - /* not reached */ -} - -static enum XML_Error -storeEntityValue(XML_Parser parser, - const ENCODING *enc, - const char *entityTextPtr, - const char *entityTextEnd) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - STRING_POOL *pool = &(dtd->entityValuePool); - enum XML_Error result = XML_ERROR_NONE; -#ifdef XML_DTD - int oldInEntityValue = prologState.inEntityValue; - prologState.inEntityValue = 1; -#endif /* XML_DTD */ - /* never return Null for the value argument in EntityDeclHandler, - since this would indicate an external entity; therefore we - have to make sure that entityValuePool.start is not null */ - if (!pool->blocks) { - if (!poolGrow(pool)) - return XML_ERROR_NO_MEMORY; - } - - for (;;) { - const char *next; - int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: -#ifdef XML_DTD - if (isParamEntity || enc != encoding) { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&tempPool, enc, - entityTextPtr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); - poolDiscard(&tempPool); - if (!entity) { - /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ - /* cannot report skipped entity here - see comments on - skippedEntityHandler - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - */ - dtd->keepProcessing = dtd->standalone; - goto endEntityValue; - } - if (entity->open) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_RECURSIVE_ENTITY_REF; - goto endEntityValue; - } - if (entity->systemId) { - if (externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { - entity->open = XML_FALSE; - result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; - goto endEntityValue; - } - entity->open = XML_FALSE; - if (!dtd->paramEntityRead) - dtd->keepProcessing = dtd->standalone; - } - else - dtd->keepProcessing = dtd->standalone; - } - else { - entity->open = XML_TRUE; - result = storeEntityValue(parser, - internalEncoding, - (char *)entity->textPtr, - (char *)(entity->textPtr - + entity->textLen)); - entity->open = XML_FALSE; - if (result) - goto endEntityValue; - } - break; - } -#endif /* XML_DTD */ - /* In the internal subset, PE references are not legal - within markup declarations, e.g entity values in this case. */ - eventPtr = entityTextPtr; - result = XML_ERROR_PARAM_ENTITY_REF; - goto endEntityValue; - case XML_TOK_NONE: - result = XML_ERROR_NONE; - goto endEntityValue; - case XML_TOK_ENTITY_REF: - case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, entityTextPtr, next)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - break; - case XML_TOK_TRAILING_CR: - next = entityTextPtr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_DATA_NEWLINE: - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = 0xA; - break; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, entityTextPtr); - if (n < 0) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - n = XmlEncode(n, (ICHAR *)buf); - if (!n) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - for (i = 0; i < n; i++) { - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = buf[i]; - } - } - break; - case XML_TOK_PARTIAL: - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - case XML_TOK_INVALID: - if (enc == encoding) - eventPtr = next; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - default: - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_UNEXPECTED_STATE; - goto endEntityValue; - } - entityTextPtr = next; - } -endEntityValue: -#ifdef XML_DTD - prologState.inEntityValue = oldInEntityValue; -#endif /* XML_DTD */ - return result; -} - -static void FASTCALL -normalizeLines(XML_Char *s) -{ - XML_Char *p; - for (;; s++) { - if (*s == XML_T('\0')) - return; - if (*s == 0xD) - break; - } - p = s; - do { - if (*s == 0xD) { - *p++ = 0xA; - if (*++s == 0xA) - s++; - } - else - *p++ = *s++; - } while (*s); - *p = XML_T('\0'); -} - -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - const XML_Char *target; - XML_Char *data; - const char *tem; - if (!processingInstructionHandler) { - if (defaultHandler) - reportDefault(parser, enc, start, end); - return 1; - } - start += enc->minBytesPerChar * 2; - tem = start + XmlNameLength(enc, start); - target = poolStoreString(&tempPool, enc, start, tem); - if (!target) - return 0; - poolFinish(&tempPool); - data = poolStoreString(&tempPool, enc, - XmlSkipS(enc, tem), - end - enc->minBytesPerChar*2); - if (!data) - return 0; - normalizeLines(data); - processingInstructionHandler(handlerArg, target, data); - poolClear(&tempPool); - return 1; -} - -static int -reportComment(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - XML_Char *data; - if (!commentHandler) { - if (defaultHandler) - reportDefault(parser, enc, start, end); - return 1; - } - data = poolStoreString(&tempPool, - enc, - start + enc->minBytesPerChar * 4, - end - enc->minBytesPerChar * 3); - if (!data) - return 0; - normalizeLines(data); - commentHandler(handlerArg, data); - poolClear(&tempPool); - return 1; -} - -static void -reportDefault(XML_Parser parser, const ENCODING *enc, - const char *s, const char *end) -{ - if (MUST_CONVERT(enc, s)) { - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - do { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = s; - defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf)); - *eventPP = s; - } while (s != end); - } - else - defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); -} - - -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, - XML_Bool isId, const XML_Char *value, XML_Parser parser) -{ - DEFAULT_ATTRIBUTE *att; - if (value || isId) { - /* The handling of default attributes gets messed up if we have - a default which duplicates a non-default. */ - int i; - for (i = 0; i < type->nDefaultAtts; i++) - if (attId == type->defaultAtts[i].id) - return 1; - if (isId && !type->idAtt && !attId->xmlns) - type->idAtt = attId; - } - if (type->nDefaultAtts == type->allocDefaultAtts) { - if (type->allocDefaultAtts == 0) { - type->allocDefaultAtts = 8; - type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts - * sizeof(DEFAULT_ATTRIBUTE)); - if (!type->defaultAtts) - return 0; - } - else { - DEFAULT_ATTRIBUTE *temp; - int count = type->allocDefaultAtts * 2; - temp = (DEFAULT_ATTRIBUTE *) - REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); - if (temp == NULL) - return 0; - type->allocDefaultAtts = count; - type->defaultAtts = temp; - } - } - att = type->defaultAtts + type->nDefaultAtts; - att->id = attId; - att->value = value; - att->isCdata = isCdata; - if (!isCdata) - attId->maybeTokenized = XML_TRUE; - type->nDefaultAtts += 1; - return 1; -} - -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *name; - for (name = elementType->name; *name; name++) { - if (*name == XML_T(ASCII_COLON)) { - PREFIX *prefix; - const XML_Char *s; - for (s = elementType->name; s != name; s++) { - if (!poolAppendChar(&dtd->pool, *s)) - return 0; - } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return 0; - prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (!prefix) - return 0; - if (prefix->name == poolStart(&dtd->pool)) - poolFinish(&dtd->pool); - else - poolDiscard(&dtd->pool); - elementType->prefix = prefix; - - } - } - return 1; -} - -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - ATTRIBUTE_ID *id; - const XML_Char *name; - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; - name = poolStoreString(&dtd->pool, enc, start, end); - if (!name) - return NULL; - /* skip quotation mark - its storage will be re-used (like in name[-1]) */ - ++name; - id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); - if (!id) - return NULL; - if (id->name != name) - poolDiscard(&dtd->pool); - else { - poolFinish(&dtd->pool); - if (!ns) - ; - else if (name[0] == XML_T(ASCII_x) - && name[1] == XML_T(ASCII_m) - && name[2] == XML_T(ASCII_l) - && name[3] == XML_T(ASCII_n) - && name[4] == XML_T(ASCII_s) - && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { - if (name[5] == XML_T('\0')) - id->prefix = &dtd->defaultPrefix; - else - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX)); - id->xmlns = XML_TRUE; - } - else { - int i; - for (i = 0; name[i]; i++) { - /* attributes without prefix are *not* in the default namespace */ - if (name[i] == XML_T(ASCII_COLON)) { - int j; - for (j = 0; j < i; j++) { - if (!poolAppendChar(&dtd->pool, name[j])) - return NULL; - } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (id->prefix->name == poolStart(&dtd->pool)) - poolFinish(&dtd->pool); - else - poolDiscard(&dtd->pool); - break; - } - } - } - } - return id; -} - -#define CONTEXT_SEP XML_T(ASCII_FF) - -static const XML_Char * -getContext(XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - HASH_TABLE_ITER iter; - XML_Bool needSep = XML_FALSE; - - if (dtd->defaultPrefix.binding) { - int i; - int len; - if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) - return NULL; - len = dtd->defaultPrefix.binding->uriLen; - if (namespaceSeparator) - len--; - for (i = 0; i < len; i++) - if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) - return NULL; - needSep = XML_TRUE; - } - - hashTableIterInit(&iter, &(dtd->prefixes)); - for (;;) { - int i; - int len; - const XML_Char *s; - PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); - if (!prefix) - break; - if (!prefix->binding) - continue; - if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) - return NULL; - for (s = prefix->name; *s; s++) - if (!poolAppendChar(&tempPool, *s)) - return NULL; - if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) - return NULL; - len = prefix->binding->uriLen; - if (namespaceSeparator) - len--; - for (i = 0; i < len; i++) - if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) - return NULL; - needSep = XML_TRUE; - } - - - hashTableIterInit(&iter, &(dtd->generalEntities)); - for (;;) { - const XML_Char *s; - ENTITY *e = (ENTITY *)hashTableIterNext(&iter); - if (!e) - break; - if (!e->open) - continue; - if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) - return NULL; - for (s = e->name; *s; s++) - if (!poolAppendChar(&tempPool, *s)) - return 0; - needSep = XML_TRUE; - } - - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return NULL; - return tempPool.start; -} - -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *s = context; - - while (*context != XML_T('\0')) { - if (*s == CONTEXT_SEP || *s == XML_T('\0')) { - ENTITY *e; - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0); - if (e) - e->open = XML_TRUE; - if (*s != XML_T('\0')) - s++; - context = s; - poolDiscard(&tempPool); - } - else if (*s == XML_T(ASCII_EQUALS)) { - PREFIX *prefix; - if (poolLength(&tempPool) == 0) - prefix = &dtd->defaultPrefix; - else { - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool), - sizeof(PREFIX)); - if (!prefix) - return XML_FALSE; - if (prefix->name == poolStart(&tempPool)) { - prefix->name = poolCopyString(&dtd->pool, prefix->name); - if (!prefix->name) - return XML_FALSE; - } - poolDiscard(&tempPool); - } - for (context = s + 1; - *context != CONTEXT_SEP && *context != XML_T('\0'); - context++) - if (!poolAppendChar(&tempPool, *context)) - return XML_FALSE; - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - if (addBinding(parser, prefix, NULL, poolStart(&tempPool), - &inheritedBindings) != XML_ERROR_NONE) - return XML_FALSE; - poolDiscard(&tempPool); - if (*context != XML_T('\0')) - ++context; - s = context; - } - else { - if (!poolAppendChar(&tempPool, *s)) - return XML_FALSE; - s++; - } - } - return XML_TRUE; -} - -static void FASTCALL -normalizePublicId(XML_Char *publicId) -{ - XML_Char *p = publicId; - XML_Char *s; - for (s = publicId; *s; s++) { - switch (*s) { - case 0x20: - case 0xD: - case 0xA: - if (p != publicId && p[-1] != 0x20) - *p++ = 0x20; - break; - default: - *p++ = *s; - } - } - if (p != publicId && p[-1] == 0x20) - --p; - *p = XML_T('\0'); -} - -static DTD * -dtdCreate(const XML_Memory_Handling_Suite *ms) -{ - DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); - if (p == NULL) - return p; - poolInit(&(p->pool), ms); - poolInit(&(p->entityValuePool), ms); - hashTableInit(&(p->generalEntities), ms); - hashTableInit(&(p->elementTypes), ms); - hashTableInit(&(p->attributeIds), ms); - hashTableInit(&(p->prefixes), ms); -#ifdef XML_DTD - p->paramEntityRead = XML_FALSE; - hashTableInit(&(p->paramEntities), ms); -#endif /* XML_DTD */ - p->defaultPrefix.name = NULL; - p->defaultPrefix.binding = NULL; - - p->in_eldecl = XML_FALSE; - p->scaffIndex = NULL; - p->scaffold = NULL; - p->scaffLevel = 0; - p->scaffSize = 0; - p->scaffCount = 0; - p->contentStringLen = 0; - - p->keepProcessing = XML_TRUE; - p->hasParamEntityRefs = XML_FALSE; - p->standalone = XML_FALSE; - return p; -} - -static void -dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - hashTableIterInit(&iter, &(p->elementTypes)); - for (;;) { - ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); - } - hashTableClear(&(p->generalEntities)); -#ifdef XML_DTD - p->paramEntityRead = XML_FALSE; - hashTableClear(&(p->paramEntities)); -#endif /* XML_DTD */ - hashTableClear(&(p->elementTypes)); - hashTableClear(&(p->attributeIds)); - hashTableClear(&(p->prefixes)); - poolClear(&(p->pool)); - poolClear(&(p->entityValuePool)); - p->defaultPrefix.name = NULL; - p->defaultPrefix.binding = NULL; - - p->in_eldecl = XML_FALSE; - - ms->free_fcn(p->scaffIndex); - p->scaffIndex = NULL; - ms->free_fcn(p->scaffold); - p->scaffold = NULL; - - p->scaffLevel = 0; - p->scaffSize = 0; - p->scaffCount = 0; - p->contentStringLen = 0; - - p->keepProcessing = XML_TRUE; - p->hasParamEntityRefs = XML_FALSE; - p->standalone = XML_FALSE; -} - -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - hashTableIterInit(&iter, &(p->elementTypes)); - for (;;) { - ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); - } - hashTableDestroy(&(p->generalEntities)); -#ifdef XML_DTD - hashTableDestroy(&(p->paramEntities)); -#endif /* XML_DTD */ - hashTableDestroy(&(p->elementTypes)); - hashTableDestroy(&(p->attributeIds)); - hashTableDestroy(&(p->prefixes)); - poolDestroy(&(p->pool)); - poolDestroy(&(p->entityValuePool)); - if (isDocEntity) { - ms->free_fcn(p->scaffIndex); - ms->free_fcn(p->scaffold); - } - ms->free_fcn(p); -} - -/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. - The new DTD has already been initialized. -*/ -static int -dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - - /* Copy the prefix table. */ - - hashTableIterInit(&iter, &(oldDtd->prefixes)); - for (;;) { - const XML_Char *name; - const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); - if (!oldP) - break; - name = poolCopyString(&(newDtd->pool), oldP->name); - if (!name) - return 0; - if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) - return 0; - } - - hashTableIterInit(&iter, &(oldDtd->attributeIds)); - - /* Copy the attribute id table. */ - - for (;;) { - ATTRIBUTE_ID *newA; - const XML_Char *name; - const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); - - if (!oldA) - break; - /* Remember to allocate the scratch byte before the name. */ - if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) - return 0; - name = poolCopyString(&(newDtd->pool), oldA->name); - if (!name) - return 0; - ++name; - newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name, - sizeof(ATTRIBUTE_ID)); - if (!newA) - return 0; - newA->maybeTokenized = oldA->maybeTokenized; - if (oldA->prefix) { - newA->xmlns = oldA->xmlns; - if (oldA->prefix == &oldDtd->defaultPrefix) - newA->prefix = &newDtd->defaultPrefix; - else - newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), - oldA->prefix->name, 0); - } - } - - /* Copy the element type table. */ - - hashTableIterInit(&iter, &(oldDtd->elementTypes)); - - for (;;) { - int i; - ELEMENT_TYPE *newE; - const XML_Char *name; - const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!oldE) - break; - name = poolCopyString(&(newDtd->pool), oldE->name); - if (!name) - return 0; - newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name, - sizeof(ELEMENT_TYPE)); - if (!newE) - return 0; - if (oldE->nDefaultAtts) { - newE->defaultAtts = (DEFAULT_ATTRIBUTE *) - ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); - if (!newE->defaultAtts) { - ms->free_fcn(newE); - return 0; - } - } - if (oldE->idAtt) - newE->idAtt = (ATTRIBUTE_ID *) - lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0); - newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; - if (oldE->prefix) - newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), - oldE->prefix->name, 0); - for (i = 0; i < newE->nDefaultAtts; i++) { - newE->defaultAtts[i].id = (ATTRIBUTE_ID *) - lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); - newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; - if (oldE->defaultAtts[i].value) { - newE->defaultAtts[i].value - = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); - if (!newE->defaultAtts[i].value) - return 0; - } - else - newE->defaultAtts[i].value = NULL; - } - } - - /* Copy the entity tables. */ - if (!copyEntityTable(oldParser, - &(newDtd->generalEntities), - &(newDtd->pool), - &(oldDtd->generalEntities))) - return 0; - -#ifdef XML_DTD - if (!copyEntityTable(oldParser, - &(newDtd->paramEntities), - &(newDtd->pool), - &(oldDtd->paramEntities))) - return 0; - newDtd->paramEntityRead = oldDtd->paramEntityRead; -#endif /* XML_DTD */ - - newDtd->keepProcessing = oldDtd->keepProcessing; - newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; - newDtd->standalone = oldDtd->standalone; - - /* Don't want deep copying for scaffolding */ - newDtd->in_eldecl = oldDtd->in_eldecl; - newDtd->scaffold = oldDtd->scaffold; - newDtd->contentStringLen = oldDtd->contentStringLen; - newDtd->scaffSize = oldDtd->scaffSize; - newDtd->scaffLevel = oldDtd->scaffLevel; - newDtd->scaffIndex = oldDtd->scaffIndex; - - return 1; -} /* End dtdCopy */ - -static int -copyEntityTable(XML_Parser oldParser, - HASH_TABLE *newTable, - STRING_POOL *newPool, - const HASH_TABLE *oldTable) -{ - HASH_TABLE_ITER iter; - const XML_Char *cachedOldBase = NULL; - const XML_Char *cachedNewBase = NULL; - - hashTableIterInit(&iter, oldTable); - - for (;;) { - ENTITY *newE; - const XML_Char *name; - const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); - if (!oldE) - break; - name = poolCopyString(newPool, oldE->name); - if (!name) - return 0; - newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY)); - if (!newE) - return 0; - if (oldE->systemId) { - const XML_Char *tem = poolCopyString(newPool, oldE->systemId); - if (!tem) - return 0; - newE->systemId = tem; - if (oldE->base) { - if (oldE->base == cachedOldBase) - newE->base = cachedNewBase; - else { - cachedOldBase = oldE->base; - tem = poolCopyString(newPool, cachedOldBase); - if (!tem) - return 0; - cachedNewBase = newE->base = tem; - } - } - if (oldE->publicId) { - tem = poolCopyString(newPool, oldE->publicId); - if (!tem) - return 0; - newE->publicId = tem; - } - } - else { - const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, - oldE->textLen); - if (!tem) - return 0; - newE->textPtr = tem; - newE->textLen = oldE->textLen; - } - if (oldE->notation) { - const XML_Char *tem = poolCopyString(newPool, oldE->notation); - if (!tem) - return 0; - newE->notation = tem; - } - newE->is_param = oldE->is_param; - newE->is_internal = oldE->is_internal; - } - return 1; -} - -#define INIT_POWER 6 - -static XML_Bool FASTCALL -keyeq(KEY s1, KEY s2) -{ - for (; *s1 == *s2; s1++, s2++) - if (*s1 == 0) - return XML_TRUE; - return XML_FALSE; -} - -static unsigned long FASTCALL -hash(XML_Parser parser, KEY s) -{ - unsigned long h = hash_secret_salt; - while (*s) - h = CHAR_HASH(h, *s++); - return h; -} - -static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) -{ - size_t i; - if (table->size == 0) { - size_t tsize; - if (!createSize) - return NULL; - table->power = INIT_POWER; - /* table->size is a power of 2 */ - table->size = (size_t)1 << INIT_POWER; - tsize = table->size * sizeof(NAMED *); - table->v = (NAMED **)table->mem->malloc_fcn(tsize); - if (!table->v) { - table->size = 0; - return NULL; - } - memset(table->v, 0, tsize); - i = hash(parser, name) & ((unsigned long)table->size - 1); - } - else { - unsigned long h = hash(parser, name); - unsigned long mask = (unsigned long)table->size - 1; - unsigned char step = 0; - i = h & mask; - while (table->v[i]) { - if (keyeq(name, table->v[i]->name)) - return table->v[i]; - if (!step) - step = PROBE_STEP(h, mask, table->power); - i < step ? (i += table->size - step) : (i -= step); - } - if (!createSize) - return NULL; - - /* check for overflow (table is half full) */ - if (table->used >> (table->power - 1)) { - unsigned char newPower = table->power + 1; - size_t newSize = (size_t)1 << newPower; - unsigned long newMask = (unsigned long)newSize - 1; - size_t tsize = newSize * sizeof(NAMED *); - NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); - if (!newV) - return NULL; - memset(newV, 0, tsize); - for (i = 0; i < table->size; i++) - if (table->v[i]) { - unsigned long newHash = hash(parser, table->v[i]->name); - size_t j = newHash & newMask; - step = 0; - while (newV[j]) { - if (!step) - step = PROBE_STEP(newHash, newMask, newPower); - j < step ? (j += newSize - step) : (j -= step); - } - newV[j] = table->v[i]; - } - table->mem->free_fcn(table->v); - table->v = newV; - table->power = newPower; - table->size = newSize; - i = h & newMask; - step = 0; - while (table->v[i]) { - if (!step) - step = PROBE_STEP(h, newMask, newPower); - i < step ? (i += newSize - step) : (i -= step); - } - } - } - table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); - if (!table->v[i]) - return NULL; - memset(table->v[i], 0, createSize); - table->v[i]->name = name; - (table->used)++; - return table->v[i]; -} - -static void FASTCALL -hashTableClear(HASH_TABLE *table) -{ - size_t i; - for (i = 0; i < table->size; i++) { - table->mem->free_fcn(table->v[i]); - table->v[i] = NULL; - } - table->used = 0; -} - -static void FASTCALL -hashTableDestroy(HASH_TABLE *table) -{ - size_t i; - for (i = 0; i < table->size; i++) - table->mem->free_fcn(table->v[i]); - table->mem->free_fcn(table->v); -} - -static void FASTCALL -hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) -{ - p->power = 0; - p->size = 0; - p->used = 0; - p->v = NULL; - p->mem = ms; -} - -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) -{ - iter->p = table->v; - iter->end = iter->p + table->size; -} - -static NAMED * FASTCALL -hashTableIterNext(HASH_TABLE_ITER *iter) -{ - while (iter->p != iter->end) { - NAMED *tem = *(iter->p)++; - if (tem) - return tem; - } - return NULL; -} - -static void FASTCALL -poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) -{ - pool->blocks = NULL; - pool->freeBlocks = NULL; - pool->start = NULL; - pool->ptr = NULL; - pool->end = NULL; - pool->mem = ms; -} - -static void FASTCALL -poolClear(STRING_POOL *pool) -{ - if (!pool->freeBlocks) - pool->freeBlocks = pool->blocks; - else { - BLOCK *p = pool->blocks; - while (p) { - BLOCK *tem = p->next; - p->next = pool->freeBlocks; - pool->freeBlocks = p; - p = tem; - } - } - pool->blocks = NULL; - pool->start = NULL; - pool->ptr = NULL; - pool->end = NULL; -} - -static void FASTCALL -poolDestroy(STRING_POOL *pool) -{ - BLOCK *p = pool->blocks; - while (p) { - BLOCK *tem = p->next; - pool->mem->free_fcn(p); - p = tem; - } - p = pool->freeBlocks; - while (p) { - BLOCK *tem = p->next; - pool->mem->free_fcn(p); - p = tem; - } -} - -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!pool->ptr && !poolGrow(pool)) - return NULL; - for (;;) { - XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); - if (ptr == end) - break; - if (!poolGrow(pool)) - return NULL; - } - return pool->start; -} - -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s) -{ - do { - if (!poolAppendChar(pool, *s)) - return NULL; - } while (*s++); - s = pool->start; - poolFinish(pool); - return s; -} - -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) -{ - if (!pool->ptr && !poolGrow(pool)) - return NULL; - for (; n > 0; --n, s++) { - if (!poolAppendChar(pool, *s)) - return NULL; - } - s = pool->start; - poolFinish(pool); - return s; -} - -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s) -{ - while (*s) { - if (!poolAppendChar(pool, *s)) - return NULL; - s++; - } - return pool->start; -} - -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!poolAppend(pool, enc, ptr, end)) - return NULL; - if (pool->ptr == pool->end && !poolGrow(pool)) - return NULL; - *(pool->ptr)++ = 0; - return pool->start; -} - -static XML_Bool FASTCALL -poolGrow(STRING_POOL *pool) -{ - if (pool->freeBlocks) { - if (pool->start == 0) { - pool->blocks = pool->freeBlocks; - pool->freeBlocks = pool->freeBlocks->next; - pool->blocks->next = NULL; - pool->start = pool->blocks->s; - pool->end = pool->start + pool->blocks->size; - pool->ptr = pool->start; - return XML_TRUE; - } - if (pool->end - pool->start < pool->freeBlocks->size) { - BLOCK *tem = pool->freeBlocks->next; - pool->freeBlocks->next = pool->blocks; - pool->blocks = pool->freeBlocks; - pool->freeBlocks = tem; - memcpy(pool->blocks->s, pool->start, - (pool->end - pool->start) * sizeof(XML_Char)); - pool->ptr = pool->blocks->s + (pool->ptr - pool->start); - pool->start = pool->blocks->s; - pool->end = pool->start + pool->blocks->size; - return XML_TRUE; - } - } - if (pool->blocks && pool->start == pool->blocks->s) { - int blockSize = (int)(pool->end - pool->start)*2; - BLOCK *temp = (BLOCK *) - pool->mem->realloc_fcn(pool->blocks, - (offsetof(BLOCK, s) - + blockSize * sizeof(XML_Char))); - if (temp == NULL) - return XML_FALSE; - pool->blocks = temp; - pool->blocks->size = blockSize; - pool->ptr = pool->blocks->s + (pool->ptr - pool->start); - pool->start = pool->blocks->s; - pool->end = pool->start + blockSize; - } - else { - BLOCK *tem; - int blockSize = (int)(pool->end - pool->start); - if (blockSize < INIT_BLOCK_SIZE) - blockSize = INIT_BLOCK_SIZE; - else - blockSize *= 2; - tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) - + blockSize * sizeof(XML_Char)); - if (!tem) - return XML_FALSE; - tem->size = blockSize; - tem->next = pool->blocks; - pool->blocks = tem; - if (pool->ptr != pool->start) - memcpy(tem->s, pool->start, - (pool->ptr - pool->start) * sizeof(XML_Char)); - pool->ptr = tem->s + (pool->ptr - pool->start); - pool->start = tem->s; - pool->end = tem->s + blockSize; - } - return XML_TRUE; -} - -static int FASTCALL -nextScaffoldPart(XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - CONTENT_SCAFFOLD * me; - int next; - - if (!dtd->scaffIndex) { - dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); - if (!dtd->scaffIndex) - return -1; - dtd->scaffIndex[0] = 0; - } - - if (dtd->scaffCount >= dtd->scaffSize) { - CONTENT_SCAFFOLD *temp; - if (dtd->scaffold) { - temp = (CONTENT_SCAFFOLD *) - REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; - dtd->scaffSize *= 2; - } - else { - temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS - * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; - dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; - } - dtd->scaffold = temp; - } - next = dtd->scaffCount++; - me = &dtd->scaffold[next]; - if (dtd->scaffLevel) { - CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; - if (parent->lastchild) { - dtd->scaffold[parent->lastchild].nextsib = next; - } - if (!parent->childcnt) - parent->firstchild = next; - parent->lastchild = next; - parent->childcnt++; - } - me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; - return next; -} - -static void -build_node(XML_Parser parser, - int src_node, - XML_Content *dest, - XML_Content **contpos, - XML_Char **strpos) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - dest->type = dtd->scaffold[src_node].type; - dest->quant = dtd->scaffold[src_node].quant; - if (dest->type == XML_CTYPE_NAME) { - const XML_Char *src; - dest->name = *strpos; - src = dtd->scaffold[src_node].name; - for (;;) { - *(*strpos)++ = *src; - if (!*src) - break; - src++; - } - dest->numchildren = 0; - dest->children = NULL; - } - else { - unsigned int i; - int cn; - dest->numchildren = dtd->scaffold[src_node].childcnt; - dest->children = *contpos; - *contpos += dest->numchildren; - for (i = 0, cn = dtd->scaffold[src_node].firstchild; - i < dest->numchildren; - i++, cn = dtd->scaffold[cn].nextsib) { - build_node(parser, cn, &(dest->children[i]), contpos, strpos); - } - dest->name = NULL; - } -} - -static XML_Content * -build_model (XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - XML_Content *ret; - XML_Content *cpos; - XML_Char * str; - int allocsize = (dtd->scaffCount * sizeof(XML_Content) - + (dtd->contentStringLen * sizeof(XML_Char))); - - ret = (XML_Content *)MALLOC(allocsize); - if (!ret) - return NULL; - - str = (XML_Char *) (&ret[dtd->scaffCount]); - cpos = &ret[1]; - - build_node(parser, 0, ret, &cpos, &str); - return ret; -} - -static ELEMENT_TYPE * -getElementType(XML_Parser parser, - const ENCODING *enc, - const char *ptr, - const char *end) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); - ELEMENT_TYPE *ret; - - if (!name) - return NULL; - ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); - if (!ret) - return NULL; - if (ret->name != name) - poolDiscard(&dtd->pool); - else { - poolFinish(&dtd->pool); - if (!setElementTypePrefix(parser, ret)) - return NULL; - } - return ret; -} diff --git a/third-party/libstudxml/libstudxml/details/expat/xmlrole.c b/third-party/libstudxml/libstudxml/details/expat/xmlrole.c deleted file mode 100644 index b0586e6f..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/xmlrole.c +++ /dev/null @@ -1,1470 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include - -#include - -#include -#include -#include -#include - -/* Doesn't check: - - that ,| are not mixed in a model group - content of literals - -*/ - -static const char KW_ANY[] = { - ASCII_A, ASCII_N, ASCII_Y, '\0' }; -static const char KW_ATTLIST[] = { - ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; -static const char KW_CDATA[] = { - ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_DOCTYPE[] = { - ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; -static const char KW_ELEMENT[] = { - ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; -static const char KW_EMPTY[] = { - ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; -static const char KW_ENTITIES[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, - '\0' }; -static const char KW_ENTITY[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; -static const char KW_FIXED[] = { - ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; -static const char KW_ID[] = { - ASCII_I, ASCII_D, '\0' }; -static const char KW_IDREF[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; -static const char KW_IDREFS[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; -#ifdef XML_DTD -static const char KW_IGNORE[] = { - ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; -#endif -static const char KW_IMPLIED[] = { - ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; -#ifdef XML_DTD -static const char KW_INCLUDE[] = { - ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; -#endif -static const char KW_NDATA[] = { - ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_NMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; -static const char KW_NMTOKENS[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, - '\0' }; -static const char KW_NOTATION[] = - { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, - '\0' }; -static const char KW_PCDATA[] = { - ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_PUBLIC[] = { - ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; -static const char KW_REQUIRED[] = { - ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, - '\0' }; -static const char KW_SYSTEM[] = { - ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; - -#ifndef MIN_BYTES_PER_CHAR -#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) -#endif - -#ifdef XML_DTD -#define setTopLevel(state) \ - ((state)->handler = ((state)->documentEntity \ - ? internalSubset \ - : externalSubset1)) -#else /* not XML_DTD */ -#define setTopLevel(state) ((state)->handler = internalSubset) -#endif /* not XML_DTD */ - -typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); - -static PROLOG_HANDLER - prolog0, prolog1, prolog2, - doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, - internalSubset, - entity0, entity1, entity2, entity3, entity4, entity5, entity6, - entity7, entity8, entity9, entity10, - notation0, notation1, notation2, notation3, notation4, - attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, - attlist7, attlist8, attlist9, - element0, element1, element2, element3, element4, element5, element6, - element7, -#ifdef XML_DTD - externalSubset0, externalSubset1, - condSect0, condSect1, condSect2, -#endif /* XML_DTD */ - declClose, - error; - -static int FASTCALL common(PROLOG_STATE *state, int tok); - -static int PTRCALL -prolog0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - state->handler = prolog1; - return XML_ROLE_NONE; - case XML_TOK_XML_DECL: - state->handler = prolog1; - return XML_ROLE_XML_DECL; - case XML_TOK_PI: - state->handler = prolog1; - return XML_ROLE_PI; - case XML_TOK_COMMENT: - state->handler = prolog1; - return XML_ROLE_COMMENT; - case XML_TOK_BOM: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) - break; - state->handler = doctype0; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -prolog1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_BOM: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) - break; - state->handler = doctype0; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -prolog2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -doctype0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = doctype1; - return XML_ROLE_DOCTYPE_NAME; - } - return common(state, tok); -} - -static int PTRCALL -doctype1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = internalSubset; - return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = doctype3; - return XML_ROLE_DOCTYPE_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = doctype2; - return XML_ROLE_DOCTYPE_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -doctype2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_LITERAL: - state->handler = doctype3; - return XML_ROLE_DOCTYPE_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -doctype3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_LITERAL: - state->handler = doctype4; - return XML_ROLE_DOCTYPE_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -doctype4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = internalSubset; - return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - } - return common(state, tok); -} - -static int PTRCALL -doctype5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - } - return common(state, tok); -} - -static int PTRCALL -internalSubset(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ENTITY)) { - state->handler = entity0; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ATTLIST)) { - state->handler = attlist0; - return XML_ROLE_ATTLIST_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ELEMENT)) { - state->handler = element0; - return XML_ROLE_ELEMENT_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_NOTATION)) { - state->handler = notation0; - return XML_ROLE_NOTATION_NONE; - } - break; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_PARAM_ENTITY_REF: - return XML_ROLE_PARAM_ENTITY_REF; - case XML_TOK_CLOSE_BRACKET: - state->handler = doctype5; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_NONE: - return XML_ROLE_NONE; - } - return common(state, tok); -} - -#ifdef XML_DTD - -static int PTRCALL -externalSubset0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - state->handler = externalSubset1; - if (tok == XML_TOK_XML_DECL) - return XML_ROLE_TEXT_DECL; - return externalSubset1(state, tok, ptr, end, enc); -} - -static int PTRCALL -externalSubset1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_COND_SECT_OPEN: - state->handler = condSect0; - return XML_ROLE_NONE; - case XML_TOK_COND_SECT_CLOSE: - if (state->includeLevel == 0) - break; - state->includeLevel -= 1; - return XML_ROLE_NONE; - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_CLOSE_BRACKET: - break; - case XML_TOK_NONE: - if (state->includeLevel) - break; - return XML_ROLE_NONE; - default: - return internalSubset(state, tok, ptr, end, enc); - } - return common(state, tok); -} - -#endif /* XML_DTD */ - -static int PTRCALL -entity0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_PERCENT: - state->handler = entity1; - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = entity2; - return XML_ROLE_GENERAL_ENTITY_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = entity7; - return XML_ROLE_PARAM_ENTITY_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = entity4; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = entity3; - return XML_ROLE_ENTITY_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -entity3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity4; - return XML_ROLE_ENTITY_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity5; - return XML_ROLE_ENTITY_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ENTITY_COMPLETE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { - state->handler = entity6; - return XML_ROLE_ENTITY_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -entity6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_NOTATION_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = entity9; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = entity8; - return XML_ROLE_ENTITY_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -entity8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity9; - return XML_ROLE_ENTITY_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity9(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity10; - return XML_ROLE_ENTITY_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity10(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ENTITY_COMPLETE; - } - return common(state, tok); -} - -static int PTRCALL -notation0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_NAME: - state->handler = notation1; - return XML_ROLE_NOTATION_NAME; - } - return common(state, tok); -} - -static int PTRCALL -notation1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = notation3; - return XML_ROLE_NOTATION_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = notation2; - return XML_ROLE_NOTATION_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -notation2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = notation4; - return XML_ROLE_NOTATION_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -notation3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_NOTATION_NONE; - return XML_ROLE_NOTATION_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -notation4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_NOTATION_NONE; - return XML_ROLE_NOTATION_SYSTEM_ID; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_NOTATION_NO_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -attlist0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist1; - return XML_ROLE_ATTLIST_ELEMENT_NAME; - } - return common(state, tok); -} - -static int PTRCALL -attlist1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist2; - return XML_ROLE_ATTRIBUTE_NAME; - } - return common(state, tok); -} - -static int PTRCALL -attlist2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - { - static const char * const types[] = { - KW_CDATA, - KW_ID, - KW_IDREF, - KW_IDREFS, - KW_ENTITY, - KW_ENTITIES, - KW_NMTOKEN, - KW_NMTOKENS, - }; - int i; - for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) - if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { - state->handler = attlist8; - return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; - } - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { - state->handler = attlist5; - return XML_ROLE_ATTLIST_NONE; - } - break; - case XML_TOK_OPEN_PAREN: - state->handler = attlist3; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NMTOKEN: - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist4; - return XML_ROLE_ATTRIBUTE_ENUM_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = attlist8; - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OR: - state->handler = attlist3; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OPEN_PAREN: - state->handler = attlist6; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - state->handler = attlist7; - return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = attlist8; - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OR: - state->handler = attlist6; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -/* default value */ -static int PTRCALL -attlist8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_IMPLIED)) { - state->handler = attlist1; - return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; - } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_REQUIRED)) { - state->handler = attlist1; - return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; - } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_FIXED)) { - state->handler = attlist9; - return XML_ROLE_ATTLIST_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = attlist1; - return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist9(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_LITERAL: - state->handler = attlist1; - return XML_ROLE_FIXED_ATTRIBUTE_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -element0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element1; - return XML_ROLE_ELEMENT_NAME; - } - return common(state, tok); -} - -static int PTRCALL -element1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_CONTENT_EMPTY; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_CONTENT_ANY; - } - break; - case XML_TOK_OPEN_PAREN: - state->handler = element2; - state->level = 1; - return XML_ROLE_GROUP_OPEN; - } - return common(state, tok); -} - -static int PTRCALL -element2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_PCDATA)) { - state->handler = element3; - return XML_ROLE_CONTENT_PCDATA; - } - break; - case XML_TOK_OPEN_PAREN: - state->level = 2; - state->handler = element6; - return XML_ROLE_GROUP_OPEN; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT; - case XML_TOK_NAME_QUESTION: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_OPT; - case XML_TOK_NAME_ASTERISK: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_REP; - case XML_TOK_NAME_PLUS: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_PLUS; - } - return common(state, tok); -} - -static int PTRCALL -element3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_OR: - state->handler = element4; - return XML_ROLE_ELEMENT_NONE; - } - return common(state, tok); -} - -static int PTRCALL -element4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element5; - return XML_ROLE_CONTENT_ELEMENT; - } - return common(state, tok); -} - -static int PTRCALL -element5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_OR: - state->handler = element4; - return XML_ROLE_ELEMENT_NONE; - } - return common(state, tok); -} - -static int PTRCALL -element6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_OPEN_PAREN: - state->level += 1; - return XML_ROLE_GROUP_OPEN; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT; - case XML_TOK_NAME_QUESTION: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_OPT; - case XML_TOK_NAME_ASTERISK: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_REP; - case XML_TOK_NAME_PLUS: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_PLUS; - } - return common(state, tok); -} - -static int PTRCALL -element7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_CLOSE_PAREN_QUESTION: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_OPT; - case XML_TOK_CLOSE_PAREN_PLUS: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_PLUS; - case XML_TOK_COMMA: - state->handler = element6; - return XML_ROLE_GROUP_SEQUENCE; - case XML_TOK_OR: - state->handler = element6; - return XML_ROLE_GROUP_CHOICE; - } - return common(state, tok); -} - -#ifdef XML_DTD - -static int PTRCALL -condSect0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { - state->handler = condSect1; - return XML_ROLE_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { - state->handler = condSect2; - return XML_ROLE_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -condSect1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = externalSubset1; - state->includeLevel += 1; - return XML_ROLE_NONE; - } - return common(state, tok); -} - -static int PTRCALL -condSect2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = externalSubset1; - return XML_ROLE_IGNORE_SECT; - } - return common(state, tok); -} - -#endif /* XML_DTD */ - -static int PTRCALL -declClose(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - switch (tok) { - case XML_TOK_PROLOG_S: - return state->role_none; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return state->role_none; - } - return common(state, tok); -} - -static int PTRCALL -error(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - UNUSED(state); - UNUSED(tok); - UNUSED(ptr); - UNUSED(end); - UNUSED(enc); - - return XML_ROLE_NONE; -} - -static int FASTCALL -common(PROLOG_STATE *state, int tok) -{ -#ifdef XML_DTD - if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) - return XML_ROLE_INNER_PARAM_ENTITY_REF; -#endif - state->handler = error; - return XML_ROLE_ERROR; -} - -void -XmlPrologStateInit(PROLOG_STATE *state) -{ - state->handler = prolog0; -#ifdef XML_DTD - state->documentEntity = 1; - state->includeLevel = 0; - state->inEntityValue = 0; -#endif /* XML_DTD */ -} - -#ifdef XML_DTD - -void -XmlPrologStateInitExternalEntity(PROLOG_STATE *state) -{ - state->handler = externalSubset0; - state->documentEntity = 0; - state->includeLevel = 0; -} - -#endif /* XML_DTD */ diff --git a/third-party/libstudxml/libstudxml/details/expat/xmlrole.h b/third-party/libstudxml/libstudxml/details/expat/xmlrole.h deleted file mode 100644 index 4eeb5b2a..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/xmlrole.h +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef XmlRole_INCLUDED -#define XmlRole_INCLUDED 1 - -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - XML_ROLE_ERROR = -1, - XML_ROLE_NONE = 0, - XML_ROLE_XML_DECL, - XML_ROLE_INSTANCE_START, - XML_ROLE_DOCTYPE_NONE, - XML_ROLE_DOCTYPE_NAME, - XML_ROLE_DOCTYPE_SYSTEM_ID, - XML_ROLE_DOCTYPE_PUBLIC_ID, - XML_ROLE_DOCTYPE_INTERNAL_SUBSET, - XML_ROLE_DOCTYPE_CLOSE, - XML_ROLE_GENERAL_ENTITY_NAME, - XML_ROLE_PARAM_ENTITY_NAME, - XML_ROLE_ENTITY_NONE, - XML_ROLE_ENTITY_VALUE, - XML_ROLE_ENTITY_SYSTEM_ID, - XML_ROLE_ENTITY_PUBLIC_ID, - XML_ROLE_ENTITY_COMPLETE, - XML_ROLE_ENTITY_NOTATION_NAME, - XML_ROLE_NOTATION_NONE, - XML_ROLE_NOTATION_NAME, - XML_ROLE_NOTATION_SYSTEM_ID, - XML_ROLE_NOTATION_NO_SYSTEM_ID, - XML_ROLE_NOTATION_PUBLIC_ID, - XML_ROLE_ATTRIBUTE_NAME, - XML_ROLE_ATTRIBUTE_TYPE_CDATA, - XML_ROLE_ATTRIBUTE_TYPE_ID, - XML_ROLE_ATTRIBUTE_TYPE_IDREF, - XML_ROLE_ATTRIBUTE_TYPE_IDREFS, - XML_ROLE_ATTRIBUTE_TYPE_ENTITY, - XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, - XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, - XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, - XML_ROLE_ATTRIBUTE_ENUM_VALUE, - XML_ROLE_ATTRIBUTE_NOTATION_VALUE, - XML_ROLE_ATTLIST_NONE, - XML_ROLE_ATTLIST_ELEMENT_NAME, - XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, - XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, - XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, - XML_ROLE_FIXED_ATTRIBUTE_VALUE, - XML_ROLE_ELEMENT_NONE, - XML_ROLE_ELEMENT_NAME, - XML_ROLE_CONTENT_ANY, - XML_ROLE_CONTENT_EMPTY, - XML_ROLE_CONTENT_PCDATA, - XML_ROLE_GROUP_OPEN, - XML_ROLE_GROUP_CLOSE, - XML_ROLE_GROUP_CLOSE_REP, - XML_ROLE_GROUP_CLOSE_OPT, - XML_ROLE_GROUP_CLOSE_PLUS, - XML_ROLE_GROUP_CHOICE, - XML_ROLE_GROUP_SEQUENCE, - XML_ROLE_CONTENT_ELEMENT, - XML_ROLE_CONTENT_ELEMENT_REP, - XML_ROLE_CONTENT_ELEMENT_OPT, - XML_ROLE_CONTENT_ELEMENT_PLUS, - XML_ROLE_PI, - XML_ROLE_COMMENT, -#ifdef XML_DTD - XML_ROLE_TEXT_DECL, - XML_ROLE_IGNORE_SECT, - XML_ROLE_INNER_PARAM_ENTITY_REF, -#endif /* XML_DTD */ - XML_ROLE_PARAM_ENTITY_REF -}; - -typedef struct prolog_state { - int (PTRCALL *handler) (struct prolog_state *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); - unsigned level; - int role_none; -#ifdef XML_DTD - unsigned includeLevel; - int documentEntity; - int inEntityValue; -#endif /* XML_DTD */ -} PROLOG_STATE; - -void XmlPrologStateInit(PROLOG_STATE *); -#ifdef XML_DTD -void XmlPrologStateInitExternalEntity(PROLOG_STATE *); -#endif /* XML_DTD */ - -#define XmlTokenRole(state, tok, ptr, end, enc) \ - (((state)->handler)(state, tok, ptr, end, enc)) - -#ifdef __cplusplus -} -#endif - -#endif /* not XmlRole_INCLUDED */ diff --git a/third-party/libstudxml/libstudxml/details/expat/xmltok.c b/third-party/libstudxml/libstudxml/details/expat/xmltok.c deleted file mode 100644 index 5a8f36f2..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/xmltok.c +++ /dev/null @@ -1,1681 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include - -#include - -#include -#include -#include -#include - -#ifdef XML_DTD -#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) -#else -#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ -#endif - -#define VTABLE1 \ - { PREFIX(prologTok), PREFIX(contentTok), \ - PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ - { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ - PREFIX(sameName), \ - PREFIX(nameMatchesAscii), \ - PREFIX(nameLength), \ - PREFIX(skipS), \ - PREFIX(getAtts), \ - PREFIX(charRefNumber), \ - PREFIX(predefinedEntityName), \ - PREFIX(updatePosition), \ - PREFIX(isPublicId) - -#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) - -#define UCS2_GET_NAMING(pages, hi, lo) \ - (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) - -/* A 2 byte UTF-8 representation splits the characters 11 bits between - the bottom 5 and 6 bits of the bytes. We need 8 bits to index into - pages, 3 bits to add to that index and 5 bits to generate the mask. -*/ -#define UTF8_GET_NAMING2(pages, byte) \ - (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ - + ((((byte)[0]) & 3) << 1) \ - + ((((byte)[1]) >> 5) & 1)] \ - & (1 << (((byte)[1]) & 0x1F))) - -/* A 3 byte UTF-8 representation splits the characters 16 bits between - the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index - into pages, 3 bits to add to that index and 5 bits to generate the - mask. -*/ -#define UTF8_GET_NAMING3(pages, byte) \ - (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ - + ((((byte)[1]) >> 2) & 0xF)] \ - << 3) \ - + ((((byte)[1]) & 3) << 1) \ - + ((((byte)[2]) >> 5) & 1)] \ - & (1 << (((byte)[2]) & 0x1F))) - -#define UTF8_GET_NAMING(pages, p, n) \ - ((n) == 2 \ - ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ - : ((n) == 3 \ - ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ - : 0)) - -/* Detection of invalid UTF-8 sequences is based on Table 3.1B - of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ - with the additional restriction of not allowing the Unicode - code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). - Implementation details: - (A & 0x80) == 0 means A < 0x80 - and - (A & 0xC0) == 0xC0 means A > 0xBF -*/ - -#define UTF8_INVALID2(p) \ - ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) - -#define UTF8_INVALID3(p) \ - (((p)[2] & 0x80) == 0 \ - || \ - ((*p) == 0xEF && (p)[1] == 0xBF \ - ? \ - (p)[2] > 0xBD \ - : \ - ((p)[2] & 0xC0) == 0xC0) \ - || \ - ((*p) == 0xE0 \ - ? \ - (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) - -#define UTF8_INVALID4(p) \ - (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ - || \ - ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ - || \ - ((*p) == 0xF0 \ - ? \ - (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) - -static int PTRFASTCALL -isNever(const ENCODING *enc, const char *p) -{ - UNUSED(enc); - UNUSED(p); - - return 0; -} - -static int PTRFASTCALL -utf8_isName2(const ENCODING *enc, const char *p) -{ - UNUSED(enc); - - return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isName3(const ENCODING *enc, const char *p) -{ - UNUSED(enc); - - return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); -} - -#define utf8_isName4 isNever - -static int PTRFASTCALL -utf8_isNmstrt2(const ENCODING *enc, const char *p) -{ - UNUSED(enc); - - return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isNmstrt3(const ENCODING *enc, const char *p) -{ - UNUSED(enc); - - return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); -} - -#define utf8_isNmstrt4 isNever - -static int PTRFASTCALL -utf8_isInvalid2(const ENCODING *enc, const char *p) -{ - UNUSED(enc); - - return UTF8_INVALID2((const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isInvalid3(const ENCODING *enc, const char *p) -{ - UNUSED(enc); - - return UTF8_INVALID3((const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isInvalid4(const ENCODING *enc, const char *p) -{ - UNUSED(enc); - - return UTF8_INVALID4((const unsigned char *)p); -} - -struct normal_encoding { - ENCODING enc; - unsigned char type[256]; -#ifdef XML_MIN_SIZE - int (PTRFASTCALL *byteType)(const ENCODING *, const char *); - int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); - int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); - int (PTRCALL *charMatches)(const ENCODING *, const char *, int); -#endif /* XML_MIN_SIZE */ - int (PTRFASTCALL *isName2)(const ENCODING *, const char *); - int (PTRFASTCALL *isName3)(const ENCODING *, const char *); - int (PTRFASTCALL *isName4)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); -}; - -#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) - -#ifdef XML_MIN_SIZE - -#define STANDARD_VTABLE(E) \ - E ## byteType, \ - E ## isNameMin, \ - E ## isNmstrtMin, \ - E ## byteToAscii, \ - E ## charMatches, - -#define ZERO_VTABLE /* as nothing */ - -#else - -#define STANDARD_VTABLE(E) /* as nothing */ - -#define ZERO_VTABLE \ - 0, \ - 0, \ - 0, \ - 0, \ - 0, \ - 0, \ - 0, \ - 0, \ - 0 - -#endif - -#define NORMAL_VTABLE(E) \ - E ## isName2, \ - E ## isName3, \ - E ## isName4, \ - E ## isNmstrt2, \ - E ## isNmstrt3, \ - E ## isNmstrt4, \ - E ## isInvalid2, \ - E ## isInvalid3, \ - E ## isInvalid4 - -static int FASTCALL checkCharRefNumber(int); - -#include -#include - -#ifdef XML_MIN_SIZE -#define sb_isNameMin isNever -#define sb_isNmstrtMin isNever -#endif - -#ifdef XML_MIN_SIZE -#define MINBPC(enc) ((enc)->minBytesPerChar) -#else -/* minimum bytes per character */ -#define MINBPC(enc) 1 -#endif - -#define SB_BYTE_TYPE(enc, p) \ - (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) - -#ifdef XML_MIN_SIZE -static int PTRFASTCALL -sb_byteType(const ENCODING *enc, const char *p) -{ - return SB_BYTE_TYPE(enc, p); -} -#define BYTE_TYPE(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) -#else -#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) -#endif - -#ifdef XML_MIN_SIZE -#define BYTE_TO_ASCII(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) -static int PTRFASTCALL -sb_byteToAscii(const ENCODING *enc, const char *p) -{ - return *p; -} -#else -#define BYTE_TO_ASCII(enc, p) (*(p)) -#endif - -#define IS_NAME_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) -#define IS_NMSTRT_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) -#define IS_INVALID_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) - -#ifdef XML_MIN_SIZE -#define IS_NAME_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) -#else -#define IS_NAME_CHAR_MINBPC(enc, p) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) -#endif - -#ifdef XML_MIN_SIZE -#define CHAR_MATCHES(enc, p, c) \ - (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) -static int PTRCALL -sb_charMatches(const ENCODING *enc, const char *p, int c) -{ - return *p == c; -} -#else -/* c is an ASCII character */ -#define CHAR_MATCHES(enc, p, c) (*(p) == c) -#endif - -#define PREFIX(ident) normal_ ## ident -#define XML_TOK_IMPL_C -#include -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ - UTF8_cval1 = 0x00, - UTF8_cval2 = 0xc0, - UTF8_cval3 = 0xe0, - UTF8_cval4 = 0xf0 -}; - -static void PTRCALL -utf8_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - char *to; - const char *from; - - UNUSED(enc); - - if (fromLim - *fromP > toLim - *toP) { - /* Avoid copying partial characters. */ - for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) - if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) - break; - } - for (to = *toP, from = *fromP; from != fromLim; from++, to++) - *to = *from; - *fromP = from; - *toP = to; -} - -static void PTRCALL -utf8_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - unsigned short *to = *toP; - const char *from = *fromP; - while (from != fromLim && to != toLim) { - switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { - case BT_LEAD2: - *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); - from += 2; - break; - case BT_LEAD3: - *to++ = (unsigned short)(((from[0] & 0xf) << 12) - | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); - from += 3; - break; - case BT_LEAD4: - { - unsigned long n; - if (to + 1 == toLim) - goto after; - n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) - | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); - n -= 0x10000; - to[0] = (unsigned short)((n >> 10) | 0xD800); - to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); - to += 2; - from += 4; - } - break; - default: - *to++ = *from++; - break; - } - } -after: - *fromP = from; - *toP = to; -} - -#ifdef XML_NS -static const struct normal_encoding utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include -#include - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; -#endif - -static const struct normal_encoding utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include -#undef BT_COLON -#include - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -#ifdef XML_NS - -static const struct normal_encoding internal_utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include -#include - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -#endif - -static const struct normal_encoding internal_utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include -#undef BT_COLON -#include - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -static void PTRCALL -latin1_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - UNUSED(enc); - - for (;;) { - unsigned char c; - if (*fromP == fromLim) - break; - c = (unsigned char)**fromP; - if (c & 0x80) { - if (toLim - *toP < 2) - break; - *(*toP)++ = (char)((c >> 6) | UTF8_cval2); - *(*toP)++ = (char)((c & 0x3f) | 0x80); - (*fromP)++; - } - else { - if (*toP == toLim) - break; - *(*toP)++ = *(*fromP)++; - } - } -} - -static void PTRCALL -latin1_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - UNUSED(enc); - - while (*fromP != fromLim && *toP != toLim) - *(*toP)++ = (unsigned char)*(*fromP)++; -} - -#ifdef XML_NS - -static const struct normal_encoding latin1_encoding_ns = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#include -#include - }, - STANDARD_VTABLE(sb_) ZERO_VTABLE -}; - -#endif - -static const struct normal_encoding latin1_encoding = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#define BT_COLON BT_NMSTRT -#include -#undef BT_COLON -#include - }, - STANDARD_VTABLE(sb_) ZERO_VTABLE -}; - -static void PTRCALL -ascii_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - UNUSED(enc); - - while (*fromP != fromLim && *toP != toLim) - *(*toP)++ = *(*fromP)++; -} - -#ifdef XML_NS - -static const struct normal_encoding ascii_encoding_ns = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#include -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) ZERO_VTABLE -}; - -#endif - -static const struct normal_encoding ascii_encoding = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include -#undef BT_COLON -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) ZERO_VTABLE -}; - -static int PTRFASTCALL -unicode_byte_type(char hi, char lo) -{ - switch ((unsigned char)hi) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - return BT_LEAD4; - case 0xDC: case 0xDD: case 0xDE: case 0xDF: - return BT_TRAIL; - case 0xFF: - switch ((unsigned char)lo) { - case 0xFF: - case 0xFE: - return BT_NONXML; - } - break; - } - return BT_NONASCII; -} - -#define DEFINE_UTF16_TO_UTF8(E) \ -static void PTRCALL \ -E ## toUtf8(const ENCODING *enc, \ - const char **fromP, const char *fromLim, \ - char **toP, const char *toLim) \ -{ \ - const char *from; \ - UNUSED(enc); \ - for (from = *fromP; from != fromLim; from += 2) { \ - int plane; \ - unsigned char lo2; \ - unsigned char lo = GET_LO(from); \ - unsigned char hi = GET_HI(from); \ - switch (hi) { \ - case 0: \ - if (lo < 0x80) { \ - if (*toP == toLim) { \ - *fromP = from; \ - return; \ - } \ - *(*toP)++ = lo; \ - break; \ - } \ - /* fall through */ \ - case 0x1: case 0x2: case 0x3: \ - case 0x4: case 0x5: case 0x6: case 0x7: \ - if (toLim - *toP < 2) { \ - *fromP = from; \ - return; \ - } \ - *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - default: \ - if (toLim - *toP < 3) { \ - *fromP = from; \ - return; \ - } \ - /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ - *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ - *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ - if (toLim - *toP < 4) { \ - *fromP = from; \ - return; \ - } \ - plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ - *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ - *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ - from += 2; \ - lo2 = GET_LO(from); \ - *(*toP)++ = (((lo & 0x3) << 4) \ - | ((GET_HI(from) & 0x3) << 2) \ - | (lo2 >> 6) \ - | 0x80); \ - *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ - break; \ - } \ - } \ - *fromP = from; \ -} - -#define DEFINE_UTF16_TO_UTF16(E) \ -static void PTRCALL \ -E ## toUtf16(const ENCODING *enc, \ - const char **fromP, const char *fromLim, \ - unsigned short **toP, const unsigned short *toLim) \ -{ \ - UNUSED(enc); \ - /* Avoid copying first half only of surrogate */ \ - if (fromLim - *fromP > ((toLim - *toP) << 1) \ - && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ - fromLim -= 2; \ - for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ - *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ -} - -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) -#define GET_LO(ptr) ((unsigned char)(ptr)[0]) -#define GET_HI(ptr) ((unsigned char)(ptr)[1]) - -DEFINE_UTF16_TO_UTF8(little2_) -DEFINE_UTF16_TO_UTF16(little2_) - -#undef SET2 -#undef GET_LO -#undef GET_HI - -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) -#define GET_LO(ptr) ((unsigned char)(ptr)[1]) -#define GET_HI(ptr) ((unsigned char)(ptr)[0]) - -DEFINE_UTF16_TO_UTF8(big2_) -DEFINE_UTF16_TO_UTF16(big2_) - -#undef SET2 -#undef GET_LO -#undef GET_HI - -#define LITTLE2_BYTE_TYPE(enc, p) \ - ((p)[1] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ - : unicode_byte_type((p)[1], (p)[0])) -#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) -#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) -#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) -#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) - -#ifdef XML_MIN_SIZE - -static int PTRFASTCALL -little2_byteType(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TYPE(enc, p); -} - -static int PTRFASTCALL -little2_byteToAscii(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TO_ASCII(enc, p); -} - -static int PTRCALL -little2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return LITTLE2_CHAR_MATCHES(enc, p, c); -} - -static int PTRFASTCALL -little2_isNameMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); -} - -static int PTRFASTCALL -little2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); -} - -#undef VTABLE -#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 - -#else /* not XML_MIN_SIZE */ - -#undef PREFIX -#define PREFIX(ident) little2_ ## ident -#define MINBPC(enc) 2 -/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -#endif /* not XML_MIN_SIZE */ - -#ifdef XML_NS - -static const struct normal_encoding little2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#include -#include - }, - STANDARD_VTABLE(little2_) ZERO_VTABLE -}; - -#endif - -static const struct normal_encoding little2_encoding = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#define BT_COLON BT_NMSTRT -#include -#undef BT_COLON -#include - }, - STANDARD_VTABLE(little2_) ZERO_VTABLE -}; - -#if BYTEORDER != 4321 - -#ifdef XML_NS - -static const struct normal_encoding internal_little2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include -#include - }, - STANDARD_VTABLE(little2_) ZERO_VTABLE -}; - -#endif - -static const struct normal_encoding internal_little2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include -#undef BT_COLON -#include - }, - STANDARD_VTABLE(little2_) ZERO_VTABLE -}; - -#endif - - -#define BIG2_BYTE_TYPE(enc, p) \ - ((p)[0] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ - : unicode_byte_type((p)[0], (p)[1])) -#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) -#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) -#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) -#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) - -#ifdef XML_MIN_SIZE - -static int PTRFASTCALL -big2_byteType(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TYPE(enc, p); -} - -static int PTRFASTCALL -big2_byteToAscii(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TO_ASCII(enc, p); -} - -static int PTRCALL -big2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return BIG2_CHAR_MATCHES(enc, p, c); -} - -static int PTRFASTCALL -big2_isNameMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NAME_CHAR_MINBPC(enc, p); -} - -static int PTRFASTCALL -big2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); -} - -#undef VTABLE -#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 - -#else /* not XML_MIN_SIZE */ - -#undef PREFIX -#define PREFIX(ident) big2_ ## ident -#define MINBPC(enc) 2 -/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -#endif /* not XML_MIN_SIZE */ - -#ifdef XML_NS - -static const struct normal_encoding big2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#include -#include - }, - STANDARD_VTABLE(big2_) ZERO_VTABLE -}; - -#endif - -static const struct normal_encoding big2_encoding = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#define BT_COLON BT_NMSTRT -#include -#undef BT_COLON -#include - }, - STANDARD_VTABLE(big2_) ZERO_VTABLE -}; - -#if BYTEORDER != 1234 - -#ifdef XML_NS - -static const struct normal_encoding internal_big2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include -#include - }, - STANDARD_VTABLE(big2_) ZERO_VTABLE -}; - -#endif - -static const struct normal_encoding internal_big2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include -#undef BT_COLON -#include - }, - STANDARD_VTABLE(big2_) ZERO_VTABLE -}; - -#endif - -#undef PREFIX - -static int FASTCALL -streqci(const char *s1, const char *s2) -{ - for (;;) { - char c1 = *s1++; - char c2 = *s2++; - if (ASCII_a <= c1 && c1 <= ASCII_z) - c1 += ASCII_A - ASCII_a; - if (ASCII_a <= c2 && c2 <= ASCII_z) - c2 += ASCII_A - ASCII_a; - if (c1 != c2) - return 0; - if (!c1) - break; - } - return 1; -} - -static void PTRCALL -initUpdatePosition(const ENCODING *enc, const char *ptr, - const char *end, POSITION *pos) -{ - UNUSED(enc); - normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); -} - -static int -toAscii(const ENCODING *enc, const char *ptr, const char *end) -{ - char buf[1]; - char *p = buf; - XmlUtf8Convert(enc, &ptr, end, &p, p + 1); - if (p == buf) - return -1; - else - return buf[0]; -} - -static int FASTCALL -isSpace(int c) -{ - switch (c) { - case 0x20: - case 0xD: - case 0xA: - case 0x9: - return 1; - } - return 0; -} - -/* Return 1 if there's just optional white space or there's an S - followed by name=val. -*/ -static int -parsePseudoAttribute(const ENCODING *enc, - const char *ptr, - const char *end, - const char **namePtr, - const char **nameEndPtr, - const char **valPtr, - const char **nextTokPtr) -{ - int c; - char open; - if (ptr == end) { - *namePtr = NULL; - return 1; - } - if (!isSpace(toAscii(enc, ptr, end))) { - *nextTokPtr = ptr; - return 0; - } - do { - ptr += enc->minBytesPerChar; - } while (isSpace(toAscii(enc, ptr, end))); - if (ptr == end) { - *namePtr = NULL; - return 1; - } - *namePtr = ptr; - for (;;) { - c = toAscii(enc, ptr, end); - if (c == -1) { - *nextTokPtr = ptr; - return 0; - } - if (c == ASCII_EQUALS) { - *nameEndPtr = ptr; - break; - } - if (isSpace(c)) { - *nameEndPtr = ptr; - do { - ptr += enc->minBytesPerChar; - } while (isSpace(c = toAscii(enc, ptr, end))); - if (c != ASCII_EQUALS) { - *nextTokPtr = ptr; - return 0; - } - break; - } - ptr += enc->minBytesPerChar; - } - if (ptr == *namePtr) { - *nextTokPtr = ptr; - return 0; - } - ptr += enc->minBytesPerChar; - c = toAscii(enc, ptr, end); - while (isSpace(c)) { - ptr += enc->minBytesPerChar; - c = toAscii(enc, ptr, end); - } - if (c != ASCII_QUOT && c != ASCII_APOS) { - *nextTokPtr = ptr; - return 0; - } - open = (char)c; - ptr += enc->minBytesPerChar; - *valPtr = ptr; - for (;; ptr += enc->minBytesPerChar) { - c = toAscii(enc, ptr, end); - if (c == open) - break; - if (!(ASCII_a <= c && c <= ASCII_z) - && !(ASCII_A <= c && c <= ASCII_Z) - && !(ASCII_0 <= c && c <= ASCII_9) - && c != ASCII_PERIOD - && c != ASCII_MINUS - && c != ASCII_UNDERSCORE) { - *nextTokPtr = ptr; - return 0; - } - } - *nextTokPtr = ptr + enc->minBytesPerChar; - return 1; -} - -static const char KW_version[] = { - ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' -}; - -static const char KW_encoding[] = { - ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' -}; - -static const char KW_standalone[] = { - ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, - ASCII_n, ASCII_e, '\0' -}; - -static const char KW_yes[] = { - ASCII_y, ASCII_e, ASCII_s, '\0' -}; - -static const char KW_no[] = { - ASCII_n, ASCII_o, '\0' -}; - -static int -doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, - const char *, - const char *), - int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - const char *val = NULL; - const char *name = NULL; - const char *nameEnd = NULL; - ptr += 5 * enc->minBytesPerChar; - end -= 2 * enc->minBytesPerChar; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) - || !name) { - *badPtr = ptr; - return 0; - } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { - if (!isGeneralTextEntity) { - *badPtr = name; - return 0; - } - } - else { - if (versionPtr) - *versionPtr = val; - if (versionEndPtr) - *versionEndPtr = ptr; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { - *badPtr = ptr; - return 0; - } - if (!name) { - if (isGeneralTextEntity) { - /* a TextDecl must have an EncodingDecl */ - *badPtr = ptr; - return 0; - } - return 1; - } - } - if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { - int c = toAscii(enc, val, end); - if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { - *badPtr = val; - return 0; - } - if (encodingName) - *encodingName = val; - if (encoding) - *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { - *badPtr = ptr; - return 0; - } - if (!name) - return 1; - } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) - || isGeneralTextEntity) { - *badPtr = name; - return 0; - } - if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { - if (standalone) - *standalone = 1; - } - else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { - if (standalone) - *standalone = 0; - } - else { - *badPtr = val; - return 0; - } - while (isSpace(toAscii(enc, ptr, end))) - ptr += enc->minBytesPerChar; - if (ptr != end) { - *badPtr = ptr; - return 0; - } - return 1; -} - -static int FASTCALL -checkCharRefNumber(int result) -{ - switch (result >> 8) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - case 0xDC: case 0xDD: case 0xDE: case 0xDF: - return -1; - case 0: - if (latin1_encoding.type[result] == BT_NONXML) - return -1; - break; - case 0xFF: - if (result == 0xFFFE || result == 0xFFFF) - return -1; - break; - } - return result; -} - -int FASTCALL -XmlUtf8Encode(int c, char *buf) -{ - enum { - /* minN is minimum legal resulting value for N byte sequence */ - min2 = 0x80, - min3 = 0x800, - min4 = 0x10000 - }; - - if (c < 0) - return 0; - if (c < min2) { - buf[0] = (char)(c | UTF8_cval1); - return 1; - } - if (c < min3) { - buf[0] = (char)((c >> 6) | UTF8_cval2); - buf[1] = (char)((c & 0x3f) | 0x80); - return 2; - } - if (c < min4) { - buf[0] = (char)((c >> 12) | UTF8_cval3); - buf[1] = (char)(((c >> 6) & 0x3f) | 0x80); - buf[2] = (char)((c & 0x3f) | 0x80); - return 3; - } - if (c < 0x110000) { - buf[0] = (char)((c >> 18) | UTF8_cval4); - buf[1] = (char)(((c >> 12) & 0x3f) | 0x80); - buf[2] = (char)(((c >> 6) & 0x3f) | 0x80); - buf[3] = (char)((c & 0x3f) | 0x80); - return 4; - } - return 0; -} - -int FASTCALL -XmlUtf16Encode(int charNum, unsigned short *buf) -{ - if (charNum < 0) - return 0; - if (charNum < 0x10000) { - buf[0] = (unsigned short)charNum; - return 1; - } - if (charNum < 0x110000) { - charNum -= 0x10000; - buf[0] = (unsigned short)((charNum >> 10) + 0xD800); - buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00); - return 2; - } - return 0; -} - -struct unknown_encoding { - struct normal_encoding normal; - CONVERTER convert; - void *userData; - unsigned short utf16[256]; - char utf8[256][4]; -}; - -#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) - -int -XmlSizeOfUnknownEncoding(void) -{ - return sizeof(struct unknown_encoding); -} - -static int PTRFASTCALL -unknown_isName(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - if (c & ~0xFFFF) - return 0; - return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); -} - -static int PTRFASTCALL -unknown_isNmstrt(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - if (c & ~0xFFFF) - return 0; - return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); -} - -static int PTRFASTCALL -unknown_isInvalid(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; -} - -static void PTRCALL -unknown_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - char buf[XML_UTF8_ENCODE_MAX]; - for (;;) { - const char *utf8; - int n; - if (*fromP == fromLim) - break; - utf8 = uenc->utf8[(unsigned char)**fromP]; - n = *utf8++; - if (n == 0) { - int c = uenc->convert(uenc->userData, *fromP); - n = XmlUtf8Encode(c, buf); - if (n > toLim - *toP) - break; - utf8 = buf; - *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - - (BT_LEAD2 - 2)); - } - else { - if (n > toLim - *toP) - break; - (*fromP)++; - } - do { - *(*toP)++ = *utf8++; - } while (--n != 0); - } -} - -static void PTRCALL -unknown_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - while (*fromP != fromLim && *toP != toLim) { - unsigned short c = uenc->utf16[(unsigned char)**fromP]; - if (c == 0) { - c = (unsigned short) - uenc->convert(uenc->userData, *fromP); - *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - - (BT_LEAD2 - 2)); - } - else - (*fromP)++; - *(*toP)++ = c; - } -} - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ - int i; - struct unknown_encoding *e = (struct unknown_encoding *)mem; - for (i = 0; i < (int)sizeof(struct normal_encoding); i++) - ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; - for (i = 0; i < 128; i++) - if (latin1_encoding.type[i] != BT_OTHER - && latin1_encoding.type[i] != BT_NONXML - && table[i] != i) - return 0; - for (i = 0; i < 256; i++) { - int c = table[i]; - if (c == -1) { - e->normal.type[i] = BT_MALFORM; - /* This shouldn't really get used. */ - e->utf16[i] = 0xFFFF; - e->utf8[i][0] = 1; - e->utf8[i][1] = 0; - } - else if (c < 0) { - if (c < -4) - return 0; - e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); - e->utf8[i][0] = 0; - e->utf16[i] = 0; - } - else if (c < 0x80) { - if (latin1_encoding.type[c] != BT_OTHER - && latin1_encoding.type[c] != BT_NONXML - && c != i) - return 0; - e->normal.type[i] = latin1_encoding.type[c]; - e->utf8[i][0] = 1; - e->utf8[i][1] = (char)c; - e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); - } - else if (checkCharRefNumber(c) < 0) { - e->normal.type[i] = BT_NONXML; - /* This shouldn't really get used. */ - e->utf16[i] = 0xFFFF; - e->utf8[i][0] = 1; - e->utf8[i][1] = 0; - } - else { - if (c > 0xFFFF) - return 0; - if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) - e->normal.type[i] = BT_NMSTRT; - else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) - e->normal.type[i] = BT_NAME; - else - e->normal.type[i] = BT_OTHER; - e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); - e->utf16[i] = (unsigned short)c; - } - } - e->userData = userData; - e->convert = convert; - if (convert) { - e->normal.isName2 = unknown_isName; - e->normal.isName3 = unknown_isName; - e->normal.isName4 = unknown_isName; - e->normal.isNmstrt2 = unknown_isNmstrt; - e->normal.isNmstrt3 = unknown_isNmstrt; - e->normal.isNmstrt4 = unknown_isNmstrt; - e->normal.isInvalid2 = unknown_isInvalid; - e->normal.isInvalid3 = unknown_isInvalid; - e->normal.isInvalid4 = unknown_isInvalid; - } - e->normal.enc.utf8Convert = unknown_toUtf8; - e->normal.enc.utf16Convert = unknown_toUtf16; - return &(e->normal.enc); -} - -/* If this enumeration is changed, getEncodingIndex and encodings -must also be changed. */ -enum { - UNKNOWN_ENC = -1, - ISO_8859_1_ENC = 0, - US_ASCII_ENC, - UTF_8_ENC, - UTF_16_ENC, - UTF_16BE_ENC, - UTF_16LE_ENC, - /* must match encodingNames up to here */ - NO_ENC -}; - -static const char KW_ISO_8859_1[] = { - ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, - ASCII_MINUS, ASCII_1, '\0' -}; -static const char KW_US_ASCII[] = { - ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, - '\0' -}; -static const char KW_UTF_8[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' -}; -static const char KW_UTF_16[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' -}; -static const char KW_UTF_16BE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, - '\0' -}; -static const char KW_UTF_16LE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, - '\0' -}; - -static int FASTCALL -getEncodingIndex(const char *name) -{ - static const char * const encodingNames[] = { - KW_ISO_8859_1, - KW_US_ASCII, - KW_UTF_8, - KW_UTF_16, - KW_UTF_16BE, - KW_UTF_16LE, - }; - int i; - if (name == NULL) - return NO_ENC; - for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) - if (streqci(name, encodingNames[i])) - return i; - return UNKNOWN_ENC; -} - -/* For binary compatibility, we store the index of the encoding - specified at initialization in the isUtf16 member. -*/ - -#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) -#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) - -/* This is what detects the encoding. encodingTable maps from - encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of - the external (protocol) specified encoding; state is - XML_CONTENT_STATE if we're parsing an external text entity, and - XML_PROLOG_STATE otherwise. -*/ - - -static int -initScan(const ENCODING * const *encodingTable, - const INIT_ENCODING *enc, - int state, - const char *ptr, - const char *end, - const char **nextTokPtr) -{ - const ENCODING **encPtr; - - if (ptr == end) - return XML_TOK_NONE; - encPtr = enc->encPtr; - if (ptr + 1 == end) { - /* only a single byte available for auto-detection */ -#ifndef XML_DTD /* FIXME */ - /* a well-formed document entity must have more than one byte */ - if (state != XML_CONTENT_STATE) - return XML_TOK_PARTIAL; -#endif - /* so we're parsing an external text entity... */ - /* if UTF-16 was externally specified, then we need at least 2 bytes */ - switch (INIT_ENC_INDEX(enc)) { - case UTF_16_ENC: - case UTF_16LE_ENC: - case UTF_16BE_ENC: - return XML_TOK_PARTIAL; - } - switch ((unsigned char)*ptr) { - case 0xFE: - case 0xFF: - case 0xEF: /* possibly first byte of UTF-8 BOM */ - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - /* fall through */ - case 0x00: - case 0x3C: - return XML_TOK_PARTIAL; - } - } - else { - switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { - case 0xFEFF: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - *nextTokPtr = ptr + 2; - *encPtr = encodingTable[UTF_16BE_ENC]; - return XML_TOK_BOM; - /* 00 3C is handled in the default case */ - case 0x3C00: - if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC - || INIT_ENC_INDEX(enc) == UTF_16_ENC) - && state == XML_CONTENT_STATE) - break; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - case 0xFFFE: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - *nextTokPtr = ptr + 2; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XML_TOK_BOM; - case 0xEFBB: - /* Maybe a UTF-8 BOM (EF BB BF) */ - /* If there's an explicitly specified (external) encoding - of ISO-8859-1 or some flavour of UTF-16 - and this is an external text entity, - don't look for the BOM, - because it might be a legal data. - */ - if (state == XML_CONTENT_STATE) { - int e = INIT_ENC_INDEX(enc); - if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC - || e == UTF_16LE_ENC || e == UTF_16_ENC) - break; - } - if (ptr + 2 == end) - return XML_TOK_PARTIAL; - if ((unsigned char)ptr[2] == 0xBF) { - *nextTokPtr = ptr + 3; - *encPtr = encodingTable[UTF_8_ENC]; - return XML_TOK_BOM; - } - break; - default: - if (ptr[0] == '\0') { - /* 0 isn't a legal data character. Furthermore a document - entity can only start with ASCII characters. So the only - way this can fail to be big-endian UTF-16 if it it's an - external parsed general entity that's labelled as - UTF-16LE. - */ - if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) - break; - *encPtr = encodingTable[UTF_16BE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - else if (ptr[1] == '\0') { - /* We could recover here in the case: - - parsing an external entity - - second byte is 0 - - no externally specified encoding - - no encoding declaration - by assuming UTF-16LE. But we don't, because this would mean when - presented just with a single byte, we couldn't reliably determine - whether we needed further bytes. - */ - if (state == XML_CONTENT_STATE) - break; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - break; - } - } - *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); -} - - -#define NS(x) x -#define ns(x) x -#define XML_TOK_NS_C -#include -#undef XML_TOK_NS_C -#undef NS -#undef ns - -#ifdef XML_NS - -#define NS(x) x ## NS -#define ns(x) x ## _ns - -#define XML_TOK_NS_C -#include -#undef XML_TOK_NS_C - -#undef NS -#undef ns - -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ - ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); - if (enc) - ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; - return enc; -} - -#endif /* XML_NS */ diff --git a/third-party/libstudxml/libstudxml/details/expat/xmltok.h b/third-party/libstudxml/libstudxml/details/expat/xmltok.h deleted file mode 100644 index ca867aa6..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/xmltok.h +++ /dev/null @@ -1,316 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef XmlTok_INCLUDED -#define XmlTok_INCLUDED 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* The following token may be returned by XmlContentTok */ -#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be - start of illegal ]]> sequence */ -/* The following tokens may be returned by both XmlPrologTok and - XmlContentTok. -*/ -#define XML_TOK_NONE -4 /* The string to be scanned is empty */ -#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; - might be part of CRLF sequence */ -#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ -#define XML_TOK_PARTIAL -1 /* only part of a token */ -#define XML_TOK_INVALID 0 - -/* The following tokens are returned by XmlContentTok; some are also - returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. -*/ -#define XML_TOK_START_TAG_WITH_ATTS 1 -#define XML_TOK_START_TAG_NO_ATTS 2 -#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ -#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 -#define XML_TOK_END_TAG 5 -#define XML_TOK_DATA_CHARS 6 -#define XML_TOK_DATA_NEWLINE 7 -#define XML_TOK_CDATA_SECT_OPEN 8 -#define XML_TOK_ENTITY_REF 9 -#define XML_TOK_CHAR_REF 10 /* numeric character reference */ - -/* The following tokens may be returned by both XmlPrologTok and - XmlContentTok. -*/ -#define XML_TOK_PI 11 /* processing instruction */ -#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ -#define XML_TOK_COMMENT 13 -#define XML_TOK_BOM 14 /* Byte order mark */ - -/* The following tokens are returned only by XmlPrologTok */ -#define XML_TOK_PROLOG_S 15 -#define XML_TOK_DECL_OPEN 16 /* */ -#define XML_TOK_NAME 18 -#define XML_TOK_NMTOKEN 19 -#define XML_TOK_POUND_NAME 20 /* #name */ -#define XML_TOK_OR 21 /* | */ -#define XML_TOK_PERCENT 22 -#define XML_TOK_OPEN_PAREN 23 -#define XML_TOK_CLOSE_PAREN 24 -#define XML_TOK_OPEN_BRACKET 25 -#define XML_TOK_CLOSE_BRACKET 26 -#define XML_TOK_LITERAL 27 -#define XML_TOK_PARAM_ENTITY_REF 28 -#define XML_TOK_INSTANCE_START 29 - -/* The following occur only in element type declarations */ -#define XML_TOK_NAME_QUESTION 30 /* name? */ -#define XML_TOK_NAME_ASTERISK 31 /* name* */ -#define XML_TOK_NAME_PLUS 32 /* name+ */ -#define XML_TOK_COND_SECT_OPEN 33 /* */ -#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ -#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ -#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ -#define XML_TOK_COMMA 38 - -/* The following token is returned only by XmlAttributeValueTok */ -#define XML_TOK_ATTRIBUTE_VALUE_S 39 - -/* The following token is returned only by XmlCdataSectionTok */ -#define XML_TOK_CDATA_SECT_CLOSE 40 - -/* With namespace processing this is returned by XmlPrologTok for a - name with a colon. -*/ -#define XML_TOK_PREFIXED_NAME 41 - -#ifdef XML_DTD -#define XML_TOK_IGNORE_SECT 42 -#endif /* XML_DTD */ - -#ifdef XML_DTD -#define XML_N_STATES 4 -#else /* not XML_DTD */ -#define XML_N_STATES 3 -#endif /* not XML_DTD */ - -#define XML_PROLOG_STATE 0 -#define XML_CONTENT_STATE 1 -#define XML_CDATA_SECTION_STATE 2 -#ifdef XML_DTD -#define XML_IGNORE_SECTION_STATE 3 -#endif /* XML_DTD */ - -#define XML_N_LITERAL_TYPES 2 -#define XML_ATTRIBUTE_VALUE_LITERAL 0 -#define XML_ENTITY_VALUE_LITERAL 1 - -/* The size of the buffer passed to XmlUtf8Encode must be at least this. */ -#define XML_UTF8_ENCODE_MAX 4 -/* The size of the buffer passed to XmlUtf16Encode must be at least this. */ -#define XML_UTF16_ENCODE_MAX 2 - -typedef struct position { - /* first line and first column are 0 not 1 */ - XML_Size lineNumber; - XML_Size columnNumber; -} POSITION; - -typedef struct { - const char *name; - const char *valuePtr; - const char *valueEnd; - char normalized; -} ATTRIBUTE; - -struct encoding; -typedef struct encoding ENCODING; - -typedef int (PTRCALL *SCANNER)(const ENCODING *, - const char *, - const char *, - const char **); - -struct encoding { - SCANNER scanners[XML_N_STATES]; - SCANNER literalScanners[XML_N_LITERAL_TYPES]; - int (PTRCALL *sameName)(const ENCODING *, - const char *, - const char *); - int (PTRCALL *nameMatchesAscii)(const ENCODING *, - const char *, - const char *, - const char *); - int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); - const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); - int (PTRCALL *getAtts)(const ENCODING *enc, - const char *ptr, - int attsMax, - ATTRIBUTE *atts); - int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); - int (PTRCALL *predefinedEntityName)(const ENCODING *, - const char *, - const char *); - void (PTRCALL *updatePosition)(const ENCODING *, - const char *ptr, - const char *end, - POSITION *); - int (PTRCALL *isPublicId)(const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr); - void (PTRCALL *utf8Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - char **toP, - const char *toLim); - void (PTRCALL *utf16Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - unsigned short **toP, - const unsigned short *toLim); - int minBytesPerChar; - char isUtf8; - char isUtf16; -}; - -/* Scan the string starting at ptr until the end of the next complete - token, but do not scan past eptr. Return an integer giving the - type of token. - - Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. - - Return XML_TOK_PARTIAL when the string does not contain a complete - token; nextTokPtr will not be set. - - Return XML_TOK_INVALID when the string does not start a valid - token; nextTokPtr will be set to point to the character which made - the token invalid. - - Otherwise the string starts with a valid token; nextTokPtr will be - set to point to the character following the end of that token. - - Each data character counts as a single token, but adjacent data - characters may be returned together. Similarly for characters in - the prolog outside literals, comments and processing instructions. -*/ - - -#define XmlTok(enc, state, ptr, end, nextTokPtr) \ - (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) - -#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) - -#define XmlContentTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) - -#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) - -#ifdef XML_DTD - -#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) - -#endif /* XML_DTD */ - -/* This is used for performing a 2nd-level tokenization on the content - of a literal that has already been returned by XmlTok. -*/ -#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ - (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) - -#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) - -#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) - -#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) - -#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ - (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) - -#define XmlNameLength(enc, ptr) \ - (((enc)->nameLength)(enc, ptr)) - -#define XmlSkipS(enc, ptr) \ - (((enc)->skipS)(enc, ptr)) - -#define XmlGetAttributes(enc, ptr, attsMax, atts) \ - (((enc)->getAtts)(enc, ptr, attsMax, atts)) - -#define XmlCharRefNumber(enc, ptr) \ - (((enc)->charRefNumber)(enc, ptr)) - -#define XmlPredefinedEntityName(enc, ptr, end) \ - (((enc)->predefinedEntityName)(enc, ptr, end)) - -#define XmlUpdatePosition(enc, ptr, end, pos) \ - (((enc)->updatePosition)(enc, ptr, end, pos)) - -#define XmlIsPublicId(enc, ptr, end, badPtr) \ - (((enc)->isPublicId)(enc, ptr, end, badPtr)) - -#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ - (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) - -#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ - (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) - -typedef struct { - ENCODING initEnc; - const ENCODING **encPtr; -} INIT_ENCODING; - -int XmlParseXmlDecl(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); - -int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); -const ENCODING *XmlGetUtf8InternalEncoding(void); -const ENCODING *XmlGetUtf16InternalEncoding(void); -int FASTCALL XmlUtf8Encode(int charNumber, char *buf); -int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); -int XmlSizeOfUnknownEncoding(void); - - -typedef int (XMLCALL *CONVERTER) (void *userData, const char *p); - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData); - -int XmlParseXmlDeclNS(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); - -int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); -const ENCODING *XmlGetUtf8InternalEncodingNS(void); -const ENCODING *XmlGetUtf16InternalEncodingNS(void); -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData); -#ifdef __cplusplus -} -#endif - -#endif /* not XmlTok_INCLUDED */ diff --git a/third-party/libstudxml/libstudxml/details/expat/xmltok_impl.c b/third-party/libstudxml/libstudxml/details/expat/xmltok_impl.c deleted file mode 100644 index de4d21a7..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/xmltok_impl.c +++ /dev/null @@ -1,1796 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* This file is included! */ -#ifdef XML_TOK_IMPL_C - -#ifndef IS_INVALID_CHAR -#define IS_INVALID_CHAR(enc, ptr, n) (0) -#endif - -#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_INVALID_CHAR(enc, ptr, n)) { \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define INVALID_CASES(ptr, nextTokPtr) \ - INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ - case BT_NONXML: \ - case BT_MALFORM: \ - case BT_TRAIL: \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; - -#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NAME_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - case BT_NMSTRT: \ - case BT_HEX: \ - case BT_DIGIT: \ - case BT_NAME: \ - case BT_MINUS: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) - -#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - case BT_NMSTRT: \ - case BT_HEX: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) - -#ifndef PREFIX -#define PREFIX(ident) ident -#endif - -/* ptr points to character following " */ - switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { - case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - /* fall through */ - case BT_S: case BT_CR: case BT_LF: - *nextTokPtr = ptr; - return XML_TOK_DECL_OPEN; - case BT_NMSTRT: - case BT_HEX: - ptr += MINBPC(enc); - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, - const char *end, int *tokPtr) -{ - int upper = 0; - - UNUSED(enc); - - *tokPtr = XML_TOK_PI; - if (end - ptr != MINBPC(enc)*3) - return 1; - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_x: - break; - case ASCII_X: - upper = 1; - break; - default: - return 1; - } - ptr += MINBPC(enc); - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_m: - break; - case ASCII_M: - upper = 1; - break; - default: - return 1; - } - ptr += MINBPC(enc); - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_l: - break; - case ASCII_L: - upper = 1; - break; - default: - return 1; - } - if (upper) - return 0; - *tokPtr = XML_TOK_XML_DECL; - return 1; -} - -/* ptr points to character following " 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) - break; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr -= MINBPC(enc); - break; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CDATA_SECT_CLOSE; - case BT_CR: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - case BT_LF: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - INVALID_CASES(ptr, nextTokPtr) - default: - ptr += MINBPC(enc); - break; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONXML: - case BT_MALFORM: - case BT_TRAIL: - case BT_CR: - case BT_LF: - case BT_RSQB: - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -/* ptr points to character following " 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_LT: - return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_AMP: - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_CR: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - case BT_LF: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) - break; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr -= MINBPC(enc); - break; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - INVALID_CASES(ptr, nextTokPtr) - default: - ptr += MINBPC(enc); - break; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_RSQB: - if (ptr + MINBPC(enc) != end) { - if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { - ptr += MINBPC(enc); - break; - } - if (ptr + 2*MINBPC(enc) != end) { - if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { - ptr += MINBPC(enc); - break; - } - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_INVALID; - } - } - /* fall through */ - case BT_AMP: - case BT_LT: - case BT_NONXML: - case BT_MALFORM: - case BT_TRAIL: - case BT_CR: - case BT_LF: - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -/* ptr points to character following "%" */ - -static int PTRCALL -PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: - *nextTokPtr = ptr; - return XML_TOK_PERCENT; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_PARAM_ENTITY_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_CR: case BT_LF: case BT_S: - case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: - *nextTokPtr = ptr; - return XML_TOK_POUND_NAME; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return -XML_TOK_POUND_NAME; -} - -static int PTRCALL -PREFIX(scanLit)(int open, const ENCODING *enc, - const char *ptr, const char *end, - const char **nextTokPtr) -{ - while (ptr != end) { - int t = BYTE_TYPE(enc, ptr); - switch (t) { - INVALID_CASES(ptr, nextTokPtr) - case BT_QUOT: - case BT_APOS: - ptr += MINBPC(enc); - if (t != open) - break; - if (ptr == end) - return -XML_TOK_LITERAL; - *nextTokPtr = ptr; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_CR: case BT_LF: - case BT_GT: case BT_PERCNT: case BT_LSQB: - return XML_TOK_LITERAL; - default: - return XML_TOK_INVALID; - } - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - int tok; - if (ptr == end) - return XML_TOK_NONE; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_QUOT: - return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_APOS: - return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LT: - { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_EXCL: - return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_QUEST: - return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_NMSTRT: - case BT_HEX: - case BT_NONASCII: - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - *nextTokPtr = ptr - MINBPC(enc); - return XML_TOK_INSTANCE_START; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - case BT_CR: - if (ptr + MINBPC(enc) == end) { - *nextTokPtr = end; - /* indicate that this might be part of a CR/LF pair */ - return -XML_TOK_PROLOG_S; - } - /* fall through */ - case BT_S: case BT_LF: - for (;;) { - ptr += MINBPC(enc); - if (ptr == end) - break; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_LF: - break; - case BT_CR: - /* don't split CR/LF pair */ - if (ptr + MINBPC(enc) != end) - break; - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_PROLOG_S; - } - } - *nextTokPtr = ptr; - return XML_TOK_PROLOG_S; - case BT_PERCNT: - return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_COMMA: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_COMMA; - case BT_LSQB: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OPEN_BRACKET; - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return -XML_TOK_CLOSE_BRACKET; - if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { - if (ptr + MINBPC(enc) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_COND_SECT_CLOSE; - } - } - *nextTokPtr = ptr; - return XML_TOK_CLOSE_BRACKET; - case BT_LPAR: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OPEN_PAREN; - case BT_RPAR: - ptr += MINBPC(enc); - if (ptr == end) - return -XML_TOK_CLOSE_PAREN; - switch (BYTE_TYPE(enc, ptr)) { - case BT_AST: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_ASTERISK; - case BT_QUEST: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_QUESTION; - case BT_PLUS: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_PLUS; - case BT_CR: case BT_LF: case BT_S: - case BT_GT: case BT_COMMA: case BT_VERBAR: - case BT_RPAR: - *nextTokPtr = ptr; - return XML_TOK_CLOSE_PAREN; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_VERBAR: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OR; - case BT_GT: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DECL_CLOSE; - case BT_NUM: - return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NAME; \ - break; \ - } \ - if (IS_NAME_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NMTOKEN; \ - break; \ - } \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NMSTRT: - case BT_HEX: - tok = XML_TOK_NAME; - ptr += MINBPC(enc); - break; - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: -#ifdef XML_NS - case BT_COLON: -#endif - tok = XML_TOK_NMTOKEN; - ptr += MINBPC(enc); - break; - case BT_NONASCII: - if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { - ptr += MINBPC(enc); - tok = XML_TOK_NAME; - break; - } - if (IS_NAME_CHAR_MINBPC(enc, ptr)) { - ptr += MINBPC(enc); - tok = XML_TOK_NMTOKEN; - break; - } - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_GT: case BT_RPAR: case BT_COMMA: - case BT_VERBAR: case BT_LSQB: case BT_PERCNT: - case BT_S: case BT_CR: case BT_LF: - *nextTokPtr = ptr; - return tok; -#ifdef XML_NS - case BT_COLON: - ptr += MINBPC(enc); - switch (tok) { - case XML_TOK_NAME: - if (ptr == end) - return XML_TOK_PARTIAL; - tok = XML_TOK_PREFIXED_NAME; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - default: - tok = XML_TOK_NMTOKEN; - break; - } - break; - case XML_TOK_PREFIXED_NAME: - tok = XML_TOK_NMTOKEN; - break; - } - break; -#endif - case BT_PLUS: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_PLUS; - case BT_AST: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_ASTERISK; - case BT_QUEST: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_QUESTION; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return -tok; -} - -static int PTRCALL -PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - const char *start; - if (ptr == end) - return XML_TOK_NONE; - start = ptr; - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_AMP: - if (ptr == start) - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_LT: - /* this is for inside entity references */ - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_LF: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_CR: - if (ptr == start) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_S: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_ATTRIBUTE_VALUE_S; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -static int PTRCALL -PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - const char *start; - if (ptr == end) - return XML_TOK_NONE; - start = ptr; - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_AMP: - if (ptr == start) - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_PERCNT: - if (ptr == start) { - int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), - end, nextTokPtr); - return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_LF: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_CR: - if (ptr == start) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -#ifdef XML_DTD - -static int PTRCALL -PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - int level = 0; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - end = ptr + n; - } - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) - case BT_LT: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { - ++level; - ptr += MINBPC(enc); - } - } - break; - case BT_RSQB: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr += MINBPC(enc); - if (level == 0) { - *nextTokPtr = ptr; - return XML_TOK_IGNORE_SECT; - } - --level; - } - } - break; - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; -} - -#endif /* XML_DTD */ - -static int PTRCALL -PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, - const char **badPtr) -{ - ptr += MINBPC(enc); - end -= MINBPC(enc); - for (; ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - case BT_HEX: - case BT_MINUS: - case BT_APOS: - case BT_LPAR: - case BT_RPAR: - case BT_PLUS: - case BT_COMMA: - case BT_SOL: - case BT_EQUALS: - case BT_QUEST: - case BT_CR: - case BT_LF: - case BT_SEMI: - case BT_EXCL: - case BT_AST: - case BT_PERCNT: - case BT_NUM: -#ifdef XML_NS - case BT_COLON: -#endif - break; - case BT_S: - if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { - *badPtr = ptr; - return 0; - } - break; - case BT_NAME: - case BT_NMSTRT: - if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) - break; - default: - switch (BYTE_TO_ASCII(enc, ptr)) { - case 0x24: /* $ */ - case 0x40: /* @ */ - break; - default: - *badPtr = ptr; - return 0; - } - break; - } - } - return 1; -} - -/* This must only be called for a well-formed start-tag or empty - element tag. Returns the number of attributes. Pointers to the - first attsMax attributes are stored in atts. -*/ - -static int PTRCALL -PREFIX(getAtts)(const ENCODING *enc, const char *ptr, - int attsMax, ATTRIBUTE *atts) -{ - enum { other, inName, inValue } state = inName; - int nAtts = 0; - int open = 0; /* defined when state == inValue; - initialization just to shut up compilers */ - - for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { -#define START_NAME \ - if (state == other) { \ - if (nAtts < attsMax) { \ - atts[nAtts].name = ptr; \ - atts[nAtts].normalized = 1; \ - } \ - state = inName; \ - } -#define LEAD_CASE(n) \ - case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONASCII: - case BT_NMSTRT: - case BT_HEX: - START_NAME - break; -#undef START_NAME - case BT_QUOT: - if (state != inValue) { - if (nAtts < attsMax) - atts[nAtts].valuePtr = ptr + MINBPC(enc); - state = inValue; - open = BT_QUOT; - } - else if (open == BT_QUOT) { - state = other; - if (nAtts < attsMax) - atts[nAtts].valueEnd = ptr; - nAtts++; - } - break; - case BT_APOS: - if (state != inValue) { - if (nAtts < attsMax) - atts[nAtts].valuePtr = ptr + MINBPC(enc); - state = inValue; - open = BT_APOS; - } - else if (open == BT_APOS) { - state = other; - if (nAtts < attsMax) - atts[nAtts].valueEnd = ptr; - nAtts++; - } - break; - case BT_AMP: - if (nAtts < attsMax) - atts[nAtts].normalized = 0; - break; - case BT_S: - if (state == inName) - state = other; - else if (state == inValue - && nAtts < attsMax - && atts[nAtts].normalized - && (ptr == atts[nAtts].valuePtr - || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE - || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE - || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) - atts[nAtts].normalized = 0; - break; - case BT_CR: case BT_LF: - /* This case ensures that the first attribute name is counted - Apart from that we could just change state on the quote. */ - if (state == inName) - state = other; - else if (state == inValue && nAtts < attsMax) - atts[nAtts].normalized = 0; - break; - case BT_GT: - case BT_SOL: - if (state != inValue) - return nAtts; - break; - default: - break; - } - } - /* not reached */ -} - -static int PTRFASTCALL -PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) -{ - int result = 0; - - UNUSED(enc); - - /* skip &# */ - ptr += 2*MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_x)) { - for (ptr += MINBPC(enc); - !CHAR_MATCHES(enc, ptr, ASCII_SEMI); - ptr += MINBPC(enc)) { - int c = BYTE_TO_ASCII(enc, ptr); - switch (c) { - case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: - case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: - result <<= 4; - result |= (c - ASCII_0); - break; - case ASCII_A: case ASCII_B: case ASCII_C: - case ASCII_D: case ASCII_E: case ASCII_F: - result <<= 4; - result += 10 + (c - ASCII_A); - break; - case ASCII_a: case ASCII_b: case ASCII_c: - case ASCII_d: case ASCII_e: case ASCII_f: - result <<= 4; - result += 10 + (c - ASCII_a); - break; - } - if (result >= 0x110000) - return -1; - } - } - else { - for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { - int c = BYTE_TO_ASCII(enc, ptr); - result *= 10; - result += (c - ASCII_0); - if (result >= 0x110000) - return -1; - } - } - return checkCharRefNumber(result); -} - -static int PTRCALL -PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, - const char *end) -{ - UNUSED(enc); - - switch ((end - ptr)/MINBPC(enc)) { - case 2: - if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_l: - return ASCII_LT; - case ASCII_g: - return ASCII_GT; - } - } - break; - case 3: - if (CHAR_MATCHES(enc, ptr, ASCII_a)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_m)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_p)) - return ASCII_AMP; - } - } - break; - case 4: - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_q: - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_u)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_o)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_t)) - return ASCII_QUOT; - } - } - break; - case ASCII_a: - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_p)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_o)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_s)) - return ASCII_APOS; - } - } - break; - } - } - return 0; -} - -static int PTRCALL -PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) -{ - for (;;) { - switch (BYTE_TYPE(enc, ptr1)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (*ptr1++ != *ptr2++) \ - return 0; - LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) -#undef LEAD_CASE - /* fall through */ - if (*ptr1++ != *ptr2++) - return 0; - break; - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 1) { - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 2) { - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 3) { - if (*ptr2++ != *ptr1++) - return 0; - } - } - } - break; - default: - if (MINBPC(enc) == 1 && *ptr1 == *ptr2) - return 1; - switch (BYTE_TYPE(enc, ptr2)) { - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - return 0; - default: - return 1; - } - } - } - /* not reached */ -} - -static int PTRCALL -PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, - const char *end1, const char *ptr2) -{ - UNUSED(enc); - - for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { - if (ptr1 == end1) - return 0; - if (!CHAR_MATCHES(enc, ptr1, *ptr2)) - return 0; - } - return ptr1 == end1; -} - -static int PTRFASTCALL -PREFIX(nameLength)(const ENCODING *enc, const char *ptr) -{ - const char *start = ptr; - for (;;) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - ptr += MINBPC(enc); - break; - default: - return (int)(ptr - start); - } - } -} - -static const char * PTRFASTCALL -PREFIX(skipS)(const ENCODING *enc, const char *ptr) -{ - for (;;) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_LF: - case BT_CR: - case BT_S: - ptr += MINBPC(enc); - break; - default: - return ptr; - } - } -} - -static void PTRCALL -PREFIX(updatePosition)(const ENCODING *enc, - const char *ptr, - const char *end, - POSITION *pos) -{ - while (ptr < end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_LF: - pos->columnNumber = (XML_Size)-1; - pos->lineNumber++; - ptr += MINBPC(enc); - break; - case BT_CR: - pos->lineNumber++; - ptr += MINBPC(enc); - if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - pos->columnNumber = (XML_Size)-1; - break; - default: - ptr += MINBPC(enc); - break; - } - pos->columnNumber++; - } -} - -#undef DO_LEAD_CASE -#undef MULTIBYTE_CASES -#undef INVALID_CASES -#undef CHECK_NAME_CASE -#undef CHECK_NAME_CASES -#undef CHECK_NMSTRT_CASE -#undef CHECK_NMSTRT_CASES - -#endif /* XML_TOK_IMPL_C */ diff --git a/third-party/libstudxml/libstudxml/details/expat/xmltok_impl.h b/third-party/libstudxml/libstudxml/details/expat/xmltok_impl.h deleted file mode 100644 index da0ea60a..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/xmltok_impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd -See the file COPYING for copying permission. -*/ - -enum { - BT_NONXML, - BT_MALFORM, - BT_LT, - BT_AMP, - BT_RSQB, - BT_LEAD2, - BT_LEAD3, - BT_LEAD4, - BT_TRAIL, - BT_CR, - BT_LF, - BT_GT, - BT_QUOT, - BT_APOS, - BT_EQUALS, - BT_QUEST, - BT_EXCL, - BT_SOL, - BT_SEMI, - BT_NUM, - BT_LSQB, - BT_S, - BT_NMSTRT, - BT_COLON, - BT_HEX, - BT_DIGIT, - BT_NAME, - BT_MINUS, - BT_OTHER, /* known not to be a name or name start character */ - BT_NONASCII, /* might be a name or name start character */ - BT_PERCNT, - BT_LPAR, - BT_RPAR, - BT_AST, - BT_PLUS, - BT_COMMA, - BT_VERBAR -}; - -#include diff --git a/third-party/libstudxml/libstudxml/details/expat/xmltok_ns.c b/third-party/libstudxml/libstudxml/details/expat/xmltok_ns.c deleted file mode 100644 index c3b88fdf..00000000 --- a/third-party/libstudxml/libstudxml/details/expat/xmltok_ns.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* This file is included! */ -#ifdef XML_TOK_NS_C - -const ENCODING * -NS(XmlGetUtf8InternalEncoding)(void) -{ - return &ns(internal_utf8_encoding).enc; -} - -const ENCODING * -NS(XmlGetUtf16InternalEncoding)(void) -{ -#if BYTEORDER == 1234 - return &ns(internal_little2_encoding).enc; -#elif BYTEORDER == 4321 - return &ns(internal_big2_encoding).enc; -#else - const short n = 1; - return (*(const char *)&n - ? &ns(internal_little2_encoding).enc - : &ns(internal_big2_encoding).enc); -#endif -} - -static const ENCODING * const NS(encodings)[] = { - &ns(latin1_encoding).enc, - &ns(ascii_encoding).enc, - &ns(utf8_encoding).enc, - &ns(big2_encoding).enc, - &ns(big2_encoding).enc, - &ns(little2_encoding).enc, - &ns(utf8_encoding).enc /* NO_ENC */ -}; - -static int PTRCALL -NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_PROLOG_STATE, ptr, end, nextTokPtr); -} - -static int PTRCALL -NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_CONTENT_STATE, ptr, end, nextTokPtr); -} - -int -NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, - const char *name) -{ - int i = getEncodingIndex(name); - if (i == UNKNOWN_ENC) - return 0; - SET_INIT_ENC_INDEX(p, i); - p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); - p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); - p->initEnc.updatePosition = initUpdatePosition; - p->encPtr = encPtr; - *encPtr = &(p->initEnc); - return 1; -} - -static const ENCODING * -NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) -{ -#define ENCODING_MAX 128 - char buf[ENCODING_MAX]; - char *p = buf; - int i; - XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); - if (ptr != end) - return 0; - *p = 0; - if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) - return enc; - i = getEncodingIndex(buf); - if (i == UNKNOWN_ENC) - return 0; - return NS(encodings)[i]; -} - -int -NS(XmlParseXmlDecl)(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - return doParseXmlDecl(NS(findEncoding), - isGeneralTextEntity, - enc, - ptr, - end, - badPtr, - versionPtr, - versionEndPtr, - encodingName, - encoding, - standalone); -} - -#endif /* XML_TOK_NS_C */ diff --git a/third-party/libstudxml/libstudxml/details/export.hxx b/third-party/libstudxml/libstudxml/details/export.hxx deleted file mode 100644 index 913f72ea..00000000 --- a/third-party/libstudxml/libstudxml/details/export.hxx +++ /dev/null @@ -1,41 +0,0 @@ -// file : libstudxml/details/export.hxx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_DETAILS_EXPORT_HXX -#define LIBSTUDXML_DETAILS_EXPORT_HXX - -// Normally we don't export class templates (but do complete specializations), -// inline functions, and classes with only inline member functions. Exporting -// classes that inherit from non-exported/imported bases (e.g., std::string) -// will end up badly. The only known workarounds are to not inherit or to not -// export. Also, MinGW GCC doesn't like seeing non-exported function being -// used before their inline definition. The workaround is to reorder code. In -// the end it's all trial and error. - -#if defined(LIBSTUDXML_STATIC) // Using static. -# define LIBSTUDXML_EXPORT -#elif defined(LIBSTUDXML_STATIC_BUILD) // Building static. -# define LIBSTUDXML_EXPORT -#elif defined(LIBSTUDXML_SHARED) // Using shared. -# ifdef _WIN32 -# define LIBSTUDXML_EXPORT __declspec(dllimport) -# else -# define LIBSTUDXML_EXPORT -# endif -#elif defined(LIBSTUDXML_SHARED_BUILD) // Building shared. -# ifdef _WIN32 -# define LIBSTUDXML_EXPORT __declspec(dllexport) -# else -# define LIBSTUDXML_EXPORT -# endif -#else -// If none of the above macros are defined, then we assume we are being used -// by some third-party build system that cannot/doesn't signal the library -// type. Note that this fallback works for both static and shared but in case -// of shared will be sub-optimal compared to having dllimport. -// -# define LIBSTUDXML_EXPORT // Using static or shared. -#endif - -#endif // LIBSTUDXML_DETAILS_EXPORT_HXX diff --git a/third-party/libstudxml/libstudxml/details/genx/LICENSE b/third-party/libstudxml/libstudxml/details/genx/LICENSE deleted file mode 100644 index 616519a9..00000000 --- a/third-party/libstudxml/libstudxml/details/genx/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2007-2019 Code Synthesis Tools CC. -Copyright (c) Tim Bray and Sun Microsystems, 2004. - -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 furnished 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, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/third-party/libstudxml/libstudxml/details/genx/README b/third-party/libstudxml/libstudxml/details/genx/README deleted file mode 100644 index 10a72381..00000000 --- a/third-party/libstudxml/libstudxml/details/genx/README +++ /dev/null @@ -1,2 +0,0 @@ -This directory contains a customized version of the Genx XML generator -library for internal use by libstudxml. diff --git a/third-party/libstudxml/libstudxml/details/genx/char-props.c b/third-party/libstudxml/libstudxml/details/genx/char-props.c deleted file mode 100644 index 2ea0208f..00000000 --- a/third-party/libstudxml/libstudxml/details/genx/char-props.c +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (c) 2007-2019 Code Synthesis Tools CC. - * Copyright (c) 2004 by Tim Bray and Sun Microsystems. - * - * For copying permission, see the accompanying COPYING file. - */ - -/* - * Construct character-properties tables for genx. - * Quite likely there's a better way. - * This version is generated semi-automatically from the source code of the - * XML specification via emacs global replace and keyboard macros - */ -#include - -static void charProp(char * p, int c, int prop) -{ - p[c] |= prop; -} - -static void rangeProp(char * p, size_t start, size_t end, int prop) -{ - size_t i; - for (i = start; i <= end; i++) - p[i] |= prop; -} - -void genxSetCharProps(char * p) -{ - size_t i; - - for (i = 0; i < GENX_CHAR_TABLE_SIZE; i++) - p[i] = 0; - - /* per XML 1.0 */ - charProp(p, 0x9, GENX_XML_CHAR); - charProp(p, 0xa, GENX_XML_CHAR); - charProp(p, 0xd, GENX_XML_CHAR); - rangeProp(p, 0x20, 0xff, GENX_XML_CHAR); - -#if GENX_CHAR_TABLE_SIZE == 0x10000 - rangeProp(p, 0x0100, 0xd7ff, GENX_XML_CHAR); - rangeProp(p, 0xe000, 0xfffd, GENX_XML_CHAR); -#endif - - /* Letter ::= BaseChar | Ideographic */ - rangeProp(p, 0x0041, 0x005A, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0061, 0x007A, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x00C0, 0x00D6, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x00D8, 0x00F6, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x00F8, 0x00FF, GENX_LETTER|GENX_NAMECHAR); - -#if GENX_CHAR_TABLE_SIZE == 0x10000 - - rangeProp(p, 0x0100, 0x0131, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0134, 0x013E, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0141, 0x0148, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x014A, 0x017E, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0180, 0x01C3, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x01CD, 0x01F0, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x01F4, 0x01F5, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x01FA, 0x0217, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0250, 0x02A8, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x02BB, 0x02C1, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0386, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0388, 0x038A, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x038C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x038E, 0x03A1, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x03A3, 0x03CE, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x03D0, 0x03D6, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x03DA, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x03DC, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x03DE, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x03E0, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x03E2, 0x03F3, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0401, 0x040C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x040E, 0x044F, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0451, 0x045C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x045E, 0x0481, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0490, 0x04C4, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x04C7, 0x04C8, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x04CB, 0x04CC, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x04D0, 0x04EB, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x04EE, 0x04F5, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x04F8, 0x04F9, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0531, 0x0556, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0559, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0561, 0x0586, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x05D0, 0x05EA, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x05F0, 0x05F2, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0621, 0x063A, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0641, 0x064A, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0671, 0x06B7, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x06BA, 0x06BE, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x06C0, 0x06CE, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x06D0, 0x06D3, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x06D5, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x06E5, 0x06E6, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0905, 0x0939, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x093D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0958, 0x0961, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0985, 0x098C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x098F, 0x0990, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0993, 0x09A8, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x09AA, 0x09B0, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x09B2, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x09B6, 0x09B9, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x09DC, 0x09DD, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x09DF, 0x09E1, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x09F0, 0x09F1, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A05, 0x0A0A, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A0F, 0x0A10, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A13, 0x0A28, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A2A, 0x0A30, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A32, 0x0A33, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A35, 0x0A36, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A38, 0x0A39, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A59, 0x0A5C, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0A5E, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A72, 0x0A74, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A85, 0x0A8B, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0A8D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A8F, 0x0A91, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A93, 0x0AA8, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0AAA, 0x0AB0, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0AB2, 0x0AB3, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0AB5, 0x0AB9, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0ABD, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0AE0, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B05, 0x0B0C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B0F, 0x0B10, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B13, 0x0B28, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B2A, 0x0B30, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B32, 0x0B33, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B36, 0x0B39, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0B3D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B5C, 0x0B5D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B5F, 0x0B61, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B85, 0x0B8A, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B8E, 0x0B90, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B92, 0x0B95, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B99, 0x0B9A, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0B9C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B9E, 0x0B9F, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0BA3, 0x0BA4, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0BA8, 0x0BAA, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0BAE, 0x0BB5, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0BB7, 0x0BB9, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C05, 0x0C0C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C0E, 0x0C10, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C12, 0x0C28, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C2A, 0x0C33, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C35, 0x0C39, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C60, 0x0C61, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C85, 0x0C8C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C8E, 0x0C90, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C92, 0x0CA8, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0CAA, 0x0CB3, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0CB5, 0x0CB9, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0CDE, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0CE0, 0x0CE1, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0D05, 0x0D0C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0D0E, 0x0D10, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0D12, 0x0D28, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0D2A, 0x0D39, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0D60, 0x0D61, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0E01, 0x0E2E, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0E30, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0E32, 0x0E33, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0E40, 0x0E45, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0E81, 0x0E82, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0E84, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0E87, 0x0E88, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0E8A, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0E8D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0E94, 0x0E97, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0E99, 0x0E9F, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0EA1, 0x0EA3, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0EA5, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0EA7, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0EAA, 0x0EAB, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0EAD, 0x0EAE, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0EB0, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0EB2, 0x0EB3, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0EBD, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0EC0, 0x0EC4, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0F40, 0x0F47, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0F49, 0x0F69, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x10A0, 0x10C5, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x10D0, 0x10F6, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1100, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1102, 0x1103, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1105, 0x1107, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1109, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x110B, 0x110C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x110E, 0x1112, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x113C, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x113E, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1140, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x114C, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x114E, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1150, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1154, 0x1155, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1159, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x115F, 0x1161, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1163, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1165, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1167, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1169, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x116D, 0x116E, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1172, 0x1173, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1175, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x119E, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x11A8, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x11AB, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x11AE, 0x11AF, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x11B7, 0x11B8, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x11BA, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x11BC, 0x11C2, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x11EB, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x11F0, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x11F9, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1E00, 0x1E9B, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1EA0, 0x1EF9, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1F00, 0x1F15, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1F18, 0x1F1D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1F20, 0x1F45, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1F48, 0x1F4D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1F50, 0x1F57, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1F59, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1F5B, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1F5D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1F5F, 0x1F7D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1F80, 0x1FB4, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1FB6, 0x1FBC, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x1FBE, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1FC2, 0x1FC4, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1FC6, 0x1FCC, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1FD0, 0x1FD3, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1FD6, 0x1FDB, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1FE0, 0x1FEC, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1FF2, 0x1FF4, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x1FF6, 0x1FFC, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x2126, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x212A, 0x212B, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x212E, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x2180, 0x2182, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x3041, 0x3094, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x30A1, 0x30FA, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x3105, 0x312C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0xAC00, 0xD7A3, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x4E00, 0x9FA5, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x3007, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x3021, 0x3029, GENX_LETTER|GENX_NAMECHAR); - -#endif /* GENX_CHAR_TABLE_SIZE == 0x10000 */ - - /* - * NameChar ::= - * Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender - */ - - charProp(p, '.', GENX_NAMECHAR); - charProp(p, '-', GENX_NAMECHAR); - charProp(p, '_', GENX_NAMECHAR); - - rangeProp(p, 0x0030, 0x0039, GENX_NAMECHAR); - charProp(p, 0x00B7, GENX_LETTER|GENX_NAMECHAR); - -#if GENX_CHAR_TABLE_SIZE == 0x10000 - - rangeProp(p, 0x0660, 0x0669, GENX_NAMECHAR); - rangeProp(p, 0x06F0, 0x06F9, GENX_NAMECHAR); - rangeProp(p, 0x0966, 0x096F, GENX_NAMECHAR); - rangeProp(p, 0x09E6, 0x09EF, GENX_NAMECHAR); - rangeProp(p, 0x0A66, 0x0A6F, GENX_NAMECHAR); - rangeProp(p, 0x0AE6, 0x0AEF, GENX_NAMECHAR); - rangeProp(p, 0x0B66, 0x0B6F, GENX_NAMECHAR); - rangeProp(p, 0x0BE7, 0x0BEF, GENX_NAMECHAR); - rangeProp(p, 0x0C66, 0x0C6F, GENX_NAMECHAR); - rangeProp(p, 0x0CE6, 0x0CEF, GENX_NAMECHAR); - rangeProp(p, 0x0D66, 0x0D6F, GENX_NAMECHAR); - rangeProp(p, 0x0E50, 0x0E59, GENX_NAMECHAR); - rangeProp(p, 0x0ED0, 0x0ED9, GENX_NAMECHAR); - rangeProp(p, 0x0F20, 0x0F29, GENX_NAMECHAR); - rangeProp(p, 0x0300, 0x0345, GENX_NAMECHAR); - rangeProp(p, 0x0360, 0x0361, GENX_NAMECHAR); - rangeProp(p, 0x0483, 0x0486, GENX_NAMECHAR); - rangeProp(p, 0x0591, 0x05A1, GENX_NAMECHAR); - rangeProp(p, 0x05A3, 0x05B9, GENX_NAMECHAR); - rangeProp(p, 0x05BB, 0x05BD, GENX_NAMECHAR); - charProp(p, 0x05BF, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x05C1, 0x05C2, GENX_NAMECHAR); - charProp(p, 0x05C4, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x064B, 0x0652, GENX_NAMECHAR); - charProp(p, 0x0670, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x06D6, 0x06DC, GENX_NAMECHAR); - rangeProp(p, 0x06DD, 0x06DF, GENX_NAMECHAR); - rangeProp(p, 0x06E0, 0x06E4, GENX_NAMECHAR); - rangeProp(p, 0x06E7, 0x06E8, GENX_NAMECHAR); - rangeProp(p, 0x06EA, 0x06ED, GENX_NAMECHAR); - rangeProp(p, 0x0901, 0x0903, GENX_NAMECHAR); - charProp(p, 0x093C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x093E, 0x094C, GENX_NAMECHAR); - charProp(p, 0x094D, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0951, 0x0954, GENX_NAMECHAR); - rangeProp(p, 0x0962, 0x0963, GENX_NAMECHAR); - rangeProp(p, 0x0981, 0x0983, GENX_NAMECHAR); - charProp(p, 0x09BC, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x09BE, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x09BF, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x09C0, 0x09C4, GENX_NAMECHAR); - rangeProp(p, 0x09C7, 0x09C8, GENX_NAMECHAR); - rangeProp(p, 0x09CB, 0x09CD, GENX_NAMECHAR); - charProp(p, 0x09D7, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x09E2, 0x09E3, GENX_NAMECHAR); - charProp(p, 0x0A02, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0A3C, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0A3E, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0A3F, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0A40, 0x0A42, GENX_NAMECHAR); - rangeProp(p, 0x0A47, 0x0A48, GENX_NAMECHAR); - rangeProp(p, 0x0A4B, 0x0A4D, GENX_NAMECHAR); - rangeProp(p, 0x0A70, 0x0A71, GENX_NAMECHAR); - rangeProp(p, 0x0A81, 0x0A83, GENX_NAMECHAR); - charProp(p, 0x0ABC, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0ABE, 0x0AC5, GENX_NAMECHAR); - rangeProp(p, 0x0AC7, 0x0AC9, GENX_NAMECHAR); - rangeProp(p, 0x0ACB, 0x0ACD, GENX_NAMECHAR); - rangeProp(p, 0x0B01, 0x0B03, GENX_NAMECHAR); - charProp(p, 0x0B3C, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0B3E, 0x0B43, GENX_NAMECHAR); - rangeProp(p, 0x0B47, 0x0B48, GENX_NAMECHAR); - rangeProp(p, 0x0B4B, 0x0B4D, GENX_NAMECHAR); - rangeProp(p, 0x0B56, 0x0B57, GENX_NAMECHAR); - rangeProp(p, 0x0B82, 0x0B83, GENX_NAMECHAR); - rangeProp(p, 0x0BBE, 0x0BC2, GENX_NAMECHAR); - rangeProp(p, 0x0BC6, 0x0BC8, GENX_NAMECHAR); - rangeProp(p, 0x0BCA, 0x0BCD, GENX_NAMECHAR); - charProp(p, 0x0BD7, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0C01, 0x0C03, GENX_NAMECHAR); - rangeProp(p, 0x0C3E, 0x0C44, GENX_NAMECHAR); - rangeProp(p, 0x0C46, 0x0C48, GENX_NAMECHAR); - rangeProp(p, 0x0C4A, 0x0C4D, GENX_NAMECHAR); - rangeProp(p, 0x0C55, 0x0C56, GENX_NAMECHAR); - rangeProp(p, 0x0C82, 0x0C83, GENX_NAMECHAR); - rangeProp(p, 0x0CBE, 0x0CC4, GENX_NAMECHAR); - rangeProp(p, 0x0CC6, 0x0CC8, GENX_NAMECHAR); - rangeProp(p, 0x0CCA, 0x0CCD, GENX_NAMECHAR); - rangeProp(p, 0x0CD5, 0x0CD6, GENX_NAMECHAR); - rangeProp(p, 0x0D02, 0x0D03, GENX_NAMECHAR); - rangeProp(p, 0x0D3E, 0x0D43, GENX_NAMECHAR); - rangeProp(p, 0x0D46, 0x0D48, GENX_NAMECHAR); - rangeProp(p, 0x0D4A, 0x0D4D, GENX_NAMECHAR); - charProp(p, 0x0D57, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0E31, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0E34, 0x0E3A, GENX_NAMECHAR); - rangeProp(p, 0x0E47, 0x0E4E, GENX_NAMECHAR); - charProp(p, 0x0EB1, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0EB4, 0x0EB9, GENX_NAMECHAR); - rangeProp(p, 0x0EBB, 0x0EBC, GENX_NAMECHAR); - rangeProp(p, 0x0EC8, 0x0ECD, GENX_NAMECHAR); - rangeProp(p, 0x0F18, 0x0F19, GENX_NAMECHAR); - charProp(p, 0x0F35, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0F37, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0F39, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0F3E, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0F3F, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0F71, 0x0F84, GENX_NAMECHAR); - rangeProp(p, 0x0F86, 0x0F8B, GENX_NAMECHAR); - rangeProp(p, 0x0F90, 0x0F95, GENX_NAMECHAR); - charProp(p, 0x0F97, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x0F99, 0x0FAD, GENX_NAMECHAR); - rangeProp(p, 0x0FB1, 0x0FB7, GENX_NAMECHAR); - charProp(p, 0x0FB9, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x20D0, 0x20DC, GENX_NAMECHAR); - charProp(p, 0x20E1, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x302A, 0x302F, GENX_NAMECHAR); - charProp(p, 0x3099, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x309A, GENX_LETTER|GENX_NAMECHAR); - - charProp(p, 0x02D0, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x02D1, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0387, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0640, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0E46, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x0EC6, GENX_LETTER|GENX_NAMECHAR); - charProp(p, 0x3005, GENX_LETTER|GENX_NAMECHAR); - rangeProp(p, 0x3031, 0x3035, GENX_NAMECHAR); - rangeProp(p, 0x309D, 0x309E, GENX_NAMECHAR); - rangeProp(p, 0x30FC, 0x30FE, GENX_NAMECHAR); - -#endif /* GENX_CHAR_TABLE_SIZE == 0x10000 */ -} diff --git a/third-party/libstudxml/libstudxml/details/genx/genx.c b/third-party/libstudxml/libstudxml/details/genx/genx.c deleted file mode 100644 index 36aad97f..00000000 --- a/third-party/libstudxml/libstudxml/details/genx/genx.c +++ /dev/null @@ -1,2502 +0,0 @@ -/* - * Copyright (c) 2007-2019 Code Synthesis Tools CC. - * Copyright (c) 2004 by Tim Bray and Sun Microsystems. - * - * For copying permission, see the accompanying COPYING file. - */ - -#define GENX_VERSION "cs-1" - -#include -#include -#include - -#include - -#define Boolean int -#define True 1 -#define False 0 -#define STRLEN_XMLNS_COLON 6 - - -/******************************* - * writer state - */ -typedef enum -{ - SEQUENCE_NO_DOC, - SEQUENCE_PRE_DOC, - SEQUENCE_POST_DOC, - SEQUENCE_START_TAG, - SEQUENCE_ATTRIBUTES, - SEQUENCE_START_ATTR, - SEQUENCE_CONTENT -} writerSequence; - -/******************************* - * generic pointer list - */ -typedef struct -{ - genxWriter writer; - size_t count; - size_t space; - void * * pointers; -} plist; - -/******************************* - * text collector, for attribute values - */ -typedef struct -{ - utf8 buf; - size_t used; - size_t space; -} collector; - -/******************************* - * Structs with opaquely-exposed handles - */ - -/* - * This one's tricky, to handle stacking namespaces - * 'declaration' is the current attribute which would be used to - * declare the currently-effective prefix - * 'defDeclaration' is a appropriate declaration when this is being - * used with the default prefix as passed to genxDeclareNamespace - * baroque is true if this namespace has been used with more than one - * prefix, or is the default namespace but has been unset - */ -struct genxNamespace_rec -{ - genxWriter writer; - utf8 name; - size_t declCount; - Boolean baroque; - genxAttribute declaration; - genxAttribute defaultDecl; -}; - -struct genxElement_rec -{ - genxWriter writer; - utf8 name; - genxNamespace ns; -}; - -typedef enum -{ - ATTR_NSDECL, - ATTR_NAKED, - ATTR_PREFIXED -} attrType; - -struct genxAttribute_rec -{ - genxWriter writer; - utf8 name; - genxNamespace ns; - collector value; - int provided; /* provided for current element? */ - attrType atype; - genxAttribute next; /* Attribute order chain if not canonical. */ -}; - -/******************************* - * genx's sandbox - */ -struct genxWriter_rec -{ - genxSender * sender; - genxStatus status; - writerSequence sequence; - char xmlChars[GENX_CHAR_TABLE_SIZE]; - void * userData; - int nextPrefix; - utf8 empty; - Boolean defaultNsDeclared; - genxAttribute xmlnsEquals; - genxElement nowStarting; - genxAttribute nowStartingAttr; - plist namespaces; - plist elements; - plist attributes; - plist prefixes; - plist stack; - struct genxAttribute_rec arec; /* Dummy attribute used for lookup. */ - char * etext[100]; - genxAlloc alloc; - genxDealloc dealloc; - - /* Pretty-printing state */ - int ppIndent; - int ppDepth; - int ppSuspendDepth; /* Non-0 means we are suspended. */ - Boolean ppSimple; - - /* Canonicalization. */ - Boolean canonical; - - /* Attrbute order when not canonical. */ - genxAttribute firstAttribute; - genxAttribute lastAttribute; -}; - -/******************************* - * Forward declarations - */ -static genxAttribute declareAttribute(genxWriter w, genxNamespace ns, - constUtf8 name, constUtf8 valuestr, - genxStatus * statusP); -static genxStatus addNamespace(genxNamespace ns, constUtf8 prefix); -static genxStatus unsetDefaultNamespace(genxWriter w); -static genxStatus addAttribute(genxAttribute a, constUtf8 valuestr); -void genxSetCharProps(char * p); - -/******************************* - * End of declarations - */ - -/******************************* - * private memory utilities - */ -static void * allocate(genxWriter w, size_t bytes) -{ - if (w->alloc) - return (void *) (*w->alloc)(w->userData, bytes); - else - return (void *) malloc(bytes); -} - -static void deallocate(genxWriter w, void * data) -{ - if (w->dealloc) - (*w->dealloc)(w->userData, data); - else if (w->alloc == NULL) - free(data); -} - -static utf8 copy(genxWriter w, constUtf8 from) -{ - utf8 temp; - - if ((temp = (utf8) allocate(w, strlen((const char *) from) + 1)) == NULL) - return NULL; - strcpy((char *) temp, (const char *) from); - return temp; -} - -static genxStatus initCollector(genxWriter w, collector * c) -{ - c->space = 100; - if ((c->buf = (utf8) allocate(w, c->space)) == NULL) - return GENX_ALLOC_FAILED; - c->used = 0; - return GENX_SUCCESS; -} - -static genxStatus growCollector(genxWriter w, collector * c, size_t size) -{ - utf8 newSpace; - - c->space = size * 2; - if ((newSpace = (utf8) allocate(w, c->space)) == NULL) - return GENX_ALLOC_FAILED; - - strncpy((char *) newSpace, (const char *) c->buf, c->used); - newSpace[c->used] = 0; - deallocate(w, c->buf); - c->buf = newSpace; - return GENX_SUCCESS; -} - -static void startCollect(collector * c) -{ - c->used = 0; -} -static void endCollect(collector * c) -{ - c->buf[c->used] = 0; -} - -static genxStatus collectString(genxWriter w, collector * c, constUtf8 string) -{ - size_t sl = strlen((const char *) string); - - if (sl >= c->space) - if ((w->status = growCollector(w, c, sl)) != GENX_SUCCESS) - return GENX_ALLOC_FAILED; - - strcpy((char *) c->buf, (const char *) string); - return GENX_SUCCESS; -} - -#define collectPiece(w,c,d,size) {if (((c)->used+(size))>=(c)->space){if (((w)->status=growCollector(w,c,(c)->used+(size)))!=GENX_SUCCESS) return (w)->status;}memcpy((char *)(c)->buf+(c)->used,d,size);(c)->used+=size;} - -/******************************* - * private list utilities - */ -static genxStatus initPlist(genxWriter w, plist * pl) -{ - pl->writer = w; - pl->count = 0; - pl->space = 10; - pl->pointers = (void * *) allocate(w, pl->space * sizeof(void *)); - if (pl->pointers == NULL) - return GENX_ALLOC_FAILED; - - return GENX_SUCCESS; -} - -/* - * make room in a plist - */ -static Boolean checkExpand(plist * pl) -{ - void * * newlist; - size_t i; - - if (pl->count < pl->space) - return True; - - pl->space *= 2; - newlist = (void * *) allocate(pl->writer, pl->space * sizeof(void *)); - if (newlist == NULL) - return False; - for (i = 0; i < pl->count; i++) - newlist[i] = pl->pointers[i]; - deallocate(pl->writer, pl->pointers); - pl->pointers = newlist; - - return True; -} - -/* - * stick something on the end of a plist - */ -static genxStatus listAppend(plist * pl, void * pointer) -{ - if (!checkExpand(pl)) - return GENX_ALLOC_FAILED; - - pl->pointers[pl->count++] = pointer; - return GENX_SUCCESS; -} - -/* - * insert in place, shuffling up - */ -static genxStatus listInsert(plist * pl, void * pointer, size_t at) -{ - size_t i; - - if (!checkExpand(pl)) - return GENX_ALLOC_FAILED; - - for (i = pl->count; i > at; i--) - pl->pointers[i] = pl->pointers[i - 1]; - pl->count++; - - pl->pointers[at] = pointer; - return GENX_SUCCESS; -} - -/******************************* - * list lookups - */ - -static genxNamespace findNamespace(plist * pl, constUtf8 uri) -{ - size_t i; - genxNamespace * nn = (genxNamespace *) pl->pointers; - - for (i = 0; i < pl->count; i++) - if (strcmp((char *) uri, (const char *) nn[i]->name) == 0) - return nn[i]; - - return NULL; -} - -static genxElement findElement(plist * pl, constUtf8 xmlns, constUtf8 name) -{ - size_t i; - genxElement * ee = (genxElement *) pl->pointers; - - for (i = 0; i < pl->count; i++) - { - if (xmlns == NULL) - { - if (ee[i]->ns == NULL && strcmp((const char *) name, - (const char *) ee[i]->name) == 0) - return ee[i]; - } - else - { - if (ee[i]->ns != NULL && - strcmp((const char *) xmlns, (const char *) ee[i]->ns->name) == 0 && - strcmp((const char *) name, (const char *) ee[i]->name) == 0) - return ee[i]; - } - } - - return NULL; -} - -/* - * store & intern a prefix, after giving it the - * "xmlns:" prefix. Don't allow storing the same one twice unless 'force' - * is set. - */ -static utf8 storePrefix(genxWriter w, constUtf8 prefix, Boolean force) -{ - int high, low; - utf8 * pp = (utf8 *) w->prefixes.pointers; - unsigned char buf[1024]; - - if (prefix[0] == 0) - prefix = (utf8) "xmlns"; - else - { - sprintf((char *) buf, "xmlns:%s", prefix); - prefix = buf; - } - - high = (int) w->prefixes.count; - low = -1; - while (high - low > 1) - { - int probe = (high + low) / 2; - if (strcmp((const char *) prefix, (const char *) pp[probe]) < 0) - high = probe; - else - low = probe; - } - - /* already there? */ - if (low != -1 && strcmp((const char *) prefix, (const char *) pp[low]) == 0) - { - if (force) - return pp[low]; - - w->status = GENX_DUPLICATE_PREFIX; - return NULL; - } - - /* copy & insert */ - if ((prefix = copy(w, prefix)) == NULL) - { - w->status = GENX_ALLOC_FAILED; - return NULL; - } - - w->status = listInsert(&w->prefixes, (void *) prefix, (size_t) high); - if (w->status != GENX_SUCCESS) - return NULL; - - return (utf8) prefix; -} - -/******************************* - * UTF8 bit-banging - */ - -/* - * Retrieve the character pointed at, and advance the pointer; return -1 on - * error - */ -int genxNextUnicodeChar(constUtf8 * sp) -{ - utf8 s = (utf8) *sp; - int c; - - if (*s == 0) - return -1; - - if (*s < 0x80) - c = *s++; - - /* all this encoding sanity-checking taken from section 3.10 of Unicode 4 */ - else if (*s < 0xc2) - goto malformed; - - /* 2-byte encodings, first byte c2 .. df */ - else if (*s < 0xe0) - { - c = (*s++ & 0x1f) << 6; - - /* - * for this common idiom, if ((c & 0xc0) != 0x80) is slightly faster - * on MacOS (PPC) - */ - if (*s < 0x80 || *s > 0xbf) - goto malformed; - - c |= *s++ & 0x3f; - } - - /* 3-byte encodings, first byte e0 .. ef */ - else if (*s < 0xf0) - { - int b0 = *s; - c = (*s++ & 0x0f) << 12; - - if ((b0 == 0xe0 && (*s < 0xa0 || *s > 0xbf)) || - (b0 < 0xed && (*s < 0x80 || *s > 0xbf)) || - (b0 == 0xed && (*s < 0x80 || *s > 0x9f)) || - (b0 > 0xed && (*s < 0x80 || *s > 0xbf))) - goto malformed; - - c |= (*s++ & 0x3f) << 6; - - if (*s < 0x80 || *s > 0xbf) - goto malformed; - - c |= *s++ & 0x3f; - } - - /* 4-byte encodings, first byte f0 .. f4 */ - else if (*s < 0xf5) - { - int b0 = *s; - c = (*s++ & 0x07) << 18; - - if ((b0 == 0xf0 && (*s < 0x90 || *s > 0xbf)) || - (b0 < 0xf4 && (*s < 0x80 || *s > 0xbf)) || - (b0 >= 0xf4 && (*s < 0x80 || *s > 0x8f))) - goto malformed; - - c |= (*s++ & 0x3f) << 12; - - if (*s < 0x80 || *s > 0xbf) - goto malformed; - - c |= (*s++ & 0x3f) << 6; - - if (*s < 0x80 || *s > 0xbf) - goto malformed; - - c |= *s++ & 0x3f; - } - else - goto malformed; - - *sp = s; - return c; - - /* - * this is needed by scrubText, which wants to get the pointer moved - * past the problem area. - */ -malformed: - if (*s) - ++s; - *sp = s; - return -1; -} - -static Boolean isXMLChar(genxWriter w, int c) -{ - if (c < 0) - return False; - else if (c < GENX_CHAR_TABLE_SIZE) - return (int) w->xmlChars[c]; - else - return (c <= 0x10ffff); -} - -static Boolean isLetter(genxWriter w, int c) -{ - if (c < 0 || c > 0xffff) - return False; - else - { -#if GENX_CHAR_TABLE_SIZE == 0x10000 - return w->xmlChars[c] & GENX_LETTER; -#else - return c < GENX_CHAR_TABLE_SIZE ? (w->xmlChars[c] & GENX_LETTER) : True; -#endif - } -} - -static Boolean isNameChar(genxWriter w, int c) -{ - if (c < 0 || c > 0xffff) - return False; - else - { -#if GENX_CHAR_TABLE_SIZE == 0x10000 - return w->xmlChars[c] & GENX_NAMECHAR; -#else - return c < GENX_CHAR_TABLE_SIZE ? (w->xmlChars[c] & GENX_NAMECHAR) : True; -#endif - } -} - -/******************************* - * Constructors, setters/getters - */ - -/* - * Construct a new genxWriter - */ -genxWriter genxNew(genxAlloc alloc, genxDealloc dealloc, void * userData) -{ - genxWriter w; - genxNamespace xml; - - if (alloc) - w = (genxWriter) (*alloc)(userData, sizeof(struct genxWriter_rec)); - else - w = (genxWriter) malloc(sizeof(struct genxWriter_rec)); - - if (w == NULL) - return NULL; - - w->status = GENX_SUCCESS; - w->alloc = alloc; - w->dealloc = dealloc; - w->userData = userData; - w->sequence = SEQUENCE_NO_DOC; - - if (initPlist(w, &w->namespaces) != GENX_SUCCESS || - initPlist(w, &w->elements) != GENX_SUCCESS || - initPlist(w, &w->attributes) != GENX_SUCCESS || - initPlist(w, &w->prefixes) != GENX_SUCCESS || - initPlist(w, &w->stack) != GENX_SUCCESS) - return NULL; - - if ((w->status = initCollector(w, &w->arec.value)) != GENX_SUCCESS) - return NULL; - - if ((w->empty = copy(w, (utf8) "")) == NULL) - { - w->status = GENX_ALLOC_FAILED; - return NULL; - } - - w->xmlnsEquals = declareAttribute(w, NULL, (utf8) "xmlns", NULL, &w->status); - if (w->xmlnsEquals == NULL || w->status != GENX_SUCCESS) - return NULL; - w->defaultNsDeclared = False; - - w->nextPrefix = 1; - - genxSetCharProps(w->xmlChars); - - w->etext[GENX_SUCCESS] = "success"; - w->etext[GENX_BAD_UTF8] = "invalid UTF-8"; - w->etext[GENX_NON_XML_CHARACTER] = "non-XML character"; - w->etext[GENX_BAD_NAME] = "invalid name"; - w->etext[GENX_ALLOC_FAILED] = "memory allocation failed"; - w->etext[GENX_BAD_NAMESPACE_NAME] = "invalid namespace name"; - w->etext[GENX_INTERNAL_ERROR] = "internal error"; - w->etext[GENX_DUPLICATE_PREFIX] = "duplicate prefix"; - w->etext[GENX_SEQUENCE_ERROR] = "call out of sequence"; - w->etext[GENX_NO_START_TAG] = "no start tag for end element call"; - w->etext[GENX_IO_ERROR] = "io error"; - w->etext[GENX_MISSING_VALUE] = "missing attribute value"; - w->etext[GENX_MALFORMED_COMMENT] = "malformed comment body"; - w->etext[GENX_MALFORMED_PI] = "?> in PI"; - w->etext[GENX_XML_PI_TARGET] = "target of PI matches [xX][mM][lL]"; - w->etext[GENX_DUPLICATE_ATTRIBUTE] = "duplicate attribute"; - w->etext[GENX_ATTRIBUTE_IN_DEFAULT_NAMESPACE] = - "attribute is default namespace"; - w->etext[GENX_DUPLICATE_NAMESPACE] = - "namespace declared twice with different prefixes"; - w->etext[GENX_BAD_DEFAULT_DECLARATION] = - "default namespace declared on an element which is not in a namespace"; - - /* the xml: namespace is pre-wired */ - xml = genxDeclareNamespace(w, (utf8) "http://www.w3.org/XML/1998/namespace", - (utf8) "xml", &w->status); - if (xml == NULL) - return NULL; - xml->declCount = 1; - xml->declaration = xml->defaultDecl; - - w->ppIndent = 0; /* Pretty-printing is disabled by default. */ - w->canonical = False; /* No canonicalization by default. */ - - w->firstAttribute = NULL; - w->lastAttribute = NULL; - return w; -} - -genxStatus genxReset (genxWriter w) -{ - size_t i; - - /* Clean up the stack. */ - w->stack.count = 0; - - /* Reset namespace declaration counts. The first entry is the pre-wired - xml namespace. */ - ((genxNamespace) w->namespaces.pointers[0])->declCount = 1; - - for (i = 1; i < w->namespaces.count; i++) - { - ((genxNamespace) w->namespaces.pointers[i])->declCount = 0; - ((genxNamespace) w->namespaces.pointers[i])->baroque = False; - } - - /* Clear provided attributes. */ - for (i = 0; i < w->attributes.count; i++) - ((genxAttribute) w->attributes.pointers[i])->provided = False; - - /* Clear attribute list. */ - if (!w->canonical) - { - while (w->firstAttribute != NULL) - { - genxAttribute t = w->firstAttribute->next; - w->firstAttribute->next = NULL; - w->firstAttribute = t; - } - - w->lastAttribute = NULL; - } - - w->status = GENX_SUCCESS; - w->sequence = SEQUENCE_NO_DOC; - - return w->status; -} - - -/* - * get/set userData - */ -void genxSetUserData(genxWriter w, void * userData) -{ - w->userData = userData; -} -void * genxGetUserData(genxWriter w) -{ - return w->userData; -} - -/* - * get/set pretty-printing - */ -genxStatus genxSetPrettyPrint(genxWriter w, int ind) -{ - if (w->sequence == SEQUENCE_NO_DOC) - w->ppIndent = ind; - else - w->status = GENX_SEQUENCE_ERROR; - - return w->status; -} - -int genxGetPrettyPrint(genxWriter w) -{ - return w->ppIndent; -} - -/* - * Suspend/resume pretty-printing. - */ -genxStatus genxSuspendPrettyPrint(genxWriter w) -{ - int d = w->ppDepth; - - if (w->ppIndent == 0) - return w->status = GENX_SEQUENCE_ERROR; - - switch (w->sequence) - { - case SEQUENCE_START_TAG: - case SEQUENCE_ATTRIBUTES: - d++; /* No start tag written, still outer depth. */ - case SEQUENCE_CONTENT: - break; - default: - return w->status = GENX_SEQUENCE_ERROR; - } - - if (w->ppSuspendDepth == 0) /* Ignore nested suspend/resume calls. */ - w->ppSuspendDepth = d; - - return w->status; -} - -genxStatus genxResumePrettyPrint(genxWriter w) -{ - int d = w->ppDepth; - - if (w->ppIndent == 0 || w->ppSuspendDepth == 0) - return w->status = GENX_SEQUENCE_ERROR; - - switch (w->sequence) - { - case SEQUENCE_START_TAG: - case SEQUENCE_ATTRIBUTES: - d++; /* No start tag written, still outer depth. */ - case SEQUENCE_CONTENT: - break; - default: - return w->status = GENX_SEQUENCE_ERROR; - } - - if (w->ppSuspendDepth == d) /* Ignore nested suspend/resume calls. */ - w->ppSuspendDepth = 0; - - return w->status; -} - -int genxPrettyPrintSuspended(genxWriter w) -{ - return w->ppSuspendDepth; -} - -/* - * get/set canonicalization. - */ -genxStatus genxSetCanonical(genxWriter w, int flag) -{ - if (w->sequence == SEQUENCE_NO_DOC) - w->canonical = flag; - else - w->status = GENX_SEQUENCE_ERROR; - - return w->status; -} - -int genxGetCanonical(genxWriter w) -{ - return w->canonical; -} - -/* - * get/set allocator - */ -void genxSetAlloc(genxWriter w, genxAlloc alloc) -{ - w->alloc = alloc; -} - -void genxSetDealloc(genxWriter w, genxDealloc dealloc) -{ - w->dealloc = dealloc; -} - -genxAlloc genxGetAlloc(genxWriter w) -{ - return w->alloc; -} - -genxDealloc genxGetDealloc(genxWriter w) -{ - return w->dealloc; -} - -/* - * Clean up - */ -void genxDispose(genxWriter w) -{ - size_t i; - genxNamespace * nn = (genxNamespace *) w->namespaces.pointers; - genxElement * ee = (genxElement *) w->elements.pointers; - genxAttribute * aa = (genxAttribute *) w->attributes.pointers; - utf8 * pp = (utf8 *) w->prefixes.pointers; - - for (i = 0; i < w->namespaces.count; i++) - { - deallocate(w, nn[i]->name); - deallocate(w, nn[i]); - } - - for (i = 0; i < w->elements.count; i++) - { - deallocate(w, ee[i]->name); - deallocate(w, ee[i]); - } - - for (i = 0; i < w->attributes.count; i++) - { - deallocate(w, aa[i]->name); - deallocate(w, aa[i]->value.buf); - deallocate(w, aa[i]); - } - - for(i = 0; i < w->prefixes.count; i++) - deallocate(w, pp[i]); - - deallocate(w, w->namespaces.pointers); - deallocate(w, w->elements.pointers); - deallocate(w, w->attributes.pointers); - deallocate(w, w->prefixes.pointers); - deallocate(w, w->stack.pointers); - - deallocate(w, w->arec.value.buf); - - deallocate(w, w->empty); - - /* how Oscar dealt with Igli */ - deallocate(w, w); -} - -/******************************* - * External utility routines - */ - -/* - * scan a buffer and report problems with UTF-8 encoding or non-XML characters - */ -genxStatus genxCheckText(genxWriter w, constUtf8 s) -{ - while (*s) - { - int c = genxNextUnicodeChar(&s); - if (c == -1) - return GENX_BAD_UTF8; - - if (!isXMLChar(w, c)) - return GENX_NON_XML_CHARACTER; - } - return GENX_SUCCESS; -} - -/* - * Purify some text - */ -int genxScrubText(genxWriter w, constUtf8 in, utf8 out) -{ - int problems = 0; - constUtf8 last = in; - - while (*in) - { - int c = genxNextUnicodeChar(&in); - if (c == -1) - { - problems++; - last = in; - continue; - } - - if (!isXMLChar(w, c)) - { - problems++; - last = in; - continue; - } - - while (last < in) - *out++ = *last++; - } - *out = 0; - return problems; -} - -/* - * check one character - */ -int genxCharClass(genxWriter w, int c) -{ - int ret = 0; - - if (isXMLChar(w, c)) - ret |= GENX_XML_CHAR; - if (isNameChar(w, c)) - ret |= GENX_NAMECHAR; - if (isLetter(w, c)) - ret |= GENX_LETTER; - return ret; -} - -static genxStatus checkNCName(genxWriter w, constUtf8 name) -{ - int c; - - if (name == NULL || *name == 0) - return GENX_BAD_NAME; - - c = genxNextUnicodeChar(&name); - if (!isLetter(w, c) && c != ':' && c != '_') - return GENX_BAD_NAME; - - while (*name) - { - c = genxNextUnicodeChar(&name); - if (c == -1) - return GENX_BAD_UTF8; - if (!isNameChar(w, c)) - return GENX_BAD_NAME; - } - return GENX_SUCCESS; -} - -char * genxGetErrorMessage(genxWriter w, genxStatus status) -{ - return w->etext[status]; -} -char * genxLastErrorMessage(genxWriter w) -{ - return w->etext[w->status]; -} - -/******************************* - * Declarations: namespace/element/attribute - */ - -/* - * DeclareNamespace - by far the most complex routine in Genx - */ -genxNamespace genxDeclareNamespace(genxWriter w, constUtf8 uri, - constUtf8 defaultPref, - genxStatus * statusP) -{ - genxNamespace ns; - genxAttribute defaultDecl; - unsigned char newPrefix[100]; - - if (uri == NULL || uri[0] == 0) - { - w->status = GENX_BAD_NAMESPACE_NAME; - goto busted; - } - - if ((w->status = genxCheckText(w, uri)) != GENX_SUCCESS) - goto busted; - - /* if a prefix is provided, it has to be an NCname */ - if (defaultPref != NULL && defaultPref[0] != 0 && - (w->status = checkNCName(w, defaultPref)) != GENX_SUCCESS) - goto busted; - - /* previously declared? */ - if ((ns = findNamespace(&w->namespaces, uri))) - { - /* just a lookup, really */ - if ((defaultPref == NULL) || - (defaultPref[0] == 0 && ns->defaultDecl == w->xmlnsEquals) || - (strcmp((const char *) ns->defaultDecl->name + STRLEN_XMLNS_COLON, - (const char *) defaultPref) == 0)) - { - w->status = *statusP = GENX_SUCCESS; - return ns; - } - } - - /* wasn't already declared */ - else - { - - /* make a default prefix if none provided */ - if (defaultPref == NULL) - { - sprintf((char *) newPrefix, "g%d", w->nextPrefix++); - defaultPref = newPrefix; - } - - ns = (genxNamespace) allocate(w, sizeof(struct genxNamespace_rec)); - if (ns == NULL) - { - w->status = GENX_ALLOC_FAILED; - goto busted; - } - ns->writer = w; - ns->baroque = False; - - if ((ns->name = copy(w, uri)) == NULL) - { - w->status = GENX_ALLOC_FAILED; - goto busted; - } - - if ((w->status = listAppend(&w->namespaces, ns)) != GENX_SUCCESS) - goto busted; - ns->defaultDecl = ns->declaration = NULL; - ns->declCount = 0; - } - - if (defaultPref[0] == 0) - { - if (w->defaultNsDeclared) - { - w->status = GENX_DUPLICATE_PREFIX; - goto busted; - } - defaultDecl = w->xmlnsEquals; - w->defaultNsDeclared = True; - } - else - { - /* this catches dupes too */ - if ((defaultPref = storePrefix(w, defaultPref, False)) == NULL) - goto busted; - - defaultDecl = declareAttribute(w, NULL, defaultPref, ns->name, statusP); - if (defaultDecl == NULL || *statusP != GENX_SUCCESS) - { - w->status = *statusP; - return NULL; - } - } - - if (ns->defaultDecl != NULL && defaultDecl != ns->defaultDecl) - ns->baroque = True; - ns->defaultDecl = defaultDecl; - - *statusP = GENX_SUCCESS; - return ns; - -busted: - *statusP = w->status; - return NULL; -} - -/* - * get namespace prefix - */ -utf8 genxGetNamespacePrefix(genxNamespace ns) -{ - if (ns->declaration == NULL) - return NULL; - - if (ns->declaration == ns->writer->xmlnsEquals) - return ns->writer->empty; - - return ns->declaration->name + STRLEN_XMLNS_COLON; -} - -/* - * DeclareElement - see genx.h for details - */ -genxElement genxDeclareElement(genxWriter w, - genxNamespace ns, constUtf8 name, - genxStatus * statusP) -{ - genxElement old; - genxElement el; - - if ((w->status = checkNCName(w, name)) != GENX_SUCCESS) - { - *statusP = w->status; - return NULL; - } - - /* already declared? */ - old = findElement(&w->elements, (ns == NULL) ? NULL : ns->name, name); - if (old) - return old; - - if ((el = (genxElement) allocate(w, sizeof(struct genxElement_rec))) == NULL) - { - w->status = *statusP = GENX_ALLOC_FAILED; - return NULL; - } - - el->writer = w; - el->ns = ns; - if ((el->name = copy(w, name)) == NULL) - { - w->status = *statusP = GENX_ALLOC_FAILED; - return NULL; - } - - if ((w->status = listAppend(&w->elements, el)) != GENX_SUCCESS) - { - *statusP = w->status; - return NULL; - } - - *statusP = GENX_SUCCESS; - return el; -} - -/* - * C14n ordering for attributes: - * - first, namespace declarations by the prefix being declared - * - second, unprefixed attributes by attr name - * - third, prefixed attrs by ns uri then local part - */ -static int orderAttributes(genxAttribute a1, genxAttribute a2) -{ - if (a1->atype == a2->atype) - { - if (a1->atype == ATTR_PREFIXED && a1->ns != a2->ns) - return strcmp((const char *) a1->ns->name, (const char *) a2->ns->name); - else - return strcmp((const char *) a1->name, (const char *) a2->name); - } - - else if (a1->atype == ATTR_NSDECL) - return -1; - - else if (a1->atype == ATTR_NAKED) - { - if (a2->atype == ATTR_NSDECL) - return 1; - else - return -1; - } - - else - return 1; -} - -/* - * internal declare-attribute. This one allows colonized values for - * names, so that you can declare xmlns:-type attributes - */ -static genxAttribute declareAttribute(genxWriter w, genxNamespace ns, - constUtf8 name, constUtf8 valuestr, - genxStatus * statusP) -{ - int high, low; - genxAttribute * aa = (genxAttribute *) w->attributes.pointers; - genxAttribute a; - - w->arec.ns = ns; - w->arec.name = (utf8) name; - - if (ns) - w->arec.atype = ATTR_PREFIXED; - else if (strncmp((const char *) name, "xmlns", STRLEN_XMLNS_COLON - 1) == 0) - w->arec.atype = ATTR_NSDECL; - else - w->arec.atype = ATTR_NAKED; - - if (ns && (ns->defaultDecl == w->xmlnsEquals)) - { - w->status = GENX_ATTRIBUTE_IN_DEFAULT_NAMESPACE; - goto busted; - } - - /* attribute list has to be kept sorted per c14n rules */ - high = (int) w->attributes.count; - low = -1; - while (high - low > 1) - { - int probe = (high + low) / 2; - if (orderAttributes(&w->arec, aa[probe]) < 0) - high = probe; - else - low = probe; - } - - /* if it was already there */ - if (low != -1 && orderAttributes(&w->arec, aa[low]) == 0) - return aa[low]; - - /* not there, build it */ - a = (genxAttribute) allocate(w, sizeof(struct genxAttribute_rec)); - if (a == NULL) - { - w->status = GENX_ALLOC_FAILED; - goto busted; - } - - a->writer = w; - a->ns = ns; - a->provided = False; - a->atype = w->arec.atype; - a->next = NULL; - - if ((a->name = copy(w, name)) == NULL) - { - w->status = GENX_ALLOC_FAILED; - goto busted; - } - - if ((w->status = initCollector(w, &a->value)) != GENX_SUCCESS) - goto busted; - - if (valuestr) - if ((w->status = collectString(w, &a->value, valuestr)) != GENX_SUCCESS) - goto busted; - - w->status = listInsert(&w->attributes, a, (size_t) high); - if (w->status != GENX_SUCCESS) - goto busted; - - *statusP = GENX_SUCCESS; - return a; - -busted: - *statusP = w->status; - return NULL; -} - -/* - * genxDeclareAttribute - see genx.h for details - */ -genxAttribute genxDeclareAttribute(genxWriter w, - genxNamespace ns, constUtf8 name, - genxStatus * statusP) -{ - if ((w->status = checkNCName(w, name)) != GENX_SUCCESS) - { - *statusP = w->status; - return NULL; - } - - return declareAttribute(w, ns, name, NULL, statusP); -} - -/******************************* - * I/O - */ -static genxStatus sendx(genxWriter w, constUtf8 s) -{ - if (w->sender) - return (*w->sender->send)(w->userData, s); - else - return GENX_IO_ERROR; -} - -static genxStatus sendxBounded(genxWriter w, constUtf8 start, constUtf8 end) -{ - if (w->sender) - return (*w->sender->sendBounded)(w->userData, start, end); - else - return GENX_IO_ERROR; -} - -#define SendCheck(w,s) if ((w->status=sendx(w,(constUtf8)s))!=GENX_SUCCESS) return w->status - -/******************************* - * XML writing routines. The semantics of the externally-facing ones are - * written up in genx.h. Commentary here is implementation notes and - * for internal routines. - */ - -genxStatus genxStartDocSender(genxWriter w, genxSender * sender) -{ - if (w->sequence != SEQUENCE_NO_DOC) - return w->status = GENX_SEQUENCE_ERROR; - - w->sequence = SEQUENCE_PRE_DOC; - w->sender = sender; - - if (w->ppIndent) - { - w->ppDepth = 0; - w->ppSuspendDepth = 0; - w->ppSimple = True; - } - - return GENX_SUCCESS; -} - -/* - * Output new line and indentation. - */ -static genxStatus writeIndentation(genxWriter w) -{ - int i, n; - SendCheck(w, "\n"); - n = w->ppDepth * w->ppIndent; - - for (i = 0; i < n; i++) - SendCheck(w, " "); - - return w->status; -} - -/* - * Output attribute. - */ -static genxStatus writeAttribute(genxAttribute a) -{ - genxWriter w = a->writer; - - if (a->ns && a->ns->baroque && a->ns->declaration == w->xmlnsEquals) - return w->status = GENX_ATTRIBUTE_IN_DEFAULT_NAMESPACE; - - SendCheck(w, " "); - - if (a->ns) - { - SendCheck(w, a->ns->declaration->name + STRLEN_XMLNS_COLON); - SendCheck(w, ":"); - } - - SendCheck(w, a->name); - SendCheck(w, "=\""); - SendCheck(w, a->value.buf); - SendCheck(w, "\""); - - return w->status; -} - -/* - * Write out the attributes we've been gathering up for an element. We save - * them until we've gathered them all so they can be writen in canonical - * order. - * Also, we end the start-tag. - * The trick here is that we keep the attribute list properly sorted as - * we build it, then as each attribute is added, we fill in its value and - * mark the fact that it's been added, in the "provided" field. - */ -static genxStatus writeStartTag(genxWriter w, Boolean close) -{ - size_t i; - genxAttribute * aa = (genxAttribute *) w->attributes.pointers; - genxElement e = w->nowStarting; - - /* - * make sure the right namespace decls are in effect; - * if they are these might create an error, so ignore it - */ - if (e->ns) - addNamespace(e->ns, NULL); - else - unsetDefaultNamespace(w); - w->status = GENX_SUCCESS; - - if (w->ppIndent) - { - if (w->ppDepth && - /* Suspend depth could be at this element's depth (after ++ below). */ - (w->ppSuspendDepth == 0 || w->ppSuspendDepth > w->ppDepth)) - if (writeIndentation (w) != GENX_SUCCESS) - return w->status; - - if (!close) - { - w->ppDepth++; - w->ppSimple = True; - } - else - { - /* - * Conceptually we incremented/decremented the depth, so check if we - * need to resume pretty-printing. - */ - if (w->ppSuspendDepth > w->ppDepth) - w->ppSuspendDepth = 0; - } - } - - SendCheck(w, "<"); - if (e->ns && (e->ns->declaration != w->xmlnsEquals)) - { - SendCheck(w, e->ns->declaration->name + STRLEN_XMLNS_COLON); - SendCheck(w, ":"); - } - SendCheck(w, e->name); - - /* If we are canonicalizing, then write sorted attributes. Otherwise - write them in the order specified. */ - if (w->canonical) - { - for (i = 0; i < w->attributes.count; i++) - { - if (aa[i]->provided) - { - if (writeAttribute (aa[i]) != GENX_SUCCESS) - return w->status; - - aa[i]->provided = False; - } - } - } - else - { - /* Keep the chain consistent even if we bail out mid way because of - an error. This way we will still be able to clear it in reset().*/ - while (w->firstAttribute != NULL) - { - genxAttribute t = w->firstAttribute->next; - - if (writeAttribute (w->firstAttribute) != GENX_SUCCESS) - return w->status; - - w->firstAttribute->provided = False; - w->firstAttribute->next = NULL; - w->firstAttribute = t; - } - - w->lastAttribute = NULL; - } - - if (close) - SendCheck(w, "/"); - SendCheck(w, ">"); - return GENX_SUCCESS; -} - -/* - * internal clear-er; no sequence checking - */ -static genxStatus unsetDefaultNamespace(genxWriter w) -{ - int i; - Boolean found = False; - - /* don't put it in if not needed */ - i = (int) (w->stack.count) - 1; - while (found == False && i > 0) - { - while (w->stack.pointers[i] != NULL) - { - genxAttribute decl = (genxAttribute) w->stack.pointers[i--]; - genxNamespace ns = (genxNamespace) w->stack.pointers[i--]; - - /* if already unset */ - if (ns == NULL) - return w->status = GENX_SUCCESS; - - /* - * the default namespace was declared. This namespace now - * becomes baroque - */ - if (decl == w->xmlnsEquals) - { - ns->baroque = True; - found = True; - break; - } - } - i -= 2; - } - - if (!found) - return GENX_SUCCESS; - - /* - * push a signal on the stack - */ - if ((w->status = listAppend(&w->stack, NULL)) != GENX_SUCCESS) - return w->status; - w->status = listAppend(&w->stack, w->xmlnsEquals); - if (w->status != GENX_SUCCESS) - return w->status; - - /* add the xmlns= attribute, it must be the first one */ - return addAttribute(w->xmlnsEquals, w->empty); -} - -/* - * clear the default namespace declaration - */ -genxStatus genxUnsetDefaultNamespace(genxWriter w) -{ - - /* can only do this while in start-tag mode */ - if (w->sequence != SEQUENCE_START_TAG) - return w->status = GENX_SEQUENCE_ERROR; - - return unsetDefaultNamespace(w); -} - -genxStatus genxStartElement(genxElement e) -{ - genxWriter w = e->writer; - - switch (w->sequence) - { - case SEQUENCE_NO_DOC: - case SEQUENCE_POST_DOC: - case SEQUENCE_START_ATTR: - return w->status = GENX_SEQUENCE_ERROR; - case SEQUENCE_START_TAG: - case SEQUENCE_ATTRIBUTES: - if ((w->status = writeStartTag(w, False)) != GENX_SUCCESS) - return w->status; - break; - case SEQUENCE_PRE_DOC: - case SEQUENCE_CONTENT: - break; - } - - w->sequence = SEQUENCE_START_TAG; - - /* - * push the stack. We push a NULL after a pointer to this element - * because the stack will also contain pointers to the namespace - * attributes that got declared here, so we can keep track of what's - * in effect. I.e. a single stack entry consists logically of a pointer - * to an element object, a NULL, then zero or more pairs of pointers to - * namespace objects/declarations - */ - if ((w->status = listAppend(&w->stack, e)) != GENX_SUCCESS) - return w->status; - if ((w->status = listAppend(&w->stack, NULL)) != GENX_SUCCESS) - return w->status; - - w->nowStarting = e; - - return GENX_SUCCESS; -} - -/* - * internal namespace adder; no sequence checking - */ -static genxStatus addNamespace(genxNamespace ns, constUtf8 prefix) -{ - genxWriter w = ns->writer; - genxAttribute decl; - int i; - genxElement e; - - /* - * first, we'll find the declaring attribute - */ - if (prefix == NULL) - decl = ns->defaultDecl; - else - { - if (prefix[0] == 0) - decl = w->xmlnsEquals; - else - { - if ((prefix = storePrefix(w, prefix, True)) == NULL) - return w->status; - decl = declareAttribute(w, NULL, prefix, ns->name, &w->status); - if (decl == NULL || w->status != GENX_SUCCESS) - return w->status; - } - } - - if (decl != ns->defaultDecl) - ns->baroque = True; - - /* - * avoid doing anything if this namespace is already declared. If - * they've shown good taste we can do this cheaply - */ - if (!ns->baroque) - { - if (ns->declCount > 0) - return w->status = GENX_SUCCESS; - } - else - { - - /* - * First, we'll run all the way up the stack to see if there is - * another declaration for this namespace/prefix in scope, in which - * case it's a no-op; or, if there's another declaration for this - * prefix on another namespace, in which case we have to over-ride - */ - i = (int) (w->stack.count) - 1; - while (i > 0) - { - while (w->stack.pointers[i] != NULL) - { - genxAttribute otherDecl = (genxAttribute) w->stack.pointers[i--]; - genxNamespace otherNs = (genxNamespace) w->stack.pointers[i--]; - - if (ns == otherNs) - { - if (decl == otherDecl) - return w->status = GENX_SUCCESS; - else - { - i = 0; - break; - } - } - else - { - /* different namespace, same prefix? */ - if (decl == otherDecl) - { - i = 0; - break; - } - } - } - i -= 2; - } - } - - /* - * If this namespace is already declared on - * this element (with different prefix/decl) which is an error. - */ - i = (int) (w->stack.count) - 1; - while (w->stack.pointers[i] != NULL) - { - genxNamespace otherNs; - i--; /* don't need declaration */ - otherNs = (genxNamespace) w->stack.pointers[i--]; - - if (ns == otherNs) - return w->status = GENX_DUPLICATE_NAMESPACE; - } - - /* move pointer from NULL to element */ - --i; - - /* - * It's also an error if this is a default-namespace declaration and the - * element is in no namespace. - */ - e = (genxElement) w->stack.pointers[i]; - if (e->ns == NULL && decl == w->xmlnsEquals) - return w->status = GENX_BAD_DEFAULT_DECLARATION; - - if ((w->status = listAppend(&w->stack, ns)) != GENX_SUCCESS) - return w->status; - if ((w->status = listAppend(&w->stack, decl)) != GENX_SUCCESS) - return w->status; - - ns->declaration = decl; - ns->declCount++; - return addAttribute(decl, ns->name); -} - -/* - * Add a namespace declaration - */ -genxStatus genxAddNamespace(genxNamespace ns, constUtf8 prefix) -{ - if (ns->writer->sequence != SEQUENCE_START_TAG) - return ns->writer->status = GENX_SEQUENCE_ERROR; - - return addNamespace(ns, prefix); -} - -/* - * Private attribute-adding code - * most of the work here is normalizing the value, which is the same - * as regular normalization except for " is replaced by """ - */ -static genxStatus collectAttributeValue (genxWriter w, collector* value, - constUtf8 start, constUtf8 end) -{ - /* If end is NULL then the length of the value is unknown and - the value is 0-terminated. */ - - utf8 last = (utf8) start; - - while (end != NULL ? start < end : *start) - { - int c = genxNextUnicodeChar(&start); - - if (c == -1) - return w->status = GENX_BAD_UTF8; - - if (!isXMLChar(w, c)) - return w->status = GENX_NON_XML_CHARACTER; - - switch(c) - { - case 9: - collectPiece(w, value, " ", 5); - break; - case 0xa: - collectPiece(w, value, " ", 5); - break; - case 0xd: - collectPiece(w, value, " ", 5); - break; - case '"': - collectPiece(w, value, """, 6); - break; - case '<': - collectPiece(w, value, "<", 4); - break; - case '&': - collectPiece(w, value, "&", 5); - break; - /* - case '>': - collectPiece(w, value, ">", 4); - break; - */ - default: - collectPiece(w, value, (const char *) last, start - last); - break; - } - last = (utf8) start; - } - - return GENX_SUCCESS; -} - -static genxStatus addAttribute(genxAttribute a, constUtf8 valuestr) -{ - genxWriter w = a->writer; - - /* if valuestr not provided, this is an xmlns with a pre-cooked value */ - if (valuestr) - { - startCollect(&a->value); - - if (collectAttributeValue (w, &a->value, valuestr, NULL) != GENX_SUCCESS) - return w->status; - - endCollect(&a->value); - } - - /* now add the namespace attribute; might fail if it's been hand-declared */ - if (a->ns) - addNamespace(a->ns, NULL); - - if (valuestr && a->provided) - return w->status = GENX_DUPLICATE_ATTRIBUTE; - - a->provided = True; - - /* Add the attribute to the ordered list if not canonical. */ - if (!w->canonical) - { - if (w->lastAttribute != NULL) - w->lastAttribute = w->lastAttribute->next = a; - else - w->lastAttribute = w->firstAttribute = a; - } - - return GENX_SUCCESS; -} - -/* - * public attribute adder. - * The only difference is that it doesn't allow a NULL value - */ -genxStatus genxAddAttribute(genxAttribute a, constUtf8 valuestr) -{ - if (a->writer->sequence != SEQUENCE_START_TAG && - a->writer->sequence != SEQUENCE_ATTRIBUTES) - return a->writer->status = GENX_SEQUENCE_ERROR; - a->writer->sequence = SEQUENCE_ATTRIBUTES; - - if (valuestr == NULL) - return a->writer->status = GENX_MISSING_VALUE; - - return addAttribute(a, valuestr); -} - -genxStatus genxStartAttribute(genxAttribute a) -{ - genxWriter w = a->writer; - - if (w->sequence != SEQUENCE_START_TAG && - w->sequence != SEQUENCE_ATTRIBUTES) - return w->status = GENX_SEQUENCE_ERROR; - - w->sequence = SEQUENCE_START_ATTR; - w->nowStartingAttr = a; - - startCollect(&a->value); - - return GENX_SUCCESS; -} - -genxStatus genxGetCurrentAttribute (genxWriter w, - constUtf8* xmlns, constUtf8* name) -{ - genxAttribute a; - - if (w->sequence != SEQUENCE_START_ATTR) - return w->status = GENX_SEQUENCE_ERROR; - - a = w->nowStartingAttr; - - *xmlns = a->ns ? a->ns->name : NULL; - *name = a->name; - - return GENX_SUCCESS; -} - -genxStatus genxEndAttribute(genxWriter w) -{ - genxAttribute a; - - if (w->sequence != SEQUENCE_START_ATTR) - return w->status = GENX_SEQUENCE_ERROR; - - a = w->nowStartingAttr; - w->sequence = SEQUENCE_ATTRIBUTES; - - endCollect(&a->value); - - /* now add the namespace attribute; might fail if it's been hand-declared */ - if (a->ns) - addNamespace(a->ns, NULL); - - if (a->provided) - return w->status = GENX_DUPLICATE_ATTRIBUTE; - - a->provided = True; - - /* Add the attribute to the ordered list if not canonical. */ - if (!w->canonical) - { - if (w->lastAttribute != NULL) - w->lastAttribute = w->lastAttribute->next = a; - else - w->lastAttribute = w->firstAttribute = a; - } - - return GENX_SUCCESS; -} - -genxStatus genxGetCurrentElement (genxWriter w, - constUtf8* xmlns, constUtf8* name) -{ - int i; - genxElement e; - - switch (w->sequence) - { - case SEQUENCE_START_TAG: - case SEQUENCE_ATTRIBUTES: - e = w->nowStarting; - break; - case SEQUENCE_CONTENT: - /* Find the element. The same code as in EndElement() below. */ - for (i = (int) (w->stack.count) - 1; - w->stack.pointers[i] != NULL; - i -= 2) - ; - e = (genxElement) w->stack.pointers[--i]; - break; - default: - return w->status = GENX_SEQUENCE_ERROR; - } - - *xmlns = e->ns ? e->ns->name : NULL; - *name = e->name; - - return GENX_SUCCESS; -} - -genxStatus genxEndElement(genxWriter w) -{ - int i; - Boolean close = True; - - switch (w->sequence) - { - case SEQUENCE_NO_DOC: - case SEQUENCE_PRE_DOC: - case SEQUENCE_POST_DOC: - case SEQUENCE_START_ATTR: - return w->status = GENX_SEQUENCE_ERROR; - case SEQUENCE_START_TAG: - case SEQUENCE_ATTRIBUTES: - if ((w->status = writeStartTag(w, !w->canonical)) != GENX_SUCCESS) - return w->status; - close = w->canonical; - break; - case SEQUENCE_CONTENT: - break; - } - - /* - * Output the closing tag. - */ - if (close) - { - genxElement e; - - /* - * first peek into the stack to find the right namespace declaration - * (if any) so we can properly prefix the end-tag. Have to do this - * before unwinding the stack because that might reset some xmlns - * prefixes to the context in the parent element - */ - for (i = (int) (w->stack.count) - 1; - w->stack.pointers[i] != NULL; - i -= 2) - ; - e = (genxElement) w->stack.pointers[--i]; - - if (w->ppIndent) - { - w->ppDepth--; - - if (!w->ppSimple && w->ppSuspendDepth == 0) - if (writeIndentation (w) != GENX_SUCCESS) - return w->status; - - if (w->ppSuspendDepth > w->ppDepth) - w->ppSuspendDepth = 0; /* Resume pretty-printing. */ - } - - SendCheck(w, "ns && e->ns->declaration != w->xmlnsEquals) - { - SendCheck(w, e->ns->declaration->name + STRLEN_XMLNS_COLON); - SendCheck(w, ":"); - } - SendCheck(w, e->name); - SendCheck(w, ">"); - } - - /* If this element is written while pretty-printing is suspended, - treat it as simple. As an example, think of an XHTML element - for which we suspend pretty-printing before writing the opening - tag and resume it after the closing one. */ - if (w->ppIndent && w->ppSuspendDepth == 0) - w->ppSimple = False; - - /* - * pop zero or more namespace declarations, then a null, then the - * start-element declaration off the stack - */ - w->stack.count--; - while (w->stack.pointers[w->stack.count] != NULL) - { - genxNamespace ns = (genxNamespace) w->stack.pointers[--w->stack.count]; - w->stack.count--; /* don't need decl */ - - /* if not a fake unset-default namespace */ - if (ns) - { - /* - * if they've stupidly jammed in their own namespace-prefix - * declarations, we have to go looking to see if there's another - * one in effect - */ - if (ns->baroque) - { - i = (int) w->stack.count; - while (i > 0) - { - while (w->stack.pointers[i] != NULL) - { - genxAttribute otherDecl = (genxAttribute) w->stack.pointers[i--]; - genxNamespace otherNs = (genxNamespace) w->stack.pointers[i--]; - - if (otherNs == ns) - { - ns->declaration = otherDecl; - i = 0; - break; - } - } - - /* skip NULL & element */ - i -= 2; - } - } - ns->declCount--; - if (ns->declCount == 0) - ns->baroque = False; - } - } - - /* pop the NULL */ - if (w->stack.count == 0) - return w->status = GENX_NO_START_TAG; - --w->stack.count; - - if (w->stack.count == 0) - w->sequence = SEQUENCE_POST_DOC; - else - w->sequence = SEQUENCE_CONTENT; - - return GENX_SUCCESS; -} - -/* - * Internal character-adder. It tries to keep the number of sendx() - * calls down by looking at each character but only doing the output - * when it has to escape something; ordinary text gets saved up in - * chunks the start of which is indicated by *breaker. - * c is the character, next points to the UTF8 representing the next - * lastsP indirectly points to the UTF8 representing the - * character, breakerP* indirectly points to the last place genx - * changed the UTF8, e.g. by escaping a '<' - */ -static genxStatus addChar(genxWriter w, int c, constUtf8 next, - constUtf8 * lastsP, constUtf8 * breakerP) -{ - if (c == -1) - return GENX_BAD_UTF8; - - if (!isXMLChar(w, c)) - return GENX_NON_XML_CHARACTER; - - switch(c) - { - case 0xd: - if ((w->status = sendxBounded(w, *breakerP, *lastsP)) != GENX_SUCCESS) - return w->status; - *breakerP = next; - sendx(w, (utf8) " "); - break; - case '<': - if ((w->status = sendxBounded(w, *breakerP, *lastsP)) != GENX_SUCCESS) - return w->status; - *breakerP = next; - sendx(w, (utf8) "<"); - break; - case '&': - if ((w->status = sendxBounded(w, *breakerP, *lastsP)) != GENX_SUCCESS) - return w->status; - *breakerP = next; - sendx(w, (utf8) "&"); - break; - case '>': - if ((w->status = sendxBounded(w, *breakerP, *lastsP)) != GENX_SUCCESS) - return w->status; - *breakerP = next; - sendx(w, (utf8) ">"); - break; - default: - break; - } - *lastsP = next; - return GENX_SUCCESS; -} - -genxStatus genxAddText(genxWriter w, constUtf8 start) -{ - constUtf8 lasts = start; - constUtf8 breaker = start; - - if (w->sequence == SEQUENCE_START_TAG || - w->sequence == SEQUENCE_ATTRIBUTES) - { - if ((w->status = writeStartTag(w, False)) != GENX_SUCCESS) - return w->status; - w->sequence = SEQUENCE_CONTENT; - } - - if (w->sequence == SEQUENCE_CONTENT) - { - while (*start) - { - int c = genxNextUnicodeChar(&start); - - w->status = addChar(w, c, start, &lasts, &breaker); - if (w->status != GENX_SUCCESS) - return w->status; - } - return sendxBounded(w, breaker, (utf8) start); - } - else if (w->sequence == SEQUENCE_START_ATTR) - { - return collectAttributeValue (w, &w->nowStartingAttr->value, start, NULL); - } - else - return w->status = GENX_SEQUENCE_ERROR; -} - -genxStatus genxAddBoundedText(genxWriter w, constUtf8 start, constUtf8 end) -{ - constUtf8 lasts = start; - constUtf8 breaker = start; - - if (w->sequence == SEQUENCE_START_TAG || - w->sequence == SEQUENCE_ATTRIBUTES) - { - if ((w->status = writeStartTag(w, False)) != GENX_SUCCESS) - return w->status; - w->sequence = SEQUENCE_CONTENT; - } - - if (w->sequence == SEQUENCE_CONTENT) - { - while (start < end) - { - int c = genxNextUnicodeChar(&start); - - w->status = addChar(w, c, (utf8) start, &lasts, &breaker); - if (w->status != GENX_SUCCESS) - return w->status; - } - return sendxBounded(w, breaker, (utf8) start); - } - else if (w->sequence == SEQUENCE_START_ATTR) - { - return collectAttributeValue (w, &w->nowStartingAttr->value, start, end); - } - else - return w->status = GENX_SEQUENCE_ERROR; -} - -genxStatus genxAddCountedText(genxWriter w, constUtf8 start, size_t byteCount) -{ - utf8 end = (utf8) (start + byteCount); - - return genxAddBoundedText(w, start, end); -} - -genxStatus genxAddCharacter(genxWriter w, int c) -{ - unsigned char cUTF8[10]; - utf8 lasts, breaker, next; - - if (w->sequence == SEQUENCE_START_TAG || - w->sequence == SEQUENCE_ATTRIBUTES) - { - if ((w->status = writeStartTag(w, False)) != GENX_SUCCESS) - return w->status; - w->sequence = SEQUENCE_CONTENT; - } - - if (!isXMLChar(w, c)) - return w->status = GENX_NON_XML_CHARACTER; - - if (w->sequence == SEQUENCE_START_ATTR) - { - int done = 1; - collector* value = &w->nowStartingAttr->value; - - switch(c) - { - case 9: - collectPiece(w, value, " ", 5); - break; - case 0xa: - collectPiece(w, value, " ", 5); - break; - case 0xd: - collectPiece(w, value, " ", 5); - break; - case '"': - collectPiece(w, value, """, 6); - break; - case '<': - collectPiece(w, value, "<", 4); - break; - case '&': - collectPiece(w, value, "&", 5); - break; - /* - case '>': - collectPiece(w, value, ">", 4); - break; - */ - default: - done = 0; - break; - } - - if (done) - return GENX_SUCCESS; - } - - /* make UTF8 representation of character */ - lasts = breaker = next = cUTF8; - - if (c < 0x80) - *next++ = c; - else if (c < 0x800) - { - *next++ = 0xc0 | (c >> 6); - *next++ = 0x80 | (c & 0x3f); - } - else if (c < 0x10000) - { - *next++ = 0xe0 | (c >> 12); - *next++ = 0x80 | ((c & 0xfc0) >> 6); - *next++ = 0x80 | (c & 0x3f); - } - else - { - *next++ = 0xf0 | (c >> 18); - *next++ = 0x80 | ((c & 0x3f000) >> 12); - *next++ = 0x80 | ((c & 0xfc0) >> 6); - *next++ = 0x80 | (c & 0x3f); - } - *next = 0; - - if (w->sequence == SEQUENCE_CONTENT) - { - w->status = - addChar(w, c, next, (constUtf8 *) &lasts, (constUtf8 *) &breaker); - - if (w->status != GENX_SUCCESS) - return w->status; - - return sendxBounded(w, breaker, next); - } - else if (w->sequence == SEQUENCE_START_ATTR) - { - collectPiece(w, &w->nowStartingAttr->value, - (const char *) cUTF8, next - cUTF8); - return GENX_SUCCESS; - } - else - return w->status = GENX_SEQUENCE_ERROR; -} - -genxStatus genxEndDocument(genxWriter w) -{ - if (w->sequence != SEQUENCE_POST_DOC) - return w->status = GENX_SEQUENCE_ERROR; - - /* Write a newline after the closing tag. */ - SendCheck (w, "\n"); - - if ((w->status = (*w->sender->flush)(w->userData)) != GENX_SUCCESS) - return w->status; - - w->sequence = SEQUENCE_NO_DOC; - return GENX_SUCCESS; -} - -genxStatus genxXmlDeclaration(genxWriter w, - constUtf8 ver, - constUtf8 enc, - constUtf8 stl) -{ - if (w->sequence != SEQUENCE_PRE_DOC) - return w->status = GENX_SEQUENCE_ERROR; - - if ((w->status = genxCheckText(w, ver)) != GENX_SUCCESS) - return w->status; - - if (enc != NULL && (w->status = genxCheckText(w, enc)) != GENX_SUCCESS) - return w->status; - - if (stl != NULL && (w->status = genxCheckText(w, stl)) != GENX_SUCCESS) - return w->status; - - SendCheck (w, "\n"); - - return GENX_SUCCESS; -} - -genxStatus genxDoctypeDeclaration(genxWriter w, - constUtf8 re, - constUtf8 pi, - constUtf8 si, - constUtf8 is) -{ - if (w->sequence != SEQUENCE_PRE_DOC) - return w->status = GENX_SEQUENCE_ERROR; - - if ((w->status = genxCheckText(w, re)) != GENX_SUCCESS) - return w->status; - - if (pi != NULL && (w->status = genxCheckText(w, pi)) != GENX_SUCCESS) - return w->status; - - if (si != NULL && (w->status = genxCheckText(w, si)) != GENX_SUCCESS) - return w->status; - - if (is != NULL && (w->status = genxCheckText(w, is)) != GENX_SUCCESS) - return w->status; - - SendCheck (w, "\n"); - return GENX_SUCCESS; -} - -genxStatus genxComment(genxWriter w, constUtf8 text) -{ - size_t i; - - if (w->sequence == SEQUENCE_NO_DOC || - w->sequence == SEQUENCE_START_ATTR) - return w->status = GENX_SEQUENCE_ERROR; - - if ((w->status = genxCheckText(w, text)) != GENX_SUCCESS) - return w->status; - - /* no leading '-', no trailing '-', no '--' */ - if (text[0] == '-') - return w->status = GENX_MALFORMED_COMMENT; - for (i = 0; text[i]; i++) - if (text[i] == '-' && (text[i + 1] == '-' || text[i + 1] == 0)) - return w->status = GENX_MALFORMED_COMMENT; - - if (w->sequence == SEQUENCE_START_TAG || - w->sequence == SEQUENCE_ATTRIBUTES) - { - if ((w->status = writeStartTag(w, False)) != GENX_SUCCESS) - return w->status; - w->sequence = SEQUENCE_CONTENT; - } - - else if (w->sequence == SEQUENCE_POST_DOC) - if ((w->status = sendx(w, (utf8) "\n")) != GENX_SUCCESS) - return w->status; - - if ((w->status = sendx(w, (utf8) "")) != GENX_SUCCESS) - return w->status; - - if (w->sequence == SEQUENCE_PRE_DOC) - if ((w->status = sendx(w, (utf8) "\n")) != GENX_SUCCESS) - return w->status; - - return GENX_SUCCESS; -} - -genxStatus genxPI(genxWriter w, constUtf8 target, constUtf8 text) -{ - size_t i; - - if (w->sequence == SEQUENCE_NO_DOC || - w->sequence == SEQUENCE_START_ATTR) - return w->status = GENX_SEQUENCE_ERROR; - - if ((w->status = genxCheckText(w, target)) != GENX_SUCCESS) - return w->status; - if ((w->status = checkNCName(w, target)) != GENX_SUCCESS) - return w->status; - if ((strlen((const char *) target) >= 3) && - (target[0] == 'x' || target[0] == 'X') && - (target[1] == 'm' || target[1] == 'M') && - (target[2] == 'l' || target[2] == 'L') && - (target[3] == 0)) - return w->status = GENX_XML_PI_TARGET; - - if ((w->status = genxCheckText(w, text)) != GENX_SUCCESS) - return w->status; - - /* no ?> within */ - for (i = 1; text[i]; i++) - if (text[i] == '>' && text[i - 1] == '?') - return w->status = GENX_MALFORMED_PI; - - if (w->sequence == SEQUENCE_START_TAG || - w->sequence == SEQUENCE_ATTRIBUTES) - { - if ((w->status = writeStartTag(w, False)) != GENX_SUCCESS) - return w->status; - w->sequence = SEQUENCE_CONTENT; - } - - else if (w->sequence == SEQUENCE_POST_DOC) - if ((w->status = sendx(w, (utf8) "\n")) != GENX_SUCCESS) - return w->status; - - if ((w->status = sendx(w, (utf8) "status; - if ((w->status = sendx(w, target)) != GENX_SUCCESS) - return w->status; - if (text[0]) - { - if ((w->status = sendx(w, (utf8) " ")) != GENX_SUCCESS) - return w->status; - if ((w->status = sendx(w, text)) != GENX_SUCCESS) - return w->status; - } - if ((w->status = sendx(w, (utf8) "?>")) != GENX_SUCCESS) - return w->status; - - if (w->sequence == SEQUENCE_PRE_DOC) - if ((w->status = sendx(w, (utf8) "\n")) != GENX_SUCCESS) - return w->status; - - return GENX_SUCCESS; -} - -/******************************* - * Literal versions of the writing routines - */ -genxStatus genxStartElementLiteral(genxWriter w, - constUtf8 xmlns, constUtf8 name) -{ - genxNamespace ns = NULL; - genxElement e; - - if (xmlns) - { - ns = genxDeclareNamespace(w, xmlns, NULL, &w->status); - if (ns == NULL || w->status != GENX_SUCCESS) - return w->status; - } - e = genxDeclareElement(w, ns, name, &w->status); - if (e == NULL || w->status != GENX_SUCCESS) - return w->status; - - return genxStartElement(e); -} - -genxStatus genxAddAttributeLiteral(genxWriter w, constUtf8 xmlns, - constUtf8 name, constUtf8 value) -{ - genxNamespace ns = NULL; - genxAttribute a; - - if (xmlns) - { - ns = genxDeclareNamespace(w, xmlns, NULL, &w->status); - if (ns == NULL && w->status != GENX_SUCCESS) - return w->status; - } - - a = genxDeclareAttribute(w, ns, name, &w->status); - if (a == NULL || w->status != GENX_SUCCESS) - return w->status; - - return genxAddAttribute(a, value); -} - -genxStatus genxStartAttributeLiteral(genxWriter w, - constUtf8 xmlns, constUtf8 name) -{ - genxNamespace ns = NULL; - genxAttribute a; - - if (xmlns) - { - ns = genxDeclareNamespace(w, xmlns, NULL, &w->status); - if (ns == NULL && w->status != GENX_SUCCESS) - return w->status; - } - - a = genxDeclareAttribute(w, ns, name, &w->status); - if (a == NULL || w->status != GENX_SUCCESS) - return w->status; - - return genxStartAttribute(a); -} - -genxStatus genxAddNamespaceLiteral(genxWriter w, - constUtf8 uri, constUtf8 prefix) -{ - genxNamespace ns = genxDeclareNamespace(w, uri, prefix, &w->status); - if (ns == NULL && w->status != GENX_SUCCESS) - return w->status; - - return genxAddNamespace(ns, NULL); -} - -/* - * return version - */ -char * genxGetVersion() -{ - return GENX_VERSION; -} diff --git a/third-party/libstudxml/libstudxml/details/genx/genx.h b/third-party/libstudxml/libstudxml/details/genx/genx.h deleted file mode 100644 index 89ef1e83..00000000 --- a/third-party/libstudxml/libstudxml/details/genx/genx.h +++ /dev/null @@ -1,390 +0,0 @@ -/* - * genx - C-callable library for generating XML documents - */ - -/* - * Copyright (c) 2007-2019 Code Synthesis Tools CC. - * Copyright (c) 2004 by Tim Bray and Sun Microsystems. - * - * For copying permission, see the accompanying COPYING file. - */ - -#ifndef GENX_H -#define GENX_H - -#include /* size_t */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Note on error handling: genx routines mostly return - * GENX_SUCCESS (guaranteed to be zero) in normal circumstances, one of - * these other GENX_ values on a memory allocation or I/O failure or if the - * call would result in non-well-formed output. - * You can associate an error message with one of these codes explicitly - * or with the most recent error using genxGetErrorMessage() and - * genxLastErrorMessage(); see below. - */ -typedef enum -{ - GENX_SUCCESS = 0, - GENX_BAD_UTF8, - GENX_NON_XML_CHARACTER, - GENX_BAD_NAME, - GENX_ALLOC_FAILED, - GENX_BAD_NAMESPACE_NAME, - GENX_INTERNAL_ERROR, - GENX_DUPLICATE_PREFIX, - GENX_SEQUENCE_ERROR, - GENX_NO_START_TAG, - GENX_IO_ERROR, - GENX_MISSING_VALUE, - GENX_MALFORMED_COMMENT, - GENX_XML_PI_TARGET, - GENX_MALFORMED_PI, - GENX_DUPLICATE_ATTRIBUTE, - GENX_ATTRIBUTE_IN_DEFAULT_NAMESPACE, - GENX_DUPLICATE_NAMESPACE, - GENX_BAD_DEFAULT_DECLARATION -} genxStatus; - -/* character types */ -#define GENX_XML_CHAR 1 -#define GENX_LETTER 2 -#define GENX_NAMECHAR 4 - -/* The size of the character table. Valid values are 0x100 (first 255 - chars are checked) and 0x10000 (all chars are checked). */ -#ifndef GENX_CHAR_TABLE_SIZE -# define GENX_CHAR_TABLE_SIZE 0x100 -#endif - -/* a UTF-8 string */ -typedef unsigned char * utf8; -typedef const unsigned char * constUtf8; - -/* - * genx's own types - */ -typedef struct genxWriter_rec * genxWriter; -typedef struct genxNamespace_rec * genxNamespace; -typedef struct genxElement_rec * genxElement; -typedef struct genxAttribute_rec * genxAttribute; - -typedef void * (*genxAlloc) (void * userData, size_t bytes); -typedef void (*genxDealloc) (void * userData, void* data); - -/* - * Constructors, set/get - */ - -/* - * Create a new writer. For generating multiple XML documents, it's most - * efficient to re-use the same genx object. However, you can only write - * one document at a time with a writer. - * Returns NULL if it fails, which can only be due to an allocation failure. - */ -genxWriter genxNew(genxAlloc alloc, genxDealloc dealloc, void * userData); - -/* - * Reset the writer object back into usable state after an error or - * interruption. - */ -genxStatus genxReset (genxWriter w); - -/* - * Dispose of a writer, freeing all associated memory - */ -void genxDispose(genxWriter w); - -/* - * Set/get - */ - -/* - * The userdata pointer will be passed to memory-allocation - * and I/O callbacks. If not set, genx will pass NULL - */ -void genxSetUserData(genxWriter w, void * userData); -void * genxGetUserData(genxWriter w); - -/* - * Set/get pretty-printing. If indentation is set to 0, then no pretty- - * printing is performed. - */ -genxStatus genxSetPrettyPrint(genxWriter w, int indentation); -int genxGetPrettyPrint(genxWriter w); - -/* - * Suspend/resume pretty-printing. Pretty-printing can be suspended - * only inside an element and, unless explicitly resumed, it will - * remain suspended until the end of that element. You should only - * explicitly resume pretty-printing at the element nesting level - * of suspension. If pretty-printing is already suspended at an - * outer nesting level, then subsequent calls to suspend/resume - * are ignored. The PrettyPrintSuspended() function can be used - * to check if pretty-printing is currently suspended. If it is - * not, then this function returns 0. Otherwise, it returns the - * level at which pretty-printing was suspended, with root element - * being level 1. - */ -genxStatus genxSuspendPrettyPrint(genxWriter w); -genxStatus genxResumePrettyPrint(genxWriter w); -int genxPrettyPrintSuspended(genxWriter w); - - -/* - * Set/get canonicalization. If true, then output explicit closing - * tags and sort attributes. Default is false. - */ -genxStatus genxSetCanonical(genxWriter w, int flag); -int genxGetCanonical(genxWriter w); - -/* - * User-provided memory allocator, if desired. For example, if you were - * in an Apache module, you could arrange for genx to use ap_palloc by - * making the pool accessible via the userData call. - * The "dealloc" is to be used to free memory allocated with "alloc". If - * alloc is provided but dealloc is NULL, genx will not attempt to free - * the memory; this would be appropriate in an Apache context. - * If "alloc" is not provided, genx routines use malloc() to allocate memory - */ -void genxSetAlloc(genxWriter w, genxAlloc alloc); -void genxSetDealloc(genxWriter w, genxDealloc dealloc); -genxAlloc genxGetAlloc(genxWriter w); -genxDealloc genxGetDealloc(genxWriter w); - -/* - * Get the prefix associated with a namespace - */ -utf8 genxGetNamespacePrefix(genxNamespace ns); - -/* - * Declaration functions - */ - -/* - * Declare a namespace. The provided prefix is the default but can be - * overridden by genxAddNamespace. If no default prefiix is provided, - * genx will generate one of the form g-%d. - * On error, returns NULL and signals via statusp - */ -genxNamespace genxDeclareNamespace(genxWriter w, - constUtf8 uri, constUtf8 prefix, - genxStatus * statusP); - -/* - * Declare an element - * If something failed, returns NULL and sets the status code via statusP - */ -genxElement genxDeclareElement(genxWriter w, - genxNamespace ns, constUtf8 name, - genxStatus * statusP); - -/* - * Declare an attribute - */ -genxAttribute genxDeclareAttribute(genxWriter w, - genxNamespace ns, - constUtf8 name, genxStatus * statusP); - -/* - * Writing XML - */ - -/* - * Caller-provided I/O package. - * First form is for a null-terminated string. - * for second, if you have s="abcdef" and want to send "abc", you'd call - * sendBounded(userData, s, s + 3) - */ -typedef struct -{ - genxStatus (* send)(void * userData, constUtf8 s); - genxStatus (* sendBounded)(void * userData, constUtf8 start, constUtf8 end); - genxStatus (* flush)(void * userData); -} genxSender; - -genxStatus genxStartDocSender(genxWriter w, genxSender * sender); - -/* - * End a document. Calls "flush". - */ -genxStatus genxEndDocument(genxWriter w); - -/* - * Write XML declaration. If encoding or standalone are NULL, then those - * attributes are omitted. - */ -genxStatus genxXmlDeclaration(genxWriter w, - constUtf8 version, - constUtf8 encoding, - constUtf8 standalone); -/* - * Write DOCTYPE declaration. If public_id is not NULL, then this is - * a PUBLIC DOCTYPE declaration, otherwise, if system_id is not NULL, - * then this is a SYSTEM DOCTYPE. If both are NULL, then a DOCTYPE - * that only contains the root element and, if not NULL, internal - * subset is written. - */ -genxStatus genxDoctypeDeclaration(genxWriter w, - constUtf8 root_element, - constUtf8 public_id, - constUtf8 system_id, - constUtf8 internal_subset); - -/* - * Write a comment - */ -genxStatus genxComment(genxWriter w, constUtf8 text); - -/* - * Write a PI - */ -genxStatus genxPI(genxWriter w, constUtf8 target, constUtf8 text); - -/* - * Start an element - */ -genxStatus genxStartElementLiteral(genxWriter w, - constUtf8 xmlns, constUtf8 name); - -/* - * Start a predeclared element - * - element must have been declared - */ -genxStatus genxStartElement(genxElement e); - -/* - * Get current element. The returned values are valid until this - * element ceases to be current (i.e., EndElement() is called). - * If the element is unqualified, then xmlns is set to NULL. - */ -genxStatus genxGetCurrentElement (genxWriter w, - constUtf8* xmlns, constUtf8* name); - -/* - * Write an attribute - */ -genxStatus genxAddAttributeLiteral(genxWriter w, constUtf8 xmlns, - constUtf8 name, constUtf8 value); - -/* - * Write a predeclared attribute - */ -genxStatus genxAddAttribute(genxAttribute a, constUtf8 value); - -/* - * Start an attribute - */ -genxStatus genxStartAttributeLiteral(genxWriter w, - constUtf8 xmlns, constUtf8 name); - -/* - * Start a predeclared attribute - */ -genxStatus genxStartAttribute(genxAttribute a); - -/* - * Get current attribute. The returned values are valid until this - * attribute ceases to be current (i.e., EndAttribute() is called). - * If the attribute is unqualified, then xmlns is set to NULL. - */ -genxStatus genxGetCurrentAttribute (genxWriter w, - constUtf8* xmlns, constUtf8* name); - -/* - * End an attribute - */ -genxStatus genxEndAttribute(genxWriter w); - -/* - * add a namespace declaration - */ -genxStatus genxAddNamespaceLiteral(genxWriter w, - constUtf8 uri, constUtf8 prefix); - -/* - * add a predefined namespace declaration - */ -genxStatus genxAddNamespace(genxNamespace ns, constUtf8 prefix); - -/* - * Clear default namespace declaration - */ -genxStatus genxUnsetDefaultNamespace(genxWriter w); - -/* - * Write an end tag - */ -genxStatus genxEndElement(genxWriter w); - -/* - * Write some text - * You can't write any text outside the root element, except with - * genxComment and genxPI. - */ -genxStatus genxAddText(genxWriter w, constUtf8 start); -genxStatus genxAddCountedText(genxWriter w, constUtf8 start, size_t byteCount); -genxStatus genxAddBoundedText(genxWriter w, constUtf8 start, constUtf8 end); - -/* - * Write one character. The integer value is the Unicode character - * value, as usually expressed in U+XXXX notation. - */ -genxStatus genxAddCharacter(genxWriter w, int c); - -/* - * Utility routines - */ - -/* - * Return the Unicode character encoded by the UTF-8 pointed-to by the - * argument, and advance the argument past the encoding of the character. - * Returns -1 if the UTF-8 is malformed, in which case advances the - * argument to point at the first byte past the point past the malformed - * ones. - */ -int genxNextUnicodeChar(constUtf8 * sp); - -/* - * Scan a buffer allegedly full of UTF-8 encoded XML characters; return - * one of GENX_SUCCESS, GENX_BAD_UTF8, or GENX_NON_XML_CHARACTER - */ -genxStatus genxCheckText(genxWriter w, constUtf8 s); - -/* - * return character status, the OR of GENX_XML_CHAR, - * GENX_LETTER, and GENX_NAMECHAR - */ -int genxCharClass(genxWriter w, int c); - -/* - * Silently wipe any non-XML characters out of a chunk of text. - * If you call this on a string before you pass it addText or - * addAttribute, you will never get an error from genx unless - * (a) there's a bug in your software, e.g. a malformed element name, or - * (b) there's a memory allocation or I/O error - * The output can never be longer than the input. - * Returns true if any changes were made. - */ -int genxScrubText(genxWriter w, constUtf8 in, utf8 out); - -/* - * return error messages - */ -char * genxGetErrorMessage(genxWriter w, genxStatus status); -char * genxLastErrorMessage(genxWriter w); - -/* - * return version - */ -char * genxGetVersion(); - -#ifdef __cplusplus -} -#endif - -#endif /* GENX_H */ diff --git a/third-party/libstudxml/libstudxml/details/post.hxx b/third-party/libstudxml/libstudxml/details/post.hxx deleted file mode 100644 index f2f857a0..00000000 --- a/third-party/libstudxml/libstudxml/details/post.hxx +++ /dev/null @@ -1,7 +0,0 @@ -// file : libstudxml/details/post.hxx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifdef _MSC_VER -# pragma warning (pop) -#endif diff --git a/third-party/libstudxml/libstudxml/details/pre.hxx b/third-party/libstudxml/libstudxml/details/pre.hxx deleted file mode 100644 index 912430c6..00000000 --- a/third-party/libstudxml/libstudxml/details/pre.hxx +++ /dev/null @@ -1,21 +0,0 @@ -// file : libstudxml/details/pre.hxx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifdef _MSC_VER - // Push warning state. - // -# pragma warning (push, 3) - - // Disabled warnings. - // -# pragma warning (disable:4251) // needs to have DLL-interface -# pragma warning (disable:4290) // exception specification ignored -# pragma warning (disable:4355) // passing 'this' to a member -# pragma warning (disable:4800) // forcing value to bool - -// Elevated warnings. -// -# pragma warning (2:4239) // standard doesn't allow this conversion - -#endif diff --git a/third-party/libstudxml/libstudxml/exception.hxx b/third-party/libstudxml/libstudxml/exception.hxx deleted file mode 100644 index bbfd8002..00000000 --- a/third-party/libstudxml/libstudxml/exception.hxx +++ /dev/null @@ -1,19 +0,0 @@ -// file : libstudxml/exception.hxx -*- C++ -*- -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_EXCEPTION_HXX -#define LIBSTUDXML_EXCEPTION_HXX - -#include - -#include - -namespace xml -{ - class exception: public std::exception {}; -} - -#include - -#endif // LIBSTUDXML_EXCEPTION_HXX diff --git a/third-party/libstudxml/libstudxml/forward.hxx b/third-party/libstudxml/libstudxml/forward.hxx deleted file mode 100644 index 3b55f19a..00000000 --- a/third-party/libstudxml/libstudxml/forward.hxx +++ /dev/null @@ -1,22 +0,0 @@ -// file : libstudxml/forward.hxx -*- C++ -*- -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_FORWARD_HXX -#define LIBSTUDXML_FORWARD_HXX - -#include - -#include - -namespace xml -{ - class qname; - class parser; - class serializer; - class exception; -} - -#include - -#endif // LIBSTUDXML_FORWARD_HXX diff --git a/third-party/libstudxml/libstudxml/parser.cxx b/third-party/libstudxml/libstudxml/parser.cxx deleted file mode 100644 index 581ce7ac..00000000 --- a/third-party/libstudxml/libstudxml/parser.cxx +++ /dev/null @@ -1,937 +0,0 @@ -// file : libstudxml/parser.cxx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include // std::bad_alloc -#include -#include // std::strchr -#include -#include -#include - -#include - -using namespace std; - -namespace xml -{ - // parsing - // - void parsing:: - init () - { - ostringstream os; - if (!name_.empty ()) - os << name_ << ':'; - os << line_ << ':' << column_ << ": error: " << description_; - what_ = os.str (); - } - - // parser::event_type - // - static const char* parser_event_str[] = - { - "start element", - "end element", - "start attribute", - "end attribute", - "characters", - "start namespace declaration", - "end namespace declaration", - "end of file" - }; - - ostream& - operator<< (ostream& os, parser::event_type e) - { - return os << parser_event_str[e]; - } - - // parser - // - parser:: - ~parser () - { - if (p_ != 0) - XML_ParserFree (p_); - } - - void parser:: - init () - { - depth_ = 0; - state_ = state_next; - event_ = eof; - queue_ = eof; - - pqname_ = &qname_; - pvalue_ = &value_; - - line_ = 0; - column_ = 0; - - attr_i_ = 0; - start_ns_i_ = 0; - end_ns_i_ = 0; - - if ((feature_ & receive_attributes_map) != 0 && - (feature_ & receive_attributes_event) != 0) - feature_ &= ~receive_attributes_map; - - // Allocate the parser. Make sure nothing else can throw after - // this call since otherwise we will leak it. - // - p_ = XML_ParserCreateNS (0, XML_Char (' ')); - - if (p_ == 0) - throw bad_alloc (); - - // Get prefixes in addition to namespaces and local names. - // - XML_SetReturnNSTriplet (p_, true); - - // Set handlers. - // - XML_SetUserData(p_, this); - - if ((feature_ & receive_elements) != 0) - { - XML_SetStartElementHandler (p_, &start_element_); - XML_SetEndElementHandler (p_, &end_element_); - } - - if ((feature_ & receive_characters) != 0) - XML_SetCharacterDataHandler (p_, &characters_); - - if ((feature_ & receive_namespace_decls) != 0) - XML_SetNamespaceDeclHandler (p_, - &start_namespace_decl_, - &end_namespace_decl_); - } - - void parser:: - handle_error () - { - XML_Error e (XML_GetErrorCode (p_)); - - if (e == XML_ERROR_ABORTED) - { - // For now we only abort the parser in the characters_() and - // start_element_() handlers. - // - switch (content ()) - { - case content_type::empty: - throw parsing (*this, "characters in empty content"); - case content_type::simple: - throw parsing (*this, "element in simple content"); - case content_type::complex: - throw parsing (*this, "characters in complex content"); - default: - assert (false); - } - } - else - throw parsing (iname_, - XML_GetCurrentLineNumber (p_), - XML_GetCurrentColumnNumber (p_), - XML_ErrorString (e)); - } - - struct stream_exception_controller - { - ~stream_exception_controller () - { - istream::iostate s = is_.rdstate (); - s &= ~istream::failbit; - - // If our error state (sans failbit) intersects with the - // exception state then that means we have an active - // exception and changing error/exception state will - // cause another to be thrown. - // - if (!(old_state_ & s)) - { - // Clear failbit if it was caused by eof. - // - if (is_.fail () && is_.eof ()) - is_.clear (s); - - is_.exceptions (old_state_); - } - } - - stream_exception_controller (istream& is) - : is_ (is), old_state_ (is_.exceptions ()) - { - is_.exceptions (old_state_ & ~istream::failbit); - } - - private: - stream_exception_controller (const stream_exception_controller&); - - stream_exception_controller& - operator= (const stream_exception_controller&); - - private: - istream& is_; - istream::iostate old_state_; - }; - - parser::event_type parser:: - next () - { - if (state_ == state_next) - return next_ (false); - else - { - // If we previously peeked at start/end_element, then adjust - // state accordingly. - // - switch (event_) - { - case end_element: - { - if (!element_state_.empty () && - element_state_.back ().depth == depth_) - pop_element (); - - depth_--; - break; - } - case start_element: - { - depth_++; - break; - } - default: - break; - } - - state_ = state_next; - return event_; - } - } - - const string& parser:: - attribute (const qname_type& qn) const - { - if (const element_entry* e = get_element ()) - { - attribute_map_type::const_iterator i (e->attr_map_.find (qn)); - - if (i != e->attr_map_.end ()) - { - if (!i->second.handled) - { - i->second.handled = true; - e->attr_unhandled_--; - } - return i->second.value; - } - } - - throw parsing (*this, "attribute '" + qn.string () + "' expected"); - } - - string parser:: - attribute (const qname_type& qn, const string& dv) const - { - if (const element_entry* e = get_element ()) - { - attribute_map_type::const_iterator i (e->attr_map_.find (qn)); - - if (i != e->attr_map_.end ()) - { - if (!i->second.handled) - { - i->second.handled = true; - e->attr_unhandled_--; - } - return i->second.value; - } - } - - return dv; - } - - bool parser:: - attribute_present (const qname_type& qn) const - { - if (const element_entry* e = get_element ()) - { - attribute_map_type::const_iterator i (e->attr_map_.find (qn)); - - if (i != e->attr_map_.end ()) - { - if (!i->second.handled) - { - i->second.handled = true; - e->attr_unhandled_--; - } - return true; - } - } - - return false; - } - - void parser:: - next_expect (event_type e) - { - if (next () != e) - throw parsing (*this, string (parser_event_str[e]) + " expected"); - } - - void parser:: - next_expect (event_type e, const string& ns, const string& n) - { - if (next () != e || namespace_ () != ns || name () != n) - throw parsing (*this, - string (parser_event_str[e]) + " '" + - qname_type (ns, n).string () + "' expected"); - } - - string parser:: - element () - { - content (content_type::simple); - string r; - - // The content of the element can be empty in which case there - // will be no characters event. - // - event_type e (next ()); - if (e == characters) - { - r.swap (value ()); - e = next (); - } - - // We cannot really get anything other than end_element since - // the simple content validation won't allow it. - // - assert (e == end_element); - - return r; - } - - string parser:: - element (const qname_type& qn, const string& dv) - { - if (peek () == start_element && qname () == qn) - { - next (); - return element (); - } - - return dv; - } - - const parser::element_entry* parser:: - get_element_ () const - { - // The start_element_() Expat handler may have already provisioned - // an entry in the element stack. In this case, we need to get the - // one before it, if any. - // - const element_entry* r (0); - element_state::size_type n (element_state_.size () - 1); - - if (element_state_[n].depth == depth_) - r = &element_state_[n]; - else if (n != 0 && element_state_[n].depth > depth_) - { - n--; - if (element_state_[n].depth == depth_) - r = &element_state_[n]; - } - - return r; - } - - void parser:: - pop_element () - { - // Make sure there are no unhandled attributes left. - // - const element_entry& e (element_state_.back ()); - if (e.attr_unhandled_ != 0) - { - // Find the first unhandled attribute and report it. - // - for (attribute_map_type::const_iterator i (e.attr_map_.begin ()); - i != e.attr_map_.end (); ++i) - { - if (!i->second.handled) - throw parsing ( - *this, "unexpected attribute '" + i->first.string () + "'"); - } - assert (false); - } - - element_state_.pop_back (); - } - - parser::event_type parser:: - next_ (bool peek) - { - event_type e (next_body ()); - - // Content-specific processing. Note that we handle characters in the - // characters_() Expat handler for two reasons. Firstly, it is faster - // to ignore the whitespaces at the source. Secondly, this allows us - // to distinguish between element and attribute characters. We can - // move this processing to the handler because the characters event - // is never queued. - // - switch (e) - { - case end_element: - { - // If this is a peek, then avoid popping the stack just yet. - // This way, the attribute map will still be valid until we - // call next(). - // - if (!peek) - { - if (!element_state_.empty () && - element_state_.back ().depth == depth_) - pop_element (); - - depth_--; - } - break; - } - case start_element: - { - if (const element_entry* e = get_element ()) - { - switch (e->content) - { - case content_type::empty: - throw parsing (*this, "element in empty content"); - case content_type::simple: - throw parsing (*this, "element in simple content"); - default: - break; - } - } - - // If this is a peek, then delay adjusting the depth. - // - if (!peek) - depth_++; - - break; - } - default: - break; - } - - return e; - } - - parser::event_type parser:: - next_body () - { - // See if we have any start namespace declarations we need to return. - // - if (start_ns_i_ < start_ns_.size ()) - { - // Based on the previous event determine what's the next one must be. - // - switch (event_) - { - case start_namespace_decl: - { - if (++start_ns_i_ == start_ns_.size ()) - { - start_ns_i_ = 0; - start_ns_.clear (); - pqname_ = &qname_; - break; // No more declarations. - } - } - // Fall through. - case start_element: - { - event_ = start_namespace_decl; - pqname_ = &start_ns_[start_ns_i_]; - return event_; - } - default: - { - assert (false); - return event_ = eof; - } - } - } - - // See if we have any attributes we need to return as events. - // - if (attr_i_ < attr_.size ()) - { - // Based on the previous event determine what's the next one must be. - // - switch (event_) - { - case start_attribute: - { - event_ = characters; - pvalue_ = &attr_[attr_i_].value; - return event_; - } - case characters: - { - event_ = end_attribute; // Name is already set. - return event_; - } - case end_attribute: - { - if (++attr_i_ == attr_.size ()) - { - attr_i_ = 0; - attr_.clear (); - pqname_ = &qname_; - pvalue_ = &value_; - break; // No more attributes. - } - } - // Fall through. - case start_element: - case start_namespace_decl: - { - event_ = start_attribute; - pqname_ = &attr_[attr_i_].qname; - return event_; - } - default: - { - assert (false); - return event_ = eof; - } - } - } - - // See if we have any end namespace declarations we need to return. - // - if (end_ns_i_ < end_ns_.size ()) - { - // Based on the previous event determine what's the next one must be. - // - switch (event_) - { - case end_namespace_decl: - { - if (++end_ns_i_ == end_ns_.size ()) - { - end_ns_i_ = 0; - end_ns_.clear (); - pqname_ = &qname_; - break; // No more declarations. - } - } - // Fall through. - default: - { - // The end namespace declaration comes before the end element which - // means it can follow pretty much any other event. - // - event_ = end_namespace_decl; - pqname_ = &end_ns_[end_ns_i_]; - return event_; - } - } - } - - // Check the queue. - // - if (queue_ != eof) - { - event_ = queue_; - queue_ = eof; - - line_ = XML_GetCurrentLineNumber (p_); - column_ = XML_GetCurrentColumnNumber (p_); - - return event_; - } - - // Reset the character accumulation flag. - // - accumulate_ = false; - - XML_ParsingStatus ps; - XML_GetParsingStatus (p_, &ps); - - switch (ps.parsing) - { - case XML_INITIALIZED: - { - // As if we finished the previous chunk. - break; - } - case XML_PARSING: - { - assert (false); - return event_ = eof; - } - case XML_FINISHED: - { - return event_ = eof; - } - case XML_SUSPENDED: - { - switch (XML_ResumeParser (p_)) - { - case XML_STATUS_SUSPENDED: - { - // If the parser is again in the suspended state, then - // that means we have the next event. - // - return event_; - } - case XML_STATUS_OK: - { - // Otherwise, we need to get and parse the next chunk of data - // unless this was the last chunk, in which case this is eof. - // - if (ps.finalBuffer) - return event_ = eof; - - break; - } - case XML_STATUS_ERROR: - handle_error (); - } - - break; - } - } - - // Get and parse the next chunk of data until we get the next event - // or reach eof. - // - if (!accumulate_) - event_ = eof; - - XML_Status s; - do - { - if (size_ != 0) - { - s = XML_Parse (p_, - static_cast (data_.buf), - static_cast (size_), - true); - - if (s == XML_STATUS_ERROR) - handle_error (); - - break; - } - else - { - const size_t cap (4096); - - char* b (static_cast (XML_GetBuffer (p_, cap))); - if (b == 0) - throw bad_alloc (); - - // Temporarily unset the exception failbit. Also clear the fail bit - // when we reset the old state if it was caused by eof. - // - istream& is (*data_.is); - { - stream_exception_controller sec (is); - is.read (b, static_cast (cap)); - } - - // If the caller hasn't configured the stream to use exceptions, - // then use the parsing exception to report an error. - // - if (is.bad () || (is.fail () && !is.eof ())) - throw parsing (*this, "io failure"); - - bool eof (is.eof ()); - - s = XML_ParseBuffer (p_, static_cast (is.gcount ()), eof); - - if (s == XML_STATUS_ERROR) - handle_error (); - - if (eof) - break; - } - } while (s != XML_STATUS_SUSPENDED); - - return event_; - } - - static void - split_name (const XML_Char* s, qname& qn) - { - string& ns (qn.namespace_ ()); - string& name (qn.name ()); - string& prefix (qn.prefix ()); - - const char* p (strchr (s, ' ')); - - if (p == 0) - { - ns.clear (); - name = s; - prefix.clear (); - } - else - { - ns.assign (s, 0, p - s); - - s = p + 1; - p = strchr (s, ' '); - - if (p == 0) - { - name = s; - prefix.clear (); - } - else - { - name.assign (s, 0, p - s); - prefix = p + 1; - } - } - } - - void XMLCALL parser:: - start_element_ (void* v, const XML_Char* name, const XML_Char** atts) - { - parser& p (*static_cast (v)); - - XML_ParsingStatus ps; - XML_GetParsingStatus (p.p_, &ps); - - // Expat has a (mis)-feature of a possibily calling handlers even - // after the non-resumable XML_StopParser call. - // - if (ps.parsing == XML_FINISHED) - return; - - // Cannot be a followup event. - // - assert (ps.parsing == XML_PARSING); - - // When accumulating characters in simple content, we expect to - // see more characters or end element. Seeing start element is - // possible but means violation of the content model. - // - if (p.accumulate_) - { - // It would have been easier to throw the exception directly, - // however, the Expat code is most likely not exception safe. - // - p.line_ = XML_GetCurrentLineNumber (p.p_); - p.column_ = XML_GetCurrentColumnNumber (p.p_); - XML_StopParser (p.p_, false); - return; - } - - p.event_ = start_element; - split_name (name, p.qname_); - - p.line_ = XML_GetCurrentLineNumber (p.p_); - p.column_ = XML_GetCurrentColumnNumber (p.p_); - - // Handle attributes. - // - if (*atts != 0) - { - bool am ((p.feature_ & receive_attributes_map) != 0); - bool ae ((p.feature_ & receive_attributes_event) != 0); - - // Provision an entry for this element. - // - element_entry* pe (0); - if (am) - { - p.element_state_.push_back (element_entry (p.depth_ + 1)); - pe = &p.element_state_.back (); - } - - if (am || ae) - { - for (; *atts != 0; atts += 2) - { - if (am) - { - qname_type qn; - split_name (*atts, qn); - attribute_map_type::value_type v (qn, attribute_value_type ()); - v.second.value = *(atts + 1); - v.second.handled = false; - pe->attr_map_.insert (v); - } - else - { - p.attr_.push_back (attribute_type ()); - split_name (*atts, p.attr_.back ().qname); - p.attr_.back ().value = *(atts + 1); - } - } - - if (am) - pe->attr_unhandled_ = pe->attr_map_.size (); - } - } - - XML_StopParser (p.p_, true); - } - - void XMLCALL parser:: - end_element_ (void* v, const XML_Char* name) - { - parser& p (*static_cast (v)); - - XML_ParsingStatus ps; - XML_GetParsingStatus (p.p_, &ps); - - // Expat has a (mis)-feature of a possibily calling handlers even - // after the non-resumable XML_StopParser call. - // - if (ps.parsing == XML_FINISHED) - return; - - // This can be a followup event for empty elements (). In this - // case the element name is already set. - // - if (ps.parsing != XML_PARSING) - p.queue_ = end_element; - else - { - split_name (name, p.qname_); - - // If we are accumulating characters, then queue this event. - // - if (p.accumulate_) - p.queue_ = end_element; - else - { - p.event_ = end_element; - - p.line_ = XML_GetCurrentLineNumber (p.p_); - p.column_ = XML_GetCurrentColumnNumber (p.p_); - } - - XML_StopParser (p.p_, true); - } - } - - void XMLCALL parser:: - characters_ (void* v, const XML_Char* s, int n) - { - parser& p (*static_cast (v)); - - XML_ParsingStatus ps; - XML_GetParsingStatus (p.p_, &ps); - - // Expat has a (mis)-feature of a possibily calling handlers even - // after the non-resumable XML_StopParser call. - // - if (ps.parsing == XML_FINISHED) - return; - - content_type cont (p.content ()); - - // If this is empty or complex content, see if these are whitespaces. - // - switch (cont) - { - case content_type::empty: - case content_type::complex: - { - for (int i (0); i != n; ++i) - { - char c (s[i]); - if (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09) - continue; - - // It would have been easier to throw the exception directly, - // however, the Expat code is most likely not exception safe. - // - p.line_ = XML_GetCurrentLineNumber (p.p_); - p.column_ = XML_GetCurrentColumnNumber (p.p_); - XML_StopParser (p.p_, false); - break; - } - return; - } - default: - break; - } - - // Append the characters if we are accumulating. This can also be a - // followup event for another character event. In this case also - // append the data. - // - if (p.accumulate_ || ps.parsing != XML_PARSING) - { - assert (p.event_ == characters); - p.value_.append (s, n); - } - else - { - p.event_ = characters; - p.value_.assign (s, n); - - p.line_ = XML_GetCurrentLineNumber (p.p_); - p.column_ = XML_GetCurrentColumnNumber (p.p_); - - // In simple content we need to accumulate all the characters - // into a single event. To do this we will let the parser run - // until we reach the end of the element. - // - if (cont == content_type::simple) - p.accumulate_ = true; - else - XML_StopParser (p.p_, true); - } - } - - void XMLCALL parser:: - start_namespace_decl_ (void* v, const XML_Char* prefix, const XML_Char* ns) - { - parser& p (*static_cast (v)); - - XML_ParsingStatus ps; - XML_GetParsingStatus (p.p_, &ps); - - // Expat has a (mis)-feature of a possibily calling handlers even - // after the non-resumable XML_StopParser call. - // - if (ps.parsing == XML_FINISHED) - return; - - p.start_ns_.push_back (qname_type ()); - p.start_ns_.back ().prefix () = (prefix != 0 ? prefix : ""); - p.start_ns_.back ().namespace_ () = (ns != 0 ? ns : ""); - } - - void XMLCALL parser:: - end_namespace_decl_ (void* v, const XML_Char* prefix) - { - parser& p (*static_cast (v)); - - XML_ParsingStatus ps; - XML_GetParsingStatus (p.p_, &ps); - - // Expat has a (mis)-feature of a possibily calling handlers even - // after the non-resumable XML_StopParser call. - // - if (ps.parsing == XML_FINISHED) - return; - - p.end_ns_.push_back (qname_type ()); - p.end_ns_.back ().prefix () = (prefix != 0 ? prefix : ""); - } -} diff --git a/third-party/libstudxml/libstudxml/parser.hxx b/third-party/libstudxml/libstudxml/parser.hxx deleted file mode 100644 index 7c29d4b7..00000000 --- a/third-party/libstudxml/libstudxml/parser.hxx +++ /dev/null @@ -1,472 +0,0 @@ -// file : libstudxml/parser.hxx -*- C++ -*- -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_PARSER_HXX -#define LIBSTUDXML_PARSER_HXX - -#include - -#include -#include -#include -#include -#include // std::size_t - -#include // STUDXML_NOTHROW_NOEXCEPT, - // LIBSTUDXML_EXTERNAL_EXPAT - -#ifndef LIBSTUDXML_EXTERNAL_EXPAT -# include -#else -# include -#endif - -// We only support UTF-8 Expat. -// -#ifdef XML_UNICODE -# error UTF-16 expat (XML_UNICODE defined) is not supported -#endif - -#include -#include -#include -#include - -#include - -namespace xml -{ - class parsing: public exception - { - public: - virtual - ~parsing () STUDXML_NOTHROW_NOEXCEPT {} - - parsing (const std::string& name, - unsigned long long line, - unsigned long long column, - const std::string& description); - - parsing (const parser& p, const std::string& description); - - const std::string& - name () const {return name_;} - - unsigned long long - line () const {return line_;} - - unsigned long long - column () const {return column_;} - - const std::string& - description () const {return description_;} - - virtual const char* - what () const STUDXML_NOTHROW_NOEXCEPT {return what_.c_str ();} - - private: - LIBSTUDXML_EXPORT void - init (); - - private: - std::string name_; - unsigned long long line_; - unsigned long long column_; - std::string description_; - std::string what_; - }; - - class LIBSTUDXML_EXPORT parser - { - public: - typedef xml::qname qname_type; - typedef xml::content content_type; - - typedef unsigned short feature_type; - - // If both receive_attributes_event and receive_attributes_map are - // specified, then receive_attributes_event is assumed. - // - static const feature_type receive_elements = 0x0001; - static const feature_type receive_characters = 0x0002; - static const feature_type receive_attributes_map = 0x0004; - static const feature_type receive_attributes_event = 0x0008; - static const feature_type receive_namespace_decls = 0x0010; - - static const feature_type receive_default = receive_elements | - receive_characters | - receive_attributes_map; - - // Parse std::istream. Input name is used in diagnostics to identify - // the document being parsed. - // - // If stream exceptions are enabled then std::ios_base::failure - // exception is used to report io errors (badbit and failbit). - // Otherwise, those are reported as the parsing exception. - // - parser (std::istream&, - const std::string& input_name, - feature_type = receive_default); - - // Parse memory buffer that contains the whole document. Input name - // is used in diagnostics to identify the document being parsed. - // - parser (const void* data, - std::size_t size, - const std::string& input_name, - feature_type = receive_default); - - const std::string& - input_name () const {return iname_;} - - ~parser (); - - private: - parser (const parser&); - parser& operator= (const parser&); - - // Parsing events. - // - public: - enum event_type - { - // If adding new events, also update the stream insertion operator. - // - start_element, - end_element, - start_attribute, - end_attribute, - characters, - start_namespace_decl, - end_namespace_decl, - eof - }; - - event_type - next (); - - // Get the next event and make sure that it's what's expected. If it - // is not, then throw an appropriate parsing exception. - // - void - next_expect (event_type); - - void - next_expect (event_type, const std::string& name); - - void - next_expect (event_type, const qname_type& qname); - - void - next_expect (event_type, const std::string& ns, const std::string& name); - - event_type - peek (); - - // Return the even that was last returned by the call to next() or - // peek(). - // - event_type - event () {return event_;} - - // Event data. - // - public: - const qname_type& qname () const {return *pqname_;} - - const std::string& namespace_ () const {return pqname_->namespace_ ();} - const std::string& name () const {return pqname_->name ();} - const std::string& prefix () const {return pqname_->prefix ();} - - std::string& value () {return *pvalue_;} - const std::string& value () const {return *pvalue_;} - template T value () const; - - unsigned long long line () const {return line_;} - unsigned long long column () const {return column_;} - - // Attribute map lookup. If attribute is not found, then the version - // without the default value throws an appropriate parsing exception - // while the version with the default value returns that value. - // - // Note also that there is no attribute(ns,name) version since it - // would conflict with attribute(name,dv) (qualified attributes - // are not very common). - // - // Attribute map is valid throughout at the "element level" until - // end_element and not just during start_element. As a special case, - // the map is still valid after peek() that returned end_element until - // this end_element event is retrieved with next(). - // - const std::string& - attribute (const std::string& name) const; - - template - T - attribute (const std::string& name) const; - - std::string - attribute (const std::string& name, - const std::string& default_value) const; - - template - T - attribute (const std::string& name, const T& default_value) const; - - const std::string& - attribute (const qname_type& qname) const; - - template - T - attribute (const qname_type& qname) const; - - std::string - attribute (const qname_type& qname, - const std::string& default_value) const; - - template - T - attribute (const qname_type& qname, const T& default_value) const; - - bool - attribute_present (const std::string& name) const; - - bool - attribute_present (const qname_type& qname) const; - - // Low-level attribute map access. Note that this API assumes - // all attributes are handled. - // - struct attribute_value_type - { - std::string value; - mutable bool handled; - }; - - typedef std::map attribute_map_type; - - const attribute_map_type& - attribute_map () const; - - // Optional content processing. - // - public: - // Note that you cannot get/set content while peeking. - // - void - content (content_type); - - content_type - content () const; - - // Versions that also set the content. Event type must be start_element. - // - void - next_expect (event_type, const std::string& name, content_type); - - void - next_expect (event_type, const qname_type& qname, content_type); - - void - next_expect (event_type, - const std::string& ns, const std::string& name, - content_type); - - // Helpers for parsing elements with simple content. The first two - // functions assume that start_element has already been parsed. The - // rest parse the complete element, from start to end. - // - // Note also that as with attribute(), there is no (namespace,name) - // overload since it would conflicts with (namespace,default_value). - // - public: - std::string - element (); - - template - T - element (); - - std::string - element (const std::string& name); - - std::string - element (const qname_type& qname); - - template - T - element (const std::string& name); - - template - T - element (const qname_type& qname); - - std::string - element (const std::string& name, const std::string& default_value); - - std::string - element (const qname_type& qname, const std::string& default_value); - - template - T - element (const std::string& name, const T& default_value); - - template - T - element (const qname_type& qname, const T& default_value); - - // C++11 range-based for support. Generally, the iterator interface - // doesn't make much sense for the parser so for now we have an - // implementation that is just enough to the range-based for. - // - public: - struct iterator - { - typedef event_type value_type; - - iterator (parser* p = nullptr, event_type e = eof): p_ (p), e_ (e) {} - value_type operator* () const {return e_;} - iterator& operator++ () {e_ = p_->next (); return *this;} - - // Comparison only makes sense when comparing to end (eof). - // - bool operator== (iterator y) const {return e_ == eof && y.e_ == eof;} - bool operator!= (iterator y) const {return !(*this == y);} - - private: - parser* p_; - event_type e_; - }; - - iterator begin () {return iterator (this, next ());} - iterator end () {return iterator (this, eof);} - - private: - static void XMLCALL - start_element_ (void*, const XML_Char*, const XML_Char**); - - static void XMLCALL - end_element_ (void*, const XML_Char*); - - static void XMLCALL - characters_ (void*, const XML_Char*, int); - - static void XMLCALL - start_namespace_decl_ (void*, const XML_Char*, const XML_Char*); - - static void XMLCALL - end_namespace_decl_ (void*, const XML_Char*); - - private: - void - init (); - - event_type - next_ (bool peek); - - event_type - next_body (); - - void - handle_error (); - - private: - // If size_ is 0, then data is std::istream. Otherwise, it is a buffer. - // - union - { - std::istream* is; - const void* buf; - } data_; - - std::size_t size_; - - const std::string iname_; - feature_type feature_; - - XML_Parser p_; - std::size_t depth_; - bool accumulate_; // Whether we are accumulating character content. - enum {state_next, state_peek} state_; - event_type event_; - event_type queue_; - - qname_type qname_; - std::string value_; - - // These are used to avoid copying when we are handling attributes - // and namespace decls. - // - const qname_type* pqname_; - std::string* pvalue_; - - unsigned long long line_; - unsigned long long column_; - - // Attributes as events. - // - struct attribute_type - { - qname_type qname; - std::string value; - }; - - typedef std::vector attributes; - - attributes attr_; - attributes::size_type attr_i_; // Index of the current attribute. - - // Namespace declarations. - // - typedef std::vector namespace_decls; - - namespace_decls start_ns_; - namespace_decls::size_type start_ns_i_; // Index of the current decl. - - namespace_decls end_ns_; - namespace_decls::size_type end_ns_i_; // Index of the current decl. - - // Element state consisting of the content model and attribute map. - // - struct element_entry - { - element_entry (std::size_t d, content_type c = content_type::mixed) - : depth (d), content (c), attr_unhandled_ (0) {} - - std::size_t depth; - content_type content; - attribute_map_type attr_map_; - mutable attribute_map_type::size_type attr_unhandled_; - }; - - typedef std::vector element_state; - std::vector element_state_; - - // Empty attribute map to return when an element has no attributes. - // - const attribute_map_type empty_attr_map_; - - // Return the element entry corresponding to the current depth, if - // exists, and NULL otherwise. - // - const element_entry* - get_element () const; - - const element_entry* - get_element_ () const; - - void - pop_element (); - }; - - LIBSTUDXML_EXPORT std::ostream& - operator<< (std::ostream&, parser::event_type); -} - -#include -#include - -#include - -#endif // LIBSTUDXML_PARSER_HXX diff --git a/third-party/libstudxml/libstudxml/parser.ixx b/third-party/libstudxml/libstudxml/parser.ixx deleted file mode 100644 index 564b4a9a..00000000 --- a/third-party/libstudxml/libstudxml/parser.ixx +++ /dev/null @@ -1,240 +0,0 @@ -// file : libstudxml/parser.ixx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include - -#include - -namespace xml -{ - // parsing - // - inline parsing:: - parsing (const std::string& n, - unsigned long long l, - unsigned long long c, - const std::string& d) - : name_ (n), line_ (l), column_ (c), description_ (d) - { - init (); - } - - inline parsing:: - parsing (const parser& p, const std::string& d) - : name_ (p.input_name ()), - line_ (p.line ()), - column_ (p.column ()), - description_ (d) - { - init (); - } - - // parser - // - inline parser:: - parser (std::istream& is, const std::string& iname, feature_type f) - : size_ (0), iname_ (iname), feature_ (f) - { - data_.is = &is; - init (); - } - - inline parser:: - parser (const void* data, - std::size_t size, - const std::string& iname, - feature_type f) - : size_ (size), iname_ (iname), feature_ (f) - { - assert (data != nullptr && size != 0); - - data_.buf = data; - init (); - } - - inline parser::event_type parser:: - peek () - { - if (state_ == state_peek) - return event_; - else - { - event_type e (next_ (true)); - state_ = state_peek; // Set it after the call to next_(). - return e; - } - } - - template - inline T parser:: - value () const - { - return value_traits::parse (value (), *this); - } - - inline const parser::element_entry* parser:: - get_element () const - { - return element_state_.empty () ? nullptr : get_element_ (); - } - - inline const std::string& parser:: - attribute (const std::string& n) const - { - return attribute (qname_type (n)); - } - - template - inline T parser:: - attribute (const std::string& n) const - { - return attribute (qname_type (n)); - } - - inline std::string parser:: - attribute (const std::string& n, const std::string& dv) const - { - return attribute (qname_type (n), dv); - } - - template - inline T parser:: - attribute (const std::string& n, const T& dv) const - { - return attribute (qname_type (n), dv); - } - - template - inline T parser:: - attribute (const qname_type& qn) const - { - return value_traits::parse (attribute (qn), *this); - } - - inline bool parser:: - attribute_present (const std::string& n) const - { - return attribute_present (qname_type (n)); - } - - inline const parser::attribute_map_type& parser:: - attribute_map () const - { - if (const element_entry* e = get_element ()) - { - e->attr_unhandled_ = 0; // Assume all handled. - return e->attr_map_; - } - - return empty_attr_map_; - } - - inline void parser:: - next_expect (event_type e, const qname_type& qn) - { - next_expect (e, qn.namespace_ (), qn.name ()); - } - - inline void parser:: - next_expect (event_type e, const std::string& n) - { - next_expect (e, std::string (), n); - } - - template - inline T parser:: - element () - { - return value_traits::parse (element (), *this); - } - - inline std::string parser:: - element (const std::string& n) - { - next_expect (start_element, n); - return element (); - } - - inline std::string parser:: - element (const qname_type& qn) - { - next_expect (start_element, qn); - return element (); - } - - template - inline T parser:: - element (const std::string& n) - { - return value_traits::parse (element (n), *this); - } - - template - inline T parser:: - element (const qname_type& qn) - { - return value_traits::parse (element (qn), *this); - } - - inline std::string parser:: - element (const std::string& n, const std::string& dv) - { - return element (qname_type (n), dv); - } - - template - inline T parser:: - element (const std::string& n, const T& dv) - { - return element (qname_type (n), dv); - } - - inline void parser:: - content (content_type c) - { - assert (state_ == state_next); - - if (!element_state_.empty () && element_state_.back ().depth == depth_) - element_state_.back ().content = c; - else - element_state_.push_back (element_entry (depth_, c)); - } - - inline parser::content_type parser:: - content () const - { - assert (state_ == state_next); - - return - !element_state_.empty () && element_state_.back ().depth == depth_ - ? element_state_.back ().content - : content_type (content_type::mixed); - } - - inline void parser:: - next_expect (event_type e, const qname_type& qn, content_type c) - { - assert (e == start_element); - next_expect (e, qn); - content (c); - } - - inline void parser:: - next_expect (event_type e, const std::string& n, content_type c) - { - assert (e == start_element); - next_expect (e, std::string (), n); - content (c); - } - - inline void parser:: - next_expect (event_type e, - const std::string& ns, const std::string& n, - content_type c) - { - assert (e == start_element); - next_expect (e, ns, n); - content (c); - } -} diff --git a/third-party/libstudxml/libstudxml/parser.txx b/third-party/libstudxml/libstudxml/parser.txx deleted file mode 100644 index 4a102345..00000000 --- a/third-party/libstudxml/libstudxml/parser.txx +++ /dev/null @@ -1,43 +0,0 @@ -// file : libstudxml/parser.txx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include - -namespace xml -{ - template - T parser:: - attribute (const qname_type& qn, const T& dv) const - { - if (const element_entry* e = get_element ()) - { - attribute_map_type::const_iterator i (e->attr_map_.find (qn)); - - if (i != e->attr_map_.end ()) - { - if (!i->second.handled) - { - i->second.handled = true; - e->attr_unhandled_--; - } - return value_traits::parse (i->second.value, *this); - } - } - - return dv; - } - - template - T parser:: - element (const qname_type& qn, const T& dv) - { - if (peek () == start_element && qname () == qn) - { - next (); - return element (); - } - - return dv; - } -} diff --git a/third-party/libstudxml/libstudxml/qname.cxx b/third-party/libstudxml/libstudxml/qname.cxx deleted file mode 100644 index bc4cb65c..00000000 --- a/third-party/libstudxml/libstudxml/qname.cxx +++ /dev/null @@ -1,32 +0,0 @@ -// file : libstudxml/qname.cxx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include - -#include - -using namespace std; - -namespace xml -{ - string qname:: - string () const - { - std::string r; - if (!ns_.empty ()) - { - r += ns_; - r += '#'; - } - - r += name_; - return r; - } - - ostream& - operator<< (ostream& os, const qname& qn) - { - return os << qn.string (); - } -} diff --git a/third-party/libstudxml/libstudxml/qname.hxx b/third-party/libstudxml/libstudxml/qname.hxx deleted file mode 100644 index ff32ec44..00000000 --- a/third-party/libstudxml/libstudxml/qname.hxx +++ /dev/null @@ -1,86 +0,0 @@ -// file : libstudxml/qname.hxx -*- C++ -*- -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_QNAME_HXX -#define LIBSTUDXML_QNAME_HXX - -#include - -#include -#include - -#include - -#include - -namespace xml -{ - // Note that the optional prefix is just a "syntactic sugar". In - // particular, it is ignored by the comparison operators and the - // std::ostream insertion operator. - // - class LIBSTUDXML_EXPORT qname - { - public: - qname () {} - qname (const std::string& name): name_ (name) {} - qname (const std::string& ns, const std::string& name) - : ns_ (ns), name_ (name) {} - qname (const std::string& ns, - const std::string& name, - const std::string& prefix) - : ns_ (ns), name_ (name), prefix_ (prefix) {} - - const std::string& namespace_ () const {return ns_;} - const std::string& name () const {return name_;} - const std::string& prefix () const {return prefix_;} - - std::string& namespace_ () {return ns_;} - std::string& name () {return name_;} - std::string& prefix () {return prefix_;} - - bool - empty () const {return name_.empty () && ns_.empty ();} - - // String representation in the [#] form. - // - std::string - string () const; - - // Note that comparison operators ignore prefixes. - // - public: - friend bool - operator< (const qname& x, const qname& y) - { - return x.ns_ < y.ns_ || (x.ns_ == y.ns_ && x.name_ < y.name_); - } - - friend bool - operator== (const qname& x, const qname& y) - { - return x.ns_ == y.ns_ && x.name_ == y.name_; - } - - friend bool - operator!= (const qname& x, const qname& y) - { - return !(x == y); - } - - private: - std::string ns_; - std::string name_; - std::string prefix_; - }; - - // Print the string representation ([#]). - // - LIBSTUDXML_EXPORT std::ostream& - operator<< (std::ostream&, const qname&); -} - -#include - -#endif // LIBSTUDXML_QNAME_HXX diff --git a/third-party/libstudxml/libstudxml/serializer.cxx b/third-party/libstudxml/libstudxml/serializer.cxx deleted file mode 100644 index dcfe5f0a..00000000 --- a/third-party/libstudxml/libstudxml/serializer.cxx +++ /dev/null @@ -1,325 +0,0 @@ -// file : libstudxml/serializer.cxx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include // std::bad_alloc -#include // std::strlen - -#include - -using namespace std; - -namespace xml -{ - // serialization - // - void serialization:: - init () - { - if (!name_.empty ()) - { - what_ += name_; - what_ += ": "; - } - - what_ += "error: "; - what_ += description_; - } - - // serializer - // - extern "C" genxStatus - genx_write (void* p, constUtf8 us) - { - // It would have been easier to throw the exception directly, - // however, the Genx code is most likely not exception safe. - // - ostream* os (static_cast (p)); - const char* s (reinterpret_cast (us)); - os->write (s, static_cast (strlen (s))); - return os->good () ? GENX_SUCCESS : GENX_IO_ERROR; - } - - extern "C" genxStatus - genx_write_bound (void* p, constUtf8 start, constUtf8 end) - { - ostream* os (static_cast (p)); - const char* s (reinterpret_cast (start)); - streamsize n (static_cast (end - start)); - os->write (s, n); - return os->good () ? GENX_SUCCESS : GENX_IO_ERROR; - } - - extern "C" genxStatus - genx_flush (void* p) - { - ostream* os (static_cast (p)); - os->flush (); - return os->good () ? GENX_SUCCESS : GENX_IO_ERROR; - } - - serializer:: - ~serializer () - { - if (s_ != 0) - genxDispose (s_); - } - - serializer:: - serializer (ostream& os, const string& oname, unsigned short ind) - : os_ (os), os_state_ (os.exceptions ()), oname_ (oname), depth_ (0) - { - // Temporarily disable exceptions on the stream. - // - os_.exceptions (ostream::goodbit); - - // Allocate the serializer. Make sure nothing else can throw after - // this call since otherwise we will leak it. - // - s_ = genxNew (0, 0, 0); - - if (s_ == 0) - throw bad_alloc (); - - genxSetUserData (s_, &os_); - - if (ind != 0) - genxSetPrettyPrint (s_, ind); - - sender_.send = &genx_write; - sender_.sendBounded = &genx_write_bound; - sender_.flush = &genx_flush; - - if (genxStatus e = genxStartDocSender (s_, &sender_)) - { - string m (genxGetErrorMessage (s_, e)); - genxDispose (s_); - throw serialization (oname, m); - } - } - - void serializer:: - handle_error (genxStatus e) const - { - switch (e) - { - case GENX_ALLOC_FAILED: - throw bad_alloc (); - case GENX_IO_ERROR: - // Restoring the original exception state should trigger the - // exception. If it doesn't (e.g., because the user didn't - // configure the stream to throw), then fall back to the - // serialiation exception. - // - os_.exceptions (os_state_); - // Fall through. - default: - throw serialization (oname_, genxGetErrorMessage (s_, e)); - } - } - - void serializer:: - start_element (const string& ns, const string& name) - { - if (genxStatus e = genxStartElementLiteral ( - s_, - reinterpret_cast (ns.empty () ? 0 : ns.c_str ()), - reinterpret_cast (name.c_str ()))) - handle_error (e); - - depth_++; - } - - void serializer:: - end_element () - { - if (genxStatus e = genxEndElement (s_)) - handle_error (e); - - // Call EndDocument() if we are past the root element. - // - if (--depth_ == 0) - { - if (genxStatus e = genxEndDocument (s_)) - handle_error (e); - - // Also restore the original exception state on the stream. - // - os_.exceptions (os_state_); - } - } - - void serializer:: - end_element (const string& ns, const string& name) - { - constUtf8 cns, cn; - genxStatus e; - if ((e = genxGetCurrentElement (s_, &cns, &cn)) || - reinterpret_cast (cn) != name || - (cns == 0 ? !ns.empty () : reinterpret_cast (cns) != ns)) - { - handle_error (e != GENX_SUCCESS ? e : GENX_SEQUENCE_ERROR); - } - - end_element (); - } - - void serializer:: - element (const string& ns, const string& n, const string& v) - { - start_element (ns, n); - element (v); - } - - void serializer:: - start_attribute (const string& ns, const string& name) - { - if (genxStatus e = genxStartAttributeLiteral ( - s_, - reinterpret_cast (ns.empty () ? 0 : ns.c_str ()), - reinterpret_cast (name.c_str ()))) - handle_error (e); - } - - void serializer:: - end_attribute () - { - if (genxStatus e = genxEndAttribute (s_)) - handle_error (e); - } - - void serializer:: - end_attribute (const string& ns, const string& name) - { - constUtf8 cns, cn; - genxStatus e; - if ((e = genxGetCurrentAttribute (s_, &cns, &cn)) || - reinterpret_cast (cn) != name || - (cns == 0 ? !ns.empty () : reinterpret_cast (cns) != ns)) - { - handle_error (e != GENX_SUCCESS ? e : GENX_SEQUENCE_ERROR); - } - - end_attribute (); - } - - void serializer:: - attribute (const string& ns, - const string& name, - const string& value) - { - if (genxStatus e = genxAddAttributeLiteral ( - s_, - reinterpret_cast (ns.empty () ? 0 : ns.c_str ()), - reinterpret_cast (name.c_str ()), - reinterpret_cast (value.c_str ()))) - handle_error (e); - } - - void serializer:: - characters (const string& value) - { - if (genxStatus e = genxAddCountedText ( - s_, - reinterpret_cast (value.c_str ()), value.size ())) - handle_error (e); - } - - void serializer:: - namespace_decl (const string& ns, const string& p) - { - if (genxStatus e = ns.empty () && p.empty () - ? genxUnsetDefaultNamespace (s_) - : genxAddNamespaceLiteral ( - s_, - reinterpret_cast (ns.c_str ()), - reinterpret_cast (p.c_str ()))) - handle_error (e); - } - - void serializer:: - xml_decl (const string& ver, const string& enc, const string& stl) - { - if (genxStatus e = genxXmlDeclaration ( - s_, - reinterpret_cast (ver.c_str ()), - (enc.empty () ? 0 : reinterpret_cast (enc.c_str ())), - (stl.empty () ? 0 : reinterpret_cast (stl.c_str ())))) - handle_error (e); - } - - void serializer:: - doctype_decl (const string& re, - const string& pi, - const string& si, - const string& is) - { - if (genxStatus e = genxDoctypeDeclaration ( - s_, - reinterpret_cast (re.c_str ()), - (pi.empty () ? 0 : reinterpret_cast (pi.c_str ())), - (si.empty () ? 0 : reinterpret_cast (si.c_str ())), - (is.empty () ? 0 : reinterpret_cast (is.c_str ())))) - handle_error (e); - } - - bool serializer:: - lookup_namespace_prefix (const string& ns, string& p) const - { - // Currently Genx will create a namespace mapping if one doesn't - // already exist. - // - genxStatus e; - genxNamespace gns ( - genxDeclareNamespace ( - s_, reinterpret_cast (ns.c_str ()), 0, &e)); - - if (e != GENX_SUCCESS) - handle_error (e); - - p = reinterpret_cast (genxGetNamespacePrefix (gns)); - return true; - } - - qname serializer:: - current_element () const - { - constUtf8 ns, n; - if (genxStatus e = genxGetCurrentElement (s_, &ns, &n)) - handle_error (e); - - return qname (ns != 0 ? reinterpret_cast (ns) : "", - reinterpret_cast (n)); - } - - qname serializer:: - current_attribute () const - { - constUtf8 ns, n; - if (genxStatus e = genxGetCurrentAttribute (s_, &ns, &n)) - handle_error (e); - - return qname (ns != 0 ? reinterpret_cast (ns) : "", - reinterpret_cast (n)); - } - - void serializer:: - suspend_indentation () - { - if (genxStatus e = genxSuspendPrettyPrint (s_)) - handle_error (e); - } - - void serializer:: - resume_indentation () - { - if (genxStatus e = genxResumePrettyPrint (s_)) - handle_error (e); - } - - size_t serializer:: - indentation_suspended () const - { - return static_cast (genxPrettyPrintSuspended (s_)); - } -} diff --git a/third-party/libstudxml/libstudxml/serializer.hxx b/third-party/libstudxml/libstudxml/serializer.hxx deleted file mode 100644 index 914c5c58..00000000 --- a/third-party/libstudxml/libstudxml/serializer.hxx +++ /dev/null @@ -1,307 +0,0 @@ -// file : libstudxml/serializer.hxx -*- C++ -*- -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_SERIALIZER_HXX -#define LIBSTUDXML_SERIALIZER_HXX - -#include - -#include -#include -#include // std::size_t - -#include - -#include -#include -#include - -#include // STUDXML_NOTHROW_NOEXCEPT -#include - -namespace xml -{ - class serialization: public exception - { - public: - virtual - ~serialization () STUDXML_NOTHROW_NOEXCEPT {} - - serialization (const std::string& name, const std::string& description); - serialization (const serializer& s, const std::string& description); - - const std::string& - name () const {return name_;} - - const std::string& - description () const {return description_;} - - virtual const char* - what () const STUDXML_NOTHROW_NOEXCEPT {return what_.c_str ();} - - private: - LIBSTUDXML_EXPORT void - init (); - - private: - std::string name_; - std::string description_; - std::string what_; - }; - - class LIBSTUDXML_EXPORT serializer - { - public: - typedef xml::qname qname_type; - - // Serialize to std::ostream. Output name is used in diagnostics to - // identify the document being serialized. The indentation argument - // specifies the number of indentation spaces that should be used for - // pretty-printing. If 0 is passed, no pretty-printing is performed. - // - // If stream exceptions are enabled then std::ios_base::failure - // exception is used to report io errors (badbit and failbit). - // Otherwise, those are reported as the serialization exception. - // - serializer (std::ostream&, - const std::string& output_name, - unsigned short indentation = 2); - - const std::string& - output_name () const {return oname_;} - - ~serializer (); - - private: - serializer (const serializer&); - serializer& operator= (const serializer&); - - // Serialization functions. - // - public: - - // Elements. - // - void - start_element (const qname_type& qname); - - void - start_element (const std::string& name); - - void - start_element (const std::string& ns, const std::string& name); - - void - end_element (); - - // "Checked" end element. That is, it checks that the element - // you think you are ending matches the current one. - // - void - end_element (const qname_type& qname); - - void - end_element (const std::string& name); - - void - end_element (const std::string& ns, const std::string& name); - - - // Helpers for serializing elements with simple content. The first two - // functions assume that start_element() has already been called. The - // other two serialize the complete element, from start to end. - // - void - element (const std::string& value); - - template - void - element (const T& value); - - void - element (const std::string& name, const std::string& value); - - template - void - element (const std::string& name, const T& value); - - void - element (const qname_type& qname, const std::string& value); - - template - void - element (const qname_type& qname, const T& value); - - void - element (const std::string& namespace_, - const std::string& name, - const std::string& value); - - template - void - element (const std::string& namespace_, - const std::string& name, - const T& value); - - // Attributes. - // - void - start_attribute (const qname_type& qname); - - void - start_attribute (const std::string& name); - - void - start_attribute (const std::string& ns, const std::string& name); - - void - end_attribute (); - - // "Checked" end attribute. That is, it checks that the attribute - // you think you are ending matches the current one. - // - void - end_attribute (const qname_type& qname); - - void - end_attribute (const std::string& name); - - void - end_attribute (const std::string& ns, const std::string& name); - - - void - attribute (const qname_type& qname, const std::string& value); - - template - void - attribute (const qname_type& qname, const T& value); - - void - attribute (const std::string& name, const std::string& value); - - template - void - attribute (const std::string& name, const T& value); - - void - attribute (const std::string& ns, - const std::string& name, - const std::string& value); - - template - void - attribute (const std::string& ns, - const std::string& name, - const T& value); - - // Characters. - // - void - characters (const std::string& value); - - template - void - characters (const T& value); - - // Namespaces declaration. If prefix is empty, then the default - // namespace is declared. If both prefix and namespace are empty, - // then the default namespace declaration is cleared (xmlns=""). - // - // This function should be called after start_element(). - // - void - namespace_decl (const std::string& ns, const std::string& prefix); - - // XML declaration. If encoding or standalone are not specified, - // then these attributes are omitted from the output. - // - void - xml_decl (const std::string& version = "1.0", - const std::string& encoding = "UTF-8", - const std::string& standalone = ""); - - // DOCTYPE declaration. If encoding or standalone are not specified, - // then these attributes are omitted from the output. - // - void - doctype_decl (const std::string& root_element, - const std::string& public_id = "", - const std::string& system_id = "", - const std::string& internal_subset = ""); - - // Utility functions. - // - public: - // Return true if there is a mapping. In this case, prefix contains - // the mapped prefix. - // - bool - lookup_namespace_prefix (const std::string& ns, std::string& prefix) const; - - // Return the current element, that is, the latest element for which - // start_element() but not end_element() have been called. - // - qname - current_element () const; - - // Return the current attribute, that is, the latest attribute for - // which start_attribute() but not end_attribute() have been called. - // - qname - current_attribute () const; - - // Suspend/resume indentation. - // - public: - - // Indentation can be suspended only inside an element and, unless - // explicitly resumed, it will remain suspended until the end of - // that element. You should only explicitly resume indentation at - // the element nesting level of suspension. If indentation is already - // suspended at an outer nesting level, then subsequent calls to - // suspend/resume are ignored. The indentation_suspended() function - // can be used to check if indentation is currently suspended. If it - // is not, then this function returns 0. Otherwise, it returns the - // level at which pretty-printing was suspended, with root element - // being level 1. - // - void - suspend_indentation (); - - void - resume_indentation (); - - std::size_t - indentation_suspended () const; - - private: - void - handle_error (genxStatus) const; - - private: - std::ostream& os_; - std::ostream::iostate os_state_; // Original exception state. - const std::string oname_; - - genxWriter s_; - genxSender sender_; - std::size_t depth_; - }; - - // Stream-like interface for serializer. If the passed argument is - // callable with the serializer as its argument, then this function - // (object) is called with the passed serializer. Otherwise, the - // argument is passed to the serializer's characters() function. - // - template - serializer& - operator<< (serializer&, const T& value); -} - -#include - -#include - -#endif // LIBSTUDXML_SERIALIZER_HXX diff --git a/third-party/libstudxml/libstudxml/serializer.ixx b/third-party/libstudxml/libstudxml/serializer.ixx deleted file mode 100644 index a77c3b9d..00000000 --- a/third-party/libstudxml/libstudxml/serializer.ixx +++ /dev/null @@ -1,219 +0,0 @@ -// file : libstudxml/serializer.ixx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include - -namespace xml -{ - // serialization - // - inline serialization:: - serialization (const std::string& name, const std::string& d) - : name_ (name), description_ (d) - { - init (); - } - - inline serialization:: - serialization (const serializer& s, const std::string& d) - : name_ (s.output_name ()), description_ (d) - { - init (); - } - - // serializer - // - inline void serializer:: - start_element (const qname_type& qname) - { - start_element (qname.namespace_ (), qname.name ()); - } - - inline void serializer:: - start_element (const std::string& name) - { - start_element (std::string (), name); - } - - inline void serializer:: - end_element (const qname_type& qname) - { - end_element (qname.namespace_ (), qname.name ()); - } - - inline void serializer:: - end_element (const std::string& name) - { - end_element (std::string (), name); - } - - inline void serializer:: - element (const std::string& v) - { - if (!v.empty ()) - characters (v); - - end_element (); - } - - template - inline void serializer:: - element (const T& v) - { - element (value_traits::serialize (v, *this)); - } - - inline void serializer:: - element (const std::string& n, const std::string& v) - { - element (std::string (), n, v); - } - - template - inline void serializer:: - element (const std::string& n, const T& v) - { - element (n, value_traits::serialize (v, *this)); - } - - inline void serializer:: - element (const qname_type& qn, const std::string& v) - { - element (qn.namespace_ (), qn.name (), v); - } - - template - inline void serializer:: - element (const qname_type& qn, const T& v) - { - element (qn, value_traits::serialize (v, *this)); - } - - template - inline void serializer:: - element (const std::string& ns, const std::string& n, const T& v) - { - element (ns, n, value_traits::serialize (v, *this)); - } - - inline void serializer:: - start_attribute (const qname_type& qname) - { - start_attribute (qname.namespace_ (), qname.name ()); - } - - inline void serializer:: - start_attribute (const std::string& name) - { - start_attribute (std::string (), name); - } - - inline void serializer:: - end_attribute (const qname_type& qname) - { - end_attribute (qname.namespace_ (), qname.name ()); - } - - inline void serializer:: - end_attribute (const std::string& name) - { - end_attribute (std::string (), name); - } - - inline void serializer:: - attribute (const qname_type& qname, const std::string& value) - { - attribute (qname.namespace_ (), qname.name (), value); - } - - template - inline void serializer:: - attribute (const qname_type& qname, const T& value) - { - attribute (qname, value_traits::serialize (value, *this)); - } - - inline void serializer:: - attribute (const std::string& name, const std::string& value) - { - attribute (std::string (), name, value); - } - - template - inline void serializer:: - attribute (const std::string& name, const T& value) - { - attribute (name, value_traits::serialize (value, *this)); - } - - template - inline void serializer:: - attribute (const std::string& ns, const std::string& name, const T& value) - { - attribute (ns, name, value_traits::serialize (value, *this)); - } - - template - inline void serializer:: - characters (const T& value) - { - characters (value_traits::serialize (value, *this)); - } - - // operator<< - // - - inline serializer& - operator<< (serializer& s, void (*func) (serializer&)) - { - func (s); - return s; - } - - namespace details - { - // Detect whether T is callable with argument A. - // - template - struct is_callable - { - typedef char no[1]; - typedef char yes[2]; - template static X declval (); - - template struct check; - - template - static no& test (...); - - template - static yes& test (check () (declval ()), 0)>*); - - static const bool value = sizeof (test (0)) == sizeof (yes); - }; - - template ::value> - struct inserter; - - template - struct inserter - { - static void insert (serializer& s, const T& f) {f (s);} - }; - - template - struct inserter - { - static void insert (serializer& s, const T& v) {s.characters (v);} - }; - } - - template - inline serializer& - operator<< (serializer& s, const T& value) - { - details::inserter::insert (s, value); - return s; - } -} diff --git a/third-party/libstudxml/libstudxml/value-traits.cxx b/third-party/libstudxml/libstudxml/value-traits.cxx deleted file mode 100644 index e271820d..00000000 --- a/third-party/libstudxml/libstudxml/value-traits.cxx +++ /dev/null @@ -1,21 +0,0 @@ -// file : libstudxml/value-traits.cxx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include - -using namespace std; - -namespace xml -{ - bool default_value_traits:: - parse (string s, const parser& p) - { - if (s == "true" || s == "1" || s == "True" || s == "TRUE") - return true; - else if (s == "false" || s == "0" || s == "False" || s == "FALSE") - return false; - else - throw parsing (p, "invalid bool value '" + s + "'"); - } -} diff --git a/third-party/libstudxml/libstudxml/value-traits.hxx b/third-party/libstudxml/libstudxml/value-traits.hxx deleted file mode 100644 index b324f19e..00000000 --- a/third-party/libstudxml/libstudxml/value-traits.hxx +++ /dev/null @@ -1,69 +0,0 @@ -// file : libstudxml/value-traits.hxx -*- C++ -*- -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_VALUE_TRAITS_HXX -#define LIBSTUDXML_VALUE_TRAITS_HXX - -#include - -#include -#include // std::size_t - -#include - -#include - -namespace xml -{ - template - struct default_value_traits - { - static T - parse (std::string, const parser&); - - static std::string - serialize (const T&, const serializer&); - }; - - template <> - struct LIBSTUDXML_EXPORT default_value_traits - { - static bool - parse (std::string, const parser&); - - static std::string - serialize (bool v, const serializer&) - { - return v ? "true" : "false"; - } - }; - - template <> - struct default_value_traits - { - static std::string - parse (std::string s, const parser&) - { - return s; - } - - static std::string - serialize (const std::string& v, const serializer&) - { - return v; - } - }; - - template - struct value_traits: default_value_traits {}; - - template - struct value_traits: default_value_traits {}; -} - -#include - -#include - -#endif // LIBSTUDXML_VALUE_TRAITS_HXX diff --git a/third-party/libstudxml/libstudxml/value-traits.txx b/third-party/libstudxml/libstudxml/value-traits.txx deleted file mode 100644 index 9801fba9..00000000 --- a/third-party/libstudxml/libstudxml/value-traits.txx +++ /dev/null @@ -1,32 +0,0 @@ -// file : libstudxml/value-traits.txx -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#include - -#include -#include - -namespace xml -{ - template - T default_value_traits:: - parse (std::string s, const parser& p) - { - T r; - std::istringstream is (s); - if (!(is >> r && is.eof ()) ) - throw parsing (p, "invalid value '" + s + "'"); - return r; - } - - template - std::string default_value_traits:: - serialize (const T& v, const serializer& s) - { - std::ostringstream os; - if (!(os << v)) - throw serialization (s, "invalid value"); - return os.str (); - } -} diff --git a/third-party/libstudxml/libstudxml/version.hxx b/third-party/libstudxml/libstudxml/version.hxx deleted file mode 100644 index e69de29b..00000000 diff --git a/third-party/libstudxml/libstudxml/version.hxx.in b/third-party/libstudxml/libstudxml/version.hxx.in deleted file mode 100644 index fe380285..00000000 --- a/third-party/libstudxml/libstudxml/version.hxx.in +++ /dev/null @@ -1,39 +0,0 @@ -// file : libstudxml/version.hxx.in -*- C++ -*- -// copyright : Copyright (c) 2013-2019 Code Synthesis Tools CC -// license : MIT; see accompanying LICENSE file - -#ifndef LIBSTUDXML_VERSION // Note: using the version macro itself. - -// The numeric version format is AAAAABBBBBCCCCCDDDE where: -// -// AAAAA - major version number -// BBBBB - minor version number -// CCCCC - bugfix version number -// DDD - alpha / beta (DDD + 500) version number -// E - final (0) / snapshot (1) -// -// When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example: -// -// Version AAAAABBBBBCCCCCDDDE -// -// 0.1.0 0000000001000000000 -// 0.1.2 0000000001000020000 -// 1.2.3 0000100002000030000 -// 2.2.0-a.1 0000200001999990010 -// 3.0.0-b.2 0000299999999995020 -// 2.2.0-a.1.z 0000200001999990011 -// -#define LIBSTUDXML_VERSION $libstudxml.version.project_number$ULL -#define LIBSTUDXML_VERSION_STR "$libstudxml.version.project$" -#define LIBSTUDXML_VERSION_ID "$libstudxml.version.project_id$" - -#define LIBSTUDXML_VERSION_MAJOR $libstudxml.version.major$ -#define LIBSTUDXML_VERSION_MINOR $libstudxml.version.minor$ -#define LIBSTUDXML_VERSION_PATCH $libstudxml.version.patch$ - -#define LIBSTUDXML_PRE_RELEASE $libstudxml.version.pre_release$ - -#define LIBSTUDXML_SNAPSHOT $libstudxml.version.snapshot_sn$ULL -#define LIBSTUDXML_SNAPSHOT_ID "$libstudxml.version.snapshot_id$" - -#endif // LIBSTUDXML_VERSION diff --git a/third-party/libstudxml/version b/third-party/libstudxml/version deleted file mode 100644 index f3fce4f6..00000000 --- a/third-party/libstudxml/version +++ /dev/null @@ -1 +0,0 @@ -1.1.0-b.8 \ No newline at end of file