diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-06-18 15:28:15 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-06-18 15:28:15 +0200 |
commit | ef4efbab2664232aa35b0111a6d430d2c67ababd (patch) | |
tree | 8b9666a028f081846341d61d90c4364448388226 /xsde/cxx | |
parent | c2d38a4c6abd15c898492f09b4646eb93a01da69 (diff) |
Initial work on CLI port
Add options files with all the documentation. Move documentation and usage to
use the new approach. Finally get rid of dependency on libbackend-elements.
Diffstat (limited to 'xsde/cxx')
-rw-r--r-- | xsde/cxx/hybrid/generator.cxx | 516 | ||||
-rw-r--r-- | xsde/cxx/hybrid/options.cli | 353 | ||||
-rw-r--r-- | xsde/cxx/options.cli | 515 | ||||
-rw-r--r-- | xsde/cxx/parser/generator.cxx | 347 | ||||
-rw-r--r-- | xsde/cxx/parser/options.cli | 159 | ||||
-rw-r--r-- | xsde/cxx/serializer/generator.cxx | 343 | ||||
-rw-r--r-- | xsde/cxx/serializer/options.cli | 148 |
7 files changed, 1184 insertions, 1197 deletions
diff --git a/xsde/cxx/hybrid/generator.cxx b/xsde/cxx/hybrid/generator.cxx index 4db77ea..3a61c95 100644 --- a/xsde/cxx/hybrid/generator.cxx +++ b/xsde/cxx/hybrid/generator.cxx @@ -17,8 +17,6 @@ #include <cutl/compiler/cxx-indenter.hxx> #include <cutl/compiler/sloc-counter.hxx> -#include <backend-elements/indentation/clip.hxx> - #include <xsd-frontend/semantic-graph.hxx> #include <cxx/hybrid/elements.hxx> @@ -52,7 +50,7 @@ #include <cxx/hybrid/serializer-aggregate-header.hxx> #include <cxx/hybrid/serializer-aggregate-source.hxx> -#include <usage.hxx> +#include <cxx/hybrid/options.hxx> #include "../../../libxsde/xsde/cxx/version.hxx" @@ -61,7 +59,6 @@ using std::wcerr; using std::wcout; using namespace XSDFrontend::SemanticGraph; -namespace Indentation = BackendElements::Indentation; // // @@ -213,515 +210,8 @@ namespace CXX Void Hybrid::Generator:: usage () { - std::wostream& o (wcout); - ::CLI::Indent::Clip< ::CLI::OptionsUsage, WideChar> clip (o); - - o << "--char-encoding <enc>" << endl - << " Specify the character encoding that should be\n" - << " used in the object model. Valid values are 'utf8'\n" - << " (default) and 'iso8859-1'." - << endl; - - o << "--no-stl" << endl - << " Generate code that does not use STL." - << endl; - - o << "--no-iostream" << endl - << " Generate code that does not use the iostream\n" - << " library." - << endl; - - o << "--no-exceptions" << endl - << " Generate code that does not use C++ exceptions." - << endl; - - o << "--no-long-long" << endl - << " Generate code that does not use the long long\n" - << " and unsigned long long types." - << endl; - - o << "--generate-parser" << endl - << " Generate XML parsing code." - << endl; - - o << "--generate-serializer" << endl - << " Generate XML serialization code." - << endl; - - o << "--generate-aggregate" << endl - << " Generate parser/serializer aggregates for root\n" - << " elements and/or types." - << endl; - - o << "--suppress-validation" << endl - << " Suppress the generation of validation code in\n" - << " parser and serializer." - << endl; - - o << "--suppress-parser-val" << endl - << " Suppress the generation of validation code in\n" - << " parser." - << endl; - - o << "--suppress-serializer-val" << endl - << " Suppress the generation of validation code in\n" - << " serializer." - << endl; - - o << "--omit-default-attributes" << endl - << " Omit attributes with default and fixed values\n" - << " from serialized XML documents." - << endl; - - o << "--suppress-enum" << endl - << " Suppress the generation of the XML Schema\n" - << " enumeration to C++ enum mapping." - << endl; - - o << "--generate-clone" << endl - << " Generate clone functions for variable-length\n" - << " types." - << endl; - - o << "--generate-detach" << endl - << " Generate detach functions for elements and\n" - << " attributes of variable-length types." - << endl; - - o << "--generate-insertion <os>" << endl - << " Generate data representation stream insertion\n" - << " operators for the <os> output stream type." - << endl; - - o << "--generate-extraction <is>" << endl - << " Generate data representation stream extraction\n" - << " operators for the <is> input stream type." - << endl; - - o << "--generate-inline" << endl - << " Generate certain functions inline." - << endl; - - o << "--generate-forward" << endl - << " Generate forward declaration file." - << endl; - - o << "--generate-xml-schema" << endl - << " Generate C++ header files as if the schema being\n" - << " compiled defines the XML Schema namespace." - << endl; - - o << "--extern-xml-schema <file>" << endl - << " Generate code as if the XML Schema namespace was\n" - << " defined in <file> and xsd:included in the schema\n" - << " being compiled." - << endl; - - o << "--suppress-reset" << endl - << " Suppress the generation of parser and serializer\n" - << " reset code." - << endl; - - o << "--custom-allocator" << endl - << " Generate code that uses custom allocator functions\n" - << " instead of operator new/delete." - << endl; - - o << "--generate-polymorphic" << endl - << " Generate polymorphism-aware code. Specify this\n" - << " option if you use substitution groups or xsi:type." - << endl; - - o << "--runtime-polymorphic" << endl - << " Generate non-polymorphic code that uses the\n" - << " runtime library configured with polymorphism\n" - << " support." - << endl; - - o << "--polymorphic-type <type>" << endl - << " Indicate that <type> is a root of a polymorphic\n" - << " type hierarchy." - << endl; - - o << "--generate-typeinfo" << endl - << " Generate type information functions for\n" - << " polymorphic object model types." - << endl; - - o << "--polymorphic-schema <file>" << endl - << " Indicate that <file> contains derivations of\n" - << " polymorphic types." - << endl; - - o << "--reuse-style-mixin" << endl - << " Generate code that supports the mixin base\n" - << " parser/serializer implementation reuse style." - << endl; - - o << "--custom-data <type>" << endl - << " Add custom data to the C++ class generated for\n" - << " XML Schema type <type>." - << endl; - - o << "--custom-type <map>" << endl - << " Use a custom type implementation instead of the\n" - << " generated version. The <map> argument is in the\n" - << " form name[=[flags][/[type][/[base][/include]]]],\n" - << " where <name> is an XML Schema type name,\n" - << " optional <flags> specify whether the custom type\n" - << " is fixed or variable-length, optional <type> is\n" - << " a C++ type name that should be used instead,\n" - << " optional <base> is a C++ name that should be\n" - << " given to the generated version, and optional\n" - << " <include> is the header file that defines the\n" - << " custom implementation." - << endl; - - o << "--custom-parser <map>" << endl - << " Use a custom parser implementation instead of the\n" - << " generated version. The <map> argument is in the\n" - << " form name[=[base][/include]], where <name> is an\n" - << " XML Schema type name, optional <base> is a C++\n" - << " name that should be given to the generated\n" - << " version, and optional <include> is the header\n" - << " file that defines the custom implementation." - << endl; - - o << "--custom-serializer <map>" << endl - << " Use a custom serializer implementation instead of\n" - << " the generated version. The <map> argument is in\n" - << " the form name[=[base][/include]], where <name> is\n" - << " an XML Schema type name, optional <base> is a C++\n" - << " name that should be given to the generated\n" - << " version, and optional <include> is the header\n" - << " file that defines the custom implementation." - << endl; - - o << "--root-element-first" << endl - << " Treat only the first global element as a document\n" - << " root." - << endl; - - o << "--root-element-last" << endl - << " Treat only the last global element as a document\n" - << " root." - << endl; - - o << "--root-element-all" << endl - << " Treat all global elements as document roots." - << endl; - - o << "--root-element-none" << endl - << " Don't treat any global elements as document roots." - << endl; - - o << "--root-element <element>" << endl - << " Treat only <element> as a document root. Repeat\n" - << " this option to specify more than one root element." - << endl; - - o << "--root-type <type>" << endl - << " Generate parser/serializer aggregate for <type>.\n" - << " Repeat this option to specify more than one type." - << endl; - - o << "--output-dir <dir>" << endl - << " Write generated files to <dir> instead of the\n" - << " current directory." - << endl; - - o << "--pskel-type-suffix <sfx>" << endl - << " Use <sfx> instead of the default '_pskel' suffix\n" - << " to construct the names of generated parser\n" - << " skeletons." - << endl; - - o << "--sskel-type-suffix <sfx>" << endl - << " Use <sfx> instead of the default '_sskel' suffix\n" - << " to construct the names of generated serializer\n" - << " skeletons." - << endl; - - o << "--pskel-file-suffix <sfx>" << endl - << " Use <sfx> instead of the default '-pskel' suffix\n" - << " to construct the names of generated parser\n" - << " skeleton files." - << endl; - - o << "--sskel-file-suffix <sfx>" << endl - << " Use <sfx> instead of the default '-sskel' suffix\n" - << " to construct the names of generated serializer\n" - << " skeleton files." - << endl; - - o << "--pimpl-type-suffix <sfx>" << endl - << " Use <sfx> instead of the default '_pimpl' suffix\n" - << " to construct the names of generated parser\n" - << " implementations." - << endl; - - o << "--simpl-type-suffix <sfx>" << endl - << " Use <sfx> instead of the default '_simpl' suffix\n" - << " to construct the names of generated serializer\n" - << " implementations." - << endl; - - o << "--pimpl-file-suffix <sfx>" << endl - << " Use <sfx> instead of the default '-pimpl' suffix\n" - << " to construct the names of generated parser\n" - << " implementation files." - << endl; - - o << "--simpl-file-suffix <sfx>" << endl - << " Use <sfx> instead of the default '-simpl' suffix\n" - << " to construct the names of generated serializer\n" - << " implementation files." - << endl; - - o << "--paggr-type-suffix <sfx>" << endl - << " Use <sfx> instead of the default '_paggs' suffix\n" - << " to construct the names of generated parser\n" - << " aggregates." - << endl; - - o << "--saggr-type-suffix <sfx>" << endl - << " Use <sfx> instead of the default '_saggr' suffix\n" - << " to construct the names of generated serializer\n" - << " aggregates." - << endl; - - o << "--namespace-map <xns>=<cns>" << endl - << " Map XML Schema namespace <xns> to C++ namespace\n" - << " <cns>. Repeat this option to specify mapping for\n" - << " more than one XML Schema namespace." - << endl; - - o << "--namespace-regex <regex>" << endl - << " Add <regex> to the list of regular expressions\n" - << " used to translate XML Schema namespace names to\n" - << " C++ namespace names." - << endl; - - o << "--namespace-regex-trace" << endl - << " Trace the process of applying regular expressions\n" - << " specified with the --namespace-regex option." - << endl; - - o << "--reserved-name <name>" << endl - << " Add <name> to the list of names that should not\n" - << " be used as identifiers. The name can optionally\n" - << " be followed by '=' and the replacement name that\n" - << " should be used instead." - << endl; - - o << "--include-with-brackets" << endl - << " Use angle brackets (<>) instead of quotes (\"\") in\n" - << " generated #include directives." - << endl; - - o << "--include-prefix <prefix>" << endl - << " Add <prefix> to generated #include directive\n" - << " paths." - << endl; - - o << "--include-regex <regex>" << endl - << " Add <regex> to the list of regular expressions\n" - << " used to transform #include directive paths." - << endl; - - o << "--include-regex-trace" << endl - << " Trace the process of applying regular expressions\n" - << " specified with the --include-regex option." - << endl; - - o << "--guard-prefix <prefix>" << endl - << " Add <prefix> to generated header inclusion guards." - << endl; - - // File suffix. - // - o << "--hxx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.hxx' to\n" - << " construct the name of the header files." - << endl; - - o << "--ixx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.ixx' to\n" - << " construct the name of the inline files." - << endl; - - o << "--cxx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.cxx' to\n" - << " construct the name of the source files." - << endl; - - o << "--fwd-suffix <suffix>" << endl - << " Use <suffix> instead of the default '-fwd.hxx'\n" - << " to construct the name of the forward declaration\n" - << " file." - << endl; - - // File regex. - // - o << "--hxx-regex <regex>" << endl - << " Use <regex> to construct the names of the header\n" - << " files." - << endl; - - o << "--ixx-regex <regex>" << endl - << " Use <regex> to construct the names of the inline\n" - << " files." - << endl; - - o << "--cxx-regex <regex>" << endl - << " Use <regex> to construct the names of the source\n" - << " files." - << endl; - - o << "--fwd-regex <regex>" << endl - << " Use <regex> to construct the name of the forward\n" - << " declaration file." - << endl; - - - // Prologues. - // - o << "--hxx-prologue <text>" << endl - << " Insert <text> at the beginning of the header\n" - << " files." - << endl; - - o << "--ixx-prologue <text>" << endl - << " Insert <text> at the beginning of the inline\n" - << " files." - << endl; - - o << "--cxx-prologue <text>" << endl - << " Insert <text> at the beginning of the source\n" - << " files." - << endl; - - o << "--fwd-prologue <text>" << endl - << " Insert <text> at the beginning of the forward\n" - << " declaration file." - << endl; - - o << "--prologue <text>" << endl - << " Insert <text> at the beginning of each generated\n" - << " file for which there is no file-specific prologue." - << endl; - - - // Epilogues. - // - o << "--hxx-epilogue <text>" << endl - << " Insert <text> at the end of the header files." - << endl; - - o << "--ixx-epilogue <text>" << endl - << " Insert <text> at the end of the inline files." - << endl; - - o << "--cxx-epilogue <text>" << endl - << " Insert <text> at the end of the source files." - << endl; - - o << "--fwd-epilogue <text>" << endl - << " Insert <text> at the end of the forward\n" - << " declaration file." - << endl; - - o << "--epilogue <text>" << endl - << " Insert <text> at the end of each generated file\n" - << " for which there is no file-specific epilogue." - << endl; - - - // Prologue files. - // - o << "--hxx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the header files." - << endl; - - o << "--ixx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the inline files." - << endl; - - o << "--cxx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the source files." - << endl; - - o << "--fwd-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the forward declaration file." - << endl; - - o << "--prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of each generated file for which there is no file-\n" - << " specific prologue file." - << endl; - - - // Epilogue files. - // - o << "--hxx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the header files." - << endl; - - o << "--ixx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the inline files." - << endl; - - o << "--cxx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the source files." - << endl; - - o << "--fwd-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the forward declaration file." - << endl; - - o << "--epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " each generated file for which there is no file-\n" - << " specific epilogue file." - << endl; - - - // Misc. - // - o << "--show-anonymous" << endl - << " Show elements and attributes that are of anonymous\n" - << " types." - << endl; - - o << "--show-sloc" << endl - << " Show the number of generated physical source lines\n" - << " of code (SLOC)." - << endl; - - o << "--sloc-limit <num>" << endl - << " Check that the number of generated physical source\n" - << " lines of code (SLOC) does not exceed <num>." - << endl; - - o << "--options-file <file>" << endl - << " Read additional options from <file>. Each option\n" - << " should appear on a separate line optionally\n" - << " followed by space and an argument." - << endl; - - o << "--proprietary-license" << endl - << " Indicate that the generated code is licensed under\n" - << " a proprietary license instead of the GPL." - << endl; + CXX::Hybrid::options::print_usage (wcout); + CXX::options::print_usage (wcout); } Hybrid::CLI::OptionsSpec Hybrid::Generator:: diff --git a/xsde/cxx/hybrid/options.cli b/xsde/cxx/hybrid/options.cli new file mode 100644 index 0000000..40df945 --- /dev/null +++ b/xsde/cxx/hybrid/options.cli @@ -0,0 +1,353 @@ +// file : xsde/cxx/hybrid/options.cli +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include <vector>; +include <string>; +include <cstddef>; // std::size_t + +include <cult/types.hxx>; // NarrowString + +include <cxx/options.cli>; + +namespace CXX +{ + namespace Hybrid + { + class options: CXX::options + { + // Features. + // + bool --generate-parser + { + "Generate XML parsing code." + }; + + bool --generate-serializer + { + "Generate XML serialization code." + }; + + bool --generate-aggregate + { + "Generate parser/serializer aggregates for root elements and/or types. + See also the \cb{--root-element-*} and \cb{--root-type} options." + }; + + bool --suppress-validation + { + "Suppress the generation of validation code in parser and serializer." + }; + + bool --suppress-parser-val + { + "Suppress the generation of validation code in parser." + }; + + bool --suppress-serializer-val + { + "Suppress the generation of validation code in serializer." + }; + + bool --omit-default-attributes + { + "Omit attributes with default and fixed values from serialized + XML documents." + }; + + bool --suppress-enum + { + "Suppress the generation of the XML Schema enumeration to C++ + \cb{enum} mapping." + }; + + bool --generate-clone + { + "Generate clone functions for variable-length types. These + functions allow you to make dynamically-allocated copies of + variable-length objects." + }; + + bool --generate-detach + { + "Generate detach functions for elements and attributes of + variable-length types. These functions, for example, allow + you to move sub-trees in the object model either within the + same tree or between different trees." + }; + + std::vector<Cult::Types::NarrowString> --generate-insertion + { + "<os>", + "Generate data representation stream insertion operators for the + <os> output stream type. Repeat this option to specify more than + one stream type. The special \cb{CDR} and \cb{XDR} arguments are + recognized as ACE CDR and Sun RPC XDR stream types and the + corresponding stream wrappers provided by the XSD/e runtime are + automatically used. For custom stream types use the + \cb{--hxx-prologue*} options to include the necessary declarations." + }; + + std::vector<Cult::Types::NarrowString> --generate-extraction + { + "<is>", + "Generate data representation stream extraction operators for the + <is> input stream type. Repeat this option to specify more than + one stream type. The special \cb{CDR} and \cb{XDR} arguments are + recognized as ACE CDR and Sun RPC XDR stream types and the + corresponding stream wrappers provided by the XSD/e runtime are + automatically used. For custom stream types use the + \cb{--hxx-prologue*} options to include the necessary declarations." + }; + + bool --generate-forward + { + "Generate forward declaration file." + }; + + // Polymorphism. + // + bool --generate-polymorphic + { + "Generate polymorphism-aware code. Specify this option if you use + substitution groups or \cb{xsi:type}. Use the \cb{--polymorphic-type} + option to specify which type hierarchies are polymorphic." + }; + + bool --runtime-polymorphic + { + "Generate non-polymorphic code that uses the runtime library + configured with polymorphism support." + }; + + std::vector<Cult::Types::NarrowString> --polymorphic-type + { + "<type>", + "Indicate that <type> is a root of a polymorphic type hierarchy. The + XSD/e compiler can often automatically determine which types are + polymorphic based on the substitution group declarations. However, + you may need to use this option if you are not using substitution + groups or if substitution groups are defined in another schema. + You need to specify this option when compiling every schema file + that references <type>." + }; + + bool --generate-typeinfo + { + "Generate custom type information querying functions for polymorphic + object model types. These functions can be used instead of the + standard C++ RTTI mechanism to determine object's type at runtime." + }; + + std::vector<Cult::Types::NarrowString> --polymorphic-schema + { + "<file>", + "Indicate that <file> contains derivations of polymorphic types that + are not otherwise visible from the schema being compiled. This + option is used to make sure that during the generation of parser + and serializer aggregates the compiler is aware of all possible + derivations of polymorphic types. Repeat this option to specify + more than one schema file." + }; + + // Reuse style. + // + bool --reuse-style-mixin + { + "Generate code that supports the mixin base parser/serializer + implementation reuse style. Note that this reuse style relies on + virtual inheritance and may result in a substantial object code + size increase for large vocabularies. By default the tiein reuse + style is used." + }; + + // Custom data/type. + // + std::vector<Cult::Types::NarrowString> --custom-data + { + "<type>", + "Add the ability to store custom data to the C++ class generated for + XML Schema type <type>. To add custom data to a nested compositor + class use the qualified name starting from the XML Schema type + containing the compositor, for example, \cb{foo::sequence::choise1}." + }; + + std::vector<Cult::Types::NarrowString> --custom-type + { + "<map>", + "Use a custom type implementation instead of the generated version. + The <map> argument is in the form + \c{\i{name}[\b{=}[\i{flags}][\b{/}[\i{type}][\b{/}[\i{base}][\b{/}\i{include}]]]]}, + where the \ci{name} component is the XML Schema type name being + customized. Optional \ci{flags} allow you to specify whether the + custom type is fixed or variable-length. The \cb{f} flag indicates + the type is fixed-length and the \cb{v} flag indicates the type is + variable-length. If omitted, the default rules are used to determine + the type length. Optional \ci{type} is a C++ type name that should + be used instead. If specified, the object model type is defined as + a \cb{typedef} alias for this C++ type. Optional \ci{base} is a C++ + name that should be given to the generated version. It is normally + used as a base for the custom implementation. Optional \ci{include} + is the header file that defines the custom implementation. It is + \cb{#include}'ed into the generated code immediately after (if + \ci{base} is specified) or instead of the generated version." + }; + + std::vector<Cult::Types::NarrowString> --custom-parser + { + "<map>", + "Use a custom parser implementation instead of the generated version. + The <map> argument is in the form + \c{\i{name}[\b{=}[\i{base}][\b{/}\i{include}]]}, where the \ci{name} + component is the XML Schema type name being customized. Optional + \ci{base} is a C++ name that should be given to the generated + version. It is normally used as a base for the custom implementation. + Optional \ci{include} is the header file that defines the custom + implementation. It is \cb{#include}'ed into the generated code + immediately after (if \ci{base} is specified) or instead of the + generated version." + }; + + std::vector<Cult::Types::NarrowString> --custom-serializer + { + "<map>", + "Use a custom serializer implementation instead of the generated + version. The <map> argument is in the form + \c{\i{name}[\b{=}[\i{base}][\b{/}\i{include}]]}, where The \ci{name} + component is the XML Schema type name being customized. Optional + \ci{base} is a C++ name that should be given to the generated + version. It is normally used as a base for the custom implementation. + Optional \ci{include} is the header file that defines the custom + implementation. It is \cb{#include}'ed into the generated code + immediately after (if \ci{base} is specified) or instead of the + generated version." + }; + + // Root element/type. + // + + bool --root-element-first + { + "Treat only the first global element as a document root. This + determines for which elements parser and serializer aggregates + are generated. By default all global elements are considered + document roots. See also the \cb{--generate-aggregate} option." + }; + + bool --root-element-last + { + "Treat only the last global element as a document root. This + determines for which elements parser and serializer aggregates + are generated. By default all global elements are considered + document roots. See also the \cb{--generate-aggregate} option." + }; + + bool --root-element-all + { + "Treat all global elements as document roots (the default behavior). + This determines for which elements parser and serializer aggregates + are generated. By explicitly specifying this option you can suppress + the warning that is issued if more than one global element is + defined. See also the \cb{--generate-aggregate} option." + }; + + bool --root-element-none + { + "Do not treat any global elements as document roots. This determines + for which elements parser and serializer aggregates are generated. + By default all global elements are considered document roots. See + also the \cb{--generate-aggregate} option." + }; + + std::vector<Cult::Types::NarrowString> --root-element + { + "<element>", + "Treat only <element> as a document root. This determines for which + elements parser and serializer aggregates are generated. Repeat + this option to specify more than one root element. See also the + \cb{--generate-aggregate} option." + }; + + std::vector<Cult::Types::NarrowString> --root-type + { + "<type>", + "Generate parser/serializer aggregate for <type>. Repeat this option + to specify more than one type. See also the \cb{--generate-aggregate} + option." + }; + + // Suffixes. + // + Cult::Types::NarrowString --pskel-type-suffix = "_pskel" + { + "<suffix>", + "Use <suffix> instead of the default \cb{_pskel} to construct the + names of generated parser skeletons." + }; + + Cult::Types::NarrowString --sskel-type-suffix = "_sskel" + { + "<suffix>", + "Use <suffix> instead of the default \cb{_sskel} to construct the + names of generated serializer skeletons." + }; + + Cult::Types::NarrowString --pskel-file-suffix = "-pskel" + { + "<suffix>", + "Use <suffix> instead of the default \cb{-pskel} to construct the + names of generated parser skeleton files." + }; + + Cult::Types::NarrowString --sskel-file-suffix = "-sskel" + { + "<suffix>", + "Use <suffix> instead of the default \cb{-sskel} to construct the + names of generated serializer skeleton files." + }; + + Cult::Types::NarrowString --pimpl-type-suffix = "_pimpl" + { + "<suffix>", + "Use <suffix> instead of the default \cb{_pimpl} to construct the + names of generated parser implementations." + }; + + Cult::Types::NarrowString --simpl-type-suffix = "_simpl" + { + "<suffix>", + "Use <suffix> instead of the default \cb{_simpl} to construct the + names of generated serializer implementations." + }; + + Cult::Types::NarrowString --pimpl-file-suffix = "-pimpl" + { + "<suffix>", + "Use <suffix> instead of the default \cb{-pimpl} to construct the + names of generated parser implementation files." + }; + + Cult::Types::NarrowString --simpl-file-suffix = "-simpl" + { + "<suffix>", + "Use <suffix> instead of the default \cb{-simpl} to construct the + names of generated serializer implementation files." + }; + + Cult::Types::NarrowString --paggr-type-suffix = "_paggs" + { + "<suffix>", + "Use <suffix> instead of the default \cb{_paggs} to construct the + names of generated parser aggregates." + }; + + Cult::Types::NarrowString --saggr-type-suffix = "_saggr" + { + "<suffix>", + "Use <suffix> instead of the default \cb{_saggr} to construct the + names of generated serializer aggregates." + }; + }; + } +} diff --git a/xsde/cxx/options.cli b/xsde/cxx/options.cli new file mode 100644 index 0000000..45425ea --- /dev/null +++ b/xsde/cxx/options.cli @@ -0,0 +1,515 @@ +// file : xsde/cxx/options.cli +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include <vector>; +include <string>; +include <cstddef>; // std::size_t + +include <cult/types.hxx>; // NarrowString + +include <options.cli>; + +namespace CXX +{ + class options: ::options = 0 + { + Cult::Types::NarrowString --output-dir + { + "<dir>", + "Write generated files to <dir> instead of the current directory." + }; + + Cult::Types::NarrowString --char-encoding = "utf8" + { + "<enc>", + "Specify the application character encoding. Valid values are \cb{utf8} + (default) and \cb{iso8859-1}. Note that this encoding is not the same + as the XML document encoding that is being parsed or serialized. + Rather, it is the encoding that is used inside the application. When + an XML document is parsed, the character data is automatically + converted to the application encoding. Similarly, when an XML + document is serialized, the data in the application encoding is + automatically converted to the resulting document encoding." + }; + + // C++ features. + // + bool --no-stl + { + "Generate code that does not use the C++ Standard Template Library + (STL)." + }; + + bool --no-iostream + { + "Generate code that does not use the C++ standard input/output stream + library (iostream)." + }; + + bool --no-exceptions + { + "Generate code that does not use C++ exceptions." + }; + + bool --no-long-long + { + "Generate code that does not use the \cb{long long} and \cb{unsigned + long long} types. The 64 bit \cb{long} and \cb{unsignedLong} built-in + XML Schema types are then mapped to \cb{long} and \cb{unsigned long}." + }; + + bool --custom-allocator + { + "Generate code that performs memory management using custom allocator + functions provided by your application instead of the standard operator + \cb{new} and \cb{delete}." + }; + + bool --generate-inline + { + "Generate simple functions inline. This option triggers creation of the + inline file." + }; + + bool --suppress-reset + { + "Suppress the generation of parser/serializer reset code. Reset support + allows you to reuse parsers/serializers after an error." + }; + + // Extern XML Schema. + // + bool --generate-xml-schema + { + "Generate a C++ header files as if the schema being compiled defines the + XML Schema namespace. For the C++/Parser mapping, the resulting file + will contain definitions for all the parser skeletons and + implementations corresponding to the XML Schema built-in types. For + the C++/Serializer mapping, the resulting file will contain definitions + for all the serializer skeletons and implementations corresponding to + the XML Schema built-in types. For the C++/Hybrid mapping, in addition + the the above, a third header file will contain definitions for all + the object model types corresponding to the XML Schema built-in types. + + The schema file provided to the compiler need not exist and is only + used to derive the name of the resulting header file. Use the + \cb{--extern-xml-schema} option to include this file in the + generated files for other schemas." + }; + + Cult::Types::NarrowString --extern-xml-schema + { + "<file>", + "Include a header file derived from <file> instead of generating the + XML Schema namespace mapping inline. The provided file need not + exist and is only used to derive the name of the included header + file. Use the \cb{--generate-xml-schema} option to generate this + header file." + }; + + // Namespace mapping. + // + std::vector<Cult::Types::NarrowString> --namespace-map + { + "<xns>=<cns>", + "Map XML Schema namespace <xns> to C++ namespace <cns>. Repeat + this option to specify mapping for more than one XML Schema namespace. + For example, the following option: + + \cb{--namespace-map http://example.com/foo/bar=foo::bar} + + Will map the \cb{http://example.com/foo/bar} XML Schema namespace to + the \cb{foo::bar} C++ namespace." + }; + + std::vector<Cult::Types::NarrowString> --namespace-regex + { + "<regex>", + "Add <regex> to the list of regular expressions used to translate XML + Schema namespace names to C++ namespace names. <regex> is a Perl-like + regular expression in the form + \c{\b{/}\i{pattern}\b{/}\i{replacement}\b{/}}. Any character can be + used as a delimiter instead of \cb{/}. Escaping of the delimiter + character in \ci{pattern} or \ci{replacement} is not supported. + + All the regular expressions are pushed into a stack with the last + specified expression considered first. The first match that + succeeds is used. Regular expressions are applied to a string in + the form + + \c{\i{filename} \i{namespace}} + + For example, if you have file \cb{hello.xsd} with namespace + \cb{http://example.com/hello} and you run \cb{xsd} on this file, + then the string in question will be: + + \cb{hello.xsd. http://example.com/hello} + + For the built-in XML Schema namespace the string is: + + \cb{XMLSchema.xsd http://www.w3.org/2001/XMLSchema} + + The following three steps are performed for each regular expression + until the match is found: + + 1. The expression is applied and if the result is empty the next + expression is considered. + + 2. All \cb{/} are replaced with \cb{::}. + + 3. The result is verified to be a valid C++ scope name (e.g., + \cb{foo::bar}). If this test succeeds, the result is used as a + C++ namespace name. + + As an example, the following expression maps XML Schema namespaces + in the form \cb{http://example.com/foo/bar} to C++ namespaces in the + form \cb{foo::bar}: + + \cb{%.* http://example.com/(.+)%$1%} + + See also the REGEX AND SHELL QUOTING section below." + }; + + bool --namespace-regex-trace + { + "Trace the process of applying regular expressions specified with the + \cb{--namespace-regex} option. Use this option to find out why your + regular expressions don't do what you expected them to do." + }; + + // Reserved names. + // + std::vector<Cult::Types::NarrowString> --reserved-name + { + "<n>[=<r>]", + "Add name <n> to the list of names that should not be used as + identifiers. The name can optionally be followed by \cb{=} and the + replacement name <r> that should be used instead. All the C++ keywords + are already in this list." + }; + + // Include options. + // + bool --include-with-brackets + { + "Use angle brackets (<>) instead of quotes (\"\") in generated + \cb{#include} directives." + }; + + Cult::Types::NarrowString --include-prefix + { + "<prefix>", + "Add <prefix> to generated \cb{#include} directive paths. + + For example, if you had the following import element in your schema + + \cb{<import namespace=\"...\" schemaLocation=\"base.xsd\"/>} + + and compiled this fragment with \cb{--include-prefix schemas/}, then + the include directive in the generated code would be: + + \cb{#include \"schemas/base.hxx\"}" + }; + + std::vector<Cult::Types::NarrowString> --include-regex + { + "<regex>", + "Add <regex> to the list of regular expressions used to transform + \cb{#include} directive paths. <regex> is a Perl-like regular + expression in the form \c{\b{/}\i{pattern}\b{/}\i{replacement}\b{/}}. + Any character can be used as a delimiter instead of \cb{/}. Escaping + of the delimiter character in \ci{pattern} or \ci{replacement} is not + supported. + + All the regular expressions are pushed into a stack with the last + specified expression considered first. The first match that succeeds + is used. + + As an example, the following expression transforms paths in the form + \cb{schemas/foo/bar} to paths in the form \cb{generated/foo/bar}: + + \cb{%schemas/(.+)%generated/$1%} + + See also the REGEX AND SHELL QUOTING section below." + }; + + bool --include-regex-trace + { + "Trace the process of applying regular expressions specified with the + \cb{--include-regex} option. Use this option to find out why your + regular expressions don't do what you expected them to do." + }; + + Cult::Types::NarrowString --guard-prefix + { + "<prefix>", + "Add <prefix> to generated header inclusion guards. The prefix is + transformed to upper case and characters that are illegal in a + preprocessor macro name are replaced with underscores. If this + option is not specified then the directory part of the input schema + file is used as a prefix." + }; + + // File suffixes. + // + Cult::Types::NarrowString --hxx-suffix = ".hxx" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{.hxx} to + construct the name of the header file. Note that this suffix is also + used to construct names of header files corresponding to + included/imported schemas." + }; + + Cult::Types::NarrowString --ixx-suffix = ".ixx" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{.ixx} to + construct the name of the inline file." + }; + + Cult::Types::NarrowString --cxx-suffix = ".cxx" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{.cxx} to + construct the name of the source file." + }; + + Cult::Types::NarrowString --fwd-suffix = "-fwd.hxx" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{-fwd.hxx} to + construct the name of the forward declaration file." + }; + + Cult::Types::NarrowString --hxx-regex + { + "<regex>", + "Use the provided expression to construct the name of the header file. + <regex> is a Perl-like regular expression in the form + \c{\b{/}\i{pattern}\b{/}\i{replacement}\b{/}}. + Note that this expression is also used to construct names of header + files corresponding to included/imported schemas. + + For the C++/Hybrid mapping, the <regex> argument can be optionally + prefixed with a file key in the form \c{\i{key}=\i{regex}}. The valid + values for \ci{key} are \cb{pskel} (parser skeleton files), \cb{pimpl} + (parser implementation files), \cb{sskel} (serializer skeleton files), + \cb{simpl} (serializer implementation files), and \cb{*} (all files). + If \ci{key} is empty or not present then the expression is used for the + object model files only. + + See also the REGEX AND SHELL QUOTING section below." + }; + + Cult::Types::NarrowString --ixx-regex + { + "<regex>", + "Use the provided expression to construct the name of the inline file. + <regex> is a Perl-like regular expression in the form + \c{\b{/}\i{pattern}\b{/}\i{replacement}\b{/}}. For the C++/Hybrid + mapping, the <regex> argument can be optionally prefixed with a file + key. See the \cb{--hxx-regex} option for details. See also the REGEX + AND SHELL QUOTING section below." + }; + + Cult::Types::NarrowString --cxx-regex + { + "<regex>", + "Use the provided expression to construct the name of the source file. + <regex> is a Perl-like regular expression in the form + \c{\b{/}\i{pattern}\b{/}\i{replacement}\b{/}}. For the C++/Hybrid + mapping, the <regex> argument can be optionally prefixed with a file + key. See the \cb{--hxx-regex} option for details. See also the REGEX + AND SHELL QUOTING section below." + }; + + Cult::Types::NarrowString --fwd-regex + { + "<regex>", + "Use the provided expression to construct the name of the forward + declaration file. <regex> is a Perl-like regular expression in the + form \c{\b{/}\i{pattern}\b{/}\i{replacement}\b{/}}. See also the REGEX + AND SHELL QUOTING section below." + }; + + // Prologues/epilogues. + // + std::vector<Cult::Types::NarrowString> --hxx-prologue + { + "<text>", + "Insert <text> at the beginning of the header file. + + For the C++/Hybrid mapping, the <text> argument can be optionally + prefixed with a file key in the form \c{\i{key}=\i{text}}. The valid + values for \ci{key} are \cb{pskel} (parser skeleton files), \cb{pimpl} + (parser implementation files), \cb{sskel} (serializer skeleton files), + \cb{simpl} (serializer implementation files), and \cb{*} (all files). + If \ci{key} is empty or not present then the text is used for the + object model files only." + }; + + std::vector<Cult::Types::NarrowString> --ixx-prologue + { + "<text>", + "Insert <text> at the beginning of the inline file. For the C++/Hybrid + mapping, the <text> argument can be optionally prefixed with a file + key. See the \cb{--hxx-prologue} option for details." + }; + + std::vector<Cult::Types::NarrowString> --cxx-prologue + { + "<text>", + "Insert <text> at the beginning of the source file. For the C++/Hybrid + mapping, the <text> argument can be optionally prefixed with a file + key. See the \cb{--hxx-prologue} option for details." + }; + + std::vector<Cult::Types::NarrowString> --fwd-prologue + { + "<text>", + "Insert <text> at the beginning of the forward declaration file." + }; + + std::vector<Cult::Types::NarrowString> --prologue + { + "<text>", + "Insert <text> at the beginning of each generated file for which + there is no file-specific prologue. For the C++/Hybrid mapping, the + <text> argument can be optionally prefixed with a file key. See the + \cb{--hxx-prologue} option for details." + }; + + std::vector<Cult::Types::NarrowString> --hxx-epilogue + { + "<text>", + "Insert <text> at the end of the header file. For the C++/Hybrid + mapping, the <text> argument can be optionally prefixed with a file + key. See the \cb{--hxx-prologue} option for details." + }; + + std::vector<Cult::Types::NarrowString> --ixx-epilogue + { + "<text>", + "Insert <text> at the end of the inline file. For the C++/Hybrid + mapping, the <text> argument can be optionally prefixed with a file + key. See the \cb{--hxx-prologue} option for details." + }; + + std::vector<Cult::Types::NarrowString> --cxx-epilogue + { + "<text>", + "Insert <text> at the end of the source file. For the C++/Hybrid + mapping, the <text> argument can be optionally prefixed with a file + key. See the \cb{--hxx-prologue} option for details." + }; + + std::vector<Cult::Types::NarrowString> --fwd-epilogue + { + "<text>", + "Insert <text> at the end of the forward declaration file." + }; + + std::vector<Cult::Types::NarrowString> --epilogue + { + "<text>", + "Insert <text> at the end of each generated file for which there + is no file-specific epilogue. For the C++/Hybrid mapping, the <text> + argument can be optionally prefixed with a file key. See the + \cb{--hxx-prologue} option for details." + }; + + Cult::Types::NarrowString --hxx-prologue-file + { + "<file>", + "Insert the content of the <file> at the beginning of the header file. + + For the C++/Hybrid mapping, the <file> argument can be optionally + prefixed with a file key in the form \c{\i{key}=\i{file}}. The valid + values for \ci{key} are \cb{pskel} (parser skeleton files), \cb{pimpl} + (parser implementation files), \cb{sskel} (serializer skeleton files), + \cb{simpl} (serializer implementation files), and \cb{*} (all files). + If \ci{key} is empty or not present then the file is used for the + object model files only." + }; + + Cult::Types::NarrowString --ixx-prologue-file + { + "<file>", + "Insert the content of the <file> at the beginning of the inline file. + For the C++/Hybrid mapping, the <file> argument can be optionally + prefixed with a file key. See the \cb{--hxx-prologue-file} option + for details." + }; + + Cult::Types::NarrowString --cxx-prologue-file + { + "<file>", + "Insert the content of the <file> at the beginning of the source file. + For the C++/Hybrid mapping, the <file> argument can be optionally + prefixed with a file key. See the \cb{--hxx-prologue-file} option + for details." + }; + + Cult::Types::NarrowString --fwd-prologue-file + { + "<file>", + "Insert the content of the <file> at the beginning of the forward + declaration file." + }; + + Cult::Types::NarrowString --prologue-file + { + "<file>", + "Insert the content of the <file> at the beginning of each generated + file for which there is no file-specific prologue file. For the + C++/Hybrid mapping, the <file> argument can be optionally prefixed + with a file key. See the \cb{--hxx-prologue-file} option for details." + }; + + Cult::Types::NarrowString --hxx-epilogue-file + { + "<file>", + "Insert the content of the <file> at the end of the header file. + For the C++/Hybrid mapping, the <file> argument can be optionally + prefixed with a file key. See the \cb{--hxx-prologue-file} option + for details." + }; + + Cult::Types::NarrowString --ixx-epilogue-file + { + "<file>", + "Insert the content of the <file> at the end of the inline file. + For the C++/Hybrid mapping, the <file> argument can be optionally + prefixed with a file key. See the \cb{--hxx-prologue-file} option + for details." + }; + + Cult::Types::NarrowString --cxx-epilogue-file + { + "<file>", + "Insert the content of the <file> at the end of the source file. + For the C++/Hybrid mapping, the <file> argument can be optionally + prefixed with a file key. See the \cb{--hxx-prologue-file} option + for details." + }; + + Cult::Types::NarrowString --fwd-epilogue-file + { + "<file>", + "Insert the content of the <file> at the end of the forward declaration + file." + }; + + Cult::Types::NarrowString --epilogue-file + { + "<file>", + "Insert the content of the <file> at the end of each generated file + for which there is no file-specific epilogue file. For the C++/Hybrid + mapping, the <file> argument can be optionally prefixed with a file + key. See the \cb{--hxx-prologue-file} option for details." + }; + }; +} diff --git a/xsde/cxx/parser/generator.cxx b/xsde/cxx/parser/generator.cxx index 6c8f8c7..828368a 100644 --- a/xsde/cxx/parser/generator.cxx +++ b/xsde/cxx/parser/generator.cxx @@ -16,8 +16,6 @@ #include <cutl/compiler/cxx-indenter.hxx> #include <cutl/compiler/sloc-counter.hxx> -#include <backend-elements/indentation/clip.hxx> - #include <xsd-frontend/semantic-graph.hxx> #include <type-map/lexer.hxx> @@ -44,7 +42,7 @@ #include <cxx/parser/attribute-validation-source.hxx> #include <cxx/parser/characters-validation-source.hxx> -#include <usage.hxx> +#include <cxx/parser/options.hxx> #include "../../../libxsde/xsde/cxx/version.hxx" @@ -184,346 +182,8 @@ namespace CXX Void Parser::Generator:: usage () { - std::wostream& o (wcout); - ::CLI::Indent::Clip< ::CLI::OptionsUsage, WideChar> clip (o); - - o << "--type-map <mapfile>" << endl - << " Read XML Schema to C++ type mapping information\n" - << " from <mapfile>. Repeat this option to specify\n" - << " several type maps. Type maps are considered in\n" - << " order of appearance and the first match is used." - << endl; - - o << "--char-encoding <enc>" << endl - << " Specify the character encoding that should be\n" - << " used for the extracted text data. Valid values\n" - << " are 'utf8' (default) and 'iso8859-1'." - << endl; - - o << "--no-stl" << endl - << " Generate code that does not use STL." - << endl; - - o << "--no-iostream" << endl - << " Generate code that does not use the iostream\n" - << " library." - << endl; - - o << "--no-exceptions" << endl - << " Generate code that does not use C++ exceptions." - << endl; - - o << "--no-long-long" << endl - << " Generate code that does not use the long long\n" - << " and unsigned long long types." - << endl; - - o << "--reuse-style-mixin" << endl - << " Generate code that supports the mixin base parser\n" - << " implementation reuse style." - << endl; - - o << "--reuse-style-none" << endl - << " Do not generate any support for base parser\n" - << " implementation reuse." - << endl; - - o << "--generate-inline" << endl - << " Generate certain functions inline." - << endl; - - o << "--suppress-validation" << endl - << " Suppress the generation of validation code." - << endl; - - o << "--generate-polymorphic" << endl - << " Generate polymorphism-aware code. Specify this\n" - << " option if you use substitution groups or xsi:type." - << endl; - - o << "--runtime-polymorphic" << endl - << " Generate non-polymorphic code that uses the\n" - << " runtime library configured with polymorphism\n" - << " support." - << endl; - - o << "--suppress-reset" << endl - << " Suppress the generation of parser reset code." - << endl; - - o << "--custom-allocator" << endl - << " Generate code that uses custom allocator functions\n" - << " instead of operator new/delete." - << endl; - - o << "--generate-noop-impl" << endl - << " Generate a sample parser implementation that\n" - << " does nothing (no operation)." - << endl; - - o << "--generate-print-impl" << endl - << " Generate a sample parser implementation that\n" - << " prints the XML data to STDOUT." - << endl; - - o << "--generate-test-driver" << endl - << " Generate a test driver for the sample parser\n" - << " implementation." - << endl; - - o << "--force-overwrite" << endl - << " Force overwriting of the existing implementation\n" - << " and test driver files." - << endl; - - o << "--root-element-first" << endl - << " Indicate that the first global element is the\n" - << " document root." - << endl; - - o << "--root-element-last" << endl - << " Indicate that the last global element is the\n" - << " document root." - << endl; - - o << "--root-element <element>" << endl - << " Indicate that <element> is the document root." - << endl; - - o << "--generate-xml-schema" << endl - << " Generate a C++ header file as if the schema being\n" - << " compiled defines the XML Schema namespace." - << endl; - - o << "--extern-xml-schema <file>" << endl - << " Generate code as if the XML Schema namespace was\n" - << " defined in <file> and xsd:included in the schema\n" - << " being compiled." - << endl; - - o << "--output-dir <dir>" << endl - << " Write generated files to <dir> instead of the\n" - << " current directory." - << endl; - - o << "--skel-type-suffix <suffix>" << endl - << " Use <suffix> instead of the default '_pskel' to\n" - << " construct the names of generated parser skeletons." - << endl; - - o << "--skel-file-suffix <suffix>" << endl - << " Use <suffix> instead of the default '-pskel' to\n" - << " construct the names of generated parser skeleton\n" - << " files." - << endl; - - o << "--impl-type-suffix <suffix>" << endl - << " Use <suffix> instead of the default '_pimpl' to\n" - << " construct the names of parser implementations for\n" - << " the built-in XML Schema types and sample parser\n" - << " implementations." - << endl; - - o << "--impl-file-suffix <suffix>" << endl - << " Use <suffix> instead of the default '-pimpl' to\n" - << " construct the names of generated sample parser\n" - << " implementation files." - << endl; - - o << "--namespace-map <xns>=<cns>" << endl - << " Map XML Schema namespace <xns> to C++ namespace\n" - << " <cns>. Repeat this option to specify mapping for\n" - << " more than one XML Schema namespace." - << endl; - - o << "--namespace-regex <regex>" << endl - << " Add <regex> to the list of regular expressions\n" - << " used to translate XML Schema namespace names to\n" - << " C++ namespace names." - << endl; - - o << "--namespace-regex-trace" << endl - << " Trace the process of applying regular expressions\n" - << " specified with the --namespace-regex option." - << endl; - - o << "--reserved-name <name>" << endl - << " Add <name> to the list of names that should not\n" - << " be used as identifiers. The name can optionally\n" - << " be followed by '=' and the replacement name that\n" - << " should be used instead." - << endl; - - o << "--include-with-brackets" << endl - << " Use angle brackets (<>) instead of quotes (\"\") in\n" - << " generated #include directives." - << endl; - - o << "--include-prefix <prefix>" << endl - << " Add <prefix> to generated #include directive\n" - << " paths." - << endl; - - o << "--include-regex <regex>" << endl - << " Add <regex> to the list of regular expressions\n" - << " used to transform #include directive paths." - << endl; - - o << "--include-regex-trace" << endl - << " Trace the process of applying regular expressions\n" - << " specified with the --include-regex option." - << endl; - - o << "--guard-prefix <prefix>" << endl - << " Add <prefix> to generated header inclusion guards." - << endl; - - o << "--hxx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.hxx' to\n" - << " construct the name of the header file." - << endl; - - o << "--ixx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.ixx' to\n" - << " construct the name of the inline file." - << endl; - - o << "--cxx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.cxx' to\n" - << " construct the name of the source file." - << endl; - - o << "--hxx-regex <regex>" << endl - << " Use <regex> to construct the name of the header\n" - << " file." - << endl; - - o << "--ixx-regex <regex>" << endl - << " Use <regex> to construct the name of the inline\n" - << " file." - << endl; - - o << "--cxx-regex <regex>" << endl - << " Use <regex> to construct the name of the source\n" - << " file." - << endl; - - - // Prologues. - // - o << "--hxx-prologue <text>" << endl - << " Insert <text> at the beginning of the header file." - << endl; - - o << "--ixx-prologue <text>" << endl - << " Insert <text> at the beginning of the inline file." - << endl; - - o << "--cxx-prologue <text>" << endl - << " Insert <text> at the beginning of the source file." - << endl; - - o << "--prologue <text>" << endl - << " Insert <text> at the beginning of each generated\n" - << " file for which there is no file-specific prologue." - << endl; - - - // Epilogues. - // - o << "--hxx-epilogue <text>" << endl - << " Insert <text> at the end of the header file." - << endl; - - o << "--ixx-epilogue <text>" << endl - << " Insert <text> at the end of the inline file." - << endl; - - o << "--cxx-epilogue <text>" << endl - << " Insert <text> at the end of the source file." - << endl; - - o << "--epilogue <text>" << endl - << " Insert <text> at the end of each generated file\n" - << " for which there is no file-specific epilogue." - << endl; - - - // Prologue files. - // - o << "--hxx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the header file." - << endl; - - o << "--ixx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the inline file." - << endl; - - o << "--cxx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the source file." - << endl; - - o << "--prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of each generated file for which there is no file-\n" - << " specific prologue file." - << endl; - - - // Epilogue files. - // - o << "--hxx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the header file." - << endl; - - o << "--ixx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the inline file." - << endl; - - o << "--cxx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the source file." - << endl; - - o << "--epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " each generated file for which there is no file-\n" - << " specific epilogue file." - << endl; - - - // Misc. - // - o << "--show-anonymous" << endl - << " Show elements and attributes that are of anonymous\n" - << " types." - << endl; - - o << "--show-sloc" << endl - << " Show the number of generated physical source lines\n" - << " of code (SLOC)." - << endl; - - o << "--sloc-limit <num>" << endl - << " Check that the number of generated physical source\n" - << " lines of code (SLOC) does not exceed <num>." - << endl; - - o << "--options-file <file>" << endl - << " Read additional options from <file>. Each option\n" - << " should appear on a separate line optionally\n" - << " followed by space and an argument." - << endl; - - o << "--proprietary-license" << endl - << " Indicate that the generated code is licensed under\n" - << " a proprietary license instead of the GPL." - << endl; + CXX::Parser::options::print_usage (wcout); + CXX::options::print_usage (wcout); } Parser::CLI::OptionsSpec Parser::Generator:: @@ -631,7 +291,6 @@ namespace CXX AutoUnlinks& unlinks) { using std::ios_base; - namespace Indentation = BackendElements::Indentation; typedef cutl::re::regexsub Regex; diff --git a/xsde/cxx/parser/options.cli b/xsde/cxx/parser/options.cli new file mode 100644 index 0000000..552b473 --- /dev/null +++ b/xsde/cxx/parser/options.cli @@ -0,0 +1,159 @@ +// file : xsde/cxx/parser/options.cli +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include <vector>; +include <string>; +include <cstddef>; // std::size_t + +include <cult/types.hxx>; // NarrowString + +include <cxx/options.cli>; + +namespace CXX +{ + namespace Parser + { + class options: CXX::options + { + std::vector<Cult::Types::NarrowString> --type-map + { + "<mapfile>", + "Read XML Schema to C++ type mapping information from <mapfile>. + Repeat this option to specify several type maps. Type maps are + considered in order of appearance and the first match is used. + By default all user-defined types are mapped to \cb{void}. See + the TYPE MAP section below for more information." + }; + + bool --suppress-validation + { + "Suppress the generation of validation code." + }; + + // Reuse style. + // + bool --reuse-style-mixin + { + "Generate code that supports the mixin base parser implementation + reuse style. Note that this reuse style relies on virtual + inheritance and may result in a substantial object code size + increase for large vocabularies. By default support for the tiein + style is generated." + }; + + bool --reuse-style-none + { + "Do not generate any support for base parser implementation reuse. + By default support for the tiein style is generated." + }; + + // Polymorphism. + // + bool --generate-polymorphic + { + "Generate polymorphism-aware code. Specify this option if you use + substitution groups or \cb{xsi:type}." + }; + + bool --runtime-polymorphic + { + "Generate non-polymorphic code that uses the runtime library + configured with polymorphism support." + }; + + // Implementation/driver. + // + bool --generate-noop-impl + { + "Generate a sample parser implementation that does nothing (no + operation). The sample implementation can then be filled with + the application-specific code. For an input file in the form + \cb{name.xsd} this option triggers the generation of the two + additional C++ files in the form: \cb{name-pimpl.hxx} (parser + implementation header file) and \cb{name-pimpl.cxx} (parser + implementation source file)." + }; + + bool --generate-print-impl + { + "Generate a sample parser implementation that prints the XML data + to \c{STDOUT}. For an input file in the form \cb{name.xsd} this + option triggers the generation of the two additional C++ files + in the form: \cb{name-pimpl.hxx} (parser implementation header + file) and \cb{name-pimpl.cxx} (parser implementation source file)." + }; + + bool --generate-test-driver + { + "Generate a test driver for the sample parser implementation. For + an input file in the form \cb{name.xsd} this option triggers the + generation of an additional C++ file in the form + \cb{name-pdriver.cxx}." + }; + + bool --force-overwrite + { + "Force overwriting of the existing implementation and test driver + files. Use this option only if you do not mind loosing the changes + you have made in the sample implementation or test driver files." + }; + + // Root element. + // + bool --root-element-first + { + "Indicate that the first global element is the document root. This + information is used to generate the test driver for the sample + implementation." + }; + + bool --root-element-last + { + "Indicate that the last global element is the document root. This + information is used to generate the test driver for the sample + implementation." + }; + + Cult::Types::NarrowString --root-element + { + "<element>", + "Indicate that <element> is the document root. This information is + used to generate the test driver for the sample implementation." + }; + + // Suffixes. + // + Cult::Types::NarrowString --skel-type-suffix = "_pskel" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{_pskel} to + construct the names of generated parser skeletons." + }; + + Cult::Types::NarrowString --skel-file-suffix = "-pskel" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{-pskel} to + construct the names of generated parser skeleton files." + }; + + Cult::Types::NarrowString --impl-type-suffix = "_pimpl" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{_pimpl} to + construct the names of parser implementations for the built-in + XML Schema types and sample parser implementations." + }; + + Cult::Types::NarrowString --impl-file-suffix = "-pimpl" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{-pimpl} to + construct the names of generated sample parser implementation + files." + }; + }; + } +} diff --git a/xsde/cxx/serializer/generator.cxx b/xsde/cxx/serializer/generator.cxx index 167dae5..98e1cae 100644 --- a/xsde/cxx/serializer/generator.cxx +++ b/xsde/cxx/serializer/generator.cxx @@ -16,8 +16,6 @@ #include <cutl/compiler/cxx-indenter.hxx> #include <cutl/compiler/sloc-counter.hxx> -#include <backend-elements/indentation/clip.hxx> - #include <xsd-frontend/semantic-graph.hxx> #include <type-map/lexer.hxx> @@ -42,7 +40,7 @@ #include <cxx/serializer/element-validation-source.hxx> #include <cxx/serializer/attribute-validation-source.hxx> -#include <usage.hxx> +#include <cxx/serializer/options.hxx> #include "../../../libxsde/xsde/cxx/version.hxx" @@ -181,342 +179,8 @@ namespace CXX Void Serializer::Generator:: usage () { - std::wostream& o (wcout); - ::CLI::Indent::Clip< ::CLI::OptionsUsage, WideChar> clip (o); - - o << "--type-map <mapfile>" << endl - << " Read XML Schema to C++ type mapping information\n" - << " from <mapfile>. Repeat this option to specify\n" - << " several type maps. Type maps are considered in\n" - << " order of appearance and the first match is used." - << endl; - - o << "--char-encoding <enc>" << endl - << " Specify the character encoding that is used in\n" - << " the text data being serialized. Valid values are\n" - << " 'utf8' (default) and 'iso8859-1'." - << endl; - - o << "--no-stl" << endl - << " Generate code that does not use STL." - << endl; - - o << "--no-iostream" << endl - << " Generate code that does not use the iostream\n" - << " library." - << endl; - - o << "--no-exceptions" << endl - << " Generate code that does not use C++ exceptions." - << endl; - - o << "--no-long-long" << endl - << " Generate code that does not use the long long\n" - << " and unsigned long long types." - << endl; - - o << "--reuse-style-mixin" << endl - << " Generate code that supports the mixin base\n" - << " serializer implementation reuse style." - << endl; - - o << "--reuse-style-none" << endl - << " Do not generate any support for base serializer\n" - << " implementation reuse." - << endl; - - o << "--generate-inline" << endl - << " Generate certain functions inline." - << endl; - - o << "--suppress-validation" << endl - << " Suppress the generation of validation code." - << endl; - - o << "--generate-polymorphic" << endl - << " Generate polymorphism-aware code. Specify this\n" - << " option if you use substitution groups or xsi:type." - << endl; - - o << "--runtime-polymorphic" << endl - << " Generate non-polymorphic code that uses the\n" - << " runtime library configured with polymorphism\n" - << " support." - << endl; - - o << "--suppress-reset" << endl - << " Suppress the generation of serializer reset code." - << endl; - - o << "--custom-allocator" << endl - << " Generate code that uses custom allocator functions\n" - << " instead of operator new/delete." - << endl; - - o << "--generate-empty-impl" << endl - << " Generate a sample serializer implementation with\n" - << " empty function bodies." - << endl; - - o << "--generate-test-driver" << endl - << " Generate a test driver for the sample serializer\n" - << " implementation." - << endl; - - o << "--force-overwrite" << endl - << " Force overwriting of the existing implementation\n" - << " and test driver files." - << endl; - - o << "--root-element-first" << endl - << " Indicate that the first global element is the\n" - << " document root." - << endl; - - o << "--root-element-last" << endl - << " Indicate that the last global element is the\n" - << " document root." - << endl; - - o << "--root-element <element>" << endl - << " Indicate that <element> is the document root." - << endl; - - o << "--generate-xml-schema" << endl - << " Generate a C++ header file as if the schema being\n" - << " compiled defines the XML Schema namespace." - << endl; - - o << "--extern-xml-schema <file>" << endl - << " Generate code as if the XML Schema namespace was\n" - << " defined in <file> and xsd:included in the schema\n" - << " being compiled." - << endl; - - o << "--output-dir <dir>" << endl - << " Write generated files to <dir> instead of the\n" - << " current directory." - << endl; - - o << "--skel-type-suffix <suffix>" << endl - << " Use <suffix> instead of the default '_sskel' to\n" - << " construct the names of generated serializer\n" - << " skeletons." - << endl; - - o << "--skel-file-suffix <suffix>" << endl - << " Use <suffix> instead of the default '-sskel' to\n" - << " construct the names of generated serializer\n" - << " skeleton files." - << endl; - - o << "--impl-type-suffix <suffix>" << endl - << " Use <suffix> instead of the default '_simpl' to\n" - << " construct the names of serializer implementations\n" - << " for the built-in XML Schema types and sample\n" - << " serializer implementations." - << endl; - - o << "--impl-file-suffix <suffix>" << endl - << " Use <suffix> instead of the default '-simpl' to\n" - << " construct the names of generated sample\n" - << " serializer implementation files." - << endl; - - o << "--namespace-map <xns>=<cns>" << endl - << " Map XML Schema namespace <xns> to C++ namespace\n" - << " <cns>. Repeat this option to specify mapping for\n" - << " more than one XML Schema namespace." - << endl; - - o << "--namespace-regex <regex>" << endl - << " Add <regex> to the list of regular expressions\n" - << " used to translate XML Schema namespace names to\n" - << " C++ namespace names." - << endl; - - o << "--namespace-regex-trace" << endl - << " Trace the process of applying regular expressions\n" - << " specified with the --namespace-regex option." - << endl; - - o << "--reserved-name <name>" << endl - << " Add <name> to the list of names that should not\n" - << " be used as identifiers. The name can optionally\n" - << " be followed by '=' and the replacement name that\n" - << " should be used instead." - << endl; - - o << "--include-with-brackets" << endl - << " Use angle brackets (<>) instead of quotes (\"\") in\n" - << " generated #include directives." - << endl; - - o << "--include-prefix <prefix>" << endl - << " Add <prefix> to generated #include directive\n" - << " paths." - << endl; - - o << "--include-regex <regex>" << endl - << " Add <regex> to the list of regular expressions\n" - << " used to transform #include directive paths." - << endl; - - o << "--include-regex-trace" << endl - << " Trace the process of applying regular expressions\n" - << " specified with the --include-regex option." - << endl; - - o << "--guard-prefix <prefix>" << endl - << " Add <prefix> to generated header inclusion guards." - << endl; - - o << "--hxx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.hxx' to\n" - << " construct the name of the header file." - << endl; - - o << "--ixx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.ixx' to\n" - << " construct the name of the inline file." - << endl; - - o << "--cxx-suffix <suffix>" << endl - << " Use <suffix> instead of the default '.cxx' to\n" - << " construct the name of the source file." - << endl; - - o << "--hxx-regex <regex>" << endl - << " Use <regex> to construct the name of the header\n" - << " file." - << endl; - - o << "--ixx-regex <regex>" << endl - << " Use <regex> to construct the name of the inline\n" - << " file." - << endl; - - o << "--cxx-regex <regex>" << endl - << " Use <regex> to construct the name of the source\n" - << " file." - << endl; - - - // Prologues. - // - o << "--hxx-prologue <text>" << endl - << " Insert <text> at the beginning of the header file." - << endl; - - o << "--ixx-prologue <text>" << endl - << " Insert <text> at the beginning of the inline file." - << endl; - - o << "--cxx-prologue <text>" << endl - << " Insert <text> at the beginning of the source file." - << endl; - - o << "--prologue <text>" << endl - << " Insert <text> at the beginning of each generated\n" - << " file for which there is no file-specific prologue." - << endl; - - - // Epilogues. - // - o << "--hxx-epilogue <text>" << endl - << " Insert <text> at the end of the header file." - << endl; - - o << "--ixx-epilogue <text>" << endl - << " Insert <text> at the end of the inline file." - << endl; - - o << "--cxx-epilogue <text>" << endl - << " Insert <text> at the end of the source file." - << endl; - - o << "--epilogue <text>" << endl - << " Insert <text> at the end of each generated file\n" - << " for which there is no file-specific epilogue." - << endl; - - - // Prologue files. - // - o << "--hxx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the header file." - << endl; - - o << "--ixx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the inline file." - << endl; - - o << "--cxx-prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of the source file." - << endl; - - o << "--prologue-file <file>" << endl - << " Insert the content of the <file> at the beginning\n" - << " of each generated file for which there is no file-\n" - << " specific prologue file." - << endl; - - - // Epilogue files. - // - o << "--hxx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the header file." - << endl; - - o << "--ixx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the inline file." - << endl; - - o << "--cxx-epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " the source file." - << endl; - - o << "--epilogue-file <file>" << endl - << " Insert the content of the <file> at the end of\n" - << " each generated file for which there is no file-\n" - << " specific epilogue file." - << endl; - - - // Misc. - // - o << "--show-anonymous" << endl - << " Show elements and attributes that are of anonymous\n" - << " types." - << endl; - - o << "--show-sloc" << endl - << " Show the number of generated physical source lines\n" - << " of code (SLOC)." - << endl; - - o << "--sloc-limit <num>" << endl - << " Check that the number of generated physical source\n" - << " lines of code (SLOC) does not exceed <num>." - << endl; - - o << "--options-file <file>" << endl - << " Read additional options from <file>. Each option\n" - << " should appear on a separate line optionally\n" - << " followed by space and an argument." - << endl; - - o << "--proprietary-license" << endl - << " Indicate that the generated code is licensed under\n" - << " a proprietary license instead of the GPL." - << endl; + CXX::Serializer::options::print_usage (wcout); + CXX::options::print_usage (wcout); } Serializer::CLI::OptionsSpec Serializer::Generator:: @@ -624,7 +288,6 @@ namespace CXX AutoUnlinks& unlinks) { using std::ios_base; - namespace Indentation = BackendElements::Indentation; typedef cutl::re::regexsub Regex; diff --git a/xsde/cxx/serializer/options.cli b/xsde/cxx/serializer/options.cli new file mode 100644 index 0000000..ddb6c60 --- /dev/null +++ b/xsde/cxx/serializer/options.cli @@ -0,0 +1,148 @@ +// file : xsde/cxx/serializer/options.cli +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include <vector>; +include <string>; +include <cstddef>; // std::size_t + +include <cult/types.hxx>; // NarrowString + +include <cxx/options.cli>; + +namespace CXX +{ + namespace Serializer + { + class options: CXX::options + { + std::vector<Cult::Types::NarrowString> --type-map + { + "<mapfile>", + "Read XML Schema to C++ type mapping information from <mapfile>. + Repeat this option to specify several type maps. Type maps are + considered in order of appearance and the first match is used. + By default all user-defined types are mapped to \cb{void}. See + the TYPE MAP section below for more information." + }; + + bool --suppress-validation + { + "Suppress the generation of validation code." + }; + + // Reuse style. + // + bool --reuse-style-mixin + { + "Generate code that supports the mixin base serializer implementation + reuse style. Note that this reuse style relies on virtual inheritance + and may result in a substantial object code size increase for large + vocabularies. By default support for the tiein style is generated." + }; + + bool --reuse-style-none + { + "Do not generate any support for base serializer implementation + reuse. By default support for the tiein style is generated." + }; + + // Polymorphism. + // + bool --generate-polymorphic + { + "Generate polymorphism-aware code. Specify this option if you use + substitution groups or \cb{xsi:type}." + }; + + bool --runtime-polymorphic + { + "Generate non-polymorphic code that uses the runtime library + configured with polymorphism support." + }; + + // Implementation/driver. + // + bool --generate-empty-impl + { + "Generate a sample serializer implementation with empty function + bodies which can then be filled with the application-specific code. + For an input file in the form \cb{name.xsd} this option triggers + the generation of the two additional C++ files in the form: + \cb{name-simpl.hxx} (serializer implementation header file) and + \cb{name-simpl.cxx} (serializer implementation source file)." + }; + + bool --generate-test-driver + { + "Generate a test driver for the sample serializer implementation. + For an input file in the form \cb{name.xsd} this option triggers + the generation of an additional C++ file in the form + \cb{name-sdriver.cxx}." + }; + + bool --force-overwrite + { + "Force overwriting of the existing implementation and test driver + files. Use this option only if you do not mind loosing the changes + you have made in the sample implementation or test driver files." + }; + + // Root element. + // + bool --root-element-first + { + "Indicate that the first global element is the document root. This + information is used to generate the test driver for the sample + implementation." + }; + + bool --root-element-last + { + "Indicate that the last global element is the document root. This + information is used to generate the test driver for the sample + implementation." + }; + + Cult::Types::NarrowString --root-element + { + "<element>", + "Indicate that <element> is the document root. This information is + used to generate the test driver for the sample implementation." + }; + + // Suffixes. + // + Cult::Types::NarrowString --skel-type-suffix = "_sskel" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{_sskel} to + construct the names of generated serializer skeletons." + }; + + Cult::Types::NarrowString --skel-file-suffix = "-sskel" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{-sskel} to + construct the names of generated serializer skeleton files." + }; + + Cult::Types::NarrowString --impl-type-suffix = "_simpl" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{_simpl} to + construct the names of serializer implementations for the built-in + XML Schema types and sample serializer implementations." + }; + + Cult::Types::NarrowString --impl-file-suffix = "-simpl" + { + "<suffix>", + "Use the provided <suffix> instead of the default \cb{-simpl} to + construct the names of generated sample serializer implementation + files." + }; + }; + } +} |