diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2024-03-06 10:24:11 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2024-03-06 10:24:11 +0100 |
commit | 4538829ab86b5a1cd4e845e7eab165029c9d6d46 (patch) | |
tree | bbadf39aed0610c8f8f7b41fefff47773b8ac205 /xsd/examples/cxx/tree/embedded | |
parent | 23d41842168ac1a1580111b9c5c73500ceee3d57 (diff) | |
parent | aad5ad9bf0c02aa4e79bc6b7d6c934612fff4026 (diff) |
Update upstream source from tag 'upstream/4.2.0'
Update to upstream version '4.2.0'
with Debian dir 1b38df7bbcf313223de3c50107ac0255090fe647
Diffstat (limited to 'xsd/examples/cxx/tree/embedded')
-rw-r--r-- | xsd/examples/cxx/tree/embedded/README | 48 | ||||
-rw-r--r-- | xsd/examples/cxx/tree/embedded/driver.cxx | 183 | ||||
-rw-r--r-- | xsd/examples/cxx/tree/embedded/grammar-input-stream.cxx | 95 | ||||
-rw-r--r-- | xsd/examples/cxx/tree/embedded/grammar-input-stream.hxx | 40 | ||||
-rw-r--r-- | xsd/examples/cxx/tree/embedded/library.xml | 52 | ||||
-rw-r--r-- | xsd/examples/cxx/tree/embedded/library.xsd | 72 | ||||
-rw-r--r-- | xsd/examples/cxx/tree/embedded/makefile | 123 | ||||
-rw-r--r-- | xsd/examples/cxx/tree/embedded/xsdbin.cxx | 494 |
8 files changed, 0 insertions, 1107 deletions
diff --git a/xsd/examples/cxx/tree/embedded/README b/xsd/examples/cxx/tree/embedded/README deleted file mode 100644 index 266a8ff..0000000 --- a/xsd/examples/cxx/tree/embedded/README +++ /dev/null @@ -1,48 +0,0 @@ -This example shows how to embed the binary representation of the schema -grammar into an application and then use it with the C++/Tree mapping to -parse and validate XML documents. This example is similar to the 'caching' -example except that it loads the binary representation of the schemas -embedded into the application instead of pre-parsing external schema files. - -The example consists of the following files: - -xsdbin.cxx - Tool for converting one or more XML Schema files to the compressed binary - representation. The output is written as a pair of C++ source files - containing the array with the binary data. Use the --help option to see - the tool's usage information. - -library.xsd - XML Schema which describes a library of books. - -library.xml - Sample XML instance document. - -library.hxx -library.cxx - C++ types that represent the given vocabulary and a set of parsing - functions that convert XML instance documents to a tree-like in-memory - object model. These are generated by the XSD compiler from library.xsd. - -library-schema.hxx -library-schema.cxx - Binary representation of the library.xsd schema. These files are generated - by the xsdbin tool. - -grammar-input-stream.hxx -grammar-input-stream.cxx - Input stream implementation with the special-purpose schema grammar - decompression algorithm. It is used to load the binary schema representation - produced by the xsdbin tool. - -driver.cxx - Driver for the example. It first sets up the Xerces-C++ DOM parser and - loads the embedded binary schema grammar for validation. It then performs - ten iterations that parse the input file to a DOM document using the DOM - parser and call one of the parsing functions that constructs the object - model from this DOM document. On each iteration the driver prints a number - of books in the object model to STDERR. - -To run the example on the sample XML instance document simply execute: - -$ ./driver library.xml diff --git a/xsd/examples/cxx/tree/embedded/driver.cxx b/xsd/examples/cxx/tree/embedded/driver.cxx deleted file mode 100644 index 5ceafa4..0000000 --- a/xsd/examples/cxx/tree/embedded/driver.cxx +++ /dev/null @@ -1,183 +0,0 @@ -// file : examples/cxx/tree/embedded/driver.cxx -// copyright : not copyrighted - public domain - -#include <memory> // std::auto_ptr -#include <fstream> -#include <iostream> - -#include <xercesc/dom/DOM.hpp> -#include <xercesc/util/XMLUniDefs.hpp> // chLatin_* -#include <xercesc/util/PlatformUtils.hpp> -#include <xercesc/validators/common/Grammar.hpp> // xercesc::Grammar -#include <xercesc/framework/Wrapper4InputSource.hpp> - -#include <xercesc/framework/XMLGrammarPoolImpl.hpp> - -#include <xsd/cxx/xml/string.hxx> -#include <xsd/cxx/xml/dom/auto-ptr.hxx> -#include <xsd/cxx/xml/dom/bits/error-handler-proxy.hxx> -#include <xsd/cxx/xml/sax/std-input-source.hxx> - -#include <xsd/cxx/tree/error-handler.hxx> - -#include "library.hxx" -#include "library-schema.hxx" -#include "grammar-input-stream.hxx" - -using namespace std; - -int -main (int argc, char* argv[]) -{ - if (argc != 2) - { - cerr << "usage: " << argv[0] << " library.xml" << endl; - return 1; - } - - int r (0); - - // We need to initialize the Xerces-C++ runtime because we - // are doing the XML-to-DOM parsing ourselves. - // - xercesc::XMLPlatformUtils::Initialize (); - - try - { - using namespace xercesc; - namespace xml = xsd::cxx::xml; - namespace tree = xsd::cxx::tree; - - // Create and load the grammar pool. - // - MemoryManager* mm (XMLPlatformUtils::fgMemoryManager); - - auto_ptr<XMLGrammarPool> gp (new XMLGrammarPoolImpl (mm)); - - try - { - grammar_input_stream is (library_schema, sizeof (library_schema)); - gp->deserializeGrammars(&is); - } - catch(const XSerializationException& e) - { - cerr << "unable to load schema: " << - xml::transcode<char> (e.getMessage ()) << endl; - return 1; - } - - // Lock the grammar pool. This is necessary if we plan to use the - // same grammar pool in multiple threads (this way we can reuse the - // same grammar in multiple parsers). Locking the pool disallows any - // modifications to the pool, such as an attempt by one of the threads - // to cache additional schemas. - // - gp->lockPool (); - - // Get an implementation of the Load-Store (LS) interface. - // - const XMLCh ls_id [] = {chLatin_L, chLatin_S, chNull}; - - DOMImplementation* impl ( - DOMImplementationRegistry::getDOMImplementation (ls_id)); - - xml::dom::auto_ptr<DOMLSParser> parser ( - impl->createLSParser ( - DOMImplementationLS::MODE_SYNCHRONOUS, 0, mm, gp.get ())); - - DOMConfiguration* conf (parser->getDomConfig ()); - - // Discard comment nodes in the document. - // - conf->setParameter (XMLUni::fgDOMComments, false); - - // Enable datatype normalization. - // - conf->setParameter (XMLUni::fgDOMDatatypeNormalization, true); - - // Do not create EntityReference nodes in the DOM tree. No - // EntityReference nodes will be created, only the nodes - // corresponding to their fully expanded substitution text - // will be created. - // - conf->setParameter (XMLUni::fgDOMEntities, false); - - // Perform namespace processing. - // - conf->setParameter (XMLUni::fgDOMNamespaces, true); - - // Do not include ignorable whitespace in the DOM tree. - // - conf->setParameter (XMLUni::fgDOMElementContentWhitespace, false); - - // Enable validation. - // - conf->setParameter (XMLUni::fgDOMValidate, true); - conf->setParameter (XMLUni::fgXercesSchema, true); - conf->setParameter (XMLUni::fgXercesSchemaFullChecking, false); - - // Xerces-C++ 3.1.0 is the first version with working multi import - // support. - // -#if _XERCES_VERSION >= 30100 - conf->setParameter (XMLUni::fgXercesHandleMultipleImports, true); -#endif - - // Use the loaded grammar during parsing. - // - conf->setParameter (XMLUni::fgXercesUseCachedGrammarInParse, true); - - // Disable loading schemas via other means (e.g., schemaLocation). - // - conf->setParameter (XMLUni::fgXercesLoadSchema, false); - - // We will release the DOM document ourselves. - // - conf->setParameter (XMLUni::fgXercesUserAdoptsDOMDocument, true); - - // Set error handler. - // - tree::error_handler<char> eh; - xml::dom::bits::error_handler_proxy<char> ehp (eh); - conf->setParameter (XMLUni::fgDOMErrorHandler, &ehp); - - // Parse XML documents. - // - for (unsigned long i (0); i < 10; ++i) - { - ifstream ifs; - ifs.exceptions (ifstream::badbit | ifstream::failbit); - ifs.open (argv[1]); - - // Wrap the standard input stream. - // - xml::sax::std_input_source isrc (ifs, argv[1]); - Wrapper4InputSource wrap (&isrc, false); - - // Parse XML to DOM. - // - xml_schema::dom::auto_ptr<DOMDocument> doc (parser->parse (&wrap)); - - eh.throw_if_failed<xml_schema::parsing> (); - - // Parse DOM to the object model. - // - auto_ptr<library::catalog> c (library::catalog_ (*doc)); - - cerr << "catalog with " << c->book ().size () << " books" << endl; - } - } - catch (const xml_schema::exception& e) - { - cerr << e << endl; - r = 1; - } - catch (const std::ios_base::failure&) - { - cerr << argv[1] << ": unable to open or read failure" << endl; - r = 1; - } - - xercesc::XMLPlatformUtils::Terminate (); - return r; -} diff --git a/xsd/examples/cxx/tree/embedded/grammar-input-stream.cxx b/xsd/examples/cxx/tree/embedded/grammar-input-stream.cxx deleted file mode 100644 index f3a6d52..0000000 --- a/xsd/examples/cxx/tree/embedded/grammar-input-stream.cxx +++ /dev/null @@ -1,95 +0,0 @@ -// file : examples/cxx/tree/embedded/grammar-input-stream.cxx -// copyright : not copyrighted - public domain - -#include <cassert> -#include "grammar-input-stream.hxx" - -grammar_input_stream:: -grammar_input_stream (const XMLByte* data, std::size_t size) - : data_ (data), - size_ (size), - pos_ (0), - vpos_ (0), - cseq_ (0), - add_zero_ (false) -{ -} - -XMLFilePos grammar_input_stream:: -curPos () const -{ - return static_cast<XMLFilePos> (vpos_); -} - -XMLSize_t grammar_input_stream:: -readBytes (XMLByte* const buf, const XMLSize_t size) -{ - std::size_t i (0); - - // Add a zero from the alternating sequence if it didn't - // fit on the previous read. - // - if (add_zero_) - { - buf[i++] = 0; - add_zero_ = false; - } - - // If have an unfinished sequential sequence, output it now. - // - if (cseq_ != 0 && !alt_) - { - for (; cseq_ != 0 && i < size; --cseq_) - buf[i++] = 0; - } - - for (; i < size && pos_ < size_;) - { - XMLByte b = buf[i++] = data_[pos_++]; - - // See if we are in a compression sequence. - // - if (cseq_ != 0) - { - if (i < size) - buf[i++] = 0; - else - add_zero_ = true; // Add it on the next read. - - cseq_--; - continue; - } - - // If we are not in a compression sequence and this byte is - // not zero then we are done. - // - if (b != 0) - continue; - - // We have a zero. - // - assert (pos_ < size_); // There has to be another byte. - unsigned char v (static_cast<unsigned char> (data_[pos_++])); - alt_ = (v & 128) != 0; - cseq_ = v & 127; - - // If it is a sequential sequence, output as many zeros as - // we can. - // - if (!alt_) - { - for (; cseq_ != 0 && i < size; --cseq_) - buf[i++] = 0; - } - } - - vpos_ += i; - - return static_cast<XMLSize_t> (i); -} - -const XMLCh* grammar_input_stream:: -getContentType () const -{ - return 0; -} diff --git a/xsd/examples/cxx/tree/embedded/grammar-input-stream.hxx b/xsd/examples/cxx/tree/embedded/grammar-input-stream.hxx deleted file mode 100644 index ed12b7c..0000000 --- a/xsd/examples/cxx/tree/embedded/grammar-input-stream.hxx +++ /dev/null @@ -1,40 +0,0 @@ -// file : examples/cxx/tree/embedded/grammar-input-stream.hxx -// copyright : not copyrighted - public domain - -#ifndef GRAMMAR_INPUT_STREAM_HXX -#define GRAMMAR_INPUT_STREAM_HXX - -#include <cstddef> -#include <xercesc/util/BinInputStream.hpp> - -// Memory buffer input stream with the special-purpose schema -// grammar decompression. -// -class grammar_input_stream: public xercesc::BinInputStream -{ -public : - grammar_input_stream (const XMLByte* data, std::size_t size); - - virtual XMLFilePos - curPos () const; - - virtual XMLSize_t - readBytes (XMLByte* const buf, const XMLSize_t size); - - virtual const XMLCh* - getContentType () const; - -private : - const XMLByte* data_; - std::size_t size_; - std::size_t pos_; - std::size_t vpos_; - - // Compression data. - // - size_t cseq_; // Number of bytes left in a compression sequence. - bool alt_; // Alternating or sequential sequence. - bool add_zero_; // Add a zero on the next read. -}; - -#endif // GRAMMAR_INPUT_STREAM_HXX diff --git a/xsd/examples/cxx/tree/embedded/library.xml b/xsd/examples/cxx/tree/embedded/library.xml deleted file mode 100644 index f57c042..0000000 --- a/xsd/examples/cxx/tree/embedded/library.xml +++ /dev/null @@ -1,52 +0,0 @@ -<?xml version="1.0"?> - -<!-- - -file : examples/cxx/tree/embedded/library.xml -copyright : not copyrighted - public domain - ---> - -<lib:catalog xmlns:lib="http://www.codesynthesis.com/library" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.codesynthesis.com/library library.xsd"> - - <book id="MM" available="false"> - <isbn>0679760806</isbn> - <title>The Master and Margarita</title> - <genre>fiction</genre> - - <author recommends="WP"> - <name>Mikhail Bulgakov</name> - <born>1891-05-15</born> - <died>1940-03-10</died> - </author> - </book> - - - <book id="WP"> - <isbn>0679600841</isbn> - <title>War and Peace</title> - <genre>history</genre> - - <author recommends="CP"> - <name>Leo Tolstoy</name> - <born>1828-09-09</born> - <died>1910-11-20</died> - </author> - </book> - - - <book id="CP" available="false"> - <isbn>0679420290</isbn> - <title>Crime and Punishment</title> - <genre>philosophy</genre> - - <author> - <name>Fyodor Dostoevsky</name> - <born>1821-11-11</born> - <died>1881-02-09</died> - </author> - </book> - -</lib:catalog> diff --git a/xsd/examples/cxx/tree/embedded/library.xsd b/xsd/examples/cxx/tree/embedded/library.xsd deleted file mode 100644 index 6a9ad01..0000000 --- a/xsd/examples/cxx/tree/embedded/library.xsd +++ /dev/null @@ -1,72 +0,0 @@ -<?xml version="1.0"?> - -<!-- - -file : examples/cxx/tree/embedded/library.xsd -copyright : not copyrighted - public domain - ---> - -<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xse="http://www.codesynthesis.com/xmlns/xml-schema-extension" - xmlns:lib="http://www.codesynthesis.com/library" - targetNamespace="http://www.codesynthesis.com/library"> - - <xsd:simpleType name="isbn"> - <xsd:restriction base="xsd:unsignedInt"/> - </xsd:simpleType> - - <xsd:complexType name="title"> - <xsd:simpleContent> - <xsd:extension base="xsd:string"> - <xsd:attribute name="lang" type="xsd:language"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - - <xsd:simpleType name="genre"> - <xsd:restriction base="xsd:string"> - <xsd:enumeration value="romance"/> - <xsd:enumeration value="fiction"/> - <xsd:enumeration value="horror"/> - <xsd:enumeration value="history"/> - <xsd:enumeration value="philosophy"/> - </xsd:restriction> - </xsd:simpleType> - - <xsd:complexType name="person"> - <xsd:sequence> - <xsd:element name="name" type="xsd:string"/> - <xsd:element name="born" type="xsd:date"/> - <xsd:element name="died" type="xsd:date" minOccurs="0"/> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="author"> - <xsd:complexContent> - <xsd:extension base="lib:person"> - <xsd:attribute name="recommends" type="xsd:IDREF" xse:refType="lib:book"/> - </xsd:extension> - </xsd:complexContent> - </xsd:complexType> - - <xsd:complexType name="book"> - <xsd:sequence> - <xsd:element name="isbn" type="lib:isbn"/> - <xsd:element name="title" type="lib:title"/> - <xsd:element name="genre" type="lib:genre"/> - <xsd:element name="author" type="lib:author" maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute name="available" type="xsd:boolean" default="true"/> - <xsd:attribute name="id" type="xsd:ID" use="required"/> - </xsd:complexType> - - <xsd:complexType name="catalog"> - <xsd:sequence> - <xsd:element name="book" type="lib:book" maxOccurs="unbounded"/> - </xsd:sequence> - </xsd:complexType> - - <xsd:element name="catalog" type="lib:catalog"/> - -</xsd:schema> diff --git a/xsd/examples/cxx/tree/embedded/makefile b/xsd/examples/cxx/tree/embedded/makefile deleted file mode 100644 index d0fdc33..0000000 --- a/xsd/examples/cxx/tree/embedded/makefile +++ /dev/null @@ -1,123 +0,0 @@ -# file : examples/cxx/tree/embedded/makefile -# copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC -# license : GNU GPL v2 + exceptions; see accompanying LICENSE file - -include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make - -xsd := library.xsd -cxx := driver.cxx grammar-input-stream.cxx - -obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=.o) \ -$(xsd:.xsd=-schema.o)) -obj2 := $(out_base)/xsdbin.o -dep := $(obj:.o=.o.d) $(obj2:.o=.o.d) - -driver := $(out_base)/driver -xsdbin := $(out_base)/xsdbin -install := $(out_base)/.install -dist := $(out_base)/.dist -dist-win := $(out_base)/.dist-win -clean := $(out_base)/.clean - - -# Import. -# -$(call import,\ - $(scf_root)/import/libxerces-c/stub.make,\ - l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) - - -# Build. -# -$(driver): $(obj) $(xerces_c.l) -$(xsdbin): $(obj2) $(xerces_c.l) - -$(obj) $(dep): cpp_options := -I$(out_base) -I$(src_base) -I$(src_root)/libxsd -$(obj) $(obj2) $(dep): $(xerces_c.l.cpp-options) - -genf := $(xsd:.xsd=.hxx) $(xsd:.xsd=.ixx) $(xsd:.xsd=.cxx) -gen := $(addprefix $(out_base)/,$(genf)) - -$(gen): xsd := $(out_root)/xsd/xsd -$(gen): $(out_root)/xsd/xsd - -genf += $(xsd:.xsd=-schema.hxx) $(xsd:.xsd=-schema.cxx) - -.PRECIOUS: $(out_base)/%-schema.hxx $(out_base)/%-schema.cxx -$(out_base)/%: xsdbin := $(xsdbin) -$(out_base)/%-schema.hxx $(out_base)/%-schema.cxx: $(src_base)/%.xsd $(xsdbin) - $(call message,xsdbin $<,$(xsdbin) --output-dir $(out_base) $<) - -$(call include-dep,$(dep),$(obj),$(gen)) - -# Convenience alias for default target. -# -$(out_base)/: $(driver) - - -# Install & Dist. -# -dist-common := $(out_base)/.dist-common - -$(install) $(dist) $(dist-win) $(dist-common): path := $(subst $(src_root)/,,$(src_base)) - -$(install): - $(call install-data,$(src_base)/README,$(install_doc_dir)/xsd/$(path)/README) - $(call install-data,$(src_base)/xsdbin.cxx,$(install_doc_dir)/xsd/$(path)/xsdbin.cxx) - $(call install-data,$(src_base)/driver.cxx,$(install_doc_dir)/xsd/$(path)/driver.cxx) - $(call install-data,$(src_base)/grammar-input-stream.hxx,$(install_doc_dir)/xsd/$(path)/grammar-input-stream.hxx) - $(call install-data,$(src_base)/grammar-input-stream.cxx,$(install_doc_dir)/xsd/$(path)/grammar-input-stream.cxx) - $(call install-data,$(src_base)/library.xsd,$(install_doc_dir)/xsd/$(path)/library.xsd) - $(call install-data,$(src_base)/library.xml,$(install_doc_dir)/xsd/$(path)/library.xml) - -$(dist-common): - $(call install-data,$(src_base)/xsdbin.cxx,$(dist_prefix)/$(path)/xsdbin.cxx) - $(call install-data,$(src_base)/driver.cxx,$(dist_prefix)/$(path)/driver.cxx) - $(call install-data,$(src_base)/grammar-input-stream.hxx,$(dist_prefix)/$(path)/grammar-input-stream.hxx) - $(call install-data,$(src_base)/grammar-input-stream.cxx,$(dist_prefix)/$(path)/grammar-input-stream.cxx) - $(call install-data,$(src_base)/library.xsd,$(dist_prefix)/$(path)/library.xsd) - $(call install-data,$(src_base)/library.xml,$(dist_prefix)/$(path)/library.xml) - -$(dist): $(dist-common) - $(call install-data,$(src_base)/README,$(dist_prefix)/$(path)/README) - -$(dist-win): |$(out_root)/.dist-pre -$(dist-win): $(dist-common) - $(call install-data,$(src_base)/README,$(dist_prefix)/$(path)/README.txt) - $(call message,,todos $(dist_prefix)/$(path)/README.txt) - # Note: solution files are not automatically generated. - -# Clean. -# -$(clean): files := $(out_base)/$(xsd:.xsd=-schema.?xx) -$(clean): $(driver).o.clean $(xsdbin).o.clean \ - $(addsuffix .cxx.clean,$(obj)) \ - $(addsuffix .cxx.clean,$(obj2)) \ - $(addsuffix .cxx.clean,$(dep)) \ - $(addprefix $(out_base)/,$(xsd:.xsd=.cxx.xsd.clean)) - $(call message,rm '$(out_base)/*-schema.?xx',rm -f $(files)) - -# Generated .gitignore. -# -ifeq ($(out_base),$(src_base)) -$(gen): | $(out_base)/.gitignore -$(driver): | $(out_base)/.gitignore - -$(out_base)/.gitignore: files := driver xsdbin $(genf) -$(clean): $(out_base)/.gitignore.clean - -$(call include,$(bld_root)/git/gitignore.make) -endif - -# How to. -# -$(call include,$(bld_root)/cxx/o-e.make) -$(call include,$(bld_root)/cxx/cxx-o.make) -$(call include,$(bld_root)/cxx/cxx-d.make) -$(call include,$(scf_root)/xsd/tree/xsd-cxx.make) - -$(call include,$(bld_root)/install.make) - -# Dependencies. -# -$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/examples/cxx/tree/embedded/xsdbin.cxx b/xsd/examples/cxx/tree/embedded/xsdbin.cxx deleted file mode 100644 index 656b830..0000000 --- a/xsd/examples/cxx/tree/embedded/xsdbin.cxx +++ /dev/null @@ -1,494 +0,0 @@ -// file : examples/cxx/tree/embedded/xsdbin.cxx -// copyright : not copyrighted - public domain - -// This program loads the XML Schema file(s) and converts them to -// the Xerces-C++ binary schema format which can then be embedded -// into C++ programs and used to validate XML documents. The output -// is written as a C++ source file containing the array with the -// binary data. -// - -#include <string> -#include <memory> // std::auto_ptr -#include <cstddef> // std::size_t -#include <fstream> -#include <iostream> - -#include <xercesc/util/XMLUni.hpp> -#include <xercesc/util/XMLString.hpp> -#include <xercesc/util/PlatformUtils.hpp> -#include <xercesc/util/XercesVersion.hpp> - -#include <xercesc/internal/BinMemOutputStream.hpp> -#include <xercesc/validators/common/Grammar.hpp> - -#include <xercesc/sax/ErrorHandler.hpp> -#include <xercesc/sax/SAXParseException.hpp> -#include <xercesc/sax2/SAX2XMLReader.hpp> -#include <xercesc/sax2/XMLReaderFactory.hpp> - -#include <xercesc/framework/XMLGrammarPoolImpl.hpp> - -using namespace std; -using namespace xercesc; - -class error_handler: public ErrorHandler -{ -public: - error_handler () - : failed_ (false) - { - } - - bool - failed () const - { - return failed_; - } - - enum severity {s_warning, s_error, s_fatal}; - - virtual void - warning (const SAXParseException&); - - virtual void - error (const SAXParseException&); - - virtual void - fatalError (const SAXParseException&); - - virtual void - resetErrors () - { - failed_ = false; - } - - void - handle (const SAXParseException&, severity); - -private: - bool failed_; -}; - -void -cxx_escape (string&); - -int -main (int argc, char* argv[]) -{ - const char* hxx_suffix = "-schema.hxx"; - const char* cxx_suffix = "-schema.cxx"; - - string name; - string base; - string outdir; - - struct usage - { - usage (bool e = true): error (e) {} - bool error; - }; - - int argi (1); - bool multi_import (true); - bool verbose (false); - - try - { - for (; argi < argc; ++argi) - { - string a (argv[argi]); - - if (a == "--help") - throw usage (false); - else if (a == "--verbose") - { - verbose = true; - } - else if (a == "--hxx-suffix") - { - if (++argi >= argc) - throw usage (); - - hxx_suffix = argv[argi]; - } - else if (a == "--cxx-suffix") - { - if (++argi >= argc) - throw usage (); - - cxx_suffix = argv[argi]; - } - else if (a == "--output-dir") - { - if (++argi >= argc) - throw usage (); - - outdir = argv[argi]; - } - else if (a == "--array-name") - { - if (++argi >= argc) - throw usage (); - - name = argv[argi]; - } - else if (a == "--disable-multi-import") - { - multi_import = false; - } - else - break; - } - - if (argi >= argc) - { - cerr << "no input file specified" << endl; - throw usage (); - } - - base = argv[argi]; - } - catch (usage const& e) - { - ostream& o (e.error ? cerr : cout); - - o << "Usage: " << argv[0] << " [options] <files>" << endl - << "Options:" << endl - << " --help Print usage information and exit." << endl - << " --verbose Print progress information." << endl - << " --output-dir <dir> Write generated files to <dir>." << endl - << " --hxx-suffix <sfx> Header file suffix instead of '-schema.hxx'." << endl - << " --cxx-suffix <sfx> Source file suffix instead of '-schema.cxx'." << endl - << " --array-name <name> Binary data array name." << endl - << " --disable-multi-import Disable multiple import support." << endl - << endl; - - return e.error ? 0 : 1; - } - - XMLPlatformUtils::Initialize (); - - { - MemoryManager* mm (XMLPlatformUtils::fgMemoryManager); - - auto_ptr<XMLGrammarPool> gp (new XMLGrammarPoolImpl (mm)); - - // Load the schemas into grammar pool. - // - { - auto_ptr<SAX2XMLReader> parser ( - XMLReaderFactory::createXMLReader (mm, gp.get ())); - - parser->setFeature (XMLUni::fgSAX2CoreNameSpaces, true); - parser->setFeature (XMLUni::fgSAX2CoreNameSpacePrefixes, true); - parser->setFeature (XMLUni::fgSAX2CoreValidation, true); - parser->setFeature (XMLUni::fgXercesSchema, true); - parser->setFeature (XMLUni::fgXercesSchemaFullChecking, true); - parser->setFeature (XMLUni::fgXercesValidationErrorAsFatal, true); - - // Xerces-C++ 3.1.0 is the first version with working multi import - // support. - // -#if _XERCES_VERSION >= 30100 - parser->setFeature (XMLUni::fgXercesHandleMultipleImports, multi_import); -#endif - - error_handler eh; - parser->setErrorHandler (&eh); - - for (; argi < argc; ++argi) - { - if (verbose) - cerr << "loading " << argv[argi] << endl; - - if (!parser->loadGrammar (argv[argi], Grammar::SchemaGrammarType, true)) - { - cerr << argv[argi] << ": error: unable to load" << endl; - return 1; - } - - if (eh.failed ()) - return 1; - } - } - - // Get the binary representation. - // - BinMemOutputStream data; - - try - { - gp->serializeGrammars (&data); - } - catch (const XSerializationException& e) - { - char* msg (XMLString::transcode (e.getMessage ())); - cerr << "error: " << msg << endl; - XMLString::release (&msg); - return 1; - } - - size_t n (static_cast<size_t> (data.curPos ())); - const unsigned char* buf ( - static_cast<const unsigned char*> (data.getRawBuffer ())); - - if (verbose) - cerr << "uncomressed data size " << n << " bytes" << endl; - - // Compress zeros. - // - size_t cn (0); - unsigned char* cbuf = new unsigned char[n]; - - size_t cseq (0); // Number of bytes left in a compression sequence. - bool alt (false); // Alternating or sequential sequence. - - for (size_t i (0); i < n;) - { - unsigned char v (buf[i++]); - - // See if we are in a compression sequence. - // - if (cseq != 0) - { - // See if this byte needs to be copied. - // - if (alt && cseq % 2 == 0) - cbuf[cn++] = v; - - cseq--; - continue; - } - - // If we are not in a compression sequence and this byte is - // not zero then simply copy it. - // - if (v != 0) - { - cbuf[cn++] = v; - continue; - } - - // We have a zero. - // - cbuf[cn++] = 0; - - // See if we can start a new compression sequence. - // - if (i < n) - { - if (buf[i] == 0) - { - // Sequential sequence. See how far it runs. - // - alt = false; - - for (cseq = 1; cseq < 127 && cseq + i < n; cseq++) - if (buf[cseq + i] != 0) - break; - } - else if (i + 1 < n && buf[i + 1] == 0) - { - // Alternating sequence. See how far it runs. - // - alt = true; - - for (cseq = 1; cseq < 127 && cseq * 2 + i + 1 < n; cseq++) - { - if (buf[cseq * 2 + i + 1] != 0) - break; - - // For longer sequences prefer sequential to alternating. - // - if (cseq > 2 && - buf[cseq * 2 + i] == 0 && - buf[(cseq - 1) * 2 + i] == 0 && - buf[(cseq - 2) * 2 + i] == 0) - { - cseq -= 2; - break; - } - } - - cseq *= 2; - } - } - - if (cseq != 0) - { - cbuf[cn++] = static_cast<unsigned char> ( - alt ? (128 | cseq / 2) : cseq); - } - else - cbuf[cn++] = 0; - } - - if (verbose) - cerr << "comressed data size " << cn << " bytes" << endl; - - buf = cbuf; - n = cn; - - // Figure out the file names. - // - string::size_type p (base.rfind ('/')), p1 (base.rfind ('\\')); - - if (p1 != string::npos && p1 > p) - p = p1; - - if (p != string::npos) - base = string (base, p + 1); - - p = base.rfind ('.'); - - if (p != string::npos) - base.resize (p); - - string hxx (base + hxx_suffix); - string cxx (base + cxx_suffix); - - if (!outdir.empty ()) - { -#if defined (WIN32) || defined (__WIN32__) - hxx = outdir + '\\' + hxx; - cxx = outdir + '\\' + cxx; -#else - hxx = outdir + '/' + hxx; - cxx = outdir + '/' + cxx; -#endif - } - - if (name.empty ()) - { - name = base + "_schema"; - cxx_escape (name); - } - - // Write header. - // - { - ofstream os (hxx.c_str ()); - - if (!os.is_open ()) - { - cerr << hxx << ": error: unable to open" << endl; - return 1; - } - - os << "// Automatically generated. Do not edit." << endl - << "//" << endl - << endl - << "#include <xercesc/util/XercesDefs.hpp>" << endl - << endl - << "extern const XMLByte " << name << "[" << n << "UL];" << endl; - } - - { - ofstream os (cxx.c_str ()); - - if (!os.is_open ()) - { - cerr << cxx << ": error: unable to open" << endl; - return 1; - } - - os << "// Automatically generated. Do not edit." << endl - << "//" << endl - << endl - << "#include <xercesc/util/XercesDefs.hpp>" << endl - << "#include <xercesc/util/XercesVersion.hpp>" << endl - << endl - << "#if XERCES_GRAMMAR_SERIALIZATION_LEVEL != " << - XERCES_GRAMMAR_SERIALIZATION_LEVEL << endl - << "# error incompatible Xerces-C++ version detected" << endl - << "#endif" << endl - << endl - << "extern const XMLByte " << name << "[" << n << "UL] =" << endl - << "{"; - - for (size_t i (0); i < n; ++i) - { - if (i != 0) - os << ','; - - os << (i % 12 == 0 ? "\n " : " ") << "0x"; - os.width (2); - os.fill ('0'); - os << hex << static_cast<unsigned short> (buf[i]); - } - - os << endl - << "};" << endl - << endl; - } - - delete[] cbuf; - } - - XMLPlatformUtils::Terminate (); -} - -void -cxx_escape (string& s) -{ - for (string::size_type i (0); i < s.size (); ++i) - { - char& c (s[i]); - - if (i == 0) - { - if (!((c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - c == '_')) - c = '_'; - } - else - { - if (!((c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - c == '_')) - c = '_'; - } - } -} - -void error_handler:: -warning (const SAXParseException& e) -{ - handle (e, s_warning); -} - -void error_handler:: -error (const SAXParseException& e) -{ - failed_ = true; - handle (e, s_error); -} - -void error_handler:: -fatalError (const SAXParseException& e) -{ - failed_ = true; - handle (e, s_fatal); -} - -void error_handler:: -handle (const SAXParseException& e, severity s) -{ - const XMLCh* xid (e.getPublicId ()); - - if (xid == 0) - xid = e.getSystemId (); - - char* id (XMLString::transcode (xid)); - char* msg (XMLString::transcode (e.getMessage ())); - - cerr << id << ":" - << e.getLineNumber () << ":" << e.getColumnNumber () << " " - << (s == s_warning ? "warning: " : "error: ") << msg << endl; - - XMLString::release (&id); - XMLString::release (&msg); -} |