summaryrefslogtreecommitdiff
path: root/xsd
diff options
context:
space:
mode:
Diffstat (limited to 'xsd')
-rw-r--r--xsd/.gitignore6
-rw-r--r--xsd/INSTALL6
l---------[-rw-r--r--]xsd/NEWS1221
l---------xsd/PACKAGE-README.md1
-rw-r--r--xsd/README29
-rw-r--r--xsd/README.md12
-rw-r--r--xsd/buildfile10
-rw-r--r--xsd/doc/buildfile40
-rw-r--r--xsd/doc/cxx/parser/guide/index.xhtml.in19
-rw-r--r--xsd/doc/cxx/tree/guide/index.xhtml.in14
-rw-r--r--xsd/doc/cxx/tree/manual/index.xhtml.in6
-rw-r--r--xsd/doc/pregenerated/xsd.148
-rw-r--r--xsd/doc/pregenerated/xsd.xhtml64
-rw-r--r--xsd/doc/xsd-epilogue.117
-rw-r--r--xsd/doc/xsd-epilogue.xhtml14
-rw-r--r--xsd/doc/xsd-prologue.xhtml5
-rw-r--r--xsd/manifest157
-rw-r--r--xsd/xsd/cxx/elements.cxx45
-rw-r--r--xsd/xsd/cxx/option-types.cxx14
-rw-r--r--xsd/xsd/cxx/option-types.hxx8
-rw-r--r--xsd/xsd/cxx/options.cli22
-rw-r--r--xsd/xsd/cxx/parser/generator.cxx200
-rw-r--r--xsd/xsd/cxx/tree/generator.cxx156
-rw-r--r--xsd/xsd/options.cli15
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/options.cxx64
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/options.hxx8
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/options.ixx12
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx50
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx50
-rw-r--r--xsd/xsd/pregenerated/xsd/options.cxx85
-rw-r--r--xsd/xsd/pregenerated/xsd/options.hxx30
-rw-r--r--xsd/xsd/pregenerated/xsd/options.ixx6
-rw-r--r--xsd/xsd/xsd.cxx35
33 files changed, 911 insertions, 1558 deletions
diff --git a/xsd/.gitignore b/xsd/.gitignore
index cece09c..1c363a0 100644
--- a/xsd/.gitignore
+++ b/xsd/.gitignore
@@ -3,10 +3,16 @@
*.d
*.t
*.i
+*.i.*
*.ii
+*.ii.*
*.o
*.obj
+*.gcm
+*.pcm
+*.ifc
*.so
+*.dylib
*.dll
*.a
*.lib
diff --git a/xsd/INSTALL b/xsd/INSTALL
deleted file mode 100644
index 3402df2..0000000
--- a/xsd/INSTALL
+++ /dev/null
@@ -1,6 +0,0 @@
-The easiest way to build this package is with the bpkg package manager:
-
-$ bpkg build xsd
-
-But if you don't want to use the package manager, then you can also build it
-manually using the standard build2 build system.
diff --git a/xsd/NEWS b/xsd/NEWS
index 9e33814..0fae0f8 100644..120000
--- a/xsd/NEWS
+++ b/xsd/NEWS
@@ -1,1220 +1 @@
-Version 4.1.0
-
-C++/Tree
-
- * Support for abstract XML Schema types. The corresponding C++ classes
- now have _clone() declared pure virtual which prevents construction
- of their instances.
-
-Version 4.0.0
-
- * Xerces-C++ 2-series (2.8.0 and earlier) is no longer supported.
-
- * Visual Studio 2003 (7.1) is no longer supported.
-
- * HP aCC3 (HP-UX/PA-RISC) is no longer supported.
-
- * Oracle/Berkeley DB XML support has been removed since it no longer
- supports the Xerces-C++-based document access.
-
- * New option, --std, specifies the C++ standard that the generated code
- should conform to. Valid values are c++98 (default) and c++11.
-
- The C++ standard affects various aspects of the generated code that are
- discussed in more detail in mapping-specific documentation (guides and
- manuals). Overall, when C++11 is selected, the generated code relies on
- the move semantics and uses std::unique_ptr instead of deprecated
- std::auto_ptr. See also the documentation for the --std option in the
- XSD compiler command line manual (man pages).
-
- * New option, --fat-type-file, triggers the placement of code corresponding
- to global elements into type files instead of schema files in the file-
- per-type mode. This option is primarily useful when trying to minimize
- the amount of object code that is linked to an executable by packaging
- compiled generated code into a static (archive) library.
-
-C++/Tree
-
- * Support for ordered types. C++/Tree flattens nested compositors which
- sometimes can result in the loss of element ordering information that
- could be significant to the application. Ordered types address this
- problem. For more information, refer to Section 2.8.4, "Element Order"
- in the C++/Tree Mapping User Manual.
-
- * Support for mixed content in ordered types. For more information, refer
- to Section 2.13, "Mapping for Mixed Content Models" in the C++/Tree
- Mapping User Manual.
-
- * xml_schema::type represents anyType content as a DOM fragment, similar
- to wildcards. For more information, refer to Section 2.5.2, "Mapping
- for anyType" in the C++/Tree Mapping User Manual.
-
- * xml_schema::simple_type represents anySimpleType content as a text
- string. For more information, refer to Section 2.5.3, "Mapping for
- anySimpleType" in the C++/Tree Mapping User Manual.
-
- * Improved streaming example that now provides better XML namespace
- handling and supports streaming parsing and serialization at multiple
- document levels.
-
- * New option, --generate-dep, triggers the generation of the make
- dependency files (.d) for the generated C++ files. Other options
- controlling dependency generation are: --generate-dep-only,
- --dep-phony, --dep-target, --dep-suffix, and --dep-regex. For
- details on this functionality, refer to the XSD compiler command
- line manual (man pages).
-
- * New option, --suppress-assignment, suppresses the generation of copy
- assignment operators for complex types. If this option is specified,
- the copy assignment operators for such types are declared private and
- left unimplemented.
-
- * Binary representation now stores string-based enumerations as integer
- values corresponding to C++ enumerators instead of string literals.
-
- * Binary representation now pools polymorphic type-id strings in an
- implicit string pool. The string pool support can also be used to
- pool strings in other situations. For example, you can implement
- string insertion/extraction operators for your stream to pool all
- strings. This can be useful if your documents contain a large number
- of repetitive strings.
-
- * New option, --polymorphic-plate, allows the creation of multiple
- polymorphic map plates in the same application. For details, refer
- to the XSD compiler command line manual (man pages).
-
- * To get the DOM association in the copy of an object model tree one
- now needs to explicitly pass the xml_schema::flags::keep_dom flag as
- the second argument to the copy constructor or clone() function.
-
-Version 3.3.0
-
- * New option, --char-encoding, allows you to specify the character encoding
- that should be used in the generated code. Valid values for the 'char'
- character type are 'utf8' (default), 'iso8859-1' (new), 'lcp' (Xerces-C++
- local code page), and 'custom' (provides support for custom encodings).
- Note that if you use a non-default character encoding and include some
- libxsd headers (e.g., xsd/cxx/xml/string.hxx) directly, then you will
- need to first include the correct xsd/cxx/xml/char-<enc>.hxx header,
- where <enc> is iso8859-1, lcp, etc. This mechanism replaces the
- XSD_USE_LCP macro.
-
- For the wchar_t character type the only valid value for this option is
- 'auto' and the encoding is automatically selected between UTF-16 and
- UTF-32, depending on the wchar_t type size.
-
- * When the XSD compiler is built with Xerces-C++ 3.1.0 or later, the
- handling of multiple imports for the same namespace is enabled. Before,
- all subsequent imports for a namespace were ignored which caused errors
- in some schemas. Note that if your application has XML Schema validation
- enabled, then you will also need to build it with Xerces-C++ 3.1.0 or
- later to take advantage of this feature.
-
- * Automatic mapping for the urn-style XML namespaces. The last component
- in the urn name is used to derive the C++ namespace name.
-
- * New option, --schema-file-regex, in combination with the existing
- --type-file-regex, can be used to place the generated files into
- subdirectories or to resolve file name conflicts in the file-per-
- type mode (--file-per-type).
-
- * Warning id's have changed to start with a letter identifying the
- component issuing the warning. F - compiler frontend, D - compiler
- driver, P - C++/Parser mapping, T - C++/Tree mapping.
-
- * Strings used to match regular expressions supplied with the
- --namespace-regex and --anonymous-regex options now include the file
- component for the schema being compiled.
-
- * The XSD_NO_EXPORT macro can be used to omit code generated with the
- --export/import-maps and, for C++/Tree, --generate-xml-schema options
- during C++ compilation. This may be useful if you would like to use
- the same generated code across multiple platforms.
-
- C++/Tree
-
- * New option, --generate-element-type, triggers the generation of types
- instead of parsing/serialization functions for root elements. This
- is primarily useful to distinguish object models with the same root
- type but with different root elements. For more information, refer
- to the messaging example and Section 2.9.1, "Element Types" in the
- C++/Tree Mapping User Manual. To support the customization of the
- element type naming the --element-type-regex option has been added.
- See the NAMING CONVENTION section in the compiler command line manual
- (man pages) for details.
-
- * New option, --generate-element-map, triggers the generation of a root
- element map. The element map allows uniform parsing and serialization
- of multiple root elements. This option can only be used together with
- --generate-element-type. For more information, refer to the messaging
- example and Section 2.9.2, "Element Map" in the C++/Tree Mapping
- User Manual.
-
- * Prior to this version, if the --generate-polymorphic option is
- specified, the compiler treats all types as potentially polymorphic.
- Now by default only type hierarchies used in substitution groups and
- those explicitly declared polymorphic with the new --polymorphic-type
- option are treated as polymorphic. This results in smaller and faster
- generated code. If you would like to continue using the old behavior,
- you will need to specify --polymorphic-type-all. For more information,
- on this change see Section 2.11, "Mapping for xsi:type and Substitution
- Groups" in the C++/Tree Mapping User Manual.
-
- * New option, --generate-detach, triggers the generation of detach
- functions for required elements and attributes. For optional and
- sequence cardinalities the detach functions are now provided by the
- respective containers even without this option. These functions, for
- example, allow one to move sub-trees in the object model either within
- the same tree or between different trees without copying. For more
- information, refer to Section 2.8 "Mapping for Local Elements and
- Attributes" in the C++/Tree Mapping User Manual.
-
- * New option, --export-xml-schema, causes the compiler to export/import
- types in the XML Schema namespace using the export symbol provided
- with the --export-symbol option.
-
- * New example, embedded, shows how to embed the binary representation of
- the schema grammar into an application and then use it to parse and
- validate XML documents.
-
- * New example, compression, shows how to compress an XML document during
- serialization and decompress it during parsing using the zlib library.
-
- * New example, custom/mixed, shows how to use type customization to parse
- and serialize mixed content.
-
- * The streaming example has been extended to show how to perform stream-
- oriented, partially in-memory XML processing using the C++/Tree mapping.
- With the partially in-memory parsing and serialization only a part of
- the object model is in memory at any given time. With this approach one
- can process parts of the document as they become available as well as
- handle documents that are too large to fit into memory.
-
- * New default/fixed value initialization code. Now the default/fixed values
- are parsed by the XSD compiler at compile time instead of the standard
- parsing code at runtime. This will allow the compilation of schemas that
- use the default/fixed values without support for XML parsing
- (--suppress-parsing option).
-
- * Empty XML Schema enumeration values are now mapped to the 'empty' C++
- enumerator name instead of 'cxx'.
-
- * XML Schema union types with members that are enumeration types are
- automatically converted to equivalent enumeration types with a union
- of all the members' enumerators.
-
-Version 3.2.0
-
- * New option, --disable-warning, disables printing of a warning with
- the specified id. Specifying 'all' for the warning id disables all
- warnings.
-
- * New options, --export-maps and --import-maps, provide support for
- splitting a polymorphic type hierarchy across several Win32 DLLs.
- See the compiler command line manual (man pages) for details.
-
- C++/Tree
-
- * During serialization the generated code automatically assigns
- generic prefixes (p1, p2, etc) to XML namespaces used in the
- vocabulary and for which no custom prefix-namespace mapping
- was provided via the xml_schema::namespace_infomap argument.
- The xml_schema::namespace_infomap argument in the serialization
- functions is now default-initialized to an empty map. The
- xml_schema::no_namespace_mapping and xml_schema::xsi_already_in_use
- exceptions have been removed.
-
- * New example, performance, measures the performance of parsing and
- serialization. This example also shows how to structure your code
- to achieve the maximum performance for these two operations.
-
- * New example, xpath, shows how to use the C++/Tree mapping together
- with XPath.
-
- * New options, --one-accessor-regex, --opt-accessor-regex,
- --seq-accessor-regex, --one-modifier-regex, --opt-modifier-regex,
- and --seq-modifier-regex, allow specification of transformations
- for accessor and modifier function names for elements and attributes
- with specific cardinalities. For more information see the NAMING
- CONVENTION section in the compiler command line manual (man pages).
-
- * Support for comparison (--generate-comparison) and printing
- (--generate-ostream) of polymorphic object models.
-
- * New serialization flag, xml_schema::flags::dont_pretty_print,
- disables extra spaces and new lines that make the resulting XML
- slightly bigger but easier to read.
-
- * New example, custom/double, shows how to customize parsing and
- serialization code for the xsd:double XML Schema built-in type.
- It can be used as a guide on how to customize built-in XML Schema
- types that are mapped to fundamental C++ types.
-
- * Support for fractionDigits and totalDigits facets in serialization
- of types derived from xsd:decimal.
-
- * New set of compile-time macros that control how the xsd:float,
- xsd:double, and xsd:decimal types are serialized. The following
- macros control the format:
-
- XSD_CXX_TREE_FLOAT_FIXED
- XSD_CXX_TREE_FLOAT_SCIENTIFIC
- XSD_CXX_TREE_DOUBLE_FIXED
- XSD_CXX_TREE_DOUBLE_SCIENTIFIC
-
- The following macros control the precision:
-
- XSD_CXX_TREE_FLOAT_PRECISION_MAX
- XSD_CXX_TREE_FLOAT_PRECISION
- XSD_CXX_TREE_DOUBLE_PRECISION_MAX
- XSD_CXX_TREE_DOUBLE_PRECISION
- XSD_CXX_TREE_DECIMAL_PRECISION_MAX
- XSD_CXX_TREE_DECIMAL_PRECISION
-
- If the *_PRECISION_MAX macro is defined then the maximum number of
- potentially significant decimal digits that the type can represent
- is used. Otherwise, if the *_PRECISION macro is defined then its
- value is used. By default the precision is set to the number of
- decimal digits that the type can represent without change. For
- more information on these options, refer to the following paper:
-
- http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1822.pdf
-
- The old macro, XSD_FP_ALL_DIGITS, that was equivalent to defining
- all three *_PRECISION_MAX macros has been removed.
-
- An alternative to using these macros is to customize the floating
- point type as shown in the custom/double example.
-
- * An additional constructor is generated in situations where a type
- contains one or more required element of complex type (that is,
- it itself contains elements or attributes). In this constructor,
- initializers for such elements are passed as std::auto_ptr and the
- newly created instance is directly initialized with and assumes
- ownership of the pointed to objects. This constructor is a logical
- addition to the non-copying modifiers that were introduced in the
- previous version.
-
- * Extra conversion operators in the fundamental_base class template
- which is used to emulate inheritance from fundamental types are now
- disabled by default since they cause problems on several compilers.
- To enable them compile your code with the XSD_TREE_EXTRA_FUND_CONV
- macro defined.
-
- C++/Parser
-
- * New options, --generate-xml-schema and --extern-xml-schema, trigger
- generation of the mapping for the XML Schema namespace to a separate
- header file and inclusion of that header into other generated header
- files instead of generating the necessary declarations inline,
- respectively. See the compiler command line manual (man pages) for
- details.
-
- * New example, performance, measures the performance of XML parsing.
- This example also shows how to structure your code to achieve the
- maximum performance for this operation.
-
- * Type map files can now include comments. A comment starts with #
- and ends with a new line or end of file. To specify a name that
- contains # enclose it in "".
-
- * In type map files the optional argument type now defaults to the
- return type if the return type ends with * or & (that is, it is
- a pointer or a reference) and 'const return type&' otherwise.
-
- * The interface for polymorphic parsing has been simplified. Calling the
- *_parser() functions multiple times to specify several parsers is no
- longer supported. Instead you need to pass the xml_schema::parser_map
- object which contains the parsers. For more information refer to
- Section 5.4, "Support for Polymorphism" in the C++/Parser Mapping
- Getting Started Guide.
-
- * The use of virtual inheritance has been reduced which results in a
- much smaller object code size (more than factor of 2 on some tests)
- and faster C++ compilation with less RAM used.
-
- * The low-level Expat-specific parsing API (parse_begin() and parse_end())
- has been extended to provide XML and XML Schema error translation to
- exceptions or error handler calls. See Section 7.2, "Expat Document
- Parser" in the C++/Parser Mapping Getting Started Guide for more
- information.
-
-Version 3.1.0
-
- * New option, --file-per-type, triggers generation of a separate set
- of C++ files for each type defined in XML Schema. This compilation
- mode is primarily useful when some of your schemas cannot be compiled
- separately or have cyclic dependencies which involve inheritance.
- Other new options that are useful in this compilation mode are
- --type-file-regex, --type-file-regex-trace, and --file-list. See the
- compiler command line manual (man pages) for more information.
-
- * New option, --options-file, allows additional command line options
- to be provided in files, with one option per line.
-
- * New option, --reserved-name, allows insertion of additional names
- with optional replacements to the list of names that should not be
- used as identifiers. See the compiler command line manual (man pages)
- for details.
-
- * New options, --location-map, --location-regex, and
- --location-regex-trace, allow re-mapping of schema locations
- specified in the include and import elements without modifying the
- schema files. See the compiler command line manual (man pages) for
- more information.
-
- * New option, --guard-prefix, allows specification of a prefix that
- should be added to generated header inclusion guards.
-
- * New option, --file-list, triggers creation of a file with a list of
- generated C++ files. This option is primarily useful in the file-per-
- type compilation mode (--file-per-type) to create a list of generated
- C++ files, for example, as a makefile fragment. Other new options
- that are useful with --file-list are --file-list-prologue,
- --file-list-epilogue, and --file-list-delim. See the compiler command
- line manual (man pages) for more information.
-
- * Support for the upcoming Xerces-C++ 3.0.0 release.
-
- C++/Tree
-
- * New option, --generate-intellisense, triggers generation of workarounds
- for IntelliSense bugs in Visual Studio 2005 (8.0). When this option is
- used, the resulting code is slightly more verbose. IntelliSense in
- Visual Studio 2008 (9.0) does not require these workarounds. Support
- for IntelliSense in Visual Studio 2003 (7.1) is improved with this
- option but is still incomplete.
-
- * New options, --type-naming and --function-naming, allow specification
- of the type and function naming conventions that should be used in the
- generated code. Supported values for --type-naming are: knr (K&R), ucc
- (upper-camel-case), and java. Supported values for --function-naming
- are: knr (K&R), lcc (lower-camel-case), and java. For more information
- see the NAMING CONVENTION section in the compiler command line manual
- (man pages).
-
- * New options, --type-regex, --accessor-regex, --modifier-regex,
- --parser-regex, --serializer-regex, and --enumerator-regex, allow
- specification of transformations for type, accessor function,
- modifier function, parsing function, serialization function, and
- enumerator names in order to produce the generated code using a
- custom naming convention. For more information see the NAMING
- CONVENTION section in the compiler command line manual (man pages).
-
- * Generated list classes now provide a complete set of constructors and
- conform to the standard C++ sequence interface.
-
- * String-based types now provide two extra constructors that expect a
- C string and std::string as their arguments. This allows direct
- initialization of string-based types from string literals.
-
- * New implementations of the XML Schema date/time types (date, dateTime,
- duration, gDay, gMonth, gMonthDay, gYear, gYearMonth, and time) that
- represent the information in the numerical form.
-
- * New binary serialization examples: binary/boost, which shows how to
- save/load the object model to/from a custom format using the Boost
- serialization library as an example, and binary/xdr, which shows how to
- save/load the object model to/from XDR (eXternal Data Representation)
- binary format using the XDR API provided as part of Sun RPC.
-
- * The non-copying modifier functions can now be used to assemble object
- models from scratch. For more information see Section 4.4, "Creating
- the Object Model from Scratch" in the C++/Tree Mapping Getting Started
- Guide as well as Section 2.8, "Mapping for Local Elements and Attributes"
- in the C++/Tree Mapping User Manual.
-
- * Doxygen documentation was added to the XSD runtime for the built-in XML
- Schema types, exceptions, etc. This allows linking of the generated
- documentation to the XSD runtime documentation using the Doxygen tags
- mechanism. The Doxygen configuration file for the XSD runtime is
- provided in the documentation/cxx/tree/reference/ directory.
-
- * Support for customization of anyType. Because anyType is a base type
- for every generated type, customizing it allows one to implement custom
- functionality that spans the entire type system. See the comments
- example in the examples/cxx/tree/custom/ directory.
-
- * New option, --omit-default-attributes, triggers generation of extra
- checks that exclude attributes with default and fixed values from the
- serialized XML documents.
-
- * The parsing functions that used to read from DOMInputSource were changed
- to use InputSource to ease support of Xerces-C++ 3 and 2 series in the
- same code base.
-
- * The parsing function that used to parse DOMDocument* was changed to
- parse xml_schema::dom::auto_ptr<DOMDocument>& instead. If the keep_dom
- and own_dom flags are specified then this parsing function resets the
- passed automatic pointer and the returned object model assumes
- ownership of the DOM document. xml_schema::dom::auto_ptr is a simple
- automatic pointer for Xerces-C++ DOM with the same interface as
- std::auto_ptr.
-
- * The xml_schema::tree_node_key DOM user data key was moved to
- xml_schema::dom::tree_node_key.
-
- C++/Parser
-
- * New option, --generate-polymorphic, triggers generation of polymorphism-
- aware code. This option should be used on XML vocabularies which use
- xsi:type and/or substitution groups. For more information see Section
- 5.4, "Support for Polymorphism" in the C++/Parser Mapping Getting
- Started Guide we well as the polymorphism and polyroot examples in the
- examples/cxx/parser/ directory.
-
- * The date/time types (date, dateTime, gDay, gMonth, gMonthDay, gYear,
- gYearMonth, and time) now represent time zone in the numerical form.
-
- * In order to support parsing of polymorphic XML documents, the signatures
- of the start_* functions (_start_element, _start_any_element, and
- start_root_element) have changed to include a third argument of type
- const ro_string<C>*. This argument contains the resolved type name and
- namespace in case the xsi:type attribute was specified.
-
-Version 3.0.0
-
- * Anonymous type morphing (automatic type naming) is now performed by
- default in both mappings. The --morph-anonymous option does not have
- any effect but is preserved for backwards compatibility. A new option,
- --preserve-anonymous, disables anonymous type morphing. This option is
- useful together with --show-anonymous if you want to make sure your
- schemas do not have any anonymous types.
-
- * A number of bugs fixed in both C++/Tree and C++/Parser mappings.
-
- C++/Tree
-
- * The new C++/Tree Mapping Getting Started Guide is available in the
- documentation/cxx/tree/guide/ directory.
-
- * The type definitions for local elements and attributes in the form
- name::type have been changed to name_type. For example, an element
- bar in type foo with maxOccurs="unbounded" used to have its iterator
- type defined as foo::bar::iterator. With this change it becomes
- foo::bar_iterator. Furthermore, the container type name for sequence
- elements has changed from foo::bar::container to foo::bar_sequence
- and for optional elements and attributes from foo::bar::container
- to foo::bar_optional. This is a backwards incompatible change and
- may require application code adjustments (the C++ compiler will
- pinpoint the affected places).
-
- * New option, --generate-doxygen, triggers generation of documentation
- comments suitable for extraction by the Doxygen documentation system.
- Documentation from annotations is added to the comments if present in
- the schema.
-
- * New option, --generate-wildcard, triggers generation of the new
- wildcard (any and anyAttribute) mapping. This mapping represents the
- content matched by wildcards as DOM fragments. For more information on
- the new mapping see Section 2.12, "Mapping for any and anyAttribute"
- in the C++/Tree Mapping User Manual as well as the wildcard example in
- the examples/cxx/tree/ directory.
-
- * New option, --generate-comparison, triggers generation of comparison
- operators (== and !=) for complex types. Comparison is performed
- memberwise.
-
- * Support for the RPC XDR binary stream in addition to ACE CDR.
-
- * New constructor is generated for complex types with ultimate bases
- that are simple types and can be default-initialized. This constructor
- includes initializers for all required members but omits the initializer
- for the base type. See Section 2.7, "Mapping for Complex Types" in the
- C++/Tree Mapping User Manual for more information.
-
- * Support for polymorphic binary serialization and extraction. Note that
- the semantics of the --generate-insertion and --generate-extraction
- options has changed. See the the compiler command line manual (man
- pages) for details.
-
- * New parsing function with the DOMDocument* argument and the own_dom
- flag allow the tree to assume the ownership of the DOM document
- being parsed when DOM association is requested (keep_dom flag).
- See the C++/Tree Mapping User Manual for more information.
-
- * New example, multiroot, shows how to handle XML vocabularies with
- multiple root elements.
-
- * New example, caching, shows how to parse several XML documents while
- reusing the underlying XML parser and caching the schemas used for
- validation.
-
- * The mapping of built-in XML Schema type decimal has changed from
- long double to double. The old mapping can be obtained by providing
- a custom mapping for this type.
-
- * The xml_schema::errors type which is used in the xml_schema::parsing
- and xml_schema::serialization exceptions has been renamed to
- xml_schema::diagnostics and extended to include warnings in addition
- to errors.
-
- * Serialization operators now clear the element being serialized to from
- existing child nodes and attributes (except for special attributes such
- as prefix-namespace mappings, etc.).
-
- * Improved built-in type parsing, including support for normalization and
- whitespace collapsing.
-
- * Optimizations for the generated code size and compilation time,
- including space optimizations for polymorphic parsing and
- serialization. Optimizations for XML parsing speed.
-
- C++/Parser
-
- * The C++/Parser mapping have been significantly redesigned. See the new
- Getting Started Guide in documentation/cxx/parser/guide/ for details.
-
- * The new C++/Parser Mapping Getting Started Guide is available in the
- documentation/cxx/parser/guide/ directory.
-
- * The mapping now provides parser implementations for all built-in XML
- Schema types. See Chapter 6, "Built-In XML Schema Type Parsers" in
- the C++/Parser Mapping Getting Started Guide for more information.
-
- * The mapping now supports automatic generation of sample parser
- implementations and a test driver. The --generate-noop-impl option
- triggers generation of a sample implementation with empty function
- bodies. The --generate-print-impl option triggers generation of a
- sample implementation that prints the data stored in XML to STDOUT.
- The --generate-test-driver option trigger generation of a test driver.
- For more information on this feature see the compiler command line
- manual (man pages) and the generated example in the examples/cxx/parser/
- directory. Other relevant options include: --force-overwrite,
- --root-element-first, --root-element-last, and --root-element.
-
- * New example, wildcard, shows how to parse the XML data matched by
- XML Schema wildcards (any and anyAttribute).
-
- * The xml_schema::document parser has been extended with overridable
- virtual functions start_root_element and end_root_element to support
- parsing of XML vocabularies with multiple document roots. See the
- multiroot example in the examples/cxx/parser/ directory for more
- information.
-
- * The xml_schema::errors type which is used in the xml_schema::parsing
- exception has been renamed to xml_schema::diagnostics and extended to
- include warnings in addition to errors.
-
-Version 2.3.1
-
- * The compiler is now capable of translating multiple schemas with
- one invocation.
-
- * New option, --sloc-limit, allows one to limit the amount of the
- generated code.
-
- * New option, --proprietary-license, instructs the compiler not to
- include the GPL banner in each generated file. Instead a short
- notice about a required proprietary license is generated. You
- should not use this option unless you have obtained a proprietary
- license from Code Synthesis Tools CC.
-
- * The default encoding for the 'char' character type is now UTF-8.
- To get the previous behavior (local code page via the Xerces-C++
- transcode functions) define the XSD_USE_LCP preprocessor macro
- when compiling your source code.
-
- C++/Tree
-
- * The --parts option has been improved to split generated code more
- evenly by analyzing the complexity of the generated schema constructs.
-
- * Ability to customize serialization, std::ostream, and binary
- insertion/extraction operators. See examples/cxx/tree/custom/wildcard
- for an example on how to handle XML Schema wildcards (xsd:any and
- xsd:anyAttribute) by customizing the parsing constructor and
- serialization operators.
-
- * Optimizations for the run-time memory consumption.
-
- * Optimizations for space in the generated code.
-
- * Number of bug fixes.
-
- C++/Parser
-
- * Proper handling of an xsd:any nested content. Nested elements,
- attributes, and text are reported via _any_* hooks of the current
- parser.
-
- * Number of bug fixes, mostly in the generated validation code.
-
-
-Version 2.3.0
-
- * Name conflicts across type inheritance hierarchies are now detected
- and resolved via name escaping.
-
- C++/Tree
-
- * New option, --suppress-parsing, suppresses generation of the parsing
- constructors and functions. This can be used to minimize the generated
- code footprint when parsing from XML is not used.
-
- * New option, --generate-forward, triggers generation of a forward
- declaration header file for types defined in the schema. A set of
- --fwd-* options that control the resulting file name as well as
- prologue and epilogue code are available.
-
- * New option, --generate-xml-schema, triggers generation of the mapping
- for the XML Schema namespace to a separate header file. See the man
- pages for details and examples/cxx/tree/custom/calendar for an example.
-
- * New option, --extern-xml-schema, triggers inclusion of a header
- file for the XML Schema namespace instead of generating the
- necessary declarations inline. See the man pages for details and
- examples/cxx/tree/custom/calendar for an example.
-
- * New options, --custom-type and --custom-type-regex, instruct the
- compiler to use custom C++ type for a type defined in the schema.
- The standard mapping can still be generated (with a different name)
- usually to be used as a base. Built-in XML Schema types can be
- customized using this mechanism. See the man pages for details and
- examples/cxx/tree/custom/* for examples.
-
- * The generated parsing constructors and serialization operators have
- been changed to use the Xerces-C++ DOM elements and attributes
- instead of the internal wrapper types. This should provide easier
- integration with other code and libraries that use the Xerces-C++
- DOM types such as Berkeley DB XML.
-
- * New example, examples/cxx/tree/dbxml, shows how to use the C++/Tree
- mapping on top of the Berkeley DB XML database.
-
- C++/Parser
-
- * Validation of the attribute structure in the generated code.
-
- * Validation of the character content models including mixed content in
- the generated code.
-
- * Validation of the built-in XML Schema types.
-
- * Optimizations for space and time in the generated code. In particular
- data coping during parsing and validation was significantly reduced.
-
-
-Version 2.2.0
-
- * Detection of a version mismatch between the generated code and
- the runtime.
-
- C++/Tree
-
- * Escaping of a global element name that conflicts with a global type
- name. This is a backwards-incompatible change. Previous versions
- map them to the same name.
-
- * New options, --generate--insertion and --generate-extraction,
- trigger generation of (binary) data representation stream
- insertion and extraction operators, respectively. This allows
- one to serialize/deserialize in-memory representation to/from
- data representation streams such as XSD, CDR, etc. ACE CDR
- streams are supported out of the box (see the binary example).
- User-supplied streams can be used via an adaptation layer.
-
- * New serialization flag, no_xml_declaration, instructs the XML
- serialization functions to omit an XML declaration. This is useful
- for streaming serialization (see the streaming example).
-
- * Optimizations to reduce generated code size.
-
-
- C++/Parser
-
- * New options, --generate-validation and --suppress-validation,
- trigger and suppress generation of the validation code,
- respectively. The validation code is the implementation of the
- XML Schema validation in the generated code (also known as
- "perfect" parser). In this version validation of the element
- structure has been implemented.
-
- * New architecture for underlying XML parsers. This is a backwards-
- incompatible change. Existing applications will have to be
- modified. See examples for details.
-
-
-Version 2.1.1
-
- C++/Tree
-
- * New option, --namespace-map, allows direct mapping of XML Schema
- namespaces to C++ namespaces without the use of regular expressions.
-
- * Further optimizations in the container code and enum mapping to
- reduce generated code size.
-
- * Number of bug fixes in the generated code.
-
-
- C++/Parser
-
- * New option, --namespace-map, allows direct mapping of XML Schema
- namespaces to C++ namespaces without the use of regular expressions.
-
-
-Version 2.1.0
-
- * Automatic handling of forward inheritance. XML Schema allows
- inheritance from yet undefined types while it is illegal to do
- so in C++. Now the translator automatically handles forward
- inheritance by re-arranging the schema during compilation.
-
-
- C++/Tree
-
- * New enum mapping with support for inheritance. Enumerators are
- now parsed using binary search instead of linear search.
-
- * Associated DOM nodes now retain "back" pointers to tree nodes.
-
- * Optimizations to reduce generated code size.
-
-
- C++/Parser
-
- * Specialization for void. You can now use void as a hook argument
- type if you don't want to pass any data between parsers.
-
- * Support for re-use of implementations of base parsers in derived
- parsers using the mixin C++ idiom. See the examples/cxx/parser/mixin
- for more information.
-
- * Support for uninitialized parser. If you don't provide a parser
- for element/attribute, that element/attribute will be ignored
- during parsing.
-
-
-Version 2.0.0
-
- * New cardinality calculator. This improves support for schemas that
- use complex structures with repeated elements, e.g.,
-
- <complexType name="Type">
- <choice>
- <sequence>
- <element name="a" type="string"/>
- <element name="c" type="string"/>
- </sequence>
- <sequence>
- <element name="b" type="string"/>
- <element name="c" type="string"/>
- </sequence>
- </choice>
- </complexType>
-
-
- * New identifier escaping code. With this feature xsd generates proper
- code for schemas that use the same name for an element and an attribute
- in the same type or use several elements/attributes with different
- qualified names but with the same local name, e.g.,
-
- <!-- base.xsd -->
- <schema xmlns="http://codesynthesis.com/xmlns/test/foo"
- targetNamespace="http://codesynthesis.com/xmlns/test/foo">
-
- <element name="foo" type="int"/>
- </schema>
-
- <schema xmlns="http://codesynthesis.com/xmlns/test/bar"
- xmlns:f="http://codesynthesis.com/xmlns/test/foo"
- targetNamespace="http://codesynthesis.com/xmlns/test/bar">
-
- <import namespace="http://codesynthesis.com/xmlns/test/foo"
- schemaLocation="base.xsd"/>
-
- <element name="foo" type="string"/>
-
- <complexType name="Foo">
- <sequence>
- <element ref="foo"/>
- <element name="foo" type="long"/>
- <element ref="f:foo"/>
- <element ref="f:foo"/>
- </sequence>
- <attribute name="foo" type="string"/>
- </complexType>
- </schema>
-
-
- C++/Tree
-
- * New option, --generate-polymorphic, triggers generation of
- polymorphism-aware code. Before this release xsd used to always
- generate polymorphism-aware code. However, it appears to be quite
- wasteful in terms of the generated code size (up to 40%). You will
- now need to explicitly specify this option if you use substitution
- groups or xsi:type. A warning is issued if this option is not
- specified but the schema makes use of substitution groups.
-
- * New options, --root-element-first, --root-element-last,
- --root-element-all, --root-element-none, and --root-element, control
- generation of parsing and serialization functions. With these options
- you can avoid generating extra code for global elements that are not
- document roots. See the man pages for details.
-
- * New options, --parts and -parts-suffix, allows you to split generated
- source code into a number of parts. This is useful when translating
- large, monolithic schemas and a C++ compiler is not able to compile
- the resulting source code at once (usually due to insufficient memory).
-
- * New option, --generate-default-ctor, triggers generation of default
- constructors even for types that have required members. Required
- members of an instance constructed using such a constructor are not
- initialized and accessing them results in undefined behavior. Thanks
- to Jean-Francois Dube <jf at magnu.polymtl.ca> for suggesting this
- feature.
-
- * New option, --generate-from-base-ctor, triggers generation of
- constructors that expect an instance of a base type followed by all
- required members. Thanks to Jean-Francois Dube <jf at magnu.polymtl.ca>
- for suggesting this feature.
-
- * Information scopes for attributes and elements with default/fixed values
- now define the public static default_value function which allows one to
- obtain the default/fixed value for the element/attribute. Thanks to
- Dave Moss <david.r.moss at selex-comm.com> for suggesting this feature.
-
- * MSVC 7.1 has a limit on the length of the "if else if" chain. This
- results in ICE when compiling generated code for enumerations with
- a large number of values. This version addresses this issue. Thanks
- to Cyrille Chépélov <cyrille at chepelov.org> for reporting this and
- suggesting a fix.
-
-
- C++/Parser
-
- * The parser construction API has changed. Now, for element 'foo',
- the name of the parser modifier function is 'foo_parser'. Likewise,
- operator() for setting all parsers at once has been changed to the
- 'parsers' function.
-
-
-Version 1.9.0
-
- C++/Tree
-
- * The size modifier function in the base64_binary and hex_binary
- built-in types automatically adjusts capacity if needed.
-
- * More internal names (names that start with _xsd_) were made
- private or protected.
-
- C++/Parser
-
- * Typedef for the parser base in the xml_schema namespace.
-
- C++/Parser-E
-
- * C++/Parser mapping optimized for embedded systems. For now it
- is equivalent to 'cxx-parser --xml-parser expat'.
-
-
-Version 1.8.0
-
- * Moved to the build 0.2 series.
-
- C++/Tree
-
- * Support for default and fixed values in attributes. An optional
- attribute with a default or fixed value is mapped to the One
- cardinality class instead of the Optional cardinality class.
-
- * Mapping for base64Binary and hexBinary has improved. Now these
- types support a basic buffer abstraction and perform automatic
- encoding and decoding.
-
- * Internal names are protected. We've noticed (via bug reports) a
- wide use of internal names (names that start with _xsd_) in user
- code. This is not portable and instead you should use public
- names. To prevent this from happening in the future we've made
- all internal names protected.
-
- C++/Parser
-
- * Support for Expat as the underlying XML parser in addition to
- Xerces-C++. This allows one to use the C++/Parser mapping in
- memory-constrained environments such as embedded systems. To
- select Expat instead of Xerces-C++ (default) add
- '--xml-parser expat' to the command line. At the moment only
- 'char' (UTF-8) is supported as the base character type when
- Expat is selected.
-
- * The invalid_instance exception has been renamed to parsing.
-
- * Generic error_handler interface has been added in addition
- to Xerces-C++-specific DOMErrorHandler. It allows you to
- handle parsing errors and warnings without having to deal
- with Xerces-C++ specifics.
-
- * The default error handling behavior has changed in parsing
- functions. Instead of printing errors and warnings to STDERR,
- the errors are now collected and thrown as part of the parsing
- exception.
-
- * In parsing functions, the name, namespace arguments order has
- been reversed to be consistent with the one used in parsing
- hooks.
-
-Version 1.7.0
-
- * Number of bug fixes in libxsd and the generated code.
-
- C++/Tree
-
- * Comprehensive XML Schema C++/Tree Mapping User Manual.
-
- * Basic support for union. A simple type that is defined using
- derivation by union is mapped to a C++ class that derives from
- string.
-
- * The _clone function has its arguments default-initialized.
-
- * The invalid_instance exception has been renamed to parsing.
-
- * Generic error_handler interface has been added in addition
- to Xerces-C++-specific DOMErrorHandler. It allows you to
- handle parsing/serialization errors and warnings without
- having to deal with Xerces-C++ specifics. See the user
- manual for more information.
-
- * The default error handling behavior has changed in parsing
- and serialization functions. Instead of printing errors and
- warnings to STDERR, the errors are now collected and thrown
- as part of the parsing/serialization exception. See the user
- manual for more information.
-
- * The optional and sequence containers now support operators ==,
- !=, <, >, <=, and >=.
-
- * Flags argument has been added to serialization functions. The
- only flag that is currently supported is dont_initialize.
-
- * Generated code cleanups.
-
- C++/Parser
-
- * Basic support for union. A simple type that is defined using
- derivation by union is mapped to a C++ class template that
- is just an alias for the generic parser. You are expected to
- override the _characters function in your implementation.
-
- * Properties argument to parsing functions which allows to
- programmatically specify schemas for instance document
- validation.
-
- * Flags argument to parsing functions. The following flags
- are supported:
-
- dont_validate - do not validate instance documents
- dont_initialize - do not initialize the Xerces-C++ runtime
-
-Version 1.6.0
-
- * Number of bug fixes in libxsd and the generated code.
-
- C++/Tree
-
- * Support for xsi:type and substitution groups in parsing and
- serialization. See examples/cxx/tree/polymorphism for a code
- sample.
-
- * Properties argument to parsing functions which allows to
- programmatically specify schemas for instance document
- validation.
-
- * Extra checks in parsing code which prevents construction
- of inconsistent in-memory representation from invalid
- instance documents. Should be useful when validation is
- disabled.
-
- * Accessors and modifier were made normal member functions.
- Before they were implemented via functors.
-
- * Workaround for g++-3.3 bug# 16650:
-
- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16650
-
- C++/Parser
-
- * All "service" functions were renamed to start with '_'.
- This should prevent hiding of service functions by
- elements/attributes with the same names.
-
-Version 1.5.0
-
- * Number of bug fixes in libxsd and the generated code.
-
- C++/Tree
-
- * Basic support for inheritance-by-restriction in complex types.
-
- * The following parsing flags have been introduced:
-
- keep_dom - keep association with underlying DOM nodes
- dont_validate - do not validate instance documents
- dont_initialize - do not initialize the Xerces-C++ runtime
-
- * "Type-less content" such as mixed content models, xsd:anyType/
- xsd:anySimpleType, and xsd:any/xsd:anyAttribute is supported by
- exposing corresponding DOM nodes (see the keep_dom parsing flag).
- Note that only a subset of XML Schema xsd:any functionality is
- supported. The compiler will issue diagnostics for unsupported
- cases. See examples/cxx/tree/mixed for a code sample.
-
- C++/Parser
-
- * Support for inheritance-by-restriction in complex types.
-
- * "Type-less content" such as mixed content models, xsd:anyType/
- xsd:anySimpleType, and xsd:any/xsd:anyAttribute is supported
- by forwarding parsing events to a set of "unexpected" hooks.
- Note that only a subset of XML Schema xsd:any functionality is
- supported. The compiler will issue diagnostics for unsupported
- cases. See examples/cxx/parser/mixed for a code sample.
-
-Version 1.4.0
-
- * Number of improvements and bug fixes in the diagnostics code.
-
- * libxsd has been reorganized to provide a clean split of code with
- regards to char/wchar_t use. It should be possible to use libxsd
- and the xsd-generated code on platforms that lack wchar_t support,
- such as mingw.
-
- C++/Tree
-
- * Work around for g++ bug# 23206.
-
- * Support for xsd:list.
-
- * Type/member name conflicts are auto-resolved. Such conflicts
- occur when a type and an element or attribute withing this type
- share the same name.
-
- * XML Schema extension, the 'refType' attribute, allows one to
- specify referenced type for xsd:IDREF and xsd:IDREFS data types.
- See examples/cxx/tree/library for details.
-
- * New option, --morph-anonymous, allows automatic morphing
- of anonymous types to named ones. See the man pages for
- details.
-
- * New option, --namespace-regex-trace, allows one to trace the
- namespace mapping process. See the man pages for details.
-
- * Mapping for optional elements/attributes (cardinality 0..1)
- has changed in a backwards-incompatible way. In the previous
- version you would write:
-
- Bar& bar = ...
-
- if (bar.foo.present ()) // test
- {
- Foo& foo (bar.foo ()); // get
-
- bar.foo (Foo (...)); // set
-
- bar.foo.reset (); // reset
- }
-
- Now you would write it like this:
-
- if (bar.foo ().present ()) // test
- {
- Foo& foo (bar.foo ().get ()); // get
-
- bar.foo (Foo (...)); // set
-
- bar.foo ().reset (); // reset
- }
-
- Or using the pointer notation:
-
- if (bar.foo ()) // test
- {
- Foo& foo (*bar.foo ()); // get
-
- bar.foo (Foo (...)); // set
-
- bar.foo ().reset (); // reset
- }
-
- C++/Parser
-
- * Support for xsd:list.
-
- * Type/member name conflicts are auto-resolved. Such conflicts
- occur when a type and an element or attribute withing this type
- share the same name.
-
- * New option, --namespace-regex-trace, allows one to trace the
- namespace mapping process. See the man pages for details.
-
-Version 1.3.0
-
- * Numerous bug fixes.
-
- * The XML subsystem of libxsd has been reorganized to provide
- a clean split of DOM and SAX functionalities.
-
- C++/Parser
-
- * New option, --morph-anonymous, allows automatic morphing
- of anonymous types to named ones. See the man pages for
- details.
-
- C++/Tree
-
- * Additional parser functions provide support for reading
- from std::istream.
-
-Version 1.2.0
-
- C++/Parser
-
- * New backend that generates the C++/Parser mapping.
-
-Version 1.1.1
-
- all backends
-
- * Bug fixes in the filesystem path handling logic.
-
-Version 1.1.0
-
- C++/Tree
-
- * New option, --generate-serialization, triggers generation of
- serialization functions. Serialization functions convert an in-memory
- representation back to XML.
-
- * xsd::cxx::tree::vector has been extended to closely follow std::vector
- API. This allows you to access and modify element sequences as if they
- were of type std::vector.
-
- * Generated constructors from xml::attribute and xml::element are made
- explicit.
-
- * The library example was extended to showcase modification and
- serialization of the in-memory representation.
-
- * New "XML Schema C++/Tree Mapping Serialization Guide" has an in-depth
- treatment of the serialization mechanisms provided by xsd.
-
-Version 1.0.1
-
- all backends
-
- * Improved diagnostics.
-
- * Bug fixes in the schema inclusion/importing logic.
-
- C++/Tree
-
- * Two new options: --include-with-brackets and --include-prefix
-
-Version 1.0.0
-
- * First public release.
+../NEWS \ No newline at end of file
diff --git a/xsd/PACKAGE-README.md b/xsd/PACKAGE-README.md
new file mode 120000
index 0000000..422e63f
--- /dev/null
+++ b/xsd/PACKAGE-README.md
@@ -0,0 +1 @@
+../PACKAGE-README.md \ No newline at end of file
diff --git a/xsd/README b/xsd/README
deleted file mode 100644
index dc1d4db..0000000
--- a/xsd/README
+++ /dev/null
@@ -1,29 +0,0 @@
-CodeSynthesis XSD is a W3C XML Schema to C++ data binding compiler.
-It generates vocabulary-specific, statically-typed C++ mappings (also
-called bindings) from XML Schema definitions. XSD supports two C++
-mappings: in-memory C++/Tree and event-driven C++/Parser.
-
-The C++/Tree mapping consists of types that represent the given
-vocabulary, a set of parsing functions that convert XML instance
-documents to a tree-like in-memory object model, and a set of
-serialization functions that convert the object model back to XML.
-
-The C++/Parser mapping provides parser templates for data types
-defined in XML Schema. Using these parser templates you can build
-your own in-memory representations or perform immediate processing
-of XML instance documents.
-
-Note also that the xsd executable provides build2 metadata.
-
-See the NEWS file for the user-visible changes from the previous release.
-
-See the LICENSE file for distribution conditions.
-
-See the INSTALL file for prerequisites and installation instructions.
-
-See the doc/ directory for documentation.
-
-The project page is at https://www.codesynthesis.com/projects/xsd/.
-
-Send bug reports or any other feedback to the xsd-users@codesynthesis.com
-mailing list.
diff --git a/xsd/README.md b/xsd/README.md
new file mode 100644
index 0000000..e2b2887
--- /dev/null
+++ b/xsd/README.md
@@ -0,0 +1,12 @@
+# xsd - XML Schema to C++ data binding compiler
+
+XSD is an open-source, cross-platform XML Schema to C++ data binding
+compiler. Provided with an XML document specification (XML Schema), it
+generates C++ classes that represent the given vocabulary as well as XML
+parsing and serialization code. You can then access the data stored in XML
+using types and functions that semantically correspond to your application
+domain rather than dealing with generic elements/attributes and raw strings.
+
+For further information, including licensing conditions, documentation, and
+binary packages, refer to the [XSD project
+page](https://codesynthesis.com/products/xsd/).
diff --git a/xsd/buildfile b/xsd/buildfile
index 552635c..b0121dd 100644
--- a/xsd/buildfile
+++ b/xsd/buildfile
@@ -1,9 +1,11 @@
# file : buildfile
# license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-./: {*/ -build/} doc{INSTALL NEWS README} legal{GPLv2 LICENSE FLOSSE} manifest
+./: {*/ -build/} \
+ doc{README.md PACKAGE-README.md NEWS} \
+ legal{GPLv2 LICENSE FLOSSE} \
+ manifest
-# Don't install tests or the INSTALL file.
+# Don't install tests.
#
-tests/: install = false
-doc{INSTALL}@./: install = false
+tests/: install = false
diff --git a/xsd/doc/buildfile b/xsd/doc/buildfile
index 2b00ac6..271d17e 100644
--- a/xsd/doc/buildfile
+++ b/xsd/doc/buildfile
@@ -27,6 +27,12 @@ svg{*}: extension = svg
./: css{default} xsd{custom-literals} {png svg}{**}
+# Note: doc_version is also used in the man pages and the manual.
+#
+doc_version = [string] "$version.major.$version.minor.$version.patch"
+if $version.pre_release
+ doc_version += "-$version.pre_release_string"
+
# Man pages.
#
@@ -51,10 +57,6 @@ pregenerated/{man1 xhtml}{*}: dist = (!$develop)
if $develop
{
- doc_version = [string] "$version.major.$version.minor.$version.patch"
- if $version.pre_release
- doc_version += "-$version.pre_release_string"
-
# Let's take the last four-digit number to cover 2000-2021,2022.
#
doc_year = $regex.replace($copyright, '.+[-, ]([0-9][0-9][0-9][0-9]) .+', '\1')
@@ -77,7 +79,7 @@ if $develop
#
{man1 xhtml}{xsd}: dist = ($develop ? pregenerated/ : false)
-ops = ../xsd/cxx/cli{options tree/options parser/options}
+ops = ../xsd/cli{options cxx/options cxx/tree/options cxx/parser/options}
man1{xsd}: $ops \
file{xsd-prologue.1 \
@@ -96,20 +98,20 @@ if $develop
-v date="January $doc_year" \
--class CXX::options \
--class options \
- --man-prologue-file $path($<[3]) \
- $path($<[0]) >$o
-
- $cli --generate-man $man_options \
- -v date="January $doc_year" \
--man-prologue-file $path($<[4]) \
- $path($<[1]) >>$o
+ $path($<[1]) >$o
$cli --generate-man $man_options \
-v date="January $doc_year" \
--man-prologue-file $path($<[5]) \
- --man-epilogue-file $path($<[6]) \
$path($<[2]) >>$o
+ $cli --generate-man $man_options \
+ -v date="January $doc_year" \
+ --man-prologue-file $path($<[6]) \
+ --man-epilogue-file $path($<[7]) \
+ $path($<[3]) >>$o
+
# If the result differs from the pregenerated version, copy it over.
#
if! diff $src_base/pregenerated/xsd.1 $o >-
@@ -132,20 +134,20 @@ if $develop
-v date="January $doc_year" \
--class CXX::options \
--class options \
- --html-prologue-file $path($<[3]) \
- $path($<[0]) >$o
-
- $cli --generate-html $man_options \
- -v date="January $doc_year" \
--html-prologue-file $path($<[4]) \
- $path($<[1]) >>$o
+ $path($<[1]) >$o
$cli --generate-html $man_options \
-v date="January $doc_year" \
--html-prologue-file $path($<[5]) \
- --html-epilogue-file $path($<[6]) \
$path($<[2]) >>$o
+ $cli --generate-html $man_options \
+ -v date="January $doc_year" \
+ --html-prologue-file $path($<[6]) \
+ --html-epilogue-file $path($<[7]) \
+ $path($<[3]) >>$o
+
if! diff $src_base/pregenerated/xsd.xhtml $o >-
cp $o $src_base/pregenerated/xsd.xhtml
end
diff --git a/xsd/doc/cxx/parser/guide/index.xhtml.in b/xsd/doc/cxx/parser/guide/index.xhtml.in
index 96d06e2..119f421 100644
--- a/xsd/doc/cxx/parser/guide/index.xhtml.in
+++ b/xsd/doc/cxx/parser/guide/index.xhtml.in
@@ -553,7 +553,7 @@
</p>
<pre class="terminal">
-$ xsd cxx-parser --std c++11 --xml-parser expat hello.xsd
+$ xsd cxx-parser --xml-parser expat hello.xsd
</pre>
<p>The <code>--xml-parser</code> option indicates that we want to
@@ -1494,7 +1494,7 @@ gender ::gender ::gender;
option to let the XSD compiler know about our type map:</p>
<pre class="terminal">
-$ xsd cxx-parser --std c++11 --type-map people.map people.xsd
+$ xsd cxx-parser --type-map people.map people.xsd
</pre>
<p>If we now look at the generated <code>people-pskel.hxx</code>,
@@ -1673,10 +1673,10 @@ namespace http://www.w3.org/2001/XMLSchema
QName xml_schema::qname;
- base64Binary std::[auto|unique]_ptr&lt;xml_schema::buffer>
- std::[auto|unique]_ptr&lt;xml_schema::buffer>;
- hexBinary std::[auto|unique]_ptr&lt;xml_schema::buffer>
- std::[auto|unique]_ptr&lt;xml_schema::buffer>;
+ base64Binary std::[unique|auto]_ptr&lt;xml_schema::buffer>
+ std::[unique|auto]_ptr&lt;xml_schema::buffer>;
+ hexBinary std::[unique|auto]_ptr&lt;xml_schema::buffer>
+ std::[unique|auto]_ptr&lt;xml_schema::buffer>;
date xml_schema::date;
dateTime xml_schema::date_time;
@@ -1742,8 +1742,7 @@ people ::people;
recompile our schema and move on to implementing the parsers:</p>
<pre class="terminal">
-$ xsd cxx-parser --std c++11 --xml-parser expat --type-map people.map \
- people.xsd
+$ xsd cxx-parser --xml-parser expat --type-map people.map people.xsd
</pre>
<p>Here is the implementation of our three parsers in full. One
@@ -2608,14 +2607,14 @@ private:
<tr>
<td><code>base64Binary</code></td>
<td><code>base64_binary_pimpl</code></td>
- <td><code>std::[auto|unique]_ptr&lt; xml_schema::buffer></code><br/>
+ <td><code>std::[unique|auto]_ptr&lt; xml_schema::buffer></code><br/>
<a href="#6.3">Section 6.3, "<code>base64Binary</code> and
<code>hexBinary</code> Parsers"</a></td>
</tr>
<tr>
<td><code>hexBinary</code></td>
<td><code>hex_binary_pimpl</code></td>
- <td><code>std::[auto|unique]_ptr&lt; xml_schema::buffer></code><br/>
+ <td><code>std::[unique|auto]_ptr&lt; xml_schema::buffer></code><br/>
<a href="#6.3">Section 6.3, "<code>base64Binary</code> and
<code>hexBinary</code> Parsers"</a></td>
</tr>
diff --git a/xsd/doc/cxx/tree/guide/index.xhtml.in b/xsd/doc/cxx/tree/guide/index.xhtml.in
index b704e50..2f7f1e2 100644
--- a/xsd/doc/cxx/tree/guide/index.xhtml.in
+++ b/xsd/doc/cxx/tree/guide/index.xhtml.in
@@ -536,7 +536,7 @@
</p>
<pre class="terminal">
-$ xsd cxx-tree --std c++11 hello.xsd
+$ xsd cxx-tree hello.xsd
</pre>
<p>The XSD compiler produces two C++ files: <code>hello.hxx</code> and
@@ -633,7 +633,7 @@ hello (std::istream&amp;);
select C++98:</p>
<pre class="terminal">
-$ xsd cxx-tree hello.xsd
+$ xsd cxx-tree --std c++98 hello.xsd
</pre>
<p>Then the parsing function signatures will become:</p>
@@ -726,7 +726,7 @@ Hello, world!
it with the <code>--generate-serialization</code> options:</p>
<pre class="terminal">
-$ xsd cxx-tree --std c++11 --generate-serialization hello.xsd
+$ xsd cxx-tree --generate-serialization hello.xsd
</pre>
<p>If we now examine the generated <code>hello.hxx</code> file,
@@ -911,7 +911,7 @@ main (int argc, char* argv[])
change the type naming scheme:</p>
<pre class="terminal">
-$ xsd cxx-tree --std c++11 --type-naming ucc hello.xsd
+$ xsd cxx-tree --type-naming ucc hello.xsd
</pre>
<p>The <code>ucc</code> argument to the <code>--type-naming</code>
@@ -978,8 +978,7 @@ hello (std::istream&amp;);
<code>--type-regex</code> option:</p>
<pre class="terminal">
-$ xsd cxx-tree --std c++11 --type-naming ucc \
- --type-regex '/ (.+)_t/\u$1/' hello.xsd
+$ xsd cxx-tree --type-naming ucc --type-regex '/ (.+)_t/\u$1/' hello.xsd
</pre>
<p>This results in the following changes to the generated code:</p>
@@ -1114,8 +1113,7 @@ hello (std::istream&amp;);
our schema with the <code>--generate-doxygen</code> option:</p>
<pre class="terminal">
-$ xsd cxx-tree --std c++11 --generate-serialization --generate-doxygen \
- hello.xsd
+$ xsd cxx-tree --generate-serialization --generate-doxygen hello.xsd
</pre>
<p>Now the generated <code>hello.hxx</code> file contains comments
diff --git a/xsd/doc/cxx/tree/manual/index.xhtml.in b/xsd/doc/cxx/tree/manual/index.xhtml.in
index 5a7240a..5274229 100644
--- a/xsd/doc/cxx/tree/manual/index.xhtml.in
+++ b/xsd/doc/cxx/tree/manual/index.xhtml.in
@@ -8,7 +8,7 @@
<meta name="copyright" content="&#169; @copyright@"/>
<meta name="keywords" content="xsd,xml,schema,c++,mapping,data,binding,tree,serialization,guide,manual,examples"/>
<meta name="description" content="C++/Tree Mapping User Manual"/>
- <meta name="revision" content="4.1.0"/>
+ <meta name="revision" content="@doc_version@"/>
<link rel="stylesheet" type="text/css" href="../../../default.css" />
@@ -441,9 +441,9 @@
called C++/Tree.
</p>
- <p>Revision 4.1.0<br/> <!-- Remember to change revision in other places -->
+ <p>Revision @doc_version@<br/>
This revision of the manual describes the C++/Tree
- mapping as implemented by CodeSynthesis XSD version 4.1.0.
+ mapping as implemented by CodeSynthesis XSD version @doc_version@.
</p>
<p>This document is available in the following formats:
diff --git a/xsd/doc/pregenerated/xsd.1 b/xsd/doc/pregenerated/xsd.1
index f74a3b0..580ac78 100644
--- a/xsd/doc/pregenerated/xsd.1
+++ b/xsd/doc/pregenerated/xsd.1
@@ -1,7 +1,7 @@
.\" Process this file with
.\" groff -man -Tascii xsd.1
.\"
-.TH XSD 1 "January 2022" "XSD 4.2.0-b.4"
+.TH XSD 1 "January 2023" "XSD 4.2.1-a.0"
.SH NAME
xsd \- W3C XML Schema to C++ Compiler
.\"
@@ -119,12 +119,15 @@ if any, should appear after the corresponding
.
.IP "\fB--std\fR \fIversion\fR"
Specify the C++ standard that the generated code should conform to\. Valid
-values are \fBc++98\fR (default) and \fBc++11\fR\.
+values are \fBc++98\fR, \fBc++11\fR (default), \fBc++14\fR, \fBc++17\fR,
+\fBc++20\fR, and \fBc++23\fR\.
The C++ standard affects various aspects of the generated code that are
discussed in more detail in various mapping-specific documentation\. Overall,
when C++11 is selected, the generated code relies on the move semantics and
uses \fBstd::unique_ptr\fR instead of deprecated \fBstd::auto_ptr\fR\.
+Currently, there is no difference between the C++11 and the later standards
+modes\.
When the C++11 mode is selected, you normally don't need to perform any extra
steps other than enable C++11 in your C++ compiler, if required\. The XSD
@@ -381,7 +384,8 @@ Generate \fBmake\fR dependency information\. This option triggers the creation
of the \fB\.d\fR file containing the dependencies of the generated files on
the main schema file as well as all the schema files that it includes/imports,
transitively\. This dependency file is then normally included into the main
-\fBmakefile\fR to implement automatic dependency tracking\.
+\fBmakefile\fR to implement automatic dependency tracking\. See also the
+\fB--dep-*\fR options\.
Note also that automatic dependency generation is not supported in the
file-per-type mode (\fB--file-per-type\fR)\. In this case, all the generated
@@ -402,8 +406,12 @@ directory prefixes\. If you require multiple targets, then you can specify
them as a single, space-separated argument or you can repeat this option
multiple times\.
.IP "\fB--dep-suffix\fR \fIsuffix\fR"
-Use the provided \fIsuffix\fR instead of the default \fB\.d\fR to construct
-the name of the dependency file\.
+Use \fIsuffix\fR instead of the default \fB\.d\fR to construct the name of the
+dependency file\. See also \fB--dep-file\fR\.
+.IP "\fB--dep-file\fR \fIpath\fR"
+Use \fIpath\fR as the generated dependency file path instead of deriving it
+from the input file name\. Write the dependency information to \fBstdout\fR if
+\fIpath\fR is \fB-\fR\. See also \fB--dep-regex\fR\.
.IP "\fB--dep-regex\fR \fIregex\fR"
Use the provided expression to construct the name of the dependency file\.
\fIregex\fR is a Perl-like regular expression in the form
@@ -577,9 +585,14 @@ option is primarily useful when trying to minimize the amount of object code
that is linked to an executable by packaging compiled generated code into a
static (archive) library\.
.IP "\fB--file-list\fR \fIfile\fR"
-Write a list of generated C++ files to \fIfile\fR\. This option is primarily
-useful in the file-per-type compilation mode (\fB--file-per-type\fR) to create
-a list of generated C++ files, for example, as a makefile fragment\.
+Write a list of generated C++ files to \fIfile\fR or to \fBstdout\fR if
+\fIfile\fR is \fB-\fR\. This option is primarily useful in the file-per-type
+compilation mode (\fB--file-per-type\fR) to create a list of generated C++
+files, for example, as a makefile fragment\.
+.IP "\fB--file-list-only\fR"
+Only write the list of C++ files that would be generated without actually
+generating them\. This option only makes sense together with
+\fB--file-list\fR\.
.IP "\fB--file-list-prologue\fR \fItext\fR"
Insert \fItext\fR at the beginning of the file list\. As a convenience, all
occurrences of the \fB\en\fR character sequence in \fItext\fR are replaced
@@ -1292,7 +1305,6 @@ namespace http://www.example.com/xmlns/my
.br
.RE
-
The compiler has a number of predefined mapping rules that can be
presented as the following map files. The string-based XML Schema
built-in types are mapped to either
@@ -1303,6 +1315,14 @@ depending on the character type selected with the
.B --char-type
option
.RB ( char
+by default). The binary XML Schema types are mapped to either
+.B std::unique_ptr<xml_schema::buffer>
+or
+.B std::auto_ptr<xml_schema::buffer>
+depending on the C++ standard selected with the
+.B --std
+option
+.RB ( c++11
by default).
.RS
@@ -1382,13 +1402,13 @@ namespace http://www.w3.org/2001/XMLSchema
QName xml_schema::qname;
.br
- base64Binary std::auto_ptr<xml_schema::buffer>
+ base64Binary std::[unique|auto]_ptr<xml_schema::buffer>
.br
- std::auto_ptr<xml_schema::buffer>;
+ std::[unique|auto]_ptr<xml_schema::buffer>;
.br
- hexBinary std::auto_ptr<xml_schema::buffer>
+ hexBinary std::[unique|auto]_ptr<xml_schema::buffer>
.br
- std::auto_ptr<xml_schema::buffer>;
+ std::[unique|auto]_ptr<xml_schema::buffer>;
.br
date xml_schema::date;
@@ -1471,7 +1491,7 @@ and exit with non-zero exit code.
.SH BUGS
Send bug reports to the xsd-users@codesynthesis.com mailing list.
.SH COPYRIGHT
-Copyright (c) 2005-2022 Code Synthesis Tools CC.
+Copyright (c) 2005-2023 Code Synthesis.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
diff --git a/xsd/doc/pregenerated/xsd.xhtml b/xsd/doc/pregenerated/xsd.xhtml
index 4737ab6..2e30ed4 100644
--- a/xsd/doc/pregenerated/xsd.xhtml
+++ b/xsd/doc/pregenerated/xsd.xhtml
@@ -1,12 +1,11 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-
+<html xmlns="http://www.w3.org/1999/xhtml">
<head>
- <title>XSD 4.2.0-b.4 Compiler Command Line Manual</title>
+ <title>XSD 4.2.1-a.0 Compiler Command Line Manual</title>
- <meta name="version" content="4.2.0-b.4"/>
- <meta name="copyright" content="&#169; 2005-2022 Code Synthesis Tools CC"/>
+ <meta charset="UTF-8"/>
+ <meta name="version" content="4.2.1-a.0"/>
+ <meta name="copyright" content="&#169; 2005-2023 Code Synthesis"/>
<meta name="keywords" content="xsd,xml,schema,c++,mapping,data,binding,code,generator,manual,man,page"/>
<meta name="description" content="XSD Compiler Command Line Manual"/>
@@ -124,14 +123,16 @@
<dl class="options">
<dt><code><b>--std</b></code> <code><i>version</i></code></dt>
<dd>Specify the C++ standard that the generated code should conform to.
- Valid values are <code><b>c++98</b></code> (default) and
- <code><b>c++11</b></code>.
+ Valid values are <code><b>c++98</b></code>, <code><b>c++11</b></code>
+ (default), <code><b>c++14</b></code>, <code><b>c++17</b></code>,
+ <code><b>c++20</b></code>, and <code><b>c++23</b></code>.
<p>The C++ standard affects various aspects of the generated code that are
discussed in more detail in various mapping-specific documentation.
Overall, when C++11 is selected, the generated code relies on the move
semantics and uses <code><b>std::unique_ptr</b></code> instead of
- deprecated <code><b>std::auto_ptr</b></code>.</p>
+ deprecated <code><b>std::auto_ptr</b></code>. Currently, there is no
+ difference between the C++11 and the later standards modes.</p>
<p>When the C++11 mode is selected, you normally don't need to perform any
extra steps other than enable C++11 in your C++ compiler, if required. The
@@ -480,7 +481,8 @@
dependencies of the generated files on the main schema file as well as all
the schema files that it includes/imports, transitively. This dependency
file is then normally included into the main <code><b>makefile</b></code>
- to implement automatic dependency tracking.
+ to implement automatic dependency tracking. See also the
+ <code><b>--dep-*</b></code> options.
<p>Note also that automatic dependency generation is not supported in the
file-per-type mode (<code><b>--file-per-type</b></code>). In this case,
@@ -506,8 +508,15 @@
multiple times.</dd>
<dt><code><b>--dep-suffix</b></code> <code><i>suffix</i></code></dt>
- <dd>Use the provided <code><i>suffix</i></code> instead of the default
- <code><b>.d</b></code> to construct the name of the dependency file.</dd>
+ <dd>Use <code><i>suffix</i></code> instead of the default
+ <code><b>.d</b></code> to construct the name of the dependency file. See
+ also <code><b>--dep-file</b></code>.</dd>
+
+ <dt><code><b>--dep-file</b></code> <code><i>path</i></code></dt>
+ <dd>Use <code><i>path</i></code> as the generated dependency file path
+ instead of deriving it from the input file name. Write the dependency
+ information to <code><b>stdout</b></code> if <code><i>path</i></code> is
+ <code><b>-</b></code>. See also <code><b>--dep-regex</b></code>.</dd>
<dt><code><b>--dep-regex</b></code> <code><i>regex</i></code></dt>
<dd>Use the provided expression to construct the name of the dependency
@@ -731,10 +740,17 @@
compiled generated code into a static (archive) library.</dd>
<dt><code><b>--file-list</b></code> <code><i>file</i></code></dt>
- <dd>Write a list of generated C++ files to <code><i>file</i></code>. This
- option is primarily useful in the file-per-type compilation mode
- (<code><b>--file-per-type</b></code>) to create a list of generated C++
- files, for example, as a makefile fragment.</dd>
+ <dd>Write a list of generated C++ files to <code><i>file</i></code> or to
+ <code><b>stdout</b></code> if <code><i>file</i></code> is
+ <code><b>-</b></code>. This option is primarily useful in the
+ file-per-type compilation mode (<code><b>--file-per-type</b></code>) to
+ create a list of generated C++ files, for example, as a makefile
+ fragment.</dd>
+
+ <dt><code><b>--file-list-only</b></code></dt>
+ <dd>Only write the list of C++ files that would be generated without
+ actually generating them. This option only makes sense together with
+ <code><b>--file-list</b></code>.</dd>
<dt><code><b>--file-list-prologue</b></code> <code><i>text</i></code></dt>
<dd>Insert <code><i>text</i></code> at the beginning of the file list. As
@@ -1465,7 +1481,11 @@ namespace http://www.example.com/xmlns/my
built-in types are mapped to either <code><b>std::string</b></code>
or <code><b>std::wstring</b></code> depending on the character type
selected with the <code><b>--char-type</b></code> option
- (<code><b>char</b></code> by default).</p>
+ (<code><b>char</b></code> by default). The binary XML Schema types are
+ mapped to either <code>std::unique_ptr&lt;xml_schema::buffer></code>
+ or <code>std::auto_ptr&lt;xml_schema::buffer></code> depending on the C++
+ standard selected with the <code><b>--std</b></code> option
+ (<code><b>c++11</b></code> by default).</p>
<pre>
namespace http://www.w3.org/2001/XMLSchema
@@ -1512,10 +1532,10 @@ namespace http://www.w3.org/2001/XMLSchema
QName xml_schema::qname;
- base64Binary std::auto_ptr&lt;xml_schema::buffer>
- std::auto_ptr&lt;xml_schema::buffer>;
- hexBinary std::auto_ptr&lt;xml_schema::buffer>
- std::auto_ptr&lt;xml_schema::buffer>;
+ base64Binary std::[unique|auto]_ptr&lt;xml_schema::buffer>
+ std::[unique|auto]_ptr&lt;xml_schema::buffer>;
+ hexBinary std::[unique|auto]_ptr&lt;xml_schema::buffer>
+ std::[unique|auto]_ptr&lt;xml_schema::buffer>;
date xml_schema::date;
dateTime xml_schema::date_time;
@@ -1585,7 +1605,7 @@ namespace .*
</div>
<div id="footer">
- Copyright &#169; 2005-2022 Code Synthesis Tools CC.
+ Copyright &#169; 2005-2023 Code Synthesis.
<div id="terms">
Permission is granted to copy, distribute and/or modify this
diff --git a/xsd/doc/xsd-epilogue.1 b/xsd/doc/xsd-epilogue.1
index a37da89..9ab1952 100644
--- a/xsd/doc/xsd-epilogue.1
+++ b/xsd/doc/xsd-epilogue.1
@@ -381,7 +381,6 @@ namespace http://www.example.com/xmlns/my
.br
.RE
-
The compiler has a number of predefined mapping rules that can be
presented as the following map files. The string-based XML Schema
built-in types are mapped to either
@@ -392,6 +391,14 @@ depending on the character type selected with the
.B --char-type
option
.RB ( char
+by default). The binary XML Schema types are mapped to either
+.B std::unique_ptr<xml_schema::buffer>
+or
+.B std::auto_ptr<xml_schema::buffer>
+depending on the C++ standard selected with the
+.B --std
+option
+.RB ( c++11
by default).
.RS
@@ -471,13 +478,13 @@ namespace http://www.w3.org/2001/XMLSchema
QName xml_schema::qname;
.br
- base64Binary std::auto_ptr<xml_schema::buffer>
+ base64Binary std::[unique|auto]_ptr<xml_schema::buffer>
.br
- std::auto_ptr<xml_schema::buffer>;
+ std::[unique|auto]_ptr<xml_schema::buffer>;
.br
- hexBinary std::auto_ptr<xml_schema::buffer>
+ hexBinary std::[unique|auto]_ptr<xml_schema::buffer>
.br
- std::auto_ptr<xml_schema::buffer>;
+ std::[unique|auto]_ptr<xml_schema::buffer>;
.br
date xml_schema::date;
diff --git a/xsd/doc/xsd-epilogue.xhtml b/xsd/doc/xsd-epilogue.xhtml
index 632b2d9..178cf8b 100644
--- a/xsd/doc/xsd-epilogue.xhtml
+++ b/xsd/doc/xsd-epilogue.xhtml
@@ -290,7 +290,11 @@ namespace http://www.example.com/xmlns/my
built-in types are mapped to either <code><b>std::string</b></code>
or <code><b>std::wstring</b></code> depending on the character type
selected with the <code><b>--char-type</b></code> option
- (<code><b>char</b></code> by default).</p>
+ (<code><b>char</b></code> by default). The binary XML Schema types are
+ mapped to either <code>std::unique_ptr&lt;xml_schema::buffer></code>
+ or <code>std::auto_ptr&lt;xml_schema::buffer></code> depending on the C++
+ standard selected with the <code><b>--std</b></code> option
+ (<code><b>c++11</b></code> by default).</p>
<pre>
namespace http://www.w3.org/2001/XMLSchema
@@ -337,10 +341,10 @@ namespace http://www.w3.org/2001/XMLSchema
QName xml_schema::qname;
- base64Binary std::auto_ptr&lt;xml_schema::buffer>
- std::auto_ptr&lt;xml_schema::buffer>;
- hexBinary std::auto_ptr&lt;xml_schema::buffer>
- std::auto_ptr&lt;xml_schema::buffer>;
+ base64Binary std::[unique|auto]_ptr&lt;xml_schema::buffer>
+ std::[unique|auto]_ptr&lt;xml_schema::buffer>;
+ hexBinary std::[unique|auto]_ptr&lt;xml_schema::buffer>
+ std::[unique|auto]_ptr&lt;xml_schema::buffer>;
date xml_schema::date;
dateTime xml_schema::date_time;
diff --git a/xsd/doc/xsd-prologue.xhtml b/xsd/doc/xsd-prologue.xhtml
index e52e1fc..6782a32 100644
--- a/xsd/doc/xsd-prologue.xhtml
+++ b/xsd/doc/xsd-prologue.xhtml
@@ -1,10 +1,9 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-
+<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>$project$ $version$ Compiler Command Line Manual</title>
+ <meta charset="UTF-8"/>
<meta name="version" content="$version$"/>
<meta name="copyright" content="&#169; $copyright$"/>
<meta name="keywords" content="xsd,xml,schema,c++,mapping,data,binding,code,generator,manual,man,page"/>
diff --git a/xsd/manifest b/xsd/manifest
index 075b021..8ae3ef5 100644
--- a/xsd/manifest
+++ b/xsd/manifest
@@ -1,23 +1,162 @@
: 1
name: xsd
-version: 4.2.0-b.4.z
+version: 4.2.1-a.0.z
+language: c++
summary: XML Schema to C++ data binding compiler
license: other: GPL-2.0-only with Xerces-C++ linking exception and FLOSS exception
topics: C++, XML, XML Schema, XML parser, source code generation
-description-file: README
+description-file: README.md
+package-description-file: PACKAGE-README.md
changes-file: NEWS
-url: https://www.codesynthesis.com/projects/xsd/
-doc-url: https://www.codesynthesis.com/projects/xsd/
-src-url: https://git.codesynthesis.com/cgit/xsd/xsd/tree/xsd/
+url: https://www.codesynthesis.com/products/xsd/
+doc-url: https://www.codesynthesis.com/products/xsd/
+src-url: https://git.codesynthesis.com/cgit/xsd/xsd/
email: xsd-users@codesynthesis.com ; Mailing list
build-warning-email: builds@codesynthesis.com
requires: host
requires: c++11
-depends: * build2 >= 0.16.0-
-depends: * bpkg >= 0.16.0-
-depends: libxsd-frontend ^2.1.0-
-depends: libcutl ^1.11.0-
+depends: * build2 >= 0.16.0
+depends: * bpkg >= 0.16.0
+depends: libxsd-frontend ^2.1.0
+depends: libcutl ^1.11.0
depends: libxerces-c ^3.0.0
depends: * cli ^1.2.0- ? ($config.xsd.develop)
tests: * xsd-tests == $
examples: * xsd-examples == $
+
+# Binary distribution packages. Overall notes:
+#
+# - Link dependencies that don't come from system packages statically.
+#
+# - We suppress generating binary packages for dependecies (libcutl,
+# libxsd-frontend) with --recursive=auto since they are linked statically.
+#
+# - For archives we strip the default compiler name from metadata since
+# it's unimportant (we link the C++ runtime statically).
+#
+# - We disable warning emails for configurations that build Xerces-C++.
+
+# Note that the Xerces-C++ package is in the unsupported `universe` section on
+# Ubuntu so we have a separate configuration for it where we build Xerces-C++
+# ourselves.
+#
+bindist-debian-builds: bindist
+bindist-debian-build-include: linux_debian*-**
+bindist-debian-build-exclude: **
+bindist-debian-build-config:
+\
++bpkg.bindist.debian:
++bbot.bindist.upload:
+bpkg.bindist.debian:--recursive=auto
+bpkg.create:config.bin.lib=static
+bpkg.create:config.bin.liba.lib="shared static"
+?sys:libxerces-c
+\
+
+bindist-ubuntu-builds: bindist
+bindist-ubuntu-build-include: linux_ubuntu*-**
+bindist-ubuntu-build-exclude: **
+bindist-ubuntu-build-config:
+\
++bpkg.bindist.debian:
++bbot.bindist.upload:
+bpkg.bindist.debian:--recursive=auto
+bpkg.create:config.bin.lib=static
+bpkg.create:config.bin.liba.lib="shared static"
+?sys:libicuuc
+?sys:libicui18n
+\
+#bindist-ubuntu-build-error-email: builds@codesynthesis.com
+
+# Note that there is no Xerces-C++ package in RHEL (only in EPEL) so we
+# have a separate configuration for RHEL.
+#
+bindist-fedora-builds: bindist
+bindist-fedora-build-include: linux_fedora*-**
+bindist-fedora-build-exclude: **
+bindist-fedora-build-config:
+\
++bpkg.bindist.fedora:
++bbot.bindist.upload:
+bpkg.bindist.fedora:--recursive=auto
+bpkg.create:config.bin.lib=static
+bpkg.create:config.bin.liba.lib="shared static"
+?sys:libxerces-c
+\
+
+bindist-rhel-builds: bindist
+bindist-rhel-build-include: linux_rhel*-**
+bindist-rhel-build-exclude: **
+bindist-rhel-build-config:
+\
++bpkg.bindist.fedora:
++bbot.bindist.upload:
+bpkg.bindist.fedora:--recursive=auto
+bpkg.create:config.bin.lib=static
+bpkg.create:config.bin.liba.lib="shared static"
+?sys:libicuuc
+?sys:libicui18n
+\
+#bindist-rhel-build-error-email: builds@codesynthesis.com
+
+# Note: use static runtime since the DLL runtime is not universally
+# pre-installed.
+#
+bindist-windows-builds: bindist
+bindist-windows-build-include: windows*-**
+bindist-windows-build-exclude: **
+bindist-windows-build-config:
+\
++bpkg.bindist.archive:
++bbot.bindist.upload:
+bpkg.bindist.archive:--recursive=auto
+bpkg.bindist.archive:--archive-lang-impl=cc=
+bpkg.bindist.archive:config.install.relocatable=true
+bpkg.create:config.bin.lib=static
+bpkg.create:config.bin.liba.lib="shared static"
+bpkg.create:config.cc.coptions+="/MT"
+b.create:config.cc.coptions="/W2 /O2"
+\
+#bindist-windows-build-error-email: builds@codesynthesis.com
+
+# Note that /usr/lib/libc++.1.dylib is pre-installed and appears to be
+# reasonably compatible (even forward-compatible) so we don't bother
+# with linking it statically for now.
+#
+bindist-macos-builds: bindist
+bindist-macos-build-include: macos*-**
+bindist-macos-build-exclude: **
+bindist-macos-build-config:
+\
++bpkg.bindist.archive:
++bbot.bindist.upload:
+bpkg.bindist.archive:--recursive=auto
+bpkg.bindist.archive:--archive-lang-impl=cc=
+bpkg.bindist.archive:config.install.relocatable=true
+bpkg.create:config.bin.lib=static
+bpkg.create:config.bin.liba.lib="shared static"
+b.create:config.cc.coptions="-Wall -O3"
+\
+#bindist-macos-build-error-email: builds@codesynthesis.com
+
+# Generic linux package (built using oldest Debian we support).
+#
+# Note: update glibc version if changing build configuration.
+#
+bindist-linux-glibc2.31-builds: bindist
+bindist-linux-glibc2.31-build-include: linux_debian_11-gcc_10.2-bindist
+bindist-linux-glibc2.31-build-exclude: **
+bindist-linux-glibc2.31-build-config:
+\
++bpkg.bindist.archive:
++bbot.bindist.upload:
+bpkg.bindist.archive:--recursive=auto
+bpkg.bindist.archive:--archive-no-os
+bpkg.bindist.archive:--archive-lang-impl=cc=
+bpkg.bindist.archive:--archive-build-meta=+linux-glibc2.31
+bpkg.bindist.archive:config.install.relocatable=true
+bpkg.create:config.bin.lib=static
+bpkg.create:config.bin.liba.lib="shared static"
+config.cc.loptions+="-static-libstdc++ -static-libgcc"
+\
+#bindist-linux-glibc2.31-build-error-email: builds@codesynthesis.com
diff --git a/xsd/xsd/cxx/elements.cxx b/xsd/xsd/cxx/elements.cxx
index e914f9d..02a768e 100644
--- a/xsd/xsd/cxx/elements.cxx
+++ b/xsd/xsd/cxx/elements.cxx
@@ -102,6 +102,36 @@ namespace CXX
L"xor",
L"xor_eq"
};
+
+ // Note: excluding "identifiers with special meaning" in certain contexts
+ // ("final", "override") since they shouldn't cause any issues.
+ //
+ wchar_t const* keywords_cxx11[] = {
+ L"alignas",
+ L"alignof",
+ L"char16_t",
+ L"char32_t",
+ L"constexpr",
+ L"decltype",
+ L"noexcept",
+ L"nullptr",
+ L"static_assert",
+ L"thread_local"
+ };
+
+ // Note: excluding "identifiers with special meaning" in certain contexts
+ // ("import", "module") since they shouldn't cause any issues.
+ //
+ wchar_t const* keywords_cxx20[] = {
+ L"char8_t",
+ L"concept",
+ L"consteval",
+ L"constinit",
+ L"co_await",
+ L"co_return",
+ L"co_yield",
+ L"requires"
+ };
}
// Context
@@ -268,8 +298,21 @@ namespace CXX
// Populate the keyword set.
//
- for (size_t i (0); i < sizeof (keywords) / sizeof (char*); ++i)
+ for (size_t i (0); i < sizeof (keywords) / sizeof (wchar_t*); ++i)
keyword_set_.insert (keywords[i]);
+
+ if (std >= cxx_version::cxx11)
+ {
+ for (size_t i (0); i < sizeof (keywords_cxx11) / sizeof (wchar_t*); ++i)
+ keyword_set_.insert (keywords_cxx11[i]);
+ }
+
+ if (std >= cxx_version::cxx20)
+ {
+ for (size_t i (0); i < sizeof (keywords_cxx20) / sizeof (wchar_t*); ++i)
+ keyword_set_.insert (keywords_cxx20[i]);
+ }
+
}
String Context::
diff --git a/xsd/xsd/cxx/option-types.cxx b/xsd/xsd/cxx/option-types.cxx
index ad8a3c9..8744d7f 100644
--- a/xsd/xsd/cxx/option-types.cxx
+++ b/xsd/xsd/cxx/option-types.cxx
@@ -17,7 +17,11 @@ namespace CXX
static const char* cxx_version_[] =
{
"c++98",
- "c++11"
+ "c++11",
+ "c++14",
+ "c++17",
+ "c++20",
+ "c++23",
};
string cxx_version::
@@ -38,6 +42,14 @@ namespace CXX
v = cxx_version::cxx98;
else if (s == "c++11")
v = cxx_version::cxx11;
+ else if (s == "c++14")
+ v = cxx_version::cxx14;
+ else if (s == "c++17")
+ v = cxx_version::cxx17;
+ else if (s == "c++20")
+ v = cxx_version::cxx20;
+ else if (s == "c++23")
+ v = cxx_version::cxx23;
else
is.setstate (istream::failbit);
}
diff --git a/xsd/xsd/cxx/option-types.hxx b/xsd/xsd/cxx/option-types.hxx
index bbb15b3..98a493a 100644
--- a/xsd/xsd/cxx/option-types.hxx
+++ b/xsd/xsd/cxx/option-types.hxx
@@ -14,10 +14,14 @@ namespace CXX
enum value
{
cxx98,
- cxx11
+ cxx11,
+ cxx14,
+ cxx17,
+ cxx20,
+ cxx23
};
- cxx_version (value v = value (0)) : v_ (v) {}
+ cxx_version (value v) : v_ (v) {}
operator value () const {return v_;}
std::string
diff --git a/xsd/xsd/cxx/options.cli b/xsd/xsd/cxx/options.cli
index 2c50f19..1be7607 100644
--- a/xsd/xsd/cxx/options.cli
+++ b/xsd/xsd/cxx/options.cli
@@ -15,17 +15,19 @@ namespace CXX
{
// Language.
//
- cxx_version --std = cxx_version::cxx98
+ cxx_version --std = cxx_version::cxx11
{
"<version>",
"Specify the C++ standard that the generated code should conform to.
- Valid values are \cb{c++98} (default) and \cb{c++11}.
+ Valid values are \cb{c++98}, \cb{c++11} (default), \cb{c++14},
+ \cb{c++17}, \cb{c++20}, and \cb{c++23}.
The C++ standard affects various aspects of the generated code that
are discussed in more detail in various mapping-specific
documentation. Overall, when C++11 is selected, the generated
code relies on the move semantics and uses \cb{std::unique_ptr}
- instead of deprecated \cb{std::auto_ptr}.
+ instead of deprecated \cb{std::auto_ptr}. Currently, there is no
+ difference between the C++11 and the later standards modes.
When the C++11 mode is selected, you normally don't need to
perform any extra steps other than enable C++11 in your C++
@@ -498,7 +500,7 @@ namespace CXX
generated files on the main schema file as well as all the schema
files that it includes/imports, transitively. This dependency file
is then normally included into the main \cb{makefile} to implement
- automatic dependency tracking.
+ automatic dependency tracking. See also the \cb{--dep-*} options.
Note also that automatic dependency generation is not supported in
the file-per-type mode (\cb{--file-per-type}). In this case, all
@@ -534,8 +536,16 @@ namespace CXX
NarrowString --dep-suffix = ".d"
{
"<suffix>",
- "Use the provided <suffix> instead of the default \cb{.d} to
- construct the name of the dependency file."
+ "Use <suffix> instead of the default \cb{.d} to construct the name of
+ the dependency file. See also \cb{--dep-file}."
+ };
+
+ NarrowString --dep-file
+ {
+ "<path>",
+ "Use <path> as the generated dependency file path instead of deriving
+ it from the input file name. Write the dependency information to
+ \cb{stdout} if <path> is \cb{-}. See also \cb{--dep-regex}."
};
NarrowString --dep-regex
diff --git a/xsd/xsd/cxx/parser/generator.cxx b/xsd/xsd/cxx/parser/generator.cxx
index 91af898..b1acdbb 100644
--- a/xsd/xsd/cxx/parser/generator.cxx
+++ b/xsd/xsd/cxx/parser/generator.cxx
@@ -77,19 +77,19 @@ namespace CXX
"// along with this program; if not, write to the Free Software\n"
"// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
"//\n"
- "// In addition, as a special exception, Code Synthesis Tools CC gives\n"
- "// permission to link this program with the Xerces-C++ library (or with\n"
- "// modified versions of Xerces-C++ that use the same license as Xerces-C++),\n"
- "// and distribute linked combinations including the two. You must obey\n"
- "// the GNU General Public License version 2 in all respects for all of\n"
- "// the code used other than Xerces-C++. If you modify this copy of the\n"
- "// program, you may extend this exception to your version of the program,\n"
- "// but you are not obligated to do so. If you do not wish to do so, delete\n"
- "// this exception statement from your version.\n"
+ "// In addition, as a special exception, Code Synthesis gives permission\n"
+ "// to link this program with the Xerces-C++ library (or with modified\n"
+ "// versions of Xerces-C++ that use the same license as Xerces-C++), and\n"
+ "// distribute linked combinations including the two. You must obey the GNU\n"
+ "// General Public License version 2 in all respects for all of the code\n"
+ "// used other than Xerces-C++. If you modify this copy of the program, you\n"
+ "// may extend this exception to your version of the program, but you are\n"
+ "// not obligated to do so. If you do not wish to do so, delete this\n"
+ "// exception statement from your version.\n"
"//\n"
- "// Furthermore, Code Synthesis Tools CC makes a special exception for\n"
- "// the Free/Libre and Open Source Software (FLOSS) which is described\n"
- "// in the accompanying FLOSSE file.\n"
+ "// Furthermore, Code Synthesis makes a special exception for the Free/Libre\n"
+ "// and Open Source Software (FLOSS) which is described in the accompanying\n"
+ "// FLOSSE file.\n"
"//\n\n";
char const copyright_proprietary[] =
@@ -98,8 +98,7 @@ namespace CXX
"// This program was generated by CodeSynthesis XSD, an XML Schema\n"
"// to C++ data binding compiler, in the Proprietary License mode.\n"
"// You should have received a proprietary license from Code Synthesis\n"
- "// Tools CC prior to generating this code. See the license text for\n"
- "// conditions.\n"
+ "// prior to generating this code. See the license text for conditions.\n"
"//\n\n";
char const copyright_impl[] =
@@ -232,8 +231,11 @@ namespace CXX
throw Failed ();
}
+ bool gen_cxx (!ops.file_list_only ());
+
// Process names.
//
+ if (gen_cxx)
{
NameProcessor proc;
proc.process (ops, schema, file_path, string_literal_map);
@@ -245,7 +247,7 @@ namespace CXX
// Compute state machine info.
//
- if (validation)
+ if (gen_cxx && validation)
{
StateProcessor proc;
proc.process (schema, file_path);
@@ -254,6 +256,7 @@ namespace CXX
// Read-in type maps.
//
TypeMap::Namespaces type_map;
+ if (gen_cxx)
{
using namespace TypeMap;
@@ -376,6 +379,7 @@ namespace CXX
// Process types.
//
+ if (gen_cxx)
{
TypeProcessor proc;
proc.process (ops, schema, gen_driver, type_map);
@@ -559,135 +563,165 @@ namespace CXX
if (impl)
{
- if (!ops.force_overwrite ())
+ if (gen_cxx)
{
- WideInputFileStream tmp (
- hxx_impl_path.string ().c_str (), ios_base::in);
+ if (!ops.force_overwrite ())
+ {
+ WideInputFileStream tmp (
+ hxx_impl_path.string ().c_str (), ios_base::in);
- if (tmp.is_open ())
+ if (tmp.is_open ())
+ {
+ wcerr << hxx_impl_path << ": error: cowardly refusing to " <<
+ "overwrite an existing file" << endl;
+ throw Failed ();
+ }
+
+ tmp.close ();
+ }
+
+ hxx_impl.open (hxx_impl_path.string ().c_str (), ios_base::out);
+
+ if (!hxx_impl.is_open ())
{
- wcerr << hxx_impl_path << ": error: cowardly refusing to " <<
- "overwrite an existing file" << endl;
+ wcerr << hxx_impl_path << ": error: unable to open in write mode"
+ << endl;
throw Failed ();
}
- tmp.close ();
+ unlinks.add (hxx_impl_path);
}
- hxx_impl.open (hxx_impl_path.string ().c_str (), ios_base::out);
+ file_list.push_back (hxx_impl_path.string ());
- if (!hxx_impl.is_open ())
+ if (gen_cxx)
{
- wcerr << hxx_impl_path << ": error: unable to open in write mode"
- << endl;
- throw Failed ();
- }
+ if (!ops.force_overwrite ())
+ {
+ WideInputFileStream tmp (
+ cxx_impl_path.string ().c_str (), ios_base::in);
- unlinks.add (hxx_impl_path);
- file_list.push_back (hxx_impl_path.string ());
+ if (tmp.is_open ())
+ {
+ wcerr << cxx_impl_path << ": error: cowardly refusing to " <<
+ "overwrite an existing file" << endl;
+ throw Failed ();
+ }
- if (!ops.force_overwrite ())
- {
- WideInputFileStream tmp (
- cxx_impl_path.string ().c_str (), ios_base::in);
+ tmp.close ();
+ }
- if (tmp.is_open ())
+ cxx_impl.open (cxx_impl_path.string ().c_str (), ios_base::out);
+
+ if (!cxx_impl.is_open ())
{
- wcerr << cxx_impl_path << ": error: cowardly refusing to " <<
- "overwrite an existing file" << endl;
+ wcerr << cxx_impl_path << ": error: unable to open in write mode"
+ << endl;
throw Failed ();
}
- tmp.close ();
- }
-
- cxx_impl.open (cxx_impl_path.string ().c_str (), ios_base::out);
-
- if (!cxx_impl.is_open ())
- {
- wcerr << cxx_impl_path << ": error: unable to open in write mode"
- << endl;
- throw Failed ();
+ unlinks.add (cxx_impl_path);
}
- unlinks.add (cxx_impl_path);
file_list.push_back (cxx_impl_path.string ());
}
if (driver)
{
- if (!ops.force_overwrite ())
+ if (gen_cxx)
{
- WideInputFileStream tmp (
- cxx_driver_path.string ().c_str (), ios_base::in);
-
- if (tmp.is_open ())
+ if (!ops.force_overwrite ())
{
- wcerr << cxx_driver_path << ": error: cowardly refusing to " <<
- "overwrite an existing file" << endl;
- throw Failed ();
+ WideInputFileStream tmp (
+ cxx_driver_path.string ().c_str (), ios_base::in);
+
+ if (tmp.is_open ())
+ {
+ wcerr << cxx_driver_path << ": error: cowardly refusing to " <<
+ "overwrite an existing file" << endl;
+ throw Failed ();
+ }
+
+ tmp.close ();
}
- tmp.close ();
- }
+ cxx_driver.open (cxx_driver_path.string ().c_str (), ios_base::out);
- cxx_driver.open (cxx_driver_path.string ().c_str (), ios_base::out);
+ if (!cxx_driver.is_open ())
+ {
+ wcerr << cxx_driver_path << ": error: unable to open in write " <<
+ "mode" << endl;
+ throw Failed ();
+ }
- if (!cxx_driver.is_open ())
- {
- wcerr << cxx_driver_path << ": error: unable to open in write " <<
- "mode" << endl;
- throw Failed ();
+ unlinks.add (cxx_driver_path);
}
- unlinks.add (cxx_driver_path);
file_list.push_back (cxx_driver_path.string ());
}
// Open the skel files.
//
- WideOutputFileStream hxx (hxx_path.string ().c_str (), ios_base::out);
+ WideOutputFileStream hxx;
WideOutputFileStream ixx;
WideOutputFileStream cxx;
- if (!hxx.is_open ())
+ if (gen_cxx)
{
- wcerr << hxx_path << ": error: unable to open in write mode" << endl;
- throw Failed ();
+ hxx.open (hxx_path.string ().c_str (), ios_base::out);
+
+ if (!hxx.is_open ())
+ {
+ wcerr << hxx_path << ": error: unable to open in write mode" << endl;
+ throw Failed ();
+ }
+
+ unlinks.add (hxx_path);
}
- unlinks.add (hxx_path);
file_list.push_back (hxx_path.string ());
if (inline_)
{
- ixx.open (ixx_path.string ().c_str (), ios_base::out);
-
- if (!ixx.is_open ())
+ if (gen_cxx)
{
- wcerr << ixx_path << ": error: unable to open in write mode" << endl;
- throw Failed ();
+ ixx.open (ixx_path.string ().c_str (), ios_base::out);
+
+ if (!ixx.is_open ())
+ {
+ wcerr << ixx_path << ": error: unable to open in write mode"
+ << endl;
+ throw Failed ();
+ }
+
+ unlinks.add (ixx_path);
}
- unlinks.add (ixx_path);
file_list.push_back (ixx_path.string ());
}
-
if (source)
{
- cxx.open (cxx_path.string ().c_str (), ios_base::out);
-
- if (!cxx.is_open ())
+ if (gen_cxx)
{
- wcerr << cxx_path << ": error: unable to open in write mode" << endl;
- throw Failed ();
+ cxx.open (cxx_path.string ().c_str (), ios_base::out);
+
+ if (!cxx.is_open ())
+ {
+ wcerr << cxx_path << ": error: unable to open in write mode"
+ << endl;
+ throw Failed ();
+ }
+
+ unlinks.add (cxx_path);
}
- unlinks.add (cxx_path);
file_list.push_back (cxx_path.string ());
}
+ if (!gen_cxx)
+ return 0;
+
// Print copyright and license.
//
char const* copyright (
diff --git a/xsd/xsd/cxx/tree/generator.cxx b/xsd/xsd/cxx/tree/generator.cxx
index 3233248..9782b4d 100644
--- a/xsd/xsd/cxx/tree/generator.cxx
+++ b/xsd/xsd/cxx/tree/generator.cxx
@@ -54,6 +54,8 @@ using namespace XSDFrontend::SemanticGraph;
//
//
+typedef std::wostream WideOutputStream;
+
typedef std::wifstream WideInputFileStream;
typedef std::wofstream WideOutputFileStream;
@@ -80,19 +82,19 @@ namespace CXX
"// along with this program; if not, write to the Free Software\n"
"// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
"//\n"
- "// In addition, as a special exception, Code Synthesis Tools CC gives\n"
- "// permission to link this program with the Xerces-C++ library (or with\n"
- "// modified versions of Xerces-C++ that use the same license as Xerces-C++),\n"
- "// and distribute linked combinations including the two. You must obey\n"
- "// the GNU General Public License version 2 in all respects for all of\n"
- "// the code used other than Xerces-C++. If you modify this copy of the\n"
- "// program, you may extend this exception to your version of the program,\n"
- "// but you are not obligated to do so. If you do not wish to do so, delete\n"
- "// this exception statement from your version.\n"
+ "// In addition, as a special exception, Code Synthesis gives permission\n"
+ "// to link this program with the Xerces-C++ library (or with modified\n"
+ "// versions of Xerces-C++ that use the same license as Xerces-C++), and\n"
+ "// distribute linked combinations including the two. You must obey the GNU\n"
+ "// General Public License version 2 in all respects for all of the code\n"
+ "// used other than Xerces-C++. If you modify this copy of the program, you\n"
+ "// may extend this exception to your version of the program, but you are\n"
+ "// not obligated to do so. If you do not wish to do so, delete this\n"
+ "// exception statement from your version.\n"
"//\n"
- "// Furthermore, Code Synthesis Tools CC makes a special exception for\n"
- "// the Free/Libre and Open Source Software (FLOSS) which is described\n"
- "// in the accompanying FLOSSE file.\n"
+ "// Furthermore, Code Synthesis makes a special exception for the Free/Libre\n"
+ "// and Open Source Software (FLOSS) which is described in the accompanying\n"
+ "// FLOSSE file.\n"
"//\n\n";
char const copyright_proprietary[] =
@@ -101,8 +103,7 @@ namespace CXX
"// This program was generated by CodeSynthesis XSD, an XML Schema\n"
"// to C++ data binding compiler, in the Proprietary License mode.\n"
"// You should have received a proprietary license from Code Synthesis\n"
- "// Tools CC prior to generating this code. See the license text for\n"
- "// conditions.\n"
+ "// prior to generating this code. See the license text for conditions.\n"
"//\n\n";
}
@@ -232,7 +233,7 @@ namespace CXX
throw Failed ();
}
- bool gen_cxx (!ops.generate_dep_only ());
+ bool gen_cxx (!ops.generate_dep_only () && !ops.file_list_only ());
// Process ordered types.
//
@@ -345,9 +346,13 @@ namespace CXX
? "#^(.+?)(\\.[^./\\\\]+)?$#$1" + fwd_suffix + "#"
: ops.fwd_regex ());
- Regex dep_expr (ops.dep_regex ().empty ()
- ? "#^(.+?)(\\.[^./\\\\]+)?$#$1" + dep_suffix + "#"
- : ops.dep_regex ());
+ // @@ This will blow up if --dep-file value contains backslashes (e.g.,
+ // it's a Windows path).
+ //
+ Regex dep_expr (
+ ops.dep_regex_specified () ? ops.dep_regex () :
+ ops.dep_file_specified () ? "#.+#" + ops.dep_file () + "#" :
+ "#^(.+?)(\\.[^./\\\\]+)?$#$1" + dep_suffix + "#");
if (header && !hxx_expr.match (name))
{
@@ -397,7 +402,7 @@ namespace CXX
Path hxx_path (hxx_name);
Path ixx_path (ixx_name);
Path fwd_path (fwd_name);
- Path dep_path (dep_name);
+ Path dep_path (dep_name != "-" ? dep_name : NarrowString ());
Paths cxx_paths;
if (source)
@@ -458,10 +463,11 @@ namespace CXX
if (!out_dir.empty ())
{
- hxx_path = out_dir / hxx_path;
- ixx_path = out_dir / ixx_path;
- fwd_path = out_dir / fwd_path;
- dep_path = out_dir / dep_path;
+ if (!hxx_path.empty ()) hxx_path = out_dir / hxx_path;
+ if (!ixx_path.empty ()) ixx_path = out_dir / ixx_path;
+ if (!fwd_path.empty ()) fwd_path = out_dir / fwd_path;
+ if (!dep_path.empty () &&
+ !dep_path.absolute ()) dep_path = out_dir / dep_path;
for (Paths::iterator i (cxx_paths.begin ());
i != cxx_paths.end (); ++i)
@@ -473,93 +479,116 @@ namespace CXX
WideOutputFileStream hxx;
WideOutputFileStream ixx;
WideOutputFileStream fwd;
- WideOutputFileStream dep;
+ WideOutputFileStream depf; // See dep below.
WideOutputFileStreams cxx;
// DEP
//
if (gen_dep)
{
- dep.open (dep_path.string ().c_str (), ios_base::out);
-
- if (!dep.is_open ())
+ if (!dep_path.empty ())
{
- wcerr << dep_path << ": error: unable to open in write mode" << endl;
- throw Failed ();
+ depf.open (dep_path.string ().c_str (), ios_base::out);
+
+ if (!depf.is_open ())
+ {
+ wcerr << dep_path << ": error: unable to open in write mode"
+ << endl;
+ throw Failed ();
+ }
+
+ unlinks.add (dep_path);
}
- unlinks.add (dep_path);
- file_list.push_back (dep_path.string ());
+ // Note: not adding to file_list.
}
+ WideOutputStream& dep (gen_dep && !dep_path.empty () ? depf : wcout);
+
// FWD
//
- if (gen_cxx && forward)
+ if (forward)
{
- fwd.open (fwd_path.string ().c_str (), ios_base::out);
-
- if (!fwd.is_open ())
+ if (gen_cxx)
{
- wcerr << fwd_path << ": error: unable to open in write mode" << endl;
- throw Failed ();
+ fwd.open (fwd_path.string ().c_str (), ios_base::out);
+
+ if (!fwd.is_open ())
+ {
+ wcerr << fwd_path << ": error: unable to open in write mode" << endl;
+ throw Failed ();
+ }
+
+ unlinks.add (fwd_path);
}
- unlinks.add (fwd_path);
file_list.push_back (fwd_path.string ());
}
// HXX
//
- if (gen_cxx && header)
+ if (header)
{
- hxx.open (hxx_path.string ().c_str (), ios_base::out);
-
- if (!hxx.is_open ())
+ if (gen_cxx)
{
- wcerr << hxx_path << ": error: unable to open in write mode" << endl;
- throw Failed ();
+ hxx.open (hxx_path.string ().c_str (), ios_base::out);
+
+ if (!hxx.is_open ())
+ {
+ wcerr << hxx_path << ": error: unable to open in write mode" << endl;
+ throw Failed ();
+ }
+
+ unlinks.add (hxx_path);
}
- unlinks.add (hxx_path);
file_list.push_back (hxx_path.string ());
}
// IXX
//
- if (gen_cxx && inline_)
+ if (inline_)
{
- ixx.open (ixx_path.string ().c_str (), ios_base::out);
-
- if (!ixx.is_open ())
+ if (gen_cxx)
{
- wcerr << ixx_path << ": error: unable to open in write mode" << endl;
- throw Failed ();
+ ixx.open (ixx_path.string ().c_str (), ios_base::out);
+
+ if (!ixx.is_open ())
+ {
+ wcerr << ixx_path << ": error: unable to open in write mode" << endl;
+ throw Failed ();
+ }
+
+ unlinks.add (ixx_path);
}
- unlinks.add (ixx_path);
file_list.push_back (ixx_path.string ());
}
// CXX
//
- if (gen_cxx && source)
+ if (source)
{
for (Paths::iterator i (cxx_paths.begin ());
i != cxx_paths.end (); ++i)
{
- shared_ptr<WideOutputFileStream> s (
- new (shared) WideOutputFileStream (
- i->string ().c_str (), ios_base::out));
-
- if (!s->is_open ())
+ if (gen_cxx)
{
- wcerr << *i << ": error: unable to open in write mode" << endl;
- throw Failed ();
+ shared_ptr<WideOutputFileStream> s (
+ new (shared) WideOutputFileStream (
+ i->string ().c_str (), ios_base::out));
+
+ if (!s->is_open ())
+ {
+ wcerr << *i << ": error: unable to open in write mode" << endl;
+ throw Failed ();
+ }
+
+ cxx.push_back (s);
+ unlinks.add (*i);
}
- unlinks.add (*i);
file_list.push_back (i->string ());
- cxx.push_back (s);
}
}
@@ -668,7 +697,8 @@ namespace CXX
i != cxx_paths.end (); ++i)
target += " \\\n" + i->string ();
- target += " \\\n" + dep_path.string ();
+ if (!dep_path.empty ())
+ target += " \\\n" + dep_path.string ();
}
dep << target.c_str () << ':';
diff --git a/xsd/xsd/options.cli b/xsd/xsd/options.cli
index 6c327a4..3153be9 100644
--- a/xsd/xsd/options.cli
+++ b/xsd/xsd/options.cli
@@ -277,12 +277,19 @@ class options = 0
NarrowString --file-list
{
"<file>",
- "Write a list of generated C++ files to <file>. This option is primarily
- useful in the file-per-type compilation mode (\cb{--file-per-type}) to
- create a list of generated C++ files, for example, as a makefile
- fragment."
+ "Write a list of generated C++ files to <file> or to \cb{stdout} if
+ <file> is \cb{-}. This option is primarily useful in the file-per-type
+ compilation mode (\cb{--file-per-type}) to create a list of generated
+ C++ files, for example, as a makefile fragment."
};
+ bool --file-list-only
+ {
+ "Only write the list of C++ files that would be generated without
+ actually generating them. This option only makes sense together with
+ \cb{--file-list}."
+ }
+
NarrowString --file-list-prologue
{
"<text>",
diff --git a/xsd/xsd/pregenerated/xsd/cxx/options.cxx b/xsd/xsd/pregenerated/xsd/cxx/options.cxx
index f4d3fa7..9eea3a9 100644
--- a/xsd/xsd/pregenerated/xsd/cxx/options.cxx
+++ b/xsd/xsd/pregenerated/xsd/cxx/options.cxx
@@ -184,6 +184,56 @@ namespace cli
}
};
+ template <typename K, typename V, typename C>
+ struct parser<std::multimap<K, V, C> >
+ {
+ static void
+ parse (std::multimap<K, V, C>& m, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ {
+ std::size_t pos (s.position ());
+ std::string ov (s.next ());
+ std::string::size_type p = ov.find ('=');
+
+ K k = K ();
+ V v = V ();
+ std::string kstr (ov, 0, p);
+ std::string vstr (ov, (p != std::string::npos ? p + 1 : ov.size ()));
+
+ int ac (2);
+ char* av[] =
+ {
+ const_cast<char*> (o),
+ 0
+ };
+
+ bool dummy;
+ if (!kstr.empty ())
+ {
+ av[1] = const_cast<char*> (kstr.c_str ());
+ argv_scanner s (0, ac, av, false, pos);
+ parser<K>::parse (k, dummy, s);
+ }
+
+ if (!vstr.empty ())
+ {
+ av[1] = const_cast<char*> (vstr.c_str ());
+ argv_scanner s (0, ac, av, false, pos);
+ parser<V>::parse (v, dummy, s);
+ }
+
+ m.insert (typename std::multimap<K, V, C>::value_type (k, v));
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
template <typename X, typename T, T X::*M>
void
thunk (X& x, scanner& s)
@@ -216,7 +266,7 @@ namespace CXX
options::
options ()
- : std_ (cxx_version::cxx98),
+ : std_ (cxx_version::cxx11),
std_specified_ (false),
char_type_ ("char"),
char_type_specified_ (false),
@@ -311,6 +361,8 @@ namespace CXX
dep_target_specified_ (false),
dep_suffix_ (".d"),
dep_suffix_specified_ (false),
+ dep_file_ (),
+ dep_file_specified_ (false),
dep_regex_ (),
dep_regex_specified_ (false)
{
@@ -477,8 +529,11 @@ namespace CXX
os << "--dep-target <target> Change the target of the dependency rule." << ::std::endl;
- os << "--dep-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
- << " .d to construct the name of the dependency file." << ::std::endl;
+ os << "--dep-suffix <suffix> Use <suffix> instead of the default .d to" << ::std::endl
+ << " construct the name of the dependency file." << ::std::endl;
+
+ os << "--dep-file <path> Use <path> as the generated dependency file path" << ::std::endl
+ << " instead of deriving it from the input file name." << ::std::endl;
os << "--dep-regex <regex> Use the provided expression to construct the name" << ::std::endl
<< " of the dependency file." << ::std::endl;
@@ -646,6 +701,9 @@ namespace CXX
_cli_options_map_["--dep-suffix"] =
&::cli::thunk< options, NarrowString, &options::dep_suffix_,
&options::dep_suffix_specified_ >;
+ _cli_options_map_["--dep-file"] =
+ &::cli::thunk< options, NarrowString, &options::dep_file_,
+ &options::dep_file_specified_ >;
_cli_options_map_["--dep-regex"] =
&::cli::thunk< options, NarrowString, &options::dep_regex_,
&options::dep_regex_specified_ >;
diff --git a/xsd/xsd/pregenerated/xsd/cxx/options.hxx b/xsd/xsd/pregenerated/xsd/cxx/options.hxx
index b01027a..085aa4c 100644
--- a/xsd/xsd/pregenerated/xsd/cxx/options.hxx
+++ b/xsd/xsd/pregenerated/xsd/cxx/options.hxx
@@ -313,6 +313,12 @@ namespace CXX
dep_suffix_specified () const;
const NarrowString&
+ dep_file () const;
+
+ bool
+ dep_file_specified () const;
+
+ const NarrowString&
dep_regex () const;
bool
@@ -428,6 +434,8 @@ namespace CXX
bool dep_target_specified_;
NarrowString dep_suffix_;
bool dep_suffix_specified_;
+ NarrowString dep_file_;
+ bool dep_file_specified_;
NarrowString dep_regex_;
bool dep_regex_specified_;
};
diff --git a/xsd/xsd/pregenerated/xsd/cxx/options.ixx b/xsd/xsd/pregenerated/xsd/cxx/options.ixx
index e8ba2fb..8266e31 100644
--- a/xsd/xsd/pregenerated/xsd/cxx/options.ixx
+++ b/xsd/xsd/pregenerated/xsd/cxx/options.ixx
@@ -585,6 +585,18 @@ namespace CXX
}
inline const NarrowString& options::
+ dep_file () const
+ {
+ return this->dep_file_;
+ }
+
+ inline bool options::
+ dep_file_specified () const
+ {
+ return this->dep_file_specified_;
+ }
+
+ inline const NarrowString& options::
dep_regex () const
{
return this->dep_regex_;
diff --git a/xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx b/xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx
index 04cb7ae..60667ac 100644
--- a/xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx
+++ b/xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx
@@ -184,6 +184,56 @@ namespace cli
}
};
+ template <typename K, typename V, typename C>
+ struct parser<std::multimap<K, V, C> >
+ {
+ static void
+ parse (std::multimap<K, V, C>& m, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ {
+ std::size_t pos (s.position ());
+ std::string ov (s.next ());
+ std::string::size_type p = ov.find ('=');
+
+ K k = K ();
+ V v = V ();
+ std::string kstr (ov, 0, p);
+ std::string vstr (ov, (p != std::string::npos ? p + 1 : ov.size ()));
+
+ int ac (2);
+ char* av[] =
+ {
+ const_cast<char*> (o),
+ 0
+ };
+
+ bool dummy;
+ if (!kstr.empty ())
+ {
+ av[1] = const_cast<char*> (kstr.c_str ());
+ argv_scanner s (0, ac, av, false, pos);
+ parser<K>::parse (k, dummy, s);
+ }
+
+ if (!vstr.empty ())
+ {
+ av[1] = const_cast<char*> (vstr.c_str ());
+ argv_scanner s (0, ac, av, false, pos);
+ parser<V>::parse (v, dummy, s);
+ }
+
+ m.insert (typename std::multimap<K, V, C>::value_type (k, v));
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
template <typename X, typename T, T X::*M>
void
thunk (X& x, scanner& s)
diff --git a/xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx b/xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx
index 60ddeb0..17214c1 100644
--- a/xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx
+++ b/xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx
@@ -184,6 +184,56 @@ namespace cli
}
};
+ template <typename K, typename V, typename C>
+ struct parser<std::multimap<K, V, C> >
+ {
+ static void
+ parse (std::multimap<K, V, C>& m, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ {
+ std::size_t pos (s.position ());
+ std::string ov (s.next ());
+ std::string::size_type p = ov.find ('=');
+
+ K k = K ();
+ V v = V ();
+ std::string kstr (ov, 0, p);
+ std::string vstr (ov, (p != std::string::npos ? p + 1 : ov.size ()));
+
+ int ac (2);
+ char* av[] =
+ {
+ const_cast<char*> (o),
+ 0
+ };
+
+ bool dummy;
+ if (!kstr.empty ())
+ {
+ av[1] = const_cast<char*> (kstr.c_str ());
+ argv_scanner s (0, ac, av, false, pos);
+ parser<K>::parse (k, dummy, s);
+ }
+
+ if (!vstr.empty ())
+ {
+ av[1] = const_cast<char*> (vstr.c_str ());
+ argv_scanner s (0, ac, av, false, pos);
+ parser<V>::parse (v, dummy, s);
+ }
+
+ m.insert (typename std::multimap<K, V, C>::value_type (k, v));
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
template <typename X, typename T, T X::*M>
void
thunk (X& x, scanner& s)
diff --git a/xsd/xsd/pregenerated/xsd/options.cxx b/xsd/xsd/pregenerated/xsd/options.cxx
index 34b0ff5..3022ec4 100644
--- a/xsd/xsd/pregenerated/xsd/options.cxx
+++ b/xsd/xsd/pregenerated/xsd/options.cxx
@@ -27,7 +27,7 @@ namespace cli
// unknown_option
//
unknown_option::
- ~unknown_option () throw ()
+ ~unknown_option () noexcept
{
}
@@ -38,7 +38,7 @@ namespace cli
}
const char* unknown_option::
- what () const throw ()
+ what () const noexcept
{
return "unknown option";
}
@@ -46,7 +46,7 @@ namespace cli
// unknown_argument
//
unknown_argument::
- ~unknown_argument () throw ()
+ ~unknown_argument () noexcept
{
}
@@ -57,7 +57,7 @@ namespace cli
}
const char* unknown_argument::
- what () const throw ()
+ what () const noexcept
{
return "unknown argument";
}
@@ -65,7 +65,7 @@ namespace cli
// missing_value
//
missing_value::
- ~missing_value () throw ()
+ ~missing_value () noexcept
{
}
@@ -76,7 +76,7 @@ namespace cli
}
const char* missing_value::
- what () const throw ()
+ what () const noexcept
{
return "missing option value";
}
@@ -84,7 +84,7 @@ namespace cli
// invalid_value
//
invalid_value::
- ~invalid_value () throw ()
+ ~invalid_value () noexcept
{
}
@@ -99,7 +99,7 @@ namespace cli
}
const char* invalid_value::
- what () const throw ()
+ what () const noexcept
{
return "invalid option value";
}
@@ -113,7 +113,7 @@ namespace cli
}
const char* eos_reached::
- what () const throw ()
+ what () const noexcept
{
return "end of argument stream reached";
}
@@ -121,7 +121,7 @@ namespace cli
// file_io_failure
//
file_io_failure::
- ~file_io_failure () throw ()
+ ~file_io_failure () noexcept
{
}
@@ -132,7 +132,7 @@ namespace cli
}
const char* file_io_failure::
- what () const throw ()
+ what () const noexcept
{
return "unable to open file or read failure";
}
@@ -140,7 +140,7 @@ namespace cli
// unmatched_quote
//
unmatched_quote::
- ~unmatched_quote () throw ()
+ ~unmatched_quote () noexcept
{
}
@@ -151,7 +151,7 @@ namespace cli
}
const char* unmatched_quote::
- what () const throw ()
+ what () const noexcept
{
return "unmatched quote";
}
@@ -677,6 +677,56 @@ namespace cli
}
};
+ template <typename K, typename V, typename C>
+ struct parser<std::multimap<K, V, C> >
+ {
+ static void
+ parse (std::multimap<K, V, C>& m, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ {
+ std::size_t pos (s.position ());
+ std::string ov (s.next ());
+ std::string::size_type p = ov.find ('=');
+
+ K k = K ();
+ V v = V ();
+ std::string kstr (ov, 0, p);
+ std::string vstr (ov, (p != std::string::npos ? p + 1 : ov.size ()));
+
+ int ac (2);
+ char* av[] =
+ {
+ const_cast<char*> (o),
+ 0
+ };
+
+ bool dummy;
+ if (!kstr.empty ())
+ {
+ av[1] = const_cast<char*> (kstr.c_str ());
+ argv_scanner s (0, ac, av, false, pos);
+ parser<K>::parse (k, dummy, s);
+ }
+
+ if (!vstr.empty ())
+ {
+ av[1] = const_cast<char*> (vstr.c_str ());
+ argv_scanner s (0, ac, av, false, pos);
+ parser<V>::parse (v, dummy, s);
+ }
+
+ m.insert (typename std::multimap<K, V, C>::value_type (k, v));
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
template <typename X, typename T, T X::*M>
void
thunk (X& x, scanner& s)
@@ -1046,6 +1096,7 @@ options ()
fat_type_file_ (),
file_list_ (),
file_list_specified_ (false),
+ file_list_only_ (),
file_list_prologue_ (),
file_list_prologue_specified_ (false),
file_list_epilogue_ (),
@@ -1125,7 +1176,11 @@ print_usage (::std::wostream& os, ::cli::usage_para p)
<< " into type files instead of schema files when the" << ::std::endl
<< " --type-file-regex option is specified." << ::std::endl;
- os << "--file-list <file> Write a list of generated C++ files to <file>." << ::std::endl;
+ os << "--file-list <file> Write a list of generated C++ files to <file> or" << ::std::endl
+ << " to stdout if <file> is -." << ::std::endl;
+
+ os << "--file-list-only Only write the list of C++ files that would be" << ::std::endl
+ << " generated without actually generating them." << ::std::endl;
os << "--file-list-prologue <text> Insert <text> at the beginning of the file list." << ::std::endl;
@@ -1201,6 +1256,8 @@ struct _cli_options_map_init
_cli_options_map_["--file-list"] =
&::cli::thunk< options, NarrowString, &options::file_list_,
&options::file_list_specified_ >;
+ _cli_options_map_["--file-list-only"] =
+ &::cli::thunk< options, &options::file_list_only_ >;
_cli_options_map_["--file-list-prologue"] =
&::cli::thunk< options, NarrowString, &options::file_list_prologue_,
&options::file_list_prologue_specified_ >;
diff --git a/xsd/xsd/pregenerated/xsd/options.hxx b/xsd/xsd/pregenerated/xsd/options.hxx
index bdeaa7e..0f4383c 100644
--- a/xsd/xsd/pregenerated/xsd/options.hxx
+++ b/xsd/xsd/pregenerated/xsd/options.hxx
@@ -88,7 +88,7 @@ namespace cli
{
public:
virtual
- ~unknown_option () throw ();
+ ~unknown_option () noexcept;
unknown_option (const std::string& option);
@@ -99,7 +99,7 @@ namespace cli
print (::std::wostream&) const;
virtual const char*
- what () const throw ();
+ what () const noexcept;
private:
std::string option_;
@@ -109,7 +109,7 @@ namespace cli
{
public:
virtual
- ~unknown_argument () throw ();
+ ~unknown_argument () noexcept;
unknown_argument (const std::string& argument);
@@ -120,7 +120,7 @@ namespace cli
print (::std::wostream&) const;
virtual const char*
- what () const throw ();
+ what () const noexcept;
private:
std::string argument_;
@@ -130,7 +130,7 @@ namespace cli
{
public:
virtual
- ~missing_value () throw ();
+ ~missing_value () noexcept;
missing_value (const std::string& option);
@@ -141,7 +141,7 @@ namespace cli
print (::std::wostream&) const;
virtual const char*
- what () const throw ();
+ what () const noexcept;
private:
std::string option_;
@@ -151,7 +151,7 @@ namespace cli
{
public:
virtual
- ~invalid_value () throw ();
+ ~invalid_value () noexcept;
invalid_value (const std::string& option,
const std::string& value,
@@ -170,7 +170,7 @@ namespace cli
print (::std::wostream&) const;
virtual const char*
- what () const throw ();
+ what () const noexcept;
private:
std::string option_;
@@ -185,14 +185,14 @@ namespace cli
print (::std::wostream&) const;
virtual const char*
- what () const throw ();
+ what () const noexcept;
};
class file_io_failure: public exception
{
public:
virtual
- ~file_io_failure () throw ();
+ ~file_io_failure () noexcept;
file_io_failure (const std::string& file);
@@ -203,7 +203,7 @@ namespace cli
print (::std::wostream&) const;
virtual const char*
- what () const throw ();
+ what () const noexcept;
private:
std::string file_;
@@ -213,7 +213,7 @@ namespace cli
{
public:
virtual
- ~unmatched_quote () throw ();
+ ~unmatched_quote () noexcept;
unmatched_quote (const std::string& argument);
@@ -224,7 +224,7 @@ namespace cli
print (::std::wostream&) const;
virtual const char*
- what () const throw ();
+ what () const noexcept;
private:
std::string argument_;
@@ -608,6 +608,9 @@ class options
bool
file_list_specified () const;
+ const bool&
+ file_list_only () const;
+
const NarrowString&
file_list_prologue () const;
@@ -678,6 +681,7 @@ class options
bool fat_type_file_;
NarrowString file_list_;
bool file_list_specified_;
+ bool file_list_only_;
NarrowString file_list_prologue_;
bool file_list_prologue_specified_;
NarrowString file_list_epilogue_;
diff --git a/xsd/xsd/pregenerated/xsd/options.ixx b/xsd/xsd/pregenerated/xsd/options.ixx
index e905544..d87e59c 100644
--- a/xsd/xsd/pregenerated/xsd/options.ixx
+++ b/xsd/xsd/pregenerated/xsd/options.ixx
@@ -495,6 +495,12 @@ file_list_specified () const
return this->file_list_specified_;
}
+inline const bool& options::
+file_list_only () const
+{
+ return this->file_list_only_;
+}
+
inline const NarrowString& options::
file_list_prologue () const
{
diff --git a/xsd/xsd/xsd.cxx b/xsd/xsd/xsd.cxx
index f1d22fc..d2b0faf 100644
--- a/xsd/xsd/xsd.cxx
+++ b/xsd/xsd/xsd.cxx
@@ -196,7 +196,7 @@ main (int argc, char* argv[])
{
o << "The compiler was invoked in the Proprietary License mode. You "
<< "should have\nreceived a proprietary license from Code Synthesis "
- << "Tools CC that entitles\nyou to use it in this mode." << endl;
+ << "that entitles you to\nuse it in this mode." << endl;
}
else
{
@@ -298,6 +298,14 @@ main (int argc, char* argv[])
? static_cast<CXX::options&> (*tree_ops)
: static_cast<CXX::options&> (*parser_ops));
+ // Validate options.
+ //
+ if (common_ops.file_list_only () && !common_ops.file_list_specified ())
+ {
+ e << "error: --file-list-only specified without --file-list" << endl;
+ return 1;
+ }
+
// Disabled warnings.
//
WarningSet disabled_w;
@@ -770,38 +778,43 @@ main (int argc, char* argv[])
try
{
OutputFileStream ofs;
- SemanticGraph::Path path (fl);
+ if (fl != "-")
+ {
+ SemanticGraph::Path path (fl);
- ofs.open (path.string ().c_str (), ios_base::out);
+ ofs.open (path.string ().c_str (), ios_base::out);
- if (!ofs.is_open ())
- {
- wcerr << path << ": error: unable to open in write mode" << endl;
- return 1;
+ if (!ofs.is_open ())
+ {
+ wcerr << path << ": error: unable to open in write mode" << endl;
+ return 1;
+ }
}
+ std::ostream& os (ofs.is_open () ? ofs : cout);
+
NarrowString d (common_ops.file_list_delim ());
expand_nl (d);
if (NarrowString p = common_ops.file_list_prologue ())
{
expand_nl (p);
- ofs << p;
+ os << p;
}
for (FileList::iterator i (file_list.begin ()), e (file_list.end ());
i != e;)
{
- ofs << *i;
+ os << *i;
if (++i != e)
- ofs << d;
+ os << d;
}
if (NarrowString e = common_ops.file_list_epilogue ())
{
expand_nl (e);
- ofs << e;
+ os << e;
}
}
catch (SemanticGraph::InvalidPath const&)